Commit graph

93 commits

Author SHA1 Message Date
andrew
a92f0be9c8 Dockerfile: switch base from Docker Hub to ECR Public
AWS CodeBuild shares an outbound IP pool with many other AWS customers,
so anonymous Docker Hub pulls (100/6h per IP) rate-limit quickly. The
aws-feature variant in Package run 24642508475 hit 429 on debian:bookworm-slim.

ECR Public hosts the same official Debian images at
public.ecr.aws/debian/debian, has no pull rate limit, and is
anonymously accessible. Same upstream image, just mirrored on AWS.
2026-04-20 13:46:23 +03:00
Andrew Altshuler
a35698e952
Merge pull request #38 from ModernRelay/fix/mr-670-cleanup-run-branches
Clean up __run__ branch on publish, unblock schema apply (MR-670)
2026-04-20 13:32:49 +03:00
andrew
26012d156e Filter internal run branches in schema_apply (MR-670)
Published `__run__` branches are intentionally retained after publish
for post-publish inspection (runs.rs tests verify edge IDs match
between run branch and main). `apply_schema` was counting them as
"non-main" branches and refusing to run — permanently blocking schema
evolution after any load or change, with no CLI recovery path
(`branch_delete` rejects internal refs, `run abort` rejects Published
runs).

Fix: `apply_schema` filters `is_internal_system_branch` (covers both
`__run__*` and the schema-apply lock) rather than just the lock.
Run branches remain available for inspection.

Regression: test_apply_schema_succeeds_after_load_creates_published_run_branch
pins that schema apply succeeds after a load even while the run
branch is still present.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 13:32:20 +03:00
Andrew Altshuler
a56f1d140a
Merge pull request #37 from ModernRelay/test/lance-mem-pool-size
Raise LANCE_MEM_POOL_SIZE to 1 GB in .cargo/config.toml
2026-04-20 01:22:58 +03:00
andrew
dbde85b68d Raise LANCE_MEM_POOL_SIZE to 1 GB in .cargo/config.toml
Fixes flaky omnigraph-server integration suite under parallel cargo
test. Lance defaults to a 100 MB FairSpillPool per Omnigraph instance
(lance-datafusion/src/exec.rs:316). That's fine in prod (one server
process, bounded concurrent sorts) but too small when cargo test
spawns many Omnigraph instances in parallel, each running concurrent
BTree index builds during load.

Failure signature:
  Lance("create BTree index on node:Person(id): ... LanceError(IO):
  Not enough memory to continue external sort. ... 0.0 B remain
  available for the total pool")

Before: 10/41 OOM-fail on parallel run; passed with --test-threads=1.
After:  41/41 pass in parallel in ~3s.

[env] in .cargo/config.toml applies to cargo-launched processes only.
Shipped binaries (release tarballs, Docker images) are unaffected —
they inherit whatever the runtime env provides, defaulting to Lance's
100 MB when unset.
2026-04-19 22:27:49 +03:00
Ragnor Comerford
567ebe5f24
Merge pull request #24 from ModernRelay/ragnorc/explore-api
Add static OpenAPI spec and clean up operation IDs
2026-04-19 15:36:49 +02:00
Ragnor Comerford
bcddbdf485
Test merge commit; push openapi.json via separate clone
Restore the default pull_request checkout (refs/pull/N/merge) so tests
see the merged state. The openapi.json auto-commit now uses a separate
shallow clone of the PR branch, so the pushed commit contains only the
spec change rather than the merge-commit tree.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 12:10:40 +02:00
Andrew Altshuler
de1365b5d7
Merge pull request #36 from ModernRelay/fix/example-config-graphs-rename
Update example config to graphs / cli.graph (finishes MR-603)
2026-04-18 23:41:00 +03:00
andrew
206b5da20a example config: use graphs / cli.graph, matching the MR-603 rename
The target → graph rename shipped in PR #17 but omnigraph.example.yaml
still used the old form (`targets:` / `cli.target`). Since the serde
struct uses `rename = "graphs"` without a `targets` alias, the example
wouldn't deserialize against current code.

Update the example to the new form. No alias is being added — the
deserialization error for old configs is loud and clear, which is the
better migration signal for a young project.
2026-04-18 23:40:35 +03:00
Ragnor Comerford
a157f6a17c
Fold openapi.json auto-sync into main CI test job
The separate openapi-sync workflow was duplicating the workspace build
(~15 min cold-cache compile), paying the cost twice per PR. Fold the
regen + auto-commit into the existing test job: one compile, shared
rust-cache, same drift-check semantics.

- Same-repo PRs: OMNIGRAPH_UPDATE_OPENAPI=1 during the test run, then
  commit the regenerated spec back to the PR branch
- Fork PRs / pushes: env var empty, test stays in strict drift-check mode
- openapi_spec_is_up_to_date treats empty env value as unset, so the
  conditional workflow env expression works

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 21:00:46 +02:00
Andrew Altshuler
dc5718fd43
Merge pull request #35 from ModernRelay/fix/package-caller-secrets-inherit
package caller: pass AWS secrets via secrets: inherit
2026-04-18 22:00:27 +03:00
andrew
987c51c376 package caller: pass AWS secrets via secrets: inherit
GitHub Actions doesn't expose the 'secrets' context in 'with:' when
calling a reusable workflow. The companion PR on the shared workflow
(ModernRelay/.github) moves the four AWS values into
on.workflow_call.secrets; this caller drops them from 'with:' and adds
'secrets: inherit' so all four flow through masked.

Trailing from PRs #33 and #34.
2026-04-18 21:54:08 +03:00
Andrew Altshuler
eeb890a4f5
Merge pull request #34 from ModernRelay/fix/package-workflow-use-secrets
package workflow: read AWS config from secrets, not variables
2026-04-18 21:45:47 +03:00
andrew
8086a0099c package workflow: read AWS config from secrets, not variables
On a public repo, Actions variables are not masked in workflow logs.
The AWS role ARN and artifact bucket name embed the AWS account ID —
not catastrophic, but norm-preserving to keep them out of public logs.

Switch all four values (region, role, project, bucket) from
`${{ vars.* }}` to `${{ secrets.* }}`. When secrets are passed via
`with:` to a reusable workflow, GitHub's masking still applies because
the value is added to the run's mask list as soon as the secret
reference is resolved.

Followup to #33 — should have landed as secrets from the start.
2026-04-18 21:43:12 +03:00
Ragnor Comerford
9de2079263
Merge remote-tracking branch 'origin/main' into ragnorc/explore-api
# Conflicts:
#	CONTRIBUTING.md
2026-04-18 20:24:39 +02:00
Andrew Altshuler
aa260cc2b9
Merge pull request #33 from ModernRelay/feat/package-workflow-dispatch
Add manual-dispatch Package workflow
2026-04-18 17:57:33 +03:00
andrew
807c1ba4dc Add manual-dispatch Package workflow for CodeBuild image builds
Invokes the shared omnigraph-package reusable workflow twice per run —
once with default features, once with --features aws — producing two
ECR tags per source commit:

  <sha>         (default features)
  <sha>-aws     (--features aws → SecretsManagerTokenSource)

Manual-dispatch only for now. Neither release.yml nor release-edge.yml
currently invokes the CodeBuild-backed packaging path; this gives
operators a way to produce on-demand image variants without wiring
packaging into the tag/push cadence.

Prerequisites:
- Repo vars AWS_REGION, AWS_ROLE_TO_ASSUME, AWS_CODEBUILD_PACKAGE_PROJECT,
  AWS_ARTIFACT_BUCKET must be set.
- Shared workflow must support the `features` and `image_tag_suffix`
  inputs.

Uses @main as the shared-workflow ref until a versioned tag is cut.
2026-04-18 16:29:43 +03:00
Andrew Altshuler
4c298bab12
Merge pull request #31 from ModernRelay/docs/aws-build-variant
Document AWS build variant and bearer-token sources
2026-04-18 05:32:25 +03:00
Andrew Altshuler
060a7e9ce9
Merge pull request #30 from ModernRelay/feat/aws-secrets-manager-token-source
Add aws feature + SecretsManagerTokenSource
2026-04-18 05:32:09 +03:00
Andrew Altshuler
2b493c0063
Merge pull request #29 from ModernRelay/refactor/token-source-trait
Extract TokenSource trait (prep for AWS backend)
2026-04-18 05:30:19 +03:00
Andrew Altshuler
c6e4b1aa01
Merge pull request #28 from ModernRelay/fix/bearer-auth-hardening
Harden bearer auth: constant-time compare, hashed at rest, authoritative actor_id
2026-04-18 05:20:01 +03:00
andrew
d830ebcb64 Document AWS build variant and bearer-token sources
- docs/deployment.md: new "Token sources" section listing the three
  bearer-token source precedences (AWS SM, JSON file/env, single token).
  New "Build Variants" section explaining default vs aws builds and
  their release-artifact naming. New "AWS Secrets Manager" section
  covering env var, secret payload format, IAM role credential
  discovery, and the hard error for feature-less builds.
- CONTRIBUTING.md: documents the `aws` feature and the two test
  commands contributors should run when touching auth code.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 04:04:45 +03:00
andrew
7a3bf5c758 Add aws feature + SecretsManagerTokenSource backend
Introduces an opt-in AWS Secrets Manager backend for bearer tokens,
behind the `aws` Cargo feature. Default builds (on-prem, local dev)
don't pull in the AWS SDK and don't pay its compile cost.

- New Cargo feature `aws` gates the `aws-config` + `aws-sdk-secretsmanager`
  optional deps. Default features remain empty.
- New `auth::aws::SecretsManagerTokenSource` implements `TokenSource` by
  fetching a JSON `{"actor_id": "token", ...}` payload from a named
  Secrets Manager secret. Credentials resolve via the AWS default chain
  (env, shared config, IMDSv2 instance role, ECS task role) so no
  explicit plumbing is needed under an IAM role.
- New `resolve_token_source()` dispatches based on the
  `OMNIGRAPH_SERVER_BEARER_TOKENS_AWS_SECRET` env var. If the var is set
  but the binary was built without `--features aws`, returns a clear
  rebuild instruction rather than silently falling back.
- `serve()` now uses `resolve_token_source()` and logs which source was
  selected at startup.
- `parse_json_secret_payload()` is factored out as a free function so
  the payload validation (trim whitespace, reject blank actor/token,
  reject non-object) is unit-testable without the AWS SDK.
- New CI job `test_aws_feature` builds + tests with `--features aws`.

Not in this PR (follow-ups):
- Background refresh loop for rotation. `SecretsManagerTokenSource`
  advertises `supports_refresh: true` but the AppState-level refresh
  task isn't wired yet.
- Config-YAML dispatch (today the AWS source is selected via env var
  only; eventually `server.bearer_tokens.source` in `omnigraph.yaml`).

Tests:
- Default-feature build: 33 lib + 41 integration + 64 openapi.
- `--features aws` build: 32 lib (one test is cfg-gated) + 41 + 64.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 03:48:51 +03:00
andrew
af41630520 Extract TokenSource trait for bearer token loading
Pure refactor. No behavior change. Introduces a TokenSource trait so
additional backends (AWS Secrets Manager, Vault, etc.) can plug in
behind feature flags without touching the server wiring.

- New module crates/omnigraph-server/src/auth.rs with the TokenSource
  trait and a single EnvOrFileTokenSource implementation that delegates
  to the existing server_bearer_tokens_from_env() function.
- serve() now constructs EnvOrFileTokenSource and calls load() instead
  of calling the free function directly.
- The trait has a supports_refresh() hook (false for env/file) for
  future implementations that can rotate without restart.
- async-trait added to omnigraph-server deps; it's already in the
  workspace.

Tests:
- Unit tests in auth.rs covering load paths and the default supports_refresh
  / name values.
- Existing 128 tests (lib + integration + openapi) pass unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 03:31:43 +03:00
andrew
c338e80180 Harden bearer auth: constant-time compare, hashed at rest, authoritative actor_id
Fixes two live authz bugs in omnigraph-server:

- Bearer-token lookup previously used HashMap::get, which compares keys with
  Eq and short-circuits on the first differing byte — a network-observable
  timing oracle for brute-forcing tokens. Tokens are now stored as SHA-256
  digests and compared with subtle::ConstantTimeEq, iterating every entry
  unconditionally so total work is independent of which slot matches. Raw
  token bytes no longer live in server memory after startup.

- authorize_request now overwrites PolicyRequest.actor_id from the
  authenticated session instead of trusting the handler-supplied field,
  which previously defaulted to "" via unwrap_or_default(). The empty
  string can no longer reach Cedar as a policy subject even if a future
  refactor drops the None check.

External API of AppState constructors is unchanged — tokens still enter as
Vec<(String, String)> and are hashed on the way in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 01:41:02 +03:00
Andrew Altshuler
e926c925d6
Merge pull request #27 from ModernRelay/fix/schema-show-polish
Add schema show command (supersedes #23)
2026-04-18 00:56:04 +03:00
andrew
be520f31f4 Polish schema endpoint: rename show, align field name, add tests
Review feedback on #23, applied on top of the original commit:

- Rename the CLI subcommand from `schema get` to `schema show` to match
  the existing `run show` / `commit show` convention. A `#[command(alias
  = "get")]` preserves muscle memory for anyone who already typed `get`.
- Rename `SchemaGetOutput` → `SchemaOutput` and its field `source` →
  `schema_source`, so the get response and the apply request use the
  same field name for the same concept.
- Use `println!` instead of `print!` in the CLI so the shell prompt
  doesn't land on the last line of schema output.
- Add three integration tests on `/schema`: happy path (no auth),
  401 when bearer is required but missing, 403 when the policy grants
  the actor branch_create but not read.

Follow-ups left for a separate PR: include `schema_ir_hash` and
`schema_identity_version` in the response payload so clients can do
drift detection and the server can set an ETag; and a fast-path local
read that skips `Omnigraph::open()` when only the schema source is
needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 00:30:46 +03:00
Ragnor Comerford
dda9728473
Add openapi.json auto-sync workflow 2026-04-17 19:09:36 +02:00
Ragnor Comerford
e0d48ad825
Document openapi.json auto-sync in CI
Describe the CI workflow that regenerates openapi.json on PRs and the
fork fallback. The workflow itself is added in a follow-up commit via
the GitHub API (local tooling lacks workflow-scope).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 16:28:01 +02:00
Ragnor Comerford
9eb3c9fde4
Revert "Add opt-in git hook for openapi.json drift"
This reverts commit 7427d87e9a.
2026-04-17 16:26:57 +02:00
Ragnor Comerford
7427d87e9a
Add opt-in git hook for openapi.json drift
Track a project pre-commit hook under scripts/hooks/ that regenerates
openapi.json when server source is staged, and auto-stages the updated
spec into the commit. Zero external dependencies — plain bash + cargo.

Enable via `git config core.hooksPath scripts/hooks`. The CI drift
test remains the authoritative check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 16:19:08 +02:00
Ragnor Comerford
2fedcf7e2f
Revert "Add pre-commit hook for openapi.json drift"
This reverts commit 7c6d89d194.
2026-04-17 16:06:54 +02:00
Ragnor Comerford
7c6d89d194
Add pre-commit hook for openapi.json drift
Wire a local pre-commit hook that regenerates openapi.json whenever
the server source changes, and document the workflow in CONTRIBUTING.
Opt-in via `pre-commit install`; the existing CI test remains the
authoritative drift check.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 15:53:13 +02:00
Ragnor Comerford
bfdfeaa2f2
Remove Stainless SDK config
Drop .stainless/ workspace and generator config; keep the static
openapi.json, golden-file test, and operation_id cleanup so the
spec stays usable with any SDK generator.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:31:35 +02:00
Ragnor Comerford
228032a4ac
Add static OpenAPI spec and Stainless SDK config
Introduce SDK generation scaffolding: commit a static openapi.json
extracted from the Utoipa annotations via a golden-file test, add
Stainless workspace/config for TypeScript and Python SDKs, and clean
up operation IDs for ergonomic generated method names.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:26:31 +02:00
Claude
0c4df674fa
Add schema get command to CLI and HTTP API
Exposes the existing schema_source() method via a new `omnigraph schema get`
CLI subcommand and a `GET /schema` API endpoint, allowing users to retrieve
the current accepted schema from any graph repository.

https://claude.ai/code/session_01UYybeBQks3fz3RJrTHtwQw
2026-04-16 21:15:17 +00:00
Andrew Altshuler
9ad9d1f71f
Merge pull request #20 from ModernRelay/codex/homebrew-auto-release
Automate Homebrew tap updates on release tags
2026-04-15 18:01:02 +03:00
andrew
ad7027c7e9 Automate Homebrew tap updates on release tags 2026-04-15 17:57:21 +03:00
andrew
c82408ccdf Add crates.io badge for omnigraph-cli
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 22:48:20 +03:00
Andrew Altshuler
481a8b9090
Merge pull request #19 from ModernRelay/codex/v0.2.2-release
Prepare v0.2.2 release
2026-04-14 22:12:50 +03:00
andrew
33bdab1fcb Prepare v0.2.2 release 2026-04-14 20:13:00 +03:00
andrew
f2ebdb3d8d Link starters repo and restore CI badge
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 19:37:23 +03:00
Andrew Altshuler
18fa8e1491
Merge pull request #18 from ModernRelay/codex/v0.2.1-release
Prepare v0.2.1 release
2026-04-14 19:23:00 +03:00
andrew
3d74cbfc20 Prepare v0.2.1 release 2026-04-14 19:19:00 +03:00
andrew
a0d6d1b32f Add line break in README tagline
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:55:51 +03:00
andrew
8d936996d6 Remove CI and edition badges from README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:53:46 +03:00
andrew
de79c19016 Polish README: add badges, fix typos, dedupe features, simplify CLI examples
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:52:14 +03:00
Andrew Altshuler
da28dd57ef
Merge pull request #17 from ModernRelay/codex/mr-603-graph-config
Rename config targets to graphs
2026-04-14 13:47:27 +03:00
andrew
1a26e2e654 Rename config targets to graphs 2026-04-14 04:12:14 +03:00
Ragnor Comerford
063be3ddc7
Merge pull request #16 from ModernRelay/tin-epoch
Fix join alignment for traversal-introduced bindings
2026-04-13 16:54:52 +02:00