{
  "version": 3,
  "sources": ["../../src/app/ai/agents/evals2/scenarios/dynamicFilters/dynamicFilters.eval.ts"],
  "sourcesContent": ["import { assert } from \"@framerjs/shared\"\nimport type { VekterEngine } from \"document/VekterEngine.ts\"\nimport type {\n\tCanvasNode,\n\tCodeComponentNode,\n\tFrameNode,\n\tLoadedSmartComponentNode,\n\tLoadedWebPageNode,\n} from \"document/models/CanvasTree/index.ts\"\nimport type { NodeID } from \"document/models/CanvasTree/nodes/NodeID.ts\"\nimport { isCodeComponentNode, isFrameNode, isWebPageNode } from \"document/models/CanvasTree/nodes/utils/nodeCheck.ts\"\nimport type { ValueTransform } from \"document/models/CanvasTree/traits/ValueTransform.ts\"\nimport { isVariableReference } from \"document/models/CanvasTree/traits/VariableReference.ts\"\nimport {\n\ttype WithCollectionOptions,\n\twithCollectionOptions,\n} from \"document/models/CanvasTree/traits/WithCollectionOptions.ts\"\nimport {\n\tisCollectionReferenceVariableDefinition,\n\tisVariableDefinition,\n} from \"document/models/CanvasTree/traits/WithVariables.ts\"\nimport { ControlType } from \"library/render/types/PropertyControls.ts\"\nimport { agentEvalAsset } from \"../../harness/asset.ts\"\nimport { createEvalExportZipFixture } from \"../../harness/fixture.ts\"\nimport { findCollectionByName } from \"../cms/cmsEvalUtils.ts\"\nimport { loadedGuide } from \"../computedValues/helpers.ts\"\nimport {\n\texpectVariantComputedValueOnVariable,\n\tfindOnlySmartComponent,\n\tfindSetVariableActionForVariable,\n\tgetEffectiveBooleanMapping,\n} from \"./helpers.ts\"\n\nconst requestId = \"cjNCQDiQD\"\nconst blogPageScopeId: NodeID = \"OZOMcvwhG\"\nconst articlesListId: NodeID = \"T2vwJ7OLA\"\nconst articlesCategoriesFieldId = \"d2CPaQ98L\"\nconst categoriesCollectionName = \"Categories\"\n\nfunction getBlogPage(engine: VekterEngine): LoadedWebPageNode {\n\tconst page = engine.tree.getNodeWithTrait(blogPageScopeId, isWebPageNode)\n\tassert(page, `Expected '${blogPageScopeId}' to be the /blog web page.`)\n\tassert(page.isLoaded(), `Expected '${blogPageScopeId}' to be loaded.`)\n\treturn page\n}\n\nfunction getSelectedCategoryVariable(engine: VekterEngine) {\n\tconst variables = getBlogPage(engine).variables.filter(isVariableDefinition)\n\treturn variables.find(isCollectionReferenceVariableDefinition)\n}\n\nfunction isInsideArticlesList(engine: VekterEngine, node: CanvasNode): boolean {\n\treturn engine.tree.isAncestorOfNode(node, articlesListId)\n}\n\nfunction findComponentInstancesOutsideArticlesList(\n\tengine: VekterEngine,\n\tcomponent: LoadedSmartComponentNode,\n): CodeComponentNode[] {\n\tconst { instanceIdentifier } = component\n\tconst blogPage = getBlogPage(engine)\n\n\treturn Array.from(blogPage.walk()).filter(\n\t\t(node): node is CodeComponentNode =>\n\t\t\tisCodeComponentNode(node) &&\n\t\t\tnode.codeComponentIdentifier === instanceIdentifier &&\n\t\t\t!isInsideArticlesList(engine, node),\n\t)\n}\n\nfunction findCategoriesRepeatersOutsideArticlesList(\n\tengine: VekterEngine,\n\tcategoriesCollectionId: NodeID,\n): (FrameNode & WithCollectionOptions)[] {\n\tconst blogPage = getBlogPage(engine)\n\n\treturn Array.from(blogPage.walk()).filter((node): node is FrameNode & WithCollectionOptions => {\n\t\tif (!isFrameNode(node)) return false\n\t\tif (!withCollectionOptions(node)) return false\n\t\tif (isInsideArticlesList(engine, node)) return false\n\t\treturn node.dataIdentifier?.includes(`/${categoriesCollectionId}:`) ?? false\n\t})\n}\n\ninterface DynamicFiltersLayoutCorrect {\n\tcorrect: true\n\tcategoriesRepeater: FrameNode & WithCollectionOptions\n\tclearFilterComponentInstance: CodeComponentNode\n\tselectCategoryComponentInstance: CodeComponentNode\n}\n\ninterface DynamicFiltersLayoutIncorrect {\n\tcorrect: false\n\treason: string\n}\n\ntype DynamicFiltersLayout = DynamicFiltersLayoutCorrect | DynamicFiltersLayoutIncorrect\n\nfunction findDynamicFiltersLayout(\n\tengine: VekterEngine,\n\ttabComponent: LoadedSmartComponentNode | undefined,\n\tcategoriesCollectionId: NodeID,\n): DynamicFiltersLayout {\n\tif (!tabComponent) {\n\t\treturn {\n\t\t\tcorrect: false,\n\t\t\treason: `Expected agent to create a Tab component`,\n\t\t}\n\t}\n\n\tconst repeaters = findCategoriesRepeatersOutsideArticlesList(engine, categoriesCollectionId)\n\tconst onlyRepeater = repeaters.length === 1 ? repeaters[0] : undefined\n\n\tif (!onlyRepeater) {\n\t\treturn {\n\t\t\tcorrect: false,\n\t\t\treason: `Expected agent to create exactly one categories repeater, but instead it made ${repeaters.length}`,\n\t\t}\n\t}\n\n\tconst instances = findComponentInstancesOutsideArticlesList(engine, tabComponent)\n\n\tconst selectCategoryComponentInstances = instances.filter(instance => instance.parentid === onlyRepeater.id)\n\tconst clearFilterComponentInstances = instances.filter(instance => instance.parentid === onlyRepeater.parentid)\n\n\tconst onlySelectCategoryComponentInstance =\n\t\tselectCategoryComponentInstances.length === 1 ? selectCategoryComponentInstances[0] : undefined\n\tconst onlyClearFilterComponentInstance =\n\t\tclearFilterComponentInstances.length === 1 ? clearFilterComponentInstances[0] : undefined\n\n\tif (!onlySelectCategoryComponentInstance) {\n\t\treturn {\n\t\t\tcorrect: false,\n\t\t\treason: `Expected agent to create exactly one component instance for \"Select Category\" buttons (the ones inside the category repeater), but instead it made ${selectCategoryComponentInstances.length}`,\n\t\t}\n\t}\n\tif (!onlyClearFilterComponentInstance) {\n\t\treturn {\n\t\t\tcorrect: false,\n\t\t\treason: `Expected agent to create exactly one component instance for the \"Clear Filter\" button (the one sibling to the category repeater), but instead it made ${clearFilterComponentInstances.length}`,\n\t\t}\n\t}\n\n\treturn {\n\t\tcorrect: true,\n\t\tcategoriesRepeater: onlyRepeater,\n\t\tclearFilterComponentInstance: onlyClearFilterComponentInstance,\n\t\tselectCategoryComponentInstance: onlySelectCategoryComponentInstance,\n\t}\n}\n\nfunction getEqualsTransformProviderId(transform: ValueTransform): NodeID | undefined {\n\tif (transform.name !== \"equals\") return undefined\n\tconst value = transform.value\n\tif (!isVariableReference(value)) return undefined\n\treturn value.providerId\n}\n\nevaluation(\n\t\"Dynamic Filters: Filter Articles List By Category\",\n\tcreateEvalExportZipFixture(\"dynamic-filters-category-buttons\", agentEvalAsset(\"./dynamicFilters.fixture.zip\"), {\n\t\truntimeTarget: \"browser\",\n\t}),\n\t{\n\t\tid: \"dynamic-filters-category-buttons\",\n\t\trequestId,\n\t\tstepIndex: 0,\n\t\tmaxSteps: 20,\n\t\tsendTimeoutMs: 300_000,\n\t},\n\t({ engine, report, tools }) => {\n\t\ttools.reportReplayChecks(report, { requestId, stepIndex: 0 })\n\n\t\treport.correctness.scored(\"loaded the CMS Collection Lists implementation guide\", () => {\n\t\t\texpect(loadedGuide(tools, \"CMS Collection Lists\")).toBe(true)\n\t\t})\n\n\t\tconst categoriesCollection = findCollectionByName(engine, categoriesCollectionName)\n\t\tassert(categoriesCollection, `Expected the '${categoriesCollectionName}' collection to exist.`)\n\t\tconst categoriesCollectionId = categoriesCollection.id\n\n\t\treport.correctness.required(\n\t\t\t\"creates exactly one Selected Category collection-reference variable on the /blog page\",\n\t\t\t() => {\n\t\t\t\tconst variables = getBlogPage(engine).variables.filter(isVariableDefinition)\n\t\t\t\tconst collectionRefVariables = variables.filter(isCollectionReferenceVariableDefinition)\n\t\t\t\texpect(collectionRefVariables).toHaveLength(1)\n\n\t\t\t\tconst variable = collectionRefVariables.at(0)\n\t\t\t\tassert(variable, \"Expected a collection-reference variable.\")\n\t\t\t\texpect(variable.type).toBe(ControlType.CollectionReference)\n\t\t\t\texpect(variable.dataIdentifier).toContain(`/${categoriesCollectionId}:`)\n\t\t\t\texpect(variable.optional).toBe(true)\n\t\t\t},\n\t\t)\n\n\t\treport.correctness.scored(\"filters the Articles collection list by the Categories field\", () => {\n\t\t\tconst list = engine.tree.getNodeWithTrait(articlesListId, withCollectionOptions)\n\t\t\tassert(list, `Expected the Articles list '${articlesListId}' to exist.`)\n\n\t\t\tconst filters = list.collectionFilters?.filters ?? []\n\t\t\texpect(filters).toHaveLength(1)\n\n\t\t\tconst filter = filters.at(0)\n\t\t\tassert(filter, \"Expected a single filter on the Articles list.\")\n\t\t\texpect(filter.itemKey).toBe(articlesCategoriesFieldId)\n\t\t\texpect(filter.transforms).toHaveLength(1)\n\n\t\t\tconst transform = filter.transforms.at(0)\n\t\t\tassert(transform?.name === \"contains\", `Expected a 'contains' transform, got '${transform?.name}'.`)\n\t\t\tconst variable = getSelectedCategoryVariable(engine)\n\t\t\tassert(variable, \"Expected the Selected Category variable to exist.\")\n\t\t\tassert(isVariableReference(transform.value), \"Expected the 'contains' transform value to reference a variable.\")\n\t\t\texpect(transform.value.id).toBe(variable.id)\n\t\t\texpect(transform.value.providerId).toBe(blogPageScopeId)\n\t\t})\n\n\t\tconst tabComponent = findOnlySmartComponent(engine)\n\n\t\treport.correctness.required(\"creates a FilterTab smart component with at least two variants\", () => {\n\t\t\tassert(tabComponent, \"Expected agent to create a Tab component\")\n\t\t\tconst variantCount = 1 + tabComponent.getReplicaVariants().length\n\t\t\texpect(variantCount).toBeGreaterThanOrEqual(2)\n\t\t})\n\n\t\treport.correctness.scored(\"FilterTab has exactly two variants with distinct fill colors\", () => {\n\t\t\tassert(tabComponent, \"Expected agent to create a Tab component\")\n\t\t\tconst replicas = tabComponent.getReplicaVariants()\n\t\t\texpect(replicas).toHaveLength(1)\n\t\t\tconst [replica] = replicas\n\t\t\tassert(replica, \"Expected exactly one replica variant.\")\n\t\t\texpect(tabComponent.getPrimaryVariant().fillColor).not.toEqual(replica.fillColor)\n\t\t})\n\n\t\tconst layout = findDynamicFiltersLayout(engine, tabComponent, categoriesCollectionId)\n\n\t\treport.correctness.required(\"creates a correct layout\", () => {\n\t\t\tif (!layout.correct) {\n\t\t\t\tthrow new Error(layout.reason)\n\t\t\t}\n\t\t})\n\n\t\tfunction requireSetup() {\n\t\t\tassert(tabComponent, \"Expected agent to create a Tab component\")\n\t\t\tassert(layout.correct, \"Expected the layout to be correct\")\n\n\t\t\tconst variable = getSelectedCategoryVariable(engine)\n\t\t\tassert(variable, \"Expected the Selected Category variable to exist.\")\n\n\t\t\treturn { tabComponent, layout, variable }\n\t\t}\n\n\t\treport.correctness.scored(\"wires the 'All' button to clear the Selected Category variable\", () => {\n\t\t\tconst setup = requireSetup()\n\t\t\tconst action = findSetVariableActionForVariable(setup.layout.clearFilterComponentInstance, setup.variable.id)\n\t\t\tassert(action, \"Expected the 'All' button to have a useSetVariableValue action for the Selected Category.\")\n\n\t\t\tconst valueControl = action.controls.value\n\t\t\texpect(valueControl.type).toBe(ControlType.CollectionReference)\n\t\t\texpect(valueControl.value).toBeUndefined()\n\t\t})\n\n\t\treport.correctness.scored(\"binds the 'All' button variant to whether a category is selected\", () => {\n\t\t\tconst setup = requireSetup()\n\t\t\tconst computed = expectVariantComputedValueOnVariable(\n\t\t\t\tsetup.layout.clearFilterComponentInstance,\n\t\t\t\tsetup.variable,\n\t\t\t\tblogPageScopeId,\n\t\t\t)\n\t\t\texpect(computed.transforms.at(0)?.name).toBe(\"isSet\")\n\t\t})\n\n\t\treport.correctness.scored(\"wires the per-category button to set the Selected Category to its item id\", () => {\n\t\t\tconst setup = requireSetup()\n\t\t\tconst action = findSetVariableActionForVariable(setup.layout.selectCategoryComponentInstance, setup.variable.id)\n\t\t\tassert(action, \"Expected the per-category button to set the Selected Category variable.\")\n\n\t\t\tconst valueControl = action.controls.value\n\t\t\texpect(valueControl.type).toBe(ControlType.CollectionReference)\n\t\t\tassert(\n\t\t\t\tisVariableReference(valueControl.value),\n\t\t\t\t\"Expected the per-category 'value' control to reference the repeated item.\",\n\t\t\t)\n\t\t\texpect(valueControl.value.id).toBe(\"id\")\n\t\t\texpect(valueControl.value.providerId).toBe(setup.layout.categoriesRepeater.id)\n\t\t})\n\n\t\treport.correctness.scored(\"binds the per-category button variant to whether it matches the selection\", () => {\n\t\t\tconst setup = requireSetup()\n\t\t\tconst computed = expectVariantComputedValueOnVariable(\n\t\t\t\tsetup.layout.selectCategoryComponentInstance,\n\t\t\t\tsetup.variable,\n\t\t\t\tblogPageScopeId,\n\t\t\t)\n\t\t\tconst equals = computed.transforms.at(0)\n\t\t\tassert(equals?.name === \"equals\", `Expected an 'equals' transform, got '${equals?.name}'.`)\n\t\t\texpect(getEqualsTransformProviderId(equals)).toBe(setup.layout.categoriesRepeater.id)\n\t\t})\n\n\t\treport.correctness.scored(\n\t\t\t\"uses a consistent active and inactive variant across the All and per-category buttons\",\n\t\t\t() => {\n\t\t\t\tconst setup = requireSetup()\n\t\t\t\tconst allMapping = getEffectiveBooleanMapping(\n\t\t\t\t\texpectVariantComputedValueOnVariable(\n\t\t\t\t\t\tsetup.layout.clearFilterComponentInstance,\n\t\t\t\t\t\tsetup.variable,\n\t\t\t\t\t\tblogPageScopeId,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\tconst categoryMapping = getEffectiveBooleanMapping(\n\t\t\t\t\texpectVariantComputedValueOnVariable(\n\t\t\t\t\t\tsetup.layout.selectCategoryComponentInstance,\n\t\t\t\t\t\tsetup.variable,\n\t\t\t\t\t\tblogPageScopeId,\n\t\t\t\t\t),\n\t\t\t\t)\n\n\t\t\t\t// It's possible that the agent could bind what looks like an \"Active\" variant to inactive buttons and\n\t\t\t\t// vice versa. We have no way to tell which variant is which without some complex color based heuristics.\n\t\t\t\t// This just checks that when one button is using a variant, all the others are using the other one.\n\t\t\t\tconst activeVariant = allMapping.falsy\n\t\t\t\tconst inactiveVariant = allMapping.truthy\n\t\t\t\texpect(activeVariant).not.toBe(inactiveVariant)\n\t\t\t\texpect(categoryMapping.truthy).toBe(activeVariant)\n\t\t\t\texpect(categoryMapping.falsy).toBe(inactiveVariant)\n\t\t\t},\n\t\t)\n\t},\n)\n"],
  "mappings": "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",
  "names": []
}
