Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b6a5ca7
Add OIE RQ A→B→C fan-out and Admin OIE queue tab.
northdpole Oct 9, 2026
79bb6e6
Harden OWASP agent for Nest-backed November demo.
northdpole Oct 10, 2026
5a668c3
Restrict staging login to an explicit email allowlist.
northdpole Oct 10, 2026
fd999a8
Document homeserver staging behind Cloudflare Tunnel.
northdpole Oct 10, 2026
331a883
Add dedicated Compose stack for staging.opencre.org.
northdpole Oct 10, 2026
6c699a7
Make promoted Module C feature flags the runtime default.
northdpole Oct 11, 2026
370f77c
Add admin API tokens and JWT request auth.
northdpole Oct 11, 2026
fe2e215
Persist OIE LLM caches and CRE summaries; add CE/cosine flags.
northdpole Oct 11, 2026
0583710
Batch pairwise+grounding into one LLM call; fix matrix DB URL clobber.
northdpole Oct 12, 2026
4d402f6
Pin cost-free Module C path in promoted defaults and staging.
northdpole Oct 11, 2026
aad9832
Add Admin REST + UI to requeue/cancel failed OIE RQ jobs.
northdpole Oct 12, 2026
eccb0e2
Redesign admin panel with CRE blues, env/.env diff, and review widgets.
northdpole Oct 11, 2026
36d0310
Allow Bearer on Admin OIE REST and fix staging filing lookup.
northdpole Oct 13, 2026
3bbc52c
Add Admin active ingestions status with config, progress, and ETA.
northdpole Oct 13, 2026
60c4136
Fix Admin ingest ETA to use Module C remaining, not HI backlog.
northdpole Oct 13, 2026
dea2098
fix(auth): admit admin API keys on MyOpenCRE after MCP rebase
northdpole Oct 14, 2026
bb157b8
feat(mcp): add fact-only ask tool for Cursor multi-call synthesis
northdpole Oct 14, 2026
3ba4444
fix(mcp): only treat CRE-shaped ids as ask security hits
northdpole Oct 14, 2026
b471279
feat(mcp): staging Streamable HTTP with Admin JWT gate for ask
northdpole Oct 14, 2026
d85d55f
fix(mcp): run ask meta router in app context before CRE defer
northdpole Oct 15, 2026
8805093
fix(owasp-agent): restore sim-first router after fanout restack
northdpole Oct 15, 2026
6900d15
fix(owasp-agent): restore intent/sim-first agent after fanout restack
northdpole Oct 15, 2026
9c6ea5a
feat(oie-scheduler): admin-editable job interval and on/off
northdpole Oct 19, 2026
78bc75b
feat(admin): Schedules tab to change job intervals and switch jobs off
northdpole Oct 19, 2026
bdae15e
feat(oie-scheduler): owasp job runs daily by default; health stalenes…
northdpole Oct 19, 2026
a94289b
style: format files flagged by CI (black); keep test environment chan…
northdpole Oct 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
5 changes: 5 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ tmp
.vscode
.github
.git
.harvester_cache/
logs/
.cursor/
.cursorignore
*.nohup.out

# This file specifies files that are *not* uploaded to Google Cloud
# using gcloud. It follows the same syntax as .gitignore, with the addition of
Expand Down
5 changes: 4 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@ FROM python:3.11 as run
COPY --from=build /code /code
WORKDIR /code
COPY ./scripts/prod-docker-entrypoint.sh /code
RUN pip install -r requirements.txt gunicorn
# Staging Compose may pass requirements-dev.txt (Librarian ML / OIE Module C.2).
# Default stays prod requirements.txt for Heroku slug size.
ARG REQUIREMENTS_FILE=requirements.txt
RUN pip install -r "${REQUIREMENTS_FILE}" gunicorn

ENV INSECURE_REQUESTS=1
ENV FLASK_CONFIG="production"
Expand Down
18 changes: 17 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,24 @@ docker-postgres:

start-containers: docker-neo4j docker-redis

# RQ work-horses fork after Flask/torch load. On macOS, unset device → MPS and
# CrashReporter popups from Homebrew Python.app. Force CPU unless overridden.
CRE_LIBRARIAN_DEVICE?=cpu
start-worker:
. ./venv/bin/activate && FLASK_APP=`pwd`/cre.py python cre.py --start_worker
. ./venv/bin/activate && \
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES \
CRE_LIBRARIAN_DEVICE="$(CRE_LIBRARIAN_DEVICE)" \
FLASK_APP=`pwd`/cre.py python cre.py --start_worker

# Local OIE RQ fleet (queue ``oie``). Default 10; override with OIE_WORKER_COUNT=N.
# Double-fork via scripts/start_oie_workers.py so workers survive make exit (SIGHUP).
OIE_WORKER_COUNT?=10
start-oie-workers:
. ./venv/bin/activate && \
OIE_WORKER_COUNT="$(OIE_WORKER_COUNT)" \
CRE_LIBRARIAN_DEVICE="$(CRE_LIBRARIAN_DEVICE)" \
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES \
python scripts/start_oie_workers.py

upstream-sync:
. ./venv/bin/activate &&\
Expand Down
31 changes: 29 additions & 2 deletions application/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,22 @@ def create_app(mode: str = "production", conf: any = None) -> Any:
letters = string.ascii_lowercase
app.secret_key = "".join(random.choice(letters) for i in range(20))

# JWT API-token signing secret: env, or mint+persist once on install/boot.
# Tests get a stable in-process default so create_app does not touch /code.
try:
from application.utils.api_tokens.secret import ensure_api_token_jwt_secret

if (
mode == "test"
and not (os.environ.get("API_TOKEN_JWT_SECRET") or "").strip()
):
os.environ["API_TOKEN_JWT_SECRET"] = (
"test-only-api-token-jwt-secret-32bytes"
)
ensure_api_token_jwt_secret()
except Exception:
logger.exception("API_TOKEN_JWT_SECRET bootstrap failed")

# config[mode].init_app(app)
sqla.init_app(app=app)
from application.web.web_main import app as app_blueprint
Expand All @@ -59,8 +75,19 @@ def create_app(mode: str = "production", conf: any = None) -> Any:

init_openapi(app)

CORS(app)
app.config["CORS_HEADERS"] = "Content-Type"
# Credentialed browser calls are same-origin in prod/staging; keep CORS
# narrow so cross-site pages cannot drive cookie auth. Admin mutations also
# require CSRF (see web_main.admin_imports_enabled_required).
cors_origins = [
o.strip()
for o in (os.environ.get("CORS_ALLOWED_ORIGINS") or "").split(",")
if o.strip()
]
if cors_origins:
CORS(app, origins=cors_origins, supports_credentials=True)
else:
CORS(app, supports_credentials=True)
app.config["CORS_HEADERS"] = "Content-Type, X-CSRF-Token"

compress.init_app(app)
cache.init_app(app)
Expand Down
Loading
Loading