Commit graph

47 commits

Author SHA1 Message Date
Snider
45fbe0bc73 chore: sync dependencies for v0.3.3
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-17 17:49:05 +00:00
Snider
fe66067b54 feat: add Streamable HTTP transport with Bearer token auth
New transport_http.go adds ServeHTTP() using the go-sdk's built-in
StreamableHTTPHandler. Supports:
- SSE streaming (GET /mcp) for server-to-client notifications
- JSON-RPC (POST /mcp) for tool calls
- Session management with 30min idle timeout
- Bearer token auth via MCP_AUTH_TOKEN env var
- Health check at /health (no auth)

Transport selection via env vars:
- MCP_HTTP_ADDR → Streamable HTTP
- MCP_ADDR → TCP
- (default) → Stdio

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-17 04:25:28 +00:00
Snider
a4f86b5de6 chore: sync dependencies for v0.3.2
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 22:19:03 +00:00
Snider
424b5eb91d refactor: replace fmt.Errorf/os.* with go-io/go-log conventions
Replace all fmt.Errorf and errors.New in production code with
coreerr.E("caller.Method", "message", err) from go-log. Replace all
os.ReadFile/os.WriteFile/os.MkdirAll/os.Remove with coreio.Local
equivalents from go-io. Test files are untouched.

24 files across pkg/mcp/agentic/, pkg/mcp/brain/, pkg/mcp/ide/,
pkg/mcp/, and cmd/brain-seed/.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 21:57:12 +00:00
Snider
d6dccec914 refactor: move MLSubsystem to go-ml/pkg/mcp
ML tools (generate, score, probe, status, backends) belong in go-ml,
not the MCP framework. Removes go-ml/go-mlx/go-duckdb dependency chain
from core/mcp, unblocking CGO_ENABLED=0 cross-compilation.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 15:37:27 +00:00
Snider
5191bd0cda fix(mcp): use AgentApiKey for auth, graceful fallback when ApiKey model missing
The old Core\Mod\Api\Models\ApiKey was removed when core/php-api was renamed.
Now tries AgentApiKeyService first, falls back to workspace apiKeys,
catches Throwable if either model is unavailable.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 10:00:29 +00:00
Snider
0eecf095bd feat(agentic): add local agent type via Ollama
Dispatches to local-agent.sh which reads workspace context files
and calls Ollama API with Qwen3-Coder-Next. No quota, no rate limits.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 07:35:33 +00:00
Snider
a9b7326c19 feat(agentic): auto-ingest scan findings as issues
When an agent completes, if the output contains file:line references
(indicating real findings), automatically creates an issue via the
lthn.sh API. Scans → issues → sprints → PRs → release. The loop closes.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-16 06:27:53 +00:00
Snider
f8bee4b4ad fix(agentic): match concurrency limits on base agent type
gemini:flash, gemini:pro now match the "gemini" concurrency limit.
Strips model variant before checking config. Prevents unlimited
spawning when using model variants.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 19:00:19 +00:00
Snider
cb8c126d78 fix(agentic): full terminal detachment + model variant support
Set TERM=dumb, NO_COLOR=1, CI=true on spawned agents to prevent
terminal control sequences and colour output bleeding into parent.
Combined with Setpgid + /dev/null stdin.

Agent now supports model variants via colon syntax:
  gemini:flash, gemini:pro, claude:haiku, claude:sonnet

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 18:12:48 +00:00
Snider
02f0afd1ea feat(agentic): rate-aware task scheduling
Reads rates config from agents.yaml per agent type. Calculates delay
based on time-of-day relative to quota reset window:
- Sustained mode: steady pacing across the full day
- Burst mode: faster pacing when close to reset (quota about to refill)

Gemini resets 06:00 UTC. Start at 09:00 = pace slower (sustained_delay).
Start at 03:00 = burst mode (burst_delay) since reset is 3 hours away.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 17:55:55 +00:00
Snider
a5ebea1770 fix(agentic): fully detach agent processes from terminal
Redirect stdin to /dev/null so spawned agents don't inherit the
terminal. Prevents agents from stealing input/output during git
commits or interactive operations.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 17:41:47 +00:00
Snider
f728219ce4 feat(agentic): per-agent concurrency limits
Separate concurrency control per agent type: claude: 1, gemini: 3,
codex: 1. Gemini can grind through audit batches without blocking
Claude from doing fix work. Config in agents.yaml under concurrency.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 17:33:16 +00:00
Snider
e7c1c9bd86 fix(agentic): enforce commit-per-phase in coding prompt
Strengthen phase enforcement: 'Each phase = one commit. This is not optional.'
Agents were batching all phases into a single commit. Now the prompt
explicitly requires stopping and committing after each phase.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 17:18:50 +00:00
Snider
aad4c444a1 feat(agentic): persona support — adopt identity from prompts/personas/
Dispatch and prep accept a persona field (e.g. "engineering/backend-architect").
Copies persona markdown into workspace as PERSONA.md. Coding prompt updated
to read PERSONA.md first and adopt that identity.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 16:35:42 +00:00
Snider
58c6f3687c feat(agentic): auto-drain queue when agent completes
When an agent process exits, the completion goroutine updates status
to completed then calls drainQueue(). drainQueue finds the oldest
queued workspace, spawns it if under concurrency limit, and monitors
it recursively. Self-sustaining work pipeline.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 16:09:45 +00:00
Snider
fb16e18919 feat(agentic): concurrency control with file-based queue
Reads max_concurrent from config/agents.yaml. If at limit, workspace
is created with status "queued" instead of spawning immediately.
Counts running agents by checking PID liveness.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 16:03:09 +00:00
Snider
2129c51599 fix(agentic): detach agent processes so they survive MCP server death
Set Setpgid on spawned agent processes so they get their own process
group. Agents now survive session restarts, plugin reloads, and MCP
server crashes. Output writes directly to log file instead of
in-memory buffer.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:55:29 +00:00
Snider
cbc7ccd91c chore: sync workspace dependencies
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:45:04 +00:00
Snider
4b6dec50b1 chore: sync go.mod dependencies
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:38:33 +00:00
Snider
3695f72b42 chore: bump forge deps (core/go v0.3.1, go-io v0.1.2, go-process v0.2.2)
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:17:42 +00:00
Snider
3b8f17d8fd docs: add implementation plans for plan CRUD and issue dispatch
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:10:52 +00:00
Snider
3cd21f2fc1 feat(agentic): epic system — parent issue with child checklist
New MCP tool agentic_create_epic:
- Creates child issues from task list
- Builds parent epic with checklist (- [ ] #N format)
- Auto-creates labels (agentic, epic)
- Optionally dispatches agents to each child

Works with existing tick_parent handler in go-scm jobrunner
which checks off items as child PRs merge.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 15:04:42 +00:00
Snider
9587ea4d49 refactor(agentic): use go-process for agent lifecycle management
Replace raw exec.Command with process.StartWithOptions() from
go-process. Agents get proper PID tracking and output capture
via RingBuffer.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 14:35:47 +00:00
Snider
5d5646248e fix(agentic): clone from local repo, disable agent push
Workspace clones from local checkout instead of setting forge remote.
Agent commits locally — reviewer verifies and pushes. Prevents
accidental CI triggers and GitHub Actions credit usage.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 14:20:07 +00:00
Snider
b21a9e3364 feat(agentic): PR creation and issue-driven dispatch tools
New tools from dispatched agent (merged manually):
- agentic_create_pr: push branch + create PR via Forge API
- agentic_list_prs: list PRs across repos with filtering
- WorkspaceStatus extended with org, branch, issue, pr_url fields

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 14:14:33 +00:00
Snider
3d482d0744 feat(agentic): add plan CRUD MCP tools
Five new tools for managing implementation plans:
- agentic_plan_create: create plans with phases and acceptance criteria
- agentic_plan_read: get plan by ID
- agentic_plan_update: partial updates to status, phases, notes
- agentic_plan_delete: remove plan by ID
- agentic_plan_list: list/filter plans by status and repo

Plans follow the task protocol lifecycle (draft → ready → in_progress
→ needs_verification → verified → approved) and are stored as JSON
in ~/.core/plans/.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 14:12:56 +00:00
Snider
3e9ef16409 feat(agentic): plan template rendering in workspace prep
Dispatch now accepts plan_template + variables fields. Workspace prep
loads YAML templates from core/agent/prompts/templates/, substitutes
variables, and renders PLAN.md with phases and checkbox tasks. Coding
prompt updated to work phase-by-phase with commit-per-phase convention.

Agent reads files, commits per phase — no MCP tools needed mid-work.
The checkpoint IS the commit.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 13:59:05 +00:00
Snider
3b169d9b1e feat(agentic): workspace lifecycle — status, resume, stop/ask/continue
New MCP tools:
- agentic_status: list workspaces with state (running/completed/blocked/failed)
- agentic_resume: relaunch blocked agents with ANSWER.md context

Workspace convention:
- status.json tracks state, agent, PID, run count
- BLOCKED.md written by agent when stuck (triggers blocked state)
- ANSWER.md written by reviewer before resume
- Dispatch now writes status.json on launch

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 13:29:19 +00:00
Snider
c122ba2039 feat(agentic): include GEMINI.md ethics framework in workspace
Every dispatched agent gets the LEK axioms (Axioms of Consciousness)
from core/agent/GEMINI.md alongside the project context.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 10:41:05 +00:00
Snider
d0ad141af3 fix(agentic): write context files inside src/ for agent sandbox
Gemini CLI restricts file access to the workspace root (src/).
All context files (CLAUDE.md, TODO.md, CONTEXT.md, CONSUMERS.md,
RECENT.md, PROMPT.md, kb/, specs/) now written inside src/ so
the sandboxed agent can read them.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 10:31:23 +00:00
Snider
fc13f79a52 fix(agentic): fresh clone with feature branch in sandboxed workspace
Dispatch now clones the full repo (not shallow) into workspace/src/,
creates an agent/{task-slug} feature branch, and sets the push remote
to forge. Agent never touches the main checkout.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 10:19:53 +00:00
Snider
85dcf32f51 chore: add .core/ and .idea/ to .gitignore 2026-03-15 10:17:50 +00:00
Snider
3a3b8f6532 refactor(agentic): sandboxed workspace with prompt templates
Workspace is now a fresh directory per task with top-level context
files (CLAUDE.md, TODO.md, CONTEXT.md, CONSUMERS.md, RECENT.md)
and src/ containing a shallow clone of the target repo.

Three prompt templates: conventions (audit), security (review),
coding (implement). Agent just reads PROMPT.md and works in src/.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 10:06:26 +00:00
Snider
ca5c235ece feat(agentic): add dispatch and scan MCP tools
agentic_dispatch: spawn Gemini/Codex/Claude subagents with prepped
workspace context. Builds structured prompts from CLAUDE.md, OpenBrain
memories, consumers, and git log. Runs in background with PID tracking.

agentic_scan: scan Forge repos for open issues with actionable labels
(agentic, help-wanted, bug). Deduplicates cross-label results.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 08:09:48 +00:00
Snider
ebd44bf2f2 feat(agentic): add workspace prep MCP tool
Ports agentic:prep-workspace from CorePHP to Go as an MCP tool.
Assembles: CLAUDE.md, wiki KB, specs, OpenBrain context, consumer
list, recent git log, and Forge issue TODO for target repo.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 08:04:59 +00:00
Snider
53a4902505 fix(brain): map score and source fields from API response
DirectSubsystem now includes Qdrant similarity score as confidence
and source field as a tag in recall results.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 07:48:07 +00:00
Snider
b0cbd21741 feat(brain): add direct HTTP subsystem for standalone MCP server
DirectSubsystem calls api.lthn.sh REST API directly without the
IDE WebSocket bridge. Reads API key from CORE_BRAIN_KEY env or
~/.claude/brain.key. Wired into core-mcp serve command.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-15 07:13:45 +00:00
Snider
f0f53efeb6 fix: align dependency versions for forge resolution
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 14:47:35 +00:00
Snider
7a766dd32c fix: align indirect dependency versions via go work sync
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 13:42:31 +00:00
Snider
1df29c915b fix: update stale import paths and dependency versions from extraction
Resolve stale forge.lthn.ai/core/cli v0.1.0 references (tag never existed,
earliest is v0.0.1) and regenerate go.sum via workspace-aware go mod tidy.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 13:38:59 +00:00
Snider
37e1bec02b refactor(api): update import path from go-api to core/api
Part of the polyglot merge — forge.lthn.ai/core/go-api is now
forge.lthn.ai/core/api.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 10:10:28 +00:00
Snider
71149b054d feat(brain): add brain service provider with REST endpoints
Wraps the brain Subsystem as a provider.Provider with REST endpoints for
remember, recall, forget, list, and status. Implements Streamable,
Describable, and Renderable for WS events, OpenAPI, and GUI panel
discovery. Delegates to the same IDE bridge as MCP tools.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-14 09:47:39 +00:00
Snider
06d5507f90 docs: add CLAUDE.md project instructions
Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-13 13:38:02 +00:00
Snider
8b9cc2e3d6 docs: add human-friendly documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 13:02:40 +00:00
Snider
9e2d77ed2a feat: initial core/mcp — Go MCP server + PHP Laravel MCP package
Moved from go-ai/mcp/ and php-mcp. Produces core-mcp binary.
49 MCP tools including brain, RAG, ML, IDE bridge.
2026-03-09 18:34:17 +00:00
7760b4089f Initial commit 2026-03-09 18:30:06 +00:00