)]}'
{
  "log": [
    {
      "commit": "0fa6f4e588fb125ac0282f956332c37e69461871",
      "tree": "4bfaacc15c6c4c93d9d698a4b73df4750913d0e3",
      "parents": [
        "292e417d55a2c5d7b58d642409ffb40bc066f272"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Aug 07 13:54:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 13:54:16 2026 -0700"
      },
      "message": "Whitespace\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "292e417d55a2c5d7b58d642409ffb40bc066f272",
      "tree": "012ecbf8f4c62b633a0245ea41b0ca8f2d39ede5",
      "parents": [
        "06b285de0c4103f4c58823d93690fa198c72cadc"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Aug 07 13:53:39 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 13:53:39 2026 -0700"
      },
      "message": "Whitespace\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "06b285de0c4103f4c58823d93690fa198c72cadc",
      "tree": "4bfaacc15c6c4c93d9d698a4b73df4750913d0e3",
      "parents": [
        "c02a7ccfdd1d051bfbf4aee95975a674775d0919"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Jun 01 15:18:10 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 15:18:10 2026 -0500"
      },
      "message": "Add VAX vendor assurance workflow\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "c02a7ccfdd1d051bfbf4aee95975a674775d0919",
      "tree": "beda8ce8b1f702a6e540fab737b259231df5bb91",
      "parents": [
        "81e459578330dfcccb1a810a3a598b225cdff69a"
      ],
      "author": {
        "name": "Dean Wampler",
        "email": "dean.wampler@ibm.com",
        "time": "Thu May 21 13:54:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 12:54:38 2026 -0500"
      },
      "message": "Update the metrics collection workflow to the latest code, but also disables it due to current undiagnosed problems. (#582)\n\nSigned-off-by: Dean Wampler \u003cdean.wampler@ibm.com\u003e"
    },
    {
      "commit": "81e459578330dfcccb1a810a3a598b225cdff69a",
      "tree": "0cd8c964fd63d936c03d3dc1b7f294ebb473dbf0",
      "parents": [
        "5bd78a3b21cf8c2c996fe08ced9ac487b433087d"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Wed May 13 16:44:45 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Wed May 13 16:44:45 2026 -0700"
      },
      "message": "Auth glitch fix\n"
    },
    {
      "commit": "5bd78a3b21cf8c2c996fe08ced9ac487b433087d",
      "tree": "f76248dd69cb8a225b14d0cb65e5c7fb9ece3cff",
      "parents": [
        "3d88b234c06d2c977f8ca4bb043b529d21f4e9d1"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Thu May 07 23:16:36 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Thu May 07 23:16:36 2026 -0700"
      },
      "message": "fix(agent-config): per-model llm_settings, mutex UX, max_tokens text input, runs page server-of-truth\n\nFour coordinated fixes for the agent config / run pipeline. They\nstack on top of each other and only make sense together.\n\n(1) Runs page reads from the saved agent doc, not stale\n    agentFlowContext. The page was falling back to context defaults\n    ({inputText:\u0027string\u0027}, {outputText:\u0027string\u0027}) when agentData\n    wasn\u0027t loaded — masking the user\u0027s real schema and producing\n    silent failures: max_tokens override didn\u0027t reach the LLM call,\n    output schema collapsed to outputText only, list/json input\n    fields silently dropped at submit. Always refetch when :agentId\n    is in the URL; agentFlowContext is for the no-agentId creation\n    flow only.\n\n(2) Per-model llm_settings. Single LlmSettings was built from\n    invokableModels[0] and applied to every tools.call_llm()\n    regardless of target model — so a Sonnet call silently got\n    Opus\u0027s max_tokens. LlmSettings now carries a perModel map keyed\n    by \u0027\u003cprovider\u003e/\u003cmodel\u003e\u0027; for_call(provider, model) returns the\n    matching override at apply time, or None if this model has no\n    overrides. RunsScreen builds the map from the full\n    invokableModels list. Backwards-compatible with the legacy flat\n    shape (older clients still work, just one-size-fits-all as\n    before).\n\n(3) ModelConfigDialog UX. max_tokens (range 1..128000) was a Slider\n    with unusable precision; now a numeric TextField with \u0027Max:\n    \u003cN\u003e\u0027 helper text. Mutually-exclusive params (temperature/top_p\n    on Anthropic models) used to disable both fields with\n    on-hover-only tooltips — invisible until you tried to save and\n    got an opaque 422. Now there\u0027s a prominent inline Alert listing\n    each conflicting pair with one-click \u0027Keep X, clear Y\u0027\n    resolution buttons.\n\n(4) Mutex partners stay cleared across dialog re-open. openModelDialog\n    pre-filled schema defaults for every param, then overlaid\n    existing.parameters. When the user cleared a mutex partner\n    (e.g. top_p so temperature would stick), the cleared key\n    wasn\u0027t in existing.parameters but the default value was still\n    underneath in the merged dict — re-opening showed top_p\u003d0.9\n    again and the conflict reappeared. An older guard handled this\n    only for provider\u003d\u0027anthropic\u0027, missing \u0027bedrock\u0027. Generalized:\n    skip the schema default for any param whose mutex partner is\n    already in existing.parameters. The user\u0027s clear sticks.\n\nFiles touched:\n  webapp/packages/webui/src/pages/AgentCreationFlow/RunsScreen.jsx\n  webapp/packages/webui/src/components/ModelConfigDialog.jsx\n  webapp/packages/webui/src/pages/ViewAgent.jsx\n  webapp/packages/api/user-service/models/agent.py\n  webapp/packages/api/user-service/dependencies.py\n"
    },
    {
      "commit": "3d88b234c06d2c977f8ca4bb043b529d21f4e9d1",
      "tree": "4d00ffa2e2c8e622acbbf27745c78c78e9ec049e",
      "parents": [
        "121c673869e7e54cd6c775f96bab279c1b4f4c32"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Thu May 07 09:24:11 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Thu May 07 09:24:11 2026 -0700"
      },
      "message": "perf(data_store): bulk DB ops, optimistic writes, deferred access tracking\n\nThe ASVS pipeline writes ~345 per-section reports plus ~430 file\nrecords to CouchDB per L3 run. Hot paths in the data store service\nround-trip on every operation:\n\n  - set() does get() before save() — 2 round trips per write.\n  - The CouchDB save() also pre-fetches _rev internally — third RT.\n  - set_many() loops set() — N x (above).\n  - get_all()/get_many() do a save() per doc for access-tracking,\n    turning bulk reads into N+1 calls.\n  - clear_namespace() loops delete() — N round trips.\n\nAdds save_many/delete_many/get_many to the backend interface with\ndefault-impl loop fallbacks so all backends still work; CouchDB\nand Memory implementations exercise _bulk_docs and\n_all_docs?keys\u003d respectively.\n\nCouchDB save() no longer pre-fetches _rev. Service-layer set() is\noptimistic-with-conflict-retry: try save() with no pre-read, on\n409 re-fetch + merge + retry once.\n\nset_many() rewritten to one get_many() + one save_many() — 2\nround trips regardless of N. clear_namespace() uses delete_many.\n\nNew services/access_tracking.py: AccessAccumulator buffers reads\nin memory, background asyncio task flushes every 10s via one\nsave_many. get_all() and get_many() route access-tracking through\nthe accumulator. Counts become eventually-consistent (advisory\nmetadata, fine).\n\nExpected wins on ASVS workload:\n  - 430-record file ingest:    ~1000 RTs -\u003e 2\n  - 345 sequential writes:     ~700 RTs -\u003e 345 (no pre-read)\n  - Bulk reads (get_all):      N+1 -\u003e 1\n  - Namespace cleanup:         N+1 -\u003e 2\n\nTests: 21 new tests in test_database_bulk.py and\ntest_data_store_perf.py with assertions on exact backend\nround-trip counts so future refactors can\u0027t silently regress.\ndata_store_service.py coverage reaches 91%.\n\nPre-existing tests in test_data_store_service.py also updated to\nmatch the new call shape — they previously mocked per-doc\ndb.get/save/delete patterns that the rewritten service no longer\nuses, and the access-tracking tests asserted on inline saves\ninstead of the AccessAccumulator buffer. Full unit suite green.\n\nDynamoDB backend not updated — methods fall through to default\nloop. Worth its own PR with proper BatchWriteItem chunking.\n\nDuplicate index in CouchDB worth dropping when convenient\n(both \u0027user-namespace-index\u0027 and \u0027idx-user-namespace\u0027 index\n[userId, namespace]). Not in this PR — index management requires\nadmin creds and is environment-specific.\n"
    },
    {
      "commit": "121c673869e7e54cd6c775f96bab279c1b4f4c32",
      "tree": "31df0d5937f2420da25c55efb0e898cb4ee02acf",
      "parents": [
        "bbb3df7f8230032f7133a5a3c2804d0ce02cc13a"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 19:33:41 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 19:33:41 2026 -0700"
      },
      "message": "feat(runs): wire up rename — content edits, history list, gitignore\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "bbb3df7f8230032f7133a5a3c2804d0ce02cc13a",
      "tree": "0632b5015efd943583d6ed7d9d4336d17f13c084",
      "parents": [
        "112487fa5368b5df4d818b3c75c32d5f70a1cf8e"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 17:20:12 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 17:20:12 2026 -0700"
      },
      "message": "feat(runs): rename sandbox→runs, add history list below the form\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "112487fa5368b5df4d818b3c75c32d5f70a1cf8e",
      "tree": "203a46be549e8abda60f040636e601689a28e643",
      "parents": [
        "e0849bde8bb4f972d0724ecbbd1e6a42b431e7ae"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 16:07:07 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 16:24:19 2026 -0700"
      },
      "message": "test(security): unit tests for log_redaction module\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "e0849bde8bb4f972d0724ecbbd1e6a42b431e7ae",
      "tree": "51a506e5403874bb847d4d1c2a74d293d007db45",
      "parents": [
        "35e8709a7baea0cd7b7ee9f8a4311b8e2c7362b6"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 14:55:48 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue May 05 14:55:48 2026 -0700"
      },
      "message": "feat(security): redact common secret shapes from logs and traces\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "35e8709a7baea0cd7b7ee9f8a4311b8e2c7362b6",
      "tree": "f01d4f2bcab4226344afddd947e6f3c6c737e86c",
      "parents": [
        "3f41a933448b8894e917953924846e1fe08113de"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Mon May 04 23:17:01 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Mon May 04 23:17:22 2026 -0700"
      },
      "message": "Auth docs update\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "3f41a933448b8894e917953924846e1fe08113de",
      "tree": "eaae3b2d25cc461df4fd31bb154621e8a4c9c190",
      "parents": [
        "874e379cef74978a5e80d59bfe4cce2c20dadce2"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon May 04 17:12:59 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 17:12:59 2026 -0700"
      },
      "message": "Gofannon user-ready (#577)\n\n* fix(e2e): auth fixture + config browser-safety + api-keys test repair\n\n* chore: add test runner script\n\n* chore: lower integration coverage threshold to 35%\n\n* feat: PR 2 — edit models/invokables in place (item 8)\n\nClicking a composer or invokable chip on ViewAgent opens the model\ndialog pre-populated with that item\u0027s existing config, so users can\nedit a previously-added model in place instead of deleting and\nre-adding. Dialog title reflects whether it\u0027s an add or edit.\n\n* feat: PR 4 — OpenRouter as a pluggable provider\n\nAdds OpenRouter alongside the existing providers with an 11-model\ncatalog: grok-code-fast-1, grok-4.1-fast, claude-sonnet-4.5,\nclaude-opus-4.1, gpt-5, gpt-5-mini, deepseek-v3.2, deepseek-chat-v3.1,\nqwen3-coder, qwen3-coder-next, llama-3.3-70b-instruct.\n\n- New config/openrouter/ module with _make_entry helper for the catalog\n- provider_config.py registers the new provider\n- models/user.py adds openrouter_api_key field\n- services/user_service.py extracts PROVIDER_KEY_MAP constant\n- ApiKeysTab.jsx adds the OpenRouter row\n\nNo llm_service.py changes needed — existing model_string routing\nhandles openrouter/* model ids.\n\n* feat: PR 5 — typed sandbox input controls (item 6)\n\nInput fields in the agent Sandbox now match the declared schema type\ninstead of always rendering as text. Number fields get numeric input,\nboolean gets a Switch, JSON gets a multiline textarea with inline\nparse-error feedback. Adds \u0027json\u0027 as a schema type option in the\nSchemaEditor. Values are cast on submit so backend receives\ncorrectly-typed payloads.\n\n* feat: PR 6 (partial) — backend output validation (item 7)\n\nBackend portion of PR 6 only. SandboxScreen.jsx hunks deferred\nbecause 3 of 5 hunks conflict with PR 5\u0027s handleRun restructuring\nand partial apply would leave the frontend referencing undefined\nvariables (schemaWarnings, WarningAmberIcon).\n\nIncluded:\n- agent_factory/prompts.py: strengthens output directive prompts\n  with three ✅/❌ examples so the LLM returns structured results\n  matching the declared output_schema instead of wrapping in\n  {outputText: ...}.\n- dependencies.py: validate_output_against_schema() — checks dict\n  shape, missing/extra keys, type mismatches (with bool-vs-int\n  gotcha handling).\n- models/agent.py: adds output_schema to RunCodeRequest and\n  schema_warnings to RunCodeResponse.\n- routes.py: sandbox route calls the validator, returns warnings.\n- services/agentService.js: runCodeInSandbox signature extended\n  with outputSchema parameter.\n\nDeferred to PR 8b:\n- SandboxScreen.jsx: adds WarningAmberIcon import, schemaWarnings\n  state, capture from response, advisory banner JSX, outputSchema\n  arg on the service call. All land atomically when PR 8b rebuilds\n  handleRun.\n\n* feat: PR 7 — agent chain view (item 9)\n\nAdds a \u0027Chain View\u0027 accordion on ViewAgent showing the transitive\ndependency tree of an agent: nested GofannonClient calls and MCP\nservers, rendered as an indented MUI List. Root agent is expanded\nby default. Cycles and missing agents are badged; depth capped at\n8 to prevent runaway recursion.\n\n- dependencies.py: build_agent_chain with ancestry-based cycle\n  detection and missing-agent handling\n- routes.py: GET /agents/{id}/chain\n- New components/AgentChainView.jsx with Launch icon to navigate\n  into a child agent\n\n* feat: PR 8a — data store viewer (item 12 part 1)\n\nUser-facing browser for the persistent data store.\n\n- models/data_store.py: DataStoreRecord, NamespaceStats,\n  NamespaceListResponse, SetRecordRequest, ClearNamespaceResponse\n- routes.py: 6 new endpoints for namespace/record CRUD with\n  path-matched keys\n- services/dataStoreService.js: API client wrapper\n- pages/DataStoresPage.jsx: stats cards + namespace table + clear\n  confirmation\n- pages/DataStoreBrowser.jsx: prefix-grouped record table with\n  search, right drawer with Value/Metadata/Copy/Edit/Delete,\n  JSON-or-raw-string edit dialog\n- HomePage adds a 3rd column for Data Stores at xl breakpoints\n- New routes /data-stores and /data-stores/:namespace\n\n* feat: PR 8b — data store config accordion + sandbox ops panel + repairs PR 6 frontend (item 12 part 2)\n\nPer-agent data store configuration and a live sandbox panel showing\nevery data store op the agent performed during its run.\n\n- services/data_store_service.py: AgentDataStoreProxy instrumented\n  with an ops_log parameter; all 9 ops log structured entries\n  {op, namespace, agent, ts, key?, valuePreview?, found?, count?}\n  with 200-char value previews.\n- dependencies.py: _execute_agent_code returns (result, ops_log);\n  three internal callsites updated.\n- models/agent.py: DataStoreNamespaceConfig + data_store_config\n  field on Create/Update requests; ops_log on RunCodeResponse.\n- components/SandboxDataPanel.jsx: right-side panel with\n  Operations tab (color-coded READ/WRITE/DEL chips, expandable\n  rows) + State tab (per-namespace aggregation).\n- components/DataStoreConfigAccordion.jsx: flow preview\n  (Reads From → agent → Writes To) + namespace table with\n  Autocomplete suggestions.\n- ViewAgent.jsx inserts the config accordion between Schemas and\n  Model Config; data_store_config threaded through save payloads.\n- SandboxScreen.jsx rebuilt to integrate PR 5\u0027s typed inputs,\n  PR 6\u0027s schemaWarnings capture (deferred from PR 6), and PR 8b\u0027s\n  opsLog capture + two-column layout with the data panel. Fixes\n  the frontend half of PR 6 that was skipped due to hunk conflicts.\n- Updates 5 unit tests (test_dependencies.py, test_context_window.py)\n  to unpack the new (result, ops_log) tuple from _execute_agent_code.\n\n* feat: PR B-1 — Phase B pluggable auth infrastructure\n\nBackend-only. Adds the session-based auth system gated behind the\nAUTH_CONFIG_PATH env var. No user-visible changes without operator\nopt-in; legacy Firebase auth continues to work untouched.\n\n- config/__init__.py: loads AUTH_CONFIG_PATH YAML into settings\n- models/session.py, workspace.py, auth.py: data models\n- auth/base.py: AuthProvider ABC with get_authorize_url,\n  exchange_code, get_workspace_memberships, evaluate_login\n- auth/ldap_client.py: ldap3 wrapper for ASF committer/PMC/banned\n  queries with soft-fail on LDAP outage\n- auth/providers/dev_stub.py: local-dev provider with YAML-configured\n  test users and a plain HTML picker page\n- auth/providers/asf.py: real oauth.apache.org + LDAP integration\n  with ASF-specific banned/emeritus/site-admin policy\n- auth/__init__.py: ProviderRegistry with startup init\n- services/session_service.py: CRUD + refresh with diff computation\n- services/audit_service.py: append-only log (scaffolding for B-3)\n- routes_auth.py: /auth/providers, /auth/login/{type},\n  /auth/callback/{type}, /auth/logout, /auth/refresh-workspaces,\n  /auth/me, /auth/dev-stub-picker\n- routes.py: get_current_user is dual-mode (session cookie first,\n  Firebase bearer token fallback)\n- app_factory.py: registry init and conditional auth router mount\n- requirements.txt: +ldap3\u003e\u003d2.9\n\nThree-tier role model: member (workspace), admin (workspace, from\nLDAP PMC intersection), site_admin (global, from config allowlist).\nPersonal workspace auto-created per session. Soft-fail on LDAP\noutage preserves existing memberships.\n\n* fix(e2e): serial playwright, HMR/reload excludes, skip flaky write-flow tests\n\nInfra hardening for the E2E test harness:\n- playwright.config.js: fullyParallel:false, workers:1. Tests share\n  a single backend user (local-dev-user) so parallel workers race\n  on state mutations.\n- packages/webui/vite.config.js: ignore test-results, playwright-\n  report, .auth, coverage, htmlcov from watch. Prevents Vite HMR\n  reloading the page mid-test.\n- infra/docker/docker-compose.yml: uvicorn --reload excludes for\n  *.pyc, __pycache__, tests, pytest_cache, htmlcov, coverage.\n  Prevents uvicorn restarting mid-request during test runs.\n- tests/e2e/api-keys.spec.js: skip 5 write-flow tests (add/update/\n  remove/masked/success) that intermittently fail with \u0027Failed to\n  fetch\u0027 despite the above fixes. Backend API-key write endpoints\n  are covered by pytest integration tests; skipping gives a stable\n  11/16 passing baseline while root cause is investigated in a\n  separate project.\n\n* feat: PR B-2 — Phase B frontend auth integration\n\nTeaches the UI to talk to the B-1 session backend.\n\n- services/authService.js: new sessionAuth implementation alongside\n  firebase/mock/cognito. Selected when appConfig.auth.provider is\n  \u0027session\u0027. Uses the gofannon_sid cookie set by B-1\u0027s callback\n  route; exposes refreshWorkspaces. Exports fetchAuthProviders\n  helper for LoginPage.\n- services/fetchInterceptor.js: wraps window.fetch once at load\n  to auto-add credentials:\u0027include\u0027 to same-origin API calls —\n  avoids editing 19 fetch sites across 5 service files.\n- contexts/AuthContext.jsx: adds refreshWorkspaces and\n  isSessionAuth to context value.\n- pages/LoginPage.jsx: fetches /auth/providers on mount. Renders\n  one button per provider when Phase B is enabled; legacy Firebase\n  form shown below when operator sets legacyFirebaseEnabled\u003dtrue.\n- components/ProfileMenu.jsx: user identity header with site-admin\n  chip, workspace list preview (top 5 with admin chips, \u0027+N more\u0027),\n  \u0027Refresh workspaces\u0027 menu item with snackbar for the diff.\n- App.jsx: imports fetchInterceptor at top.\n\nZero regression for teams not on Phase B: without AUTH_CONFIG_PATH\nthe backend 404s /auth/providers and LoginPage renders legacy form\nidentically to before.\n\n* feat: PR B-1.1 — Google + Microsoft + GitHub auth providers\n\nExtends the Phase B pluggable auth infrastructure with three additional\nidentity providers. Backend-only; existing LoginPage (from B-2) picks\nthem up via /auth/providers.\n\nNew providers:\n- auth/providers/google.py: Google Workspace OAuth + Admin SDK Directory\n  API for Google Groups. Hosted-domain enforcement, allowlist default,\n  OWNER/MANAGER -\u003e admin role mapping.\n- auth/providers/microsoft.py: Microsoft Entra ID OAuth + Graph\n  /me/transitiveMemberOf for security group memberships. Tenant-scoped\n  authorize, optional admin_groups subset for role promotion.\n- auth/providers/github.py: GitHub OAuth + /user/memberships/orgs/{org}\n  for org role. Numeric id for external_id (rename-stable), case-\n  insensitive org normalization.\n\nCommon patterns:\n- All three default to mode\u003dallowlist (deny unless in configured\n  group/org); operators opt into open_domain/open_tenant/open_github\n  for public-style deployments.\n- Access token stashed on UserInfo for the subsequent memberships call.\n- 403 soft-fails to empty memberships.\n\nWired into the registry:\n- auth/__init__.py: three new entries in _PROVIDER_CLASSES.\n- auth/providers/__init__.py: re-exports new classes.\n\nTests: 46 mock-based unit tests across tests/unit/auth/, covering\nconfig validation, authorize URL shape, exchange_code happy/error\npaths, membership allowlist + role mapping + 403 soft-fail, and all\nevaluate_login branches.\n\nDocs: auth.example.yaml extended with disabled example blocks for\neach new provider (same pattern as the existing asf + dev_stub blocks).\n\n* docs: add auth.example.yaml template for Phase B operators\n\nReference configuration template. Operators copy this, fill in\nsecrets, and point AUTH_CONFIG_PATH at the copy. Includes blocks\nfor dev_stub (local dev), asf (PR B-1), and google/microsoft/\ngithub (PR B-1.1). All providers disabled by default except\ndev_stub for the example.\n\n* fix(couchdb): drop unsupported n/q kwargs on Server.create()\n\nThe couchdb-python library no longer accepts shard-count (n) and\nshard-quorum (q) kwargs on Server.create(). These params only apply\nto clustered CouchDB deployments anyway; the dev stack runs\nsingle-node where they\u0027re ignored.\n\nSymptom: 500 on any route that triggers DB auto-creation against a\nfresh CouchDB instance (\u0027TypeError: Server.create() got an\nunexpected keyword argument n\u0027).\n\nPre-existing bug, surfaced when testing against a fresh CouchDB.\n\n* fix(cors): use computed allowed_origins, don\u0027t hardcode wildcard\n\napp_factory.py computed allowed_origins from FRONTEND_URL then\ndiscarded it, hardcoding allow_origins\u003d[\u0027*\u0027]. With\nallow_credentials\u003dTrue the browser blocks responses because the\nCORS spec forbids wildcard + credentials.\n\nPre-existing bug. Exposed by PR B-2\u0027s fetchInterceptor adding\ncredentials:\u0027include\u0027 to every API call to support session cookies.\nBefore B-2, nothing sent credentials, so the wildcard was tolerated.\n\nFix: honor the computed allowed_origins list.\n\n* chore(dev): python 3.12 image, align playwright on port 3000, add dev-tail\n\n- Dockerfile.api: bump base image from python:3.10-slim to\n  python:3.12-slim. Silences google.api_core\u0027s FutureWarning about\n  Python 3.10 EOL in Oct 2026.\n- Dockerfile.api: upgrade pip before installing requirements and\n  pass --root-user-action\u003dignore to silence the \u0027running pip as\n  root\u0027 warning in container builds.\n- playwright.config.js: baseURL and dev-server command on port 3000\n  to match the backend\u0027s FRONTEND_URL default (which drives the\n  CORS allowlist).\n- dev-tail.sh: new local dev runner that starts docker + vite in a\n  single script with tailing logs. Uses isolated\n  COMPOSE_PROJECT_NAME\u003dgofannon-dev so other compose projects on\n  the host aren\u0027t disturbed. Supports --phase-b for Phase B auth\n  testing with a dev_stub-configured yaml, and --stop for clean\n  teardown.\n\n* refactor(auth): make session auth the default dev stack mode\n\nInline the auth.yaml mount into docker-compose.yml, commit a working\n.dev-auth.yaml at the repo root with three dev_stub users\n(alice/bob/site_admin_1), and remove the override mechanism that\nwas conditionally generated by dev-tail.sh.\n\nAfter this:\n  ./dev-tail.sh         # auth is on, login works out of the box\n  ./dev-tail.sh --stop  # unchanged\n\nOperators deploying gofannon override AUTH_CONFIG_PATH and mount\ntheir own auth.yaml at deploy time; the committed .dev-auth.yaml\nexists only for local development. The header comment in that file\nspells out the dev-only nature loudly enough that nobody copies it\ninto production by accident.\n\nPersonal customization without touching the committed file: copy\nto .dev-auth.local.yaml (gitignored) and point the api service\u0027s\nvolume mount at that copy.\n\nDocumentation for the new flow lives at\ndocs/developers/local-auth.md — covers the committed fixtures, the\n.dev-auth.local.yaml escape hatch, production guidance, and\ntroubleshooting.\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n* test(cors): update assertion to match fixed allowed_origins behavior\n\nThe companion fix (a9add26 \u0027fix(cors): use computed allowed_origins,\ndon\u0027t hardcode wildcard\u0027) made the production code honor FRONTEND_URL\ninstead of hardcoding [\u0027*\u0027]. This test was asserting the old buggy\nbehavior; update to assert the new correct behavior.\n\n* test(e2e): rewrite global-setup for session-based dev_stub auth\n\nThe previous global-setup seeded localStorage with a mock user, which\nworked when the frontend\u0027s authService picked mockAuth at module-load\ntime. With session auth as the default, mockAuth is not loaded; the\nseeded localStorage is ignored; tests start unauthenticated and the\nAccountCircle menu (only rendered when logged in) never appears.\n\nReplace with a setup that walks the dev_stub login flow:\n  - GET /auth/login/dev_stub kicks off the OAuth-shaped flow\n  - Picker page (rendered by backend) lists configured users as \u003ca\u003es\n  - Click the alice link → backend callback → session cookie set\n  - storageState now contains gofannon_sid; tests inherit it\n\nAdds E2E_STUB_USER env var so a suite can run as bob (deny path)\nor site_admin_1 (admin views) without editing the file. Adds a post-\nlogin /auth/me sanity check so authentication failures produce a\nuseful error instead of cascading into \u0027AccountCircle not found\u0027\ntimeouts in every test.\n\n* fix: refresh-redirects, stale namespaces, and webui readiness probe\n\nThree unrelated fixes bundled into one commit.\n\n1. sessionAuth.onAuthStateChanged was firing callback(null)\n   synchronously on first listener subscription, before /auth/me\n   resolved. AuthContext set loading\u003dfalse on the null callback;\n   PrivateRoute saw {user: null, loading: false} and bounced to\n   /login; LoginPage\u0027s \u0027if (user) navigate(/)\u0027 fired the moment\n   /auth/me resolved with the real user; user landed on home with\n   no idea what happened. Refresh on /agent/\u003cid\u003e always landed on\n   home as a result. Fix: only emit synchronously if we already\n   have a resolved user (covers later subscriptions); otherwise\n   wait for _fetchMe to resolve and let _emit() send the real\n   value, keeping AuthContext in loading\u003dtrue until then.\n\n2. HomePage and DataStoreConfigAccordion fetched the namespace\n   list only on mount with [] deps. A namespace created in another\n   tab/page didn\u0027t appear until hard refresh. Fix: refetch on\n   visibilitychange so coming back to a tab gives fresh data.\n\n3. run-all-tests.sh checked for a \u0027webui\u0027 container in \u0027docker ps\u0027\n   as the gate on running e2e tests. With dev-tail.sh the webui is\n   vite on the host, not a container, so the check always failed.\n   Fix: replace with a curl probe of localhost:3000 — answers the\n   actual question (can e2e reach the frontend?) and works whether\n   the frontend is vite, nginx-in-compose, or anything else.\n\n* feat(agents): allow pasting agent code without generation\n\nThe agent editor required users to click Generate Code before they\ncould see the code editor or save the agent. Two friction points:\n\n1. The Agent Code accordion was gated on hasCode, so the editor\n   was hidden entirely until code existed. Users with code already\n   written (or copied from another agent) had no way to drop it in.\n\n2. Save validation required a non-empty description even when code\n   was already present. Description exists primarily as the prompt\n   input for the LLM generator; once code exists, it\u0027s optional\n   metadata.\n\nUn-gate the accordion: always render, default-expanded in the\ncreation flow or when code exists, with a hint pointing at both\npaths (paste here, or use Generate Code below). Reorder save\nvalidation to check code first, and only require description\nwhen code is absent.\n\nThe Generate Code button is unchanged and still requires a\ndescription (correct — that operation does need it). This just\nadds \u0027paste your own\u0027 as an equally valid path.\n\n* feat(sandbox+profile): per-agent progress log; trim profile menu\n\nSandbox Progress Log\n\nAdds a structured per-run trace and a Progress Log accordion in the\nsandbox right column above the data-store panel.\n\nBackend (services/agent_trace.py): Trace collects events\n(agent_start, agent_end, llm_call, data_store, error, stdout, log).\nBound to the asyncio task tree via contextvar so nested layers emit\nwithout threading the collector through every signature.\ncapture_user_io() routes stdout/stderr/logging into the trace, with\n4KB-per-event and 2000-event caps. GOFANNON_DISABLE_USER_TRACE\u003d1\nsuppresses user-origin capture; structural events still emit.\nFailure path returns a structured response with partial trace\ninstead of raising. friendly_name flows through the request to the\ntrace\u0027s per-event agent_name.\n\nFrontend (SandboxProgressLog): runs listed newest-first, each with\nper-agent groups. Outcome icons, durations, \u0027chained\u0027 badges for\nnested calls. Errors highlighted with red border + bg. Multi-line\ncontent truncated to 3 lines with a \u0027more\u0027 link to a Drawer side\nsheet (right anchor, 600px). In-memory history, refresh wipes.\nTransport errors get a synthetic event so the log doesn\u0027t spin.\n\nTrace ships in the bulk response — events appear at run completion,\nnot live. SSE streaming follow-up planned.\n\ndocs/developers/agent-trace.md covers the env var, caps, contextvar\nrationale, and how to add new event types.\n\nProfile Menu Cleanup\n\nDrop Basic Info / Usage / Billing menu items (placeholders with no\ncontent); ProfilePage now renders ApiKeysTab directly.\n\nRestyle ApiKeysTab to match other top-level pages: constrained max\nwidth, back-arrow + h5 title, single in-place TextField per row,\n\u0027Configured\u0027 chip only when keyed. Tests realigned.\n\n* feat(sandbox): bucket stdout/log lines in the progress log\n\nLong-running agents (e.g. the ASVS auditor that emits hundreds of\nprint() lines per run) made the Progress Log accordion unwieldy:\nthe panel grew vertically without bound and the right column\nspilled past its boundary. Reading the run shape — what LLM calls\nhappened, where errors hit — meant scrolling through walls of\ndebug output.\n\nBucket stdout/log events into per-agent collapsible rows. Each\ncontiguous run of stdout/log events between structural events\n(llm_call, data_store, error, agent_end) becomes one row showing\n\u0027N lines of stdout/log output · click to view\u0027. Buckets break at\nstructural events so chronological flow is preserved — you still\nsee \u0027agent prints → LLM call → agent prints more\u0027, just with each\n\u0027prints\u0027 segment collapsed.\n\nClick → side sheet shows all the bucketed lines in a scrollable\nmonospace block, with timestamp gutter and per-line error\nhighlighting (heuristic: lines containing ERROR/FAIL/TRACEBACK\nget a red left border).\n\nThe bucket summary row pops the latest error-flavored line into a\npreview underneath (\u0027Latest: ERROR: ...consolidated.md\u0027) and\nshows an error count badge (\u002747 lines · 30 with errors\u0027), so the\ncommon \u0027agent caught an exception, printed it, kept going\u0027\nfailure mode is visible without clicking.\n\nStructural events (llm_call, data_store, error, agent_end) still\nrender inline. Errors keep their red border + bg highlight.\nStack traces still go to the existing single-event side sheet\nview; bucket view is a sibling Drawer mode that\u0027s mutually\nexclusive with the single-event view.\n\n* feat(sandbox): stream trace events via SSE\n\nSandbox runs waited for the agent to finish before showing any\ntrace events — for long agents (file ingest, multi-step LLM\nflows) the Progress Log spun for minutes showing \u0027No events\nrecorded\u0027 while api logs filled with the agent\u0027s actual output.\n\nAdds POST /agents/run-code/stream returning text/event-stream.\nEach Trace event becomes one SSE \u0027trace\u0027 frame, dispatched to\nthe client within ~50ms. A final \u0027done\u0027 frame carries result,\nerror, schema_warnings, and ops_log.\n\nTrace gains an optional asyncio.Queue. attach_queue() wires it\nup before the agent runs; every Trace.append() also publishes\nto the queue (put_nowait, never blocks emitters). The streaming\nendpoint runs the agent in an asyncio.Task and pulls from the\nqueue, yielding SSE frames until a sentinel signals completion.\n\nFrontend uses fetch + ReadableStream rather than EventSource\n(POST and custom headers needed). agentService gains\nrunCodeInSandboxStreaming which parses SSE frames manually and\ndispatches each event to an onEvent callback. SandboxScreen\nwires onEvent into setRuns so events accumulate in the in-flight\n\u0027running\u0027 entry as they arrive.\n\nNon-streaming /agents/run-code endpoint stays for callers that\nwant the bulk response (deployed agents, scripts, batch tests).\nBoth share _execute_agent_code; only the response shape differs.\n\n30s heartbeat comment frames prevent proxy idle-timeout.\nX-Accel-Buffering: no header tells nginx not to buffer the\nresponse body.\n\n* test(e2e): fix profile-tabs nav test for trimmed menu\n\nThe test navigated to /profile/basic (a placeholder route that\u0027s\ngone) then clicked text\u003dAPI Keys, which drifted onto the h5 page\ntitle because ProfilePage now always renders ApiKeysTab regardless\nof the path segment. Click hit the page title behind the still-\nopen menu backdrop, timed out.\n\nStart from / instead, and use getByRole(\u0027menuitem\u0027) to target the\nmenu item unambiguously.\n\n* Lowering vitest threshold to pass CI\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n* test(frontend): also drop statements threshold to 15\n\nCompanion to 9e113f9 which dropped lines but missed statements.\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n---------\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "874e379cef74978a5e80d59bfe4cce2c20dadce2",
      "tree": "a637a9de391aeb6366678faf805aa0b79215031d",
      "parents": [
        "3ef3b69c702fdb9f01310b0a427415c5627294b9"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Apr 28 01:14:48 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Apr 28 01:14:48 2026 -0700"
      },
      "message": "Clean readme\n"
    },
    {
      "commit": "3ef3b69c702fdb9f01310b0a427415c5627294b9",
      "tree": "7b7217b9acef8319a82cf769c9120706949f33f8",
      "parents": [
        "078b2e1331b116a5258c35a4ef51281c265b9d80"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Apr 20 17:24:47 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Apr 20 17:24:47 2026 -0700"
      },
      "message": "Bumping couch version, specifying two schedulng threads\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n"
    },
    {
      "commit": "078b2e1331b116a5258c35a4ef51281c265b9d80",
      "tree": "50fa527d3f9b3d197da6409535d4fbeac0e8ecad",
      "parents": [
        "eaddd13908dc41e3f604dcd3901ed8a5995939c1"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Apr 03 00:22:01 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Apr 03 00:22:01 2026 -0700"
      },
      "message": "Fixing index name to prevent duplicate index rebuilds\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n"
    },
    {
      "commit": "eaddd13908dc41e3f604dcd3901ed8a5995939c1",
      "tree": "435430417380a21cb2e214c204474ce22ad89493",
      "parents": [
        "4d39d53f12c6ea1ac8b714a96f1eee4ddf0dca25"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Thu Mar 19 15:28:48 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Thu Mar 19 15:28:48 2026 -0700"
      },
      "message": "Revert \"Gitignore .env\"\n\nThis reverts commit 4d39d53f12c6ea1ac8b714a96f1eee4ddf0dca25.\n"
    },
    {
      "commit": "4d39d53f12c6ea1ac8b714a96f1eee4ddf0dca25",
      "tree": "cff7ca8c89fec9d09ce63a7a636c316b9f92f7a7",
      "parents": [
        "c69b3abce653c6ca819c88d074d39c92e18059be"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Thu Mar 19 15:21:34 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Thu Mar 19 15:21:34 2026 -0700"
      },
      "message": "Gitignore .env\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n"
    },
    {
      "commit": "c69b3abce653c6ca819c88d074d39c92e18059be",
      "tree": "435430417380a21cb2e214c204474ce22ad89493",
      "parents": [
        "7158dac06386e02a15ca6d689ee6951de2ff8701"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Thu Mar 19 15:16:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 19 15:16:19 2026 -0700"
      },
      "message": "Fixing timeouts and handling scale (#574)\n\n* Fixing timeouts and handling scale\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n\n* Fixing timeouts and handling scale\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n\n---------\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "7158dac06386e02a15ca6d689ee6951de2ff8701",
      "tree": "223298846b8fca25790b6128b620f63d5a62f441",
      "parents": [
        "b12803479eedcd48dc8d535ed91c1f3c100a717b"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Mar 16 14:31:35 2026 -0700"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Mar 16 14:31:44 2026 -0700"
      },
      "message": "Fixing bedrock model name\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n"
    },
    {
      "commit": "b12803479eedcd48dc8d535ed91c1f3c100a717b",
      "tree": "af736241855d72dd2f5b978a13af86432f0166df",
      "parents": [
        "8dcbbae1e4e31401541c5ebe3821a2116595a705"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Mar 05 16:18:41 2026 -0600"
      },
      "committer": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Mar 05 16:18:41 2026 -0600"
      },
      "message": "ga\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n"
    },
    {
      "commit": "8dcbbae1e4e31401541c5ebe3821a2116595a705",
      "tree": "14d3282712bc8ff08ce39b2a3d5d8f83f9b92f7d",
      "parents": [
        "37aa0d5569e70bb155c897d55b4955d21a56b690"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Mar 03 13:49:47 2026 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Mar 03 13:49:47 2026 -0800"
      },
      "message": "Removing docs and build configs from skip lists in prompt\n"
    },
    {
      "commit": "37aa0d5569e70bb155c897d55b4955d21a56b690",
      "tree": "95a192ab23237f1acbf8fd439c319d02c99710bc",
      "parents": [
        "0e0a34a1dfd9be335f4165775d141eab3af58d52"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Mar 02 10:04:50 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 12:04:50 2026 -0600"
      },
      "message": "Adding indexes and bulk operations; fixes #571 (#573)\n\n"
    },
    {
      "commit": "0e0a34a1dfd9be335f4165775d141eab3af58d52",
      "tree": "d3408a41635f15783d53bc6cc0d9e355a104b73a",
      "parents": [
        "b54556efb191c9c97534165ca3ef4f202abb8f05"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Feb 10 12:25:27 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 10 12:25:27 2026 -0800"
      },
      "message": "Context window awareness; fixes #565 (#567)\n\n* Context window awareness; fixes #565\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n\n* Hot fix for model config slowness; fixes #561\n\n* Editing opus-4.6 id, adding TODO\n\n* Adding docs and tests\n\n---------\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "b54556efb191c9c97534165ca3ef4f202abb8f05",
      "tree": "969094478686a5aa4e7e761e68810d4f6250c9dc",
      "parents": [
        "1c90e452443a5dbb252fc25e2a77142de2e211bf"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Feb 10 11:18:58 2026 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Feb 10 11:18:58 2026 -0800"
      },
      "message": "Hot fix for model config slowness; fixes #561\n"
    },
    {
      "commit": "1c90e452443a5dbb252fc25e2a77142de2e211bf",
      "tree": "ae6c5815a47464e186fa36eb95599d15b1e71cde",
      "parents": [
        "c25d7da1290e55f58bfedd5bc1568e9c189224c9"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Feb 06 17:10:58 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 06 17:10:58 2026 -0800"
      },
      "message": "Fixing docker couch hang; fixes #547 (#558)\n\n* Fixing docker couch hang; fixes #547\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n* Removing suppress flag in healthcheck\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e\n\n---------\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "c25d7da1290e55f58bfedd5bc1568e9c189224c9",
      "tree": "968ef1fea03f30a4ce2c002d046ae012fab87212",
      "parents": [
        "41f9183d1ad1ba505758d28561384dd0fdbe5729"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Feb 06 17:10:46 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 06 17:10:46 2026 -0800"
      },
      "message": "Adding undeploy; fixes #543 (#559)\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "41f9183d1ad1ba505758d28561384dd0fdbe5729",
      "tree": "31c2914ce433d7fed47effeb6627586d55a917f7",
      "parents": [
        "d5b805a8888d617c591dcac13d9fccfb07d7b286"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Feb 06 17:10:26 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 06 17:10:26 2026 -0800"
      },
      "message": "Adding opus 4.6; fixes #560 (#564)\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "d5b805a8888d617c591dcac13d9fccfb07d7b286",
      "tree": "e4876cf25292cfb8dc71410db4e5600173c2a836",
      "parents": [
        "6705a78cfcb0f00c2b5b10521f48c74fb19b330f"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Wed Feb 04 23:05:40 2026 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Wed Feb 04 23:05:40 2026 -0800"
      },
      "message": "Fixing couch db creation to use one replica, cleans up an error in logs during successful call\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "6705a78cfcb0f00c2b5b10521f48c74fb19b330f",
      "tree": "1446e3352e473fef24deee57800f9eb83cb68581",
      "parents": [
        "bfcbb68d9a7e8e710ca8cd9af215a55d78cdf95d"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Wed Feb 04 18:02:08 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 04 18:02:08 2026 -0800"
      },
      "message": "Fix bedrock config 554 (#556)\n\n* Fix bedrock config; fixes #554\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n* Fixing tests\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n---------\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "bfcbb68d9a7e8e710ca8cd9af215a55d78cdf95d",
      "tree": "4035a21fd2c17458919ad681d16b4b60a95b3072",
      "parents": [
        "e91982b48a73e2baf3df3c25f6ffd6eb2cf7792c"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Wed Feb 04 18:01:47 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 04 18:01:47 2026 -0800"
      },
      "message": "Add persistent data layer (#553)\n\n* Add persistent data layer; fixes #550\n\n* Add persistent data layer; fixes #550\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n\n---------\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "e91982b48a73e2baf3df3c25f6ffd6eb2cf7792c",
      "tree": "0d970ced7e49bfd0ecb035984ec5fa875a32f0d3",
      "parents": [
        "15d454ddb795dc7f28f3a7bd6d7262e66052616f"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Feb 02 10:39:34 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 10:39:34 2026 -0800"
      },
      "message": "Update webapp-tests.yml\n\nBumping node version per failing workflow:\r\n```\r\nRun pnpm test:e2e\r\n\u003e gofannon-webapp-monorepo@1.0.0 test:e2e /home/runner/work/gofannon/gofannon/webapp\r\n\u003e playwright test\r\n[WebServer] You are using Node.js 18.20.8. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.\r\n```\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "15d454ddb795dc7f28f3a7bd6d7262e66052616f",
      "tree": "575c439fc4c6bd3b1ca5f1d4e81c65e6dacc372c",
      "parents": [
        "158a8dd9e3083d2896bf3cab5473ad3faf27627f"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Feb 02 10:39:11 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 10:39:11 2026 -0800"
      },
      "message": "Update pr-unit-tests.yml\n\nBumping node version per failing workflow:\r\n```\r\nRun pnpm test:e2e\r\n\u003e gofannon-webapp-monorepo@1.0.0 test:e2e /home/runner/work/gofannon/gofannon/webapp\r\n\u003e playwright test\r\n[WebServer] You are using Node.js 18.20.8. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.\r\n```\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "158a8dd9e3083d2896bf3cab5473ad3faf27627f",
      "tree": "c51c4792c4eaa48e038fa1f8620471162b03bb74",
      "parents": [
        "e3c7f14058a54dbb848f343361d7363bb84bd57a"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Feb 02 10:38:14 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 10:38:14 2026 -0800"
      },
      "message": "Update nightly-integration-tests.yml\n\nBumping node version per failing workflow:\r\n```\r\nRun pnpm test:e2e\r\n\u003e gofannon-webapp-monorepo@1.0.0 test:e2e /home/runner/work/gofannon/gofannon/webapp\r\n\u003e playwright test\r\n[WebServer] You are using Node.js 18.20.8. Vite requires Node.js version 20.19+ or 22.12+. Please upgrade your Node.js version.\r\n```\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "e3c7f14058a54dbb848f343361d7363bb84bd57a",
      "tree": "fae6ca9544c117450f7d88e0ae2058d0f3139124",
      "parents": [
        "4ee470be75e1243b3eab6b14435099e42ac61af7"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Feb 01 20:31:33 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 20:31:33 2026 -0800"
      },
      "message": "Update playwright.config.js\n\nFixing failing nightly worfklow\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "4ee470be75e1243b3eab6b14435099e42ac61af7",
      "tree": "6b5e8416c68af672eca5e4427ca2ebb31e8781fa",
      "parents": [
        "dcb02793817171b17f2efb13dafe673495794281"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Feb 01 10:23:35 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 10:23:35 2026 -0800"
      },
      "message": "Additions to prompt for large data, fixes #542 (#546)\n\n"
    },
    {
      "commit": "dcb02793817171b17f2efb13dafe673495794281",
      "tree": "82c90b9a9107194e7dc2f40159e55de86da1a56e",
      "parents": [
        "94182de4c8ea34a39d25241341277aca93f4fd14"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Feb 01 10:22:39 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 10:22:39 2026 -0800"
      },
      "message": "Anthropic config, fixes #541 (#545)\n\n"
    },
    {
      "commit": "94182de4c8ea34a39d25241341277aca93f4fd14",
      "tree": "454f39297390288ca861a5ec2f231ab9f01085a8",
      "parents": [
        "eef8d6934ab952cf3382b1f9682d7d8f912a632f"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Feb 01 10:22:23 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 10:22:23 2026 -0800"
      },
      "message": "LLM setting passthrough fixes #540 (#544)\n\n"
    },
    {
      "commit": "eef8d6934ab952cf3382b1f9682d7d8f912a632f",
      "tree": "ee9944be47996e7edc19c93c5af40366f6f214bd",
      "parents": [
        "27acf9d857f5a5e5d7b1173dfdcca0a64cb74c1a"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Jan 30 17:12:22 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 30 17:12:22 2026 -0800"
      },
      "message": "Update pr-unit-tests.yml\n\nCommenting out codecov for now, filed https://github.com/The-AI-Alliance/gofannon/issues/539 to fix the root cause\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "27acf9d857f5a5e5d7b1173dfdcca0a64cb74c1a",
      "tree": "4b7c48ef8c2633857b201dd29b026309cfe7acaf",
      "parents": [
        "7858f79ade1da31aae9ca82ff845b1da7a67e9c4"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Jan 30 17:04:02 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 30 17:04:02 2026 -0800"
      },
      "message": "Add bedrock to configs #537 (#538)\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "7858f79ade1da31aae9ca82ff845b1da7a67e9c4",
      "tree": "927cc4c83a2b6708655ffb2f4ee7d349cf2dac2c",
      "parents": [
        "c62e62ceaa7a681a7b809c7e33af8308f068318c"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Jan 30 16:52:50 2026 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Jan 30 16:52:50 2026 -0800"
      },
      "message": "Adding providers to example.env\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "c62e62ceaa7a681a7b809c7e33af8308f068318c",
      "tree": "94aeb4de2054b2e3b1cc846b24e1797775739c4f",
      "parents": [
        "4fb78178cd48f433c57f19908496a7f715fc8e4a"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 29 15:05:25 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 29 15:05:25 2026 -0600"
      },
      "message": "add gofanon front and center on the website (#536)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "4fb78178cd48f433c57f19908496a7f715fc8e4a",
      "tree": "0e6d31f69e27b26408d076e4e3c0d32d6d2c94a4",
      "parents": [
        "2da445d24ba6f874bc3c74248f5fa802d6d651d7"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Wed Jan 28 18:56:26 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 28 16:56:26 2026 -0800"
      },
      "message": "user managed api keys (#534)\n\n* user managed api keys\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add FE Unit Tests\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* linting error on test\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* generate code and run in sandbox now working\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Demo apps work now too\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "2da445d24ba6f874bc3c74248f5fa802d6d651d7",
      "tree": "0902897a3288bd2521b5df879e6026b646ae5d43",
      "parents": [
        "89c840d65aaaecadd6b25fe68b1e22b83aa7fba5"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 11:22:02 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 11:22:02 2026 -0600"
      },
      "message": "decompose workflows (#531)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "89c840d65aaaecadd6b25fe68b1e22b83aa7fba5",
      "tree": "6f26f97620bd2dfa983bd7b65974f51c87c36f7f",
      "parents": [
        "bdf26fe247fe08a93f9ace0a6d078943c640d1de"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 10:50:07 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 10:50:07 2026 -0600"
      },
      "message": "Gh pages problems (#529)\n\n* fix site build\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* gh pages issues\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "bdf26fe247fe08a93f9ace0a6d078943c640d1de",
      "tree": "4917694ac78ea7ce0039d620297a71f20482841c",
      "parents": [
        "16e85453ffe87ad9b97e764a6cc7b834418f4739"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 10:42:19 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 10:42:19 2026 -0600"
      },
      "message": "fix site build (#528)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "16e85453ffe87ad9b97e764a6cc7b834418f4739",
      "tree": "78802c757685db9348374687c8d3a9b5b70e92b4",
      "parents": [
        "38d705bd46a0e2c41d7a4cf8bd26e8e0804ba43d"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 10:37:33 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 10:37:33 2026 -0600"
      },
      "message": "Restyle again (#527)\n\n* Restyle again\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* re instate workflow file\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "38d705bd46a0e2c41d7a4cf8bd26e8e0804ba43d",
      "tree": "1bb9be4c47e680977c9e7194ad158f9326357e81",
      "parents": [
        "03ee85da13af4796c8430606c31d8bbc4b07ea2a"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 10:04:38 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 10:04:38 2026 -0600"
      },
      "message": "Website edits (#526)\n\n* Fixes #516\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Fixes 513\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Cleaning up warnings/etc\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "03ee85da13af4796c8430606c31d8bbc4b07ea2a",
      "tree": "800ff35e0998f63ba3ecc6807d79c6a6b8725dd8",
      "parents": [
        "bfa3f7793ea1c9a9f887f00c909f652cde60aa63"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 27 05:50:34 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 27 05:50:34 2026 -0600"
      },
      "message": "Style (#524)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "bfa3f7793ea1c9a9f887f00c909f652cde60aa63",
      "tree": "47c4a4ee2902a3ab6e1ee54d11c72512bcc19462",
      "parents": [
        "66edc4c290b041aa8914931a2c2b03d3659d6700"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Sat Jan 24 10:52:12 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 24 10:52:12 2026 -0600"
      },
      "message": "Docusaurus Init (#522)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "66edc4c290b041aa8914931a2c2b03d3659d6700",
      "tree": "2d877ba77d28ef5b23ee1bd625225c05c8bdcf01",
      "parents": [
        "add9ffb5a35c5a9856f7a3633afa6457c936147d"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Wed Jan 21 19:14:37 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 19:14:37 2026 -0600"
      },
      "message": "508: Remove direct calls to litellm (#510)\n\n* Fixes #508 Remove litellm\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* built in tools\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Pass params through to invokable models\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "add9ffb5a35c5a9856f7a3633afa6457c936147d",
      "tree": "ba1cc28f96c0aee73a56ef6f53e793b4563408ea",
      "parents": [
        "2000790f319ce52272cfbf1858ca2307d2876fb7"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Wed Jan 21 10:30:56 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 10:30:56 2026 -0600"
      },
      "message": "Issue and PR templates closes 353 (#518)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "2000790f319ce52272cfbf1858ca2307d2876fb7",
      "tree": "943c42b6f71327f95cf9e56483a7a9c04484e9e0",
      "parents": [
        "5d7572bc16ae0c1e5dde854f604509bbe57d8911"
      ],
      "author": {
        "name": "Krishna Dave",
        "email": "krishna.dave2024@nst.rishihood.edu.in",
        "time": "Wed Jan 21 18:17:41 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 21 06:47:41 2026 -0600"
      },
      "message": "Add minimal Playwright smoke test for webapp (#511)\n\nCo-authored-by: Krishna Dave \u003ckrishnadave@Krishnas-MacBook-Pro-2.local\u003e"
    },
    {
      "commit": "5d7572bc16ae0c1e5dde854f604509bbe57d8911",
      "tree": "adac56b5450ceefac8ceed3f76ece8495ddd117f",
      "parents": [
        "664e867e80114510615fbe2ec8bd87d54517e1ee"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 20 11:07:24 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 20 11:07:24 2026 -0600"
      },
      "message": "503: Add Perplexity.AI (#505)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "664e867e80114510615fbe2ec8bd87d54517e1ee",
      "tree": "273c60534b677b1ed5ae5732e92ef353a529f0f5",
      "parents": [
        "ab3a837a56be6fc4ce7a50d253f5e0537712b45d"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 20 11:07:12 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 20 11:07:12 2026 -0600"
      },
      "message": "bug 502 bashed (#504)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "ab3a837a56be6fc4ce7a50d253f5e0537712b45d",
      "tree": "958a51a95fd8b8e5650795de2a75da65e866a425",
      "parents": [
        "a9997e2683b91e8d69f60b348800effe463a23a4"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 15 20:07:42 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 15 20:07:42 2026 -0600"
      },
      "message": "typo (#499)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "a9997e2683b91e8d69f60b348800effe463a23a4",
      "tree": "7c8f689cf170b5018c61ddf72cf19d0e7d158171",
      "parents": [
        "148419a190e30d74e993687dc8c609af9b68a7a4"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 15 14:26:37 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 15 14:26:37 2026 -0600"
      },
      "message": "Add dynamoDB to settings, and integrations tests (#498)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "148419a190e30d74e993687dc8c609af9b68a7a4",
      "tree": "a1e3fe0cc8354a06988849ab1765f4eb12565f91",
      "parents": [
        "d4a5df661a6bc602e5fe38dcb4f472f80984af0c"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 15 14:26:23 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 15 14:26:23 2026 -0600"
      },
      "message": "Fix All the Linting Errors (#494)\n\n* fix lint\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* get all tests working\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "d4a5df661a6bc602e5fe38dcb4f472f80984af0c",
      "tree": "86d66f3c8dfc55e0beffb696c500f472826477b8",
      "parents": [
        "312ca26e7010803b9c86fa6f06cff724be3a6f04"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 15 14:26:10 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 15 14:26:10 2026 -0600"
      },
      "message": "Add Thoughts to anthropic (#492)\n\n* Add Thoughts to anthropic\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* real tests (eyeroll)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "312ca26e7010803b9c86fa6f06cff724be3a6f04",
      "tree": "6d947502fc34eacae18636efd7ee8b5cc0e0c3fb",
      "parents": [
        "5e89c150aa32b4990bfc7facf5f32db11a715f76"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Sun Jan 11 14:28:19 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 12:28:19 2026 -0800"
      },
      "message": "llm docs (#487)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "5e89c150aa32b4990bfc7facf5f32db11a715f76",
      "tree": "5ee3d90aa410e037c667abc3fa2e1ce920e003e0",
      "parents": [
        "acaa1f067e4ea6c411bbbe40dd5fa8a215cbf3e3"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Jan 11 12:16:22 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 12:16:22 2026 -0800"
      },
      "message": "Update README.md\n\nAdding note about need to restart application to pick up new db configs\n\nSigned-off-by: Andrew Musselman \u003cakm@apache.org\u003e"
    },
    {
      "commit": "acaa1f067e4ea6c411bbbe40dd5fa8a215cbf3e3",
      "tree": "1c6464dd41e7607ee774f4c0f3775720e8db7716",
      "parents": [
        "c09fae73def54cdafc31c239be29aeedf82a60b5"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Sun Jan 11 14:04:21 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 11 12:04:21 2026 -0800"
      },
      "message": "Add Database Service Docs (#488)\n\n* Database Service Docs\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* break up monolith doc\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* forgot updated database-service.md\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "c09fae73def54cdafc31c239be29aeedf82a60b5",
      "tree": "b31d13d4c8697d89ae9b873d9b74f3003c3ee62c",
      "parents": [
        "9adc7b8d61bd7817798920b729a0a82fec0d8bad"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 08 14:57:07 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 08 14:57:07 2026 -0600"
      },
      "message": "Coverage over 50% of files (#485)\n\n* Coverage over 50% of files\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* turn down to 40%\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "9adc7b8d61bd7817798920b729a0a82fec0d8bad",
      "tree": "38f05561ba6721ec02146f33a3c1c3428a2a958e",
      "parents": [
        "04a886cab82e5f05522f4c3b4941c01efcf5d887"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 08 13:27:09 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 08 11:27:09 2026 -0800"
      },
      "message": "developers quickstart (#483)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "04a886cab82e5f05522f4c3b4941c01efcf5d887",
      "tree": "cce46a8cace8be8891081c2ed5c0e0ad9cff1999",
      "parents": [
        "b24939981bdf024dc25da0b66190888935179b4e"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Thu Jan 08 08:27:21 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jan 08 08:27:21 2026 -0600"
      },
      "message": "Reboot Testing Framework (#479)\n\n* testing hog\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Increase user service test coverage\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add route coverage tests for user service\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add dependency tests for admin access and chat\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add observability service tests\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add unit tests for app factory and routes config\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add unit tests for service utilities\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Fix storage service imports and pytest warnings\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Fix unit test regressions in user-service\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Change coverage threshold from 100 to 34\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* frontend tests\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "b24939981bdf024dc25da0b66190888935179b4e",
      "tree": "dd45227685b6f6ea7be0fd8d53445fdb4dec64ba",
      "parents": [
        "61567ec0c07666c317a96dc13e457bcd160c1767"
      ],
      "author": {
        "name": "Krishna Dave",
        "email": "krishna.dave2024@nst.rishihood.edu.in",
        "time": "Wed Jan 07 22:46:21 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 07 11:16:21 2026 -0600"
      },
      "message": "Add mutually exclusive parameters for temperature and top_p (#478)\n\nAdded mutually_exclusive_with between temperature and top_p for OpenAI models to match behavior with Anthropic model.\n\nSigned-off-by: Krishna Dave \u003ckrishna.dave2024@nst.rishihood.edu.in\u003e"
    },
    {
      "commit": "61567ec0c07666c317a96dc13e457bcd160c1767",
      "tree": "36fd49f61c8ed28102c4c9f05cfc2ba42d0a296e",
      "parents": [
        "7075f595241281f82d49fd0549f248559853ebfb"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 06 18:03:27 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 16:03:27 2026 -0800"
      },
      "message": "465b (#472)\n\n"
    },
    {
      "commit": "7075f595241281f82d49fd0549f248559853ebfb",
      "tree": "83958bb573ffa58a5662e6a0122ac53a28e44b8d",
      "parents": [
        "41f909aa6f0d879d0835e6ee2980b84abdcfc8de"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 06 18:01:43 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 16:01:43 2026 -0800"
      },
      "message": "Update README with .env file setup instructions (#476)\n\n"
    },
    {
      "commit": "41f909aa6f0d879d0835e6ee2980b84abdcfc8de",
      "tree": "1d583fac7353efcafd317a0a67a6ad8f1334fede",
      "parents": [
        "fc764e5548c03c7d00007d59e467f0012e96faf9"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 06 18:00:55 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 16:00:55 2026 -0800"
      },
      "message": "Update README to specify .env file location (#477)\n\n"
    },
    {
      "commit": "fc764e5548c03c7d00007d59e467f0012e96faf9",
      "tree": "914920777ebfc93e5b5566ddab04d8cb903fc82e",
      "parents": [
        "6ca1abd9063674f6c2590ee98a10c08e9516e97f"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Jan 06 13:02:18 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 15:02:18 2026 -0600"
      },
      "message": "Fixing dict handling, built-in web_search (#473)\n\n"
    },
    {
      "commit": "6ca1abd9063674f6c2590ee98a10c08e9516e97f",
      "tree": "6a492080220d396e9ba0f909b7df1db897ef1283",
      "parents": [
        "e0ecd89dc7b1d88fd1905a3b1b46e0afe92772ad"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Jan 06 11:47:43 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 13:47:43 2026 -0600"
      },
      "message": "Adding quickstart (#475)\n\n* Adding quickstart\n\n* Adding tips"
    },
    {
      "commit": "e0ecd89dc7b1d88fd1905a3b1b46e0afe92772ad",
      "tree": "08b0637119142ba0d5317b91901bc1dc386ce06c",
      "parents": [
        "4f5c6c0d646f2b162b9d8e747db0bba0ddb4d83d"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue Jan 06 09:27:18 2026 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Tue Jan 06 09:27:18 2026 -0800"
      },
      "message": "Redirect home after deleting agent\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e\n"
    },
    {
      "commit": "4f5c6c0d646f2b162b9d8e747db0bba0ddb4d83d",
      "tree": "1d54df31806709848eb031df8e4cbe6d5d6968fc",
      "parents": [
        "4b53ba38352d1a7abcd3c57f2919727ab73cf631"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Jan 06 11:14:13 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jan 06 09:14:13 2026 -0800"
      },
      "message": "mutually_exclusive_with (#470)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "4b53ba38352d1a7abcd3c57f2919727ab73cf631",
      "tree": "dcccf9695905e7dd6f4e5035187104f4b17c105c",
      "parents": [
        "af010895e3fd8c7bcc36783d3a9588faa4fc0b2e"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Jan 05 23:42:42 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 23:42:42 2026 -0800"
      },
      "message": "Fixed some bugs (#468)\n\n"
    },
    {
      "commit": "af010895e3fd8c7bcc36783d3a9588faa4fc0b2e",
      "tree": "1986cb3dbf6770e136a0831c4a15b3604fea62d3",
      "parents": [
        "0267b4d06306c8bca06f4c77ca46d75a43982ba5"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Jan 05 20:39:57 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 20:39:57 2026 -0800"
      },
      "message": "UI redo (#467)\n\n* UI redesign\n\n* Typos"
    },
    {
      "commit": "0267b4d06306c8bca06f4c77ca46d75a43982ba5",
      "tree": "d6d27f47e7e37451c1de7178752f23cc352f212d",
      "parents": [
        "509f7f0be169e3ea1215ed3ee31349cb888565df"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Jan 05 22:06:06 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 20:06:06 2026 -0800"
      },
      "message": "refactor and add dynamodb (#465)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "509f7f0be169e3ea1215ed3ee31349cb888565df",
      "tree": "7e84e3395f83c75979251edbc3c9b814f0a31aa2",
      "parents": [
        "1c0949ae587bdf74901c98f5e62e9aa1b6a9edda"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Mon Jan 05 20:05:24 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 20:05:24 2026 -0800"
      },
      "message": "UI redesign (#466)\n\n"
    },
    {
      "commit": "1c0949ae587bdf74901c98f5e62e9aa1b6a9edda",
      "tree": "15354ca316aacbb02b5973e88ee8902d1eb7db06",
      "parents": [
        "fa695b57e49520057c2e765471b56a0ea5342c98"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Jan 05 13:21:15 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 11:21:15 2026 -0800"
      },
      "message": "convert field from string to list (#463)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "fa695b57e49520057c2e765471b56a0ea5342c98",
      "tree": "cd8d30473331dedb9de65c41cc52774b15c89d46",
      "parents": [
        "15363b1ab673f7fbab465da7e8bd093ffa4c3ec0"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Jan 05 11:00:40 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 09:00:40 2026 -0800"
      },
      "message": "update prints with observablity (#462)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "15363b1ab673f7fbab465da7e8bd093ffa4c3ec0",
      "tree": "3d4e1c35e0bad4934ea5f30cc70bf0b4b7b8791b",
      "parents": [
        "efae1be8db4371f2c884fd8a0f290587add7790f"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Jan 05 10:02:10 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jan 05 10:02:10 2026 -0600"
      },
      "message": "Refactor user-service entrypoint and document API (#450)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "efae1be8db4371f2c884fd8a0f290587add7790f",
      "tree": "40efec83afcf0139c0551dab9ca91e5db8a11583",
      "parents": [
        "008a96e19cee5310cf5e15dd282c539d4d863a23"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Jan 04 10:56:15 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 04 10:56:15 2026 -0800"
      },
      "message": "Consolidating agent creation on one page (#456)\n\nSigned-off-by: Andrew Musselman \u003candrew.musselman@gmail.com\u003e"
    },
    {
      "commit": "008a96e19cee5310cf5e15dd282c539d4d863a23",
      "tree": "a904f320277c4b0aa69294b1edb610d806d59fd4",
      "parents": [
        "902e0db26f970c958eab7f8114510077372d5dac"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Jan 04 10:17:38 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 04 10:17:38 2026 -0800"
      },
      "message": "Rework create agent (#454)\n\n* Save invokable and compose models, allow iteration of prompt on view agent screen.\n\n* Cleanup of models and params, UX improvements\n\n* Fixing typo that caused response not define error\n\n* Consolidates create and edit agent code\n\n* Removing unused files"
    },
    {
      "commit": "902e0db26f970c958eab7f8114510077372d5dac",
      "tree": "f26383a3440b8efab95d27b262f473931d95ea4b",
      "parents": [
        "b8c7d5b7124753d83e404b0c8eb230b3c02d5486"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Sun Jan 04 09:56:45 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jan 04 11:56:45 2026 -0600"
      },
      "message": "Agent workflow improvement (#453)\n\n* Save invokable and compose models, allow iteration of prompt on view agent screen.\n\n* Cleanup of models and params, UX improvements\n\n* Fixing typo that caused response not define error"
    },
    {
      "commit": "b8c7d5b7124753d83e404b0c8eb230b3c02d5486",
      "tree": "01dca4695eaa9846e2b85d0cd9ef8d6305837279",
      "parents": [
        "9a75b0febfd0b8e092cd79a4929fa5d3e7f99a64"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Fri Jan 02 09:37:24 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jan 02 11:37:24 2026 -0600"
      },
      "message": "Save invokable and compose models, allow iteration of prompt on view agent screen. (#449)\n\n"
    },
    {
      "commit": "9a75b0febfd0b8e092cd79a4929fa5d3e7f99a64",
      "tree": "7749b099bb5cda9198d1eaad7d84f99593133bc4",
      "parents": [
        "c837f47af9dde9c522ec6387c9055c477d2cc307"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "akm@apache.org",
        "time": "Tue Dec 30 13:21:26 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 30 15:21:26 2025 -0600"
      },
      "message": "Agent creation and execution working locally, anthropic provider refactored (#448)\n\n"
    },
    {
      "commit": "c837f47af9dde9c522ec6387c9055c477d2cc307",
      "tree": "8a3b294404e44437b46e3377f371d1ff1101ee91",
      "parents": [
        "2b87d5b6859977b30c8e2453b6f11a336e5ac952"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Dec 12 11:16:17 2025 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Dec 12 11:16:17 2025 -0800"
      },
      "message": "Fixing typo in docker-compose\n"
    },
    {
      "commit": "2b87d5b6859977b30c8e2453b6f11a336e5ac952",
      "tree": "59bd33602aaa3c5b934bc22970cccc6ae016f7d8",
      "parents": [
        "a5c4a629a430a47383212f8d566b0d36e77986dd"
      ],
      "author": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Dec 12 11:14:29 2025 -0800"
      },
      "committer": {
        "name": "Andrew Musselman",
        "email": "andrew.musselman@gmail.com",
        "time": "Fri Dec 12 11:14:29 2025 -0800"
      },
      "message": "Fixing typo for docker quickstart\n"
    },
    {
      "commit": "a5c4a629a430a47383212f8d566b0d36e77986dd",
      "tree": "a2e2b7586f071395962dd680e60842b9443b9ceb",
      "parents": [
        "f94524eb6537b844235d0a894f8a87713ab155b2"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Dec 02 16:32:39 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 16:32:39 2025 -0600"
      },
      "message": "Harden observability logging serialization (#447)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "f94524eb6537b844235d0a894f8a87713ab155b2",
      "tree": "939cbf1f1412bc87e71f239769801070cc7728a2",
      "parents": [
        "598ea772125d6b546b2ae04805682f1033a82fe9"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Dec 02 14:43:25 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 14:43:25 2025 -0600"
      },
      "message": "[hotfix] missing import\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "598ea772125d6b546b2ae04805682f1033a82fe9",
      "tree": "7f0c58fb08bf23413e0771e94f1a1a57aa9ce7eb",
      "parents": [
        "152c438602c0cae60b89c934dbdf376746975b97"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Dec 02 14:38:39 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 14:38:39 2025 -0600"
      },
      "message": "FirebaseDB Service is back (#446)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "152c438602c0cae60b89c934dbdf376746975b97",
      "tree": "5e336915ae4c82bb6a909cf271e7f39f52eeaf41",
      "parents": [
        "82c679cc8ba9809e26f2ef30bf54cce7158d9619"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Tue Dec 02 13:38:25 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 02 13:38:25 2025 -0600"
      },
      "message": "Refactor user-service main into dependency module (#445)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "82c679cc8ba9809e26f2ef30bf54cce7158d9619",
      "tree": "4c0270b3b76560296d9ff50a52b430d311967ecf",
      "parents": [
        "69f5461e0356d3b413bf18b33e7abdb77ca8597b"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Dec 01 19:44:00 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 19:44:00 2025 -0600"
      },
      "message": "Add password-protected admin panel (#444)\n\n* Add password-protected admin panel\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* config changes\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "69f5461e0356d3b413bf18b33e7abdb77ca8597b",
      "tree": "b37d4c80ebe6a832215a1a537c645009aeb390fa",
      "parents": [
        "9112242d4b88d2951dd65fc3b7a7c86b4d14dc78"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Dec 01 17:09:41 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 17:09:41 2025 -0600"
      },
      "message": "Add user usage model and tracking endpoints (#443)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "9112242d4b88d2951dd65fc3b7a7c86b4d14dc78",
      "tree": "b2f17ba539dfc9474f21fed1dcc7b83dd47e3d68",
      "parents": [
        "f09ad262574dba652a772326116366b950444447"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Dec 01 15:15:45 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 15:15:45 2025 -0600"
      },
      "message": "[hotfix] add gpt-5.1 and gemeni-3 (#439)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "f09ad262574dba652a772326116366b950444447",
      "tree": "84e99f43e7a49467562584454cfbc2bbd9a1d5f5",
      "parents": [
        "b4a7cd18ef0b061c989d8ea5c893c4cd20a87a0e"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Dec 01 15:15:26 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 15:15:26 2025 -0600"
      },
      "message": "Profile pages (#442)\n\n* Adjust profile navigation menu options\n\n* update profile page\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "b4a7cd18ef0b061c989d8ea5c893c4cd20a87a0e",
      "tree": "be7a889e651799cdc916710b17f9311e4be14592",
      "parents": [
        "e311b1de867b5f6db5da37408dc852b5154f853f"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Mon Dec 01 14:14:33 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 01 14:14:33 2025 -0600"
      },
      "message": "Standard logging payload (#441)\n\n* Add observability logging for LiteLLM calls\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n* Add environment-controlled LiteLLM logging modes\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e\n\n---------\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "e311b1de867b5f6db5da37408dc852b5154f853f",
      "tree": "28379117c76f42d5c4a01e4a44090e704a061691",
      "parents": [
        "1fe09620230fc90d14d9c478a84feff1d7af0aca"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Fri Nov 21 10:41:58 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 10:41:58 2025 -0600"
      },
      "message": "Update build-site.yml\n\nhotfix\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "1fe09620230fc90d14d9c478a84feff1d7af0aca",
      "tree": "7c56a4966cf7b6211c258c540dcab176e21142dd",
      "parents": [
        "354c2c314d3d3c811a536a7ae64c73f8f460a8c0"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Fri Nov 21 10:32:07 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 10:32:07 2025 -0600"
      },
      "message": "Fix website build? (#438)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "354c2c314d3d3c811a536a7ae64c73f8f460a8c0",
      "tree": "64ae3195cec14b82bda774649d6fb7500577a025",
      "parents": [
        "086bb0d77ffb885e98f1df0ad5eb918013c6fea7"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Fri Nov 21 10:20:53 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 10:20:53 2025 -0600"
      },
      "message": "Fixes #409 (#436)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    },
    {
      "commit": "086bb0d77ffb885e98f1df0ad5eb918013c6fea7",
      "tree": "917d79ee39d9a4559f007e38edaf851182ec2c1e",
      "parents": [
        "14b7cfe38aba19ab7d96da694795fc286aa05460"
      ],
      "author": {
        "name": "Trevor Grant",
        "email": "trevor.d.grant@gmail.com",
        "time": "Fri Nov 21 09:48:52 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 21 09:48:52 2025 -0600"
      },
      "message": "Fixes #433 (#434)\n\nSigned-off-by: Trevor Grant \u003ctrevor.d.grant@gmail.com\u003e"
    }
  ],
  "next": "14b7cfe38aba19ab7d96da694795fc286aa05460"
}
