Skip to content

Tags: SISL-UIC/hoop

Tags

1.125.1

Toggle 1.125.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-105: fix shell navigation and gating drift found by the migration…

… audit (hoophq#1641)

* EVL-105: fix shell navigation and gating drift found by the migration audit

- CommandPalette: remove dead Quick Access "Reviews" (/reviews has no route
  on either side) and the dead "Test Connection" action (navigated to
  /connections/<name>/test which never existed; testing lives in the
  TestConnectionModal of /roles/:name/configure)
- CommandPalette: apply the same adminOnly/selfhostedOnly gating as the
  Sidebar (shared shouldHide helper) — admin pages no longer show up for
  non-admin users, Infrastructure/Authentication respect selfhosted
- Sidebar: restore selfhosted-only gating on Integrations > Authentication
  (parity with the CLJS sidebar) and make isActive query-aware so
  Integrations > Jira (/jira-templates?tab=configuration) can highlight
- Router: redirect /plugins/manage/jira -> /jira-templates?tab=configuration;
  the CLJS bidi route survived its panel deletion and rendered an infinite
  spinner for old bookmarks
- CLJS attributes: navigate to /settings/attributes/edit/<name> (path param)
  instead of ?name=<name> so the URL matches the React route instead of
  falling through the catch-all into the superseded CLJS panel; bidi route
  parametrized and the panel reads the route param for pure-CLJS dev parity

Not included: the audit's "Router doesn't enforce experimental.rulepacks"
finding turned out to be a non-issue — both Rulepacks pages already gate
themselves with FeatureFlagGate (loader + redirect).

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

* EVL-105: decode the attribute-name route param in the CLJS edit panel

bidi/match-route returns the raw (percent-encoded) path segment, so names
with spaces would reach :attributes/get encoded in pure-CLJS dev mode.
Reuse the existing safe-decode-uri-component helper (same pattern as the
workflow-details panel). Addresses the URL-charset verification item from
the Qodo review.

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

1.125.0

Toggle 1.125.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-98: Config Status checklist widget + light sidebar (webapp_v2) (h…

…oophq#1642)

* EVL-98: add Config Status checklist widget and recolor sidebar to light theme

Sidebar moves from dark navy to the light gray scale (new Mantine
gray/indigo ramps), completing the semantic token wiring in
cssVariablesResolver (text/dimmed/placeholder → Radix slate) and renaming
--sidebar-bg to --brand-navy for the auth/upsell surfaces that keep the
navy look.

Adds an admin-only Config Status widget at the top of the expanded
sidebar: a 3-step setup checklist (Connect a resource, Set up access,
Tune Features) with ring progress, computed client-side from real
configuration state (agents, connections, sessions, groups, guardrails,
masking rules, AI session analyzer provider, protection profile). The
widget hides at 3/3, opens one step at a time, collapses on outside
interaction, and deep-links each sub-item ("Run your first session"
preselects an exec-capable connection in the web terminal via ?role=,
falling back to the native client access modal).

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

* EVL-98: keep Config Status open across navigation and adjust done icons

Product feedback: the widget now stays expanded until the admin closes it
via the header chevron (no more collapse on outside interaction or after
navigating from a sub-item). Done icons change to lucide BadgeCheck
(sub-items) and CircleCheckBig (step headers), and the ring percentage
label gets breathing room.

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

* EVL-98: restore ring label size and shrink completed-step check glyph

The 8px label was an unrequested change — back to 9px, keeping the 2px
breathing padding. The step-done CircleCheckBig renders at 20px inside
the same 24px slot so titles stay aligned.

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

* EVL-98: restore Figma collapse behavior for the Config Status widget

Back to the annotated design behavior: the widget collapses when the
user interacts outside it and after navigating from a sub-item. The
icon adjustments from the previous feedback round are kept.

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

* EVL-98: collapsed rail uses symbol-only logo and Discover sorts alphabetically

Matches the sidebar component in Figma (Components | Custom): the 72px
collapsed rail shows just the hoop symbol (the symbol+text asset
overflowed and got clipped), and the Discover section follows the
design's alphabetical order (Event Routing and Rulepacks, absent from
the design, slot in alphabetically).

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

* EVL-98: step icons get action-button styling; keep padding tweaks

Step-group icons render inside a non-interactive ActionIcon-styled
container (component="div" — the click stays on the whole row): gray
light for pending, green light when the step completes. Includes the
spacing adjustments made during design review.

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

* EVL-98: step action-button container at 24px

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

* fix: update padding and gap variables in ConfigStatus styles

* fix: update body text color in theme and improve ActionIcon styling in StepItem component

* refac: improve colors to adapt to primary shade as 5

* reorganiza components colors and sizes to match hoop figma standards

* fix: update padding in ConfigStatus styles and adjust ActionIcon properties in StepItem component for improved consistency

* EVL-98: upgrade lucide-react to 1.27.0 for ShieldCogCorner

"Set Protection Level" now uses the exact shield-cog-corner glyph from
the Figma design. All 70 lucide icons imported across the app verified
present in 1.27.0 (no renames from the 0.577 ramp affect us).

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

* EVL-98: Set Protection Level shows ShieldCheck when done

Sub-items accept a per-item doneIcon (default stays BadgeCheck).

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

* EVL-98: Config Status reacts to completed steps without reopening

The snapshot now refreshes on window focus and on a 30s background poll
(10s while the widget is expanded), with the fetch TTL down to 15s so
navigation triggers feel live. Polling self-terminates once setup hits
3/3 — the widget unmounts its render and the tick guard stops fetching,
so configured orgs never poll.

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

* EVL-98: instant checklist reaction when the first query runs

The CLJS web terminal emits a hoop:session-executed CustomEvent on exec
success; the Config Status widget listens and force-refreshes, so the
step-defining "Run your first session" checks off the moment the query
finishes. Other checks keep the focus/poll refresh. Contract documented
in CONTEXT_MIGRATION.md.

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

* EVL-98: fix CLJS enterprise banner broken by the --sidebar-bg rename

The activation-journey banner (terminal pre-execution and feature pages)
referenced --sidebar-bg, which this branch renamed to --brand-navy — the
banner went white. It now uses var(--brand-navy, #1F2D5C) with a literal
fallback, and the token value is corrected to the brand blue #1F2D5C on
the React side (MethodCard, SelectionCard, EnterpriseBanner and
AuthPageLoader follow automatically).

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

* EVL-98: flat variant for the terminal enterprise banner

The activation-journey banner glued under the terminal tabs loses its
border radius via a new :flat? prop (Figma: Product activation journey,
node 2219-49075). Standalone placements (feature-page headers, See
Features modal) keep the rounded card. The banner remains a
conditionally rendered, self-contained sibling of the tabs row, so when
it goes away (enterprise license / dismissed) the tabs sit directly on
the logs with zero leftover styling.

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

* Update tab item text size and refactor output tabs structure for improved layout consistency

* EVL-98: address Qodo review — per-user snapshot baseline and gentler open poll

When the authenticated user changes, fetchStatus now rebuilds checks
from the initial baseline and drops the previous user's connection
names, so partially failed probe runs can no longer leak user A's
snapshot stamped as user B. The expanded-widget poll becomes
TTL-respecting (no more forced probe burst every 10s). Ticket-prefix
comment format applied.

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

* EVL-98: nav icons at 16px with 8px icon-label gap per Figma component

Measured on the Menu Item (State=Default, Color=White) component in
Components | Custom: 16x16 icon slot and gap-[8px] between icon and
label. Expanded sidebar only — the collapsed rail keeps its icon size.

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

* EVL-98: nav icons at 18px as specced

The 18x18 size from the design review was the expected spec; the 16px
component instance measurement should not have overridden it.

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

* EVL-98: collapsed rail icons match the expanded nav size (18px)

The Menu-Only Icon component (gray sidebar, collapsed) uses the same
icon slot as the expanded Menu-OrgItem — open and closed states share
one icon size.

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

* EVL-98: drop the icon-label gap override, back to the default spacing

The tightened section gap added during review didn't match the intended
design — Mantine's default NavLink section spacing is the reference.
Nav icons stay at 18px.

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: mtmr0x <github@mat-m.com>

1.124.0

Toggle 1.124.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat: license feature flag (hoophq#1631)

* feat: add features field to LicensePayload and related structures

* feat: implement license feature gating across various components and routes

* chore: regenerate OpenAPI docs

* chore: regenerate OpenAPI docs

* refactor: update license feature handling to ensure empty lists indicate all features are enabled

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

1.123.0

Toggle 1.123.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat: feature support static oauth client registration for mcp (hooph…

…q#1646)

* DEP-80: static OAuth client registration for MCP auth

IdPs without RFC 7591 DCR support (JumpCloud, Okta, Entra ID) cannot
complete the MCP OAuth flow: clients abort at discovery with no
registration_endpoint, and tokens minted for a static client carry
aud=client_id, failing the RFC 8707 audience check.

- add client_id/client_secret to PUT /api/serverconfig/mcp-auth and
  hoop admin mcp auth enable/configure (--client-id, --client-secret)
- when a static client is set, advertise the gateway as authorization
  server (RFC 9728), mirror the IdP's RFC 8414 metadata, and serve an
  RFC 7591 shim that hands out the pre-registered client
- accept the static client_id as alternate audience during token
  validation; public client + PKCE recommended since the shim is
  unauthenticated

Refs hoophq#1645

* DEP-80: canonical URI audience comparison for MCP tokens

Byte-exact aud matching rejected tokens minted for the correct
resource when the configured resource_uri differed cosmetically
(trailing slash, host case, explicit default port, e.g. a token
carrying https://demo.hoop.dev/api/mcp against a configured value
with a trailing slash).

- compare URI-shaped audiences in canonical RFC 3986 form; opaque
  client IDs remain exact and case-sensitive
- include got/want audiences in the mismatch error
- fix documented resource_uri default: <API_URL>/api/mcp, not
  <API_URL>/mcp

* feat(oidc): enhance token validation to support static OAuth client IDs

* refactor: enhance audience claim handling and canonical resource URI processing

1.122.2

Toggle 1.122.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-101: Migrate Slack and Webhooks plugin pages to webapp_v2 (hoophq…

…#1633)

* chore: add team Claude Code setup (.claude package + MCP servers)

- .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket
  and test-plan skills, team README with the worktree flow
- .mcp.json: Linear + Figma MCP servers (root file un-ignored)
- CLAUDE.md: Team AI Workflow section
- .gitignore: version .claude/ selectively (worktrees and local settings
  stay ignored)

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

* EVL-101: migrate Slack and Webhooks plugin pages to webapp_v2, remove legacy plugins route

- New React pages at /integrations/slack and /integrations/webhooks
  (admin-only), backed by services/plugins.js and a shared usePlugin hook
- Slack: Connections tab (per-connection toggles + channel IDs modal) and
  Configurations tab (tokens base64-encoded on save, decoded for display)
- Webhooks: per-connection enable/disable toggle list
- Fresh org (GET /plugins/:name 404): first save/toggle creates the plugin
  via POST /plugins
- Repoint webapp_v2 sidebar away from /plugins/manage/*
- Remove legacy :manage-plugin route, :manage-plugin-panel, slack/webhooks
  sidebar entries and the dead plugin views/events from the CLJS app

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

* EVL-101: use v1 snackbar (top-right) and full-height centered loaders

Review follow-ups:
- Port the v1 snackbar from feat/ai-agents: showSnackbar helper backed by
  sonner + components/Snackbar/Toast (1:1 with the legacy CLJS toast),
  Toaster mounted top-right in App.jsx; new pages migrated off
  @mantine/notifications
- Document the rule in webapp_v2/CLAUDE.md and COMPONENTS.md: never use
  @mantine/notifications; migrate notifications.show() to showSnackbar
  whenever touched
- Center page loaders: single full-height PageLoader per page; the
  connections fetch moved into usePlugin so PluginConnectionsList is
  purely presentational

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

* EVL-101: address Qodo review — legacy URL redirects, nil-route guard, connections shape

- Redirect /plugins/manage/{slack,webhooks} to /integrations/* in the React
  router (same pattern main used for /settings/jira) so old bookmarks keep
  working
- Guard window.hoopSetRoute against unknown paths: routes/parse returns nil
  for unmatched routes and (name nil) threw in the React-shell bridge —
  latent for any unknown URL, now falls back to :home
- Normalize /connections response shape in usePlugin ({items} or array),
  matching the EventRouting store

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

1.122.1

Toggle 1.122.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-101: Migrate Slack and Webhooks plugin pages to webapp_v2 (hoophq…

…#1633)

* chore: add team Claude Code setup (.claude package + MCP servers)

- .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket
  and test-plan skills, team README with the worktree flow
- .mcp.json: Linear + Figma MCP servers (root file un-ignored)
- CLAUDE.md: Team AI Workflow section
- .gitignore: version .claude/ selectively (worktrees and local settings
  stay ignored)

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

* EVL-101: migrate Slack and Webhooks plugin pages to webapp_v2, remove legacy plugins route

- New React pages at /integrations/slack and /integrations/webhooks
  (admin-only), backed by services/plugins.js and a shared usePlugin hook
- Slack: Connections tab (per-connection toggles + channel IDs modal) and
  Configurations tab (tokens base64-encoded on save, decoded for display)
- Webhooks: per-connection enable/disable toggle list
- Fresh org (GET /plugins/:name 404): first save/toggle creates the plugin
  via POST /plugins
- Repoint webapp_v2 sidebar away from /plugins/manage/*
- Remove legacy :manage-plugin route, :manage-plugin-panel, slack/webhooks
  sidebar entries and the dead plugin views/events from the CLJS app

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

* EVL-101: use v1 snackbar (top-right) and full-height centered loaders

Review follow-ups:
- Port the v1 snackbar from feat/ai-agents: showSnackbar helper backed by
  sonner + components/Snackbar/Toast (1:1 with the legacy CLJS toast),
  Toaster mounted top-right in App.jsx; new pages migrated off
  @mantine/notifications
- Document the rule in webapp_v2/CLAUDE.md and COMPONENTS.md: never use
  @mantine/notifications; migrate notifications.show() to showSnackbar
  whenever touched
- Center page loaders: single full-height PageLoader per page; the
  connections fetch moved into usePlugin so PluginConnectionsList is
  purely presentational

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

* EVL-101: address Qodo review — legacy URL redirects, nil-route guard, connections shape

- Redirect /plugins/manage/{slack,webhooks} to /integrations/* in the React
  router (same pattern main used for /settings/jira) so old bookmarks keep
  working
- Guard window.hoopSetRoute against unknown paths: routes/parse returns nil
  for unmatched routes and (name nil) threw in the React-shell bridge —
  latent for any unknown URL, now falls back to :home
- Normalize /connections response shape in usePlugin ({items} or array),
  matching the EventRouting store

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

1.122.0

Toggle 1.122.0's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
feat(mssql): native guardrails support (hoophq#1630)

* feat(mssql): native guardrails support (flag-gated)

Enforce guardrails on native MSSQL (TDS) protocol sessions, which were
previously refused fail-closed because the proxy could not evaluate
rules. Behind the new beta.mssql_native_guardrails feature flag
(default on):

- gateway: sessionSupportsGuardRails allows a guarded native MSSQL
  session when the org's flag is on, and keeps refusing it when off.
- agent: processMSSQLProtocol forwards the connection's guardrail rules
  to the libhoop MSSQL proxy (which validates SQLBatch and RPC
  sp_executesql/prepare/prepexec statements and blocks violations).

The flag defaults on; enforcement lives in the agent proxy, so agents
must be upgraded alongside the gateway (older agents run the session
unguarded) — documented on the flag and in the gateway comment.

Output data masking for MSSQL remains out of scope (follow-up).

Adds an integration test that blocks and allows queries against a real
SQL Server for both the SQLBatch and sp_executesql paths, and updates
the guardrails gate unit tests to be flag-aware.

Requires the paired libhoop change (hoophq/libhoop#96).

Closes DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* fix(mssql): refuse native sessions with output guardrail rules (review)

Native MSSQL enforces input guardrails only (result-set masking is not yet
implemented). Admitting a connection whose rules include output rules would
run them silently unenforced, so refuse it fail-closed at session open. Web
Exec, which enforces output rules via the db-exec redactor, is exempt.

Adds an e2e test proving the dynamic-exec parameter bypass is blocked
against a real SQL Server, and a unit test for the output-rule detector.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* fix(mssql): remove agent flag race, persist mid-session guardrail info (review)

Second round of review fixes:

- agent: stop re-checking beta.mssql_native_guardrails on the agent before
  forwarding rules. The gateway is the sole admission authority (it only
  opens the session when the org flag is on and refuses output-ruled
  connections), so the agent now always forwards the rules it was sent. This
  removes a feature-flag sync race that could open an unguarded proxy if the
  agent had not yet received the flag update.
- gateway: persist guardrail violation metadata from native protocol error
  replies (MSSQL and PG connection writes), not only on SessionClose. A
  native guardrail block keeps the session open, so the matched-rule info was
  previously discarded. UpdateSessionGuardRailsInfo appends, so violations
  accumulate on the session record.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* test(mssql): gateway integration test for output-rule admission refusal (review)

Add a gateway integration test proving a native MSSQL session on a connection
with output guardrail rules is refused fail-closed (the TDS proxy enforces
input rules only). Adds postMSSQLConnection and createOutputGuardrailForConnection
harness helpers.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* feat(mssql): gate native guardrails on agent capability (fail-closed rollout)

Close the mixed-version fail-open: enforcement of native MSSQL guardrails
lives in the agent, so the gateway must not admit a guarded native MSSQL
session to an agent that cannot enforce it.

- The agent now advertises its capabilities in the gRPC connect metadata
  (agent-capabilities), including mssql_native_guardrails.
- The gateway resolves the selected agent's stream at admission and refuses
  the session fail-closed unless it advertises the capability. An older agent
  omits it and is refused, never run unguarded — so beta.mssql_native_guardrails
  can safely default on across a rolling upgrade.

Reuses the existing gRPC agent metadata channel and agent-stream registry
(the prior capability mechanism was websocket/agentrs-only, for RDP, and did
not cover the Go gRPC agent that runs the MSSQL proxy).

Adds a gateway integration test that a guarded native MSSQL session is refused
when the agent does not advertise the capability, and unit tests for the
capability list/parser.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* fix(mssql): advertise guardrails capability only when libhoop enforces it

The agent previously advertised mssql_native_guardrails unconditionally, so a
build linked against the OSS/noop libhoop (or a libhoop whose MSSQL proxy is a
passthrough) would falsely claim support and the gateway would admit a session
it cannot enforce.

- Derive the advertised capability from the linked libhoop
  (libhoop.SupportsMSSQLGuardRails): the noop build returns false, so such an
  agent advertises nothing and the gateway keeps the session fail-closed.
- Move capability-list construction from common/proto into the agent (which
  links libhoop); common/proto keeps only the token constants and the parser.
- Document the fail-closed behaviors (dynamic execution, unsupported parameter
  types, output rules) on the feature flag.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* test(mssql): cover capable-agent admission and old-agent refusal (review)

Add a positive gateway integration test that a native MSSQL guarded session on
a capability-advertising agent passes admission (guards against a routing or
metadata regression silently failing every guarded session closed), and switch
the fail-closed test to a capability-less agent starter. The harness DialAgent
now advertises the native MSSQL guardrails capability (faithful to a current
agent linked against the enforcing libhoop); dialAgentWithoutCapabilities stands
in for an older agent.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* test(mssql): use the real gateway guardrail JSON shape in e2e (qodo)

The MSSQL integration fixture injected guardrail rules as an array of
{id,name,input_rules,output_rules} objects, but the gateway ships a single
object with top-level input_rules/output_rules (see encodeGuardRailRules). Use
that exact shape so the e2e exercises the real gateway->agent payload.

Part of DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* refactor(mssql): drop native guardrails flag, scope PG audit revert

Address maintainer review on hoophq#1620:

- Remove the beta.mssql_native_guardrails feature flag entirely. Native MSSQL
  guardrails are now driven purely by whether the connection has guardrail
  rules configured, exactly like Postgres/MySQL. libhoop stays the sole
  authority: it enforces input rules and fails closed at proxy construction
  for anything it cannot evaluate. Drops the flag catalog entry, the
  dropNativeMSSQLGuardRails gate and its unit test, and flag-referencing docs.
- Revert the PGConnectionWrite audit change back to origin/main (error-message
  rewrite only); keep violation-metadata persistence on the new
  MSSQLConnectionWrite case, where it is needed because a native MSSQL block
  keeps the session open rather than carrying the info on SessionClose.

DEP-69.

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* fix(mssql): ship only configured guardrail rules

Drop empty direction placeholders before forwarding guardrails and remove unrelated protocol residue.

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* test(mssql): add JDBC guardrail integration

Exercise the production TCP client proxy with Microsoft JDBC metadata, query, and post-block traffic. Generate the pinned driver classpath in CI and isolate test transport packets across serialization boundaries.

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* fix(mssql): skip empty guardrail metadata

Avoid database writes when decoded guardrail metadata contains no violations.

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* ci: pin paired libhoop revision

Resolve same-named libhoop branches once so integration jobs test one exact commit and only missing branches fall back.

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* ci: block unmerged paired dependencies

Keep paired libhoop integration coverage while exposing a separate exact-commit merge gate for safe cross-repository merge ordering.

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

* test(mssql): isolate listener address lookup

Fixes #DEP-69

 🤖 Generated with Mister Maluco

Co-Authored-By: MisterMal <teskeslab@lucasteske.dev>

---------

Co-authored-by: MisterMal <teskeslab@lucasteske.dev>

1.121.3

Toggle 1.121.3's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
[DEP-77] add the default valeu to the analyzer and some libhoop chang…

…es (hoophq#1644)

* fix default value on frotend

* fix(webapp): block data masking edit form on failed rule fetch to prevent overwriting rule with defaults

1.121.2

Toggle 1.121.2's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-104: unify webapp_v2 snackbars on showSnackbar, remove @mantine/n…

…otifications (hoophq#1638)

* EVL-104: unify webapp_v2 snackbars on showSnackbar, remove @mantine/notifications

webapp_v2 had two toast systems running at once: the sonner-based
showSnackbar (migrated from the CLJS app, top-right, v1 visual) and
Mantine @mantine/notifications (bottom-right, different visual).

- Migrate all 33 notifications.show() call sites (10 files) to
  showSnackbar
- Switch Roles/Configure from the CLJS-bridge snackbar to the local
  showSnackbar (the CLJS Toaster is unmounted on React-only routes,
  so bridged toasts could be silently lost) and drop the bridge method
- Remove the <Notifications /> provider, its styles import, and the
  @mantine/notifications dependency
- Update CLAUDE.md, COMPONENTS.md and CONTEXT_MIGRATION.md accordingly

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

* EVL-104: fix import grouping in CommandPalette (@/ before relative)

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

1.121.1

Toggle 1.121.1's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
EVL-102: Migrate Jira integration to a Jira Templates setup page in w…

…ebapp_v2 (hoophq#1634)

* chore: add team Claude Code setup (.claude package + MCP servers)

- .claude/: shared settings (permissions, hooks, gofmt-on-edit), fix-ticket
  and test-plan skills, team README with the worktree flow
- .mcp.json: Linear + Figma MCP servers (root file un-ignored)
- CLAUDE.md: Team AI Workflow section
- .gitignore: version .claude/ selectively (worktrees and local settings
  stay ignored)

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

* EVL-102: add Jira Templates service, store and helpers in webapp_v2

Extends the list-only jiraTemplates service with template CRUD, org
integration get/create/update and the Jira Assets object search. Adds a
page-local zustand store (DataMasking status-enum pattern) and the form
helpers ported from the legacy CLJS implementation, minus its payload
leaks (selected/timestamp UI keys no longer reach the API).

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

* EVL-102: add Jira Templates page with Templates and Configuration tabs

Runbooks-Setup-style layout: header + tabs, synced with ?tab= so the
sidebar can deep-link the Configuration tab. Templates tab covers the
integration-not-configured promotion gate, empty state, list with
delete confirmation and free-plan limit banner. Configuration tab
absorbs the legacy /settings/jira form (POST on first save, PUT after).

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

* EVL-102: add Jira template create/edit form and routes

Mirrors the legacy form sections: basic info, workflow transition
(including skip_transition_on_nonzero_exit_code, which the legacy UI
stored but the form now exposes as a switch), resource-role
multi-select, preset/custom mapping tables sharing one rules array,
manual prompts and CMDB rules. CMDB Value becomes a searchable asset
picker (GET /integrations/jira/assets/objects) once the row has an
Object Type ID, storing the object name; it degrades to plain text on
lookup errors. Routes registered above the /* catch-all.

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

* EVL-102: point sidebar and command palette at the React Jira page

Integrations > Jira now deep-links /jira-templates?tab=configuration;
adds a Jira Templates quick-access entry to the command palette.

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

* EVL-102: remove legacy Jira templates and Jira settings CLJS pages

Deletes the four panels (:jira-templates-panel, :create-jira-template-
panel, :edit-jira-template-panel, :settings-jira-panel), their bidi
routes, the admin-surface views under jira_templates/ and
integrations/jira/, the sidebar entries and the jira-templates
promotion. Prunes the now-orphaned admin CRUD events (create/update/
delete/get-by-id, active-template subs, selected-connections
hydration) whose success handlers navigated to the removed bidi route.
Keeps every runtime consumer intact: prompt_form, loading modal,
cmdb_error, submit-template/CMDB events, jira-integration->get and the
:jira-templates->list sub used by webclient and configure-role. The
configure-role "Go to JIRA Integration" callout now links the React
route directly.

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

* EVL-102: update migration docs for the Jira pages

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

* EVL-102: show the feature promotion before the tabbed page

When the org has no Jira integration, the full-page promotion now
replaces the header + tabs entirely (FullBleed), matching how other
features gate (e.g. Live Data Masking) — instead of rendering inside
the Templates tab. Its primary action and the sidebar deep-link open
the page directly on the Configuration tab.

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

* EVL-102: address review — drop session.verb, persist promotion, redirect /settings/jira

- Remove session.verb from the preset mapping options: the gateway's
  loadDefaultPresetFields never resolves it, so templates saved with it
  failed Jira issue creation at runtime (Qodo finding).
- Persist the promotion gate in localStorage
  (jira-templates-promotion-seen), mirroring the legacy Runbooks Setup
  behavior: after the primary action is clicked once the promotion no
  longer replaces the page.
- Once the promotion is dismissed and the integration is still missing,
  the Templates tab shows an empty state with a Configure Jira
  Integration CTA (review suggestion) instead of the promotion.
- Redirect the absorbed /settings/jira URL to
  /jira-templates?tab=configuration so old bookmarks keep working
  (Qodo finding).

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

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>