isorite 0.11.0 → 0.12.1

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.
Files changed (57) hide show
  1. package/README.md +2 -5
  2. package/dist/core.js +91 -7
  3. package/dist/main.js +163 -179
  4. package/docs/setup-for-agents.md +11 -36
  5. package/docs/setup.md +20 -61
  6. package/docs/terminal.md +28 -80
  7. package/package.json +1 -1
  8. package/web/_app/immutable/assets/0.DqoJ_jEe.css +1 -0
  9. package/web/_app/immutable/assets/{5.DbDKXCoO.css → 5.rBvyRuST.css} +1 -1
  10. package/web/_app/immutable/assets/{7.ljiu9bn5.css → 7.C00vyVPo.css} +1 -1
  11. package/web/_app/immutable/assets/Drawing.Q7J9MyIo.css +1 -0
  12. package/web/_app/immutable/assets/{NoteList.F579Zvj_.css → NoteList.E6jC-AtZ.css} +1 -1
  13. package/web/_app/immutable/assets/Timeline.LsRXYIBv.css +1 -0
  14. package/web/_app/immutable/assets/ground.hxi5N5fC.css +1 -0
  15. package/web/_app/immutable/chunks/{BgT6ZdzK.js → 94XMxKlw.js} +1 -1
  16. package/web/_app/immutable/chunks/{DGmSCGD3.js → 9TpKhtgt.js} +1 -1
  17. package/web/_app/immutable/chunks/{CfL6O_ia.js → BBHd0LvJ.js} +1 -1
  18. package/web/_app/immutable/chunks/BMcDEv5V.js +1 -0
  19. package/web/_app/immutable/chunks/CFEI5lV9.js +1 -0
  20. package/web/_app/immutable/chunks/ChbZenhA.js +7 -0
  21. package/web/_app/immutable/chunks/{mLFVM17H.js → CmExTt6_.js} +1 -1
  22. package/web/_app/immutable/chunks/{DuLysVkb.js → CnR51TY0.js} +1 -1
  23. package/web/_app/immutable/chunks/{DktGnzDy.js → CxAq1aod.js} +80 -79
  24. package/web/_app/immutable/chunks/{CODXTnUW.js → DMzXaGgk.js} +4 -4
  25. package/web/_app/immutable/chunks/{DNjLZcwq.js → DSYLdqdc.js} +1 -1
  26. package/web/_app/immutable/chunks/{DaulBP5z.js → DT2w6KyY.js} +1 -1
  27. package/web/_app/immutable/chunks/{CMeq8te_.js → rq7JUohF.js} +1 -1
  28. package/web/_app/immutable/chunks/wQPxmN7w.js +1 -0
  29. package/web/_app/immutable/entry/app.Z7pwf_yI.js +2 -0
  30. package/web/_app/immutable/entry/start.B_WWh0TE.js +1 -0
  31. package/web/_app/immutable/nodes/0.zgVqViQf.js +26 -0
  32. package/web/_app/immutable/nodes/{1.C-RxYNx3.js → 1.D06ogNcd.js} +1 -1
  33. package/web/_app/immutable/nodes/2.Xq8_UpCY.js +1 -0
  34. package/web/_app/immutable/nodes/3.CgpZ3cDm.js +1 -0
  35. package/web/_app/immutable/nodes/4.DQfZbhoQ.js +2 -0
  36. package/web/_app/immutable/nodes/5.BqLxxB44.js +9 -0
  37. package/web/_app/immutable/nodes/6.Dg2_pK7R.js +1 -0
  38. package/web/_app/immutable/nodes/7.BpxHVHoY.js +1 -0
  39. package/web/_app/version.json +1 -1
  40. package/web/index.html +20 -19
  41. package/web/_app/immutable/assets/0.DcsDj0O1.css +0 -1
  42. package/web/_app/immutable/assets/Timeline.KTc3LKuK.css +0 -1
  43. package/web/_app/immutable/assets/drawn.CHbcoujQ.css +0 -1
  44. package/web/_app/immutable/chunks/BYSDTLqw.js +0 -1
  45. package/web/_app/immutable/chunks/DDVefAkE.js +0 -7
  46. package/web/_app/immutable/chunks/Db_gdTNI.js +0 -1
  47. package/web/_app/immutable/chunks/F7HCRtmu.js +0 -1
  48. package/web/_app/immutable/chunks/wxBqjpRy.js +0 -1
  49. package/web/_app/immutable/entry/app.wp4GfiBT.js +0 -2
  50. package/web/_app/immutable/entry/start.PPXyd7_0.js +0 -1
  51. package/web/_app/immutable/nodes/0.JerS9yOA.js +0 -26
  52. package/web/_app/immutable/nodes/2.Bbkruoyi.js +0 -1
  53. package/web/_app/immutable/nodes/3.BkpGKa9k.js +0 -1
  54. package/web/_app/immutable/nodes/4.Bj25nsxG.js +0 -2
  55. package/web/_app/immutable/nodes/5.D9sfzyBX.js +0 -9
  56. package/web/_app/immutable/nodes/6.Di1re0aR.js +0 -1
  57. package/web/_app/immutable/nodes/7.MWEn-qPC.js +0 -1
@@ -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
- `Authorization: Bearer` or `key_header`), `headers`, and `stream_options` unless `stream_usage = false`. With a
108
- certificate or `ca`, it goes by `node:https` with them, through `HTTPS_PROXY` if set. Otherwise it uses Node's
109
- fetch.
110
- - **The terminal**: OpenCode is configured with the provider at `http://127.0.0.1:<port>/api/gateway`, the isorite
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
- for isorite alone, leaving the global npm prefix (and an OpenCode 1 you use) as it is. `isorite term` offers to
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
- asks for a password nobody was given, so isorite's `/web` opens isorite's page instead (OpenCode's pairing is
65
- `/pair`), and `isorite term` says on which port OpenCode's page is, so that you don't open it.
66
-
67
- While the terminal runs, Iso's pane header has two more switches beside *Iso may edit the notes*:
68
- *Iso may edit the project's files* (Alt+F) and *Iso may run commands* (Alt+R). With either on, the pane is the
69
- terminal's session:
70
-
71
- - **The session:** each prompt (asked in the terminal, or from here), what the agent says, and a line for each thing
72
- it does. A command opens on its output, a file on its diff, a look-up in your notes on the note.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "isorite",
3
- "version": "0.11.0",
3
+ "version": "0.12.1",
4
4
  "description": "An agentic harness for understanding: your notes as a knowledge base, an Atlas of them, an agent that reads them, and study.",
5
5
  "license": "MIT",
6
6
  "type": "module",