From 71ead5b410df9f9227210d510ee6ea941667ae17 Mon Sep 17 00:00:00 2001 From: Shai Revivo Date: Wed, 19 Aug 2026 11:42:43 +0300 Subject: [PATCH 1/3] fix(#2528): sync VALID_ROLES with Go's ValidRoles() The web admin's VALID_ROLES had only 4 roles while the backend accepts 8. Add the missing fix, retro, prioritize, and e2e roles and update both error messages. A parameterized test now covers all 8 roles to prevent future drift. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Shai Revivo --- web/admin/src/lib/layers/orgConfigParse.test.ts | 16 ++++++++++++++++ web/admin/src/lib/layers/orgConfigParse.ts | 6 +++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/web/admin/src/lib/layers/orgConfigParse.test.ts b/web/admin/src/lib/layers/orgConfigParse.test.ts index 85b7fe1f4c..25448ae5e0 100644 --- a/web/admin/src/lib/layers/orgConfigParse.test.ts +++ b/web/admin/src/lib/layers/orgConfigParse.test.ts @@ -65,6 +65,22 @@ repos: {} expect(validateOrgConfig(cfg)).toMatch(/non-negative integer/); }); + it.each(["fullsend", "triage", "coder", "review", "fix", "retro", "prioritize", "e2e"])( + "accepts role %s", + (role) => { + const cfg = parseOrgConfigYaml(`version: "1" +dispatch: + platform: github-actions +defaults: + roles: [${role}] +agents: + - role: ${role} +repos: {} +`); + expect(validateOrgConfig(cfg)).toBeNull(); + }, + ); + it("rejects invalid agent role", () => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: diff --git a/web/admin/src/lib/layers/orgConfigParse.ts b/web/admin/src/lib/layers/orgConfigParse.ts index 229fed8fff..7f15e96c20 100644 --- a/web/admin/src/lib/layers/orgConfigParse.ts +++ b/web/admin/src/lib/layers/orgConfigParse.ts @@ -13,7 +13,7 @@ export type OrgConfigYaml = { repos?: Record; }; -const VALID_ROLES = new Set(["fullsend", "triage", "coder", "review"]); +const VALID_ROLES = new Set(["fullsend", "triage", "coder", "review", "fix", "retro", "prioritize", "e2e"]); /** 512 KiB — more than sufficient for any realistic org `config.yaml`. */ export const MAX_ORG_CONFIG_YAML_UTF8_BYTES = 512 * 1024; @@ -153,12 +153,12 @@ export function validateOrgConfig(cfg: OrgConfigYaml): string | null { } for (const role of cfg.defaults?.roles ?? []) { if (!VALID_ROLES.has(role)) { - return `invalid role ${JSON.stringify(role)}: must be one of fullsend, triage, coder, review`; + return `invalid role ${JSON.stringify(role)}: must be one of fullsend, triage, coder, review, fix, retro, prioritize, e2e`; } } for (const agent of cfg.agents ?? []) { if (!VALID_ROLES.has(agent.role)) { - return `invalid agent role ${JSON.stringify(agent.role)}: must be one of fullsend, triage, coder, review`; + return `invalid agent role ${JSON.stringify(agent.role)}: must be one of fullsend, triage, coder, review, fix, retro, prioritize, e2e`; } } return null; From 2477d8df44543ac8d041050f77929cf40666170e Mon Sep 17 00:00:00 2001 From: Shai Revivo Date: Wed, 19 Aug 2026 12:19:52 +0300 Subject: [PATCH 2/3] fix(#2528): sync VALID_ROLES and update agent schema to source/name/enabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit VALID_ROLES was missing fix, retro, prioritize, and e2e — add them for defaults.roles validation. Separately, the agent type still used the legacy role/name/slug format that Go rejects since ADR 0045 Phase 4. Update the TypeScript agent type, parser, and downstream consumers to use Go's current source/name/enabled schema with DerivedName() logic for name extraction. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Shai Revivo --- web/admin/src/lib/layers/analyzeOrg.test.ts | 2 +- web/admin/src/lib/layers/analyzeOrg.ts | 4 +- .../src/lib/layers/orgConfigParse.test.ts | 48 +++++++++++++++---- web/admin/src/lib/layers/orgConfigParse.ts | 43 +++++++++++------ web/admin/src/lib/layers/secrets.test.ts | 6 +-- web/admin/src/lib/layers/secrets.ts | 6 +-- web/admin/src/lib/orgs/orgListRow.ts | 2 +- 7 files changed, 77 insertions(+), 34 deletions(-) diff --git a/web/admin/src/lib/layers/analyzeOrg.test.ts b/web/admin/src/lib/layers/analyzeOrg.test.ts index 3186bb6554..50c4aa6737 100644 --- a/web/admin/src/lib/layers/analyzeOrg.test.ts +++ b/web/admin/src/lib/layers/analyzeOrg.test.ts @@ -44,7 +44,7 @@ describe("analyzeOrgLayers", () => { const { reports, rollup } = await analyzeOrgLayers({ org: "acme", gh: fullStackMock(), - agents: [{ role: "fullsend" }], + agents: [{ name: "fullsend" }], enabledRepos: ["r1"], }); expect(reports).toHaveLength(5); diff --git a/web/admin/src/lib/layers/analyzeOrg.ts b/web/admin/src/lib/layers/analyzeOrg.ts index d9b5680001..d66f0e1b5b 100644 --- a/web/admin/src/lib/layers/analyzeOrg.ts +++ b/web/admin/src/lib/layers/analyzeOrg.ts @@ -10,8 +10,8 @@ import { analyzeWorkflowsLayer } from "./workflows"; export type AnalyzeOrgLayersInput = { org: string; gh: LayerGithub; - /** Agent roles from org config (drives secret/variable names). */ - agents: { role: string }[]; + /** Agent names from org config (drives secret/variable names). */ + agents: { name: string }[]; /** Repos with `enabled: true` in config (drives enrollment checks). */ enabledRepos: string[]; }; diff --git a/web/admin/src/lib/layers/orgConfigParse.test.ts b/web/admin/src/lib/layers/orgConfigParse.test.ts index 25448ae5e0..33874b66b0 100644 --- a/web/admin/src/lib/layers/orgConfigParse.test.ts +++ b/web/admin/src/lib/layers/orgConfigParse.test.ts @@ -66,43 +66,72 @@ repos: {} }); it.each(["fullsend", "triage", "coder", "review", "fix", "retro", "prioritize", "e2e"])( - "accepts role %s", + "accepts defaults role %s", (role) => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: platform: github-actions defaults: roles: [${role}] -agents: - - role: ${role} repos: {} `); expect(validateOrgConfig(cfg)).toBeNull(); }, ); - it("rejects invalid agent role", () => { + it("rejects invalid defaults role", () => { + const cfg = parseOrgConfigYaml(`version: "1" +dispatch: + platform: github-actions +defaults: + roles: [bogus] +repos: {} +`); + expect(validateOrgConfig(cfg)).toMatch(/invalid role/); + }); + + it("accepts agents with source-based entries", () => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: platform: github-actions defaults: roles: [fullsend] agents: - - role: not-a-valid-role + - source: harness/triage.yaml + - source: https://example.com/coder.yaml#sha256=abc123 + name: my-coder + - harness/review.yaml repos: {} `); - expect(validateOrgConfig(cfg)).toMatch(/invalid agent role/); + expect(validateOrgConfig(cfg)).toBeNull(); + expect(agentsFromConfig(cfg)).toEqual([ + { name: "triage" }, + { name: "my-coder" }, + { name: "review" }, + ]); }); - it("lists agents and enabled repos from config", () => { + it("excludes disabled agents from agentsFromConfig", () => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: platform: github-actions defaults: roles: [fullsend] agents: - - role: triage - slug: t + - source: harness/triage.yaml + - source: harness/coder.yaml + enabled: false +repos: {} +`); + expect(agentsFromConfig(cfg)).toEqual([{ name: "triage" }]); + }); + + it("lists enabled repos from config", () => { + const cfg = parseOrgConfigYaml(`version: "1" +dispatch: + platform: github-actions +defaults: + roles: [fullsend] repos: zed: enabled: false @@ -112,7 +141,6 @@ repos: enabled: true `); expect(validateOrgConfig(cfg)).toBeNull(); - expect(agentsFromConfig(cfg)).toEqual([{ role: "triage" }]); expect(enabledReposFromConfig(cfg)).toEqual(["alpha", "beta"]); }); diff --git a/web/admin/src/lib/layers/orgConfigParse.ts b/web/admin/src/lib/layers/orgConfigParse.ts index 7f15e96c20..10308257eb 100644 --- a/web/admin/src/lib/layers/orgConfigParse.ts +++ b/web/admin/src/lib/layers/orgConfigParse.ts @@ -9,7 +9,7 @@ export type OrgConfigYaml = { max_implementation_retries?: number; auto_merge?: boolean; }; - agents?: { role: string; name?: string; slug?: string }[]; + agents?: (string | { source?: string; name?: string; enabled?: boolean })[]; repos?: Record; }; @@ -111,12 +111,9 @@ function assertOrgConfigShape(doc: Record): void { } for (let i = 0; i < doc.agents.length; i++) { const el = doc.agents[i]; + if (typeof el === "string") continue; if (el === null || typeof el !== "object" || Array.isArray(el)) { - throw new Error(`parsing org config: agents[${i}] must be a mapping with a string role`); - } - const role = (el as Record).role; - if (typeof role !== "string") { - throw new Error(`parsing org config: agents[${i}].role must be a string`); + throw new Error(`parsing org config: agents[${i}] must be a string or mapping`); } } } @@ -156,17 +153,35 @@ export function validateOrgConfig(cfg: OrgConfigYaml): string | null { return `invalid role ${JSON.stringify(role)}: must be one of fullsend, triage, coder, review, fix, retro, prioritize, e2e`; } } - for (const agent of cfg.agents ?? []) { - if (!VALID_ROLES.has(agent.role)) { - return `invalid agent role ${JSON.stringify(agent.role)}: must be one of fullsend, triage, coder, review, fix, retro, prioritize, e2e`; - } - } return null; } -/** Agent rows for secrets-layer analyze (mirrors `config.OrgConfig.Agents`). */ -export function agentsFromConfig(cfg: OrgConfigYaml): { role: string }[] { - return (cfg.agents ?? []).map((a) => ({ role: a.role })); +function derivedAgentName(entry: string | { source?: string; name?: string; enabled?: boolean }): string { + if (typeof entry === "string") { + return sourceBaseName(entry); + } + if (entry.name) return entry.name; + return sourceBaseName(entry.source ?? ""); +} + +function sourceBaseName(src: string): string { + const hashIdx = src.lastIndexOf("#"); + if (hashIdx >= 0) src = src.slice(0, hashIdx); + const base = src.split("/").pop() ?? ""; + const dotIdx = base.lastIndexOf("."); + return dotIdx > 0 ? base.slice(0, dotIdx) : base; +} + +function isAgentEnabled(entry: string | { source?: string; name?: string; enabled?: boolean }): boolean { + if (typeof entry === "string") return true; + return entry.enabled !== false; +} + +/** Enabled agent names for secrets-layer analyze (mirrors `config.OrgConfig.Agents`). */ +export function agentsFromConfig(cfg: OrgConfigYaml): { name: string }[] { + return (cfg.agents ?? []) + .filter(isAgentEnabled) + .map((a) => ({ name: derivedAgentName(a) })); } /** Enabled repo names for enrollment-layer analyze (sorted). */ diff --git a/web/admin/src/lib/layers/secrets.test.ts b/web/admin/src/lib/layers/secrets.test.ts index 47e6728289..d58b830c97 100644 --- a/web/admin/src/lib/layers/secrets.test.ts +++ b/web/admin/src/lib/layers/secrets.test.ts @@ -27,7 +27,7 @@ describe("analyzeSecretsLayer", () => { secrets: new Set(["FULLSEND_TRIAGE_APP_PRIVATE_KEY"]), variables: new Set(["FULLSEND_TRIAGE_CLIENT_ID"]), }), - [{ role: "triage" }], + [{ name: "triage" }], ); expect(r.status).toBe("installed"); expect(r.details).toContain("FULLSEND_TRIAGE_APP_PRIVATE_KEY exists"); @@ -35,7 +35,7 @@ describe("analyzeSecretsLayer", () => { }); it("not_installed when nothing present", async () => { - const r = await analyzeSecretsLayer("acme", mockGh({}), [{ role: "fullsend" }]); + const r = await analyzeSecretsLayer("acme", mockGh({}), [{ name: "fullsend" }]); expect(r.status).toBe("not_installed"); expect(r.wouldInstall).toEqual([ "create FULLSEND_FULLSEND_APP_PRIVATE_KEY", @@ -50,7 +50,7 @@ describe("analyzeSecretsLayer", () => { secrets: new Set(["FULLSEND_FULLSEND_APP_PRIVATE_KEY"]), variables: new Set(), }), - [{ role: "fullsend" }], + [{ name: "fullsend" }], ); expect(r.status).toBe("degraded"); expect(r.wouldFix).toContain("create missing FULLSEND_FULLSEND_CLIENT_ID"); diff --git a/web/admin/src/lib/layers/secrets.ts b/web/admin/src/lib/layers/secrets.ts index 1c572d3451..27411a9efd 100644 --- a/web/admin/src/lib/layers/secrets.ts +++ b/web/admin/src/lib/layers/secrets.ts @@ -16,7 +16,7 @@ export function variableNameForRole(role: string): string { export async function analyzeSecretsLayer( org: string, gh: LayerGithub, - agents: { role: string }[], + agents: { name: string }[], ): Promise { const report: LayerReport = { name: "secrets", @@ -30,14 +30,14 @@ export async function analyzeSecretsLayer( const missing: string[] = []; for (const agent of agents) { - const sName = secretNameForRole(agent.role); + const sName = secretNameForRole(agent.name); if (await gh.repoSecretExists(org, CONFIG_REPO_NAME, sName)) { present.push(sName); } else { missing.push(sName); } - const vName = variableNameForRole(agent.role); + const vName = variableNameForRole(agent.name); if (await gh.repoVariableExists(org, CONFIG_REPO_NAME, vName)) { present.push(vName); } else { diff --git a/web/admin/src/lib/orgs/orgListRow.ts b/web/admin/src/lib/orgs/orgListRow.ts index b0372fcb46..ab72fe0ec8 100644 --- a/web/admin/src/lib/orgs/orgListRow.ts +++ b/web/admin/src/lib/orgs/orgListRow.ts @@ -78,7 +78,7 @@ export async function analyzeOrgForOrgList( } else { exists = await gh.getRepoExists(org, CONFIG_REPO_NAME); } - let agents: { role: string }[] = []; + let agents: { name: string }[] = []; let enabledRepos: string[] = []; if (exists) { const raw = await gh.getRepoFileUtf8(org, CONFIG_REPO_NAME, CONFIG_FILE_PATH); From bc588ce630b9f4193395110699e3bd098aaf82ff Mon Sep 17 00:00:00 2001 From: Shai Revivo Date: Thu, 20 Aug 2026 10:09:17 +0300 Subject: [PATCH 3/3] =?UTF-8?q?fix(#2528):=20address=20review=20=E2=80=94?= =?UTF-8?q?=20use=20defaults.roles=20for=20secrets,=20not=20agent=20names?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Go's secrets layer keys credentials by role (from defaults.roles), not by derived agent name. Replace agentsFromConfig (which derived names from agent source) with rolesFromConfig (which reads defaults.roles directly). This matches Go's AgentCredentials.Role flow. Remove the now-unnecessary derivedAgentName/sourceBaseName helpers and their edge-case-prone reimplementation of DerivedName(). Co-Authored-By: Claude Opus 4.6 Signed-off-by: Shai Revivo --- web/admin/src/lib/layers/analyzeOrg.test.ts | 2 +- web/admin/src/lib/layers/analyzeOrg.ts | 4 +-- .../src/lib/layers/orgConfigParse.test.ts | 30 +++++++++---------- web/admin/src/lib/layers/orgConfigParse.ts | 29 ++---------------- web/admin/src/lib/layers/secrets.test.ts | 6 ++-- web/admin/src/lib/layers/secrets.ts | 6 ++-- web/admin/src/lib/orgs/orgListRow.ts | 6 ++-- 7 files changed, 30 insertions(+), 53 deletions(-) diff --git a/web/admin/src/lib/layers/analyzeOrg.test.ts b/web/admin/src/lib/layers/analyzeOrg.test.ts index 50c4aa6737..3186bb6554 100644 --- a/web/admin/src/lib/layers/analyzeOrg.test.ts +++ b/web/admin/src/lib/layers/analyzeOrg.test.ts @@ -44,7 +44,7 @@ describe("analyzeOrgLayers", () => { const { reports, rollup } = await analyzeOrgLayers({ org: "acme", gh: fullStackMock(), - agents: [{ name: "fullsend" }], + agents: [{ role: "fullsend" }], enabledRepos: ["r1"], }); expect(reports).toHaveLength(5); diff --git a/web/admin/src/lib/layers/analyzeOrg.ts b/web/admin/src/lib/layers/analyzeOrg.ts index d66f0e1b5b..00dad2dc3a 100644 --- a/web/admin/src/lib/layers/analyzeOrg.ts +++ b/web/admin/src/lib/layers/analyzeOrg.ts @@ -10,8 +10,8 @@ import { analyzeWorkflowsLayer } from "./workflows"; export type AnalyzeOrgLayersInput = { org: string; gh: LayerGithub; - /** Agent names from org config (drives secret/variable names). */ - agents: { name: string }[]; + /** Roles from org config (drives secret/variable names). */ + agents: { role: string }[]; /** Repos with `enabled: true` in config (drives enrollment checks). */ enabledRepos: string[]; }; diff --git a/web/admin/src/lib/layers/orgConfigParse.test.ts b/web/admin/src/lib/layers/orgConfigParse.test.ts index 33874b66b0..63c24e63c1 100644 --- a/web/admin/src/lib/layers/orgConfigParse.test.ts +++ b/web/admin/src/lib/layers/orgConfigParse.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { - agentsFromConfig, + rolesFromConfig, enabledReposFromConfig, MAX_ORG_CONFIG_YAML_DEPTH, MAX_ORG_CONFIG_YAML_UTF8_BYTES, @@ -90,7 +90,7 @@ repos: {} expect(validateOrgConfig(cfg)).toMatch(/invalid role/); }); - it("accepts agents with source-based entries", () => { + it("parses agents with source-based entries without error", () => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: platform: github-actions @@ -98,32 +98,32 @@ defaults: roles: [fullsend] agents: - source: harness/triage.yaml - - source: https://example.com/coder.yaml#sha256=abc123 + - source: harness/coder.yaml name: my-coder - harness/review.yaml repos: {} `); expect(validateOrgConfig(cfg)).toBeNull(); - expect(agentsFromConfig(cfg)).toEqual([ - { name: "triage" }, - { name: "my-coder" }, - { name: "review" }, - ]); }); - it("excludes disabled agents from agentsFromConfig", () => { + it("rolesFromConfig returns defaults.roles as role objects", () => { const cfg = parseOrgConfigYaml(`version: "1" dispatch: platform: github-actions defaults: - roles: [fullsend] -agents: - - source: harness/triage.yaml - - source: harness/coder.yaml - enabled: false + roles: [triage, coder] +repos: {} +`); + expect(rolesFromConfig(cfg)).toEqual([{ role: "triage" }, { role: "coder" }]); + }); + + it("rolesFromConfig returns empty array when no defaults.roles", () => { + const cfg = parseOrgConfigYaml(`version: "1" +dispatch: + platform: github-actions repos: {} `); - expect(agentsFromConfig(cfg)).toEqual([{ name: "triage" }]); + expect(rolesFromConfig(cfg)).toEqual([]); }); it("lists enabled repos from config", () => { diff --git a/web/admin/src/lib/layers/orgConfigParse.ts b/web/admin/src/lib/layers/orgConfigParse.ts index 10308257eb..db3e66b5d6 100644 --- a/web/admin/src/lib/layers/orgConfigParse.ts +++ b/web/admin/src/lib/layers/orgConfigParse.ts @@ -156,32 +156,9 @@ export function validateOrgConfig(cfg: OrgConfigYaml): string | null { return null; } -function derivedAgentName(entry: string | { source?: string; name?: string; enabled?: boolean }): string { - if (typeof entry === "string") { - return sourceBaseName(entry); - } - if (entry.name) return entry.name; - return sourceBaseName(entry.source ?? ""); -} - -function sourceBaseName(src: string): string { - const hashIdx = src.lastIndexOf("#"); - if (hashIdx >= 0) src = src.slice(0, hashIdx); - const base = src.split("/").pop() ?? ""; - const dotIdx = base.lastIndexOf("."); - return dotIdx > 0 ? base.slice(0, dotIdx) : base; -} - -function isAgentEnabled(entry: string | { source?: string; name?: string; enabled?: boolean }): boolean { - if (typeof entry === "string") return true; - return entry.enabled !== false; -} - -/** Enabled agent names for secrets-layer analyze (mirrors `config.OrgConfig.Agents`). */ -export function agentsFromConfig(cfg: OrgConfigYaml): { name: string }[] { - return (cfg.agents ?? []) - .filter(isAgentEnabled) - .map((a) => ({ name: derivedAgentName(a) })); +/** Roles for secrets-layer analyze — Go keys secrets by role, not agent name. */ +export function rolesFromConfig(cfg: OrgConfigYaml): { role: string }[] { + return (cfg.defaults?.roles ?? []).map((r) => ({ role: r })); } /** Enabled repo names for enrollment-layer analyze (sorted). */ diff --git a/web/admin/src/lib/layers/secrets.test.ts b/web/admin/src/lib/layers/secrets.test.ts index d58b830c97..47e6728289 100644 --- a/web/admin/src/lib/layers/secrets.test.ts +++ b/web/admin/src/lib/layers/secrets.test.ts @@ -27,7 +27,7 @@ describe("analyzeSecretsLayer", () => { secrets: new Set(["FULLSEND_TRIAGE_APP_PRIVATE_KEY"]), variables: new Set(["FULLSEND_TRIAGE_CLIENT_ID"]), }), - [{ name: "triage" }], + [{ role: "triage" }], ); expect(r.status).toBe("installed"); expect(r.details).toContain("FULLSEND_TRIAGE_APP_PRIVATE_KEY exists"); @@ -35,7 +35,7 @@ describe("analyzeSecretsLayer", () => { }); it("not_installed when nothing present", async () => { - const r = await analyzeSecretsLayer("acme", mockGh({}), [{ name: "fullsend" }]); + const r = await analyzeSecretsLayer("acme", mockGh({}), [{ role: "fullsend" }]); expect(r.status).toBe("not_installed"); expect(r.wouldInstall).toEqual([ "create FULLSEND_FULLSEND_APP_PRIVATE_KEY", @@ -50,7 +50,7 @@ describe("analyzeSecretsLayer", () => { secrets: new Set(["FULLSEND_FULLSEND_APP_PRIVATE_KEY"]), variables: new Set(), }), - [{ name: "fullsend" }], + [{ role: "fullsend" }], ); expect(r.status).toBe("degraded"); expect(r.wouldFix).toContain("create missing FULLSEND_FULLSEND_CLIENT_ID"); diff --git a/web/admin/src/lib/layers/secrets.ts b/web/admin/src/lib/layers/secrets.ts index 27411a9efd..1c572d3451 100644 --- a/web/admin/src/lib/layers/secrets.ts +++ b/web/admin/src/lib/layers/secrets.ts @@ -16,7 +16,7 @@ export function variableNameForRole(role: string): string { export async function analyzeSecretsLayer( org: string, gh: LayerGithub, - agents: { name: string }[], + agents: { role: string }[], ): Promise { const report: LayerReport = { name: "secrets", @@ -30,14 +30,14 @@ export async function analyzeSecretsLayer( const missing: string[] = []; for (const agent of agents) { - const sName = secretNameForRole(agent.name); + const sName = secretNameForRole(agent.role); if (await gh.repoSecretExists(org, CONFIG_REPO_NAME, sName)) { present.push(sName); } else { missing.push(sName); } - const vName = variableNameForRole(agent.name); + const vName = variableNameForRole(agent.role); if (await gh.repoVariableExists(org, CONFIG_REPO_NAME, vName)) { present.push(vName); } else { diff --git a/web/admin/src/lib/orgs/orgListRow.ts b/web/admin/src/lib/orgs/orgListRow.ts index ab72fe0ec8..d7d7bb5c97 100644 --- a/web/admin/src/lib/orgs/orgListRow.ts +++ b/web/admin/src/lib/orgs/orgListRow.ts @@ -9,7 +9,7 @@ import { import { CONFIG_FILE_PATH, CONFIG_REPO_NAME } from "../layers/constants"; import { createLayerGithub } from "../layers/githubClient"; import { - agentsFromConfig, + rolesFromConfig, enabledReposFromConfig, OrgConfigYamlLimitError, parseOrgConfigYaml, @@ -78,7 +78,7 @@ export async function analyzeOrgForOrgList( } else { exists = await gh.getRepoExists(org, CONFIG_REPO_NAME); } - let agents: { name: string }[] = []; + let agents: { role: string }[] = []; let enabledRepos: string[] = []; if (exists) { const raw = await gh.getRepoFileUtf8(org, CONFIG_REPO_NAME, CONFIG_FILE_PATH); @@ -86,7 +86,7 @@ export async function analyzeOrgForOrgList( try { const cfg = parseOrgConfigYaml(raw); if (validateOrgConfig(cfg) === null) { - agents = agentsFromConfig(cfg); + agents = rolesFromConfig(cfg); enabledRepos = enabledReposFromConfig(cfg); } } catch (e) {