agnets done
This commit is contained in:
@@ -5212,6 +5212,53 @@ record('...and leaves the date-anchored shift records to the Go seeder',
|
|||||||
!('ShiftRecord' in JSON.parse(builtFixture).entities) && seedModule.seedData.ShiftRecord.length > 0,
|
!('ShiftRecord' in JSON.parse(builtFixture).entities) && seedModule.seedData.ShiftRecord.length > 0,
|
||||||
`${seedModule.seedData.ShiftRecord.length} shift records held in seed.js only`);
|
`${seedModule.seedData.ShiftRecord.length} shift records held in seed.js only`);
|
||||||
|
|
||||||
|
/* ── The registry does not report a shipped agent as an override of itself ── */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authored agents now come from `/api/v1/agent-definitions`, and that registry
|
||||||
|
* holds both kinds: the shipped set, published from the same files this build
|
||||||
|
* ships, and anything a person authored. Passing the first kind through as an
|
||||||
|
* authored source made every shipped agent report that it "replaces the
|
||||||
|
* built-in agent of the same id" — nine warnings on the one screen that exists
|
||||||
|
* to say what is wrong, about a deployment that was working correctly.
|
||||||
|
*
|
||||||
|
* The rows below are the shape the live registry actually returns.
|
||||||
|
*/
|
||||||
|
const storeModule = await server.ssrLoadModule('/src/lib/agents/agentStore.js');
|
||||||
|
const agentsModule = await server.ssrLoadModule('/src/lib/agents/registry.js');
|
||||||
|
const shippedIds = new Set(agentsModule.AGENTS.map((a) => a.id));
|
||||||
|
const registryRows = [
|
||||||
|
...agentsModule.AGENTS.map((a) => ({
|
||||||
|
definition_id: a.id, visibility: 'organization', markdown: a.markdown,
|
||||||
|
})),
|
||||||
|
{
|
||||||
|
definition_id: 'authored-example', visibility: 'personal',
|
||||||
|
markdown: '---\nid: authored-example\nname: Authored Example\nstatus: published\n'
|
||||||
|
+ 'version: 1\npages:\n - control-center\n---\n\n# Authored Example\n',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const built = agentsModule.readAgentRegistry(
|
||||||
|
storeModule.sourcesFrom(registryRows, shippedIds), { customSkills: [] });
|
||||||
|
const falseShadows = built.diagnostics.filter((d) => d.kind === 'shadowed');
|
||||||
|
record('a shipped agent published to the registry is not reported as overriding itself',
|
||||||
|
falseShadows.length === 0,
|
||||||
|
falseShadows.map((d) => d.agentId).join(', ') || 'no false overrides');
|
||||||
|
record('...and an authored agent still appears beside the shipped ones',
|
||||||
|
built.agents.some((a) => a.id === 'authored-example')
|
||||||
|
&& built.agents.length === agentsModule.AGENTS.length + 1,
|
||||||
|
`${built.agents.length} agents from ${registryRows.length} rows`);
|
||||||
|
|
||||||
|
/* A genuine personal override of a shipped id is still reported — the
|
||||||
|
diagnostic is useful, it was only being raised for the wrong rows. */
|
||||||
|
const overridden = agentsModule.readAgentRegistry(
|
||||||
|
storeModule.sourcesFrom([{
|
||||||
|
definition_id: agentsModule.AGENTS[0].id, visibility: 'personal',
|
||||||
|
markdown: agentsModule.AGENTS[0].markdown,
|
||||||
|
}], shippedIds), { customSkills: [] });
|
||||||
|
record('a personal override of a shipped agent is still reported as one',
|
||||||
|
overridden.diagnostics.some((d) => d.kind === 'shadowed'),
|
||||||
|
overridden.diagnostics.map((d) => d.kind).join(', ') || 'none');
|
||||||
|
|
||||||
/* The seed must exercise every status, or none of the above can catch anything. */
|
/* The seed must exercise every status, or none of the above can catch anything. */
|
||||||
const seededStatuses = new Set(seedModule.seedData.JobApplication.map((a) => a.status));
|
const seededStatuses = new Set(seedModule.seedData.JobApplication.map((a) => a.status));
|
||||||
const neverSeeded = records.APPLICATION_STATUSES.filter((st) => !seededStatuses.has(st));
|
const neverSeeded = records.APPLICATION_STATUSES.filter((st) => !seededStatuses.has(st));
|
||||||
|
|||||||
@@ -39,9 +39,20 @@ export function useAgentDefinitions() {
|
|||||||
* `{ path, raw }` is the shape `readAgentRegistry` already takes, so the reader
|
* `{ path, raw }` is the shape `readAgentRegistry` already takes, so the reader
|
||||||
* did not have to learn where definitions come from — only the store changed.
|
* did not have to learn where definitions come from — only the store changed.
|
||||||
*/
|
*/
|
||||||
export function sourcesFrom(rows) {
|
export function sourcesFrom(rows, shippedIds = new Set()) {
|
||||||
return (rows || [])
|
return (rows || [])
|
||||||
.filter((r) => r && typeof r.markdown === 'string' && r.markdown.trim())
|
.filter((r) => r && typeof r.markdown === 'string' && r.markdown.trim())
|
||||||
|
/* An organization row whose id is a shipped agent IS that shipped agent:
|
||||||
|
`importagents` publishes the same files this build ships, so the registry
|
||||||
|
and the bundle hold one definition between them, not two.
|
||||||
|
|
||||||
|
Passing it through as an authored source made every shipped agent report
|
||||||
|
that it "replaces the built-in agent of the same id" — nine warnings, on
|
||||||
|
the one screen that exists to say what is wrong, describing a deployment
|
||||||
|
that was working correctly. A personal row is a genuine override and is
|
||||||
|
still reported as one; an organization row with an id nothing ships is a
|
||||||
|
shared agent somebody authored, and belongs in the list. */
|
||||||
|
.filter((r) => !(r.visibility === 'organization' && shippedIds.has(r.definition_id)))
|
||||||
.map((r) => ({ path: `authored/${r.definition_id || r.id}.md`, raw: r.markdown }));
|
.map((r) => ({ path: `authored/${r.definition_id || r.id}.md`, raw: r.markdown }));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,8 +121,8 @@ export function useRowFor(rows) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Memoised sources, so the registry is not rebuilt on every render. */
|
/** Memoised sources, so the registry is not rebuilt on every render. */
|
||||||
export function useAuthoredSources(rows) {
|
export function useAuthoredSources(rows, shippedIds) {
|
||||||
return useMemo(() => sourcesFrom(rows), [rows]);
|
return useMemo(() => sourcesFrom(rows, shippedIds), [rows, shippedIds]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -39,7 +39,10 @@ export function useAgents() {
|
|||||||
const deleteDefinition = useDeleteAgentDefinition();
|
const deleteDefinition = useDeleteAgentDefinition();
|
||||||
|
|
||||||
const rows = useMemo(() => definitions.data || [], [definitions.data]);
|
const rows = useMemo(() => definitions.data || [], [definitions.data]);
|
||||||
const stored = useAuthoredSources(rows);
|
/* The ids this build ships. An organization row carrying one of them is that
|
||||||
|
same definition as published by importagents, not an override of it. */
|
||||||
|
const shippedIds = useMemo(() => new Set(AGENTS.map((a) => a.id)), []);
|
||||||
|
const stored = useAuthoredSources(rows, shippedIds);
|
||||||
const customSkills = useMemo(() => preferences.customSkills || [], [preferences.customSkills]);
|
const customSkills = useMemo(() => preferences.customSkills || [], [preferences.customSkills]);
|
||||||
|
|
||||||
/* Anything an author wrote before the store moved. Without this it would stop
|
/* Anything an author wrote before the store moved. Without this it would stop
|
||||||
|
|||||||
Reference in New Issue
Block a user