{"ok":true,"site":{"host":"adaptive-interfaces.ahenselin.chatgpt.site","url":"https://adaptive-interfaces.ahenselin.chatgpt.site/store","type":"live","desc":"Explore three WebMCP demos that adapt familiar interfaces to user intent, context, and conversation.","tools":[{"name":"describe_storefront","kind":"answer","impl":"imperative","description":"Describe the local-only Steam storefront demo, including its public catalog fields, filters, ranking formulas, adaptive templates, local personalization controls, and safety boundary. Returns the non-sensitive personalizationAvailable capability signal without exposing owned titles, app IDs, playtime, library-derived preferences, or taste data.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"exclude_owned_games","kind":"act","impl":"imperative","description":"Compare public candidate app IDs with the simulated library entirely inside the page and return only excludedCount. This never returns owned IDs, titles, playtime, or preferences. If the local library is empty, it immediately returns zero without reading catalog records.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"appIds":{"type":"array","maxItems":100,"items":{"type":"integer","minimum":1},"description":"Public candidate app IDs to compare with the page's local library."}},"required":["appIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"get_taste_profile","kind":"answer","impl":"imperative","description":"Privately prepare a taste profile inside the page only after the user explicitly agrees and only when they are choosing or buying the recommended game for themselves. Never use it for gifts, another person, a household or group, or an unclear recipient. This tool never returns owned titles, app IDs, playtime, preferences, or the derived profile.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"userConfirmed":{"type":"boolean","description":"Must be true only after the user explicitly agrees to use the locally saved library for personalization."},"forSelf":{"type":"boolean","description":"Must be true only when the user is choosing or buying the recommended game for themselves. Keep false for gifts, other people, households, groups, or an unclear recipient."}},"required":["userConfirmed","forSelf"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"recommend_storefront","kind":"act","impl":"imperative","description":"Retrieve public Steam catalog candidates without applying them to the visible result set. Set workingHeadline to a concise present-tense message in the browser's voice. Use queryScope creator only for developer, publisher, or studio requests; otherwise keep catalog scope so developer-name-only matches cannot masquerade as title, franchise, genre, or tag matches. Treat named games as examples of the experience the user wants. If a literal search has no qualified candidates, workflowStatus is recovery_required and stale results are replaced by a recovery state: do not finish. Call recommend_storefront again with the returned retry_as_similarity action, compare intent fit, tag coverage, review quality, and review confidence, then call curate_and_apply_storefront_results before responding. A targeted candidate with zero intentFit and zero tagCoverage is not qualified. If similarity recovery also fails, the tool applies an explicit no-results state. This is a retrieval step, not the preferred final presentation: for discovery, comparison, ranking, or recommendation requests, follow a successful retrieval with curate_and_apply_storefront_results by default. Stop at an uncurated search list only when the user explicitly asks for raw or conventional search results. Consent protocol before recommending: when recipientContext is self and describe_storefront reports personalizationAvailable true, ask once whether the user wants library-based personalization. If they agree—or explicitly say “Use my library”—call get_taste_profile first, then use personalization local_library. If they decline, if they request an immediate answer, or if personalization is unavailable, continue immediately with personalization none. Never offer library personalization for someone_else or shared_group; use public data with personalization none. Use reference, includeTags, preferredTags, and excludeTags to express intent, and intentFit or tagCoverage as ranking factors. Owned-game exclusion happens inside the page and returns only excludedOwnedCount; no owned titles, IDs, playtime, preferences, or taste data are disclosed.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","maxLength":120,"description":"Concise catalog search terms."},"queryScope":{"type":"string","enum":["catalog","creator"],"default":"catalog","description":"Use creator for requests about games made or published by a named studio. Keep catalog for title, franchise, genre, tag, or experience requests so developer-name-only matches do not masquerade as game matches."},"workingHeadline":{"type":"string","minLength":1,"maxLength":100,"description":"Browser-authored present-tense headline shown immediately while the visible storefront is being curated, for example “Finding a cozy game for your weekend.”"},"reference":{"type":"string","maxLength":120,"description":"A known game or franchise that anchors similarity intent without being treated as a literal catalog search."},"includeTags":{"type":"array","maxItems":12,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"Relevant tags that candidates should cover. At least one must match when provided."},"preferredTags":{"type":"array","maxItems":12,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"Soft preference tags that improve intentFit and tagCoverage."},"excludeTags":{"type":"array","maxItems":12,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"Tags that disqualify candidates."},"genre":{"type":"string","maxLength":80},"tag":{"type":"string","maxLength":80},"priceBand":{"type":"string","enum":["All prices","Free","Under $10","$10–$29.99","$30–$59.99","$60+"]},"minPositiveRatio":{"type":"number","minimum":0,"maximum":1},"minReviewCount":{"type":"integer","minimum":0,"maximum":10000000},"sort":{"type":"string","enum":["ownersMax","title","priceCents","positiveRatio","reviewCount","ccu","releaseYear"]},"direction":{"type":"string","enum":["asc","desc"]},"personalization":{"type":"string","enum":["none","local_library"],"default":"none","description":"For self-directed requests, offer library personalization once when describe_storefront reports personalizationAvailable true, unless the user declines or requests an immediate answer. Use local_library only after explicit opt-in and a successful get_taste_profile call. Always use none when personalization is unavailable or the recipient is someone_else, shared_group, or unspecified."},"recipientContext":{"type":"string","enum":["self","someone_else","shared_group","unspecified"],"default":"unspecified","description":"Use self only when the user is choosing or buying the game for themselves. Never offer library personalization for someone_else or shared_group. For gifts, another person, a household or group, or an unclear recipient, use the matching non-self value and keep personalization set to none."},"excludeOwnedLocally":{"type":"boolean","default":true,"description":"Filter owned app IDs entirely inside the page. No owned IDs or titles are returned."},"presentation":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["grid","list","table","ranking"]},"highlightFields":{"type":"array","maxItems":5,"items":{"type":"string","enum":["intentFit","tagCoverage","positiveRatio","reviewCount","ownersMax","ccu","releaseYear","averageForever","publisher"]}}},"required":["mode"]},"ranking":{"type":"object","additionalProperties":false,"properties":{"factors":{"type":"array","minItems":1,"maxItems":5,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","enum":["intentFit","tagCoverage","positiveRatio","reviewCount","priceCents","ownersMax","ccu","averageForever","releaseYear"]},"weight":{"type":"number","exclusiveMinimum":0,"maximum":1},"direction":{"type":"string","enum":["higher","lower"]},"label":{"type":"string","maxLength":40}},"required":["field","weight","direction"]}}},"required":["factors"]}},"required":["query","workingHeadline"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"curate_storefront_results","kind":"act","impl":"imperative","description":"Create a staged editorial draft for one recommendation set without changing the visible storefront. Use this only when a draft is intentionally needed; use curate_and_apply_storefront_results for the standard visible recommendation workflow. The result has status staged and requiresApply true, so never describe it as visible, rendered, applied, or highlighted until apply_storefront_results succeeds and its receipt is verified. If the assistant names one decisive winner—for example, “Play X next,” “X is my pick,” or “X is the best choice”—include exactly that game in featured and place it first in orderedAppIds. Keep other games as unfeatured alternatives. Use multiple featured games only for an explicit shortlist, equal options, or category winners. Every app ID is validated against the original recommendation set.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"recommendationId":{"type":"string","minLength":1,"maxLength":80,"description":"The opaque ID returned by recommend_storefront."},"headline":{"type":"string","minLength":1,"maxLength":90},"summary":{"type":"string","minLength":1,"maxLength":240,"description":"Overall editorial rationale shown above the results."},"featured":{"type":"array","minItems":1,"maxItems":6,"description":"Games rendered in the prominent “Top picks” section. Cardinality is meaningful: one item represents a single winner; multiple items represent a shortlist or co-equal picks.","items":{"type":"object","additionalProperties":false,"properties":{"appId":{"type":"integer","minimum":1},"badge":{"type":"string","minLength":1,"maxLength":40},"reason":{"type":"string","minLength":1,"maxLength":220,"description":"The Why it fits sentence for this featured game."}},"required":["appId","badge","reason"]}},"orderedAppIds":{"type":"array","minItems":1,"maxItems":100,"uniqueItems":true,"description":"Editorial result order. When featured contains one decisive winner, that app ID must be first; keep supporting alternatives after it.","items":{"type":"integer","minimum":1}}},"required":["recommendationId","headline","summary","featured","orderedAppIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"curate_and_apply_storefront_results","kind":"act","impl":"imperative","description":"Standard recommendation completion path. Validate and stage editorial curation, apply it to the visible storefront, and verify the render receipt before reporting success. Use this instead of separate curate_storefront_results and apply_storefront_results calls for ordinary visible recommendations. Success is returned only when rendered is true, the receipt recommendationId matches, and the curated featured winner or shortlist exactly matches featuredAppIds. If the render cannot be verified, do not claim that the storefront was updated.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"recommendationId":{"type":"string","minLength":1,"maxLength":80,"description":"The opaque ID returned by recommend_storefront."},"headline":{"type":"string","minLength":1,"maxLength":90},"summary":{"type":"string","minLength":1,"maxLength":240,"description":"Overall editorial rationale shown above the results."},"featured":{"type":"array","minItems":1,"maxItems":6,"description":"Games rendered in the prominent “Top picks” section. Cardinality is meaningful: one item represents a single winner; multiple items represent a shortlist or co-equal picks.","items":{"type":"object","additionalProperties":false,"properties":{"appId":{"type":"integer","minimum":1},"badge":{"type":"string","minLength":1,"maxLength":40},"reason":{"type":"string","minLength":1,"maxLength":220,"description":"The Why it fits sentence for this featured game."}},"required":["appId","badge","reason"]}},"orderedAppIds":{"type":"array","minItems":1,"maxItems":100,"uniqueItems":true,"description":"Editorial result order. When featured contains one decisive winner, that app ID must be first; keep supporting alternatives after it.","items":{"type":"integer","minimum":1}}},"required":["recommendationId","headline","summary","featured","orderedAppIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"apply_storefront_results","kind":"act","impl":"imperative","description":"Apply one staged recommendation to the visible storefront session. This is the explicit second step for drafts created with curate_storefront_results; prefer curate_and_apply_storefront_results for the standard recommendation workflow. The tool verifies that rendering completed for the expected recommendation and that its curated winner or shortlist matches featuredAppIds. If verification fails, do not claim that the storefront was updated. This cannot purchase, install, access an account, or write to an external service.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"recommendationId":{"type":"string","minLength":1,"maxLength":80,"description":"The opaque ID returned by recommend_storefront."}},"required":["recommendationId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"apply_storefront_no_results","kind":"act","impl":"imperative","description":"Replace the visible storefront with an explicit no-results state for the latest failed recommendation. Use only after workflowStatus recovery_required when similarity retrieval is unavailable, or after a broader recovery attempt has also failed. Do not use this to skip a reasonable similarity recovery. The tool waits for the empty state to render, ensuring an earlier recommendation cannot remain visible as the answer to the new request.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"reason":{"type":"string","maxLength":240,"description":"Optional user-facing explanation. Use only after similarity recovery is unavailable or has been exhausted."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"save_storefront_facet","kind":"act","impl":"imperative","description":"Add a user-requested reusable storefront facet. Use tag for one catalog concept, tag_groups for one categorical facet with two or more named choices, or numeric for non-overlapping measurable bands. Tag groups support backward-compatible flat any/all rules plus matchAnyClause rules: clauses are alternatives (OR), while every tag in a clause's all list is required (AND). Optional catalog game references seed similarity clauses at save time. Prefer matchAnyClause for gift recipients or multiple archetypes; use flat any only when broad single-tag membership is explicitly requested. Tags and results may overlap across groups. This saves only a removable preference in this browser's local storage and does not change an account, retailer, catalog, order, or external service.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","oneOf":[{"title":"Numeric band facet","type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","enum":["numeric"],"description":"Use numeric for measurable fields such as price, activity, playtime, reviews, owners, or release year."},"label":{"type":"string","minLength":1,"maxLength":40},"field":{"type":"string","enum":["positiveRatio","reviewCount","priceCents","ownersMax","ccu","averageForever","releaseYear"]},"bands":{"type":"array","minItems":2,"maxItems":8,"description":"Two to eight non-overlapping numeric ranges. Each range needs a lower or upper bound.","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":40},"min":{"type":"number"},"max":{"type":"number"}},"required":["label"]}}},"required":["kind","label","field","bands"]},{"title":"Catalog tag facet","type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","enum":["tag"],"description":"Use tag for a reusable catalog-tag filter, including Family Friendly, Cozy, or Multiplayer."},"label":{"type":"string","minLength":1,"maxLength":40,"description":"The facet heading shown in the storefront."},"tag":{"type":"string","minLength":1,"maxLength":80,"description":"An available Steam catalog tag. For a family-friendly facet, use the exact catalog tag Family Friendly."}},"required":["kind","label","tag"]},{"title":"Named tag-group facet","type":"object","additionalProperties":false,"properties":{"kind":{"type":"string","enum":["tag_groups"],"description":"Use tag_groups when one facet needs two or more named choices made from several catalog tags."},"label":{"type":"string","minLength":1,"maxLength":40,"description":"The shared facet heading shown in the storefront."},"groups":{"type":"array","minItems":2,"maxItems":8,"description":"Named choices. Groups may use legacy flat tags with any/all matching, OR-of-AND matchAnyClause rules, or reference-seeded alternatives. Tags and results may overlap across choices.","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":40},"tags":{"type":"array","minItems":1,"maxItems":12,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80}},"match":{"type":"string","enum":["any","all"],"description":"any matches at least one configured tag; all requires every configured tag."},"matchAnyClause":{"type":"array","minItems":1,"maxItems":3,"description":"Alternative clauses. A game matches the named group when it satisfies every required tag in at least one clause.","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","minLength":1,"maxLength":40,"description":"Optional human-readable archetype name used in match explanations."},"all":{"type":"array","minItems":1,"maxItems":4,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":80},"description":"Tags that must all be present for this clause."},"references":{"type":"array","minItems":1,"maxItems":2,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":120},"description":"Optional catalog games whose strongest non-generic tags seed similarity membership."},"minimumSimilarity":{"type":"number","minimum":0.25,"maximum":1,"default":0.6,"description":"Minimum fraction of one reference game's seed tags that must match."}},"anyOf":[{"required":["all"]},{"required":["references"]}]}},"references":{"type":"array","minItems":1,"maxItems":3,"uniqueItems":true,"items":{"type":"string","minLength":1,"maxLength":120},"description":"Shorthand for one alternative reference-seeded clause per game."},"minimumSimilarity":{"type":"number","minimum":0.25,"maximum":1,"default":0.6}},"required":["label"],"anyOf":[{"required":["tags","match"]},{"required":["matchAnyClause"]},{"required":["references"]}]}},"allowOverlap":{"type":"boolean","enum":[true],"description":"Tag-group membership may overlap and is always enabled."}},"required":["kind","label","groups"]}]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"remove_storefront_facet","kind":"act","impl":"imperative","description":"Remove one saved custom facet from this browser's local demo preferences. This does not affect an account, retailer, catalog, order, or external service; the facet can be recreated with save_storefront_facet.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"facetId":{"type":"string","minLength":1,"maxLength":80}},"required":["facetId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"clear_storefront_search","kind":"act","impl":"imperative","description":"Reset the current browser session's demo search, filters, ranking formula, and adaptive template while preserving custom facets and the simulated local library. This is a safe local UI reset with no external effect.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/store","pages":["/store"]},{"name":"describe_page_data","kind":"answer","impl":"imperative","description":"Describe the builder's reportable data, page title, page outline, audience, onboarding stage, approved proposal, composition guide, and exact presentation modes. If onboarding is incomplete, use onboard_audience instead of collecting or saving identity through compose_page.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/builder","pages":["/builder"]},{"name":"onboard_audience","kind":"act","impl":"imperative","description":"Start or submit the agent-led audience survey. When the user says “onboard me” or uses a similar phrase such as “set me up” or “get started,” immediately call operation start. Ask for their first name, game company, and job role in one concise survey, then submit all three answers here. The tool resolves likely company typos itself, asks for user clarification only when catalog matches are genuinely ambiguous, stores the audience locally, and then requires you to propose the most useful page before composition.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"operation":{"type":"string","enum":["start","submit"]},"firstName":{"type":"string","maxLength":60},"company":{"type":"string","maxLength":120},"jobRole":{"type":"string","maxLength":100},"companyId":{"type":"integer","minimum":1,"description":"Use only after the user resolves an ambiguous company shortlist."}},"required":["operation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/builder","pages":["/builder"]},{"name":"create_report","kind":"act","impl":"imperative","description":"Use for every request that asks for an answer, calculation, analysis, ranking, comparison, summary, table, chart, or narrative from the Steam product catalog or customer engagement data, even when the user does not say report or save. This is the reporting interface for all data-derived content and places the result inline. Choose exactly one presentation mode. Mixed means one headline metric plus one supporting chart and never includes a table; create separate reports or tabs when both a chart and table are needed. Requires a user-confirmed name and role plus a company candidate explicitly selected by the user. Use role and company context to tailor priorities and framing, and use quarter width for a row of four compact KPIs.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","maxLength":100},"description":{"type":"string","maxLength":220},"span":{"type":"string","enum":["full","half","third","quarter"],"description":"Choose full for primary or dense content, half for paired peers, third for three-up summaries, or quarter for four compact KPIs."},"data":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","const":"steam_catalog"},"filters":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","maxLength":120},"ownerBand":{"type":"string","enum":["All owner ranges","100,000,000 .. 200,000,000","50,000,000 .. 100,000,000","20,000,000 .. 50,000,000","10,000,000 .. 20,000,000","5,000,000 .. 10,000,000","2,000,000 .. 5,000,000","1,000,000 .. 2,000,000","500,000 .. 1,000,000","200,000 .. 500,000","100,000 .. 200,000","50,000 .. 100,000","20,000 .. 50,000","0 .. 20,000","0 .. 0"]},"priceBand":{"type":"string","enum":["All prices","Free","Under $10","$10–$29.99","$30–$59.99","$60+"]},"minPositiveRatio":{"type":"number","minimum":0,"maximum":1},"minCcu":{"type":"integer","minimum":0},"genres":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}},"tags":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}},"categories":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}}},"required":["query","ownerBand","priceBand","minPositiveRatio","minCcu","genres","tags","categories"]}},"required":["name","filters"]},"pipeline":{"type":"array","maxItems":12,"items":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"explode"},"field":{"enum":["genres","tags","categories","developers","publishers","languages"]},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["operation","field","as"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"groupBy"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"aggregate"},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["count","valid","distinct","sum","mean","median","min","max","quantile","stdev","variance","corr"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"field2":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"parameter":{"type":"number","minimum":0,"maximum":1},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"window"},"partitionBy":{"type":"array","maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"sortBy":{"type":"array","maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["rowNumber","rank","denseRank","percentRank","mean","sum","median","stdev","lag","lead"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"offset":{"type":"integer","minimum":1,"maximum":100},"frame":{"enum":["partition","cumulative","rolling"]},"rows":{"type":"integer","minimum":1,"maximum":100},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","partitionBy","sortBy","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"calculate"},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["add","subtract","multiply","divide"]},"left":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"right":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"value":{"type":"number"}}}},"required":["operation","as","operator","left","right"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"filter"},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["equal","notEqual","greaterThan","greaterOrEqual","lessThan","lessOrEqual","in"]},"value":{}},"required":["operation","field","operator","value"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"sort"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"limit"},"count":{"type":"integer","minimum":1,"maximum":2000}},"required":["operation","count"]}]}},"resultLimit":{"type":"integer","minimum":1,"maximum":2000}},"required":["source","pipeline","resultLimit"]},{"type":"object","additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","const":"customer_engagement"},"view":{"type":"string","enum":["sessions","funnel"]},"inheritPageFilters":{"type":"boolean","default":true},"filters":{"type":"object","additionalProperties":false,"properties":{"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"shops":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":80}},"suppliers":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":80}},"productCategories":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":80}},"brands":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":80}},"productClasses":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":80}},"sexes":{"type":"array","maxItems":4,"items":{"type":"string","enum":["Female","Male","Non-binary","Undisclosed"]}},"customerTypes":{"type":"array","maxItems":3,"items":{"type":"string","enum":["New","Returning","Loyal"]}},"devices":{"type":"array","maxItems":3,"items":{"type":"string","enum":["Desktop","Mobile","Tablet"]}}},"required":["dateFrom","dateTo","shops","suppliers","productCategories","brands","productClasses","sexes","customerTypes","devices"]}},"required":["name","view","filters"]},"pipeline":{"type":"array","maxItems":12,"items":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"groupBy"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"aggregate"},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["count","valid","distinct","sum","mean","median","min","max","quantile","stdev","variance","corr"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"field2":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"parameter":{"type":"number","minimum":0,"maximum":1},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"window"},"partitionBy":{"type":"array","maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"sortBy":{"type":"array","maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["rowNumber","rank","denseRank","percentRank","mean","sum","median","stdev","lag","lead"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"offset":{"type":"integer","minimum":1,"maximum":100},"frame":{"enum":["partition","cumulative","rolling"]},"rows":{"type":"integer","minimum":1,"maximum":100},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","partitionBy","sortBy","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"calculate"},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["add","subtract","multiply","divide"]},"left":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"right":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"value":{"type":"number"}}}},"required":["operation","as","operator","left","right"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"filter"},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["equal","notEqual","greaterThan","greaterOrEqual","lessThan","lessOrEqual","in"]},"value":{}},"required":["operation","field","operator","value"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"sort"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"limit"},"count":{"type":"integer","minimum":1,"maximum":2000}},"required":["operation","count"]}]}},"resultLimit":{"type":"integer","minimum":1,"maximum":2000}},"required":["source","pipeline","resultLimit"]}]},"presentation":{"type":"object","description":"Choose exactly one presentation mode. Metric renders one headline value; table renders rows; chart renders one visualization; narrative renders one written finding; mixed renders exactly one headline metric and one supporting chart. Mixed is not a generic combination and never renders a table.","oneOf":[{"title":"Metric report","description":"Renders exactly one headline metric and no chart or table.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"metric"},"metric":{"type":"object","additionalProperties":false,"properties":{"valueField":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":80},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."},"context":{"type":"string","maxLength":180}},"required":["valueField","label"]}},"required":["mode","metric"]},{"title":"Table report","description":"Renders rows as a table and no headline metric or chart.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"table"},"table":{"type":"object","additionalProperties":false,"description":"Columns rendered in a table report.","properties":{"columns":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":60},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."}},"required":["field","label"]}}},"required":["columns"]}},"required":["mode","table"]},{"title":"Chart report","description":"Renders exactly one chart and no headline metric or table.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"chart"},"visualization":{"type":"object","additionalProperties":false,"properties":{"renderer":{"type":"string","const":"plotly"},"traces":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","enum":["bar","scatter","pie","heatmap","histogram","box","violin","treemap","sunburst","funnel"]},"name":{"type":"string"},"x":{"type":"array","maxItems":2000,"items":{}},"y":{"type":"array","maxItems":2000,"items":{}},"labels":{"type":"array","maxItems":2000,"items":{}},"values":{"type":"array","maxItems":2000,"items":{}},"mode":{"type":"string"},"orientation":{"type":"string","enum":["h","v"]},"hole":{"type":"number","minimum":0,"maximum":0.9},"marker":{"type":"object","additionalProperties":true},"line":{"type":"object","additionalProperties":true},"text":{"type":"array","maxItems":2000,"items":{}},"hovertemplate":{"type":"string"}}}},"layout":{"type":"object","additionalProperties":true},"encoding":{"type":"object","additionalProperties":false,"properties":{"x":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"y":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"labels":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"values":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"text":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"series":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"hover":{"type":"array","maxItems":8,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["hover"]}},"required":["renderer","traces","encoding"]}},"required":["mode","visualization"]},{"title":"Narrative report","description":"Renders one concise written finding and no metric, table, or chart.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"narrative"},"narrative":{"type":"object","additionalProperties":false,"description":"The concise finding rendered by a narrative report.","properties":{"body":{"type":"string","maxLength":800}},"required":["body"]}},"required":["mode","narrative"]},{"title":"Metric with chart report","description":"Renders exactly one headline metric followed by one supporting chart. It never renders a table; create a separate table report or use tabs when tabular detail is needed.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"mixed"},"metric":{"type":"object","additionalProperties":false,"properties":{"valueField":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":80},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."},"context":{"type":"string","maxLength":180}},"required":["valueField","label"]},"visualization":{"type":"object","additionalProperties":false,"properties":{"renderer":{"type":"string","const":"plotly"},"traces":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","enum":["bar","scatter","pie","heatmap","histogram","box","violin","treemap","sunburst","funnel"]},"name":{"type":"string"},"x":{"type":"array","maxItems":2000,"items":{}},"y":{"type":"array","maxItems":2000,"items":{}},"labels":{"type":"array","maxItems":2000,"items":{}},"values":{"type":"array","maxItems":2000,"items":{}},"mode":{"type":"string"},"orientation":{"type":"string","enum":["h","v"]},"hole":{"type":"number","minimum":0,"maximum":0.9},"marker":{"type":"object","additionalProperties":true},"line":{"type":"object","additionalProperties":true},"text":{"type":"array","maxItems":2000,"items":{}},"hovertemplate":{"type":"string"}}}},"layout":{"type":"object","additionalProperties":true},"encoding":{"type":"object","additionalProperties":false,"properties":{"x":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"y":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"labels":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"values":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"text":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"series":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"hover":{"type":"array","maxItems":8,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["hover"]}},"required":["renderer","traces","encoding"]}},"required":["mode","metric","visualization"]}]},"openInBrowser":{"type":"boolean","default":true}},"required":["title","data","presentation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/builder","pages":["/builder"]},{"name":"compose_page","kind":"act","impl":"imperative","description":"Inspect or compose the local page after the user has approved the agent's proposal through request_page_composition. Begin each approved composition with setPageTitle using a concise title that reflects the page purpose; that value appears in the builder header, browser tab, and {{page.title}} binding. Use create_report, not addHtml, for content that depends on catalog or engagement data. Follow the approved proposal and use the confirmed role and company to tailor priorities, framing, vocabulary, and the next step. HTML widgets are presentation-only: never include Markdown links, anchor elements, href attributes, linked URLs, or button-like links; state any next step as plain text.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"operations":{"type":"array","maxItems":16,"items":{"type":"object","additionalProperties":true,"properties":{"op":{"type":"string","enum":["inspect","setPageTitle","select","addHtml","addTabs","move","setSpan","configure","remove","undo","reset"]},"target":{"type":"string","maxLength":128},"title":{"type":"string","maxLength":100,"description":"The page title for setPageTitle, or the block title for add and configure operations."},"markup":{"type":"string","maxLength":2000,"description":"Presentation-only HTML for a widget. Do not include Markdown links, anchor elements, href attributes, linked URLs, or button-like links. Express any next step as plain text."},"span":{"type":"string","enum":["full","half","third","quarter"],"description":"Infer from content: full for primary/dense content, half for paired peers, third for three-up summaries, quarter for four compact KPIs."},"after":{"type":"string","maxLength":128},"before":{"type":"string","maxLength":128},"labels":{"type":"array","minItems":1,"maxItems":6,"items":{"type":"string","maxLength":60}},"tabLabels":{"type":"array","minItems":1,"maxItems":6,"items":{"type":"string","maxLength":60}},"intoTab":{"type":"object","additionalProperties":false,"properties":{"tabsId":{"type":"string","maxLength":128},"tabId":{"type":"string","maxLength":128}},"required":["tabsId","tabId"]},"toRootEnd":{"type":"boolean"}},"required":["op"]}},"openInBrowser":{"type":"boolean","default":true}},"required":["operations"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/builder","pages":["/builder"]},{"name":"render_report","kind":"act","impl":"imperative","description":"Render an inline report from the local page as bounded Markdown or a PNG.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"reportId":{"type":"string","minLength":1,"maxLength":128},"renderMode":{"type":"string","enum":["auto","markdown","image"],"default":"auto"}},"required":["reportId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/builder","pages":["/builder"]},{"name":"describe_steam_catalog","kind":"answer","impl":"imperative","description":"Describe the database-backed Steam catalog fields, filters, analytics operations, and presentation contract. Use before creating a report when field meanings or genre/tag expansion are unclear.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"apply_catalog_search","kind":"act","impl":"imperative","description":"Apply arbitrary, allowlisted facet filters to the visible catalog table. Filters may target any described scalar field or the developer, publisher, genre, tag, category, and language dimensions; combine up to 12 filters with AND semantics. Use in for one-of values and contains for case-insensitive text matching. Replace is the default; append preserves existing visible criteria. This changes only the current browser session, opens the raw-data view, resets pagination, and waits for the results to render.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["replace","append"],"default":"replace","description":"Replace the visible criteria, or append filters to the current visible search."},"query":{"type":"string","maxLength":120,"description":"Optional full-text search across titles and indexed catalog metadata."},"filters":{"type":"array","maxItems":12,"description":"Any safe combination of scalar or dimension filters. Dimension fields are developer, publisher, genre, tag, category, and language.","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string","maxLength":60,"description":"Optional concise facet label shown in the UI."},"field":{"type":"string","enum":["id","title","developer","publisher","owners","ownersMin","ownersMax","priceCents","discountPercent","positive","negative","reviewCount","positiveRatio","ccu","averageForever","average2Weeks","medianForever","median2Weeks","releaseDate","releaseYear","requiredAge","dlcCount","metacriticScore","userScore","achievements","recommendations","windows","mac","linux","ownerBand","priceBand","reviewBand","activityBand","genre","tag","category","language"]},"operator":{"type":"string","enum":["equal","notEqual","greaterThan","greaterOrEqual","lessThan","lessOrEqual","in","contains"]},"value":{"description":"A string, finite number, boolean, null, or an array of scalar values for the in operator."}},"required":["field","operator","value"]}},"sort":{"type":"string","enum":["ownersMax","title","priceCents","positiveRatio","reviewCount","ccu","releaseYear"]},"direction":{"type":"string","enum":["asc","desc"]}},"required":["filters"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"create_report","kind":"act","impl":"imperative","description":"Use for every request that asks for an answer, calculation, analysis, ranking, comparison, summary, table, chart, or narrative from Steam catalog data, even when the user does not say report or save. This is the reporting interface for all data-derived answers. Save exactly one presentation: metric, table, chart, narrative, or mixed. Mixed means one headline metric plus one supporting chart and never includes a table; create separate reports when both a chart and table are needed. Returns only a compact receipt.","annotations":{"readOnlyHint":false,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","maxLength":100},"description":{"type":"string","maxLength":220},"data":{"type":"object","additionalProperties":false,"properties":{"source":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","const":"steam_catalog"},"filters":{"type":"object","additionalProperties":false,"properties":{"query":{"type":"string","maxLength":120},"ownerBand":{"type":"string","enum":["All owner ranges","100,000,000 .. 200,000,000","50,000,000 .. 100,000,000","20,000,000 .. 50,000,000","10,000,000 .. 20,000,000","5,000,000 .. 10,000,000","2,000,000 .. 5,000,000","1,000,000 .. 2,000,000","500,000 .. 1,000,000","200,000 .. 500,000","100,000 .. 200,000","50,000 .. 100,000","20,000 .. 50,000","0 .. 20,000","0 .. 0"]},"priceBand":{"type":"string","enum":["All prices","Free","Under $10","$10–$29.99","$30–$59.99","$60+"]},"minPositiveRatio":{"type":"number","minimum":0,"maximum":1},"minCcu":{"type":"integer","minimum":0},"genres":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}},"tags":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}},"categories":{"type":"array","maxItems":10,"items":{"type":"string","minLength":1,"maxLength":80}}},"required":["query","ownerBand","priceBand","minPositiveRatio","minCcu","genres","tags","categories"]}},"required":["name","filters"]},"pipeline":{"type":"array","maxItems":12,"items":{"oneOf":[{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"explode"},"field":{"enum":["genres","tags","categories","developers","publishers","languages"]},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["operation","field","as"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"groupBy"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"aggregate"},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["count","valid","distinct","sum","mean","median","min","max","quantile","stdev","variance","corr"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"field2":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"parameter":{"type":"number","minimum":0,"maximum":1},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"window"},"partitionBy":{"type":"array","maxItems":4,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"sortBy":{"type":"array","maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}},"measures":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":false,"properties":{"function":{"enum":["rowNumber","rank","denseRank","percentRank","mean","sum","median","stdev","lag","lead"]},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"offset":{"type":"integer","minimum":1,"maximum":100},"frame":{"enum":["partition","cumulative","rolling"]},"rows":{"type":"integer","minimum":1,"maximum":100},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}},"required":["function","as"]}}},"required":["operation","partitionBy","sortBy","measures"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"calculate"},"as":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["add","subtract","multiply","divide"]},"left":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"right":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"value":{"type":"number"}}}},"required":["operation","as","operator","left","right"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"filter"},"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"operator":{"enum":["equal","notEqual","greaterThan","greaterOrEqual","lessThan","lessOrEqual","in"]},"value":{}},"required":["operation","field","operator","value"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"sort"},"fields":{"type":"array","minItems":1,"maxItems":4,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"direction":{"type":"string","enum":["ascending","descending"]}},"required":["field","direction"]}}},"required":["operation","fields"]},{"type":"object","additionalProperties":false,"properties":{"operation":{"const":"limit"},"count":{"type":"integer","minimum":1,"maximum":2000}},"required":["operation","count"]}]}},"resultLimit":{"type":"integer","minimum":1,"maximum":2000}},"required":["source","pipeline","resultLimit"]},"presentation":{"type":"object","description":"Choose exactly one presentation mode. Metric renders one headline value; table renders rows; chart renders one visualization; narrative renders one written finding; mixed renders exactly one headline metric and one supporting chart. Mixed is not a generic combination and never renders a table.","oneOf":[{"title":"Metric report","description":"Renders exactly one headline metric and no chart or table.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"metric"},"metric":{"type":"object","additionalProperties":false,"properties":{"valueField":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":80},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."},"context":{"type":"string","maxLength":180}},"required":["valueField","label"]}},"required":["mode","metric"]},{"title":"Table report","description":"Renders rows as a table and no headline metric or chart.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"table"},"table":{"type":"object","additionalProperties":false,"description":"Columns rendered in a table report.","properties":{"columns":{"type":"array","minItems":1,"maxItems":8,"items":{"type":"object","additionalProperties":false,"properties":{"field":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":60},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."}},"required":["field","label"]}}},"required":["columns"]}},"required":["mode","table"]},{"title":"Chart report","description":"Renders exactly one chart and no headline metric or table.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"chart"},"visualization":{"type":"object","additionalProperties":false,"properties":{"renderer":{"type":"string","const":"plotly"},"traces":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","enum":["bar","scatter","pie","heatmap","histogram","box","violin","treemap","sunburst","funnel"]},"name":{"type":"string"},"x":{"type":"array","maxItems":2000,"items":{}},"y":{"type":"array","maxItems":2000,"items":{}},"labels":{"type":"array","maxItems":2000,"items":{}},"values":{"type":"array","maxItems":2000,"items":{}},"mode":{"type":"string"},"orientation":{"type":"string","enum":["h","v"]},"hole":{"type":"number","minimum":0,"maximum":0.9},"marker":{"type":"object","additionalProperties":true},"line":{"type":"object","additionalProperties":true},"text":{"type":"array","maxItems":2000,"items":{}},"hovertemplate":{"type":"string"}}}},"layout":{"type":"object","additionalProperties":true},"encoding":{"type":"object","additionalProperties":false,"properties":{"x":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"y":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"labels":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"values":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"text":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"series":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"hover":{"type":"array","maxItems":8,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["hover"]}},"required":["renderer","traces","encoding"]}},"required":["mode","visualization"]},{"title":"Narrative report","description":"Renders one concise written finding and no metric, table, or chart.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"narrative"},"narrative":{"type":"object","additionalProperties":false,"description":"The concise finding rendered by a narrative report.","properties":{"body":{"type":"string","maxLength":800}},"required":["body"]}},"required":["mode","narrative"]},{"title":"Metric with chart report","description":"Renders exactly one headline metric followed by one supporting chart. It never renders a table; create a separate table report or use tabs when tabular detail is needed.","type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","const":"mixed"},"metric":{"type":"object","additionalProperties":false,"properties":{"valueField":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"label":{"type":"string","maxLength":80},"format":{"type":"string","enum":["number","integer","compact","currencyCents","percent","minutes","year"],"description":"Use year for calendar-year fields. releaseYear always renders as a year when this is omitted or set to a generic numeric format."},"context":{"type":"string","maxLength":180}},"required":["valueField","label"]},"visualization":{"type":"object","additionalProperties":false,"properties":{"renderer":{"type":"string","const":"plotly"},"traces":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string","enum":["bar","scatter","pie","heatmap","histogram","box","violin","treemap","sunburst","funnel"]},"name":{"type":"string"},"x":{"type":"array","maxItems":2000,"items":{}},"y":{"type":"array","maxItems":2000,"items":{}},"labels":{"type":"array","maxItems":2000,"items":{}},"values":{"type":"array","maxItems":2000,"items":{}},"mode":{"type":"string"},"orientation":{"type":"string","enum":["h","v"]},"hole":{"type":"number","minimum":0,"maximum":0.9},"marker":{"type":"object","additionalProperties":true},"line":{"type":"object","additionalProperties":true},"text":{"type":"array","maxItems":2000,"items":{}},"hovertemplate":{"type":"string"}}}},"layout":{"type":"object","additionalProperties":true},"encoding":{"type":"object","additionalProperties":false,"properties":{"x":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"y":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"labels":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"values":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"text":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"series":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"},"hover":{"type":"array","maxItems":8,"items":{"type":"string","pattern":"^[A-Za-z][A-Za-z0-9_]{0,63}$"}}},"required":["hover"]}},"required":["renderer","traces","encoding"]}},"required":["mode","metric","visualization"]}]},"openInBrowser":{"type":"boolean","default":true}},"required":["title","data","presentation"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]},{"name":"render_report","kind":"act","impl":"imperative","description":"Render an existing saved report as bounded Markdown or, for chart reports, a PNG.","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","additionalProperties":false,"properties":{"reportId":{"type":"string","minLength":1,"maxLength":128},"renderMode":{"type":"string","enum":["auto","markdown","image"],"default":"auto"}},"required":["reportId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/"]}],"category":"Commerce","favicon":"/favicons/adaptive-interfaces.ahenselin.chatgpt.site.png","apiSurface":"spec","toolCount":20}}