Files
wehub-resource-sync a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:33:42 +08:00

75 lines
2.8 KiB
Markdown

# `internal/daemon`
Process-local daemon plumbing — Unix socket transport, MCP dispatch
session state, snapshot paths, plus the iteration-1 multi-server
roster and editor-overlay machinery.
## Surface
| File | Role |
|------|------|
| `paths.go` | Default file paths (socket, PID, snapshot, log) |
| `proto.go` | Wire types for the daemon's internal MCP protocol |
| `client.go` | Connect-and-talk client used by the proxy CLI |
| `servers.go` | `~/.gortex/servers.toml` loader + `ServerClient` (HTTP/unix) + `WorkspaceRosterCache` + `RouteForCwd` |
| `overlay.go` | `OverlayManager` — register / push / delete editor buffer overrides |
| `router.go` | `Router` — hybrid-read query router |
## Multi-server routing
`~/.gortex/servers.toml` declares the set of Gortex servers reachable
from this daemon. The schema:
```toml
[[server]]
slug = "main"
url = "unix:///run/gortex/main.sock"
default = true
[[server]]
slug = "tuck"
url = "https://tuck.gortex.example/v1"
auth_token_env = "GORTEX_TOKEN_TUCK"
workspaces = ["tuck"]
```
`url` accepts `http(s)://...` (TCP) or `unix:///path/to.sock`
(Unix-domain socket). Auth tokens come from `auth_token` (literal,
discouraged) or `auth_token_env` (env-var name resolved per-call so
rotation lands without a daemon restart).
`Router.RouteToolCall` walks the priority chain on every MCP tool
invocation:
1. Caller-supplied scope override (e.g. `workspace: "tuck"` on the
tool args).
2. Walking up from cwd to find a `.gortex.yaml::workspace` declaration.
3. Workspace roster — pre-declared `workspaces = [...]` lists in
`servers.toml`, then the cached `GET /v1/workspaces/<ws>/repos`
roster from each configured server.
4. The `default = true` entry, if any.
Resolved server == `LocalSlug` → run in-process via `LocalExecute`.
Resolved server != `LocalSlug` → proxy via `ServerClient.ProxyTool`
(POST `/v1/tools/<name>` with bearer auth).
## Editor overlays
`OverlayManager` holds per-session in-flight file overrides so MCP
clients can ask "what would `find_usages` look like with my unsaved
buffer?" The HTTP front door at `/v1/overlay/sessions/...` is wired
in `internal/server`. `BaseSHA` drift detection refuses to merge a
stale overlay so wrong-line-number errors don't surface as graph bugs.
## Caveat: pre-workspace-slug snapshots
Old snapshots written by daemons that predate the workspace-slug
schema carry no `WorkspaceID`/`ProjectID` fields on nodes (gob
decodes additive fields as zero). The daemon's warmup path
(`MultiIndexer.BackfillWorkspaceSlugs` invoked from
`cmd/gortex/daemon_state.go::warmupDaemonState`) re-stamps them from
the per-repo `.gortex.yaml`. Without that pass, the matcher's
`EffectiveWorkspace` falls back to `RepoPrefix` and explicit
shared-workspace setups silently lose identity until every file is
touched.