Conversation
The core plugin couldn't be installed/loaded as shipped:
- provider/claude/core/.mcp.json was a bare { core: {...} } — Claude Code needs the { mcpServers: {...} } wrapper or the MCP server won't load. Added it (HTTP :9202 + Bearer ${MCP_AUTH_TOKEN}, the connect-not-spawn shape).
- plugin.json name was 'agent' while the marketplace entry is 'core' — /plugin install core@core-agent silently fails on a name mismatch. Aligned to 'core'.
- marketplace.json core version 0.14.0 → 0.18.0 to match the manifest.
- removed the stray stdio dupes 000.mcp.json + 000mcp.json (superseded by the HTTP plane).
Co-Authored-By: Virgil <virgil@lethean.io>
Advance external/go workspace submodule to v0.10.4 so dev (GOWORK on) and standalone (GOWORK=off) builds resolve the same core/go. Co-Authored-By: Virgil <virgil@lethean.io>
…leak loadAgentsConfig() sets a package-global workspace-root override from agents.yaml dispatch.workspace_root. A full-core test (newCoreAgent) leaves it set, so a later test relying on CORE_WORKSPACE resolved the leaked path instead — TestCommands_Check_Good_BranchWorkspaceCount failed in-suite but passed alone. Export SetWorkspaceRootOverride and reset it in newTestCore so each test starts from clean workspace resolution (mirroring the agentic package's own internal test guard). Co-Authored-By: Virgil <virgil@lethean.io>
Real per-symbol tests for the testable helpers: defaultHubTokenFile, defaultHubAuditPath, optStringOr, publicSuffix, auditMetaString, toBytes, hostIsLoopback (commands_hub.go); defaultUserChatsPath + the chat --user guard (commands_chat.go); detectBinaryName (main.go). Co-Authored-By: Virgil <virgil@lethean.io>
CI already uploads coverage to Codecov (.github/workflows/ci.yml) but had no codecov.yml, so there was no gate to "start using". Add one configured as a ratchet: project status target=auto (a PR may not drop total coverage below the base, 1% noise threshold) + patch target=70% (new/changed lines must be reasonably covered, pulling the number up as files are touched). Ignore tests, examples, and the vendored externals. `task cov` writes go/coverage.out (the path codecov + SonarCloud both read) and prints the total, for local runs. Co-Authored-By: Virgil <virgil@lethean.io>
Good/Bad/Ugly for the pure map-walk helper: nested path resolves to the terminal string; missing key at any step yields ""; non-map intermediate or non-string terminal yields "". Co-Authored-By: Virgil <virgil@lethean.io>
…> 39.2%) Add newTestService — builds a real opencode Service against a temp-$HOME DuckDB KV store, resetting the process-global kvOnce before+after (the cross-test hazard host_config_mode_test.go documented but sidestepped). auth.go and enable.go had no test files at all (hence 0%). With the harness: - auth.go: ServerPassword, InstallID, authHeader (+ SeedDefaultProfile) - enable.go: IsEnabled default-false, setEnabled round-trip - host_config.go: MergeHostConfig create + idempotent re-merge Co-Authored-By: Virgil <virgil@lethean.io>
….8%) Two table tests over the previously-0% command surface: the 5 pipeline routers (empty/help action → OK, unknown action → error) and the 16 leaf placeholders (not-yet-implemented). No side effects — these print help and return. Co-Authored-By: Virgil <virgil@lethean.io>
cmdPlanShow's slug guard (usage + error) and cmdPlanList against an empty
workspace ("no plans" → OK). Read-only, no side effects.
Co-Authored-By: Virgil <virgil@lethean.io>
Both card-listers, both lanes (human + --json), always-OK. Co-Authored-By: Virgil <virgil@lethean.io>
Pure option->input mappers (resume/scan/watch/mirror, incl. watch's single- workspace fallback) and brainValuePresent (nil/empty/whitespace absent, non-empty present). Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…trip) GetProfile empty-name guard + notfound code; SaveProfile empty-name guard + save→get roundtrip. Via the isolated kv-harness. Co-Authored-By: Virgil <virgil@lethean.io>
ToOpenCodeWire strips name/description; ListProfiles returns seeded default + saved; DeleteProfile guards (empty + default-floor) then deletes and confirms gone. Co-Authored-By: Virgil <virgil@lethean.io>
cmdExtract surfaces an unreadable --source error; cmdBranchDelete refuses without repo+branch (guard runs before any forge call). Co-Authored-By: Virgil <virgil@lethean.io>
handleIssue{Get,List,Create} + handlePR{Get,List,Merge,Close} each delegate to
their cmd* form, which refuses empty input before any forge call.
Co-Authored-By: Virgil <virgil@lethean.io>
SetWorkspaceRootOverride (abs/relative), LogDir/ConfDir/DataDir/AgentsConfigPath, pipelineIssueIsAudit (title markers) + pipelineIssueIsEpic, parseCreditBalance. Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
… platform) Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Assert each builds its request and calls the platform endpoint (mock records the hits), independent of the response-parse branch. Co-Authored-By: Virgil <virgil@lethean.io>
Drive the 11 remaining platform tools through their request-building paths (list/get tools reach the mock platform, the rest hit their guards). Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…rvice Promote the fleet dispatch model into Core\Mod\Agentic alongside Issue/AgentPlan: agent_registrations + dispatch_jobs models (with the folded fleet columns + created_by) and DispatchService with the atomic conditional-update claim so concurrent installs sharing a workspace queue can't double-claim. lthn.ai's app re-points System A (console + MCP) at these; System B controllers follow. Co-Authored-By: Virgil <virgil@lethean.io>
/v1/fleet/* now lands in the unified agent_registrations + dispatch_jobs instead of fleet_nodes/fleet_tasks. DispatchService gains heartbeat/deregister/listAgents/ stats/nextTask and — crucially — complete(), the report-back path System A never had (completeTask now flips a dispatch_job to completed/failed with result/ findings/changes/report). Response shapes preserved; task ids are uuids now. Verified: register → enqueue → nextTask claim → complete → stats end to end. Co-Authored-By: Virgil <virgil@lethean.io>
…tion The /v1/agent/sync|context|status actions now resolve agent identity via AgentRegistration, and sync_records is re-keyed from fleet_node_id to workspace_id + agent_id (additive migration; fleet_node_id kept nullable for back-compat). Last fleet-table dependency outside credits/fleet_tasks is gone. Verified: push records a sync_record by workspace+agent, status reads it back. Co-Authored-By: Virgil <virgil@lethean.io>
…tchService Api\Fleet\FleetController (/v1/fleet/dispatch + /v1/fleet/stream) now runs on DispatchService over the unified tables; enqueue carries findings/changes/report and stats() preserves the /v1/fleet/stats contract from dispatch_jobs. Retire the now-orphaned FleetService + the RegisterNode/NodeHeartbeat/DeregisterNode/ CompleteTask/GetNextTask actions. Tests updated to the unified model and flagged UNRUN (framework suite can't be installed with forge offline; verify in CI). ListNodes/AssignTask/GetFleetStats + FleetNode/FleetTask stay — still used by the live FleetOverview admin (HubComponent), which is a separate UI migration. Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…ers/ Verified each design's work is present in source before removal; the docs are redundant replication guides. Future superpowers output stays local (gitignored). Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…ature docs in subfolders RFC specs live in plans/code/core/agent/; remove the stale repo duplicates (root + docs/ RFC*, flow/, plugins/, php-agent/, AX dup) and the index.md landing page. Reorganise the remaining feature docs into brain/, inference/, setup/. Repoint CLAUDE.md + architecture.md cross-references. Co-Authored-By: Virgil <virgil@lethean.io>
15 docs/<feature>/ stubs (one per code feature found in cmd/ + pkg/), each pointing at its source and the literal-docs-from-code rules. DOCS-TASK.md is the agent brief to fill them. Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…m code (#215) Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…(#218) Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
…m code (#220) Co-Authored-By: Virgil <virgil@lethean.io>
…om code (#221) Co-Authored-By: Virgil <virgil@lethean.io>
…tire DOCS-TASK All feature stubs are now written user guides; the fill-it brief has done its job. Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
… pages (#222) Each docs/<feature>/README.md is now a concise (~50-line) SEO-aware index that links to child detail pages. Split: cli (commands), dispatch (runners), plans (sessions), pipeline (closeout + orchestration). Trimmed: fleet, brain, inference (children already existed). Co-Authored-By: Virgil <virgil@lethean.io>
…rs (#223) New docs/providers/ catalogues the providers you dispatch to (claude/codex/gemini/vibe/ coderabbit remote, opencode + LEM/ollama local), split by model location, cross-linking dispatch/runners (native vs container) and inference (the local engine). Co-Authored-By: Virgil <virgil@lethean.io>
…der (#223) Split the monolithic dev guide into an index + building/testing/standards/extending/ plugins/configuration pages (folder = URL, README = concise index). Repoint CLAUDE.md. Co-Authored-By: Virgil <virgil@lethean.io>
core.Info is structured (msg + key/value pairs), not printf. "interval=%s" left m.interval as a key with no value, logging '(interval=%s) 2m0s=<nil>'. Now logs 'monitor: started interval=2m0s'. Co-Authored-By: Virgil <virgil@lethean.io>
…#225)
Mount the canonical dappco.re/go/cli layer via core.WithService(cli.Register)
in main.go — the CLI surfaces as a service like any other, no second *core.Cli.
Convert go.work off the banned ../orm/go and ../go-container/go relative refs
onto ./external/* submodules, and register external/{cli,orm,go-container}
(all at commits already on their origin/dev). Bump external/go to 4b0072a.
Co-Authored-By: Virgil <virgil@lethean.io>
Five messages.* events were broadcast with no handler. Add reactions: - H1 QueueDrained -> notify queue.status - H4 HarvestRejected-> notify harvest.status (with reason) - H5 InboxMessage -> notify inbox.status - H2 RateLimitDetected -> per-pool backoff (written under the runner.drain lock drainOne reads it through) + notify ratelimit.status; malformed duration notifies without freezing - H3 HarvestComplete -> runner notifies harvest.status; agentic.handleHarvestAutoPR re-dispatches agentic.auto-pr for the harvested branch's workspace Each ships a test that emits the event and asserts the reaction. Co-Authored-By: Virgil <virgil@lethean.io>
…224)
Exchange a short-lived, single-use 6-digit code (minted at app.lthn.ai/device)
for an AgentApiKey. Two unauthenticated, hard-throttled endpoints:
- POST v1/agent/auth/login -> { data: { key } } (Go AuthLoginOutput shape)
- POST v1/device/pair -> { data: { agent_api_key } } (Go fleet client shape)
The code is the proof; throttle:10,1 keeps the 6-digit space out of brute-force
reach. Backed by the DevicePairing model + agent_device_pairings migration and
Claim/Create/InvalidPairingCode actions; AuthController.login/pair drive them.
Routes tidied to use-imports along the way. Feature test in DevicePairingTest.
Also: gitignore php/vendor/ (regenerated from composer; never tracked).
In-progress — not PHP-suite verified this session (composer/phpunit not run).
Co-Authored-By: Virgil <virgil@lethean.io>
Preserve in-progress ContentController (149 lines) so the work isn't lost. Not yet wired into Routes/api.php — incomplete, committed for continuity. Co-Authored-By: Virgil <virgil@lethean.io>
|
Important Review skippedToo many files! This PR contains 614 files, which is 464 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (65)
📒 Files selected for processing (614)
You can disable this status message by setting the Use the checkbox below for a quick retry:
Warning Billing warning: we have not been able to collect payment for this subscription for more than 72 hours. Please update the payment method or pay any pending invoices in Billing to avoid service interruption. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|




This pull request introduces several important configuration and documentation updates to the core-agent project, focusing on improving agent concurrency and rate limiting, updating plugin and MCP server integration, clarifying architecture and operational patterns, and adding new external dependencies. The changes also include a comprehensive implementation plan for aligning CLI and IPC handler behavior.
Configuration and Infrastructure Updates:
coreagent version in.claude-plugin/marketplace.jsonfrom0.14.0to0.18.0..mcp.jsonfrom a stdio-based server to an HTTP-based server, now requiring an authorization header..core/agents.yamlto resolve against~/Letheaninstead of$HOME/Code/.core, and clarified the comment.Agent Concurrency and Rate Limiting Enhancements:
opencodeagent in.core/agents.yaml, including per-model sub-limits and pacing settings. [1] [2]Dependency Management:
.gitmodules:external/api,external/cli,external/orm, andexternal/go-container, all tracking their respectivedevbranches.Documentation and Architecture Clarifications:
CLAUDE.mdandAGENTS.mdto reflect the current architecture, including new packages (pkg/runner,pkg/lemma,pkg/chathistory), expanded binary modes, and clarified plugin provider roles and personas/templates structure. [1] [2] [3] [4] [5] [6] [7]PLAN-cli-square-up.md, outlining the correct approach for CLI and IPC handler integration, anti-patterns to avoid, and the status of event handler implementations.