Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
163 commits
Select commit Hold shift + click to select a range
42c4c6e
[integrations] delete_thought MCP
txcfi-scott Apr 23, 2026
af8dfd8
[integrations] delete_thought: expand Verify into numbered steps
txcfi-scott Apr 23, 2026
39601b5
[integrations] Fix per-request McpServer instantiation for stable MCP…
yuens1002 May 4, 2026
8f05663
[integrations] Add stateless transport test (no infra required)
yuens1002 May 4, 2026
c0b92f7
[integrations] Indent buildServer() body consistently
yuens1002 May 4, 2026
5c76bdd
Add config-driven extension hook for sidebar
msykes May 12, 2026
e890116
[schemas] Fix typed-reasoning-edges COMMENT ON syntax error
lucifer May 14, 2026
4f8516d
[recipes] Add gmail-smart-pull core puller + sensitivity + parsing
alanshurafa Apr 21, 2026
e9a11d5
[recipes] Add atomize-text lib with stdin-piped prompts + codex provider
alanshurafa Apr 21, 2026
5985e80
[recipes] Add gmail-smart-pull migrations: merge_thought_metadata + c…
alanshurafa Apr 21, 2026
f5dd006
[recipes] Add gmail-smart-pull README + metadata.json
alanshurafa Apr 21, 2026
0993b3f
[recipes] Fix REVIEW-CODEX-P1-1: drop service_role key from credentia…
alanshurafa Apr 21, 2026
947ad38
[recipes] Fix REVIEW-CODEX-P1-2: harden Gmail OAuth callback (state +…
alanshurafa Apr 21, 2026
3be1646
[recipes] Fix REVIEW-CODEX-P1-3: add missing high-risk secret pattern…
alanshurafa Apr 21, 2026
8955e13
[recipes] Fix REVIEW-CODEX-P1-4: remove default codex sandbox bypass …
alanshurafa Apr 21, 2026
464751f
[recipes] Fix smoke-test finding: AWS secret regex misses kvp form
alanshurafa Apr 22, 2026
c26e593
[docs] Fix pre-existing markdownlint errors across 8 files
alanshurafa Apr 22, 2026
30cbcb9
[schemas] Smart ingest pipeline tables
alanshurafa Apr 6, 2026
441cb42
fix: restrict evidence append to service_role and add row locking
alanshurafa Apr 6, 2026
6e66c7b
[schemas] Fix REVIEW-WARNING-2: correct README prerequisites
alanshurafa Apr 18, 2026
aa0c794
[schemas] Fix REVIEW-WARNING-5: add user_id columns for multi-tenant
alanshurafa Apr 18, 2026
6317489
[schemas] Fix REVIEW-WARNING-1: enable RLS on ingestion tables
alanshurafa Apr 18, 2026
2265b47
[schemas] Fix REVIEW-WARNING-3: add partial indexes for queue hot path
alanshurafa Apr 18, 2026
2ee703a
[schemas] Fix REVIEW-WARNING-4: document job-claim semantics
alanshurafa Apr 18, 2026
f9cd161
[docs] Fix pre-existing markdownlint errors across 8 files
alanshurafa Apr 22, 2026
7ea95c8
[skills] Auto-capture Claude Code adapter
alanshurafa Apr 6, 2026
cdbe9c4
[skills] Fix REVIEW-BLOCKER-1: add fetch timeout via AbortController
alanshurafa Apr 18, 2026
9c47255
[skills] Fix REVIEW-BLOCKER-2: only retry 5xx/429/network, drop 4xx
alanshurafa Apr 18, 2026
5062802
[skills] Fix REVIEW-HIGH-1: use fileURLToPath + OB_PROJECT_ROOT override
alanshurafa Apr 18, 2026
42fc2ac
[skills] Fix REVIEW-HIGH-2: wrap transcript in thought_content delimi…
alanshurafa Apr 18, 2026
f7a7dd1
[skills] Fix REVIEW-HIGH-3: credit upstream skill author + add create…
alanshurafa Apr 18, 2026
445b47b
[skills] Fix REVIEW-MEDIUM-2: drop dead buildSessionSummary + docs pr…
alanshurafa Apr 18, 2026
4bcfcc0
[skills] Fix REVIEW-MEDIUM-3: include import_key in both POST payloads
alanshurafa Apr 18, 2026
b16332d
[docs] Fix pre-existing markdownlint errors across 8 files
alanshurafa Apr 22, 2026
119929e
[schemas] Fix REVIEW-BLOCKER-1: align README with SQL defaults
alanshurafa Apr 18, 2026
605e783
[schemas] Fix REVIEW-BLOCKER-2: remove anon GRANT on all three RPCs
alanshurafa Apr 18, 2026
9333253
[schemas] Fix REVIEW-HIGH-2: use NOT EXISTS instead of NOT IN
alanshurafa Apr 18, 2026
2fc379b
[schemas] Fix REVIEW-HIGH-3: mark read-only RPCs as STABLE
alanshurafa Apr 18, 2026
385ba04
[schemas] Fix REVIEW-HIGH-4: make type-backfill allowlist configurable
alanshurafa Apr 18, 2026
2755735
[schemas] Fix REVIEW-MEDIUM-3: align NULL handling in restricted filter
alanshurafa Apr 18, 2026
336b6ca
[schemas] Fix REVIEW-LOW-2: bump metadata.updated to merge date
alanshurafa Apr 18, 2026
119ac66
[recipes] Brain backup and export
alanshurafa May 20, 2026
fe64827
[recipes] Thought enrichment pipeline
alanshurafa May 20, 2026
5a0adc8
[recipes] Operational monitoring and brain health
alanshurafa Apr 6, 2026
78cada7
[recipes] Fix REVIEW-HIGH-1 (SQL): guard optional views behind to_reg…
alanshurafa Apr 18, 2026
d9d9405
[recipes] Fix REVIEW-HIGH-1 (README): correct companion schema paths
alanshurafa Apr 18, 2026
3ff5306
[recipes] Fix REVIEW-MEDIUM-1: filter restricted thoughts from previe…
alanshurafa Apr 18, 2026
73f1047
[integrations] Consolidation workers (bio + metadata) with Wave 2.5 h…
alanshurafa Apr 18, 2026
b7a5058
[integrations] REST API gateway
alanshurafa Apr 6, 2026
e70a697
fix: pass IDs as strings for BIGINT safety and handle upsert response…
alanshurafa Apr 6, 2026
8769397
[integrations] Fix CR-03: timing-safe auth comparison
alanshurafa Apr 18, 2026
4812c40
[integrations] Fix WR-01: scoped CORS + per-key rate limiting
alanshurafa Apr 18, 2026
60586b2
[integrations] Fix WR-02: ingest proxy timeout, size cap, error handling
alanshurafa Apr 18, 2026
692734b
[integrations] Fix WR-04: whitelist /thoughts sort columns
alanshurafa Apr 18, 2026
62a0341
[integrations] Fix WR-07: opaque error responses with correlation ID
alanshurafa Apr 18, 2026
a77389b
[integrations] Fix WR-11: re-detect sensitivity on thought update
alanshurafa Apr 18, 2026
f16edd9
[integrations] Enhanced MCP server with alpha tool suite
alanshurafa Apr 6, 2026
f84a307
[integrations] Fix REVIEW-BLOCKER-1: wrap LLM/embedding fetches in fe…
alanshurafa Apr 18, 2026
76fdb89
[integrations] Fix REVIEW-BLOCKER-2: cap LLM classifier cost on capture
alanshurafa Apr 18, 2026
12a0689
[integrations] Fix REVIEW-BLOCKER-3: stop update_thought from downgra…
alanshurafa Apr 18, 2026
af438c1
[integrations] Fix REVIEW-BLOCKER-4: cut delete_thought from initial …
alanshurafa Apr 18, 2026
1b775cd
[integrations] Fix REVIEW-HIGH-1: rename colliding tools with brain_ …
alanshurafa Apr 18, 2026
7289c86
[integrations] Fix REVIEW-HIGH-2: ops_source_monitor guard + view-saf…
alanshurafa Apr 18, 2026
570e565
[integrations] Fix REVIEW-HIGH-3: escape ILIKE wildcards in graph_search
alanshurafa Apr 18, 2026
76cfa4c
[integrations] Fix REVIEW-HIGH-4: timing-safe auth + drop ?key= query…
alanshurafa Apr 18, 2026
b651db0
[integrations] Fix REVIEW-HIGH-5: date-filter correctness in semantic…
alanshurafa Apr 18, 2026
129646e
[integrations] Fix REVIEW-HIGH-6: document companion-schema grant pos…
alanshurafa Apr 18, 2026
4879b41
[integrations] Chrome capture extension for Claude/ChatGPT/Gemini
alanshurafa Apr 18, 2026
b4938fd
[integrations] Fix REVIEW-CODEX-P1-1: failed ingests no longer persis…
alanshurafa Apr 18, 2026
bae3bad
[integrations] Fix REVIEW-CODEX-P1-2: https + loopback-only endpoint …
alanshurafa Apr 18, 2026
75203b5
[integrations] Fix BLOCKER: API key/endpoint moved to local storage (…
alanshurafa Apr 18, 2026
c685252
[integrations] Fix REVIEW-CODEX-P2: remove dead Capture Mode toggle
alanshurafa Apr 18, 2026
d3e96ac
[integrations] Fix REVIEW-CODEX-P3: sensitivity log consistency, prun…
alanshurafa Apr 18, 2026
bfcfa37
[integrations] Fix WARNING: onInstalled auto-open on install only
alanshurafa Apr 18, 2026
a039967
[integrations] Fix WARNING: processingFingerprints Set leak
alanshurafa Apr 18, 2026
70d7991
[integrations] Document extractor fragility and known limitations
alanshurafa Apr 18, 2026
33ad9ec
[integrations] Fix REVIEW-CODEX-2-P2: local-storage fallback uses exp…
alanshurafa Apr 18, 2026
3de10bb
[integrations] Fix REVIEW-CODEX-2-P2: remove dead minResponseLength s…
alanshurafa Apr 18, 2026
4bbef1e
[integrations] Fix REVIEW-CODEX-2-P3: README matches current host per…
alanshurafa Apr 18, 2026
63fbd59
[integrations] Fix CI Rule 13: convert broken relative links to exter…
alanshurafa Apr 18, 2026
a9ff990
[integrations] Chrome ext — Phase B Gemini history capture via chrome…
alanshurafa Apr 21, 2026
5b9dfe5
[integrations] Chrome ext — Phase C Gemini Sync All orchestrator + tests
alanshurafa Apr 21, 2026
188870d
[integrations] Chrome ext — wire Gemini sync into service worker
alanshurafa Apr 21, 2026
644cb24
[integrations] Chrome ext — Gemini Sync All UI (Sync/Resume/Cancel)
alanshurafa Apr 21, 2026
d9f0e80
[integrations] Chrome ext — document Gemini bulk sync + bump to 1.1.0
alanshurafa Apr 21, 2026
b6c2e98
[integrations] Fix REVIEW-CODEX-P1-2: sync tab health check no longer…
alanshurafa Apr 21, 2026
0b7d43f
[integrations] Fix REVIEW-CODEX-P1-4: close syncInFlight race in resu…
alanshurafa Apr 21, 2026
5e9a664
[integrations] Fix REVIEW-CODEX-P2: waiter replace leak + recordCompl…
alanshurafa Apr 21, 2026
c7da48d
[integrations] Fix REVIEW-CODEX-P2+P3: harden debugger body handling,…
alanshurafa Apr 21, 2026
ce25ba3
[integrations] Fix REVIEW-CODEX-P2: extractor fixture tests for batch…
alanshurafa Apr 21, 2026
15bd51f
[integrations] Fix REVIEW-CODEX-R2-P1: empty-payload notify poisoning…
alanshurafa Apr 21, 2026
2c61158
[schemas] Add crm-person-tiers — relationship tier schema + dashboard…
alanshurafa Apr 21, 2026
e660059
[schemas] Fix REVIEW-P1-1: drop anon grant, switch RPC to SECURITY IN…
alanshurafa Apr 21, 2026
b5bc773
[schemas] Fix REVIEW-P1-2: compute effective_tier before pagination
alanshurafa Apr 21, 2026
1a2acf0
[schemas] Fix REVIEW-P2-P3: dashboard error handling and count clarity
alanshurafa Apr 21, 2026
6dac115
[schemas] Add brain-stats-daily — daily stats rollup + heatmap filter
alanshurafa Apr 21, 2026
f37e409
[schemas] Fix REVIEW-CLAUDE-P1-4: difficulty beginner → intermediate
alanshurafa Apr 21, 2026
16e00cc
[schemas] Fix REVIEW-CODEX-P1-1/2/3 + P2-1/2/4: SQL correctness & sec…
alanshurafa Apr 21, 2026
097ee44
[schemas] Fix REVIEW-CODEX-P2-5/6 + P3-2: encode URL, aria-current, n…
alanshurafa Apr 21, 2026
c68505b
[schemas] Fix smoke-test lifelog timeout
alanshurafa Apr 22, 2026
95c57ba
Merge branch 'main' into contrib/lucifer/typed-reasoning-edges-commen…
lucifer May 23, 2026
99c1f01
[docs] Fix OB1 gate v2 workflow runs
alanshurafa Jun 8, 2026
ca8632b
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/e…
justfinethanku Jun 11, 2026
1fd9ae4
docs: add community credit for enhanced thoughts
justfinethanku Jun 11, 2026
f15cff6
Merge pull request #191 from alanshurafa/contrib/alanshurafa/enhanced…
justfinethanku Jun 11, 2026
759624e
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/b…
justfinethanku Jun 11, 2026
d265095
docs: add community credit for brain backup
justfinethanku Jun 11, 2026
70797e1
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/b…
justfinethanku Jun 11, 2026
4dd16d7
docs: add community credit for brain health monitoring
justfinethanku Jun 11, 2026
3c9b598
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/b…
justfinethanku Jun 11, 2026
35e1b48
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/b…
justfinethanku Jun 11, 2026
8fbc5e7
Merge pull request #193 from alanshurafa/contrib/alanshurafa/brain-ba…
justfinethanku Jun 11, 2026
3a9b438
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/b…
justfinethanku Jun 11, 2026
42e759a
Merge pull request #194 from alanshurafa/contrib/alanshurafa/brain-he…
justfinethanku Jun 12, 2026
1ef4351
Merge branch 'main' into contrib/yuens1002/per-request-mcp
justfinethanku Jun 12, 2026
622ab69
Merge pull request #261 from yuens1002/contrib/yuens1002/per-request-mcp
justfinethanku Jun 12, 2026
6d1f9bc
[integrations] Add branded icon set to Chrome capture extension
alanshurafa Jun 14, 2026
1352397
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/c…
alanshurafa Jun 14, 2026
5467bfe
[integrations] Gate Gemini everSyncedIds on genuine ingest
alanshurafa Jun 14, 2026
1d7f789
Harden capture extension with ExoCortex v0.4.1 reliability fixes
alanshurafa Jun 15, 2026
0c599f4
fix: add community credit and Deno imports
justfinethanku Jun 5, 2026
db60771
Merge remote-tracking branch 'origin/main' into codex/pr-229-review
justfinethanku Jun 18, 2026
b197f90
Merge pull request #229 from txcfi-scott/contrib/txcfi-scott/delete-t…
justfinethanku Jun 18, 2026
52152a4
Merge remote-tracking branch 'origin/main' into codex/pr-303-review
justfinethanku Jun 18, 2026
f0ac377
Merge pull request #303 from lucifer/contrib/lucifer/typed-reasoning-…
justfinethanku Jun 18, 2026
bd78209
Merge remote-tracking branch 'origin/main' into contrib/alanshurafa/a…
justfinethanku Jun 18, 2026
a51c080
docs: add community credit to auto-capture adapter
justfinethanku Jun 18, 2026
b946b7f
Merge pull request #195 from alanshurafa/contrib/alanshurafa/auto-cap…
justfinethanku Jun 18, 2026
c9b4c7b
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
f50a407
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
0a4d99c
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
78b1ab4
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
158ab60
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
4babbb9
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
0cdf3bc
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
2a15199
Merge remote-tracking branch 'origin/main' into HEAD
alanshurafa Jun 18, 2026
b834150
docs: add community credit to gmail smart pull
justfinethanku Jun 19, 2026
8373a37
Merge pull request #220 from alanshurafa/contrib/alanshurafa/gmail-sm…
justfinethanku Jun 19, 2026
269451d
docs: add community credit to smart ingest schema
justfinethanku Jun 19, 2026
1b12b0c
Merge pull request #196 from alanshurafa/contrib/alanshurafa/smart-in…
justfinethanku Jun 19, 2026
20a8f58
docs: add community credit to thought enrichment
justfinethanku Jun 19, 2026
505a1bc
Merge pull request #192 from alanshurafa/contrib/alanshurafa/thought-…
justfinethanku Jun 19, 2026
63dc00e
docs: add community credit to brain stats daily
justfinethanku Jun 19, 2026
1b4626f
Merge pull request #221 from alanshurafa/contrib/alanshurafa/brain-st…
justfinethanku Jun 19, 2026
ca0ad9e
docs: add community credit to crm person tiers
justfinethanku Jun 19, 2026
c091c6e
Merge pull request #219 from alanshurafa/contrib/alanshurafa/crm-pers…
justfinethanku Jun 19, 2026
dad6374
docs: add community credit to consolidation workers
justfinethanku Jun 19, 2026
7e93949
Merge pull request #200 from alanshurafa/contrib/alanshurafa/consolid…
justfinethanku Jun 19, 2026
57856c0
[integrations] rest-api: header-only auth, drop ?key= query param
alanshurafa Jun 21, 2026
13c2374
[integrations] rest-api: document single-tenant trust model
alanshurafa Jun 21, 2026
83afa00
[integrations] enhanced-mcp: note single-tenant key + CORS rationale
alanshurafa Jun 21, 2026
2af92f6
docs: align chrome capture README with contribution conventions
justfinethanku Jun 25, 2026
3ce7fcf
docs: add community contribution credit
justfinethanku Jun 25, 2026
98cefa1
Merge pull request #288 from msykes/contrib/msykes/dashboard-extensio…
justfinethanku Jun 25, 2026
4084816
Merge pull request #218 from alanshurafa/contrib/alanshurafa/chrome-c…
justfinethanku Jun 25, 2026
671b923
Merge pull request #202 from alanshurafa/contrib/alanshurafa/enhanced…
justfinethanku Jun 25, 2026
8505c0c
docs: add community credit to rest-api README
justfinethanku Jul 3, 2026
b530543
Merge pull request #201 from alanshurafa/contrib/alanshurafa/rest-api…
justfinethanku Jul 3, 2026
6779106
Merge pull request #351 from alanshurafa/codex/fix-ob1-gate-v2-empty-…
justfinethanku Jul 3, 2026
e4e5f4d
feat(agent-memory): harden local recall and governance guards
Humestone May 22, 2026
1ed41ad
Harden agent memory API scope harness
Humestone May 23, 2026
541d3e4
feat(agent-memory): accept dedicated AGENT_MEMORY_ACCESS_KEY with sha…
Humestone Jun 11, 2026
b37cfad
feat(humestone): reconstruct clean OB1 overlay
Humestone Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 40 additions & 17 deletions .github/workflows/ob1-gate-v2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,28 @@ name: OB1 PR Gate
# This means: automated agent passes → human admin approves → merge allowed

on:
pull_request:
types: [opened, synchronize, reopened]
pull_request_target:
types: [opened, synchronize, reopened, ready_for_review, converted_to_draft]
branches: [main]
workflow_dispatch:

permissions:
contents: read

jobs:
event_guard:
name: OB1 Gate Event Guard
if: github.event_name != 'pull_request_target'
runs-on: ubuntu-latest
steps:
- name: Explain non-review gate run
run: |
echo "OB1 PR Gate received a ${GITHUB_EVENT_NAME} event."
echo "The contribution review only runs for pull_request_target events."

review:
name: OB1 Review
if: github.event_name == 'pull_request_target'
runs-on: ubuntu-latest
steps:
- name: Checkout PR head safely
Expand All @@ -30,7 +42,9 @@ jobs:
fetch-depth: 0

- name: Fetch base branch
run: git fetch origin "${{ github.event.pull_request.base.ref }}" --depth=1
run: |
git fetch origin "${{ github.event.pull_request.base.ref }}:refs/remotes/origin/${{ github.event.pull_request.base.ref }}" --depth=1
git show "origin/${{ github.event.pull_request.base.ref }}:.github/metadata.schema.json" > /tmp/ob1-metadata.schema.json

- name: Install metadata schema validator
run: python3 -m pip install check-jsonschema
Expand All @@ -53,11 +67,11 @@ jobs:

- name: Run review checks
id: review
env:
CHANGED_FILES: ${{ steps.changed.outputs.files }}
CONTRIB_DIRS: ${{ steps.changed.outputs.contrib_dirs }}
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
CHANGED_FILES="${{ steps.changed.outputs.files }}"
CONTRIB_DIRS="${{ steps.changed.outputs.contrib_dirs }}"
PR_TITLE="${{ github.event.pull_request.title }}"

pass_count=0
fail_count=0
results=""
Expand Down Expand Up @@ -144,7 +158,7 @@ jobs:
continue
fi

if ! schema_output=$(check-jsonschema --schemafile .github/metadata.schema.json "$dir/metadata.json" 2>&1); then
if ! schema_output=$(check-jsonschema --schemafile /tmp/ob1-metadata.schema.json "$dir/metadata.json" 2>&1); then
indented_output=$(printf '%s\n' "$schema_output" | sed 's/^/ /')
rule3_detail="${rule3_detail} - \`$dir/metadata.json\` failed schema validation\n${indented_output}\n"
rule3_pass=false
Expand Down Expand Up @@ -628,24 +642,33 @@ jobs:
REVIEW_COMMENT: ${{ steps.review.outputs.comment }}
REVIEW_FAILED: ${{ steps.review.outputs.failed }}
SECRET_BLOCKED: ${{ steps.review.outputs.secret_blocked }}
CHANGED_FILES: ${{ steps.changed.outputs.files }}
CONTRIB_DIRS: ${{ steps.changed.outputs.contrib_dirs }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_URL: ${{ github.event.pull_request.html_url }}
PR_TITLE: ${{ github.event.pull_request.title }}
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_AUTHOR_LOGIN: ${{ github.event.pull_request.user.login }}
PR_AUTHOR_ASSOCIATION: ${{ github.event.pull_request.author_association }}
PR_DRAFT: ${{ github.event.pull_request.draft }}
run: |
set -euo pipefail

mkdir -p gate-artifact

printf '%s\n' "$REVIEW_COMMENT" > gate-artifact/ob1-review-summary.md
printf '%s\n' "$REVIEW_COMMENT" >> "$GITHUB_STEP_SUMMARY"
printf '%s\n' "${{ steps.changed.outputs.files }}" > gate-artifact/changed-files.txt
printf '%s\n' "${{ steps.changed.outputs.contrib_dirs }}" > gate-artifact/contribution-dirs.txt
printf '%s\n' "$CHANGED_FILES" > gate-artifact/changed-files.txt
printf '%s\n' "$CONTRIB_DIRS" > gate-artifact/contribution-dirs.txt

jq -n \
--argjson pr_number "${{ github.event.pull_request.number }}" \
--arg pr_url "${{ github.event.pull_request.html_url }}" \
--arg title "${{ github.event.pull_request.title }}" \
--arg head_sha "${{ github.event.pull_request.head.sha }}" \
--arg author_login "${{ github.event.pull_request.user.login }}" \
--arg author_association "${{ github.event.pull_request.author_association }}" \
--arg is_draft "${{ github.event.pull_request.draft }}" \
--argjson pr_number "$PR_NUMBER" \
--arg pr_url "$PR_URL" \
--arg title "$PR_TITLE" \
--arg head_sha "$PR_HEAD_SHA" \
--arg author_login "$PR_AUTHOR_LOGIN" \
--arg author_association "$PR_AUTHOR_ASSOCIATION" \
--arg is_draft "$PR_DRAFT" \
--arg failed "$REVIEW_FAILED" \
--arg secret_blocked "$SECRET_BLOCKED" \
'{
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/ob1-pr-followups.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,18 @@ permissions:
id-token: write

jobs:
ignore_non_pr_gate:
name: Ignore Non-PR Gate Run
if: github.event.workflow_run.event != 'pull_request' && github.event.workflow_run.event != 'pull_request_target'
runs-on: ubuntu-latest
steps:
- name: Explain skipped follow-up
run: |
echo "OB1 PR Follow-Ups only acts on pull_request or pull_request_target gate runs."
echo "Received upstream event: ${{ github.event.workflow_run.event }}"

followups:
if: github.event.workflow_run.event == 'pull_request'
if: github.event.workflow_run.event == 'pull_request' || github.event.workflow_run.event == 'pull_request_target'
runs-on: ubuntu-latest
concurrency:
group: ob1-pr-followups-${{ github.event.workflow_run.pull_requests[0].number || github.event.workflow_run.id }}
Expand Down
18 changes: 18 additions & 0 deletions dashboards/open-brain-dashboard-next/.env.example
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# Required: URL of your Open Brain REST API
NEXT_PUBLIC_API_URL=https://YOUR-PROJECT-REF.supabase.co/functions/v1/open-brain-rest

# Required: password entered at the dashboard login screen.
DASHBOARD_PASSWORD=

# Required: server-side Company Memory access key. It is never entered at
# login or stored in the browser session. MCP_ACCESS_KEY remains a legacy fallback.
OPEN_BRAIN_KEY=
# MCP_ACCESS_KEY=

# Optional: URL of your OB1 Agent Memory API.
# If omitted, the dashboard derives it from NEXT_PUBLIC_API_URL by replacing open-brain-rest with agent-memory-api.
# AGENT_MEMORY_API_URL=https://YOUR-PROJECT-REF.supabase.co/functions/v1/agent-memory-api
Expand All @@ -9,6 +17,10 @@ NEXT_PUBLIC_API_URL=https://YOUR-PROJECT-REF.supabase.co/functions/v1/open-brain
# AGENT_MEMORY_WORKSPACE_ID=ob1-staging
# AGENT_MEMORY_PROJECT_ID=

# Optional: use a dedicated Agent Memory access key when its API is deployed.
# If omitted, the dashboard intentionally falls back to MCP_ACCESS_KEY.
# AGENT_MEMORY_ACCESS_KEY=

# Required: 32+ character secret for iron-session cookie encryption
# Generate with: openssl rand -hex 32
SESSION_SECRET=
Expand All @@ -23,6 +35,12 @@ SESSION_SECRET=
# OB1_DEMO_AUTH_BYPASS=false
# OB1_DASHBOARD_DEMO_KEY=local-screenshot-key

# Optional: allow Mission Control to send retrieved Company Memory snippets to
# OpenRouter for answer synthesis. Default is off; enabling requires privacy review.
# MISSION_CONTROL_AI_ANSWERS_ENABLED=false
# OPENROUTER_API_KEY=
# OPENROUTER_MODEL=anthropic/claude-3.5-haiku

# Optional: SHA-256 hash of passphrase to unlock restricted/sensitive content
# Requires the sensitivity-tiers primitive (sensitivity_tier column on thoughts)
# Generate with: echo -n "your-passphrase" | shasum -a 256
Expand Down
84 changes: 84 additions & 0 deletions dashboards/open-brain-dashboard-next/EXTENSIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Dashboard Extensions

The Open Brain dashboard supports drop-in extensions that add a new route
and a sidebar entry **without modifying any core dashboard file**.

## Anatomy

An extension is:

1. A folder under `app/<route>/` containing one or more `page.tsx` files
(Next.js App Router conventions apply). The folder name becomes the URL.
2. One entry in `extensions.config.ts` adding a sidebar nav item.

That's it. Extensions own their own API helpers (live in the extension
folder, not `lib/api.ts`) and their own types.

## Minimal example

```
app/
hello/
page.tsx ← extension page
api.ts ← extension's own data layer (optional)
```

```ts
// extensions.config.ts
export const EXTENSIONS: ExtensionNavEntry[] = [
{ href: "/hello", label: "Hello", icon: "sparkles" },
];
```

`page.tsx` imports its own helpers from `./api` (or wherever), and the
extension is live after `npm run build && vercel deploy --prod`.

## Auth

Extension pages use the same session helpers as core pages:

```tsx
import { requireSessionOrRedirect } from "@/lib/auth";

export default async function Page() {
const { apiKey } = await requireSessionOrRedirect();
// ...
}
```

`apiKey` is the OB1 access key the user logged in with — pass it as the
`x-brain-key` header when calling Edge Functions.

## Backend routes

Extensions that need their own REST endpoints have two clean options:

- **Sidecar Edge Function.** Deploy a separate function (e.g.
`my-extension-api`). Derive its URL on the dashboard side by string-
replacing `open-brain-rest` in `NEXT_PUBLIC_API_URL` (`agent-memory-api`
does this — see `lib/agent-memory.ts`).
- **Add routes to `open-brain-rest`.** Acceptable when the data lives in a
table that's tightly coupled to OB1's core surface area.

## Icon registry

Extensions reference icons by string name because `extensions.config.ts`
is plain TypeScript (no JSX). Supported keys are declared in
`extensions.config.ts` as `ExtensionIcon`. To add a new icon:

1. Add the key to the `ExtensionIcon` union.
2. Implement the SVG component in `components/Sidebar.tsx`.
3. Map the key in `EXTENSION_ICONS`.

## Position in the sidebar

Extensions render in declaration order, between the core nav items
(Dashboard, Thoughts, Workflow, Agent Memory, Search, Audit, Duplicates)
and the trailing "Add" entry.

## Versioning

The extension contract is small (one config file, one folder layout
convention) so it's intentionally not versioned. Breaking changes — if
ever — would surface as TypeScript errors in `extensions.config.ts`,
which is the right place to catch them.
10 changes: 10 additions & 0 deletions dashboards/open-brain-dashboard-next/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,16 @@ AGENT_MEMORY_API_URL=http://127.0.0.1:3022

Do not enable `OB1_DEMO_AUTH_BYPASS` in shared previews or production. It exists so repeatable screenshot and video generation can run without putting real API keys in browser automation.

### Agent Memory Read-Only Governance Guard

Set `OB1_GOVERNANCE_READ_ONLY=true` for local governance pilots. In this mode, Agent Memory list/detail pages render read-only notices, hide review controls, and server actions return before calling `PATCH /memories/:id/review`.

Verify locally:

```bash
npm run test:agent-memory
```

## Tech Stack

- **Next.js 16** (App Router)
Expand Down
63 changes: 42 additions & 21 deletions dashboards/open-brain-dashboard-next/app/agent-memory/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { ReactNode } from "react";
import { notFound } from "next/navigation";
import { revalidatePath } from "next/cache";
import {
agentMemoryDefaults,
fetchAgentMemory,
reviewAgentMemory,
} from "@/lib/agent-memory";
Expand All @@ -14,26 +15,40 @@ import {
} from "@/components/AgentMemoryBadges";
import { FormattedDate } from "@/components/FormattedDate";
import type { AgentMemoryReviewAction } from "@/lib/types";
import { isGovernanceReadOnly } from "@/lib/governance";

export const dynamic = "force-dynamic";

export default async function AgentMemoryDetailPage({
params,
searchParams,
}: {
params: Promise<{ id: string }>;
searchParams: Promise<Record<string, string | undefined>>;
}) {
const { apiKey } = await requireSessionOrRedirect();
const { id } = await params;
const query = await searchParams;
const defaults = agentMemoryDefaults();
const workspaceId = query.workspace_id || defaults.workspaceId;
const projectId = query.project_id ?? defaults.projectId;
const governanceReadOnly = isGovernanceReadOnly();

let memory;
try {
memory = await fetchAgentMemory(apiKey, id);
memory = await fetchAgentMemory(apiKey, id, {
workspace_id: workspaceId,
project_id: projectId,
});
} catch {
notFound();
}

async function reviewAction(formData: FormData) {
"use server";
if (isGovernanceReadOnly()) {
return;
}
const { apiKey } = await requireSessionOrRedirect();
const action = String(formData.get("action") || "") as AgentMemoryReviewAction;
await reviewAgentMemory(apiKey, id, action, {
Expand All @@ -59,26 +74,32 @@ export default async function AgentMemoryDetailPage({
{memory.summary}
</h1>
</div>
<div className="flex flex-wrap gap-2">
<form action={reviewAction}>
<input type="hidden" name="action" value="evidence_only" />
<button className="ob1-command-button h-9 px-3 text-sm">
Evidence only
</button>
</form>
<form action={reviewAction}>
<input type="hidden" name="action" value="confirm" />
<button className="h-9 border border-success/30 px-3 text-sm text-success hover:bg-success/10">
Confirm
</button>
</form>
<form action={reviewAction}>
<input type="hidden" name="action" value="reject" />
<button className="h-9 border border-danger/30 px-3 text-sm text-danger hover:bg-danger/10">
Reject
</button>
</form>
</div>
{governanceReadOnly ? (
<div className="rounded-md border border-amber-500/40 bg-amber-500/10 px-3 py-2 text-xs text-amber-200">
Review actions are unavailable in the read-only governance pilot.
</div>
) : (
<div className="flex flex-wrap gap-2">
<form action={reviewAction}>
<input type="hidden" name="action" value="evidence_only" />
<button className="ob1-command-button h-9 px-3 text-sm">
Evidence only
</button>
</form>
<form action={reviewAction}>
<input type="hidden" name="action" value="confirm" />
<button className="h-9 border border-success/30 px-3 text-sm text-success hover:bg-success/10">
Confirm
</button>
</form>
<form action={reviewAction}>
<input type="hidden" name="action" value="reject" />
<button className="h-9 border border-danger/30 px-3 text-sm text-danger hover:bg-danger/10">
Reject
</button>
</form>
</div>
)}
</div>

<div className="grid gap-4 md:grid-cols-[minmax(0,1fr)_340px]">
Expand Down
Loading
Loading