Skip to content

[release] v0.116.0 - #6740

Merged
mmabrouk merged 88 commits into
mainfrom
release/v0.116.0
Sep 10, 2026
Merged

[release] v0.116.0#6740
mmabrouk merged 88 commits into
mainfrom
release/v0.116.0

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

New version v0.116.0 in

  • web
    • web/oss
    • web/ee
    • web/mobile
  • services
  • api
  • sdks
    • sdks/python
  • clients
    • clients/python
    • clients/typescript
  • kubernetes
    • kubernetes/helm

…ractions

The v0.113.0 extractions repointed every consumer at the new @agenta/*
packages but left the originals in place. These 17 files are unreachable
from any page, test or story, and each has a live package replacement:

  AgentCard              -> @agenta/entity-ui/agent
  SessionListCard        -> @agenta/sessions-ui
  EvaluatorMetricsCell   -> @agenta/observability-ui/cells
  SidebarSkeletonLoader  -> @agenta/navigation-ui
  ShowErrorMessage       -> @agenta/auth-ui
  CellContentPopover     -> @agenta/ui/cell-renderers
  LabelInput             -> @agenta/ui presentational/inputs
  ControlsBar            -> @agenta/playground-ui
  GatewayToolExecuteButton -> @agenta/playground-ui
  isEE                   -> @agenta/shared/api
  useDebounceInput       -> @agenta/shared/hooks
  useMediaQuery (mobile) -> @agenta/ui/hooks

ConfigureProviderModal and AgentsTableSection go with them: they were the
only remaining importers of LabelInput and useDebounceInput respectively,
and are themselves unreachable (ConfigureProviderDrawer is the live path).

Verified with a full import graph over web/ that resolves the EE overlay
and the @agenta/* exports maps: zero live importers reach any deleted file.
tsc --noEmit passes for @agenta/oss, @agenta/ee and @agenta/mobile; lint clean.
…ity molecule

Three OSS files were near-copies of code the v0.113.0 extractions moved into
packages, kept alive in parallel:

- lib/helpers/validators.ts -> @agenta/shared/utils (package version is a
  strict superset: same five helpers plus isSlugInputValid). Seven call sites
  repointed; two of them already imported from @agenta/shared/utils, so those
  imports are merged rather than duplicated.
- state/entities/shared/createEntityController.ts and createEntityDraftState.ts
  -> @agenta/entities/shared. The package version is the maintained one: it has
  151 passing unit tests (draft-state, molecule, testcase/testset-molecule) where
  the OSS copies had none, uses jotai-family for atom-family memory management,
  and adds the TRootData generic and schema selectors.

createEntityController grew a third generic (TRootData = T), so the testcase
controller now passes Record<string, unknown> explicitly to match what
extractTestcaseUserData returns.

Consumers import from @agenta/entities/shared directly rather than through an
OSS barrel: the repo's no-restricted-syntax rule bans re-exporting @agenta/*.
state/entities/index.ts was a pure barrel for the moved symbols and is deleted
(it was already unreachable from any page).

Three sibling near-duplicates are deliberately NOT collapsed here, because none
of them is a behaviour-preserving swap:

- createPaginatedEntityStore: only 0.79 similar (302 changed lines), and the
  package copy lives in @agenta/ui/InfiniteVirtualTable rather than in entities.
- DrillInBreadcrumb: the package copy is migrated off antd onto the shadcn
  Button/DropdownMenu and changes maxVisibleSegments from 4 to 3. Visual change,
  needs QA/VRT rather than a type-check.
- JsonEditorWithLocalState: the package copy only mounts DrillInProvider when
  onPropertyClick is set. That matches the default context everywhere except a
  read-only call site in DrillInContent that may render inside an outer provider
  with enabled: true, where the OSS copy forces it back to false.

tsc --noEmit clean for oss/ee/mobile; lint clean; entities unit tests 151/151.
…ackages

23 files that no consumer reaches, via any package export or barrel:

- agenta-ui/SharedEditor/SharedEditor.tsx: an orphaned older implementation.
  The directory barrel exports ./SharedEditorImpl, so this one was never
  reachable.
- agenta-ui/drill-in/context/index.ts: a duplicate barrel that resolution can
  never pick. A sibling drill-in/context.ts shadows the context/ directory, so
  every "./context" import lands on the file and this index.ts is unreachable
  by construction -- edits to it could not have taken effect.
- agenta-ui/Editor/plugins/code/utils/{enhancedValidationContext,multiLineTracker,
  structuralValidators,validationTypes}: a closed cluster that only referenced
  itself.
- agenta-ui/Editor/plugins/markdown/MarkdownHoverToggleButton,
  InfiniteVirtualTable/hooks/{useScrollConfig,useTableRowSelection}: only
  surviving mentions are doc comments.
- agenta-annotation-ui: the AnnotationSession InstructionsPanel/ScenarioListSidebar/
  SessionHeader, the queues EvaluatorNamesCell, and the hooks/ barrel with
  useAnnotationSubmit (./hooks is not a declared export; the two remaining hooks
  are imported directly).
- agenta-playground-ui: ExecutionRowActions, RunOptionsPopover (its only importer
  in ExecutionHeader is commented out), shared/EntityStatusTag.
- agenta-settings-ui: reserveTab, workspacePermissions, AgentaToolsPlaceholder.
- agenta-entity-ui ProviderCredentialsSection (the smart half; the presentational
  ProviderCredentialsSectionView is used directly) and
  agenta-entities shared/openapi/serviceSchemaAtoms.

The unused root barrels of @agenta/chat, @agenta/sessions and
@agenta/playground/react are deliberately kept: they are declared entry points in
each package's exports map, so they are public API surface rather than dead code.

turbo types:check green across all 24 packages; lint clean; unit tests pass for
agenta-ui (96), agenta-entities (1330) and agenta-entity-ui (473).
110 files that no Next.js page, test, story or build script reaches, either
directly or transitively. Mostly superseded UI that lost its last consumer as
features moved into the @agenta/* packages during v0.113.0.

The larger clusters:

- pages/settings/Tools: Tools.tsx now renders only GatewayToolsSection, orphaning
  the whole previous integrations UI (IntegrationGrid/IntegrationDetail/
  ConnectionsList/ConnectModal/ActionsList and its two hooks).
- pages/overview/deployments: superseded by components/DeploymentsDashboard.
  DeploymentOverview, HistoryConfig and DeploymentDrawer/assets/LanguageCodeBlock
  stay -- they are still imported.
- EvalRunDetails SingleScenarioViewerPOC and EvaluationRunsTablePOC: POC leftovers.
- CreateVariantModal and ConfigureProviderModal: closed import cycles (modal ->
  dynamic content -> trigger button) that nothing outside referenced.
  ConfigureProviderDrawer is the live path.
- Barrels whose consumers now import the concrete file directly, e.g.
  components/EmptyState/index.ts (the component itself moved to
  @agenta/ui/components/presentational) and TestcasesTableNew/hooks/index.ts.
- mobile: HomeSessionRow with its lib/interactive.ts, FilterChip, emptyModule,
  SettingsStates, approvalInputSummary.

Also drops four orphaned types.d.ts sidecars whose only importers are deleted here.

Deliberately kept, having been checked individually:
- styles/theme/legacy-shim.ts -- input to scripts/generate-tailwind-tokens.ts
  (the documented `pnpm generate:tailwind-tokens` flow), not app code.
- Playground/hooks/useWebWorker/assets/playground.worker.ts -- loaded through
  new Worker(new URL(...)), which is an import edge.
- pages/overview/deployments/HistoryConfig.tsx -- imported by the EE overlay file
  that shadows it.
- lib/noop/index.tsx -- the tsconfig `paths` fallback target.

Verified beyond type-checking, because tsc does not see worker URLs, generator
inputs or the EE overlay: full `pnpm build-oss` and `pnpm build-ee` both succeed,
turbo types:check green across 24 packages, lint clean, and the suites pass --
oss 432, entities 1330, entity-ui 473, chat 378, shared 362, playground 220,
ui 96, annotation 90, sessions 70.
…-extraction-leftovers

# Conflicts:
#	web/mobile/src/lib/interactive.ts
#	web/oss/src/components/pages/evaluations/NewEvaluation/Components/CreateEvaluatorDrawer/index.tsx
#	web/oss/src/components/pages/evaluations/NewEvaluation/Components/CreateHumanEvaluatorDrawer/index.tsx
#	web/oss/src/components/pages/settings/WorkspaceManage/Modals/GenerateResetLinkModal.tsx
#	web/oss/src/components/pages/settings/WorkspaceManage/Modals/PasswordResetLinkModal.tsx
#	web/packages/agenta-chat/src/model/approvalInputSummary.ts
#	web/packages/agenta-ui/src/drill-in/context/index.ts
The extraction pass deleted these as dead; release/v0.114.7 added or kept
importers for them, so the merge left the tree unbuildable.
…-extraction-leftovers

# Conflicts:
#	web/oss/src/components/EvalRunDetails/components/views/SingleScenarioViewerPOC/ScenarioAnnotationPanel/atoms.ts
#	web/oss/src/components/References/atoms/resolvedMetricPaths.ts
#	web/oss/src/state/entities/shared/createEntityController.ts
#	web/oss/src/state/entities/shared/createEntityDraftState.ts
The antd->Radix migration removed the classes these tests select on, so the
locators matched nothing and the tests timed out rather than failing with a
reason. Six locators moved to role/testid/AVT hooks that survive the swap:

- saveVariant waited on button.ant-btn-primary for Commit; that button is an
  EnhancedButton, now a facade over the Radix @agenta/ui Button. It also
  asserts visibility first, so a missing button reports itself instead of
  hanging isDisabled() for the full timeout. Five of the eleven failures run
  through this one helper.
- the observability projection tabs are the shared Segmented (role=radiogroup
  of role=radio), not an antd Radio.Group with a -checked class.
- the span glyph lost its antd Avatar; it gets a data-testid instead.
- the testset and registry tables are the virtual table, whose stable hook is
  .avt-body (see AVT in tableDom.ts) and whose selection control is the Radix
  Checkbox.
CI on this branch cut failures 11 -> 8, and named the two that remained:

- testset-management still waited on .ant-table-cell, a second stale selector
  in the same file the first fix did not cover; the virtual table stamps
  .avt-cell.
- the use-api page-rendered check was my own bad replacement: the Variants
  control is not a role=radio. It now waits for the registry table the test
  actually goes on to use, so the check cannot drift with the chrome again.
The evaluation and annotation modals pick rows through a table whose selection
control is now a Radix <button role="checkbox">, not an <input>. isSelected()
looked for input[type=checkbox] and the antd classes, matched nothing, and fell
through to a selected-tag lookup that also no longer applied — so it returned
false however many rows were selected.

The CLICK already worked (controlSelector carries [role="checkbox"]); only the
verification was blind, which is why these failed on a 30s poll rather than on
the click. Same one-line widening in both helpers.
CI got the suite to 4 failures and named another stale one: the add-column
click used .ant-table-thead, which no longer matches (the icon inside it is
still antd, only the header moved). Rather than keep finding these one CI run
at a time, every table selector now accepts both halves — .avt-*, .ant-table-* —
which is the pattern DOM_SELECTOR in the package already uses, and for its
stated reason: a host may still mount an antd table through the legacy adapter.
Full design record for #5512 (AGE-3997): codebase discovery, the UX plan
matching the interactive mockups, and the master + per-surface technical
plans (api/runner/web) revised after three independent code-verified
reviews. Data model lands on Option C (head-revision query, no flag-model
change); auto-discovery resolves to agent-driven install via a registry
search tool + existing self-config ops.
Adds GitDAO.query_head_revisions — one revision per variant, revision-flag
and artifact-search filters applied in SQL BEFORE windowing, so skill
listings paginate correctly (head selection rides the UUID7 id, no
version-string casts). WorkflowsService gains the thin
query_workflow_head_revisions wrapper reusing the existing flag
normalization and batch workflow fetch.

New skills domain (core/skills + apis/fastapi/skills) exposes
POST /skills/query (mounted at /skills and /preview/skills): the paginated
DB block plus the code-defined Agenta built-ins as a separate unpaginated
block, per the registry plan. VIEW_WORKFLOWS-gated; cursor id = the head
revision id.

Option C from the data-model decision: no flag-ownership changes, no
backfill — is_skill on revisions is already SQL-filterable and backfilled.
The head-revision DAO method is shared with the upcoming usage query (A3)
and the agent discovery tool.

Unit tests: registry mapping, builtin-block filtering, payload tolerance.
Full unit suite green (3116 passed).
POST /skills/usage {workflow_id | workflow_slug} walks the head revision of
every agent in the project (the head-revision query keeps this bounded by
agent count, not total revisions) and classifies each matching embed by its
reference level: artifact-level = follows latest, revision-level = pinned
with its version. Feeds the USED-BY chips and the save dialog's
blast-radius panel. Revision-level refs carrying only an opaque revision id
are documented as unmatched in v1.
Pure-function parser over an extracted tree: layout detection
(Claude marketplace manifest → root SKILL.md → nested glob, matching the
upload UX's clean/single/multi-recovery states), YAML frontmatter, and a
validation contract mirroring the SDK's SkillTemplate exactly — kebab name,
description/body/file-size caps, and all four path rules (absolute,
backslash, traversal, reserved root SKILL.md). Trust gates: binary and
oversized files are skipped with warnings, executables are imported
disarmed. A round-trip test proves parser-accepted output constructs
SkillTemplate unmodified. pyyaml promoted to a direct api dependency.
Import skills from public GitHub repos and Claude plugin marketplaces as
ordinary registry skills, snapshot-only (nothing ever executes from the
source):

- POST /skills/sources/scan previews a repo as skill candidates (layout
  detection: marketplace.json -> root SKILL.md -> glob) with per-candidate
  validity and issues; VIEW_WORKFLOWS.
- POST /skills/sources imports the selected candidates: each valid skill
  becomes a workflow (is_skill + is_snippet, agenta:builtin:skill:v0,
  snake_case skill payload) via the one-call simple create; EDIT_WORKFLOWS.
- Fetch is the GitHub REST tarball endpoint (no git binary, no clone),
  size-capped and safely extracted; tests inject a local fetcher.
- Provenance lands in new skill_sources / skill_source_links tables
  (migration oss000000027) so sync can offer new versions later;
  content_hash enables change detection, detached opts a skill out.
- Name collisions and invalid candidates are skipped and reported, not
  fatal; domain errors map to the agent-actionable envelope
  {code, message, retryable, next_step, details}.
- Config: AGENTA_SKILLS_IMPORT_TIMEOUT_SECONDS / _MAX_TARBALL_MB via env.
Manual refresh for imported skill sources — no cron in v1, the FE calls
it lazily from the registry page:

- POST /skills/sources/{id}/refresh re-fetches the source, re-scans it,
  and commits a new revision for every linked skill whose upstream
  content changed (message 'sync: <repo>@<sha>', meta.skill_sync as the
  origin marker for log readers).
- Locally edited skills are DETACHED, never overwritten: the link's
  content_hash records what sync last wrote, so a head that no longer
  matches it means a hand-edit happened in between. The commit goes
  through commit_workflow_revision_checked with base_revision_id, so a
  moved head races to 409 -> reported as 'conflict', not clobbered.
- Paths deleted upstream are marked missing_in_source (and cleared if
  they come back); the workflow is never deleted. Detached links are
  skipped entirely.
- GET /skills/sources lists a project's sources for the import UI.
- One canonical skill_content_hash (None-stripped sorted JSON) shared by
  import and refresh so stored payloads and fresh parses compare equal.
- DAO gains update_source / update_link; refresh scenarios covered by
  stub-fetcher unit tests (changed, hand-edited, missing, detached).
Two new workspace packages for the skill registry, mirroring the
sessions pair:

- @agenta/skills is HEADLESS (schema, API calls, atoms, embed writer):
  deps on entities + shared only, with lint bans on antd and every UI
  package — including @agenta/skills-ui — so mobile can consume it.
- @agenta/skills-ui is presentational and wraps existing entity-ui
  components (SkillFormView etc.), so antd is allowed; its eslint config
  spreads restrictedImportPaths so the shared singleton/barrel bans
  survive. The reverse edge is the contract: entity-ui never imports
  skills-ui.
- Registered in the allowlists that exist: oss next.config
  transpilePackages + package.json, ee package.json (ee inherits oss's
  transpilePackages), storybook next.config + package.json. Mobile
  registration lands with the /m wiring (W3).
- Dep versions match the app (antd ^6.1.3, next 15.5.21); both packages
  pass pnpm check (tsc + eslint).
The headless half of the skill registry:

- core/schema: zod mirror of the SDK SkillTemplate in its STORAGE shape
  (snake_case model_dump at data.parameters.skill — never the camelCase
  wire shape), plus the /skills/query and /skills/usage response shapes.
- api: querySkills / querySkillUsage against the dedicated /skills/*
  endpoints. Raw axios in the entities style because the generated Fern
  client cannot send a flags body to workflows/query and has no /skills
  resources yet; signatures are the contract a Fern swap must keep.
- state: list atoms mirroring the evaluator atoms' SHAPE (atomWithQuery,
  30s staleTime, derived skills/builtin views, server-side search atom)
  but NOT their invalidation — invalidateSkillsListCache resolves
  getHostQueryClient() per call so /m's host client is never orphaned.
- embed: buildSkillEmbedEntry / parseSkillEmbedEntry. Reference level
  encodes pin/follow (workflow ref = latest, workflow_revision ref =
  pinned) and a SIBLING name always rides next to @ag.embed because
  describeSkill renders the raw slug without it. List mutations stay in
  entity-ui's index-based itemListOps, driven by the host — this module
  never touches the list.
- entities: is_skill added to WorkflowQueryFlags (matched against head
  revisions server-side).

10 unit tests (embed round-trips, schema shapes); pnpm check green on
skills and entities.
Presentational skill-registry components (options in, callbacks out;
data arrives from @agenta/skills via the host):

- NewSkillMenuButton: THE single '+ New skill ▾' action (write / upload
  / import), identical everywhere a skill can be created.
- SkillCard + SkillsGalleryPage: the registry browse page on
  FilterRailLayout (the templates-gallery frame, not a TemplateGallery
  copy) — source rail with counts, search, sectioned card grids; origin
  tints the sk avatar (olive project / gray imported / ink builtin).
- VersionsRailCard: revision navigation for the drawer's detail mode.
- SkillPickerDrawer: AddSubagentDrawer anatomy plus what it lacks — a
  split [Add | ▾] per row (plain Add follows latest; the caret is where
  pinning lives, per the progressive-disclosure convention) and the
  footer '+ New skill ▾'. Add all acts on visible rows only.
- SkillSaveBlastRadius: the save dialog's panel (version bump, per-agent
  effect, running-sessions note) that replaces silent auto-commit.

entity-ui seams (extend, don't duplicate): SkillFormView gains
railBottomSlot so detail mode swaps the upload zone for the versions
card; CatalogListRow exported from the drill-in barrel.

Stories in storybook/stories/skills-ui cover populated/empty gallery,
mixed picker states (added / pinned / builtin), blast radius with
followers+pins and with no users; storybook lint + static build green.
- /w/[ws]/p/[project]/skills renders SkillsPage: @agenta/skills atoms
  (project + builtin blocks, server-side search) feeding the
  presentational SkillsGalleryPage. Card/drawer navigation and the
  create flows land with the follow-up checkpoints (W3.3 drawer rework,
  W5 upload/import) — the page lists and searches today.
- EE route stub mirrors the sessions pattern (import-then-export;
  EE does NOT inherit OSS routes, and app-layer pages may not re-export
  @agenta/* directly).
- Sidebar: SKILLS_SIDEBAR_KEY in @agenta/navigation constants; Skills
  sits between Agents and Sessions with the puzzle-piece icon. Selected
  state rides the standard route matching.

tsc clean on oss, ee, and navigation.
Mobile is a separate host with its own providers; without this wiring
/m would silently miss the registry (and later, the drawer seams):

- @agenta/skills + @agenta/skills-ui registered in mobile's
  transpilePackages and package.json (the last of the six allowlists).
- SkillGallerySections extracted from SkillsGalleryPage: the sectioned
  card grid + empty state is now ONE shared body, rendered by the
  desktop page inside FilterRailLayout and by /m inside its own
  scaffold — same cards on both hosts, no copy.
- /m route /w/../skills + SkillListScreen following the AgentListScreen
  browse shape (toolbar or rail per BROWSE_RAIL_MODE, NavDrawer + title
  + search); fed by the same @agenta/skills atoms as desktop.
- Skills nav row between Agents and Sessions (SKILLS_SIDEBAR_KEY,
  lucide Puzzle), matching the desktop sidebar placement.

Card taps stay no-op until the shared drawer seams land (W3.3/W5) —
same staging as desktop. mobile tsc + lint clean; skills-ui check
green after the refactor.
…n 1c/1d/1e

Two strands, one dependency chain (the upload rework builds on the
sources API surface):

Create + import wiring (from live QA on the running stack):
- @agenta/skills gains the /skills/sources surface: scanSkillSource /
  importSkillSource + response schemas, and createSkillWorkflow (skill
  flags on artifact AND v1 revision — the registry query filters on the
  revision flag, so a commit without it is invisible).
- SkillImportDrawer (URL -> scan -> candidate checkboxes -> keep-in-sync
  -> import) + story; SkillCreateDrawer commits a registry skill and
  invalidates the list; both wired on the desktop page and /m.
- API-side fixes surfaced by QA (parser/import service/DAO + tests);
  ruff + 23 skills unit tests green.

Upload flow aligned with the agreed design (1c/1d/1e):
- 'Upload' now opens as a FULL-DRAWER dropzone ('nothing is created
  until you review'); 'Write from scratch' opens the editor as before.
- One valid skill morphs the drawer into the prefilled editor with an
  'N files parsed' tag; errors stay IN the upload view — red panel,
  selectable nested-skills recovery ('Import N skills'), gold warnings
  for skipped files, dropzone below as the retry target.
- entity-ui skillUpload gains scanSkillFiles: every SKILL.md becomes a
  candidate scoped to its own subtree; binary/oversized files skipped
  with a reason, never mojibaked. 4 new unit tests; 623 green.
- Drawer sizes to its stage: compact (520) for upload/recovery, wide
  (960) for the editor, animated width transition. State resets on the
  OPEN transition so closing no longer restages mid-exit-animation.
…(W3.3a)

Clicking a registry card now opens the detail drawer (artboards 2/2b),
one shell with the editor anatomy throughout:

- Read-only SkillFormView with the VERSIONS rail card in place of the
  drop zone; clicking a version row navigates that revision's content.
  USED BY chips (agent + its pin) sit above the form.
- Viewing an older revision: 'viewing vN — read-only' tag, footer
  becomes 'Restore as vN+1' — a normal new commit.
- 'Edit skill' turns the same drawer editable; Save opens the
  blast-radius dialog (5b: vN -> vN+1, per-agent effect, running
  sessions note, commit message) and commits — the explicit replacement
  for silent auto-commit. The dialog is a Radix Dialog, not the
  antd-backed EnhancedModal, because /m renders this drawer and antd is
  banned there.
- @agenta/skills gains fetchSkillRevisions (entities revision query,
  v0 bootstrap filtered, content mapped from data.parameters.skill) and
  commitSkillRevision (skill flags stamped explicitly on the revision —
  the registry query filters on them).
- Wired on both hosts: desktop SkillsPage and /m SkillListScreen; the
  clicked item survives the exit animation (only the open flag flips).
- Builtin cards open read-only info (maintained by Agenta, no
  versions/edit).

tsc + lint clean on skills, skills-ui, oss, mobile.
The config panel's Skills '+' now opens the registry picker (artboard
4b) instead of the inline-skill editor, on BOTH hosts:

- New drill-in skills bridge in @agenta/ui (component injection, so
  the package stays dependency-free — parallels GatewayToolsBridge);
  implementation in @agenta/skills-ui (useSkillsBridge/SkillPickerHost);
  wired in OSSdrillInUIProvider AND /m's DrillInBridgeProvider. Hosts
  without the bridge keep the inline-editor fallback.
- SkillPickerHost drives SkillPickerDrawer over the live registry
  (project + builtin blocks; embed identity is the WORKFLOW slug,
  display is the skill name). Add emits a fully-built @ag.embed entry —
  sibling name/description, workflow ref for follow-latest, revision
  ref for pin — and the PANEL owns the list write (append/filter), so
  entries it cannot parse survive untouched.
- Rows already on the agent show Added / Pinned vN and flip to Remove;
  remove filters by referenced slug and never touches inline packages.
- The picker's '+ New skill' menu opens the same create/upload/import
  drawers; a skill created or imported from here lands in the registry
  AND on this agent (onCreated/onImported callbacks added to both
  drawers).
- AgentTemplateControl parses the agent's existing embeds
  (staticEmbedSlug + now-exported embedRevisionVersion) to feed the
  picker's Added state.

tsc + lint green on ui, entity-ui, skills-ui, oss, mobile; 623
entity-ui tests pass.
Added rows were only distinguishable by a small check suffix in one
flat list. The picker now renders two groups — 'On this agent' (rows
with Remove) above 'Available' (rows with the split Add | pin caret,
and Add all on the group header) — so membership reads at a glance.
Rows also display the skill NAME rather than the storage slug, which
un-mangles the __ag__ builtin rows.
The grouped picker reshuffled rows on every add/remove. Back to ONE
stable flat list; membership now reads through a success-tinted row
background (CatalogListRow gains a className seam) alongside the green
Added/Pinned suffix and the Remove action — a clear cue with zero
layout shift. Rows keep displaying the skill name over the storage
slug.
…ed without it

Found in live QA: every skill added from the registry picker broke the
agent run with 'Invalid skill configuration: name/description/body
missing'. The embed writer emitted only @ag.references, so the resolver
inlined the whole revision.data (uri + parameters) instead of the
SkillTemplate. The documented skill-embed shape (sdk agenta_builtins)
carries '@ag.selector': {path: 'parameters.skill'} — the writer now
emits it on both the latest and pinned forms.

Verified end-to-end on the live stack: registry skill added via the
picker -> run succeeds -> agent invoked the skill and returned its
fixture content.
…rview fix

Closes three QA gaps in one pass:

Registry grouping + counts (API + web):
- /skills/query now returns used_by_count per skill (one pass over the
  agent HEAD revisions, counted once per agent per skill) and source
  attribution: skills[].source_id plus a sources block (repo_url, sync
  state, updated_at) joined from skill_source_links.
- ONE shared buildRegistrySections (skills-ui) maps the response for
  BOTH hosts: This project / one section per imported repo with a
  'synced Xd ago' tag / Agenta; orphaned links fall back to This
  project rather than disappearing. Desktop's source rail now actually
  filters; cards show the used-by count in their meta line.

Config skill rows say the choice, not the plumbing:
- describeSkill drops the raw '@ag.embed' tag for a green 'Latest' or a
  neutral 'Pinned vN' (per the embed's reference level), with matching
  subtitles; the redundant 'skill' tag on inline rows is gone (ux-plan
  issue 3). ItemDescriptor tags accept a toned object form; the slash
  palette's tail reads the label.

Agent overview Configuration card:
- 'N available' -> 'N skills'; the row now expands to the skill NAMES
  (summary gains skillNames, embed refs named by sibling name/slug);
  rows with no expansion and no onEdit render inert instead of an
  empty accordion (the /m overview passes no editor).

3136 API unit tests, 624 entity-ui tests, tsc clean on oss + mobile.
ardaerzin and others added 2 commits September 10, 2026 11:06
One conflict, in AgentConfigSummaryCard: both sides rewrote the skills row and
the rows' collapsible rule. Kept this branch's "N skills" label and the
skill-names expansion, with release's read-only empty wording. Took release's
collapsible={Boolean(row.expands)}: onOpen drives the drawer mode on its own, so
it behaves the same as this branch's rule and pairs with release's bodyClassName.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
[AGE-3997] feat(platform): skill registry — publish, browse, install, sync
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

📘 Docs preview

Status ✅ Ready
Preview https://pr-6740-agenta-docs-preview.mahmoud-637.workers.dev/docs
Inspect Actions run
Commit dc914e0311b6768f787c593f015b0007ba0580f2

This comment updates in place on every push.

[AGE-4279] fix(frontend): open a chat at its latest message
…irect

[fix] Land on the new project after creating one on mobile
@github-actions

github-actions Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor Author

Railway Preview Environment

Status Destroyed (PR closed)

Updated at 2026-09-10T15:23:41.094Z

ardaerzin and others added 13 commits September 10, 2026 11:40
Resolves the one conflict in useAgentConversation.ts: the base added a
useMountGeneration import on the same line this branch added the
useFileActivityDetector one. They are unrelated (React mount identity vs
drive mounts), so both are kept.
… attach on the head revision

The Attach a secret drawer sits at z-index 1000 above the Advanced dialog, and the
shared Select portals its option list to body at z-50, so the list painted under the
drawer and the picker looked empty. The drawer and the secret form now pass the layer
above the drawer to every SelectContent they render. The drawer also refetches the
vault list when it opens, because the vault query keeps a live subscriber for the
whole page and nothing else ever refetched it.

The bindings commit sent base_revision_id equal to the revision the panel displayed,
and the server rejects any base that is not the head, so every attach from a panel on
an older revision failed with a 409 and Retry resent the same stale base. The commit
now reads the variant head first and builds the bindings-only revision on the head's
data; on a real race it re-reads once and retries, then raises a plain message.

Closes #6733
Closes #6734

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
… and keep drafts off a newer head

Review of the head-anchored commit found two data-loss paths. The callers send the full
attachment list from the revision the panel displays, so a commit on a head whose
attachments differ would silently drop the other change. The atom now compares the head's
attachments with the displayed ones before every attempt and asks for a reload when they
differ, which keeps the review rule from the design plan. Edits typed during the request
are carried to the adopted revision only when it was built on the displayed revision,
because copying them onto a newer head would revert the head's other fields locally.

The 409 check now requires the revision_conflict code, so a proxy 409 stays a plain error.
The vault refetch moved to its own effect keyed on open, because the refetch callback
changes identity on every fetch.

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
…e legacy key migration

The vault hook reported loading while the one-time localStorage migration had not
finished. A legacy payload that an older build wrote once instead of twice made the
migration throw, it rolled back to not-migrated, and every secret picker and the
Advanced section showed Loading secrets forever. The migration now accepts both
encodings, backs up and clears a payload it cannot read, and always ends migrated.
The loading flag no longer includes the migration state.

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
…s and agents load again

DEFAULT_BUILD_KIT_OPS gained search_skills, check_skill_updates and apply_skill_update
with the skill registry, but _BUILD_KIT_OP_PERMISSIONS never learned them. Every
build of the agent-template overlay raised KeyError: 'search_skills', so the skills
query, the skills page and the agent catalog answered 500 on release/v0.116.0. The
two reads allow; the apply asks, because its approval card is the user prompt. The
overlay test's expected map gains the same three entries; it was red for the same
reason.

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
… row

#6641 set the read-only Skills summary to "None available" and tested it.
The release/v0.116.0 merge into feat/skill-registry (#6604) resolved the
line to "None added", so agentConfigSummaryCard.test.tsx fails on the
release branch and on every PR against it.
test(frontend): point the acceptance suite at what the UI renders now
[AGE-4271] fix(frontend): let /m's drive learn about the mount its own run created
chore(frontend): remove dead and duplicated code left by the package extractions
[fix] Restore the read-only Skills empty text in the agent config card
…sions

[fix] Give the skill registry ops a build-kit permission so skills load again
@CLAassistant

CLAassistant commented Sep 10, 2026

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you all sign our Contributor License Agreement before we can accept your contribution.
3 out of 4 committers have signed the CLA.

✅ ashrafchowdury
✅ mmabrouk
✅ ardaerzin
❌ Mahmoud Mabrouk


Mahmoud Mabrouk seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.
You have signed the CLA already but the status is still pending? Let us recheck it.

Mahmoud Mabrouk and others added 3 commits September 10, 2026 13:33
…a bad one

CodeRabbit: a null entry in the legacy list threw inside the loop, which marked the
migration done without the backup and cleanup. The list now goes through a zod schema
via safeParseWithLogging, null entries drop out, a keyless entry is skipped, and one
entry that fails to save no longer stops the others. Backup and cleanup always run.

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
…e entries one by one

Codex gate review: a legacy key whose save failed was cleared from storage with the
migration marked done, so a temporary API error lost it for good. The entries that
fail to save now stay in the active storage key in the canonical form, and the next
page load retries them. The list is also validated entry by entry, so one malformed
entry no longer rejects the valid ones beside it.

Claude-Session: https://claude.ai/code/session_01AY886ajXX65KAa1Vc9JCXU
[fix] Show the secret picker above the attach drawer and anchor the attach on the head revision
@mmabrouk
mmabrouk merged commit 80942ae into main Sep 10, 2026
74 of 77 checks 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.

4 participants