Skip to content

7.7 - #511

Merged
thekevinm merged 214 commits into
developfrom
7.7
Aug 12, 2026
Merged

7.7#511
thekevinm merged 214 commits into
developfrom
7.7

Conversation

@thekevinm

Copy link
Copy Markdown
Contributor

No description provided.

nicdavidson and others added 30 commits May 20, 2026 12:42
The April 2026 security update bumped swagger-ui 4.15.5 -> ^5.32.2
without migrating df-api-docs.component.ts to the v5 calling
convention. v5 introduced breaking changes in bundle layout and
internal call paths, causing every service's API docs to throw
"TypeError: o is not a function" from inside the swagger-ui bundle.

Pinning back to 4.15.5 restores the working UI as a stopgap. The
patched DOMPurify XSS / Handlebars JS injection CVEs return — low
practical risk for the admin UI (specs come from trusted backends),
but a proper v5 migration is still owed.

Rebuilt dist/ artifacts included.
The API Builder nav entries and breadcrumbs rendered raw transloco keys
(nav.api-builder.nav, nav.api-connections.api-types.api-builder.*, and the
missing api-types.header). Add the strings to en.json (source + runtime dist
copy). Translations are runtime-loaded JSON, so no JS rebuild is required.
Major rework of the API Builder admin UI (df-api-builder.component.ts):

UX:
- Replace the cramped 2-column workbench with a Swagger-style master-detail:
  API settings card (title, /api/v2/{base_path}, status, Save/Docs/Delete) +
  a method-colored endpoint accordion. Click a row to edit inline; Add Endpoint
  opens a new draft. Collapsed by default.
- Surface Endpoint Name/URL as primary fields; preserve user-entered identity
  (don't overwrite path/label/description once edited).
- Autocomplete source-API/table pickers; hide non-data service types from the
  source list; focus-to-show-full-list with deferred blur restore.

Behavior fixes:
- Preview/Test now execute (send dry_run:false + snake_case path_params); the
  Test runner response is shown verbatim.
- Re-introspect the source when loading a saved endpoint so Fields/Relationships
  render with saved selections (safe now that the CD-hang is fixed via trackBy).
- "Save the API first" hint when no API is saved yet.

Field/relationship renaming (output aliases):
- Per-field/relationship rename inputs -> flat alias map on the execution-plan
  step; backend applies a key-remap on fetched rows.

camelCase interceptor safety (shared utilities):
- case.ts: treat execution_plan/response_mapping VALUES as verbatim blobs (their
  inner keys are real field names + user aliases) — transform the envelope key
  only, both directions. Same pattern as the existing requestBody exclusion.
- case.interceptor.ts: skip response transform for /api_builder/test so the
  preview shows the real output keys the deployed endpoint returns.
- Add regression tests; existing case tests still pass.

Includes rebuilt dist/.
…ship builder)

Workspace/relationship panel on the custom-API editor: pick backing services for the API and author cross-service relationships, with a live preview and per-type help text.

Endpoint source picker is scoped to the API's workspace and refreshes live when it changes. camelCase interceptor support for API Builder fields (case.ts). Rebuilt production dist.
Self-contained adf-agents component (mirrors adf-alerts): agent CRUD with
role + key TTL and revoke, approve/deny pending access requests, and an
activity view (last-active + recent agent alerts). Top-level 'agents' route +
nav label. Includes rebuilt dist.

Claude-Session: https://claude.ai/code/session_01TAqkbJ6Wpa9CX2sydcFeZu
…eguard

The global caseInterceptor converts /api responses to camelCase; the component
read snake_case so every field was undefined (toggle stuck off, blank cells,
edits not persisting). Rewrote to camelCase (alerts log stays snake — /_internal
is not under /api). Toggle now reverts to server truth on error. Rebuilt dist.

Claude-Session: https://claude.ai/code/session_01TAqkbJ6Wpa9CX2sydcFeZu
Drive the AI chat and AI Connections UIs off theme tokens instead of
hardcoded white text, so they are legible in light mode. Dark mode is
unchanged: the dark token values reproduce the original whites.

- AI chat: theme tokens for messages, tool-result cards, session list,
  and the chat shell; show the tool CALL (name + arguments), not just the
  result; move "Act as role" beside New chat; tighten height so the input
  stays in view.
- AI chat config: MCP servers + data services as selectable pickers.
- AI Connections config: theme tokens for allowed-roles, model-picker,
  and test-connection; fix df-role-scope wildcard callout.
- Hide API Builder / Alerts / Agents from the left nav (routes intact).
- Drop em-dashes from shipped picker and test-connection copy.
Snapshot of in-progress work found uncommitted in the tree: a new API
Builder preview component (+ specs), large reworks to the workspace and
main builder components, and small tweaks to Agents, event-script
details, welcome page, and the script editor. Committed to clean the
tree ahead of the UI-hardening branch; not reviewed.
…solved toward main's --df-ai-* pattern; dist kept ours, rebuilt next)
…d once on body

- styles.scss: --df-* token set, light on :root, dark under .dark-theme,
  dark values reproduce the pre-token hardcoded whites
- DfThemeService now stamps .dark-theme on <body> (single source of truth);
  color-scheme: dark for native controls
- component migration to tokens follows in stream1 sweep commits
Nic Davidson and others added 29 commits July 8, 2026 11:05
…pane (fixed ~48px overflow on every screen)
… 100% (System was the holdout at 52px; scoped ::ng-deep override did not pierce the child component, shared trim does)
…vious API's tables)

serviceName was read once from a route snapshot in ngOnInit, but Angular
reuses the component across /api-docs/:name changes, so navigating between
services left the token pickers (tables, fields, procs, funcs) and the
api-key loader introspecting the previously-loaded service. Fix: rerun the
resolver on paramsChange and read serviceName + service id inside the
reactive route.data subscription. Verified: pgsql->mysql->chargeback_db
each shows its own tables.
…ivilege default key

- formatForSupport: mask DSN host/user/password (and PDO 'user@host') in the
  copied raw body so a support paste no longer leaks DB connection internals
  that the on-screen headline already hides.
- df-artifact-resolver: among keys that probe 200, rank read-only /
  narrowly-scoped keys ahead of broad write-capable ones for the default curl;
  stable sort keeps first-working as the tie-break.
# Conflicts:
#	dist/5052.a1f133e1145b1e21.js
#	dist/7764.061ac42c84fcbcd3.js
#	dist/8889.2575245cbb4c5093.js
#	dist/index.html
#	dist/runtime.7a232095ca68a82c.js
#	src/app/adf-services/df-service-details/df-service-details.component.html
#	src/app/shared/components/df-script-editor/df-script-editor.component.ts
Cody's scheduler run-as UI (api-key + role fields, clear-run-as-on-app-clear),
snapshot-banner date fix (lastRefreshedAt), and api-types breadcrumb fix.
…nfirmed kill switch

The registry rows now show every field the spec calls for: owner
(owner_id resolved via the already-loaded user lookup), last_active_at
as a relative label (memoized per data load, refreshed by the 20s poll),
and the existing key-status/is_active badge. Killing an agent (toggle
off) now goes through DfConfirmDialogComponent, same pattern as
df-manage-table; cancel puts the toggle back without a request.
Reactivating stays unconfirmed.
Lifted from feat/http-service-curl-import (Cody): curl-parser + spec and the
import dialog land as-is; the df-service-details entry point and the
df-array-field writeValue fix are re-applied onto the overhauled components
rather than merging the branch (16/24 files collided with the UI overhaul).
Includes dist rebuild.
The cURL parser passed through whatever scheme the pasted command carried.
file://, gopher://, and dict:// became the rws base_url with no warning, an
SSRF and local-file-read entry point when the service is later invoked
server-side. This is admin-authenticated and has full parity with the manual
base_url field, so it is LOW, but the import warned on captured credentials
and multipart while staying silent on a dangerous scheme. Close that gap:
emit a scheme warning for anything other than http/https. Schemeless and
relative base URLs and host:port stay valid; no false positives. The
server-side scheme guard in df-rws is a separate item, noted in the close-out.
curl-parser jest 25/25.
The df-schema-contracts backend shipped in 7.7 but its admin UI never merged
off feature branches (same orphan pattern as curl-import). Lifted the
adf-schema-contracts module from schema-contracts-on-7.6 (the newer branch that
carries the Phase 6 runtime-enforcement selector): the manage-contracts tab
plus the OpenAPI, snapshot-history, and table-diff dialogs, the service, and
types. Re-wired the four entry points (route, ROUTES enum, URLS const, i18n)
against the 7.7 overhaul rather than merging the stale branch.

Verified: npm run build clean; the /admin-settings/schema-contracts tab renders
live on :8081, hits /api/v2/system/schema_contract, no JS errors, i18n wired.
Includes dist rebuild + an e2e render test.
…refix

Clicking Schema Contracts also highlighted Schema: isActive() used
router.url.startsWith(nav.path), so /admin-settings/schema-contracts matched
the sibling /admin-settings/schema by bare string prefix. Any two nav paths
where one prefixes the other collided. Match on a segment boundary now: active
when the url equals the path or starts with path + '/', with query/fragment
stripped. Parent-highlight-on-child-route still works.

Verified live: on /admin-settings/schema-contracts only Schema Contracts is
active. e2e/schema-contracts.spec.ts now asserts it. Includes dist rebuild.
… fence

An assistant reply may end with a fenced block whose language tag is
'suggestions' (1-4 short follow-up lines). df-chat-message now strips that
trailing closed fence from the rendered segments and surfaces its lines as
keyboard-accessible chips on the newest assistant message (gated by the
parent while a reply is in flight); clicking a chip sends the text through
the normal send flow. Mid-message or malformed fences still render as
ordinary code. Ports the sysco demo's chat-suggestions console addon
natively (~10x smaller than the addon's XHR/DOM shim).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New 'Task cost estimator' panel beside the rate calculator: describe a
task, route it to a registered agent via POST /api/v2/agents/route (falls
back to a manual ai_chat service picker when routing is unavailable),
calibrate per-call token averages from the meter's own 90d history
(app-level, then service-level, >=5 requests), and project a low/high cost
range via the observed 3-6 calls-per-task tool loop priced through the
shared estimateCost. Optional budget gives an advisory verdict (never a
hard block), and 'Run for real' executes the task on the target chat
service, snapshots the meter before/after, and classifies actual spend
against the pre-run range. Pure math lives in utils/task-estimate.ts with
unit coverage wired into CI. Ports the sysco demo's what-if console addon
natively.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tion-chips

AI Chat: follow-up suggestion chips from a trailing suggestions fence
…stimator

AI Usage: task-based what-if cost estimator (estimate → budget verdict → run & compare)
@thekevinm
thekevinm merged commit 793c942 into develop Aug 12, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants