isorite 0.12.0 → 0.13.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.
Files changed (166) hide show
  1. package/README.md +6 -5
  2. package/dist/main.js +5688 -8903
  3. package/docs/setup-for-agents.md +44 -102
  4. package/docs/setup.md +23 -87
  5. package/docs/terminal.md +54 -55
  6. package/guide/AGENTS.md +4 -0
  7. package/guide/atlas/find-what-it-rests-on.md +9 -0
  8. package/guide/atlas/the-atlas.md +21 -0
  9. package/guide/atlas/the-switches/satellites.svg +17 -0
  10. package/guide/atlas/the-switches.md +27 -0
  11. package/guide/iso/agents-md.md +13 -0
  12. package/guide/iso/artifacts/the-guide.csv +8 -0
  13. package/guide/iso/artifacts/the-guide.html +35 -0
  14. package/guide/iso/artifacts.md +15 -0
  15. package/guide/iso/ask-iso.md +7 -0
  16. package/guide/iso/give-it-notes.md +9 -0
  17. package/guide/iso/in-hand.md +18 -0
  18. package/guide/iso/iso-writes-marked.md +15 -0
  19. package/guide/iso/iso.md +17 -0
  20. package/guide/iso/let-it-write.md +11 -0
  21. package/guide/iso/write-agents-md.md +11 -0
  22. package/guide/notes/a-note-is-markdown.md +17 -0
  23. package/guide/notes/a-notes-details.md +23 -0
  24. package/guide/notes/diagrams-and-code.md +43 -0
  25. package/guide/notes/every-change-is-kept.md +14 -0
  26. package/guide/notes/folders.md +11 -0
  27. package/guide/notes/go-back-a-version.md +9 -0
  28. package/guide/notes/link-your-notes.md +9 -0
  29. package/guide/notes/links-and-their-kinds.md +23 -0
  30. package/guide/notes/make-move-delete.md +9 -0
  31. package/guide/notes/write-in-your-notes.md +9 -0
  32. package/guide/out-of-the-base/web-and-code-links.md +13 -0
  33. package/guide/questions-and-problems/ask-a-question.md +9 -0
  34. package/guide/questions-and-problems/how-iso-reads-you.md +9 -0
  35. package/guide/questions-and-problems/problems.md +15 -0
  36. package/guide/questions-and-problems/questions.md +27 -0
  37. package/guide/questions-and-problems/resolve-a-question.md +9 -0
  38. package/guide/questions-and-problems/why-markdown-links.md +7 -0
  39. package/guide/solve-this-one.md +11 -0
  40. package/guide/start-here.md +39 -0
  41. package/guide/terminal/let-the-agent-remember.md +9 -0
  42. package/guide/terminal/memory.md +13 -0
  43. package/guide/terminal/your-own-agent.md +24 -0
  44. package/guide/your-notes.md +6 -0
  45. package/guide/your-own-base/keeping-a-base-well.md +16 -0
  46. package/guide/your-own-base/starting-a-base.md +21 -0
  47. package/package.json +4 -7
  48. package/web/_app/immutable/assets/0.BEjn1Bfl.css +1 -0
  49. package/web/_app/immutable/assets/4.fOHsAKBF.css +1 -0
  50. package/web/_app/immutable/assets/drawn.D6lJzDcc.css +1 -0
  51. package/web/_app/immutable/chunks/{BK6pLgdi.js → 3fCuxe18.js} +1 -1
  52. package/web/_app/immutable/chunks/{D5XlJBy8.js → B-DzK7Gb.js} +1 -1
  53. package/web/_app/immutable/chunks/{BuUzVkG2.js → B35sQTcK.js} +1 -1
  54. package/web/_app/immutable/chunks/{D4YEq54N.js → B6uHgLdT.js} +1 -1
  55. package/web/_app/immutable/chunks/{Dh1lBxfx.js → BA78_vo5.js} +1 -1
  56. package/web/_app/immutable/chunks/{tUSDgbpy.js → BCGaqnao.js} +1 -1
  57. package/web/_app/immutable/chunks/BCyLp7pS.js +1 -0
  58. package/web/_app/immutable/chunks/{EMo1IeTW.js → BK31dpt6.js} +1 -1
  59. package/web/_app/immutable/chunks/BOxykeIc.js +1 -0
  60. package/web/_app/immutable/chunks/{DlXrOzlh.js → BT_btfh0.js} +1 -1
  61. package/web/_app/immutable/chunks/{Xm0YTnxV.js → BWE_HS0c.js} +1 -1
  62. package/web/_app/immutable/chunks/{BLmF1B2i.js → BXBhaEho.js} +1 -1
  63. package/web/_app/immutable/chunks/{BAclEN0O.js → Bb_N98K9.js} +1 -1
  64. package/web/_app/immutable/chunks/{gPtCGHiy.js → Bd-WxALw.js} +1 -1
  65. package/web/_app/immutable/chunks/{BA8Hpxhg.js → BhEqJU15.js} +1 -1
  66. package/web/_app/immutable/chunks/{DkxkvOjx.js → BiATTH-R.js} +1 -1
  67. package/web/_app/immutable/chunks/{D5vocsTl.js → Bj-5n5Pb.js} +1 -1
  68. package/web/_app/immutable/chunks/{DRX-TQzj.js → BqipEJXw.js} +1 -1
  69. package/web/_app/immutable/chunks/{CiMp12cC.js → Bt-fHApV.js} +1 -1
  70. package/web/_app/immutable/chunks/{DXTK-eyo.js → BvPxdlBc.js} +1 -1
  71. package/web/_app/immutable/chunks/{DfCZPwp1.js → C2npZzkn.js} +1 -1
  72. package/web/_app/immutable/chunks/{DF89zyH-.js → C5Z-Y7Lu.js} +1 -1
  73. package/web/_app/immutable/chunks/{CD6xPodA.js → C8h1oeAZ.js} +1 -1
  74. package/web/_app/immutable/chunks/{DDCg82xL.js → C8nK3Jvr.js} +1 -1
  75. package/web/_app/immutable/chunks/{CFEI5lV9.js → CAlIuau0.js} +1 -1
  76. package/web/_app/immutable/chunks/{9z49435t.js → CFf_dAzX.js} +1 -1
  77. package/web/_app/immutable/chunks/{D3-rqfsM.js → CMIt1Ma8.js} +1 -1
  78. package/web/_app/immutable/chunks/{-2Meesge.js → CMikI1NP.js} +3 -3
  79. package/web/_app/immutable/chunks/{Czz9qOh8.js → CT4_O9X_.js} +1 -1
  80. package/web/_app/immutable/chunks/{DX4bJJO0.js → CTDYUZPz.js} +1 -1
  81. package/web/_app/immutable/chunks/{By4S_gy5.js → CdY1G_wk.js} +1 -1
  82. package/web/_app/immutable/chunks/Cd_SqIWq.js +523 -0
  83. package/web/_app/immutable/chunks/{DBC2xjOo.js → CdmC_l9F.js} +1 -1
  84. package/web/_app/immutable/chunks/{DbNETcPs.js → Cf-5I5_6.js} +1 -1
  85. package/web/_app/immutable/chunks/Cl5gQm2e.js +1 -0
  86. package/web/_app/immutable/chunks/{BWVMfAMh.js → CryuQgNh.js} +1 -1
  87. package/web/_app/immutable/chunks/{CT_Ry4q8.js → Ct_EK1xu.js} +1 -1
  88. package/web/_app/immutable/chunks/{BymwHy7o.js → CtkUy_15.js} +1 -1
  89. package/web/_app/immutable/chunks/{Dpa4Syyy.js → CzYPMYd4.js} +1 -1
  90. package/web/_app/immutable/chunks/{RlApGeew.js → D1LK3xRu.js} +1 -1
  91. package/web/_app/immutable/chunks/{DXK7PB4g.js → D6sVhEz3.js} +1 -1
  92. package/web/_app/immutable/chunks/{jTXVas70.js → D9JwUycj.js} +1 -1
  93. package/web/_app/immutable/chunks/{rghE0CVz.js → DCZYeMlH.js} +1 -1
  94. package/web/_app/immutable/chunks/{RFxekmX-.js → DDAG55ce.js} +1 -1
  95. package/web/_app/immutable/chunks/{CyFLqlvP.js → DFuPQaNa.js} +1 -1
  96. package/web/_app/immutable/chunks/{BXAOBcPb.js → DHJ8FcFD.js} +1 -1
  97. package/web/_app/immutable/chunks/{Bt7VOT5H.js → DKqMzyyE.js} +1 -1
  98. package/web/_app/immutable/chunks/{Bq2GBAJ0.js → DRcTlHZP.js} +1 -1
  99. package/web/_app/immutable/chunks/{C_amgxV1.js → DjUnonHY.js} +1 -1
  100. package/web/_app/immutable/chunks/{whhiiiga.js → Djr0h_v1.js} +1 -1
  101. package/web/_app/immutable/chunks/{vfDvz3qP.js → DrVtdHUW.js} +1 -1
  102. package/web/_app/immutable/chunks/{Uo6irDQW.js → O98JkczU.js} +74 -74
  103. package/web/_app/immutable/chunks/{oWM_kgYq.js → PsfIQCJ1.js} +1 -1
  104. package/web/_app/immutable/chunks/{Cl5zRP_n.js → TanDZqdf.js} +1 -1
  105. package/web/_app/immutable/chunks/{D95RKsvN.js → UDPiRmKc.js} +1 -1
  106. package/web/_app/immutable/chunks/WLe0MT1c.js +1 -0
  107. package/web/_app/immutable/chunks/{BTclWEfx.js → ZwM5k8r0.js} +1 -1
  108. package/web/_app/immutable/chunks/e2LGvGEb.js +3 -0
  109. package/web/_app/immutable/chunks/ej_0XxR7.js +1 -0
  110. package/web/_app/immutable/chunks/{CjtKPNlv.js → kG4HctVa.js} +1 -1
  111. package/web/_app/immutable/chunks/{CQd9D8Nc.js → l1LsK1sB.js} +1 -1
  112. package/web/_app/immutable/chunks/{D_jbSWJl.js → s_hW4oA1.js} +1 -1
  113. package/web/_app/immutable/entry/app.DM_AWBgH.js +2 -0
  114. package/web/_app/immutable/entry/start.BLhIKDcR.js +1 -0
  115. package/web/_app/immutable/nodes/0.xSbkmYPn.js +2 -0
  116. package/web/_app/immutable/nodes/1.BD2wJdoH.js +1 -0
  117. package/web/_app/immutable/nodes/2.shPqwtS_.js +1 -0
  118. package/web/_app/immutable/nodes/3.e_5kWaf_.js +1 -0
  119. package/web/_app/immutable/nodes/4.BEMEU6Jz.js +15 -0
  120. package/web/_app/immutable/nodes/5.DxaO-e4O.js +1 -0
  121. package/web/_app/immutable/nodes/6.C9ia8cDm.js +1 -0
  122. package/web/_app/version.json +1 -1
  123. package/web/index.html +16 -19
  124. package/dist/core.js +0 -2464
  125. package/plugin/assets/mark-lapis.png +0 -0
  126. package/plugin/assets/mark-quartz.png +0 -0
  127. package/plugin/assets/wordmark-lapis.png +0 -0
  128. package/plugin/assets/wordmark-quartz.png +0 -0
  129. package/plugin/isorite.ts +0 -65
  130. package/plugin/logo.ts +0 -99
  131. package/plugin/notepage.tsx +0 -165
  132. package/plugin/notes.ts +0 -10
  133. package/plugin/noteview.ts +0 -60
  134. package/plugin/oneatlas.ts +0 -83
  135. package/plugin/palette.ts +0 -21
  136. package/plugin/play.ts +0 -104
  137. package/plugin/server.ts +0 -76
  138. package/plugin/sources.ts +0 -18
  139. package/plugin/tui.tsx +0 -556
  140. package/plugin/wordmark.ts +0 -180
  141. package/web/_app/immutable/assets/0.BXPxx6Q0.css +0 -1
  142. package/web/_app/immutable/assets/4.CUdclsPi.css +0 -1
  143. package/web/_app/immutable/assets/5.rBvyRuST.css +0 -1
  144. package/web/_app/immutable/assets/Drawing.Q7J9MyIo.css +0 -1
  145. package/web/_app/immutable/assets/NoteEditor.S3q5lmKq.css +0 -1
  146. package/web/_app/immutable/assets/Timeline.LsRXYIBv.css +0 -1
  147. package/web/_app/immutable/chunks/4kgFUGOH.js +0 -1
  148. package/web/_app/immutable/chunks/8SS1q0nk.js +0 -7
  149. package/web/_app/immutable/chunks/Bk_JinGf.js +0 -1
  150. package/web/_app/immutable/chunks/BqrMZ9MX.js +0 -1
  151. package/web/_app/immutable/chunks/DThNJvmp.js +0 -1
  152. package/web/_app/immutable/chunks/DbeMVOH4.js +0 -1
  153. package/web/_app/immutable/chunks/DsQj0LyB.js +0 -523
  154. package/web/_app/immutable/chunks/DshHzxgH.js +0 -1
  155. package/web/_app/immutable/chunks/Iqr2CudW.js +0 -3
  156. package/web/_app/immutable/entry/app.CvK8zypr.js +0 -2
  157. package/web/_app/immutable/entry/start.Dcgm6sQd.js +0 -1
  158. package/web/_app/immutable/nodes/0.0TdRBEoR.js +0 -26
  159. package/web/_app/immutable/nodes/1.Dchqgt4j.js +0 -1
  160. package/web/_app/immutable/nodes/2.C0CMUdSu.js +0 -1
  161. package/web/_app/immutable/nodes/3.MjtWDMWd.js +0 -1
  162. package/web/_app/immutable/nodes/4.hhS0SQta.js +0 -2
  163. package/web/_app/immutable/nodes/5.C33_cw2J.js +0 -9
  164. package/web/_app/immutable/nodes/6.owNfwwRl.js +0 -1
  165. package/web/_app/immutable/nodes/7.BpxHVHoY.js +0 -1
  166. /package/web/_app/immutable/assets/{7.C00vyVPo.css → 6.C00vyVPo.css} +0 -0
@@ -1,6 +1,6 @@
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 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.
3
+ You're helping someone set up isorite: a local web app over a folder of Markdown notes (the browser), attached to the agent they already use (Claude Code, Codex, OpenCode, omp, Hermes, or any ACP agent) over MCP and ACP. isorite calls no model itself (since M25): the agent's key and model are its own, set up as for its own terminal. This is everything isorite reads, writes and runs for the setup, and how each failure shows. `isorite help setup` prints this file.
4
4
 
5
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`).
6
6
 
@@ -9,145 +9,87 @@ You're helping someone set up isorite: a local web app over a folder of Markdown
9
9
  | Command | What it does |
10
10
  |---|---|
11
11
  | `isorite new <folder>` | Makes the folder (and its parents), empty but for `.isorite/`. Refuses one with files in it already: that is opened as it is. |
12
- | `isorite doctor [<notes>] [--report] [--offline]` | Checks the setup a step at a time (below). Exit 1 if anything failed. `--offline`: asks the provider nothing. |
13
- | `isorite serve <notes> [--port <n>]` | The browser app at `http://localhost:4767/`, on 127.0.0.1 only. |
14
- | `isorite term [<notes>] [--port <n>]` | OpenCode 2 in this terminal, in the current folder (the code), with the notes beside it. Starts the isorite server if none answers on the port, and stops it on exit. |
15
- | `isorite check <notes>` | Lints the notes: frontmatter, links, cycles. |
12
+ | `isorite doctor [<notes>] [--report] [--offline]` | Checks the setup a step at a time (below), and offers the project's MCP config for the notes named, written on a yes at a terminal. Exit 1 if anything failed. `--offline`: fetches nothing. |
13
+ | `isorite serve <notes> [--port <n>]` | The browser app at `http://localhost:4767/`, on 127.0.0.1 only. Starts the agent chosen for the base's pane, if one is. |
14
+ | `isorite acp --agent "<command>" [<notes>] [--port <n>]` | Run by an ACP front end (Toad, Zed) as its agent: starts the real agent behind it, adds isorite's MCP to its sessions, and shows them in Iso's pane. Starts the isorite server if none answers on the port, and lets it go on exit. |
15
+ | `isorite mcp [<notes>] [--port <n>] [--agent <name>]` | isorite's MCP over stdio, a bridge to the server's, for an agent in its own terminal; what the project's config names. Starts the server likewise. |
16
+ | `isorite check <notes>` | Lints the notes: frontmatter, links, cycles, and artifacts' rules. |
16
17
  | `isorite memory [<folder>]` | The agent's memory: a base (`~/isorite-memory` unless named), a git repository of its own, with its practice in `AGENTS.md`, listed in `bases.toml` as `memory`, lent. Run again, says where it is and changes nothing. |
17
18
  | `isorite bases [lend\|keep <name>]` | The bases this machine knows, as `bases.toml` lists them; `lend` lends one to every session, `keep` stops. |
18
- | `isorite guide [<folder>]` | The guide, a knowledge base about isorite, written into `~/isorite-guide` (or the folder named) and served. With no provider set up, Iso is the guide's finder: no key or network needed. Good to check the install alone. `isorite --tutorial` is another name for it. |
19
+ | `isorite guide [<folder>]` | The guide, a knowledge base about isorite, written into `~/isorite-guide` (or the folder named) and served. Good to check the install alone. `isorite --tutorial` is another name for it. |
19
20
  | `isorite model [--from <folder\|.tgz>] [--url <url>]` | Optional: the model for search by meaning. Says which is installed and where, else fetches it (53 MB) from `ISORITE_MODEL_BASE_URL` (a mirror: the folder `isorite-model-granite-1.0.0.tgz` is in), npm, a GitHub release, then Hugging Face, saying why each failed. `--url`: that address only. `--from`: the release's `.tgz` fetched by hand (checked by its SHA-256), granite's files, or any compatible model (below). |
20
21
  | `isorite help setup` | Prints this. |
21
22
 
23
+ `isorite term` and `isorite opencode` were retired in M25: OpenCode is attached as any agent (`opencode acp`).
24
+
22
25
  ## Files
23
26
 
24
27
  | Where | What |
25
28
  |---|---|
26
- | `~/.config/isorite/config.toml` (or `$XDG_CONFIG_HOME/isorite/`) | isorite's settings for this machine: `device`, `[provider]`, `[tiers]`, `[prices]`. Mode 600. Holds the key. |
27
- | `~/.config/isorite/bases.toml` | The bases this machine knows, a table each: `[<name>] path = "…"`, `lend = true` to lend it to every session. Each base opened is added, under its folder's name. Separate from config.toml, which is never rewritten for it. |
28
- | `~/.config/isorite/opencode/` | OpenCode's settings as isorite writes them at each `isorite term` start (`opencode.json`, theme, plugin link). Rewritten; don't edit. |
29
- | `~/.config/isorite/opencode/local.json` | The person's own OpenCode settings, laid over isorite's. Never rewritten. |
30
- | `<notes>/AGENTS.md` | The base's own instructions (notation, level, how notes are named), sent to Iso with every turn and named in OpenCode's `instructions`. Not a note: not on the Atlas, not linted. |
31
- | `<notes>/.isorite/` | isorite's own folder in the notes: journals of every change, `settings.toml` (`repository = "<path>"`, where code links point). Made on first open; commit it with the notes. |
29
+ | `~/.config/isorite/config.toml` (or `$XDG_CONFIG_HOME/isorite/`) | This machine's `device` id. Mode 600. A `[provider]` or `[tiers]` from before M25 is left as written and no longer read. |
30
+ | `~/.config/isorite/bases.toml` | The bases this machine knows, a table each: `[<name>] path = "…"`, `lend = true` to lend it to every session, and `agent = "<registry id>"` or `agent_command = "…"` for the agent the pane starts. Each base opened is added, under its folder's name. |
31
+ | `<notes>/AGENTS.md` | The base's own instructions (notation, level, how notes are named), given to every agent in `brief_base`. Not a note: not on the Atlas, not linted. |
32
+ | `<notes>/.isorite/` | isorite's own folder in the notes: journals of every change, the agents' sessions it carried (`conversations/agents/`), Iso's conversations from before M25 (`conversations/`), and `settings.toml` (`repository = "<path>"`, where code links point when it isn't the git repository the notes are in, or for notes outside any, the one an agent was first attached in; `agents_write_notes = false`, the pane's switch). Made on first open; commit it with the notes. |
33
+ | `<repository>/.mcp.json`, `<repository>/opencode.json` | The project's MCP config, naming `isorite mcp <the base's folder>`; written by `doctor` or the pane on a yes. What else they hold is kept. |
34
+ | `~/.cache/isorite/acp-registry.json` | The ACP registry, kept an hour. |
35
+ | `~/.local/share/isorite/agents/<id>/<version>/` | A registry agent's program, fetched once and checked against its SHA-256. |
32
36
  | `~/.local/share/isorite/models/` (or `$XDG_DATA_HOME/isorite/models/`) | The models for search by meaning, a folder each: `granite-embedding-small-english-r2/`, and any other installed with `--from`. `use` names the one used, if not granite. |
33
37
  | `~/.cache/isorite/vectors-<hash>.json` | Each base's vectors, made by the model; made again when the model changes. |
34
- | `$TMPDIR/isorite-term-<port>.log` | The isorite server's output, when `isorite term` started it. Look here when "the isorite server did not start". |
35
- | `$TMPDIR/isorite-opencode-<port>.log` | OpenCode's server's output, under `isorite term`. |
36
-
37
- isorite never reads or changes the person's own OpenCode settings (`~/.config/opencode/`).
38
-
39
- ## config.toml
40
-
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.
42
-
43
- ```toml
44
- [provider]
45
- name = "work" # optional; what isorite calls the provider in messages
46
- url = "https://…/v1" # OpenAI-compatible; /chat/completions and /models are added. Absent: OpenRouter
47
- key = "…" # the key; also settable in Iso's settings in the browser
48
- key_header = "api-key" # send the key in this header, as it is, instead of Authorization: Bearer
49
- key_prefix = "Bearer " # what goes before the key in key_header (default: "Bearer " in Authorization, else "")
50
- stream_usage = false # don't send stream_options (some gateways answer 400 to it)
51
- max_tokens = 16000 # the least output budget any call gets, for models that think at length
52
- cache_marks = true # send Anthropic cache marks (OpenRouter-style gateways only)
53
- pfx = "~/certs/me.pfx" # client certificate (mTLS), PKCS#12; or cert + cert_key (PEM)
54
- pfx_passphrase = "$PFX_PASS" # "$NAME": read from that environment variable
55
- cert = "me.pem" # relative paths are from config.toml's folder
56
- cert_key = "me.key"
57
- ca = "company-root.pem" # extra authority for the gateway's certificate (added to the trusted ones)
58
-
59
- [provider.headers] # sent with every request; values may be "$NAME"
60
- X-Team = "…"
61
-
62
- [provider.query] # added to every request's URL
63
- api-version = "…"
64
-
65
- [tiers] # the provider's model names
66
- low = "…" # quick
67
- mid = "…" # Iso's default; the terminal's default
68
- max = "…" # most able
69
-
70
- [prices] # optional: US$ per million tokens in and out, for providers that don't say
71
- "model-name" = [3.0, 15.0]
72
- ```
73
-
74
- Rules:
75
-
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]`.
77
- - `pfx` and `cert` can't both be named. `cert` and `cert_key` go together.
78
- - A `"$NAME"` value whose variable isn't set is an error naming both.
79
- - Certificates are used only over https, and only for the provider's own address.
38
+ | `$TMPDIR/isorite-server-<port>.log` | The isorite server's output, when `isorite acp` or `isorite mcp` started it. Look here when "the isorite server did not start". |
80
39
 
81
40
  ## Environment variables
82
41
 
83
42
  | Variable | Effect |
84
43
  |---|---|
85
- | `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` | Used by the `isorite` command: it re-runs itself once with `NODE_USE_ENV_PROXY=1`, and adds `localhost,127.0.0.1,::1` to `NO_PROXY`. OpenCode (Bun) reads them itself. |
44
+ | `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY` | Used by the `isorite` command: it re-runs itself once with `NODE_USE_ENV_PROXY=1`, and adds `localhost,127.0.0.1,::1` to `NO_PROXY`. The agent reads them itself. |
86
45
  | `ISORITE_NODE_DEFAULTS=0` | Leave Node as it is: no system authorities, no proxy unless Node is told. |
87
46
  | `NODE_EXTRA_CA_CERTS` | A .pem of extra authorities, read by Node at start. |
88
- | `ISORITE_GATEWAY_URL`, `ISORITE_GATEWAY_MODELS`, `ISORITE_GATEWAY_KEY` | The terminal only: OpenCode asks this OpenAI-compatible address directly, with these models (comma-separated) and key, instead of `config.toml`'s provider. No certificate or headers apply. |
47
+ | `ISORITE_ACP_REGISTRY` | Another ACP registry: an address, or a file. |
89
48
  | `ISORITE_EMBED_DIR` | The model for search by meaning is in this folder (and nowhere else is looked). |
90
49
  | `ISORITE_EMBED=off` | No search by meaning, whatever is installed. |
91
- | `ISORITE_OPENCODE` | The OpenCode 2 binary to run. Otherwise `opencode2`, then `opencode`, must be version 2. |
50
+ | `ISORITE_BROWSER` | The Chromium to run artifacts in, unseen, when an agent writes one. |
92
51
  | `XDG_CONFIG_HOME` | Where `isorite/config.toml` is looked for. |
93
- | `SSH_CONNECTION` | Set over SSH: `term`, `serve` and `doctor` print the `ssh -L` command for the browser. |
52
+ | `SSH_CONNECTION` | Set over SSH: `serve` and `doctor` print the `ssh -L` command for the browser. |
94
53
 
95
- ## How requests reach the provider
96
-
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.
54
+ The agent the pane starts is given the server's environment: its own keys (`ANTHROPIC_API_KEY`, `CODEX_API_KEY`, …) must be set where `isorite serve` runs.
102
55
 
103
56
  ## What working looks like
104
57
 
105
- `isorite doctor` ends `nothing failed`, with lines like:
58
+ `isorite doctor <notes>` ends `nothing failed`, with lines like:
106
59
 
107
60
  ```
108
- ✓ config: /home/me/.config/isorite/config.toml: work at https://llm-gateway.corp.example/v1
109
- ✓ key: <48 characters>, sent in api-key
110
- ✓ certificate: /home/me/certs/me.pfx
111
- ✓ models: low small, mid medium, max large
61
+ ✓ config: /home/me/.config/isorite/config.toml
112
62
  ✓ proxy: http://proxy.corp:8080, used
113
63
  ✓ authorities: the system's (146), as well as Node's own
114
- ✓ reached: https://llm-gateway.corp.example/v1/models answered with 12 models
115
- ✓ reply from medium: "ready", 14 tokens in and 2 out
116
- ✓ tools: medium called ping
117
- ✓ opencode: opencode2 2.0.32
118
- ✓ terminal: work's models, through isorite's server at http://127.0.0.1:4767/api/gateway, …
64
+ ✓ port: 4767 is free: isorite acp and isorite mcp start a server there
65
+ ✓ artifacts: run unseen when an agent writes one, in /usr/bin/chromium
66
+ ✓ search by meaning: granite-embedding-small-english-r2 at /home/me/.local/share/isorite/models/granite-embedding-small-english-r2
67
+ ✓ notes: /home/me/code/proj/notes, with its .isorite/
68
+ ✓ agents: .mcp.json and opencode.json in /home/me/code/proj name this base
119
69
  ```
120
70
 
121
- `isorite term` prints `isorite: http://localhost:4767/` and the terminal's models before OpenCode opens.
122
-
123
71
  ## Failures, and what to change
124
72
 
125
73
  | Seen | Cause | Change |
126
74
  |---|---|---|
127
- | `could not be reached: … SELF_SIGNED_CERT_IN_CHAIN` or `UNABLE_TO_VERIFY_LEAF_SIGNATURE` | The gateway's certificate is signed by an authority not trusted, usually the company's. | Install the company's root on the machine (isorite trusts the system's), or name its .pem as `ca`, or in `NODE_EXTRA_CA_CERTS`. Check `ISORITE_NODE_DEFAULTS` isn't 0. |
128
- | `… CERTIFICATE_REQUIRED`, `… other side closed (UND_ERR_SOCKET)` on https, `HANDSHAKE_FAILURE`, `BAD_CERTIFICATE` | The gateway wants a client certificate (mTLS), and got none it accepts. | `pfx` + `pfx_passphrase`, or `cert` + `cert_key`. Ask the person where theirs is: often a .pfx or .p12 file. If it's only in the Windows certificate store or the macOS keychain, it must be exported to a file. |
129
- | `pfx_passphrase does not open …` | Wrong passphrase, or the variable it names holds the wrong one. | Fix the passphrase. |
130
- | `ENOTFOUND` | The host name isn't found. | Check `url`. The name may resolve only on the company's network or VPN. |
131
- | `ECONNREFUSED` | Nothing listens there. | Check the URL's port. |
132
- | `ETIMEDOUT`, `UND_ERR_CONNECT_TIMEOUT` | No answer: often a proxy is needed. | Set `HTTPS_PROXY` (and `NO_PROXY` for internal hosts reached directly). |
133
- | `said 401` / `said 403` | The key, or how it's sent, isn't accepted. `doctor` says how it was sent (`sent as X-Gateway-Auth: <41 characters>`) and quotes the gateway. | Check the key, `key_header`, and any header the gateway wants. A message like "missing Bearer prefix" means `key_prefix = "Bearer "`. |
134
- | `Proxy response (407) … The proxy (HTTPS_PROXY), not the provider, refused with 407` | The company's proxy wants credentials of its own. Not the gateway's 401. | Credentials in `HTTPS_PROXY` (`http://user:password@proxy:port`), or the proxy's own sign-in. A proxy that signs in by Kerberos or NTLM can't be answered by isorite. |
135
- | `said 404 … no model called X, which is OpenRouter's name for it` | No `[tiers]`. | Name the gateway's models under `[tiers]`. `doctor` lists the models `/models` offers. |
136
- | `… is unavailable (503 …), tried 4 times over N s: it is likely …, not your settings` | The gateway, or the model behind it, is down. | Wait, and send it again (↻ under the turn). If it lasts, the gateway's status page or owner. |
137
- | `… used its whole output budget (N tokens) thinking, and wrote nothing` | A reasoning model ran out of room before it wrote. | A lower tier, or `max_tokens` under `[provider]`. |
75
+ | `! agents: .mcp.json … doesn't name this base` | The project's MCP config isn't written. | `isorite doctor <notes>` at a terminal, and yes; or the pane's *the project's config*. Commit the files. |
76
+ | The pane says "no agent is attached" | Nothing is attached to this base. | Choose one in the pane, or run `isorite acp` from a front end, or give the agent isorite's MCP. |
77
+ | The pane's chosen agent says `the agent stopped (1)` and a line of its output | The agent's command failed: not installed, no key, no model. | Run the command in a terminal where `isorite serve` runs, and fix what it says; its key must be in that environment. |
78
+ | `… is not offered for <platform>` | The registry has no way to run that agent here. | Install it yourself, and give its command. |
79
+ | `Authentication required` in the pane | The agent wants to be signed in, and has no API key method, or none set. | Sign it in from its own front end or terminal, or set its key (`CODEX_API_KEY` for Codex). |
80
+ | The agent never uses isorite's tools | It reads the Markdown with its own (OpenCode, omp, Hermes do). | Through `isorite acp` that still counts; in its own terminal, ask it to use isorite's tools, or attach it over ACP. |
81
+ | Claude asks before each of isorite's tools | Claude's own permissions. | Answer *always*, or allow `mcp__isorite` in its settings. |
82
+ | `isorite: starting…` and then nothing | The server it starts is stalled. | Read the log the line names (`isorite-server-<port>.log`). |
83
+ | `port 4767 is serving <other>, not <notes>` | An isorite from before M20 serves another base there. | Stop it, or `--port`. |
84
+ | `isorite term and isorite opencode are retired` | A command from before M25. | Attach OpenCode with `opencode acp`, from the pane or a front end. |
138
85
  | `! search by meaning: no model …` | Not installed (optional). `doctor` says whether the release (or the mirror) answers from here. | `isorite model`. Its failures name each source; offline, `isorite model --from <the .tgz>` with the file it names. |
139
- | `The model could not be fetched:` and a line for each source | None reachable from here. | Fetch the file it prints another way, check its SHA-256, and `isorite model --from <the .tgz>`. Or set `ISORITE_MODEL_BASE_URL` to a mirror's folder, or `isorite model --url <address>`. Or copy the model's folder from a machine that has it, then `isorite model --from <folder>`. |
140
- | `said 400: … stream_options` | The gateway refuses `stream_options`. | `stream_usage = false`. |
141
- | `✗ tools: … answered without calling the tool` | The model or gateway drops tools. | Choose a model that supports tool calls. Iso and the terminal need them. |
142
- | `isorite: starting…` and then nothing, or `waiting for OpenCode's server` | Something it starts is stalled. isorite runs no `git` to start (0.8.1); OpenCode may, and a company's `git` wrapper that waits on the network stalls it. | Read the log the line names. Check `git --version` answers at once in that folder; if not, the wrapper is the cause. |
143
- | The browser asks for a user and password (realm "Secure Area") | That's OpenCode's own web page, on the port `isorite term` names, not isorite's: a pairing link (`/pair`) used twice, or its address opened directly. | Open isorite's page (the link `isorite term` prints, or `/web` in the terminal). |
144
- | `isorite term needs OpenCode 2` | OpenCode 1, or none. | `isorite opencode` installs OpenCode 2 in `~/.config/isorite/opencode-cli`, leaving the global prefix alone; or `ISORITE_OPENCODE=…` names one. `isorite term` offers to install it when run in a terminal. |
145
- | `port 4767 is serving <other>, not <notes>` | Another base is served there. | Stop it, or `--port`. |
86
+ | `The model could not be fetched:` and a line for each source | None reachable from here. | Fetch the file it prints another way, check its SHA-256, and `isorite model --from <the .tgz>`. Or set `ISORITE_MODEL_BASE_URL` to a mirror's folder, or `isorite model --url <address>`. |
87
+ | `… SELF_SIGNED_CERT_IN_CHAIN` fetching the model or the registry | A company's authority not trusted. | Install it on the machine (isorite trusts the system's), or `NODE_EXTRA_CA_CERTS`. |
88
+ | `Proxy response (407)` | The company's proxy wants credentials of its own. | Credentials in `HTTPS_PROXY` (`http://user:password@proxy:port`). A proxy that signs in by Kerberos or NTLM can't be answered by isorite. |
146
89
  | The link doesn't open, over SSH | `localhost` is the remote machine. | `ssh -L 4767:localhost:4767 <host>` from the person's own machine. |
147
- | The terminal works but uses an unexpected model | Check the line `isorite term` prints: `config.toml`, `ISORITE_GATEWAY_URL`, or OpenCode's own (no key or certificate). | Fix what it names. |
90
+
91
+ The agent's own model, gateway or provider failing is the agent's to fix, in its own settings: isorite passes what it said into the pane.
148
92
 
149
93
  ## Another model for search by meaning
150
94
 
151
95
  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.
152
-
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,6 +1,8 @@
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, run `isorite doctor`: it checks each step and says what to change.
3
+ From nothing to your notes in the browser, with the agent you already use attached to them. If anything fails on the way, run `isorite doctor`: it checks each step and says what to change.
4
+
5
+ isorite calls no model itself (since M25). It is the notes, the Atlas and the record of how your understanding changed, attached to your agent: Claude, Codex, OpenCode, omp, Hermes, or any that speaks ACP. The agent's key and model are its own, set up as for its own terminal.
4
6
 
5
7
  ## 1. Install
6
8
 
@@ -16,87 +18,22 @@ Either one file, with Node inside it:
16
18
  ```powershell
17
19
  irm https://github.com/lachlanjs/isorite/releases/latest/download/install.ps1 | iex
18
20
  ```
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.
21
+ 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\`.
20
22
 
21
23
  Or from npm:
22
24
 
23
25
  - **Node 24** or later (`node --version`).
24
26
  - **isorite**: `npm i -g isorite`.
25
27
 
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.
27
-
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.
29
-
30
- ## 2. A model provider
31
-
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.
33
-
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.
35
-
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.
37
-
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.
39
- - Keeping a new address forgets the key held for the old one, unless a key is given with it.
40
- - Secrets (the key, the `.pfx`'s password, a header whose name looks secret) are written and never shown again.
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`.
42
- - A running `isorite term` keeps the models it started with, but asks through the new address at once.
43
-
44
- The same setup can be written by hand in `config.toml`, under `[provider]`, with the models under `[tiers]`:
45
-
46
- ```toml
47
- [provider]
48
- name = "work" # what isorite calls it
49
- url = "https://llm.example.com/v1" # /chat/completions is added to it
50
- key = "…" # or set it in Iso's settings in the browser
51
-
52
- [tiers] # the provider's own names for its models
53
- low = "small-model" # quick replies
54
- mid = "medium-model" # Iso's default, and the terminal's
55
- max = "large-model" # the most able
56
- ```
57
-
58
- Without `[tiers]`, OpenRouter's names are used, and another provider usually answers 404 to them.
59
-
60
- ### A company's gateway
61
-
62
- Gateways inside companies often want more than a key. Each of these is optional:
63
-
64
- ```toml
65
- [provider]
66
- url = "https://llm-gateway.corp.example/v1"
67
- key = "…"
68
- key_header = "api-key" # the header the key goes in, as it is, instead of Authorization: Bearer
69
- # key_prefix = "Bearer " # what goes before the key: for Bearer in another header, as
70
- # # key_header = "X-Gateway-Auth"; Authorization has Bearer unless key_prefix = ""
71
- stream_usage = false # for a gateway that refuses stream_options; the gauge then counts nothing
72
- max_tokens = 16000 # the least room a reply is given, for models that think at length
73
-
74
- # A client certificate (mTLS), for a gateway that asks for one: a .pfx (or .p12) ...
75
- pfx = "~/certs/me.pfx"
76
- pfx_passphrase = "$MY_PFX_PASSPHRASE" # "$NAME" is read from the environment, so it isn't written here
77
- # ... or a certificate and its key, as .pem files:
78
- # cert = "~/certs/me.pem"
79
- # cert_key = "~/certs/me.key"
80
-
81
- ca = "~/certs/company-root.pem" # the authority the gateway's own certificate is signed by, if needed
82
-
83
- [provider.headers] # sent with every request
84
- X-Team = "research"
85
- X-Project = "$PROJECT_ID"
86
-
87
- [provider.query] # added to every request's address
88
- api-version = "2024-10-21"
89
- ```
90
-
91
- Paths may start with `~`, or are taken from `config.toml`'s folder. Any value written `"$NAME"` is read from that environment variable.
28
+ `isorite guide` now opens the guide, a knowledge base about isorite with things to do in it.
92
29
 
93
30
  ### Proxies and the company's certificates
94
31
 
95
32
  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.
96
33
 
97
- If the company's authority isn't installed on the machine, name its certificate as `ca` above, or in `NODE_EXTRA_CA_CERTS`.
34
+ If the company's authority isn't installed on the machine, name its certificate in `NODE_EXTRA_CA_CERTS`.
98
35
 
99
- ## 3. Your notes
36
+ ## 2. Your notes
100
37
 
101
38
  A folder of Markdown files. To start from nothing:
102
39
 
@@ -105,22 +42,19 @@ isorite new ~/notes/my-project
105
42
  isorite serve ~/notes/my-project
106
43
  ```
107
44
 
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`.
45
+ `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`. It prints a link to click: `http://localhost:4767/`. isorite keeps what it needs in the folder's `.isorite/`.
109
46
 
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.
47
+ 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 every agent you attach is given. Edit it in Iso's settings, the icon at the right of its pane's header, or in any editor. An agent may offer a line for it when you say how you want things done.
111
48
 
112
- It prints a link to click: `http://localhost:4767/`. isorite keeps what it needs in the folder's `.isorite/`.
49
+ ## 3. Your agent
113
50
 
114
- ## 4. The terminal
51
+ Three ways in; [terminal.md](terminal.md) has each in full.
115
52
 
116
- ```sh
117
- cd ~/code/my-project
118
- isorite term ~/notes/my-project
119
- ```
120
-
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).
53
+ - **In Iso's pane.** With no agent attached, the pane offers one: an agent of the [ACP registry](https://agentclientprotocol.com/get-started/registry) (fetched and run as the registry says: its program checked against its SHA-256, else `npx` or `uvx`), or the command of one it doesn't list (`hermes acp`). isorite starts it for the base, in the base's repository, with the server's environment. Chosen from this machine only, and kept in `bases.toml`.
54
+ - **From an ACP front end** (Toad, Zed, JetBrains): give it `isorite acp --agent "<the agent's command>"` as its agent. The session is live in the front end and in the pane at once.
55
+ - **In the agent's own terminal**: give it isorite's MCP in the project's config. `isorite doctor ~/notes/my-project` shows the lines it would add (`.mcp.json` for Claude Code and others, `opencode.json` for OpenCode) and writes them on a yes; the pane offers the same. Commit them with the project.
122
56
 
123
- ## 5. Several bases, and the agent's memory (optional)
57
+ ## 4. Several bases, and the agent's memory (optional)
124
58
 
125
59
  ```sh
126
60
  isorite memory # ~/isorite-memory: a base of its own, a private git repository, lent to every session
@@ -128,7 +62,7 @@ isorite bases # the bases this machine knows: each one is listed t
128
62
  isorite bases lend <name> # lend one to every session (isorite bases keep <name> stops)
129
63
  ```
130
64
 
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`:
65
+ 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 and written by every base's 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`:
132
66
 
133
67
  ```toml
134
68
  [memory]
@@ -142,16 +76,18 @@ lend = true
142
76
  isorite model
143
77
  ```
144
78
 
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).
79
+ 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, the agent 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).
146
80
 
147
81
  ## When something fails
148
82
 
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.
150
-
151
83
  ```sh
152
84
  isorite doctor ~/notes/my-project
153
85
  ```
154
86
 
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.
87
+ It checks, in turn: the configuration, how Node reaches the network (the proxy, the authorities), the port, a browser to run artifacts in, the model for search by meaning, the notes and their repository, and the project's MCP config. Each line says what failed, and what to change. `--offline` fetches nothing.
88
+
89
+ `isorite doctor --report` gives all of it as one block, with the configuration and the environment it read, any secret shown only by its 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.
90
+
91
+ Your agent's own failures (its key, its model, its gateway) are its own: its front end, or the pane, says what it said. A refusal is shown in the pane; an agent that asks to be signed in with its API key (Codex) is signed in with it when isorite starts it.
156
92
 
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.
93
+ Until M25, `config.toml` also held Iso's provider, under `[provider]` and `[tiers]`. They are left as written, and no longer read.
package/docs/terminal.md CHANGED
@@ -1,96 +1,95 @@
1
- # isorite beside your code: the terminal
1
+ # isorite beside your agent
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 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.
3
+ How to use isorite with the agent you already use (Claude, Codex, OpenCode, omp, Hermes, or any that speaks ACP) on a project of your own. isorite gives the agent your notes over MCP, and reaches the agent over ACP: the agent gets the notes, the Atlas sees the agent, and Iso's pane shows the session. isorite calls no model itself: the agent's key and model are its own, set up as for its own terminal.
4
4
 
5
- Setting isorite up the first time, or at work behind a company's gateway, is in [setup.md](setup.md).
6
-
7
- ## What you need
8
-
9
- - **Node 24** or later.
10
- - **isorite**: `npm i -g isorite`.
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.
5
+ Setting isorite up the first time is in [setup.md](setup.md).
13
6
 
14
7
  ## Your notes for the project
15
8
 
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.
17
-
18
- ## Starting it
9
+ Keep the project's notes in a folder of their own, often inside the project's repository (`notes/`), or beside it (`~/notes/<project>`). It can start empty: `isorite new <folder>` makes it. isorite keeps what it needs in the folder's `.isorite/` (the journals of every change, the sessions it carried, and its settings), made the first time the folder is opened. Commit `.isorite/` with the notes, if they're in git.
19
10
 
20
11
  ```sh
21
- cd ~/code/my-project
22
- isorite term ~/notes/my-project
12
+ isorite serve ~/code/my-project/notes
23
13
  ```
24
14
 
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.
15
+ ## Three ways in
26
16
 
27
- Before OpenCode takes the screen, `isorite term` prints:
28
-
29
- ```
30
- isorite: http://localhost:4767/
31
- the terminal's models: work-large, work-small, as config.toml names them, through the isorite server
32
- ```
17
+ ### In Iso's pane
33
18
 
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.
19
+ With no agent attached, Iso's pane says how to attach one. *Here, in this pane*: choose an agent of the [ACP registry](https://agentclientprotocol.com/get-started/registry), or give the command of one it doesn't list (`hermes acp`). isorite starts it for the base, behind `isorite acp --pane`, in the repository the base is in, with the server's environment, and starts it again when the base is next opened. It runs a program, so it is chosen from this machine only; the choice is kept in `~/.config/isorite/bases.toml` (`agent`, or `agent_command`). The drawer's *stop it* stops it.
35
20
 
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.
21
+ A registry agent is run as the registry says: its program for this platform, fetched once into `~/.local/share/isorite/agents/<id>/<version>/` and checked against its SHA-256; else with `npx -y` or `uvx`. `ISORITE_ACP_REGISTRY` names another registry, an address or a file.
37
22
 
38
- ### Over SSH
23
+ ### From an ACP front end
39
24
 
40
- `localhost` is the machine `isorite term` runs on. To open isorite from your own machine, forward the port:
25
+ Toad in the terminal, Zed, or JetBrains: give it isorite as its agent, with the real agent's command:
41
26
 
42
27
  ```sh
43
- ssh -L 4767:localhost:4767 <the machine>
28
+ isorite acp --agent "npx -y @agentclientprotocol/claude-agent-acp" ~/code/my-project/notes
44
29
  ```
45
30
 
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/`).
31
+ Run in a folder with a base in it or under it, the notes can be left out. This starts the isorite server for the notes, unless one is running on port 4767 (`--port <n>` for another), and the agent behind it. Every message passes through: the session is live in the front end and in the pane at once, asked from either. isorite's MCP is added to each session the agent opens, so the agent needs no config of its own for it.
47
32
 
48
- ## In the browser
33
+ ### In the agent's own terminal
49
34
 
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.
35
+ Give the agent isorite's MCP in the project's config, and run it as you always do:
51
36
 
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:
37
+ ```sh
38
+ isorite doctor ~/code/my-project/notes
39
+ ```
53
40
 
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.
41
+ shows the lines it would add to the project's `.mcp.json` (Claude Code's, read by several others) and `opencode.json` (OpenCode's), and writes them on a yes; Iso's pane offers the same. They name `isorite mcp <the base's folder>`, a bridge over stdio to the server, so they hold on every machine whatever the port. Commit them with the project. Only what the agent does through isorite's tools is seen this way: a file it reads with its own tools isn't.
58
42
 
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.
43
+ ## What the agent gets
60
44
 
61
- ## The agent's memory, and other bases
45
+ isorite's MCP, at each base's address on the server (`http://localhost:4767/b/<name>/mcp`, on this machine only), or through `isorite mcp`:
62
46
 
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.
47
+ - `brief_base`, the first look: the base's folders, how it is kept, how to cite a note, how to make an artifact, and the base's `AGENTS.md`.
48
+ - `search_notes`, `find_similar` (by meaning, where the model is installed), `outline_note`, `read_note`: each look is a step on the Atlas.
49
+ - `edit_note`, `write_note`: written at once, under the agent's name, with what was asked, its words marked as its own.
50
+ - `ask_question`, `offer_text`: a question back, standing dotted on the Atlas until you keep it as a question note; words offered for a note, inserted as yours, or not.
51
+ - `read_data`, `artifact_recipe`, `write_artifact`, `read_artifact`: artifacts on isorite's kit, checked and run (in a browser found on this machine) before they are written.
52
+ - Notes as resources (`isorite://<base>/<note>`), for agents that offer `@` mentions of them.
64
53
 
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.
54
+ Through `isorite acp`, isorite sees more: a Markdown file of the base the agent reads with its own tools is a step on the Atlas, as the note read, and one it changes is journalled under its name, with what was asked. The notes it read or cited stand under its reply; its links to notes are put in isorite's form however it wrote them.
66
55
 
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.
56
+ ## In the browser
68
57
 
69
- ## The models
58
+ Iso's pane is the agent's session: each prompt (asked in its front end, or from here), what the agent says, 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), and what it asks before doing. Answered in either place, a question is gone from both.
70
59
 
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.
60
+ - **The tray:** hold a note on the Atlas, or select a passage and send it to Iso, and it goes before the next prompt, from either place, once a session.
61
+ - **The switches:** *agents may edit the notes* (Alt+N), on unless you switch it off, is kept in the base's `.isorite/settings.toml` and enforced by the server: `edit_note`, `write_note` and `write_artifact` are refused, and through `isorite acp` so is an agent's request to edit a note's file, with no page open too. An agent whose own tools change a file without asking can't be stopped; the change is journalled under its name, to put back. *The agent may edit the project's files* (Alt+F) and *may run commands* (Alt+R) are this browser's: what it asks to do that is switched off is refused while the page is open.
62
+ - **The drawer:** the agents' sessions, live, the agents' own (their `session/list`), and those isorite carried, kept in `.isorite/conversations/agents/`. One the agent can carry on is carried on in the pane; one whose agent isn't attached is read. Iso's own conversations, from before M25, are listed under them, to read.
63
+ - **The Context view** (the gauge, or ≡): what the agent has in hand, as far as isorite sees: isorite's part, the notes given and read, the rest, and the room left, from what the agent says it fills.
64
+ - **Notes the agent changes** are written at once. Turn on provenance in the Note pane's header to see its words marked, and the timeline to put a note back.
72
65
 
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.
66
+ ## How each agent differs
74
67
 
75
- OpenCode doesn't know a gateway's prices, so Iso's pane shows the session's tokens rather than its cost.
68
+ Checked with Claude Agent 0.99.1, Codex 2.5.0 and Hermes 0.15.2 (M25 step 5), and OpenCode 2.2 and omp 18.14 (the spike).
76
69
 
77
- ## OpenCode's settings
70
+ - **Claude** (`@agentclientprotocol/claude-agent-acp`): looks through isorite's tools, and cites in isorite's form. It asks before each of isorite's tools until you answer *always*, or allow `mcp__isorite` in its settings.
71
+ - **Codex** (`@agentclientprotocol/codex-acp`): asks to be signed in first; started from the pane, isorite signs it in with its API key (`CODEX_API_KEY` or `OPENAI_API_KEY`). A provider of your own goes in `~/.codex/config.toml`.
72
+ - **OpenCode** (`opencode acp`) and **omp** (`omp acp`): mostly read the Markdown with their own tools, which isorite counts as reading the notes.
73
+ - **Hermes** (`hermes acp`, not in the registry): reads with its own tools too, and is not told how to cite, so it seldom links a note.
78
74
 
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.
75
+ ## The agent's memory, and other bases
80
76
 
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):
77
+ `isorite memory` makes a base for the agent's memory, lent to every session (see [setup.md](setup.md)). Every tool takes an optional `base`: one of the bases lent, named by `brief_base`; a note in another base can also be named `memory:tools/opencode`. The memory's `AGENTS.md` says what to keep, and how.
82
78
 
83
- ```json
84
- { "permissions": [{ "action": "shell", "resource": "*", "effect": "ask" }] }
85
- ```
79
+ A second `isorite acp` or `isorite mcp`, for another project, on the same port, adds its base to the server that is running rather than starting another; a server one of them started stops when the last using it is done.
80
+
81
+ 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).
86
82
 
87
- ## Without the internet
83
+ ## Over SSH
88
84
 
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:
85
+ `localhost` is the machine isorite runs on. To open it from your own, forward the port:
86
+
87
+ ```sh
88
+ ssh -L 4767:localhost:4767 <the machine>
89
+ ```
90
90
 
91
- - isorite and OpenCode, from npm: through your company's npm mirror, if it has one.
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).
91
+ Over SSH, `isorite serve` prints this command too.
93
92
 
94
93
  ## Who can reach it
95
94
 
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.
95
+ The isorite server listens on this machine only (127.0.0.1), unless you put it on your tailnet (`tailscale serve`). Then anyone on your tailnet who opens the page can ask the attached agent to act in your project, as they could already edit your notes. MCP, `isorite acp`'s link, and choosing the pane's agent are answered on this machine only.
@@ -0,0 +1,4 @@
1
+ These notes are about isorite itself: the app they are read in.
2
+
3
+ - Answer from them, and link the notes you used. Where they do not say, say so, and answer only what you are sure of.
4
+ - The reader is learning isorite. Point them to the problem that practises what they ask about, rather than doing it for them.