isorite 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -5
- package/dist/core.js +91 -7
- package/dist/main.js +163 -179
- package/docs/setup-for-agents.md +11 -36
- package/docs/setup.md +20 -61
- package/docs/terminal.md +28 -80
- package/package.json +1 -1
- package/web/_app/immutable/assets/0.BXPxx6Q0.css +1 -0
- package/web/_app/immutable/assets/{5.DbDKXCoO.css → 5.rBvyRuST.css} +1 -1
- package/web/_app/immutable/assets/{7.ljiu9bn5.css → 7.C00vyVPo.css} +1 -1
- package/web/_app/immutable/assets/Drawing.Q7J9MyIo.css +1 -0
- package/web/_app/immutable/assets/{NoteList.F579Zvj_.css → NoteList.E6jC-AtZ.css} +1 -1
- package/web/_app/immutable/assets/Timeline.LsRXYIBv.css +1 -0
- package/web/_app/immutable/assets/ground.hxi5N5fC.css +1 -0
- package/web/_app/immutable/chunks/{DGmSCGD3.js → 4kgFUGOH.js} +1 -1
- package/web/_app/immutable/chunks/8SS1q0nk.js +7 -0
- package/web/_app/immutable/chunks/{CfL6O_ia.js → BK6pLgdi.js} +1 -1
- package/web/_app/immutable/chunks/{DuLysVkb.js → Bk_JinGf.js} +1 -1
- package/web/_app/immutable/chunks/CFEI5lV9.js +1 -0
- package/web/_app/immutable/chunks/{BgT6ZdzK.js → CiMp12cC.js} +1 -1
- package/web/_app/immutable/chunks/{mLFVM17H.js → D4YEq54N.js} +1 -1
- package/web/_app/immutable/chunks/{CMeq8te_.js → DDCg82xL.js} +1 -1
- package/web/_app/immutable/chunks/DThNJvmp.js +1 -0
- package/web/_app/immutable/chunks/{DNjLZcwq.js → D_jbSWJl.js} +1 -1
- package/web/_app/immutable/chunks/DbeMVOH4.js +1 -0
- package/web/_app/immutable/chunks/{CODXTnUW.js → DsQj0LyB.js} +4 -4
- package/web/_app/immutable/chunks/{DktGnzDy.js → Uo6irDQW.js} +80 -79
- package/web/_app/immutable/chunks/{DaulBP5z.js → jTXVas70.js} +1 -1
- package/web/_app/immutable/entry/app.CvK8zypr.js +2 -0
- package/web/_app/immutable/entry/start.Dcgm6sQd.js +1 -0
- package/web/_app/immutable/nodes/0.0TdRBEoR.js +26 -0
- package/web/_app/immutable/nodes/{1.C-RxYNx3.js → 1.Dchqgt4j.js} +1 -1
- package/web/_app/immutable/nodes/2.C0CMUdSu.js +1 -0
- package/web/_app/immutable/nodes/3.MjtWDMWd.js +1 -0
- package/web/_app/immutable/nodes/4.hhS0SQta.js +2 -0
- package/web/_app/immutable/nodes/5.C33_cw2J.js +9 -0
- package/web/_app/immutable/nodes/6.owNfwwRl.js +1 -0
- package/web/_app/immutable/nodes/7.BpxHVHoY.js +1 -0
- package/web/_app/version.json +1 -1
- package/web/index.html +20 -19
- package/web/_app/immutable/assets/0.DcsDj0O1.css +0 -1
- package/web/_app/immutable/assets/Timeline.KTc3LKuK.css +0 -1
- package/web/_app/immutable/assets/drawn.CHbcoujQ.css +0 -1
- package/web/_app/immutable/chunks/BYSDTLqw.js +0 -1
- package/web/_app/immutable/chunks/DDVefAkE.js +0 -7
- package/web/_app/immutable/chunks/Db_gdTNI.js +0 -1
- package/web/_app/immutable/chunks/F7HCRtmu.js +0 -1
- package/web/_app/immutable/chunks/wxBqjpRy.js +0 -1
- package/web/_app/immutable/entry/app.wp4GfiBT.js +0 -2
- package/web/_app/immutable/entry/start.PPXyd7_0.js +0 -1
- package/web/_app/immutable/nodes/0.JerS9yOA.js +0 -26
- package/web/_app/immutable/nodes/2.Bbkruoyi.js +0 -1
- package/web/_app/immutable/nodes/3.BkpGKa9k.js +0 -1
- package/web/_app/immutable/nodes/4.Bj25nsxG.js +0 -2
- package/web/_app/immutable/nodes/5.D9sfzyBX.js +0 -9
- package/web/_app/immutable/nodes/6.Di1re0aR.js +0 -1
- package/web/_app/immutable/nodes/7.MWEn-qPC.js +0 -1
package/docs/setup-for-agents.md
CHANGED
|
@@ -1,14 +1,8 @@
|
|
|
1
1
|
# Setting isorite up: for an AI helping someone
|
|
2
2
|
|
|
3
|
-
You're helping someone set up isorite: a local web app over a folder of Markdown notes (the browser), an agent in it
|
|
4
|
-
called Iso, and `isorite term`, which runs OpenCode 2 beside the notes. This is everything isorite reads, writes and
|
|
5
|
-
runs for the setup, and how each failure shows. `isorite help setup` prints this file.
|
|
3
|
+
You're helping someone set up isorite: a local web app over a folder of Markdown notes (the browser), an agent in it called Iso, and `isorite term`, which runs OpenCode 2 beside the notes. This is everything isorite reads, writes and runs for the setup, and how each failure shows. `isorite help setup` prints this file.
|
|
6
4
|
|
|
7
|
-
**Start here:** ask them to run `isorite doctor --report` (add the notes folder if they have one) and paste what it
|
|
8
|
-
prints. It shows isorite's and Node's versions, the platform, the configuration with secrets replaced by their
|
|
9
|
-
lengths, the environment variables isorite reads, and a line for each check, ✓ passed, ✗ failed, ! a warning, –
|
|
10
|
-
skipped. Most failures say what to change. Never ask them to paste a key or passphrase, and don't ask them to
|
|
11
|
-
turn off certificate checking (`NODE_TLS_REJECT_UNAUTHORIZED=0`).
|
|
5
|
+
**Start here:** ask them to run `isorite doctor --report` (add the notes folder if they have one) and paste what it prints. It shows isorite's and Node's versions, the platform, the configuration with secrets replaced by their lengths, the environment variables isorite reads, and a line for each check, ✓ passed, ✗ failed, ! a warning, – skipped. Most failures say what to change. Never ask them to paste a key or passphrase, and don't ask them to turn off certificate checking (`NODE_TLS_REJECT_UNAUTHORIZED=0`).
|
|
12
6
|
|
|
13
7
|
## Commands
|
|
14
8
|
|
|
@@ -44,9 +38,7 @@ isorite never reads or changes the person's own OpenCode settings (`~/.config/op
|
|
|
44
38
|
|
|
45
39
|
## config.toml
|
|
46
40
|
|
|
47
|
-
The person can set all of this from Iso's settings in the browser (M18: on `localhost` only; checked as `doctor`
|
|
48
|
-
checks it, kept into use without a restart). The page writes the same fields; it drops comments, keeping the file
|
|
49
|
-
as it was once as `config.toml.bak`. Writing it by hand needs the server restarted.
|
|
41
|
+
The person can set all of this from Iso's settings in the browser (M18: on `localhost` only; checked as `doctor` checks it, kept into use without a restart). The page writes the same fields; it drops comments, keeping the file as it was once as `config.toml.bak`. Writing it by hand needs the server restarted.
|
|
50
42
|
|
|
51
43
|
```toml
|
|
52
44
|
[provider]
|
|
@@ -81,8 +73,7 @@ max = "…" # most able
|
|
|
81
73
|
|
|
82
74
|
Rules:
|
|
83
75
|
|
|
84
|
-
- With `url` set and no `[tiers]`, OpenRouter's names are used (`anthropic/claude-…`). A gateway usually answers
|
|
85
|
-
404 to them. Doctor warns: name the gateway's models under `[tiers]`.
|
|
76
|
+
- With `url` set and no `[tiers]`, OpenRouter's names are used (`anthropic/claude-…`). A gateway usually answers 404 to them. Doctor warns: name the gateway's models under `[tiers]`.
|
|
86
77
|
- `pfx` and `cert` can't both be named. `cert` and `cert_key` go together.
|
|
87
78
|
- A `"$NAME"` value whose variable isn't set is an error naming both.
|
|
88
79
|
- Certificates are used only over https, and only for the provider's own address.
|
|
@@ -103,22 +94,11 @@ Rules:
|
|
|
103
94
|
|
|
104
95
|
## How requests reach the provider
|
|
105
96
|
|
|
106
|
-
- **Iso** (in the isorite server) posts to `<url>/chat/completions?<query>`, streaming, with the key (in
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
-
|
|
111
|
-
server's relay, and with the server's token as its key. The relay adds the real key, certificate, headers and
|
|
112
|
-
query, and passes `/chat/completions` and `/models` on. So whatever works for Iso works for the terminal. The
|
|
113
|
-
relay answers only on 127.0.0.1, and only that token.
|
|
114
|
-
- **Retries.** A 502, 503 or 504, a dropped connection or a timeout is asked again up to 3 times (after about 1, 2
|
|
115
|
-
and 4 s), and a 429 once (after its `Retry-After`, if 10 s or less), but only before any of the reply has come.
|
|
116
|
-
The relay does the same before it passes anything to OpenCode (which retries on its own as well). 4xx answers
|
|
117
|
-
and names not found are the settings', and are not asked again.
|
|
118
|
-
- **An empty reply.** A reply cut off at its length limit with nothing written (a reasoning model that spent the
|
|
119
|
-
budget thinking) is asked once more with three times the room.
|
|
120
|
-
- With no key and no certificate in `config.toml`, and no `ISORITE_GATEWAY_*`, OpenCode uses its own models.
|
|
121
|
-
`isorite term` prints which models it uses, and from where.
|
|
97
|
+
- **Iso** (in the isorite server) posts to `<url>/chat/completions?<query>`, streaming, with the key (in `Authorization: Bearer` or `key_header`), `headers`, and `stream_options` unless `stream_usage = false`. With a certificate or `ca`, it goes by `node:https` with them, through `HTTPS_PROXY` if set. Otherwise it uses Node's fetch.
|
|
98
|
+
- **The terminal**: OpenCode is configured with the provider at `http://127.0.0.1:<port>/api/gateway`, the isorite server's relay, and with the server's token as its key. The relay adds the real key, certificate, headers and query, and passes `/chat/completions` and `/models` on. So whatever works for Iso works for the terminal. The relay answers only on 127.0.0.1, and only that token.
|
|
99
|
+
- **Retries.** A 502, 503 or 504, a dropped connection or a timeout is asked again up to 3 times (after about 1, 2 and 4 s), and a 429 once (after its `Retry-After`, if 10 s or less), but only before any of the reply has come. The relay does the same before it passes anything to OpenCode (which retries on its own as well). 4xx answers and names not found are the settings', and are not asked again.
|
|
100
|
+
- **An empty reply.** A reply cut off at its length limit with nothing written (a reasoning model that spent the budget thinking) is asked once more with three times the room.
|
|
101
|
+
- With no key and no certificate in `config.toml`, and no `ISORITE_GATEWAY_*`, OpenCode uses its own models. `isorite term` prints which models it uses, and from where.
|
|
122
102
|
|
|
123
103
|
## What working looks like
|
|
124
104
|
|
|
@@ -168,11 +148,6 @@ Rules:
|
|
|
168
148
|
|
|
169
149
|
## Another model for search by meaning
|
|
170
150
|
|
|
171
|
-
Any ONNX model that gives 384 numbers for a text, with its `tokenizer.json`, can stand in for granite:
|
|
172
|
-
`isorite model --from <folder>`. It's checked by use (loaded, and asked for one vector), copied into the models
|
|
173
|
-
folder, and used from then on; each base's vectors are made again with it. An optional `isorite-model.json` beside
|
|
174
|
-
its files gives `{"name": "…", "pooling": "cls" | "mean"}`: `cls` (the default) takes the first token's state, as
|
|
175
|
-
granite is used; `mean` averages them all, as sentence-transformers models such as all-MiniLM-L6-v2 are used.
|
|
151
|
+
Any ONNX model that gives 384 numbers for a text, with its `tokenizer.json`, can stand in for granite: `isorite model --from <folder>`. It's checked by use (loaded, and asked for one vector), copied into the models folder, and used from then on; each base's vectors are made again with it. An optional `isorite-model.json` beside its files gives `{"name": "…", "pooling": "cls" | "mean"}`: `cls` (the default) takes the first token's state, as granite is used; `mean` averages them all, as sentence-transformers models such as all-MiniLM-L6-v2 are used.
|
|
176
152
|
|
|
177
|
-
If the gateway isn't OpenAI-compatible (Bedrock's or Vertex's own APIs, for example), isorite can't use it directly.
|
|
178
|
-
An OpenAI-compatible proxy in front of it, such as LiteLLM, can.
|
|
153
|
+
If the gateway isn't OpenAI-compatible (Bedrock's or Vertex's own APIs, for example), isorite can't use it directly. An OpenAI-compatible proxy in front of it, such as LiteLLM, can.
|
package/docs/setup.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Setting isorite up
|
|
2
2
|
|
|
3
|
-
From nothing to Iso answering in the browser and OpenCode working in the terminal. If anything fails on the way,
|
|
4
|
-
run `isorite doctor`: it checks each step and says what to change.
|
|
3
|
+
From nothing to Iso answering in the browser and OpenCode working in the terminal. If anything fails on the way, run `isorite doctor`: it checks each step and says what to change.
|
|
5
4
|
|
|
6
5
|
## 1. Install
|
|
7
6
|
|
|
@@ -11,49 +10,35 @@ Either one file, with Node inside it:
|
|
|
11
10
|
```sh
|
|
12
11
|
curl -fsSL https://github.com/lachlanjs/isorite/releases/latest/download/install.sh | sh
|
|
13
12
|
```
|
|
14
|
-
It goes in `~/.local/bin` (`--dir` for another folder). Each address it fetches is printed, so a machine that
|
|
15
|
-
can't reach GitHub can fetch the same files another way, or from a mirror with `--url <the executable's address>`.
|
|
16
|
-
It unpacks itself into `~/.cache/isorite/<version>/` the first time it runs. Run the installer again to update.
|
|
13
|
+
It goes in `~/.local/bin` (`--dir` for another folder). Each address it fetches is printed, so a machine that can't reach GitHub can fetch the same files another way, or from a mirror with `--url <the executable's address>`. It unpacks itself into `~/.cache/isorite/<version>/` the first time it runs. Run the installer again to update.
|
|
17
14
|
|
|
18
15
|
On Windows, in PowerShell:
|
|
19
16
|
```powershell
|
|
20
17
|
irm https://github.com/lachlanjs/isorite/releases/latest/download/install.ps1 | iex
|
|
21
18
|
```
|
|
22
|
-
It goes in `%LOCALAPPDATA%\isorite`, which it adds to your PATH (open a new terminal after), and unpacks itself
|
|
23
|
-
into `%LOCALAPPDATA%\isorite\<version>\` the first time it runs. The executable isn't signed, so Windows may say
|
|
24
|
-
it's from an unknown publisher. isorite's own settings are in `%USERPROFILE%\.config\isorite\`. Use Windows
|
|
25
|
-
Terminal for `isorite term`. `isorite opencode` needs npm, so Node 24 as well.
|
|
19
|
+
It goes in `%LOCALAPPDATA%\isorite`, which it adds to your PATH (open a new terminal after), and unpacks itself into `%LOCALAPPDATA%\isorite\<version>\` the first time it runs. The executable isn't signed, so Windows may say it's from an unknown publisher. isorite's own settings are in `%USERPROFILE%\.config\isorite\`. Use Windows Terminal for `isorite term`. `isorite opencode` needs npm, so Node 24 as well.
|
|
26
20
|
|
|
27
21
|
Or from npm:
|
|
28
22
|
|
|
29
23
|
- **Node 24** or later (`node --version`).
|
|
30
24
|
- **isorite**: `npm i -g isorite`.
|
|
31
25
|
|
|
32
|
-
Then, for the terminal, **OpenCode 2**: `isorite opencode` installs it for isorite alone (in
|
|
33
|
-
`~/.config/isorite/opencode-cli`), leaving your global npm prefix, and any OpenCode 1 you use, as they are.
|
|
26
|
+
Then, for the terminal, **OpenCode 2**: `isorite opencode` installs it for isorite alone (in `~/.config/isorite/opencode-cli`), leaving your global npm prefix, and any OpenCode 1 you use, as they are.
|
|
34
27
|
|
|
35
28
|
`isorite guide` now opens the guide, a knowledge base about isorite with things to do in it. Until a provider is set up, Iso there is the guide's finder: no key, nothing sent anywhere.
|
|
36
29
|
|
|
37
30
|
## 2. A model provider
|
|
38
31
|
|
|
39
|
-
Iso and the terminal need an OpenAI-compatible provider. isorite's settings are in `~/.config/isorite/config.toml`
|
|
40
|
-
(or `$XDG_CONFIG_HOME/isorite/config.toml`), a file only you can read.
|
|
32
|
+
Iso and the terminal need an OpenAI-compatible provider. isorite's settings are in `~/.config/isorite/config.toml` (or `$XDG_CONFIG_HOME/isorite/config.toml`), a file only you can read.
|
|
41
33
|
|
|
42
|
-
**OpenRouter** is the default. Open isorite in the browser, open Iso's settings (the icon at the right of Iso's
|
|
43
|
-
pane head), and paste a key there, or sign in with OpenRouter, which makes one. Nothing else is needed.
|
|
34
|
+
**OpenRouter** is the default. Open isorite in the browser, open Iso's settings (the icon at the right of Iso's pane head), and paste a key there, or sign in with OpenRouter, which makes one. Nothing else is needed.
|
|
44
35
|
|
|
45
|
-
**Any other provider or gateway** is set up in the same place: choose *a gateway of your own*, give its address and
|
|
46
|
-
key, and open *what else it asks for* for its key's header, headers, query values, client certificate, and whether
|
|
47
|
-
it reports usage. Each tier's model is picked from the gateway's own list. The pulse icon checks the setup before
|
|
48
|
-
it is kept, as `isorite doctor` would, and says what to change; the tick keeps it, in use at once, without a
|
|
49
|
-
restart. The clipboard icon copies `isorite doctor --report` for someone helping.
|
|
36
|
+
**Any other provider or gateway** is set up in the same place: choose *a gateway of your own*, give its address and key, and open *what else it asks for* for its key's header, headers, query values, client certificate, and whether it reports usage. Each tier's model is picked from the gateway's own list. The pulse icon checks the setup before it is kept, as `isorite doctor` would, and says what to change; the tick keeps it, in use at once, without a restart. The clipboard icon copies `isorite doctor --report` for someone helping.
|
|
50
37
|
|
|
51
|
-
- The setup is changed only from this machine (`localhost`). From a phone over a tailnet it is shown and checked,
|
|
52
|
-
and the key can be changed, but not the address it goes to.
|
|
38
|
+
- The setup is changed only from this machine (`localhost`). From a phone over a tailnet it is shown and checked, and the key can be changed, but not the address it goes to.
|
|
53
39
|
- Keeping a new address forgets the key held for the old one, unless a key is given with it.
|
|
54
40
|
- Secrets (the key, the `.pfx`'s password, a header whose name looks secret) are written and never shown again.
|
|
55
|
-
- The page writes `config.toml` again without its comments; the first time, the file as it was is kept beside it
|
|
56
|
-
as `config.toml.bak`.
|
|
41
|
+
- The page writes `config.toml` again without its comments; the first time, the file as it was is kept beside it as `config.toml.bak`.
|
|
57
42
|
- A running `isorite term` keeps the models it started with, but asks through the new address at once.
|
|
58
43
|
|
|
59
44
|
The same setup can be written by hand in `config.toml`, under `[provider]`, with the models under `[tiers]`:
|
|
@@ -103,17 +88,13 @@ X-Project = "$PROJECT_ID"
|
|
|
103
88
|
api-version = "2024-10-21"
|
|
104
89
|
```
|
|
105
90
|
|
|
106
|
-
Paths may start with `~`, or are taken from `config.toml`'s folder. Any value written `"$NAME"` is read from that
|
|
107
|
-
environment variable.
|
|
91
|
+
Paths may start with `~`, or are taken from `config.toml`'s folder. Any value written `"$NAME"` is read from that environment variable.
|
|
108
92
|
|
|
109
93
|
### Proxies and the company's certificates
|
|
110
94
|
|
|
111
|
-
The `isorite` command uses `HTTPS_PROXY` (and `NO_PROXY`) when they're set, and trusts the system's certificate
|
|
112
|
-
authorities as well as Node's own, so a company's authority installed on the machine is trusted. Node does neither
|
|
113
|
-
by itself. Set `ISORITE_NODE_DEFAULTS=0` to leave Node as it is.
|
|
95
|
+
The `isorite` command uses `HTTPS_PROXY` (and `NO_PROXY`) when they're set, and trusts the system's certificate authorities as well as Node's own, so a company's authority installed on the machine is trusted. Node does neither by itself. Set `ISORITE_NODE_DEFAULTS=0` to leave Node as it is.
|
|
114
96
|
|
|
115
|
-
If the company's authority isn't installed on the machine, name its certificate as `ca` above, or in
|
|
116
|
-
`NODE_EXTRA_CA_CERTS`.
|
|
97
|
+
If the company's authority isn't installed on the machine, name its certificate as `ca` above, or in `NODE_EXTRA_CA_CERTS`.
|
|
117
98
|
|
|
118
99
|
## 3. Your notes
|
|
119
100
|
|
|
@@ -124,12 +105,9 @@ isorite new ~/notes/my-project
|
|
|
124
105
|
isorite serve ~/notes/my-project
|
|
125
106
|
```
|
|
126
107
|
|
|
127
|
-
`isorite new` makes the folder, empty but for isorite's own `.isorite/`. A folder of notes you have already is
|
|
128
|
-
opened as it is, with `isorite serve`.
|
|
108
|
+
`isorite new` makes the folder, empty but for isorite's own `.isorite/`. A folder of notes you have already is opened as it is, with `isorite serve`.
|
|
129
109
|
|
|
130
|
-
How you want the base kept (your notation, the level, the language, how notes are named) goes in `AGENTS.md` at
|
|
131
|
-
the top of the notes, which Iso and the terminal's agent are both given. Edit it in Iso's settings, the icon at the
|
|
132
|
-
right of its pane's header, or in any editor. Iso may offer a line for it when you say how you want things done.
|
|
110
|
+
How you want the base kept (your notation, the level, the language, how notes are named) goes in `AGENTS.md` at the top of the notes, which Iso and the terminal's agent are both given. Edit it in Iso's settings, the icon at the right of its pane's header, or in any editor. Iso may offer a line for it when you say how you want things done.
|
|
133
111
|
|
|
134
112
|
It prints a link to click: `http://localhost:4767/`. isorite keeps what it needs in the folder's `.isorite/`.
|
|
135
113
|
|
|
@@ -140,8 +118,7 @@ cd ~/code/my-project
|
|
|
140
118
|
isorite term ~/notes/my-project
|
|
141
119
|
```
|
|
142
120
|
|
|
143
|
-
It prints the same link, and which models the terminal uses. OpenCode uses the provider above, through isorite. More
|
|
144
|
-
is in [terminal.md](terminal.md).
|
|
121
|
+
It prints the same link, and which models the terminal uses. OpenCode uses the provider above, through isorite. More is in [terminal.md](terminal.md).
|
|
145
122
|
|
|
146
123
|
## 5. Several bases, and the agent's memory (optional)
|
|
147
124
|
|
|
@@ -151,11 +128,7 @@ isorite bases # the bases this machine knows: each one is listed t
|
|
|
151
128
|
isorite bases lend <name> # lend one to every session (isorite bases keep <name> stops)
|
|
152
129
|
```
|
|
153
130
|
|
|
154
|
-
One isorite server holds every base it is asked for. Each base's page is the same link with `?base=<name>`, and the
|
|
155
|
-
base's name before the first pane's name switches between them; Ctrl-click opens one in a tab of its own. A base
|
|
156
|
-
**lent** to every session can be read by every base's agent and Iso, and written by the agent, its words marked as
|
|
157
|
-
its own. The memory is one: what the agent learns about you and your tools, kept across projects, as its
|
|
158
|
-
`AGENTS.md` says. The list is in `~/.config/isorite/bases.toml`, beside `config.toml`:
|
|
131
|
+
One isorite server holds every base it is asked for. Each base's page is the same link with `?base=<name>`, and the base's name before the first pane's name switches between them; Ctrl-click opens one in a tab of its own. A base **lent** to every session can be read by every base's agent and Iso, and written by the agent, its words marked as its own. The memory is one: what the agent learns about you and your tools, kept across projects, as its `AGENTS.md` says. The list is in `~/.config/isorite/bases.toml`, beside `config.toml`:
|
|
159
132
|
|
|
160
133
|
```toml
|
|
161
134
|
[memory]
|
|
@@ -169,30 +142,16 @@ lend = true
|
|
|
169
142
|
isorite model
|
|
170
143
|
```
|
|
171
144
|
|
|
172
|
-
It says which model is installed and where, or fetches it (53 MB, once): from npm, else from a release on GitHub,
|
|
173
|
-
else from Hugging Face. Without it, Iso searches by words and follows links. A mirror of the release is tried
|
|
174
|
-
first when `ISORITE_MODEL_BASE_URL` names the folder its `.tgz` is in, and `isorite model --url <address>` fetches
|
|
175
|
-
from that one address alone. Where none of those can be reached, `isorite model` prints the file's address and
|
|
176
|
-
SHA-256: fetch it another way, and run `isorite model --from <the .tgz>`. Or copy the model's folder from a machine
|
|
177
|
-
that has it (`isorite model` there says where it is) and run `isorite model --from <folder>`. Any compatible model works the same way: an ONNX model that gives 384 numbers,
|
|
178
|
-
with its `tokenizer.json` (for example all-MiniLM-L6-v2, with `{"pooling": "mean"}` in an `isorite-model.json`
|
|
179
|
-
beside it).
|
|
145
|
+
It says which model is installed and where, or fetches it (53 MB, once): from npm, else from a release on GitHub, else from Hugging Face. Without it, Iso searches by words and follows links. A mirror of the release is tried first when `ISORITE_MODEL_BASE_URL` names the folder its `.tgz` is in, and `isorite model --url <address>` fetches from that one address alone. Where none of those can be reached, `isorite model` prints the file's address and SHA-256: fetch it another way, and run `isorite model --from <the .tgz>`. Or copy the model's folder from a machine that has it (`isorite model` there says where it is) and run `isorite model --from <folder>`. Any compatible model works the same way: an ONNX model that gives 384 numbers, with its `tokenizer.json` (for example all-MiniLM-L6-v2, with `{"pooling": "mean"}` in an `isorite-model.json` beside it).
|
|
180
146
|
|
|
181
147
|
## When something fails
|
|
182
148
|
|
|
183
|
-
If a gateway is down for a moment (it answers 502, 503 or 504, or drops the connection), Iso and the terminal ask
|
|
184
|
-
it again, up to three times. When it stays down, Iso says it's likely the gateway, not your settings, and the ↻
|
|
185
|
-
under the turn sends it again.
|
|
149
|
+
If a gateway is down for a moment (it answers 502, 503 or 504, or drops the connection), Iso and the terminal ask it again, up to three times. When it stays down, Iso says it's likely the gateway, not your settings, and the ↻ under the turn sends it again.
|
|
186
150
|
|
|
187
151
|
```sh
|
|
188
152
|
isorite doctor ~/notes/my-project
|
|
189
153
|
```
|
|
190
154
|
|
|
191
|
-
It checks, in turn: the configuration, how Node reaches the network (the proxy, the authorities), the provider
|
|
192
|
-
(its list of models, a reply of a few words from each model, and a tool call: a few hundred tokens in all), the
|
|
193
|
-
terminal (OpenCode 2, the port, the models it will use), and the notes. Each line says what failed, and what to
|
|
194
|
-
change. `--offline` asks the provider nothing.
|
|
155
|
+
It checks, in turn: the configuration, how Node reaches the network (the proxy, the authorities), the provider (its list of models, a reply of a few words from each model, and a tool call: a few hundred tokens in all), the terminal (OpenCode 2, the port, the models it will use), and the notes. Each line says what failed, and what to change. `--offline` asks the provider nothing.
|
|
195
156
|
|
|
196
|
-
`isorite doctor --report` gives all of it as one block, with the configuration and the environment it read. The
|
|
197
|
-
key, passphrases and any other secrets are shown only by their length. Paste it to whoever is helping, or to an AI
|
|
198
|
-
helping you: [setup-for-agents.md](setup-for-agents.md) is written for it, and `isorite help setup` prints it.
|
|
157
|
+
`isorite doctor --report` gives all of it as one block, with the configuration and the environment it read. The key, passphrases and any other secrets are shown only by their length. Paste it to whoever is helping, or to an AI helping you: [setup-for-agents.md](setup-for-agents.md) is written for it, and `isorite help setup` prints it.
|
package/docs/terminal.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# isorite beside your code: the terminal
|
|
2
2
|
|
|
3
|
-
How to use isorite on a project of your own. OpenCode 2 is the coding agent in your terminal; isorite gives it your
|
|
4
|
-
notes, and shows its session in Iso's pane in the browser. From there you can ask it things, give it notes and
|
|
5
|
-
passages, stop it, and answer what it asks before it acts.
|
|
3
|
+
How to use isorite on a project of your own. OpenCode 2 is the coding agent in your terminal; isorite gives it your notes, and shows its session in Iso's pane in the browser. From there you can ask it things, give it notes and passages, stop it, and answer what it asks before it acts.
|
|
6
4
|
|
|
7
5
|
Setting isorite up the first time, or at work behind a company's gateway, is in [setup.md](setup.md).
|
|
8
6
|
|
|
@@ -10,19 +8,12 @@ Setting isorite up the first time, or at work behind a company's gateway, is in
|
|
|
10
8
|
|
|
11
9
|
- **Node 24** or later.
|
|
12
10
|
- **isorite**: `npm i -g isorite`.
|
|
13
|
-
- **OpenCode 2**: `isorite opencode` installs the version isorite is tested with in `~/.config/isorite/opencode-cli`,
|
|
14
|
-
|
|
15
|
-
when it finds none. One installed yourself (`npm i -g @opencode/cli`, as `opencode2`) is found too, or name one
|
|
16
|
-
with `ISORITE_OPENCODE=/path/to/opencode`.
|
|
17
|
-
- A model provider, set once in `~/.config/isorite/config.toml`: see [setup.md](setup.md). `isorite doctor` checks
|
|
18
|
-
all of this.
|
|
11
|
+
- **OpenCode 2**: `isorite opencode` installs the version isorite is tested with in `~/.config/isorite/opencode-cli`, for isorite alone, leaving the global npm prefix (and an OpenCode 1 you use) as it is. `isorite term` offers to when it finds none. One installed yourself (`npm i -g @opencode/cli`, as `opencode2`) is found too, or name one with `ISORITE_OPENCODE=/path/to/opencode`.
|
|
12
|
+
- A model provider, set once in `~/.config/isorite/config.toml`: see [setup.md](setup.md). `isorite doctor` checks all of this.
|
|
19
13
|
|
|
20
14
|
## Your notes for the project
|
|
21
15
|
|
|
22
|
-
Keep the project's notes in a folder of their own, for example `~/notes/<project>`. It can start empty:
|
|
23
|
-
`isorite new ~/notes/<project>` makes it. isorite
|
|
24
|
-
keeps what it needs in the folder's `.isorite/` (the journals of every change, and its settings), made the first
|
|
25
|
-
time the folder is opened. Commit `.isorite/` with the notes, if they're in git.
|
|
16
|
+
Keep the project's notes in a folder of their own, for example `~/notes/<project>`. It can start empty: `isorite new ~/notes/<project>` makes it. isorite keeps what it needs in the folder's `.isorite/` (the journals of every change, and its settings), made the first time the folder is opened. Commit `.isorite/` with the notes, if they're in git.
|
|
26
17
|
|
|
27
18
|
## Starting it
|
|
28
19
|
|
|
@@ -31,8 +22,7 @@ cd ~/code/my-project
|
|
|
31
22
|
isorite term ~/notes/my-project
|
|
32
23
|
```
|
|
33
24
|
|
|
34
|
-
This starts the isorite server for the notes (unless one is running on port 4767; `--port <n>` for another), and
|
|
35
|
-
OpenCode's own server, on this machine, with a password of its own. Then it opens the terminal on that server.
|
|
25
|
+
This starts the isorite server for the notes (unless one is running on port 4767; `--port <n>` for another), and OpenCode's own server, on this machine, with a password of its own. Then it opens the terminal on that server.
|
|
36
26
|
|
|
37
27
|
Before OpenCode takes the screen, `isorite term` prints:
|
|
38
28
|
|
|
@@ -41,11 +31,9 @@ isorite: http://localhost:4767/
|
|
|
41
31
|
the terminal's models: work-large, work-small, as config.toml names them, through the isorite server
|
|
42
32
|
```
|
|
43
33
|
|
|
44
|
-
Most terminals let you click the link. It prints the same again when OpenCode exits. Closing the terminal stops
|
|
45
|
-
both servers, if `isorite term` started them.
|
|
34
|
+
Most terminals let you click the link. It prints the same again when OpenCode exits. Closing the terminal stops both servers, if `isorite term` started them.
|
|
46
35
|
|
|
47
|
-
The first time, the folder you started in is named as the notes' repository in `.isorite/settings.toml`, so that
|
|
48
|
-
code links in the notes point into it.
|
|
36
|
+
The first time, the folder you started in is named as the notes' repository in `.isorite/settings.toml`, so that code links in the notes point into it.
|
|
49
37
|
|
|
50
38
|
### Over SSH
|
|
51
39
|
|
|
@@ -55,73 +43,42 @@ code links in the notes point into it.
|
|
|
55
43
|
ssh -L 4767:localhost:4767 <the machine>
|
|
56
44
|
```
|
|
57
45
|
|
|
58
|
-
Then open `http://localhost:4767/` on your own. Over SSH, `isorite term` prints this command too. Any local port
|
|
59
|
-
works (`-L 9000:localhost:4767`, then `http://localhost:9000/`).
|
|
46
|
+
Then open `http://localhost:4767/` on your own. Over SSH, `isorite term` prints this command too. Any local port works (`-L 9000:localhost:4767`, then `http://localhost:9000/`).
|
|
60
47
|
|
|
61
48
|
## In the browser
|
|
62
49
|
|
|
63
|
-
Open the link, or type `/web` in the terminal. OpenCode runs a web page of its own as well, on another port. It
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
- **Asking from here:** what you type goes to the terminal's session, with what you gave Iso (hold a note on the
|
|
74
|
-
Atlas, or select a passage and send it to Iso): notes by name, for the agent to read with isorite's tools, and
|
|
75
|
-
passages as they are. Escape, or the square, stops it.
|
|
76
|
-
- **Permissions:** when OpenCode asks before doing something, the same question is in the pane: allow once, always
|
|
77
|
-
allow, or don't allow. Answered in either place, it's gone from both.
|
|
78
|
-
- **Notes the agent changes** are written at once, under its name. Turn on provenance in the Note pane's header to
|
|
79
|
-
see the agent's words marked, and the timeline to put a note back.
|
|
80
|
-
|
|
81
|
-
With both off, the pane is Iso's own again. The ≡ in its header, or a click on its gauge, opens what Iso is sent:
|
|
82
|
-
a row for each part, with its size. These are the notes you gave and the notes Iso read, the conversation's turns,
|
|
83
|
-
and what is always sent. Iso keeps a note it read in hand, and sets it aside after three turns unused, as a line it
|
|
84
|
-
can read again. A click switches a row on or off. At the head of the conversation, one icon sums the earlier turns
|
|
85
|
-
up into a briefing sent instead of them, and another starts a new conversation from that briefing. Iso sums up on
|
|
86
|
-
its own only when a turn would be more than the model takes.
|
|
50
|
+
Open the link, or type `/web` in the terminal. OpenCode runs a web page of its own as well, on another port. It asks for a password nobody was given, so isorite's `/web` opens isorite's page instead (OpenCode's pairing is `/pair`), and `isorite term` says on which port OpenCode's page is, so that you don't open it.
|
|
51
|
+
|
|
52
|
+
While the terminal runs, Iso's pane header has two more switches beside *Iso may edit the notes*: *Iso may edit the project's files* (Alt+F) and *Iso may run commands* (Alt+R). With either on, the pane is the terminal's session:
|
|
53
|
+
|
|
54
|
+
- **The session:** each prompt (asked in the terminal, or from here), what the agent says, and a line for each thing it does. A command opens on its output, a file on its diff, a look-up in your notes on the note.
|
|
55
|
+
- **Asking from here:** what you type goes to the terminal's session, with what you gave Iso (hold a note on the Atlas, or select a passage and send it to Iso): notes by name, for the agent to read with isorite's tools, and passages as they are. Escape, or the square, stops it.
|
|
56
|
+
- **Permissions:** when OpenCode asks before doing something, the same question is in the pane: allow once, always allow, or don't allow. Answered in either place, it's gone from both.
|
|
57
|
+
- **Notes the agent changes** are written at once, under its name. Turn on provenance in the Note pane's header to see the agent's words marked, and the timeline to put a note back.
|
|
58
|
+
|
|
59
|
+
With both off, the pane is Iso's own again. The ≡ in its header, or a click on its gauge, opens what Iso is sent: a row for each part, with its size. These are the notes you gave and the notes Iso read, the conversation's turns, and what is always sent. Iso keeps a note it read in hand, and sets it aside after three turns unused, as a line it can read again. A click switches a row on or off. At the head of the conversation, one icon sums the earlier turns up into a briefing sent instead of them, and another starts a new conversation from that briefing. Iso sums up on its own only when a turn would be more than the model takes.
|
|
87
60
|
|
|
88
61
|
## The agent's memory, and other bases
|
|
89
62
|
|
|
90
|
-
`isorite memory` makes a base for the agent's memory, lent to every session (see [setup.md](setup.md), §5). Every
|
|
91
|
-
tool the agent has takes an optional `base`: one of the bases lent to it, named by `brief_base`. Without it, a tool
|
|
92
|
-
acts on the base the terminal is for. A note in another base can also be named `memory:tools/opencode`. The agent is
|
|
93
|
-
told which bases are lent, and each base's `AGENTS.md` says how it is kept; the memory's says what to keep, and how.
|
|
63
|
+
`isorite memory` makes a base for the agent's memory, lent to every session (see [setup.md](setup.md), §5). Every tool the agent has takes an optional `base`: one of the bases lent to it, named by `brief_base`. Without it, a tool acts on the base the terminal is for. A note in another base can also be named `memory:tools/opencode`. The agent is told which bases are lent, and each base's `AGENTS.md` says how it is kept; the memory's says what to keep, and how.
|
|
94
64
|
|
|
95
|
-
A second `isorite term`, for another project, on the same port, adds its base to the server that is running rather
|
|
96
|
-
than starting another; a server `isorite term` started stops when the last terminal using it is done. Over MCP
|
|
97
|
-
(`isorite mcp`) the tools are the same.
|
|
65
|
+
A second `isorite term`, for another project, on the same port, adds its base to the server that is running rather than starting another; a server `isorite term` started stops when the last terminal using it is done. Over MCP (`isorite mcp`) the tools are the same.
|
|
98
66
|
|
|
99
|
-
To watch the memory learn, open it beside the project: choose `memory` from the base's name at the left of the
|
|
100
|
-
first pane's header (Ctrl-click for a tab of its own). What the agent reads there lights on its Atlas; what it
|
|
101
|
-
writes appears, marked as the agent's.
|
|
67
|
+
To watch the memory learn, open it beside the project: choose `memory` from the base's name at the left of the first pane's header (Ctrl-click for a tab of its own). What the agent reads there lights on its Atlas; what it writes appears, marked as the agent's.
|
|
102
68
|
|
|
103
69
|
## The models
|
|
104
70
|
|
|
105
|
-
The terminal uses Iso's provider, as `config.toml` names it ([setup.md](setup.md)): the `[tiers]` models, `mid` its
|
|
106
|
-
default. OpenCode asks the isorite server, which passes each request on to the provider with the key, the client
|
|
107
|
-
certificate, the headers and the query `config.toml` names. OpenCode is given none of them, only the isorite
|
|
108
|
-
server's token.
|
|
71
|
+
The terminal uses Iso's provider, as `config.toml` names it ([setup.md](setup.md)): the `[tiers]` models, `mid` its default. OpenCode asks the isorite server, which passes each request on to the provider with the key, the client certificate, the headers and the query `config.toml` names. OpenCode is given none of them, only the isorite server's token.
|
|
109
72
|
|
|
110
|
-
`ISORITE_GATEWAY_URL`, `ISORITE_GATEWAY_MODELS` (comma-separated) and `ISORITE_GATEWAY_KEY`, when set, are used
|
|
111
|
-
instead, and OpenCode asks that address itself. With no key and no certificate in `config.toml`, OpenCode uses its
|
|
112
|
-
own models; `isorite term` says which.
|
|
73
|
+
`ISORITE_GATEWAY_URL`, `ISORITE_GATEWAY_MODELS` (comma-separated) and `ISORITE_GATEWAY_KEY`, when set, are used instead, and OpenCode asks that address itself. With no key and no certificate in `config.toml`, OpenCode uses its own models; `isorite term` says which.
|
|
113
74
|
|
|
114
75
|
OpenCode doesn't know a gateway's prices, so Iso's pane shows the session's tokens rather than its cost.
|
|
115
76
|
|
|
116
77
|
## OpenCode's settings
|
|
117
78
|
|
|
118
|
-
OpenCode is given the base's `AGENTS.md` (in its `instructions`), when `isorite term` is named the notes, and the
|
|
119
|
-
knowledge base's ways through `brief_base`: how a note is written and linked, and how the base is kept.
|
|
79
|
+
OpenCode is given the base's `AGENTS.md` (in its `instructions`), when `isorite term` is named the notes, and the knowledge base's ways through `brief_base`: how a note is written and linked, and how the base is kept.
|
|
120
80
|
|
|
121
|
-
isorite keeps OpenCode's settings in `~/.config/isorite/opencode/`, rewritten at each start, so your own OpenCode
|
|
122
|
-
settings are never read or changed. Anything of your own goes in `~/.config/isorite/opencode/local.json`, which is
|
|
123
|
-
never rewritten, and is laid over what isorite writes. For example, to have OpenCode ask before every command (by
|
|
124
|
-
default it runs them):
|
|
81
|
+
isorite keeps OpenCode's settings in `~/.config/isorite/opencode/`, rewritten at each start, so your own OpenCode settings are never read or changed. Anything of your own goes in `~/.config/isorite/opencode/local.json`, which is never rewritten, and is laid over what isorite writes. For example, to have OpenCode ask before every command (by default it runs them):
|
|
125
82
|
|
|
126
83
|
```json
|
|
127
84
|
{ "permissions": [{ "action": "shell", "resource": "*", "effect": "ask" }] }
|
|
@@ -129,20 +86,11 @@ default it runs them):
|
|
|
129
86
|
|
|
130
87
|
## Without the internet
|
|
131
88
|
|
|
132
|
-
Once installed, isorite needs no network, as long as the model's address in `config.toml` is one you can reach (a
|
|
133
|
-
gateway, or a model served on your own machine). What it fetches, it fetches once:
|
|
89
|
+
Once installed, isorite needs no network, as long as the model's address in `config.toml` is one you can reach (a gateway, or a model served on your own machine). What it fetches, it fetches once:
|
|
134
90
|
|
|
135
91
|
- isorite and OpenCode, from npm: through your company's npm mirror, if it has one.
|
|
136
|
-
- The model for search by meaning (optional): `isorite model` gets it from npm too (`isorite-model-granite`), so the
|
|
137
|
-
same mirror serves it; else from its release on GitHub, else from Hugging Face. On a machine with none of them,
|
|
138
|
-
copy its folder from one that has it (`isorite model` there says where), or download the package from
|
|
139
|
-
`https://github.com/lachlanjs/isorite/releases/tag/model-granite-1.0.0` and unpack it, then
|
|
140
|
-
`isorite model --from <folder>`. Granite's files are checked against their SHA-256; any other compatible model is
|
|
141
|
-
checked by use ([setup-for-agents.md](setup-for-agents.md) says which).
|
|
92
|
+
- The model for search by meaning (optional): `isorite model` gets it from npm too (`isorite-model-granite`), so the same mirror serves it; else from its release on GitHub, else from Hugging Face. On a machine with none of them, copy its folder from one that has it (`isorite model` there says where), or download the package from `https://github.com/lachlanjs/isorite/releases/tag/model-granite-1.0.0` and unpack it, then `isorite model --from <folder>`. Granite's files are checked against their SHA-256; any other compatible model is checked by use ([setup-for-agents.md](setup-for-agents.md) says which).
|
|
142
93
|
|
|
143
94
|
## Who can reach it
|
|
144
95
|
|
|
145
|
-
OpenCode's server listens on this machine only (127.0.0.1), and only the isorite server talks to it. The isorite
|
|
146
|
-
server listens on this machine only too, unless you put it on your tailnet (`tailscale serve`). Then anyone on your
|
|
147
|
-
tailnet who opens the page can ask the agent to act in your project, as they could already edit your notes. The
|
|
148
|
-
provider is passed on to OpenCode only on this machine, never over the tailnet.
|
|
96
|
+
OpenCode's server listens on this machine only (127.0.0.1), and only the isorite server talks to it. The isorite server listens on this machine only too, unless you put it on your tailnet (`tailscale serve`). Then anyone on your tailnet who opens the page can ask the agent to act in your project, as they could already edit your notes. The provider is passed on to OpenCode only on this machine, never over the tailnet.
|
package/package.json
CHANGED