Run the pre-commit uv sync and workspace uv run commands with
--frozen so linting uses the checked-in lockfile without rewriting it
during ordinary code changes.
This avoids local uv resolver freshness checks producing unrelated
uv.lock diffs while preserving explicit dependency update workflows.
* chore(ci): enforce unused imports/vars + advisory dead-code scan
Enable ruff F401 (unused imports) and F841 (unused variables) -- previously
ignored as "too noisy" -- across hindsight-api-slim, hindsight-dev, and
hindsight-embed, and clean up the resulting violations. These are now blocking:
lint.sh auto-removes them and the verify-generated-files CI job fails on any
leftover diff.
Add an advisory dead-code scan for what the linter cannot see -- whole unused
Python functions (vulture) and orphaned files/exports/dependencies in the
control plane (knip):
- scripts/hooks/check-unused.sh runs both locally
- new non-blocking check-unused-code CI job surfaces findings on PRs
- hindsight-control-plane/knip.json tunes out toolchain false positives
vulture stays advisory because its function/argument heuristics false-positive
on FastAPI/SQLAlchemy/Pydantic patterns; knip can be flipped to blocking once
the control-plane dead code (PR #2135) lands.
* chore(ci): make knip blocking on unused files/deps; remove dead deps
#2135 deleted tooltip.tsx but left @radix-ui/react-tooltip in package.json, and
react-chrono / three were never imported. Remove all three, and declare
@radix-ui/react-visually-hidden (used in directive-detail-modal but unlisted).
With the control-plane tree now clean, the check-unused-code job runs
`knip --include files,dependencies,unlisted` as a BLOCKING step. vulture and
knip's unused-exports check (the shadcn/ui surface is kept intentionally) stay
advisory.
Set UV_FROZEN=1 as a job-level env var so all uv commands (sync, run,
lock) respect the committed lockfile without re-resolving. This is the
idiomatic uv approach for CI and prevents spurious uv.lock diffs that
blocked every Dependabot PR.
Reverts the lint.sh CI-specific --frozen logic from #1618 since the
env var covers it globally.
lint.sh runs `uv sync` without --frozen at the repo root, which
re-resolves uv.lock. In CI's verify-generated-files job this causes
spurious 1-line diffs on every Dependabot PR, blocking them from
merging.
Use --frozen when $CI is set so the lockfile is never modified by
the lint step. Local development keeps the non-frozen sync to handle
version bumps gracefully.
* ci: add pre-commit hook to keep skills/hindsight-docs in sync
The CI verify-generated-files job has been failing on ~82% of recent
runs because PRs touch hindsight-docs/src/pages/changelog/ or
hindsight-docs/static/openapi.json without re-running
./scripts/generate-docs-skill.sh, leaving the committed
skills/hindsight-docs/references/ copy stale.
Catch the drift locally instead. The hook regenerates and, if the
working tree diverges from the index after regen, fails the commit
with a clear message pointing the author at `git add skills/hindsight-docs/`.
The pre-commit dispatcher (.githooks/pre-commit) already iterates every
*.sh in scripts/hooks/, so the new file is picked up automatically.
* fix(retain): stop mutating caller-provided content dicts
PR #1398 (memory pressure) added an in-place pop of the "content" key
on contents_dicts after building combined_content, to release per-item
strings the engine no longer needs. Because the engine forwarded the
caller's dict objects all the way through (memory_engine →
_retain_batch_async_internal → orchestrator.retain_batch), the pop
reached back through the same references and stripped the key from
the caller's input. Any code path that holds onto the contents list
after retain_batch_async returns then trips KeyError: 'content'.
This is what was making test_extensions.py::TestOperationHooksParameters::
test_retain_pre_hook_receives_all_parameters fail intermittently on
main (the streaming path triggers the pop; non-streaming paths skip it).
Fix:
- memory_engine.py: take an engine-owned shallow copy of contents
after the validator hook so the orchestrator can mutate freely
without leaking to the caller. Strings are shared by reference,
so the copy adds only ~150 bytes of dict overhead per item —
negligible vs the multi-MB strings.
- orchestrator.py (_streaming_retain_batch): clear combined_content
immediately after handle_document_tracking / upsert_document_metadata
in all three first-batch paths (no-facts skip, mini-batch DB work,
post-loop fallback). Once tracking persists the document, nothing
reads combined_content again, so releasing it shrinks the lifetime
of the per-document text from "until function returns" to "until DB
write completes" — recovering the bulk of #1398's memory savings
without the caller-mutation side effect. nonlocal declarations on
_process_db_batch and _run_mini_batch_db_work are required because
Python infers combined_content as local once any branch assigns to it.
Memory profile vs PR #1398:
- #1398 benchmark shape (caller releases its reference at call time):
identical sustained, brief 2x peak during the combined_content +
per-item-strings overlap window before tracking completes. Other
PR #1398 savings (chunks, batch lists, sanitized_content) untouched.
- HTTP / FastAPI callers (request body holds strings until the handler
returns): no observable change — those strings were going to live
through the request anyway.
* feat(claude-code): add wiki script + agent-knowledge skill
wiki.py: CLI for knowledge pages, recall, ingest, documents.
Uses the existing plugin lib/ for bank resolution and API calls.
No separate config — reads from the same settings.json as retain/recall hooks.
agent-knowledge skill: teaches the agent to use wiki.py commands.
Bank resolution is automatic (same as retain hooks).
Pages default to: delta mode, observation-only, exclude mental models.
* feat: hindsight-agent-sdk (Python + TypeScript) + Claude Code wiki integration
* refactor: move skill to SDK, remove harness-specific skill from claude-code
* feat: add trigger params to MCP create_mental_model + MCP-based skill
- MCP create_mental_model now accepts trigger_mode, trigger_exclude_mental_models,
trigger_fact_types params (both multi-bank and single-bank modes)
- Skill uses mcp__hindsight__* tools directly — no CLI, no scripts
- Bank scoped via MCP URL: /mcp/banks/{bank_id}/
* feat(openclaw): register wiki tools via registerTool API
* feat: standalone hindsight-agent-setup (npx-able) for all harnesses
* fix(openclaw): static import for wiki-tools (ESM compat)
* rename: agent_knowledge_* tools + cleaner skill (no hindsight/wiki/mental_model confusion)
* fix(openclaw): set tools optional=false so they're not filtered by allowlist
* refactor: setup reads directory layout (bank-template.json + content/), agent name from dir
* rename: @vectorize-io/self-driving-agents, setup→install
* cleanup: remove setup backwards compat
* fix: list_pages uses detail=metadata to avoid blowing up context
* chore: publish-ready package.json, README, .gitignore for self-driving-agents
* rename: hindsight-agent-setup → self-driving-agents
* cleanup: remove MCP tool changes, Python/TS SDKs, Claude Code wiki — keep only openclaw tools + skill + CLI
* cleanup: remove Rust CLI + Python CLI (superseded by self-driving-agents TS CLI)
* cleanup: rename wiki→knowledge, add release-tool.sh, interactive cloud setup, remove SDKs
* refactor: CLI does zero API calls, plugin bootstraps template+content on first session
* feat: CLI checks plugin install+config, runs wizard if needed
* feat(self-driving-agents): TUI wizard, TS client, GitHub agent sources
- Replace raw HTTP with @vectorize-io/hindsight-client SDK
- Add @clack/prompts for polished terminal UI (spinners, confirms, notes)
- Support GitHub agent sources: bare name defaults to vectorize-io/self-driving-agents,
org/repo/path fetches from any public repo, local paths still work
- Remove bootstrap code from openclaw plugin (CLI handles all API calls)
- Fix ANSI-polluted JSON parsing for openclaw agents list
- Run setup wizard inline when user declines current config
* feat(self-driving-agents): recursive content discovery, drop content/ convention
Content files (.md, .txt, etc.) are now found recursively from the
agent directory root. No special content/ subdirectory needed.
This enables nested agent repos where pointing at any level ingests
all files below it:
- install marketing → all 30 files + root bank-template.json
- install marketing/seo → only SEO files + seo/bank-template.json
* cleanup: remove unrelated files (screenshots, PDF, pretext-poc)
* refactor(self-driving-agents): bundle SKILL.md as file, read at runtime
Move the skill from a hardcoded string to a bundled file at skill/SKILL.md.
Each CLI version ships its own skill — re-running install upgrades it.
* cleanup: remove hindsight-agent-sdk/skill, now bundled in self-driving-agents
* feat: knowledge tools opt-in via enableKnowledgeTools config flag
Plugin: agent_knowledge_* tools only register when enableKnowledgeTools
is true in the plugin config (default: false).
CLI: automatically sets enableKnowledgeTools=true in openclaw.json
during install.
* feat: create hindsight-agent-sdk, move tools under hindsight-tools/
- New @vectorize-io/hindsight-agent-sdk package with harness-agnostic
knowledge tools using @vectorize-io/hindsight-client (no raw HTTP)
- OpenClaw plugin now imports from the SDK instead of inline knowledge-tools.ts
- Move self-driving-agents and hindsight-agent-sdk under hindsight-tools/
- Update release-tool.sh for new paths
* test: add tests for hindsight-agent-sdk and self-driving-agents
Agent SDK (11 tests): tool creation, endpoint routing, request bodies,
auth headers, page defaults (delta mode, observation facts).
Self-driving-agents CLI (23 tests): recursive content discovery,
local/GitHub path detection, ANSI JSON parsing, bank ID resolution
from plugin config.
CI: add test-hindsight-agent-sdk and test-self-driving-agents jobs
with detect-changes filtering.
* refactor: move tests to tests/ dirs, add prettier for hindsight-tools
- Move tests from src/ to tests/ matching repo conventions
- Add hindsight-tools/ prettier block to lint.sh
- Format all files with prettier
* fix(ci): add hindsight-tools to npm workspaces, build agent-sdk before openclaw
- Add hindsight-tools/* to root workspaces so npm resolves the agent-sdk
- Build agent-sdk before openclaw in all 3 openclaw CI jobs
- Use root npm ci + workspace builds for tool CI jobs
- Regenerate lockfiles
* fix(ci): use file: dep for agent-sdk in openclaw, whitelist in lockfile checker
- openclaw depends on @vectorize-io/hindsight-agent-sdk via file: ref
(matching how control-plane depends on hindsight-client)
- Lockfile checker whitelists hindsight-tools/* workspace deps
- Regenerate openclaw lockfile
So formatting violations in hindsight-clients/typescript and
hindsight-all-npm now fail CI via verify-generated-files (same
git-status-after-lint pattern Python uses).
- Add prettier-ts-client and prettier-all-npm tasks to lint.sh
- Delete hindsight-clients/typescript/.prettierrc local override so
openapi-ts auto-discovers the shared root .prettierrc.json (was
printWidth 80 / trailingComma "all", now 100 / "es5")
- Reformat affected files (mostly mechanical)
* chore(lint): share ruff/prettier config across integrations
Adds root ruff.toml and .prettierrc.json so every integration package is
formatted with the same rules. lint.sh now also lints integration
packages — only those with modified files locally, all of them in CI
(when $CI is set, or via LINT_ALL_INTEGRATIONS=1).
* style(integrations): apply shared ruff/prettier formatting
Mechanical reformat — output of ruff format / prettier --write under the
new shared configs. No behavior changes.
* chore: regenerate docs skill
* feat: introduce hindsight-api-slim and hindsight-all-slim packages
Closes#552
- Move all source code from hindsight-api/ to new hindsight-api-slim/
- hindsight-api-slim has heavy ML deps (torch, sentence-transformers,
transformers, einops, flashrank, mlx, mlx-lm, safetensors) and
pg0-embedded as optional extras: [local-ml], [embedded-db], [all]
- hindsight-api becomes a zero-code meta-package depending on
hindsight-api-slim[all] for full backward compatibility
- Add hindsight-all-slim meta-package: hindsight-api-slim + client + embed
- hindsight-all updated to depend on hindsight-api-slim[all]
- pg0.py: lazy-import pg0 with clear ImportError pointing to [embedded-db]
- Dockerfile: replace sed hack with proper uv sync --extra flags
- Update release.yml, test.yml, lint.sh, release.sh, CLAUDE.md and
all path references throughout the repo
* refactor: rename hindsight/ directory to hindsight-all/
* docs: document hindsight-api-slim and hindsight-all-slim package variants
Add package variants table and extras explanation to installation.md
* docs: remove emojis from installation.md, use professional tone
* docs: link Docker slim variant to pip package variants section
* docs: consolidate Docker image variants into single table
* ci: fix working-directory paths after package restructure
- Replace all hindsight-api → hindsight-api-slim in test.yml
- Replace hindsight → hindsight-all in test.yml
- Add --extra embedded-db to test-embed API install step
* ci: add local-ml and embedded-db extras to API sync steps
These extras were previously implicit in the old hindsight-api package
(which bundled everything). Now that hindsight-api-slim uses optional
extras, we must explicitly request local-ml and embedded-db in CI.
* ci: add API install step with embedded-db to test-embed smoke test
The smoke test starts hindsight-api as a daemon, which requires pg0-embedded.
Add a dedicated install step for hindsight-api-slim with embedded-db extra
so the daemon can start successfully.
* ci: remove --no-install-project when using optional extras
When --no-install-project is combined with --extra, the optional deps
are not installed because extras require the project to be active.
Remove --no-install-project from steps that need local-ml or embedded-db.
* ci: fix ordering of uv sync steps to preserve optional extras
When uv sync runs for a different workspace member, it removes optional
extras installed for other members. Fix by always running extra-requiring
API sync last, after other workspace member syncs.
Also remove --no-install-project from embedded-db sync in test-embed,
as --no-install-project prevents optional extras from being active.
* ci: add local-ml extra to test-embed API install for smoke test
The smoke test starts the full API server which needs sentence-transformers
for local embeddings (default provider). Add local-ml extra to the install.
* ci: simplify extras with --all-extras and add slim pip smoke test
- Replace explicit --extra local-ml --extra embedded-db with --all-extras
for cleaner, more maintainable sync steps
- Add test-pip-slim job: tests hindsight-api-slim[embedded-db] without
local ML models, using Cohere for embeddings/reranking (mirrors Docker
slim smoke test approach)
* ci: simplify slim smoke test to health check only (mirrors Docker test)
* bump pg0 0.11.x and improve documentation
* bump pg0 0.11.x and improve documentation
* bump pg0 0.11.x and improve documentation
* ci: test notebooks on ci
* ci: test notebooks on ci
* rm llms-full from repo
* formatting
* formatting
* feat: support for gemini-3-pro and gpt-5.2
* feat: support for gemini-3-pro and gpt-5.2
* feat: support for gemini-3-pro and gpt-5.2
* feat: support for gemini-3-pro and gpt-5.2
* feat: add local mcp server
* docs
* docs