Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
224 commits
Select commit Hold shift + click to select a range
c108969
docs(api): document the progress snapshot + include_payload on the op…
r266-tech Jun 8, 2026
568fcea
fix(release): register claude-agent-sdk in changelog generator
nicoloboschi Jun 8, 2026
36fd445
release(claude-agent-sdk): v0.1.0
nicoloboschi Jun 8, 2026
854d0a6
fix(release): register superagent in changelog generator
nicoloboschi Jun 8, 2026
9622747
release(superagent): v0.1.0
nicoloboschi Jun 8, 2026
454069a
docs(claude-code): correct enableKnowledgeTools default (false→true) …
r266-tech Jun 8, 2026
3c8ca47
fix(reranker): make litellm-sdk reranker api_key optional for Bedrock…
r266-tech Jun 8, 2026
e68d325
fix(opencode): drop non-function export from plugin entry (#2028) (#2…
r266-tech Jun 8, 2026
e23e7ca
release(opencode): v0.2.2
nicoloboschi Jun 8, 2026
f625001
fix(trace): preserve RRF source ranks (#2040)
zwcf5200 Jun 8, 2026
3346363
fix(transfer): include mental_model_history count in import-bank CLI …
r266-tech Jun 8, 2026
727d321
docs(models): flag Fireworks AI Batch API support in the capabilities…
r266-tech Jun 8, 2026
b07392c
docs(configuration): document shared cohere/litellm fallback API-key …
r266-tech Jun 8, 2026
78c27bf
docs(models): sync gemini + vertexai default models to 3.x matching c…
r266-tech Jun 8, 2026
50b7eda
fix: remove Markdown bold formatting from fact extraction prompt (#2029)
Oxygen56 Jun 8, 2026
cc6fc94
chore(deps): bump the uv group across 4 directories with 6 updates (#…
dependabot[bot] Jun 8, 2026
bd60c75
docs(models): document the onnx embeddings provider (#2020)
r266-tech Jun 8, 2026
831f0ef
fix(retain): expose retain outcome metadata (#2041)
xmh1011 Jun 8, 2026
227441a
docs(configuration): document HINDSIGHT_API_DATABASE_BACKEND (postgre…
r266-tech Jun 8, 2026
aa024a5
feat(recall): add configurable HINDSIGHT_API_SEMANTIC_MIN_SIMILARITY …
zwcf5200 Jun 8, 2026
e774617
feat(consolidation): periodic reconcile + cross-tenant retention via …
nicoloboschi Jun 8, 2026
796a9ef
fix(opencode): observable logging — config-only debug, resolved-endpo…
nicoloboschi Jun 8, 2026
dbb0ada
release(opencode): v0.2.3
nicoloboschi Jun 8, 2026
8bd4471
perf(recall): add recall-temporal suite that forces the temporal arm …
nicoloboschi Jun 8, 2026
6de5024
test(ci): de-flake TEI parallelism timing + disposition judge reruns …
nicoloboschi Jun 8, 2026
102416c
fix(opencode): call OpenCode app.log as a method so logging actually …
nicoloboschi Jun 8, 2026
27d5ac2
release(opencode): v0.2.4
nicoloboschi Jun 8, 2026
858095f
test(ci): harden LLM-as-judge against single-call verdict flips (#2050)
nicoloboschi Jun 8, 2026
24abf37
docs(integrations): single source of truth (integrations.json) for ga…
nicoloboschi Jun 8, 2026
6166972
test(entity-labels): reproduce paired id/name extraction from [[...]]…
nicoloboschi Jun 8, 2026
c252447
fix(consolidation): set output token budget (#1967)
xmh1011 Jun 8, 2026
8cadecb
Release v0.8.0
nicoloboschi Jun 8, 2026
421cde6
fix(opencode): fold recall into the first system section, not a new o…
nicoloboschi Jun 8, 2026
a2de0b0
release(opencode): v0.2.5
nicoloboschi Jun 8, 2026
8ccddd2
docs: changelog and blog post for v0.8.0 (#2053)
nicoloboschi Jun 8, 2026
644e37a
feat(roo-code): package as installable PyPI CLI (hindsight-roo-code) …
benfrank241 Jun 8, 2026
7c2d184
release(roo-code): v0.1.0
benfrank241 Jun 8, 2026
dbfe83a
feat(integrations): add Cursor CLI integration (#1975)
Korayem Jun 8, 2026
37e28fa
release(cursor-cli): v0.1.0
benfrank241 Jun 8, 2026
bfdc1c5
fix(deps): cap tokenizers<=0.23.0 for local-ML extras (#2055) (#2057)
nicoloboschi Jun 8, 2026
4a0a599
fix(docs): add cursor-cli to integrations gallery (#2060)
benfrank241 Jun 8, 2026
95d7723
fix(migrations): install maintenance routines on target_schema=public…
nicoloboschi Jun 8, 2026
8170fe8
docs: remove versioned docs for 0.5 and lower (#2059)
nicoloboschi Jun 8, 2026
9891f53
fix(docs): correct Grok Build icon path in integrations banner (#2063)
benfrank241 Jun 8, 2026
394d66e
feat(integrations): add Haystack integration (#1256)
DK09876 Jun 8, 2026
ccf0dc8
release(haystack): v0.1.0
benfrank241 Jun 8, 2026
e76021a
blog: How oh-my-pi Built Persistent Codebase Memory on Hindsight (#2017)
benfrank241 Jun 8, 2026
66e58a2
feat(cline): Hindsight memory integration via lifecycle hooks (#1956)
benfrank241 Jun 8, 2026
9a9aef6
release(cline): v0.1.0
benfrank241 Jun 8, 2026
6dc5649
feat(integrations): add oh-my-openagent (OMO) integration (#2018)
dcbouius Jun 8, 2026
9ca6617
release(omo): v0.1.0
benfrank241 Jun 8, 2026
b0f86f9
feat(obsidian): Hindsight plugin for Obsidian (#1941)
benfrank241 Jun 8, 2026
9ea1ef1
release(obsidian): v0.1.0
benfrank241 Jun 8, 2026
6ba4aea
chore: format test files with ruff (enable formatter on tests/) (#2074)
nicoloboschi Jun 9, 2026
c0f0c3a
fix(control-plane): drop locale slug from URLs (localePrefix never) (…
nicoloboschi Jun 9, 2026
109e1bd
fix(api): stop forcing vchordrq.probes session GUC on listless vchord…
nicoloboschi Jun 9, 2026
1296e9f
feat(api): config flag to skip storing raw document text (#2061) (#2062)
nicoloboschi Jun 9, 2026
4dc149a
Release v0.8.1
nicoloboschi Jun 9, 2026
3069bb4
docs: changelog and blog post for v0.8.1 (#2080)
nicoloboschi Jun 9, 2026
d7ff44b
chore(integrations): apply CI ruff formatting to haystack + roo-code …
nicoloboschi Jun 9, 2026
d5df9ad
blog: Cline persistent memory (lifecycle hooks, no MCP) (#2085)
benfrank241 Jun 9, 2026
ba44e02
docs(icons): use real Cline brand mark in place of placeholder (#2086)
benfrank241 Jun 9, 2026
c6dd089
feat(cursor-cli): ship as pip-installable hindsight-cursor-cli packag…
benfrank241 Jun 9, 2026
1c133db
release(cursor-cli): v0.2.0
benfrank241 Jun 9, 2026
36e31c6
feat(cline): ship as pip-installable hindsight-cline package (#2088)
benfrank241 Jun 9, 2026
4cb7817
release(cline): v0.2.0
benfrank241 Jun 9, 2026
22ae72a
feat(api): support gemini-embedding-2 family (per-input embedding) (#…
nicoloboschi Jun 9, 2026
91d767c
feat(cursor): add Hindsight memory plugin for Cursor (#866)
DK09876 Jun 9, 2026
a67a8f7
fix(obsidian): mirror plugin to a dedicated repo instead of releasing…
benfrank241 Jun 9, 2026
37a20ec
fix(ci): use OBSIDIAN_DIST_TOKEN for the obsidian mirror push (#2091)
benfrank241 Jun 9, 2026
3f025c1
release(cursor): v0.2.0
benfrank241 Jun 9, 2026
8540203
fix(ci): override git auth with OBSIDIAN_DIST_TOKEN for obsidian mirr…
benfrank241 Jun 9, 2026
41b6e57
blog: Hindsight is the fastest-growing open-source AI memory project …
cdbartholomew Jun 9, 2026
c815329
chore(cursor): ruff-format drift in cursor integration tests (#2095)
benfrank241 Jun 9, 2026
68d947b
docs(integrations): add Gemini Spark page + grid entry (#1779) (#1943)
r266-tech Jun 9, 2026
9691007
fix(ci): npm provenance 409 guard + add Obsidian MIT LICENSE (#2094)
benfrank241 Jun 9, 2026
0280b34
feat(ui): export constellation as a shareable SVG poster (#2099)
nicoloboschi Jun 10, 2026
a942b1c
feat(api): add Gemini Batch API support for retain fact extraction (#…
nicoloboschi Jun 10, 2026
27cb1c6
Support service_tier selection for Amazon Bedrock (#2098)
mobilinkd Jun 10, 2026
90ee101
fix(reflect): carry directives + language rule into final synthesis p…
nicoloboschi Jun 10, 2026
0d55a9b
feat(api): per-bank LLM connectivity probe (#2034)
nicoloboschi Jun 10, 2026
a0d9140
docs: add gemini embedding 2 models (#2090)
r266-tech Jun 10, 2026
fd848a1
blog: add truncate markers to oh-my-pi and 10k-stars posts (#2065)
benfrank241 Jun 10, 2026
a0e6bed
refactor(memory-defense): per-bank regex defense, webhooks, drop dead…
nicoloboschi Jun 10, 2026
82c7df7
feat(providers): add native Nous Portal provider (Codex-style OAuth, …
nicoloboschi Jun 10, 2026
fb16fc4
feat(api): per-bank provider cost attribution via OpenAI user field (…
sireika Jun 10, 2026
fe404ef
feat(obsidian): grounded-note citations, collapsed-by-default, persis…
benfrank241 Jun 10, 2026
61f980f
chore(obsidian): bump manifest + versions to 0.1.1
benfrank241 Jun 10, 2026
a814b97
release(obsidian): v0.1.1
benfrank241 Jun 10, 2026
1d1f718
feat(embed): seed .env configs from bundled .env.example template (#2…
nicoloboschi Jun 10, 2026
c06e85b
fix(obsidian): clear community-store review for 0.1.2 + asset attesta…
benfrank241 Jun 10, 2026
51d25d8
release(obsidian): v0.1.2
benfrank241 Jun 10, 2026
de22b60
feat(memory): reversible curation — edit/invalidate/revert memory uni…
nicoloboschi Jun 10, 2026
72d9881
fix(cli): parse get-memory response correctly (#2111)
nicoloboschi Jun 10, 2026
621ab7e
fix(api): widen history bank_id to TEXT on PostgreSQL (#2106) (#2110)
nicoloboschi Jun 10, 2026
5b5188a
blog: Flowise persistent memory (three Tool nodes for any chatflow) (…
benfrank241 Jun 10, 2026
0a74ce3
fix(docs): read observation history before curating facts in memories…
DK09876 Jun 10, 2026
f83fafa
refactor(haystack): rename HindsightToolset -> HindsightMemoryWrapper…
DK09876 Jun 10, 2026
a1228ec
release(haystack): v0.1.1
Jun 10, 2026
0afa046
fix(migrations): catch CommandError-wrapped ResolutionError in rollin…
bionicbutterfly13 Jun 11, 2026
07c85da
fix(api): cancel abandoned recall & reflect via cooperative cancellat…
nicoloboschi Jun 11, 2026
e0221ca
docs: flag Intel (x86_64) macOS as slim-only in supported-platforms g…
nicoloboschi Jun 11, 2026
4e7780e
feat(retain): chunk JSONL at line boundaries (#2126)
nicoloboschi Jun 11, 2026
bc83eac
chore(embed): drop unused HINDSIGHT_EMBED_BANK_ID + fix HINDSIGHT_EMB…
nicoloboschi Jun 11, 2026
19e607b
fix(api): make recall/reflect disconnect cancellation actually work (…
nicoloboschi Jun 11, 2026
b83f621
fix(docs): credit cursor-cli integration to its community author (@Ko…
benfrank241 Jun 11, 2026
259c82e
feat(memory-defense): accept full 7-detector vocabulary in parser
chrislatimer Jun 11, 2026
e8884bc
docs: remove broken gitcgr code-graph badge (#2133)
benfrank241 Jun 11, 2026
4032b27
feat(embed): local control center web app (#2132)
nicoloboschi Jun 11, 2026
c96106c
chore: remove dead code and stale config (#2135)
Sanderhoff-alt Jun 11, 2026
b5f9741
refactor(memory-defense): accept any detector name instead of a fixed…
nicoloboschi Jun 11, 2026
8e6dc5f
fix(control-plane): drop empty meeting-note message that failed local…
nicoloboschi Jun 11, 2026
b385393
feat(consolidation): per-scope observation limits (#2140)
nicoloboschi Jun 11, 2026
5b9027e
Merge remote-tracking branch 'upstream/main' into feat/parser-accept-…
nicoloboschi Jun 11, 2026
f15b93f
fix(broken tests)
chrislatimer Jun 11, 2026
b08f434
feat(observations): enumerate + filter + visualize observation scopes…
nicoloboschi Jun 11, 2026
9197498
blog: 763,365 downloads in 30 days: Hindsight crosses 1M (#2134)
benfrank241 Jun 11, 2026
54e1242
docs(superagent): add prerequisites to integration quick start (#2137)
benfrank241 Jun 11, 2026
443cce8
docs(integrations): use the Gemini logo for Gemini Spark, not the gen…
benfrank241 Jun 11, 2026
f5a6c30
feat(agent-framework): Hindsight memory for Microsoft Agent Framework…
benfrank241 Jun 11, 2026
e24614d
blog: Haystack persistent memory (drop-in tools + auto-recall wrapper…
benfrank241 Jun 11, 2026
4d369a9
fix(broken tests)
chrislatimer Jun 11, 2026
7d57711
Merge remote-tracking branch 'origin/main' into feat/parser-accept-cl…
chrislatimer Jun 11, 2026
c6db44b
fix(test): update hierarchical-config count for observation_scope_lim…
DK09876 Jun 11, 2026
f304ce7
feat(webhooks): SIEM enrichment fields on MemoryDefenseEventData
chrislatimer Jun 12, 2026
87448b1
fix(webhook) missing fields in payload
chrislatimer Jun 12, 2026
f0802b8
chore(ci): enforce unused imports/vars + advisory dead-code scan (#2144)
nicoloboschi Jun 12, 2026
30fb287
fix(api): normalize torch default dtype to float32 after concurrent m…
nicoloboschi Jun 12, 2026
a63a0c0
docs(api): list all 3 supported webhook event types in CreateWebhookR…
benfrank241 Jun 12, 2026
f671096
fix(consolidation): honor an observation scope limit of 0 (no new obs…
r266-tech Jun 12, 2026
d81486f
fix(control-plane): stop double-fetching graph data on bank view (#2168)
nicoloboschi Jun 12, 2026
9a5aecd
release(agent-framework): v0.1.0
benfrank241 Jun 12, 2026
ea45930
fix(docs): correct Memory Defense link after dir conversion (#2077)
nicoloboschi Jun 12, 2026
6f59a09
Release v0.8.2
nicoloboschi Jun 12, 2026
a38fc34
docs: changelog and blog post for v0.8.2 (#2172)
nicoloboschi Jun 12, 2026
4835bf7
docs: add Memory Defense + missed items to 0.8.2 blog post (#2173)
nicoloboschi Jun 12, 2026
42e7260
blog: Cursor persistent memory (editor + CLI in one post) (#2171)
benfrank241 Jun 12, 2026
9be7f59
docs(models): register the nous provider so the Models page lists it …
r266-tech Jun 15, 2026
99fe231
docs(litellm): replace removed `opinion` fact-type with `observation`…
r266-tech Jun 15, 2026
3d6b19a
fix(search): use effective-time fallback (mentioned_at, occurred_end)…
r266-tech Jun 15, 2026
9500a6b
fix(opencode): drop utility re-exports from plugin entry to satisfy l…
mdbenito Jun 15, 2026
c3970cf
fix(metrics): don't count a client-disconnect cancellation as a faile…
r266-tech Jun 15, 2026
156a543
docs(reflect): align reflect_async docstring with read-only tool set …
kubaodias Jun 15, 2026
0a046f9
feat(consolidation): add "shared" observation_scopes keyword (#2202)
nicoloboschi Jun 15, 2026
20f1a77
fix(db): widen remaining live bank_id columns to TEXT on PostgreSQL (…
r266-tech Jun 15, 2026
13f3e08
fix(api): mental model delta refresh (prompt size, JSON, consolidatio…
abilliontokens Jun 15, 2026
e20a36c
feat(api): omit null fields from JSON responses where wire-safe (#2204)
nicoloboschi Jun 15, 2026
460fc63
feat(migrations): parallelize tenant schema migrations (#2203)
nicoloboschi Jun 15, 2026
59d5319
feat(retain): make structured chunk size configurable (#2139)
Sanderhoff-alt Jun 15, 2026
d382b34
feat(api): dry-run fact extraction endpoint (preview, no persistence)…
nicoloboschi Jun 15, 2026
989f30e
fix typescript shared observation scope (#2207)
koriyoshi2041 Jun 15, 2026
78b1df8
blog(gemini-spark): Gemini Spark persistent memory via MCP (#2208)
benfrank241 Jun 15, 2026
359b2bc
feat(zapier): add Hindsight Zapier app (actions + REST Hook triggers)…
benfrank241 Jun 15, 2026
c05ab91
feat(continue): add Continue.dev integration via HTTP context provide…
DK09876 Jun 15, 2026
abc1439
fix(skill-docs): convert all admonition keywords in the docs→skill ge…
r266-tech Jun 16, 2026
946af18
fix(curation): drop the embedding column from invalidated_memory_unit…
nicoloboschi Jun 16, 2026
d0c5456
feat(api): improve Chinese temporal query parsing (#2220)
Sanderhoff-alt Jun 16, 2026
8927ab7
perf(api): index memory_links.bank_id on PostgreSQL (#2223)
zommiommy Jun 16, 2026
a92e25b
fix(api): gate dry-run extraction behind the operation precheck (#2211)
r266-tech Jun 16, 2026
5e71ceb
fix(docs): deflake memories.py example by draining async ops between …
benfrank241 Jun 16, 2026
4d799b5
test: pin migration-remaining-bankid tests to one xdist worker (#2225)
nicoloboschi Jun 16, 2026
0135fa3
fix(mcp): give update_memory/invalidate_memory non-empty descriptions…
bluecrayon52 Jun 16, 2026
08cfa5d
test(control-plane): validate t() keys resolve against the catalog (#…
nicoloboschi Jun 16, 2026
2f075de
feat(tags): officially surface tags_match=exact across UI, docs, clie…
nicoloboschi Jun 16, 2026
3fae76e
fix(migrations): merge two divergent alembic heads (#2234)
nicoloboschi Jun 16, 2026
e6b2e4c
test: unregister engine span recorder on fixture teardown (#2229) (#2…
nicoloboschi Jun 16, 2026
3b3f9de
revert(worker): trust schemas_with_pending_work() result, drop per-po…
nicoloboschi Jun 16, 2026
dff223f
docs: update configuration guidance (#2228)
Sanderhoff-alt Jun 16, 2026
60fea4c
docs: fix stale documentation links (#2221)
Sanderhoff-alt Jun 16, 2026
0ca0226
fix(control-plane): expose "shared" observation scope in the Add Docu…
r266-tech Jun 16, 2026
a25b027
blog(obsidian): Chat With Your Obsidian Vault, grounded in your notes…
benfrank241 Jun 16, 2026
1c9ba0e
feat(composio): add Composio integration (Hindsight memory as custom …
benfrank241 Jun 16, 2026
2d08352
release(composio): v0.1.0
benfrank241 Jun 16, 2026
cf3bcee
chore(control-plane): format bank-selector.tsx (lint drift from #2212…
DK09876 Jun 17, 2026
ea8d880
Add TypeScript client version helper (#2252)
koriyoshi2041 Jun 17, 2026
7b17da7
Strip reasoning tags on non-structured output + unclosed blocks (#2195)
grimmjoww Jun 17, 2026
ca2ce5c
fix(api): reject empty/whitespace content in dry-run extraction befor…
r266-tech Jun 17, 2026
bf73a1d
docs(embed): document control center commands (#2151)
r266-tech Jun 17, 2026
a32ecfe
docs(paperclip): document dynamicBankId / bankId / user granularity (…
r266-tech Jun 17, 2026
9681d96
Add Python client get_version helper (#2256)
nicoloboschi Jun 17, 2026
2b521c3
fix(api): defer provider quota reset retries (#2194)
abilliontokens Jun 17, 2026
cd34efa
chore(ci): disable Dependabot version updates (#2257)
nicoloboschi Jun 17, 2026
0c9bc76
Honor CODEX_HOME for Codex auth.json location (#1874)
mdenil Jun 17, 2026
a5f4d30
fix(openclaw): always session-scope retained documents (#2259)
nicoloboschi Jun 17, 2026
12851bc
fix(claude-code-mcp): resolve venv interpreter in Windows Scripts/ la…
eldar702 Jun 17, 2026
c3bb647
claude-code: case-insensitive directoryBankMap matching on Windows (#…
eskild-boop Jun 17, 2026
4efa204
fix: template bank-id path segment in HTTP metric endpoint label (#2191)
sireika Jun 17, 2026
5ee53c5
feat(api): add optional MarkItDown OCR support (#2145)
Sanderhoff-alt Jun 17, 2026
5519329
fix(litellm): hard-cap completions with asyncio.wait_for so a hung ca…
kubaodias Jun 17, 2026
acf4d5c
log(consolidation): show call count + avg for each timing phase (#2238)
cdbartholomew Jun 17, 2026
27aa6bb
feat(mcp): add ToolAnnotations (read-only/destructive hints) to MCP t…
yunanwg Jun 17, 2026
94619ce
fix(consolidation): handle single-value source_fact_ids from LLM (#2240)
haodonp Jun 17, 2026
ce81217
feat(extensions): expose Content-Length on PrecheckContext (#2247)
cdbartholomew Jun 17, 2026
b1fe23f
feat(metrics): expose async-operation queue + consolidation backlog a…
MattJackson Jun 17, 2026
cb73790
fix(api): apply bank-config disposition + mission overlay in list_ban…
PathKnower Jun 17, 2026
aa308ad
fix(openclaw): strip runtime metadata from memory content (#1968)
de1tydev Jun 17, 2026
44972d3
fix(mcp): omit reflect tool_trace/llm_trace from responses by default…
yunanwg Jun 17, 2026
d68bd07
Add Gemini service tier config (#2251)
r266-tech Jun 17, 2026
2fb2de1
feat(embeddings): detect Intel XPU for local embedding acceleration (…
nicoloboschi Jun 17, 2026
9bde153
docs: document MCP trace and precheck content length (#2264)
r266-tech Jun 17, 2026
d8665d7
test(openclaw): update agent_end hook tests for stripped context syst…
nicoloboschi Jun 17, 2026
9e47759
test(retain): add retain_structured_chunk_size to quota-defer test co…
nicoloboschi Jun 17, 2026
81865bf
fix(retain): stop dropping chunks when an oversized doc splits into m…
nicoloboschi Jun 17, 2026
ae2532b
Hide Windows netstat port probes (#2263)
koriyoshi2041 Jun 17, 2026
70804fe
Update integrations.json (#2268)
yugandhar-maram Jun 17, 2026
faaa97d
docs(observations): stop claiming a per-observation freshness trend (…
benfrank241 Jun 17, 2026
efa37cb
release(opencode): v0.2.6
DK09876 Jun 17, 2026
539101a
feat(zed): add Zed editor integration (MCP context server + recall/re…
DK09876 Jun 17, 2026
52cb9a2
chore(dev): register continue/zed/openhands in changelog generator
DK09876 Jun 17, 2026
b8cfddd
release(zed): v0.1.0
DK09876 Jun 17, 2026
55f70e1
fix(docs): make integrations.json strict-valid (drop trailing comma)
DK09876 Jun 17, 2026
ef54883
blog(freshness): Freshness-Aware Memory — knowing when a belief has g…
benfrank241 Jun 17, 2026
65862c4
feat(openhands): add OpenHands integration (native MCP config + recal…
DK09876 Jun 17, 2026
f4a0a31
chore(deps): fix critical/high Dependabot alerts (#2278)
dcbouius Jun 18, 2026
8426b0c
fix(tests): isolate backsweep migration pg0 state (#2282)
Sanderhoff-alt Jun 18, 2026
39abf0a
fix(tests): wait for testcontainers port mappings (#2283)
Sanderhoff-alt Jun 18, 2026
f4bac2d
fix(mcp): restore custom tool instructions (#2288)
Sanderhoff-alt Jun 18, 2026
da2125c
feat(metrics): instrument async worker completion path with operation…
kubaodias Jun 18, 2026
e1014cc
Release v0.8.3
nicoloboschi Jun 18, 2026
2bd6be8
docs: changelog and blog post for v0.8.3 (#2290)
nicoloboschi Jun 18, 2026
a7f8245
test(retain): serialize multichunk sub-batch coverage test on worker_…
nicoloboschi Jun 18, 2026
731add1
fix(docs): correct agrasandhany integration icon and ownership (#2294)
benfrank241 Jun 18, 2026
1c0c53c
blog(agent-framework): Total Recall — persistent memory for Microsoft…
benfrank241 Jun 18, 2026
7340b41
sync(hindsight): merge upstream vectorize-io 0.8.3 into Blockcast main
kkroo Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 15 additions & 1 deletion .claude/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ For each non-trivial change:
If any files in `hindsight-integrations/` were added or changed, verify:
- **Tests exist** — the integration must have tests that simulate/exercise the external framework (not just pure unit tests of helpers). Check for a `tests/` directory with meaningful test files.
- **CI job exists** — check `.github/workflows/test.yml` for a corresponding `test-<name>-integration` job. If missing, flag it.
- **Release process** — check that the integration name is in the `VALID_INTEGRATIONS` array in `scripts/release-integration.sh`. If missing, flag it.
- **Release process** — check that the integration name is in the `VALID_INTEGRATIONS` array in `scripts/release-integration.sh` AND in the `INTEGRATIONS` dict in `hindsight-dev/hindsight_dev/generate_changelog.py` (the changelog generator keeps its own list; a release fails at the changelog step if the name is missing there). If either is missing, flag it.
- **Docs gallery + sidebar entry** — the integration must have an entry in `hindsight-docs/src/data/integrations.json`. This file is the **single source of truth** that drives both the integrations gallery and the docs sidebar (the sidebar category is injected from it at render time across all docs versions). The entry needs an internal `/sdks/integrations/<slug>` `link` and a matching page at `hindsight-docs/docs-integrations/<slug>.md(x)`. The `hindsight-docs/scripts/check-integrations.mjs` build step enforces both directions — forward: every internal JSON entry has a doc page; reverse: every released tag (`integrations/<name>/vX.Y.Z`) appears in the JSON (private infra like `cloudflare-oauth-proxy` is in the script's `EXCLUDED` set). Flag any integration that is released (or being released) but missing from `integrations.json`, and any JSON entry without a doc page. Do **not** hand-edit `versioned_sidebars/*.json` to add integration links — they are positional placeholders filled from the JSON.
- **Code standards** — the integration code must follow all Python style rules (type hints, no raw dicts, no tuple returns, etc.).

### 10. Check MCP tool registration completeness
Expand All @@ -191,6 +192,18 @@ If a migration adds a new PostgreSQL table (look for `CREATE TABLE` / `op.create
- The guard test `test_backup_tables_covers_entire_schema` in `tests/test_admin_backup_restore.py` enforces this — flag it as a **must fix** if a new table is absent from `BACKUP_TABLES`.
- Oracle-only tables (e.g. `observation_sources`) are intentionally excluded — admin backup/restore is PostgreSQL-only.

### 11b. Check new config flags update the env template

If the diff adds a new configuration field (a new `ENV_*` / `HINDSIGHT_*` env var
in `hindsight-api-slim/hindsight_api/config.py`):
- **`.env.example`** (repo root) — must add the variable (commented if optional)
alongside the docs entry in `hindsight-docs/docs/developer/configuration.md`.
A flag added to `config.py` but absent from `.env.example` is a **should fix**.
- **`hindsight-embed/hindsight_embed/env.example`** — the bundled copy must stay
byte-identical to the repo-root `.env.example` (it seeds embed/profile configs).
The `test_bundled_template_matches_repo_root` sync test fails on drift; if the
root file changed without re-copying, flag it as a **must fix**.

### 12. Review against other coding standards

Check the diff for violations of the standards listed above:
Expand All @@ -217,6 +230,7 @@ Present a clear summary organized by severity:
- Direct DB access (raw SQL / `acquire_with_retry` / `fq_table`) in an `api/` handler instead of a `MemoryEngine` method
- Tenant-scoped data accessed without authentication enforced in the engine (`_authenticate_tenant` / `get_bank_profile`)
- New integration missing tests, CI job, or release-integration.sh entry
- Released/added integration missing from `hindsight-docs/src/data/integrations.json`, or a JSON entry with no `docs-integrations/<slug>` page (fails the docs build via `check-integrations.mjs`)
- New PostgreSQL table missing from `BACKUP_TABLES` in `admin/cli.py` (silent data loss on restore)

**Should fix** — issues that hurt code quality:
Expand Down
116 changes: 116 additions & 0 deletions .claude/skills/hs-release/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
---
name: hs-release
description: Cut a core Hindsight release (vX.Y.Z) and open the changelog + blog PR. Use when asked to cut/start a release, bump the version, or publish a new Hindsight version.
user_invocable: true
---

# Hindsight Release

Cut a **core** Hindsight release and open the accompanying changelog/blog PR. This is for the core
product version (API, clients, CLI, control plane, Helm). **Integrations are versioned
independently** — use `scripts/release-integration.sh` for those, not this skill.

The release is **irreversible and outward-facing**: it tags a version and pushes it straight to
`main`, which triggers CI that publishes packages to PyPI / npm / Helm. Confirm the version number
and that the intended fixes are already merged to `main` before you start.

## Step 0 — Pre-flight

1. **Decide the base.** A release is cut from the latest `origin/main`, never from a feature
branch. `git fetch origin --tags` first. Confirm the "couple of fixes" the user means are
actually merged to `main` (`git log v<prev>..origin/main --oneline`).
2. **Find where `main` is checked out.** `main` is often already checked out in a sibling worktree
(`git worktree list`). You **cannot** check out `main` in a second worktree — run the release in
the worktree that already holds it. If that worktree is dirty with throwaway cruft
(`.next-*` tsconfig paths, screenshots), `git stash push -u`, fast-forward to `origin/main`,
run the release, then `git stash pop`.
3. **Pitfall:** never pipe the checkout in an `&&` chain like
`git checkout main 2>&1 | tail && git reset --hard ...` — the pipe's exit status is `tail`'s
(always 0), so a failed checkout won't stop the chain and the `reset` fires on the **wrong
branch**. Check out as its own command and verify `git branch --show-current` before resetting.

## Step 1 — Cut the release

Run from the worktree on a clean `main`:

```bash
./scripts/release.sh <version> # e.g. 0.8.1 (no leading v)
```

`release.sh` bumps the version in every component, regenerates the OpenAPI spec + all client SDKs,
updates docs versioning, commits `Release v<version>`, tags `v<version>`, and **pushes the commit
and tag directly to `main`**. The push triggers the `Release` GitHub Actions workflow that builds
and publishes the packages. It is **not** a PR.

Verify after: `gh run list --limit 5` should show the `Release v<version>` workflow running, and
`git ls-remote --tags origin v<version>` should return the tag.

## Step 2 — Changelog + blog PR (separate)

Done **after** the tag exists, as its own PR (precedent: v0.8.0 = #2053, v0.8.1 = #2080). Work on a
branch off the new `main`:

```bash
git checkout -b docs-changelog-<version> origin/main
```

Only spin up a separate worktree (`git worktree add ../hindsight-changelog-<version> -b
docs-changelog-<version> origin/main`) if you can't get a clean checkout otherwise — e.g. `main` is
held in another worktree and the current one has work you don't want to disturb.

**Branch naming:** use the `docs-` (hyphen) convention, e.g. `docs-changelog-0.8.1`. A remote
branch literally named `docs` exists, so any `docs/...` branch is rejected on push with
`directory file conflict`.

### Changelog

```bash
uv run --directory hindsight-dev generate-changelog <version>
```

LLM-summarizes the commits between the previous tag and `v<version>` and prepends an entry to
`hindsight-docs/src/pages/changelog/index.md`. Requires `OPENAI_API_KEY` (already in the repo
`.env`). It excludes `hindsight-integrations/` source, but new integrations whose commits also
touched docs will still appear — that matches precedent, leave them in the **changelog**.

### Blog post

Hand-write `hindsight-docs/blog/YYYY-MM-DD-version-X-Y-Z.md` (mirror an existing one; patch
releases are short — see `2026-06-02-version-0-7-2.md`). Guidance:

- **Explain user impact, not internals/mechanism.** Lead with what the user can now do and what to
set. Config/env-var names are fine (developer-facing), code symbols and internals are not.
- **Do not list integrations in the release blog.** The core blog covers core engine / API /
ops changes; each integration ships its own changelog. (Integrations may still appear in the
generated `changelog/index.md` — that's fine; just keep them out of the blog.)
- Call out an upgrade recommendation when there are operational/data-integrity fixes.
- Validate formatting: `npx prettier --check <blog file>`.

### Sync the docs skill

```bash
./scripts/generate-docs-skill.sh
```

Refreshes `skills/hindsight-docs/references/changelog/index.md`. It will also bump
`skills/hindsight-docs/references/openapi.json` by one version — `release.sh` regenerates the skill
*before* bumping OpenAPI, so the skill copy lags a version in the release commit; this step syncs
it. Expect a one-line `version` diff there; keep it.

### Commit, push, PR

```bash
git add -A
git commit --no-verify -m "docs: changelog and blog post for v<version>"
git push -u origin docs-changelog-<version>
gh pr create --base main --title "docs: changelog and blog post for v<version>" --body "..."
```

Expected files in the PR: the changelog entry, the new blog post, the regenerated skill changelog
mirror, and the skill `openapi.json` version sync.

## Cleanup

If you created a temporary worktree, remove it once the PR is up
(`git worktree remove ../hindsight-changelog-<version>`; the branch stays on origin). Restore any
stash you popped in Step 0.
24 changes: 24 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ HINDSIGHT_API_LLM_BASE_URL=https://api.openai.com/v1
HINDSIGHT_API_HOST=0.0.0.0
HINDSIGHT_API_PORT=8888
HINDSIGHT_API_LOG_LEVEL=info
# Optional retain chunking override for structured logs/transcripts.
# Unset uses HINDSIGHT_API_RETAIN_CHUNK_SIZE as the structured-chunk limit.
# HINDSIGHT_API_RETAIN_STRUCTURED_CHUNK_SIZE=

# Dry-run extraction preview endpoint (POST /memories/dry-run-extract). Enabled by default; it makes
# a real LLM call but stores nothing. Set to false to remove the endpoint (returns 404).
# HINDSIGHT_API_ENABLE_DRY_RUN_EXTRACT=true

# Base Path / Reverse Proxy Support (Optional)
# Set these when deploying behind a reverse proxy with path-based routing
Expand All @@ -59,6 +66,7 @@ HINDSIGHT_API_LOG_LEVEL=info
# HINDSIGHT_API_READ_DATABASE_URL= # Optional read-replica URL. When set, recall queries (semantic, BM25, graph, temporal) flow through a separate pool against this URL, offloading the primary. Typically points to a read-only endpoint (CNPG's <cluster>-ro service or Aurora reader endpoint).
# HINDSIGHT_API_MIGRATION_DATABASE_URL= # Direct PostgreSQL URL for migrations (bypasses PgBouncer). Falls back to DATABASE_URL.
# HINDSIGHT_API_DATABASE_SCHEMA=public # PostgreSQL schema name (default: public)
# HINDSIGHT_API_MIGRATION_CONCURRENCY=1 # Tenant schemas to migrate concurrently (PG only, each in its own process; per-schema work stays sequential). Each worker has ~1-2s startup cost + uses ~3 DB connections, so it only pays off with many schemas (tens+) or slow migrations; keep concurrency*3 <= spare max_connections. Default: 1 (sequential).

# Vector Extension (Optional - uses pgvector by default)
# Options: "pgvector" (default), "vchord", "pgvectorscale" (DiskANN)
Expand All @@ -79,6 +87,18 @@ HINDSIGHT_API_LOG_LEVEL=info
# korean_lindera/lindera(korean), ngram(min,max), edge_ngram(min,max)
# HINDSIGHT_API_TEXT_SEARCH_EXTENSION_PG_SEARCH_TOKENIZER=

# File Parser (Optional - uses markitdown by default)
# HINDSIGHT_API_FILE_PARSER=markitdown
# Enable image OCR for MarkItDown using an OpenAI-compatible OCR/vision endpoint.
# These OCR settings are independent from HINDSIGHT_API_LLM_* because MarkItDown
# uses the OpenAI SDK directly and requires Chat Completions image input support.
# When OCR is enabled, API_KEY, BASE_URL, and MODEL are required.
# HINDSIGHT_API_FILE_PARSER_MARKITDOWN_OCR_ENABLED=false
# HINDSIGHT_API_FILE_PARSER_MARKITDOWN_OCR_API_KEY=
# HINDSIGHT_API_FILE_PARSER_MARKITDOWN_OCR_BASE_URL=
# HINDSIGHT_API_FILE_PARSER_MARKITDOWN_OCR_MODEL=
# HINDSIGHT_API_FILE_PARSER_MARKITDOWN_OCR_PROMPT=

# Embeddings Configuration (Optional - uses local by default)
# Provider: "local" (default), "onnx", "tei", "openai", "cohere", "google", "openrouter", "zeroentropy", "litellm", or "litellm-sdk"
# HINDSIGHT_API_EMBEDDINGS_PROVIDER=local
Expand Down Expand Up @@ -142,6 +162,10 @@ HINDSIGHT_API_LOG_LEVEL=info
# Custom service name and environment (optional, defaults: hindsight-api, development)
# HINDSIGHT_API_OTEL_SERVICE_NAME=hindsight-production
# HINDSIGHT_API_OTEL_DEPLOYMENT_ENVIRONMENT=production
#
# Expose async-operation queue + consolidation-backlog gauges on /metrics.
# Runs periodic per-schema COUNT queries on a background task (disabled by default).
# HINDSIGHT_API_METRICS_BACKLOG_ENABLED=true

# -----------------------------------------------------------------------------
# Control Plane (Optional)
Expand Down
6 changes: 0 additions & 6 deletions .github/dependabot.yml

This file was deleted.

2 changes: 2 additions & 0 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # fetch tags so check-released-integrations can see them
- uses: actions/setup-node@v6
with:
node-version: 20
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/perf-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ on:
- retain
- recall
- recall-with-observations
- recall-temporal
- consolidation
- graph-maintenance
default: ""
Expand Down
78 changes: 76 additions & 2 deletions .github/workflows/release-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ jobs:
publish:
runs-on: ubuntu-latest
permissions:
id-token: write # for PyPI trusted publishing
id-token: write # for PyPI trusted publishing + build-provenance attestations
attestations: write # for actions/attest-build-provenance (Obsidian assets)
# No `contents: write`: we never create releases in this repo. The Obsidian
# plugin's distribution release is pushed to its dedicated repo using
# OBSIDIAN_DIST_TOKEN (see the "Mirror Obsidian plugin" step below).

steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -112,6 +116,71 @@ jobs:
working-directory: ./hindsight-integrations/${{ steps.info.outputs.integration }}
run: npm run build

# Build-provenance attestations for the Obsidian release assets (community-store
# recommendation). Runs after the build so main.js exists. The assets are
# released in the dedicated repo while the build runs here, so users verify at
# owner scope: `gh attestation verify main.js --owner vectorize-io`.
- name: Attest Obsidian plugin build provenance
if: steps.type.outputs.type == 'typescript' && steps.info.outputs.integration == 'obsidian'
uses: actions/attest-build-provenance@v2
with:
subject-path: |
hindsight-integrations/obsidian/main.js
hindsight-integrations/obsidian/styles.css

# ── Obsidian plugin — mirror to its dedicated repo + cut the BRAT release ──
# We do NOT create a GitHub Release in this monorepo: per-integration
# releases pollute the repo's release list (it's for the core product) and
# steal the "Latest" badge, and BRAT / the community store read a repo's
# *latest* release — not a tag — so they can't target a tag in a monorepo.
#
# Instead this monorepo stays the source of truth, and on each obsidian
# release we mirror hindsight-integrations/obsidian/ → the *root* of
# github.com/vectorize-io/hindsight-obsidian (git subtree, history
# preserved) and cut the BRAT / community-store release *there*.
#
# Requires secret OBSIDIAN_DIST_TOKEN — a token with `contents: write` on
# vectorize-io/hindsight-obsidian (fine-grained PAT or app installation
# token). The dedicated repo is generated; never edit it directly.
- name: Mirror Obsidian plugin to its dedicated repo
if: steps.type.outputs.type == 'typescript' && steps.info.outputs.integration == 'obsidian'
env:
DIST_TOKEN: ${{ secrets.OBSIDIAN_DIST_TOKEN }}
run: |
set -euo pipefail
VERSION="${{ steps.info.outputs.version }}"
DIST_REPO="vectorize-io/hindsight-obsidian"
OBS_DIR="hindsight-integrations/obsidian"

# `git subtree split` needs full history; the default checkout is shallow.
git fetch --unshallow 2>/dev/null || true
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

# The runner injects the default GITHUB_TOKEN as an http.extraheader via
# an *included* config file (/home/runner/work/_temp/git-credentials-*.config),
# so `git config --local --unset-all` can't remove it and it authenticates
# the push as github-actions[bot] (no access to the dedicated repo → 403).
# The documented way to drop an inherited extraheader is to RESET the list
# with an empty value: since command-line `-c` is read last, the empty
# value clears the accumulated headers (including the included one) at
# request-build time. The dist token then comes from the push URL → a
# single Authorization header.
git subtree split --prefix="$OBS_DIR" -b _obs_dist
git -c "http.https://github.com/.extraheader=" \
push "https://x-access-token:${DIST_TOKEN}@github.com/${DIST_REPO}.git" _obs_dist:main

# Cut the BRAT / community-store release. Bare version tag (e.g. 0.1.0)
# to match manifest.json — idempotent so re-runs just refresh the assets.
export GH_TOKEN="$DIST_TOKEN"
ASSETS="$OBS_DIR/main.js $OBS_DIR/manifest.json $OBS_DIR/styles.css"
NOTES="Hindsight for Obsidian v${VERSION}. Install via BRAT (add ${DIST_REPO}) or copy main.js/manifest.json/styles.css into <vault>/.obsidian/plugins/hindsight/."
if gh release view "$VERSION" --repo "$DIST_REPO" >/dev/null 2>&1; then
gh release upload "$VERSION" $ASSETS --repo "$DIST_REPO" --clobber
else
gh release create "$VERSION" $ASSETS --repo "$DIST_REPO" --title "$VERSION" --notes "$NOTES"
fi

- name: Publish TypeScript package to npm
if: steps.type.outputs.type == 'typescript'
working-directory: ./hindsight-integrations/${{ steps.info.outputs.integration }}
Expand All @@ -121,7 +190,12 @@ jobs:
EXIT_CODE=$?
echo "$OUTPUT"
if [ $EXIT_CODE -ne 0 ]; then
if echo "$OUTPUT" | grep -q "cannot publish over"; then
# Treat "already published" as success so re-pointed-tag re-runs stay green.
# "cannot publish over" = the version exists. TLOG_CREATE_ENTRY_ERROR / 409
# "equivalent entry already exists in the transparency log" = the identical
# --provenance artifact was already logged on a prior run (Sigstore tlog is
# idempotent); the package is published, so this is benign.
if echo "$OUTPUT" | grep -qE "cannot publish over|TLOG_CREATE_ENTRY_ERROR|already exists in the transparency log"; then
echo "Package version already published, skipping..."
exit 0
fi
Expand Down
Loading
Loading