Compare commits
6 Commits
v2.8.18-de
...
v2.8.20-si
| Author | SHA1 | Date | |
|---|---|---|---|
| 7cb692d8be | |||
| 917a229363 | |||
| 39be5ce413 | |||
| 378e29308e | |||
| 8f6a814ab0 | |||
| 3c019a2281 |
@@ -2,6 +2,10 @@
|
||||
|
||||
All notable changes per release tag. Most recent on top, ordered by tag creation date (which matches the git history). Tag names follow `vMAJOR.MINOR.PATCH-slug` — the slug describes what shipped, so the tag name alone is enough to recall the batch.
|
||||
|
||||
## v2.8.18-deepseek-whale-lift — 2026-06-08
|
||||
|
||||
Integrates DeepSeek API directly into BooChat and BooCoder via `@ai-sdk/deepseek`, replacing the generic `openai-compatible` wrapper. DeepSeek V4 models (`deepseek-v4-flash`, `deepseek-v4-pro`) with configurable thinking effort levels appear in both chat and coder pane model pickers. Full token tracking — cache hit tokens and reasoning tokens — flow from the API through new DB columns and WS frames into the UI message stats line. Lifts three high-value features from the Whale codebase: a schema-based tool input repair system that coerces types and unwraps markdown autolinks before Zod validation, a shell-based lifecycle hooks system (PreToolUse, PostToolUse, Stop, PreCompact, PostCompact) with JSON stdin/stdout contract, and per-MCP-server permissions (allow/ask/deny) gating tool execution.
|
||||
|
||||
## v2.8.0-fork-lifts — 2026-06-07
|
||||
|
||||
Completes the eight fork-lift integrations from `/opt/forks` into BooCode: boocontext sidecar upgrade, LSP code intelligence, DCP clean-room pruning, institutional memory, subagent protocol enhancements, plugin hook host, inference reliability (tool-shim + loop detectors), and TokenScope token breakdown. Backfills edit safety guards (truncation + dropped imports) and the TokenScope analyzer/persist module. Closes the fork-lifts-mit epic.
|
||||
|
||||
@@ -32,11 +32,18 @@ CREATE TABLE IF NOT EXISTS messages (
|
||||
content TEXT NOT NULL DEFAULT '',
|
||||
status TEXT NOT NULL DEFAULT 'complete',
|
||||
last_seq INT NOT NULL DEFAULT 0,
|
||||
cache_tokens INTEGER,
|
||||
reasoning_tokens INTEGER,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp()
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_messages_session ON messages(session_id, created_at);
|
||||
|
||||
-- vDeepSeek: add cache/reasoning token columns early so messages_with_parts
|
||||
-- view (defined below) can reference them. IF NOT EXISTS guards re-runs.
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS cache_tokens INTEGER;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS reasoning_tokens INTEGER;
|
||||
|
||||
-- v1.13.0: granular message parts table. v1.13.20: legacy tool_calls/
|
||||
-- tool_results columns dropped; message_parts is now the sole source of
|
||||
-- truth for tool calls, tool results, and reasoning. ON DELETE CASCADE
|
||||
@@ -204,8 +211,6 @@ ALTER TABLE messages ADD COLUMN IF NOT EXISTS ctx_used INTEGER;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS ctx_max INTEGER;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS started_at TIMESTAMPTZ;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS finished_at TIMESTAMPTZ;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS cache_tokens INTEGER;
|
||||
ALTER TABLE messages ADD COLUMN IF NOT EXISTS reasoning_tokens INTEGER;
|
||||
|
||||
ALTER TABLE sessions ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp();
|
||||
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
// DEPRECATED (Phase 4, Domain 2, v2.8.14): This HTTP client routes through
|
||||
// the Go codecontext sidecar (http://codecontext:8080). Superseded by the
|
||||
// boocontext MCP server. New callers should use boocontext MCP tool wrappers
|
||||
// directly. Keep this file for backward compatibility — the 16 existing
|
||||
// codecontext tool wrappers (under tools/codecontext/) still call through
|
||||
// callCodecontext(). Remove after full migration.
|
||||
//
|
||||
// v1.12 Track B.2: shared HTTP client for the codecontext sidecar. The 8
|
||||
// per-tool wrappers under tools/codecontext/ all funnel through callCodecontext
|
||||
// — they're thin adapters that supply toolName + args + projectPath. The
|
||||
@@ -19,6 +26,7 @@
|
||||
import { access, copyFile, realpath } from 'node:fs/promises';
|
||||
import { isAbsolute, join, resolve, sep } from 'node:path';
|
||||
import { truncateIfNeeded } from './truncate.js';
|
||||
import { callBoocontext } from './boocontext_client.js';
|
||||
|
||||
// v1.13.12 fix: codecontext crashes on empty source files (upstream issue #37)
|
||||
// when it can't ignore them. The .codecontextignore.template ships with the
|
||||
@@ -112,6 +120,16 @@ export async function callCodecontext(
|
||||
req: CodecontextRequest,
|
||||
fetcher: typeof fetch = fetch,
|
||||
): Promise<CodecontextResponse> {
|
||||
// Phase 4: try boocontext MCP first. Falls back to the HTTP sidecar if the
|
||||
// MCP server is not available or the tool doesn't exist there.
|
||||
try {
|
||||
return await callBoocontext({ toolName: req.toolName, args: req.args });
|
||||
} catch (err) {
|
||||
console.warn(
|
||||
`[codecontext_client] boocontext MCP unavailable for "${req.toolName}", falling back to HTTP sidecar: ${err instanceof Error ? err.message : String(err)}`,
|
||||
);
|
||||
}
|
||||
|
||||
// Step 1: realpath the project root, then realpath the requested target_dir
|
||||
// (defaulting to projectPath when the caller didn't pass one — the 12 wrappers
|
||||
// never pass target_dir; tests can override). A non-existent target_dir
|
||||
|
||||
@@ -2,6 +2,12 @@ import { z } from 'zod';
|
||||
import type { ToolDef } from '../types.js';
|
||||
import { callCodecontext, type CodecontextResponse } from '../../codecontext_client.js';
|
||||
|
||||
// DEPRECATED (Phase 4, Domain 2, v2.8.14): This factory builds ToolDefs that
|
||||
// route through the Go codecontext sidecar via callCodecontext(). Superseded
|
||||
// by direct boocontext MCP tool wrappers. Keep functional for backward
|
||||
// compatibility — old codecontext tools still use HTTP. New tools should use
|
||||
// the boocontext MCP server instead of adding entries here.
|
||||
//
|
||||
// Shared factory for the 12 codecontext shim ToolDefs.
|
||||
// Each shim provides name/schema/description/jsonParameters/mapArgs; the
|
||||
// factory builds the ToolDef and returns both the ToolDef and the standalone
|
||||
|
||||
@@ -3,6 +3,7 @@ import { makeCodecontextTool } from './factory.js';
|
||||
|
||||
export const GetCodebaseOverviewInput = z.object({
|
||||
include_stats: z.boolean().optional(),
|
||||
compress: z.boolean().optional().describe('Apply DCP compression for large projects (>50 files)'),
|
||||
});
|
||||
export type GetCodebaseOverviewInputT = z.infer<typeof GetCodebaseOverviewInput>;
|
||||
|
||||
@@ -24,10 +25,18 @@ const { toolDef: getCodebaseOverview, execute: executeGetCodebaseOverview } =
|
||||
type: 'boolean',
|
||||
description: 'Include file count, symbol count, language stats. Defaults to true.',
|
||||
},
|
||||
compress: {
|
||||
type: 'boolean',
|
||||
description: 'Apply DCP compression for large projects (>50 files)',
|
||||
},
|
||||
},
|
||||
additionalProperties: false,
|
||||
},
|
||||
mapArgs: (input) => ({ include_stats: input.include_stats ?? true }),
|
||||
mapArgs: (input) => {
|
||||
const args: Record<string, unknown> = { include_stats: input.include_stats ?? true };
|
||||
if (input.compress) args['compress'] = true;
|
||||
return args;
|
||||
},
|
||||
});
|
||||
|
||||
export { getCodebaseOverview, executeGetCodebaseOverview };
|
||||
|
||||
@@ -18,3 +18,4 @@ export { getCodeHealth } from './get_code_health.js';
|
||||
export { getCodeImpact } from './get_code_impact.js';
|
||||
export { getTypeInfo } from './get_type_info.js';
|
||||
export { getCodeMap } from './get_code_map.js';
|
||||
export { getWikiArticle } from './get_wiki_article.js';
|
||||
|
||||
@@ -532,6 +532,8 @@ export type WsFrame =
|
||||
tokens_used?: number | null;
|
||||
ctx_used?: number | null;
|
||||
ctx_max?: number | null;
|
||||
cache_tokens?: number | null;
|
||||
reasoning_tokens?: number | null;
|
||||
started_at?: string | null;
|
||||
finished_at?: string | null;
|
||||
// model-attribution: the model that produced this assistant message.
|
||||
|
||||
@@ -40,6 +40,8 @@ function applyFrame(state: State, frame: WsFrame): State {
|
||||
tokens_used: null,
|
||||
ctx_used: null,
|
||||
ctx_max: null,
|
||||
cache_tokens: null,
|
||||
reasoning_tokens: null,
|
||||
model: null,
|
||||
started_at: null,
|
||||
finished_at: null,
|
||||
@@ -106,6 +108,8 @@ function applyFrame(state: State, frame: WsFrame): State {
|
||||
tokens_used: null,
|
||||
ctx_used: null,
|
||||
ctx_max: null,
|
||||
cache_tokens: null,
|
||||
reasoning_tokens: null,
|
||||
model: null,
|
||||
started_at: null,
|
||||
finished_at: null,
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
# v2.8 — boocontext sidecar container.
|
||||
# Multi-stage build: Go shim from golang:1.24-alpine, boocontext MCP aggregator
|
||||
# from node:20-alpine, then an alpine:3.20 runtime holding both.
|
||||
#
|
||||
# The shim spawns boocontext as a child MCP process over stdio NDJSON,
|
||||
# translating HTTP requests to MCP tools/call.
|
||||
#
|
||||
# To stage the fork source for a Docker build:
|
||||
# tar -czf codecontext/fork.tar.gz -C /opt/forks/boocontext \
|
||||
# --exclude=.git --exclude=node_modules --exclude=dist
|
||||
|
||||
# Stage 1: Go shim builder
|
||||
FROM golang:1.24-alpine AS shim-builder
|
||||
WORKDIR /build/shim
|
||||
RUN apk add --no-cache ca-certificates
|
||||
COPY go.mod ./
|
||||
COPY shim.go ./
|
||||
RUN CGO_ENABLED=0 GOOS=linux go build -o /build/shim-bin ./
|
||||
|
||||
# Stage 2: boocontext MCP builder (pnpm project)
|
||||
FROM node:20-alpine AS boocontext-builder
|
||||
WORKDIR /build/boocontext
|
||||
RUN apk add --no-cache git python3 make g++ ca-certificates
|
||||
RUN npm install -g pnpm@9 --silent
|
||||
COPY fork.tar.gz /build/fork.tar.gz
|
||||
RUN mkdir -p /build/boocontext && tar -xzf /build/fork.tar.gz -C /build/boocontext
|
||||
WORKDIR /build/boocontext
|
||||
RUN pnpm install --frozen-lockfile && pnpm run build
|
||||
|
||||
# Stage 3: Runtime
|
||||
FROM alpine:3.20
|
||||
# uv intentionally not installed — container network blocks astral.sh.
|
||||
# tree-sitter-analyzer child server (uvx) won't start in-container, but
|
||||
# boocontext logs a graceful warning; TSA-backed tools fall through.
|
||||
RUN apk add --no-cache ca-certificates nodejs
|
||||
COPY --from=shim-builder /build/shim-bin /usr/local/bin/shim
|
||||
COPY --from=boocontext-builder /build/boocontext/dist /usr/local/lib/boocontext/dist
|
||||
COPY --from=boocontext-builder /build/boocontext/node_modules /usr/local/lib/boocontext/node_modules
|
||||
COPY --from=boocontext-builder /build/boocontext/package.json /usr/local/lib/boocontext/package.json
|
||||
|
||||
EXPOSE 8080
|
||||
HEALTHCHECK --interval=30s --timeout=5s --start-period=30s \
|
||||
CMD wget -qO- http://localhost:8080/health || exit 1
|
||||
ENTRYPOINT ["/usr/local/bin/shim"]
|
||||
31
codecontext/README.md
Normal file
31
codecontext/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# codecontext — Go sidecar (DEPRECATED)
|
||||
|
||||
> **Deprecated** (Phase 4, Domain 2, v2.8.14).
|
||||
>
|
||||
> Superseded by the **boocontext MCP server** (`apps/coder`). Do not add new
|
||||
> callers. The 16 codecontext tool wrappers still use this sidecar via HTTP at
|
||||
> `http://codecontext:8080/v1/{toolName}` for backward compatibility.
|
||||
|
||||
## Migration path
|
||||
|
||||
1. Existing tool wrappers in `apps/server/src/services/tools/codecontext/` route
|
||||
through `callCodecontext()` in `codecontext_client.ts`, which calls this
|
||||
Go sidecar over HTTP.
|
||||
2. New callers should use the boocontext MCP server instead (reachable via the
|
||||
`boocontext` tool wrappers).
|
||||
3. After all callers have migrated, remove this directory, the `codecontext`
|
||||
service block from `docker-compose.yml`, and the
|
||||
`codecontext_client.ts`/`factory.ts` files.
|
||||
|
||||
## What it does
|
||||
|
||||
A Go HTTP shim wrapping the boocontext MCP server's stdio interface. Provides
|
||||
code-graph analysis (symbols, callers, callees, file overview, etc.) over a
|
||||
REST API at `/v1/{toolName}`.
|
||||
|
||||
## Files
|
||||
|
||||
- `shim.go` — HTTP server that wraps the boocontext MCP stdio process
|
||||
- `Dockerfile` — container build
|
||||
- `fork.tar.gz` — vendored boocontext source (gitignored)
|
||||
- `.codecontextignore.template` — default ignore patterns deployed per project
|
||||
@@ -7,7 +7,6 @@ services:
|
||||
- "100.114.205.53:9500:3000"
|
||||
env_file: .env
|
||||
environment:
|
||||
CODECONTEXT_URL: http://codecontext:8080
|
||||
CONTAINER_GUIDANCE_FILE: /app/BOOCHAT.md
|
||||
DATABASE_URL: postgres://boocode:${POSTGRES_PASSWORD}@boocode_db:5432/boochat
|
||||
BOOCODER_URL: http://100.114.205.53:9502
|
||||
@@ -91,41 +90,6 @@ services:
|
||||
networks:
|
||||
- boocode_net
|
||||
|
||||
# v1.12 Track B: codecontext sidecar. Stdio MCP server wrapped by a small
|
||||
# HTTP shim (see ./codecontext/). No host port — reached from boocode at
|
||||
# http://codecontext:8080 over the boocode_net bridge.
|
||||
#
|
||||
# Mounts /opt:/opt:ro (not just /opt/projects:ro): BooCode projects live
|
||||
# at /opt/<slug> on the host, not exclusively under /opt/projects. The
|
||||
# mount must cover anywhere a project.path could resolve to. Read-only
|
||||
# because codecontext only analyzes — never writes. The model can't
|
||||
# arbitrarily set target_dir to a sensitive subtree because the B.2
|
||||
# wrappers validate target_dir against project.path before calling the
|
||||
# shim, and the shim isn't reachable from outside boocode_net.
|
||||
codecontext:
|
||||
build:
|
||||
context: ./codecontext
|
||||
container_name: boocode_codecontext
|
||||
ports:
|
||||
- "127.0.0.1:8080:8080"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
CODECONTEXT_CHILD: node /usr/local/lib/boocontext/dist/index.js --mcp
|
||||
TYPE_INJECT_MCP_PATH: /opt/type-inject/packages/mcp/dist/index.js
|
||||
TREE_SITTER_MCP_CMD: uvx
|
||||
TREE_SITTER_MCP_ARGS: --from tree-sitter-analyzer[mcp] tree-sitter-analyzer-mcp
|
||||
networks:
|
||||
- boocode_net
|
||||
volumes:
|
||||
- /opt:/opt:ro
|
||||
- /opt/forks:/opt/forks:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
volumes:
|
||||
boocode_pgdata:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user