Files
zzet--gortex/internal/daemon
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
..

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:

[[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.