isorite 0.12.1 → 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.
- package/README.md +6 -5
- package/dist/main.js +5688 -8903
- package/docs/setup-for-agents.md +44 -102
- package/docs/setup.md +23 -87
- package/docs/terminal.md +54 -55
- package/guide/AGENTS.md +4 -0
- package/guide/atlas/find-what-it-rests-on.md +9 -0
- package/guide/atlas/the-atlas.md +21 -0
- package/guide/atlas/the-switches/satellites.svg +17 -0
- package/guide/atlas/the-switches.md +27 -0
- package/guide/iso/agents-md.md +13 -0
- package/guide/iso/artifacts/the-guide.csv +8 -0
- package/guide/iso/artifacts/the-guide.html +35 -0
- package/guide/iso/artifacts.md +15 -0
- package/guide/iso/ask-iso.md +7 -0
- package/guide/iso/give-it-notes.md +9 -0
- package/guide/iso/in-hand.md +18 -0
- package/guide/iso/iso-writes-marked.md +15 -0
- package/guide/iso/iso.md +17 -0
- package/guide/iso/let-it-write.md +11 -0
- package/guide/iso/write-agents-md.md +11 -0
- package/guide/notes/a-note-is-markdown.md +17 -0
- package/guide/notes/a-notes-details.md +23 -0
- package/guide/notes/diagrams-and-code.md +43 -0
- package/guide/notes/every-change-is-kept.md +14 -0
- package/guide/notes/folders.md +11 -0
- package/guide/notes/go-back-a-version.md +9 -0
- package/guide/notes/link-your-notes.md +9 -0
- package/guide/notes/links-and-their-kinds.md +23 -0
- package/guide/notes/make-move-delete.md +9 -0
- package/guide/notes/write-in-your-notes.md +9 -0
- package/guide/out-of-the-base/web-and-code-links.md +13 -0
- package/guide/questions-and-problems/ask-a-question.md +9 -0
- package/guide/questions-and-problems/how-iso-reads-you.md +9 -0
- package/guide/questions-and-problems/problems.md +15 -0
- package/guide/questions-and-problems/questions.md +27 -0
- package/guide/questions-and-problems/resolve-a-question.md +9 -0
- package/guide/questions-and-problems/why-markdown-links.md +7 -0
- package/guide/solve-this-one.md +11 -0
- package/guide/start-here.md +39 -0
- package/guide/terminal/let-the-agent-remember.md +9 -0
- package/guide/terminal/memory.md +13 -0
- package/guide/terminal/your-own-agent.md +24 -0
- package/guide/your-notes.md +6 -0
- package/guide/your-own-base/keeping-a-base-well.md +16 -0
- package/guide/your-own-base/starting-a-base.md +21 -0
- package/package.json +4 -7
- package/web/_app/immutable/assets/0.BEjn1Bfl.css +1 -0
- package/web/_app/immutable/assets/4.fOHsAKBF.css +1 -0
- package/web/_app/immutable/assets/drawn.D6lJzDcc.css +1 -0
- package/web/_app/immutable/chunks/{BBHd0LvJ.js → 3fCuxe18.js} +1 -1
- package/web/_app/immutable/chunks/{D5XlJBy8.js → B-DzK7Gb.js} +1 -1
- package/web/_app/immutable/chunks/{BuUzVkG2.js → B35sQTcK.js} +1 -1
- package/web/_app/immutable/chunks/{CmExTt6_.js → B6uHgLdT.js} +1 -1
- package/web/_app/immutable/chunks/{Dh1lBxfx.js → BA78_vo5.js} +1 -1
- package/web/_app/immutable/chunks/{tUSDgbpy.js → BCGaqnao.js} +1 -1
- package/web/_app/immutable/chunks/BCyLp7pS.js +1 -0
- package/web/_app/immutable/chunks/{EMo1IeTW.js → BK31dpt6.js} +1 -1
- package/web/_app/immutable/chunks/BOxykeIc.js +1 -0
- package/web/_app/immutable/chunks/{DlXrOzlh.js → BT_btfh0.js} +1 -1
- package/web/_app/immutable/chunks/{Xm0YTnxV.js → BWE_HS0c.js} +1 -1
- package/web/_app/immutable/chunks/{BLmF1B2i.js → BXBhaEho.js} +1 -1
- package/web/_app/immutable/chunks/{BAclEN0O.js → Bb_N98K9.js} +1 -1
- package/web/_app/immutable/chunks/{gPtCGHiy.js → Bd-WxALw.js} +1 -1
- package/web/_app/immutable/chunks/{BA8Hpxhg.js → BhEqJU15.js} +1 -1
- package/web/_app/immutable/chunks/{DkxkvOjx.js → BiATTH-R.js} +1 -1
- package/web/_app/immutable/chunks/{D5vocsTl.js → Bj-5n5Pb.js} +1 -1
- package/web/_app/immutable/chunks/{DRX-TQzj.js → BqipEJXw.js} +1 -1
- package/web/_app/immutable/chunks/{94XMxKlw.js → Bt-fHApV.js} +1 -1
- package/web/_app/immutable/chunks/{DXTK-eyo.js → BvPxdlBc.js} +1 -1
- package/web/_app/immutable/chunks/{DfCZPwp1.js → C2npZzkn.js} +1 -1
- package/web/_app/immutable/chunks/{DF89zyH-.js → C5Z-Y7Lu.js} +1 -1
- package/web/_app/immutable/chunks/{CD6xPodA.js → C8h1oeAZ.js} +1 -1
- package/web/_app/immutable/chunks/{rq7JUohF.js → C8nK3Jvr.js} +1 -1
- package/web/_app/immutable/chunks/{CFEI5lV9.js → CAlIuau0.js} +1 -1
- package/web/_app/immutable/chunks/{9z49435t.js → CFf_dAzX.js} +1 -1
- package/web/_app/immutable/chunks/{D3-rqfsM.js → CMIt1Ma8.js} +1 -1
- package/web/_app/immutable/chunks/{-2Meesge.js → CMikI1NP.js} +3 -3
- package/web/_app/immutable/chunks/{Czz9qOh8.js → CT4_O9X_.js} +1 -1
- package/web/_app/immutable/chunks/{DX4bJJO0.js → CTDYUZPz.js} +1 -1
- package/web/_app/immutable/chunks/{By4S_gy5.js → CdY1G_wk.js} +1 -1
- package/web/_app/immutable/chunks/Cd_SqIWq.js +523 -0
- package/web/_app/immutable/chunks/{DBC2xjOo.js → CdmC_l9F.js} +1 -1
- package/web/_app/immutable/chunks/{DbNETcPs.js → Cf-5I5_6.js} +1 -1
- package/web/_app/immutable/chunks/Cl5gQm2e.js +1 -0
- package/web/_app/immutable/chunks/{BWVMfAMh.js → CryuQgNh.js} +1 -1
- package/web/_app/immutable/chunks/{CT_Ry4q8.js → Ct_EK1xu.js} +1 -1
- package/web/_app/immutable/chunks/{BymwHy7o.js → CtkUy_15.js} +1 -1
- package/web/_app/immutable/chunks/{Dpa4Syyy.js → CzYPMYd4.js} +1 -1
- package/web/_app/immutable/chunks/{RlApGeew.js → D1LK3xRu.js} +1 -1
- package/web/_app/immutable/chunks/{DXK7PB4g.js → D6sVhEz3.js} +1 -1
- package/web/_app/immutable/chunks/{DT2w6KyY.js → D9JwUycj.js} +1 -1
- package/web/_app/immutable/chunks/{rghE0CVz.js → DCZYeMlH.js} +1 -1
- package/web/_app/immutable/chunks/{RFxekmX-.js → DDAG55ce.js} +1 -1
- package/web/_app/immutable/chunks/{CyFLqlvP.js → DFuPQaNa.js} +1 -1
- package/web/_app/immutable/chunks/{BXAOBcPb.js → DHJ8FcFD.js} +1 -1
- package/web/_app/immutable/chunks/{Bt7VOT5H.js → DKqMzyyE.js} +1 -1
- package/web/_app/immutable/chunks/{Bq2GBAJ0.js → DRcTlHZP.js} +1 -1
- package/web/_app/immutable/chunks/{C_amgxV1.js → DjUnonHY.js} +1 -1
- package/web/_app/immutable/chunks/{whhiiiga.js → Djr0h_v1.js} +1 -1
- package/web/_app/immutable/chunks/{vfDvz3qP.js → DrVtdHUW.js} +1 -1
- package/web/_app/immutable/chunks/{CxAq1aod.js → O98JkczU.js} +74 -74
- package/web/_app/immutable/chunks/{oWM_kgYq.js → PsfIQCJ1.js} +1 -1
- package/web/_app/immutable/chunks/{Cl5zRP_n.js → TanDZqdf.js} +1 -1
- package/web/_app/immutable/chunks/{D95RKsvN.js → UDPiRmKc.js} +1 -1
- package/web/_app/immutable/chunks/WLe0MT1c.js +1 -0
- package/web/_app/immutable/chunks/{BTclWEfx.js → ZwM5k8r0.js} +1 -1
- package/web/_app/immutable/chunks/e2LGvGEb.js +3 -0
- package/web/_app/immutable/chunks/ej_0XxR7.js +1 -0
- package/web/_app/immutable/chunks/{CjtKPNlv.js → kG4HctVa.js} +1 -1
- package/web/_app/immutable/chunks/{CQd9D8Nc.js → l1LsK1sB.js} +1 -1
- package/web/_app/immutable/chunks/{DSYLdqdc.js → s_hW4oA1.js} +1 -1
- package/web/_app/immutable/entry/app.DM_AWBgH.js +2 -0
- package/web/_app/immutable/entry/start.BLhIKDcR.js +1 -0
- package/web/_app/immutable/nodes/0.xSbkmYPn.js +2 -0
- package/web/_app/immutable/nodes/1.BD2wJdoH.js +1 -0
- package/web/_app/immutable/nodes/2.shPqwtS_.js +1 -0
- package/web/_app/immutable/nodes/3.e_5kWaf_.js +1 -0
- package/web/_app/immutable/nodes/4.BEMEU6Jz.js +15 -0
- package/web/_app/immutable/nodes/5.DxaO-e4O.js +1 -0
- package/web/_app/immutable/nodes/6.C9ia8cDm.js +1 -0
- package/web/_app/version.json +1 -1
- package/web/index.html +16 -19
- package/dist/core.js +0 -2464
- package/plugin/assets/mark-lapis.png +0 -0
- package/plugin/assets/mark-quartz.png +0 -0
- package/plugin/assets/wordmark-lapis.png +0 -0
- package/plugin/assets/wordmark-quartz.png +0 -0
- package/plugin/isorite.ts +0 -65
- package/plugin/logo.ts +0 -99
- package/plugin/notepage.tsx +0 -165
- package/plugin/notes.ts +0 -10
- package/plugin/noteview.ts +0 -60
- package/plugin/oneatlas.ts +0 -83
- package/plugin/palette.ts +0 -21
- package/plugin/play.ts +0 -104
- package/plugin/server.ts +0 -76
- package/plugin/sources.ts +0 -18
- package/plugin/tui.tsx +0 -556
- package/plugin/wordmark.ts +0 -180
- package/web/_app/immutable/assets/0.DqoJ_jEe.css +0 -1
- package/web/_app/immutable/assets/4.CUdclsPi.css +0 -1
- package/web/_app/immutable/assets/5.rBvyRuST.css +0 -1
- package/web/_app/immutable/assets/Drawing.Q7J9MyIo.css +0 -1
- package/web/_app/immutable/assets/NoteEditor.S3q5lmKq.css +0 -1
- package/web/_app/immutable/assets/Timeline.LsRXYIBv.css +0 -1
- package/web/_app/immutable/chunks/9TpKhtgt.js +0 -1
- package/web/_app/immutable/chunks/BMcDEv5V.js +0 -1
- package/web/_app/immutable/chunks/BqrMZ9MX.js +0 -1
- package/web/_app/immutable/chunks/ChbZenhA.js +0 -7
- package/web/_app/immutable/chunks/CnR51TY0.js +0 -1
- package/web/_app/immutable/chunks/DMzXaGgk.js +0 -523
- package/web/_app/immutable/chunks/DshHzxgH.js +0 -1
- package/web/_app/immutable/chunks/Iqr2CudW.js +0 -3
- package/web/_app/immutable/chunks/wQPxmN7w.js +0 -1
- package/web/_app/immutable/entry/app.Z7pwf_yI.js +0 -2
- package/web/_app/immutable/entry/start.B_WWh0TE.js +0 -1
- package/web/_app/immutable/nodes/0.zgVqViQf.js +0 -26
- package/web/_app/immutable/nodes/1.D06ogNcd.js +0 -1
- package/web/_app/immutable/nodes/2.Xq8_UpCY.js +0 -1
- package/web/_app/immutable/nodes/3.CgpZ3cDm.js +0 -1
- package/web/_app/immutable/nodes/4.DQfZbhoQ.js +0 -2
- package/web/_app/immutable/nodes/5.BqLxxB44.js +0 -9
- package/web/_app/immutable/nodes/6.Dg2_pK7R.js +0 -1
- package/web/_app/immutable/nodes/7.BpxHVHoY.js +0 -1
- /package/web/_app/immutable/assets/{7.C00vyVPo.css → 6.C00vyVPo.css} +0 -0
package/docs/setup-for-agents.md
CHANGED
|
@@ -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),
|
|
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`:
|
|
13
|
-
| `isorite serve <notes> [--port <n>]` | The browser app at `http://localhost:4767/`, on 127.0.0.1 only. |
|
|
14
|
-
| `isorite
|
|
15
|
-
| `isorite
|
|
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.
|
|
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/`) |
|
|
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.
|
|
28
|
-
|
|
|
29
|
-
|
|
|
30
|
-
| `<
|
|
31
|
-
|
|
|
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-
|
|
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`.
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
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: `
|
|
52
|
+
| `SSH_CONNECTION` | Set over SSH: `serve` and `doctor` print the `ssh -L` command for the browser. |
|
|
94
53
|
|
|
95
|
-
|
|
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
|
|
58
|
+
`isorite doctor <notes>` ends `nothing failed`, with lines like:
|
|
106
59
|
|
|
107
60
|
```
|
|
108
|
-
✓ config: /home/me/.config/isorite/config.toml
|
|
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
|
-
✓
|
|
115
|
-
✓
|
|
116
|
-
✓
|
|
117
|
-
✓
|
|
118
|
-
✓
|
|
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
|
-
|
|
|
128
|
-
|
|
|
129
|
-
| `
|
|
130
|
-
|
|
|
131
|
-
| `
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
| `
|
|
135
|
-
| `
|
|
136
|
-
|
|
|
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>`.
|
|
140
|
-
| `
|
|
141
|
-
|
|
|
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
|
-
|
|
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
|
|
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\`.
|
|
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
|
-
|
|
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
|
|
34
|
+
If the company's authority isn't installed on the machine, name its certificate in `NODE_EXTRA_CA_CERTS`.
|
|
98
35
|
|
|
99
|
-
##
|
|
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
|
|
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
|
-
|
|
49
|
+
## 3. Your agent
|
|
113
50
|
|
|
114
|
-
|
|
51
|
+
Three ways in; [terminal.md](terminal.md) has each in full.
|
|
115
52
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
isorite
|
|
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
|
-
##
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
1
|
+
# isorite beside your agent
|
|
2
2
|
|
|
3
|
-
How to use isorite on a project of your own.
|
|
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
|
|
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,
|
|
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
|
-
|
|
22
|
-
isorite term ~/notes/my-project
|
|
12
|
+
isorite serve ~/code/my-project/notes
|
|
23
13
|
```
|
|
24
14
|
|
|
25
|
-
|
|
15
|
+
## Three ways in
|
|
26
16
|
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
23
|
+
### From an ACP front end
|
|
39
24
|
|
|
40
|
-
|
|
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
|
-
|
|
28
|
+
isorite acp --agent "npx -y @agentclientprotocol/claude-agent-acp" ~/code/my-project/notes
|
|
44
29
|
```
|
|
45
30
|
|
|
46
|
-
|
|
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
|
-
|
|
33
|
+
### In the agent's own terminal
|
|
49
34
|
|
|
50
|
-
|
|
35
|
+
Give the agent isorite's MCP in the project's config, and run it as you always do:
|
|
51
36
|
|
|
52
|
-
|
|
37
|
+
```sh
|
|
38
|
+
isorite doctor ~/code/my-project/notes
|
|
39
|
+
```
|
|
53
40
|
|
|
54
|
-
|
|
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
|
-
|
|
43
|
+
## What the agent gets
|
|
60
44
|
|
|
61
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
56
|
+
## In the browser
|
|
68
57
|
|
|
69
|
-
|
|
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
|
|
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
|
-
|
|
66
|
+
## How each agent differs
|
|
74
67
|
|
|
75
|
-
|
|
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
|
-
|
|
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
|
-
|
|
75
|
+
## The agent's memory, and other bases
|
|
80
76
|
|
|
81
|
-
isorite
|
|
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
|
-
|
|
84
|
-
|
|
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
|
-
##
|
|
83
|
+
## Over SSH
|
|
88
84
|
|
|
89
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
package/guide/AGENTS.md
ADDED
|
@@ -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.
|