@bitcobblers/wod-wiki-wql 0.37.2139 → 0.38.2141

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vocabulary.ts","../src/capabilities.ts","../src/grammar/wql.parser.ts","../src/grammar/wql.parser.terms.ts","../src/wqlSuffix.ts","../src/wql.ts","../src/serialize.ts","../src/disciplines.ts","../src/language.ts","../src/units.ts","../src/calendar.ts","../src/document.ts","../src/documentRunner.ts","../src/queryDocumentRunner.ts","../src/derivation.ts","../src/selection.ts","../src/QueryService.ts","../src/dashboard/model.ts","../src/dashboard/frontmatter.ts","../src/dashboard/parser.ts","../src/dashboard/scaffold.ts","../src/dashboard/noteOps.ts","../src/version.ts"],"names":["options","t","filters","host","statics","used","avail","start","text","byPosition","series","QueryDocumentRunner","dims","seen","m","UNASSIGNED","substituteTokens"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WQL vocabulary — the single owner of the WQL dictionary: aggregators,\n * comparison operators, metric families/aggregates, calc.* targets, tag\n * keys, dimensions, rollup periods, grains, sources, scopes, display units,\n * and structural keywords. Every surface that needs these words imports from\n * here (or from language.ts, which re-exports this module for editor\n * consumers) rather than hand-writing its own copy — issue #871.\n *\n * The calc registry's built-in calcs (@bitcobblers/wod-wiki-lang's calc seeds)\n * publish exactly the `calc.*` targets listed in WQL_CALC_TARGETS; keep the\n * two in sync. User-authored calcs extend this set at runtime.\n */\n\nimport { KNOWN_OUTPUT_TYPES } from '@bitcobblers/wod-wiki-core';\n\n/** Canonical Metric Key families (CONTEXT.md §Analytics). */\nexport const WQL_METRIC_FAMILIES = ['reps', 'distance', 'resistance', 'elapsed', 'power', 'pace'] as const;\nexport type WqlMetricFamily = (typeof WQL_METRIC_FAMILIES)[number];\n\n/** Tier-2 aggregate keys written to the Analytics Store. */\nexport const WQL_METRIC_AGGREGATES = ['totalVolume', 'totalDistance', 'tis', 'sessionLoad'] as const;\nexport type WqlMetricAggregate = (typeof WQL_METRIC_AGGREGATES)[number];\n\n/** Aggregate head operators for the analytics grammar (agg:metric{filters}). */\nexport const WQL_AGGREGATORS = ['sum', 'avg', 'min', 'max', 'count', 'last', 'delta'] as const;\nexport type WqlAggregator = (typeof WQL_AGGREGATORS)[number];\n\n/** Comparison operators for cross-store `where` joins (#800). */\nexport const WQL_COMPARISON_OPS = ['>', '>=', '<', '<=', '==', '!='] as const;\nexport type WqlComparisonOp = (typeof WQL_COMPARISON_OPS)[number];\n\n/** Frontmatter typed-tag keys (CONTEXT.md § Tags) — values are dynamic,\n * backed by the host's tags store (`by-type` index), not a static enum. */\nexport const WQL_TYPED_TAG_KEYS = ['domain', 'format', 'equipment', 'quality', 'intent'] as const;\nexport type WqlTypedTagKey = (typeof WQL_TYPED_TAG_KEYS)[number];\n\n/** Tag keys the Query Service reads off a fact row (QueryService.factTagValue). */\nexport const WQL_TAG_KEYS = [\n ...WQL_TYPED_TAG_KEYS,\n 'effort', 'discipline', 'intensity', 'grade', 'note', 'page', 'origin',\n 'grain', 'metric', 'block', 'result', 'tags',\n] as const;\nexport type WqlTagKey = (typeof WQL_TAG_KEYS)[number];\n\n/** Content-plane keys — meaningful only on find:/rows:. On an aggregate\n * they are a category error (a fact row has no note text or source);\n * every other non-structural key is a candidate custom dimension. */\nexport const WQL_CONTENT_ONLY_KEYS = ['type', 'text', 'has', 'source', 'catalog'] as const;\n\n/** Filter keys the effort registry can resolve (runFindEffort) — anything\n * else on find:effort is ignored and reported as an advisory. */\nexport const WQL_EFFORT_FILTER_KEYS = ['effort', 'discipline', 'intensity', 'origin', 'text'] as const;\n\n/** Virtual dimensions — time buckets and stream positions, not fact fields. */\nexport const WQL_VIRTUAL_DIMS = ['day', 'week', 'session', 'round'] as const;\nexport type WqlVirtualDim = (typeof WQL_VIRTUAL_DIMS)[number];\n\n/**\n * Canonical `calc.*` targets. The single source of truth for the set of\n * calculation metric keys: source for the composer/CM6 typeahead (#871) and\n * the dashboard's known-vs-proposed gate (model.ts). Must\n * match the keys the calc engine registers in\n * @bitcobblers/wod-wiki-lang seeds (`calc.e1rm`, `calc.metMinutes`,\n * `calc.acwr`, `calc.monotony`, `calc.strain`, `calc.ctl`, `calc.atl`,\n * `calc.tsb`, etc.). NOTE: `calc.pmc` (composite {ctl, atl, tsb} series) is\n * deliberately absent — the store calc model publishes one scalar key per\n * definition, so PMC ships as the three loads (#905); a composite stays\n * 'proposed' until a dedicated series widget lands.\n */\nexport const WQL_CALC_TARGETS = [\n 'calc.metMinutes',\n 'calc.acwr',\n 'calc.monotony',\n 'calc.strain',\n 'calc.e1rm',\n 'calc.ctl',\n 'calc.atl',\n 'calc.tsb',\n // Wellness + capture metrics (seeds in seeds.ts): soreness/sleep/hrv are\n // user-captured passthroughs; readiness is their composite; mvcBw is\n // hang/%BW; ef is running pace ÷ HR; adherence is sessions ÷ planned;\n // pct1rm is the Epley-inverse intensity; sends count climbing sends.\n 'calc.soreness',\n 'calc.sleep',\n 'calc.hrv',\n 'calc.readiness',\n 'calc.mvcBw',\n 'calc.ef',\n 'calc.adherence',\n 'calc.pct1rm',\n 'calc.sends',\n] as const;\nexport type WqlCalcTarget = (typeof WQL_CALC_TARGETS)[number];\n\nexport const WQL_INTENSITY_TIERS = ['low', 'moderate', 'high'] as const;\nexport type WqlIntensityTier = (typeof WQL_INTENSITY_TIERS)[number];\n\n/** Unified store grains (ticket 003): 'summary' | 'event'. The legacy\n * 'segment' grain was renamed to 'event' (ticket 002); 'rollup' is retired —\n * rollups are computed at read time via the .rollup suffix, never stored. */\nexport const WQL_GRAINS = ['summary', 'event'] as const;\nexport type WqlGrain = (typeof WQL_GRAINS)[number];\n\n/** Content-discovery query targets (find:<target>). */\nexport const WQL_FIND_TARGETS = ['note', 'block', 'effort', 'session', 'segment', 'event'] as const;\nexport type WqlFindTarget = (typeof WQL_FIND_TARGETS)[number];\n\n/** Canonical source filter values: the allowed storage locations (the\n * former `collections` spelling is retired — renamed to feeds; storage\n * identities keep their `collection:` prefixes). Seed corpus locations\n * joined the note plane: prebuilt dashboards, the effort library and the\n * equipment library. */\nexport const WQL_SOURCE_VALUES = ['journal', 'feeds', 'guides', 'playground', 'dashboards', 'efforts', 'equipment'] as const;\nexport type WqlSourceValue = (typeof WQL_SOURCE_VALUES)[number];\n\n/** Colon source heads — the unprefixed `:<head>` names. Find targets map\n * 1:1 to the content planes; journal/feed(s)/catalog(s)/playground are\n * source-scoped note heads (they parse to target 'note' plus an injected\n * `source:` filter). */\nexport const WQL_SOURCE_HEADS = [\n 'note', 'block', 'effort', 'session', 'segment', 'event',\n 'journal', 'feed', 'feeds', 'catalog', 'catalogs', 'playground',\n 'dashboard',\n] as const;\nexport type WqlSourceHead = (typeof WQL_SOURCE_HEADS)[number];\n\n/** Storage scope a source-scoped note head binds (undefined = plain target). */\nexport const WQL_SOURCE_HEAD_SCOPES: Readonly<Record<string, WqlSourceValue>> = {\n journal: 'journal',\n feed: 'feeds',\n feeds: 'feeds',\n catalog: 'feeds',\n catalogs: 'feeds',\n playground: 'playground',\n};\n\n/** Type-alias note heads — `:<head>` parses to target 'note' plus an injected\n * `type:` filter (no storage scope, so the head never narrows by source).\n * `:dashboard` is the canonical member: dashboards are notes typed\n * 'dashboard', findable with ordinary note tags/text/frontmatter filters. */\nexport const WQL_TYPE_HEADS: Readonly<Record<string, string>> = {\n dashboard: 'dashboard',\n};\n\n/** Former generic `:note` default scope — now EMPTY: the generic note head\n * is the inclusive note plane (every row). Kept exported (empty) so the\n * serializer and host surfaces keep a single name for \"the default scope\",\n * which no longer narrows anything. */\nexport const WQL_NOTE_DEFAULT_SOURCES: readonly WqlSourceValue[] = [];\n\n/** Colon function heads — the unprefixed `:<fn>{metric:…}` aggregate stage. */\nexport const WQL_FUNCTION_HEADS = WQL_AGGREGATORS;\nexport type WqlFunctionHead = WqlAggregator;\n\n/** Colon chart heads — terminal pipeline sinks (`:timeseries`, `:bar`, …). */\nexport const WQL_CHART_HEADS = ['timeseries', 'bar', 'table', 'donut', 'toplist', 'value'] as const;\nexport type WqlChartHead = (typeof WQL_CHART_HEADS)[number];\n\n/** Standard datasets the host registers per page/run before children\n * evaluate (`@session` active session, `@today` civil-day telemetry+notes). */\nexport const WQL_STANDARD_DATASETS = ['@session', '@today'] as const;\nexport type WqlStandardDataset = (typeof WQL_STANDARD_DATASETS)[number];\n\n\n/** Result planes — `rows:<plane>` narrows raw output-statement rows by the\n * unified store's promoted `outputType` column. The STORE vocabulary is\n * open (core KNOWN_OUTPUT_TYPES, ticket 002: unknowns are stored and\n * returned); the QUERY surface is a closed enum at parse (prototype C7) —\n * reopening toward a registry is a later, separate decision. Custom types\n * stay addressable programmatically via hand-built ASTs. */\nexport const WQL_RESULT_PLANES = KNOWN_OUTPUT_TYPES;\nexport type WqlResultPlane = (typeof WQL_RESULT_PLANES)[number];\n\n/** Content-specific filter keys (beyond the analytics tag keys). */\nexport const WQL_CONTENT_FILTER_KEYS = ['type', 'text', 'has', 'source', 'catalog', ...WQL_TAG_KEYS] as const;\nexport type WqlContentFilterKey = (typeof WQL_CONTENT_FILTER_KEYS)[number];\n\n/**\n * Composer source planes (issue #838, decision #836): the single `source`\n * head slot that pivots the query kind. Content sources compile the `find:`\n * skeleton; `metrics` compiles the aggregate skeleton. `efforts` compiles\n * `find:effort` against the effort registry (origin/intensity/discipline\n * vocab from types.ts). The `results` plane is\n * deliberately absent — it needs new grammar/engine semantics and is\n * deferred to its own ticket.\n */\nexport const WQL_SOURCES = ['note', 'block', 'effort', 'session', 'segment', 'event'] as const;\nexport type WqlSource = (typeof WQL_SOURCES)[number];\n\n/** Rollup periods the aggregate grammar accepts (wql.ts: N > 1, unit d|w). */\nexport const WQL_ROLLUP_PERIODS = ['2w', '4w'] as const;\nexport type WqlRollupPeriod = (typeof WQL_ROLLUP_PERIODS)[number];\n\n/** Display units the app can render (analytics unit preference, kg/lb). The\n * `in <unit>` directive accepts any word; these are the canonical options. */\nexport const WQL_DISPLAY_UNITS = ['kg', 'lb'] as const;\nexport type WqlDisplayUnit = (typeof WQL_DISPLAY_UNITS)[number];\n\n/** All WQL keywords */\nexport const WQL_KEYWORDS = [\n 'find',\n 'rows',\n 'where',\n 'group',\n 'by',\n 'order',\n 'limit',\n 'sum',\n 'avg',\n 'min',\n 'max',\n 'count',\n 'last',\n 'delta',\n] as const;\nexport type WqlKeyword = (typeof WQL_KEYWORDS)[number];\n","import {\n WQL_CALC_TARGETS,\n WQL_CONTENT_ONLY_KEYS,\n WQL_EFFORT_FILTER_KEYS,\n WQL_METRIC_AGGREGATES,\n WQL_METRIC_FAMILIES,\n WQL_TAG_KEYS,\n WQL_TYPED_TAG_KEYS,\n} from './vocabulary';\n\n/**\n * Grouping dimensions the content consumer (stream entryGrouping) applies on\n * top of find results: the note/block/effort/session executors return flat\n * results and the view groups them, ordered and multi-dim. The find tables\n * (segment/event) group inside the executor over selected columns instead.\n */\nexport const CONTENT_GROUPING_DIMENSIONS = ['date', 'day', 'week', 'month', 'year', 'discipline', 'origin', 'source', 'kind', 'type', 'tag'] as const;\n\n/** Clause types that never name a data field. `metric` is NOT structural:\n * as a filter key it selects fact rows by their metric (metric:reps); the\n * guided `metric` clause meaning \"measure\" is an aggregate-head concern. */\nconst STRUCTURAL_TYPES: Record<string, true> = { time: true, groupby: true, rollup: true, unit: true, where: true, agg: true };\nconst FACT_KEYS = WQL_TAG_KEYS.filter(key => key !== 'metric');\n/** Table facts filter by real row keys. `tags` is excluded: the table\n * executor resolves note tags against an empty map, so a tags: filter would\n * silently match nothing. */\nconst TABLE_KEYS = WQL_TAG_KEYS.filter(key => key !== 'tags');\nconst AGGREGATE_TYPES: ReadonlySet<string> = new Set([\n ...FACT_KEYS.map(key => key === 'tags' ? 'tag' : key),\n 'time', 'groupby', 'rollup', 'unit', 'where', 'agg', 'metric',\n]);\nconst TARGET_TYPES: Readonly<Record<string, ReadonlySet<string>>> = {\n note: new Set(['text', 'catalog', 'tag', 'effort', ...WQL_TYPED_TAG_KEYS, 'type', 'page', 'source', 'note', 'time', 'groupby', 'where']),\n block: new Set(['text', 'catalog', 'tag', 'effort', 'type', 'source', 'note', 'time', 'groupby', 'where']),\n effort: new Set([...WQL_EFFORT_FILTER_KEYS, 'groupby']),\n session: new Set(['result', 'block', 'note', 'plane', 'time', 'groupby']),\n segment: new Set([...TABLE_KEYS, 'time', 'groupby', 'unit']),\n event: new Set([...TABLE_KEYS, 'time', 'groupby', 'unit']),\n};\n/** Empty fallback keeps the exported ReadonlySet contract for unknown targets. */\nconst EMPTY_TYPES: ReadonlySet<string> = new Set();\n/** Executor-exact aggregate filter keys. `metric` here is the fact-row\n * metric filter (`agg:sum{metric:reps}` selects those rows) — the guided\n * `metric` clause is the measure head, a different slot. `tags` is the AST\n * key of the canonical `tag` clause. */\nconst AGGREGATE_KEYS: readonly string[] = WQL_TAG_KEYS;\nconst TARGET_KEYS: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n Object.entries(TARGET_TYPES).map(([target, types]) => [\n target,\n [...types].filter(type => !STRUCTURAL_TYPES[type]).map(type => type === 'tag' ? 'tags' : type),\n ]),\n);\n/** `round` resolves through custom fact dimensions; absent rows group under\n * the UNASSIGNED sentinel, matching the open dimension policy. */\nconst AGGREGATE_DIMENSIONS = ['day', 'week', 'session', 'round', ...WQL_TAG_KEYS];\nconst TABLE_DIMENSIONS = ['date', 'effort', 'discipline', ...WQL_METRIC_FAMILIES, ...WQL_METRIC_AGGREGATES, ...WQL_CALC_TARGETS];\n\n/** Guided clause types, including structural clauses honored by their consumers. */\nexport function allowedFilterTypesForTarget(target: string, family: 'find' | 'aggregate'): ReadonlySet<string> {\n return family === 'aggregate' ? AGGREGATE_TYPES : TARGET_TYPES[target] ?? EMPTY_TYPES;\n}\n\n/** Suggested filter keys. Fact-backed queries also accept custom dimension keys. */\nexport function wqlFilterKeys(target: string, family: 'find' | 'aggregate'): readonly string[] {\n return family === 'aggregate' ? AGGREGATE_KEYS : TARGET_KEYS[target] ?? [];\n}\n\n/** Content grouping is applied by the stream consumer; table grouping reads\n * selected columns. Effort/session have no executor grouping but their views\n * group content (the effort view profile groups by discipline). */\nexport function wqlGroupingDimensions(target: string, family: 'find' | 'aggregate'): readonly string[] {\n if (family === 'aggregate') return AGGREGATE_DIMENSIONS;\n if (target === 'segment' || target === 'event') return TABLE_DIMENSIONS;\n return CONTENT_GROUPING_DIMENSIONS;\n}\n\n/** Fact dimensions are open, but content-only fields and plane have no fact meaning. */\nexport function supportsWqlFilterKey(target: string, family: 'find' | 'aggregate', rawKey: string): boolean {\n const key = rawKey === 'tag' ? 'tags' : rawKey;\n if (family === 'aggregate' || target === 'segment' || target === 'event') {\n return !(WQL_CONTENT_ONLY_KEYS as readonly string[]).includes(key)\n && key !== 'plane'\n && !(family === 'find' && key === 'tags');\n }\n return wqlFilterKeys(target, family).includes(key);\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"+^OVQPOOOOQO'#Cb'#CbObQPO'#C`OgQPO'#C`OlQPO'#ClOqQQO'#C_OOQO'#C_'#C_O!SQQO'#CnQOQPOOOOQO,58z,58zO!bQPO,58zOOQO,59W,59WO!gQPO'#CdOOQO,58y,58yOVQPO,58xO!rQPO'#CoO!wQPO'#CrOOQO,59Y,59YO!|QPO,59YO#UQQO'#CcOOQO1G.f1G.fOOQO'#Cg'#CgO#jQPO'#CeO#oQPO'#CeOOQO,59O,59OO#tQPO,59OO#|QPO'#C_O$XQPO1G.dO$aQPO,59ZO$iQQO,59^OOQO1G.t1G.tO$nQPO'#CuO$sQQO,58}O%XQPO,59PO%aQPO,59PO%fQPO'#CxO%nQPO1G.jOOQO1G.j1G.jOVQPO'#CyO%vQPO7+$OOOQO'#Cq'#CqOOQO1G.u1G.uO&OQPO1G.uO&WQPO1G.xOOQO,59a,59aOOQO-E6s-E6sO&]QPO'#CiO&qQPO'#CiO'PQPO'#ChOOQO1G.k1G.kO%XQPO1G.kOOQO,59d,59dOOQO-E6v-E6vOOQO7+$U7+$UO'[QPO'#CcOOQO,59e,59eOOQO-E6w-E6wO'jQPO'#CzO'oQPO7+$aOOQO7+$a7+$aO'wQPO7+$dO'|QPO'#CvO(RQPO,59TOOQO,59T,59TO%XQPO'#CwO(gQPO,59SOOQO7+$V7+$VO(rQPO,58}OOQO,59f,59fOOQO-E6x-E6xOOQO<<G{<<G{OOQO<<HO<<HOOOQO,59b,59bOOQO-E6t-E6tOOQO1G.o1G.oOOQO,59c,59cOOQO-E6u-E6uO)QQPO,58zO)VQPO'#C`\",\n stateData: \")[~OqOS~OTPOaSOrQO~OTXO~OrYO~OTZO~Ot[OdRXgRXoRXuRX~Od_Og`Ou^OobX~OTcO~OTeOYgOwhO~OtlO~OxmO~Og`Ooba~OsoOdVXgVXoVXtVXuVX~OrqO~OTeO~OvsOwuO~Ot[OoRXuRX~OuvOoQi~OTxOwyO~Oh{O~OT|O~OsoOdVagVaoVatVauVa~OT!OO_!PO~Or!SO~OTeOYgO~OvsOw!VO~OuvOoQq~Ov!ZOw!]O~OT!^O~O^!aOr!_Os!_Ou]Xv]Xw]X~O^!aOu]Xv]Xw]X~Ou!bOv[Xw[X~OsoOoVXtVXuVX~OTxO~Ov!ZOw!hO~Oy!iO~OT!jO~O^!lOr!_Os!_Ou]av]aw]a~Ou!bOv[aw[a~OsoOoVatVauVa~OT!WO~Or!oO~O\",\n goto: \"$^oPPps|P!T![!`!dP!j!q!wPP#OPp#TP#W#^PP#d#n#t#z$Q$WRWOQVOQk^R!XvQTOTj^vQROT!p^vTdY!oT]TjQi[R!TsSf[sRrgQ!RqR!d!SS!Qq!SR!m!bVUO^vRbVQzlR!f!ZQaVRnbQpcS}p!eR!e!WQ!`!OR!k!`Q!c!QR!n!cQtiR!UtQwkR!YwQ![zR!g![\",\n nodeNames: \"⚠ Query Pipeline Stage Head Word Aggregator Metric Filters Filter Negate TagKey TagValue Value Star Quoted DatasetReference At Single GroupBy By Dimension Rollup RollupDot Int\",\n maxTerm: 41,\n skippedNodes: [0],\n repeatNodeCount: 6,\n tokenData: \"'i~RgXY!jYZ!j]^!jpq!jqr!{rs#Qxy#oyz#tz{#y|}$O}!O$T!O!P$i!Q![%f![!]%|!b!c&R!c!}$T#R#S$T#T#U$T#U#V&W#V#o$T#o#p'Y#p#q'_#q#r'd~!oSq~XY!jYZ!j]^!jpq!j~#QOY~~#TTOr#Qrs#ds;'S#Q;'S;=`#i<%lO#Q~#iO_~~#lP;=`<%l#Q~#tOx~~#yOy~~$OO^~~$TOv~P$YTTP}!O$T!Q![$T!c!}$T#R#S$T#T#o$T~$nPs~#f#g$q~$tP#c#d$w~$zP#`#a$}~%QP#`#a%T~%WP#i#j%Z~%^P#d#e%a~%fOg~R%mThQTP}!O$T!Q![%f!c!}$T#R#S$T#T#o$T~&ROr~~&WOa~R&]VTP}!O$T!Q![$T!c!}$T#R#S$T#T#m$T#m#n&r#n#o$TR&yTdQTP}!O$T!Q![$T!c!}$T#R#S$T#T#o$T~'_Ot~~'dOu~~'iOw~\",\n tokenizers: [0, 1],\n topRules: {\"Query\":[0,1]},\n tokenPrec: 0\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Query = 1,\n Pipeline = 2,\n Stage = 3,\n Head = 4,\n Word = 5,\n Aggregator = 6,\n Metric = 7,\n Filters = 8,\n Filter = 9,\n Negate = 10,\n TagKey = 11,\n TagValue = 12,\n Value = 13,\n Star = 14,\n Quoted = 15,\n DatasetReference = 16,\n At = 17,\n Single = 18,\n GroupBy = 19,\n By = 20,\n Dimension = 21,\n Rollup = 22,\n RollupDot = 23,\n Int = 24\n","/**\n * WqlSuffix — Unified WQL suffix parser and adapter (issue #870).\n *\n * Encapsulates suffix parsing order, regexes, depth-0 brace-aware splitting,\n * and AST extraction for all WQL suffix clauses:\n * - Outer join: `where <joinClause>`\n * - Display unit: `in <unit>` (analytics queries only — C2 de-overloaded `in`)\n * - Rollup period: `.rollup(<size><unit>)`\n * - Group-by: `by {<dims>}`\n * - Time window: `last <n><unit>` or `from <YYYY-MM-DD> [to <YYYY-MM-DD>]`\n * (C1 — one window per query, every family)\n */\n\nexport interface ParsedWqlRollupSuffix {\n size: number;\n unit: string;\n raw: string;\n}\n\n/** A window clause (C1): relative (`last 8w`) or civil-date range\n * (`from 2026-01-01 [to 2026-03-31]`). One window per query — `last` and\n * `from` are mutually exclusive (validated as a C3-style conflict). */\nexport type ParsedWqlWindowSuffix =\n | { kind: 'relative'; size: number; unit: 'd' | 'w'; raw: string }\n | { kind: 'range'; start: string; end?: string; raw: string };\n\nexport interface ParsedWqlSuffixes {\n /** Outer cross-store join clause text (`where ...`). */\n where?: string;\n /** Stored source binding target (`=> @sourceName`). */\n storedAs?: string;\n /** Source dataset reference for downstream query (`@source | ...` or `in @source`). */\n sourceRef?: string;\n /** Display unit directive (`in kg`). */\n displayUnit?: string;\n /** Rollup period (`.rollup(2w)` — 1-unit forms are rejected in parseQuery). */\n rollup?: ParsedWqlRollupSuffix;\n /** Group-by dimensions (`by {week, effort}`). */\n groupBy?: string[];\n /** Time window — relative or civil-date range, legal on every family (C1). */\n window?: ParsedWqlWindowSuffix;\n /** Legacy scope clause (`in journal` / `in all`) stripped for the C2 compatibility normalizer. */\n legacyScope?: string;\n /** Duplicate-clause diagnostics (C3) — each names both conflicting spans. */\n conflicts?: string[];\n /** Primary query text with suffixes removed. */\n primaryText: string;\n}\n\n/**\n * Split a query at the first top-level `where` keyword (depth-0, word-bounded).\n * Returns the primary half and, when present, the join clause text.\n */\nexport function splitAtWhere(text: string): { primary: string; where?: string } {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (c === '{') depth++;\n else if (c === '}') depth = Math.max(0, depth - 1);\n else if (\n depth === 0 &&\n c === 'w' &&\n text.slice(i, i + 5) === 'where' &&\n (i === 0 || /\\s/.test(text[i - 1])) &&\n (i + 5 >= text.length || /\\s/.test(text[i + 5]))\n ) {\n return { primary: text.slice(0, i).trim(), where: text.slice(i + 5).trim() };\n }\n }\n return { primary: text.trim() };\n}\n\n// ponytail: regex suffix/prefix peel for => @source and @source | ...; upgrade to Lezer AST node when source pipelines support sub-expression branches.\nconst STORED_AS_RE = /\\s*=>\\s*@?([a-zA-Z0-9_-]+)\\s*$/;\nconst SOURCE_PREFIX_RE = /^@([a-zA-Z0-9_-]+)\\s*(?:\\||=>)\\s*/;\nconst IN_SOURCE_RE = /\\s+(?:in|from)\\s+@([a-zA-Z0-9_-]+)\\s*$/i;\nconst DISPLAY_UNIT_RE = /\\s+in\\s+([a-zA-Z0-9_-]+)\\s*$/;\nconst ROLLUP_RE = /\\.rollup\\((\\d+)?([a-zA-Z]*)\\)\\s*$/;\nconst BY_RE = /\\s+by\\s+\\{([^}]*)\\}\\s*$/;\nconst LAST_RE = /\\s+last\\s+(\\d+)([dw])\\s*$/i;\nconst FROM_TO_RE = /\\s+from\\s+(\\d{4}-\\d{2}-\\d{2})(?:\\s+to\\s+(\\d{4}-\\d{2}-\\d{2}))?\\s*$/i;\n/**\n * Extract suffixes from a raw WQL query string.\n * Strips outer join (`where`), display unit (`in kg`), rollup (`.rollup(Nw)`),\n * group-by (`by {week}`), time window (`last 8w` / `from … [to …]`), and\n * legacy scope (`in journal`).\n */\nexport function parseWqlSuffixes(raw: string): ParsedWqlSuffixes {\n const { primary, where } = splitAtWhere(raw);\n let text = primary.trim();\n\n let storedAs: string | undefined;\n let sourceRef: string | undefined;\n let displayUnit: string | undefined;\n let rollup: ParsedWqlRollupSuffix | undefined;\n let groupBy: string[] | undefined;\n let window: ParsedWqlWindowSuffix | undefined;\n let legacyScope: string | undefined;\n const conflicts: string[] = [];\n\n // Prefix pipeline source binding: `@olyLifts | ...` or `@olyLifts => ...`\n const prefixMatch = text.match(SOURCE_PREFIX_RE);\n if (prefixMatch) {\n sourceRef = '@' + prefixMatch[1];\n text = text.slice(prefixMatch[0].length).trim();\n }\n const isFind = text.startsWith('find:');\n const isRows = /^rows(?=[:{]|\\s|$)/.test(text);\n\n // C3: a suffix kind may appear once. Each peel site strips its kind until\n // exhausted (right-to-left); more than one occurrence becomes a conflict\n // naming the first and last occurrences instead of silent rightmost-wins.\n // A duplicate hidden behind a different leftover kind still fails through\n // the normal cannot-parse path — single-occurrence parsing is unchanged.\n const stripRepeated = (re: RegExp): RegExpExecArray[] => {\n const matches: RegExpExecArray[] = [];\n for (let m = re.exec(text); m; m = re.exec(text)) {\n matches.unshift(m);\n text = text.slice(0, m.index).trim();\n }\n return matches;\n };\n const conflictFrom = (label: string, ms: RegExpExecArray[]) => {\n // Lockstep across six call sites: one conflict line naming both spans.\n if (ms.length > 1) {\n conflicts.push(\n `Duplicate '${label}' clause: '${ms[0][0].trim()}' conflicts with '${ms[ms.length - 1][0].trim()}'`,\n );\n }\n };\n\n // Suffix stored-source binding: `... => @olyLifts`\n const storeMatches = stripRepeated(STORED_AS_RE);\n conflictFrom('=>', storeMatches);\n if (storeMatches.length) {\n storedAs = '@' + storeMatches[storeMatches.length - 1][1];\n }\n\n // Window (C1) — one clause per query, every family. `from/to` strips\n // first (it is the rightmost window form when both appear), then `last`;\n // any second occurrence — same kind or cross-kind — is a C3 conflict.\n const froms = stripRepeated(FROM_TO_RE);\n const lasts = stripRepeated(LAST_RE);\n {\n const windows = [\n ...froms.map((m) => ({\n kind: 'range' as const,\n start: m[1],\n end: m[2],\n raw: m[0].trim(),\n at: m.index,\n })),\n ...lasts.map((m) => ({\n kind: 'relative' as const,\n size: parseInt(m[1], 10),\n unit: m[2].toLowerCase() as 'd' | 'w',\n raw: m[0].trim(),\n at: m.index,\n })),\n ].sort((a, b) => a.at - b.at);\n if (windows.length > 1) {\n conflicts.push(\n `Duplicate 'window' clause: '${windows[0].raw}' conflicts with '${windows[windows.length - 1].raw}'`,\n );\n }\n if (windows.length === 1) {\n const w = windows[0];\n window = w.kind === 'range' ? { kind: 'range', start: w.start, end: w.end, raw: w.raw } : { kind: 'relative', size: w.size, unit: w.unit, raw: w.raw };\n }\n }\n\n // Uniform suffix peeling: display-unit / legacy scope, rollup, and by {...}\n const units = stripRepeated(DISPLAY_UNIT_RE);\n conflictFrom(isFind || isRows ? 'scope' : 'display-unit', units);\n if (units.length) {\n const val = units[units.length - 1][1];\n if (val === 'kg' || val === 'lb') {\n displayUnit = val;\n } else if (isFind || isRows) {\n legacyScope = val;\n } else {\n displayUnit = val;\n }\n }\n\n const rollups = stripRepeated(ROLLUP_RE);\n conflictFrom('.rollup', rollups);\n if (rollups.length) {\n const m = rollups[rollups.length - 1];\n rollup = { size: m[1] ? parseInt(m[1], 10) : 1, unit: m[2] || '', raw: m[1] + m[2] };\n }\n\n const bys = stripRepeated(BY_RE);\n conflictFrom('by', bys);\n if (bys.length) {\n groupBy = bys[bys.length - 1][1]\n .split(',')\n .map((d) => d.trim().toLowerCase())\n .filter(Boolean);\n }\n const inSourceMatches = stripRepeated(IN_SOURCE_RE);\n if (inSourceMatches.length) {\n sourceRef = '@' + inSourceMatches[inSourceMatches.length - 1][1];\n }\n\n return {\n where,\n storedAs,\n sourceRef,\n displayUnit,\n rollup,\n groupBy,\n window,\n legacyScope,\n conflicts: conflicts.length ? conflicts : undefined,\n primaryText: normalizeCommaFilterValues(text),\n };\n}\n\n/** `key:v1,v2` → `key:v1|v2` — the annotation's comma multi-value spelling,\n * rewritten inside the structural filter braces before the grammar parse\n * (the grammar's comma separates filters). A comma merges into the running\n * filter only while the following segment is a bare value — no colon, no\n * quote — so `text:a,feed:x` stays two filters while\n * `source:journal,feeds` becomes one OR. `by {…}` groups are already\n * peeled; quoted segments never merge. */\nfunction normalizeCommaFilterValues(text: string): string {\n const open = text.indexOf('{');\n const close = open === -1 ? -1 : text.lastIndexOf('}');\n if (open === -1 || close <= open) return text;\n const inside = text.slice(open + 1, close);\n if (!inside.includes(',')) return text;\n const parts: string[] = [];\n let current = '';\n let quoted = false;\n for (const ch of inside) {\n if (ch === '\"') quoted = !quoted;\n if (ch === ',' && !quoted) {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n parts.push(current);\n const merged: string[] = [];\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i]!;\n while (i + 1 < parts.length) {\n const next = parts[i + 1]!.trim();\n if (next && !next.includes(':') && !next.includes('\"')) {\n part = `${part}|${next}`;\n i++;\n } else break;\n }\n merged.push(part);\n }\n return `${text.slice(0, open + 1)}${merged.join(',')}${text.slice(close)}`;\n}\n","/**\n * WQL — Wod Query Language (Datadog-flavored). See CONTEXT.md glossary.\n *\n * <aggregator>:<metric.namespace>{<tag filters>} by {<dimensions>} .rollup(<period>)\n *\n * sum:totalVolume{discipline:strength} by {week}\n * avg:tis{effort:thruster,!discipline:recovery} by {session}\n *\n * This module holds the AST contract the Query Service executes and the\n * Lezer-backed `parseQuery` front-end over grammar/wql.grammar (house\n * pattern). The grammar accepts the full WQL surface with error recovery;\n * this mapper validates the recovered tree and produces the AST below.\n */\n\nimport { parser as wqlParser } from './grammar/wql.parser';\nimport type { SyntaxNode } from '@lezer/common';\nimport * as terms from './grammar/wql.parser.terms';\nimport {\n WQL_AGGREGATORS,\n WQL_CHART_HEADS,\n WQL_CONTENT_ONLY_KEYS,\n WQL_EFFORT_FILTER_KEYS,\n WQL_FIND_TARGETS,\n WQL_FUNCTION_HEADS,\n WQL_SOURCE_HEADS,\n WQL_SOURCE_HEAD_SCOPES,\n WQL_SOURCE_VALUES,\n WQL_TYPE_HEADS,\n type WqlAggregator,\n type WqlChartHead,\n WQL_TAG_KEYS,\n type WqlComparisonOp,\n} from './vocabulary';\nimport { parseWqlSuffixes, splitAtWhere, type ParsedWqlWindowSuffix } from './wqlSuffix';\nimport { allowedFilterTypesForTarget, supportsWqlFilterKey, wqlFilterKeys, wqlGroupingDimensions } from './capabilities';\n\nexport { WQL_AGGREGATORS, WQL_COMPARISON_OPS, WQL_SOURCE_VALUES } from './vocabulary';\nexport { parseWqlSuffixes, splitAtWhere } from './wqlSuffix';\n\nexport type Aggregator = WqlAggregator;\n\nexport interface TagValue {\n value: string;\n wildcard: boolean;\n}\n\nexport interface TagFilter {\n key: string;\n negate: boolean;\n values: TagValue[];\n}\n\n/** Comparison operator in a cross-store metric predicate (`> 5000`). */\nexport type ComparisonOp = WqlComparisonOp;\n\n/**\n * Analytics half of a cross-store join — the metric predicate attached to a\n * find query via `where`. Example: `sum:totalVolume{discipline:strength} > 5000`.\n * Aggregates are evaluated against RAW WorkoutResult logs (not derived facts),\n * joined at the blockContentId level (\"logs win\", issue #800).\n */\nexport interface MetricPredicate {\n agg: Aggregator;\n metric: string;\n filters: TagFilter[];\n operator: ComparisonOp;\n threshold: number;\n}\n\n/**\n * Content half of a cross-store join — the find predicate attached to an\n * analytics query via `where`. Example: `find:note{tags:competition,source:journal}`.\n * Restricts the metric computation to the blockContentIds owned by matching\n * content; the metric is recomputed from raw logs for those blocks only.\n */\nexport interface FindPredicate {\n target: string;\n filters: TagFilter[];\n last?: { size: number; unit: 'd' | 'w' };\n}\n\n/**\n * Result of parsing an analytics (aggregate) query — `agg:metric{filters} …`.\n * Discriminated union member: `family === 'aggregate'` (C5).\n */\nexport interface ParsedAggregateQuery {\n family: 'aggregate';\n raw: string;\n agg: Aggregator;\n /** Canonical Metric Key (fact row `metricKey`). */\n metric: string;\n filters: TagFilter[];\n /** Tag keys, or virtual dims: day | week | session | round. */\n groupBy: string[];\n rollup?: { size: number; unit: 'd' | 'w' };\n /** Time-selection window (C1): `last 6w` or `from … [to …]`. */\n window?: QueryWindow;\n /** Optional display unit directive — `in kg` / `in lb`. */\n displayUnit?: string;\n /** Cross-store content join (`where find:note{...}`); restricts to raw logs. */\n join?: FindPredicate;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/** Parse `| select col [in unit], … | order by col [asc|desc] | limit n [offset m]`. */\nfunction parseRowsPipes(text: string): RowsPipes {\n const pipes: RowsPipes = {};\n const segments = text.split('|').map((s) => s.trim()).filter(Boolean);\n for (const segment of segments) {\n const lower = segment.toLowerCase();\n if (lower.startsWith('select')) {\n const body = segment.slice(6).trim();\n pipes.select = body.split(',').map((col) => {\n const m = /^([\\w-]+)(?:\\s+in\\s+([\\w/%]+))?$/i.exec(col.trim());\n return m\n ? { col: m[1]!, ...(m[2] ? { unit: m[2] } : {}) }\n : { col: col.trim() };\n });\n } else if (lower.startsWith('order by')) {\n const body = segment.slice(8).trim();\n pipes.order = body.split(',').map((col) => {\n const m = /^(\\S+)(?:\\s+(asc|desc))?$/i.exec(col.trim());\n return { col: m?.[1] ?? col.trim(), dir: (m?.[2]?.toLowerCase() as 'asc' | 'desc') ?? 'asc' };\n });\n } else if (lower.startsWith('limit')) {\n const m = /^limit\\s+(\\d+)(?:\\s+offset\\s+(\\d+))?$/i.exec(segment);\n if (!m) {\n pipes.error = `Cannot parse pipe \"${segment}\". Expected limit <n> [offset <m>]`;\n return pipes;\n }\n pipes.limit = Number(m[1]);\n if (m[2]) pipes.offset = Number(m[2]);\n } else if (lower.startsWith('offset')) {\n const m = /^offset\\s+(\\d+)$/i.exec(segment);\n if (!m) {\n pipes.error = `Cannot parse pipe \"${segment}\". Expected offset <n>`;\n return pipes;\n }\n pipes.offset = Number(m[1]);\n } else {\n pipes.error = `Unknown pipe \"${segment}\". Try: select, order by, limit`;\n return pipes;\n }\n }\n return pipes;\n}\n\n/**\n * Ticket 18 — drill-down: construct a cross-workout `rows:segment` query\n * inheriting an aggregate point's tag/metadata filters, the clicked bucket's\n * EXACT half-open civil boundaries (structural, not display timestamps), and\n * the clicked group tuple as exact filters.\n */\nexport function buildDrillDownQuery(options: {\n filters?: Array<{ key: string; values: readonly string[] }>;\n /** Half-open bucket bounds (ms epoch) from the clicked point's bucket. */\n start?: number;\n end?: number;\n /** Civil dates (YYYY-MM-DD) — used when the point is a calendar bucket. */\n startIso?: string;\n endIso?: string;\n timeZone?: string;\n limit?: number;\n}): string {\n const parts: string[] = [];\n const filterText = (options.filters ?? [])\n .map((f) => `${f.key}:${f.values.join('|')}`)\n .join(',');\n parts.push(`:segment{${filterText}}`);\n if (options.startIso && options.endIso) parts.push(`from ${options.startIso} to ${options.endIso}`);\n else if (options.start !== undefined && options.end !== undefined && options.timeZone) {\n const fmt = (ts: number, tz: string) => new Intl.DateTimeFormat('en-CA', { timeZone: tz, year: 'numeric', month: '2-digit', day: '2-digit' }).format(ts);\n parts.push(`from ${fmt(options.start, options.timeZone)} to ${fmt(options.end - 1, options.timeZone)}`);\n }\n let query = parts.join(' ');\n if (options.limit !== undefined) query += ` | limit ${options.limit}`;\n return query;\n}\n\n/** Result of parsing a content-discovery query — the colon source heads\n * (`:note{…}`, `:journal{…}`); the legacy `find:` spelling is retired and\n * survives only inside `where` join halves. */\nexport interface ParsedFindQuery {\n family: 'find';\n raw: string;\n /** Content target — a WQL_FIND_TARGETS value (C7 closed enum). */\n target: string;\n filters: TagFilter[];\n /** Implicit default source scope for the generic `:note` head —\n * journal | feeds | playground. NOT a filter: authored filters stay\n * untouched (composer pills never see it); the executor ANDs it in only\n * when no explicit `source:` filter was written. */\n sourceScope?: string[];\n /** Time-selection window (C1): `last 8w` or `from … [to …]`. */\n window?: QueryWindow;\n /** Cross-store metric join (`where sum:totalVolume{} > 5000`). */\n join?: MetricPredicate;\n /** Presentation pipes (`| select … | order by … | limit …`). */\n pipes?: RowsPipes;\n /** Group-by dimensions (`by {effort}`). */\n groupBy?: string[];\n /** Optional display unit directive (`in kg` / `in lb`). */\n displayUnit?: string;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/**\n * Time-selection window (C1) — legal on every query family. `last <n><d|w>`\n * is relative; `from <YYYY-MM-DD> [to <YYYY-MM-DD>]` is a civil-date range\n * (local-midnight semantics, inclusive end day). One window per query;\n * `last` and `from` are mutually exclusive (C3-style conflict).\n */\nexport type QueryWindow =\n | { kind: 'relative'; size: number; unit: 'd' | 'w' }\n | { kind: 'range'; start: string; end?: string };\n\nexport type AnyParsedQuery = ParsedAggregateQuery | ParsedFindQuery | ParsedPipelineQuery;\n\n/** Type guard: true for content-discovery queries. */\nexport function isFindQuery(parsed: AnyParsedQuery): parsed is ParsedFindQuery {\n return parsed.family === 'find';\n}\n\n/** Type guard: true for analytics (aggregate) queries. */\nexport function isAggregateQuery(parsed: AnyParsedQuery): parsed is ParsedAggregateQuery {\n return parsed.family === 'aggregate';\n}\n\n/** Type guard: true for left-to-right value pipelines (`:src | :fn | :chart`). */\nexport function isPipelineQuery(parsed: AnyParsedQuery): parsed is ParsedPipelineQuery {\n return parsed.family === 'pipeline';\n}\n\n/** A pipeline's input: a full single query, or a named dataset\n * (`@session` / `@today` / a host-registered page source — name keeps `@`). */\nexport type PipelineSource =\n | { kind: 'query'; query: ParsedFindQuery | ParsedAggregateQuery }\n | { kind: 'dataset'; name: string };\n\n/** Terminal chart stage of a pipeline: the chart head plus its authored\n * parameter filters (`:bar{type:session}` → `{head:'bar', filters:[…]}`). */\nexport interface PipelineSink {\n head: WqlChartHead;\n filters: TagFilter[];\n}\n\n/**\n * Left-to-right value pipeline (`:journal{…} last 8w | :sum{metric:tis} | :timeseries{}`).\n * Transforms apply in order to the previous stage's output — the executor\n * reduces in memory, it never rescans stores. A dataset alone (`@today`) is\n * a pipeline with no transforms; a lone chart head starts from an implicit\n * `:segment` source.\n */\nexport interface ParsedPipelineQuery {\n family: 'pipeline';\n raw: string;\n source: PipelineSource;\n /** Ordered aggregate stages, each applied to the previous stage's rows. */\n transforms: ParsedAggregateQuery[];\n sink?: PipelineSink;\n /** Parse-time disclosures (ignored chart suffixes, …). */\n advisories?: string[];\n error?: string;\n}\n\nexport interface SeriesPoint {\n ts: number;\n value: number;\n /** True for a structurally present bucket with no recorded observations\n * (ticket 12 calendar domain generation) — display zero-fill, never an\n * observation. */\n missing?: boolean;\n}\n\n/**\n * Result of parsing a rows query (`rows:{filters}` / `rows:segment{filters}`) —\n * the third WQL family (ADR docs/adr/rows-query-plane.md, #949): raw\n * output-statement rows re-derived from WorkoutResult logs, scoped by\n * `result:` / `block:` / `note:`. Never aggregates — no by/rollup/where.\n */\n/** Ticket 18 — pipe clauses: presentation only, never alter the match. */\nexport interface RowsPipes {\n error?: string;\n select?: Array<{ col: string; unit?: string }>;\n order?: Array<{ col: string; dir: 'asc' | 'desc' }>;\n limit?: number;\n offset?: number;\n}\n\nexport interface ParsedRowsQuery {\n /** Ticket 18 — pipe clauses (| select / | order by / | limit). */\n pipes?: RowsPipes;\n raw: string;\n /** Family discriminator shared by all three query ASTs (C5). */\n family: 'rows';\n /** Output-statement type narrowing from the optional target (`rows:segment{…}`); undefined = all types. */\n outputType?: string;\n /** The rows target itself — 'all' | 'segment' | content plane (ticket 18:\n * segment without scope = cross-workout form). */\n target?: string;\n filters: TagFilter[];\n /** Time-selection window (C1): `last 4w` or `from … [to …]` over the\n * workout end time. */\n window?: QueryWindow;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/** One aggregated series. `error` carries the diagnostic when this series'\n * calculation failed (ticket 13) — an errored series has no valid values. */\nexport interface Series { key: string; label: string; points: SeriesPoint[]; unit?: string; error?: string }\n/** Aggregate head vocabulary is owned by vocabulary.ts (#871). */\nconst AGGS: readonly Aggregator[] = WQL_AGGREGATORS;\n\nfunction cannotParse(text: string): string {\n return `Cannot parse \"${text}\". Expected agg:metric{filters} by {dims} .rollup(period)`;\n}\n// ── Cross-store `where` joins (#800) ───────────────────────────────\n//\n// `where` is the join glue between a content query and an analytics query.\n// Like `in <scope>` / `last <n>w` / `in <unit>`, it is stripped in JS rather\n// than lexed: a top-level WhereClause node ending in a free `Word` would\n// reintroduce the token-overlap conflict documented at the top of the\n// grammar. The split is brace-aware so a `where` inside `{filters}` (a tag\n// value such as `text:where`) is never mistaken for the join.\n\n/** Comparison predicate at the tail of a metric join: `<op> <number>`. */\nconst CMP_RE = /^(.+?)\\s*(>=|<=|!=|==|>|<)\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/;\n\nfunction cannotParseJoin(text: string): string {\n return `Cannot parse join \"${text}\". Expected :source{filters} or find:target{filters}, or agg:metric{filters} <op> <number>`;\n}\n\n/**\n * Parse the `where` clause of a cross-store join — the OTHER half of the\n * query. A find predicate on an analytics query (`where find:note{tags:x}`),\n * or a metric predicate on a find query (`where sum:totalVolume{} > 5000`).\n * Both halves reuse the same Lezer Head→Filters grammar; the join keyword is\n * JS-stripped, so no grammar change is required.\n */\nfunction parseJoinClause(where: string): { metric?: MetricPredicate; find?: FindPredicate; advisories?: string[]; error?: string } {\n const t = where.trimStart();\n const headName = /^:?([a-zA-Z0-9_-]+)/.exec(t)?.[1]?.toLowerCase() ?? '';\n // Content half: legacy `find:…` or a colon source head `:note{…}`.\n if (t.startsWith('find:') || (t.startsWith(':') && (WQL_SOURCE_HEADS as readonly string[]).includes(headName))) {\n const fp = parseFindQuery(where, { colon: t.startsWith(':') });\n if (fp.error) return { error: fp.error };\n if (fp.window?.kind === 'range') {\n return { error: 'Range windows are not supported on join halves — use last <n>d|w' };\n }\n return {\n find: { target: fp.target, filters: fp.filters, last: fp.window?.kind === 'relative' ? { size: fp.window.size, unit: fp.window.unit } : undefined },\n advisories: fp.advisories,\n };\n }\n const m = CMP_RE.exec(where.trim());\n if (!m) return { error: cannotParseJoin(where) };\n const head = parseAggregateQuery(m[1].trim(), { colon: m[1]!.trimStart().startsWith(':') });\n if (head.error) return { error: head.error };\n return {\n metric: {\n agg: head.agg,\n metric: head.metric,\n filters: head.filters,\n operator: m[2] as ComparisonOp,\n threshold: parseFloat(m[3]),\n },\n };\n}\n\n/**\n * Parse a WQL query string into one of the three query families —\n * analytics aggregate, content find, or rows — discriminated by `family`\n * (C5). Dispatch is textual: a leading `find:` routes to the content path,\n * `rows` to the rows path, everything else to analytics.\n */\nexport function rowsParseError(raw: string): string {\n const m = /^rows(?::(\\w+))?\\{([^}]*)\\}/.exec(raw);\n if (!m) {\n return 'The \"rows:\" query family is retired — use :session, :segment, or :event instead.';\n }\n const target = m[1] ?? 'all';\n const inner = m[2].trim();\n if (target === 'all' || ['note', 'block', 'effort', 'page'].includes(target)) {\n return `rows:${target}{…} is retired — use :session{${inner}} instead.`;\n }\n if (target === 'segment' && !inner.includes('result:') && !inner.includes('block:') && !inner.includes('note:')) {\n return `rows:segment{…} is retired — use :segment{${inner}} instead.`;\n }\n if (target === 'event') {\n return `rows:event{…} is retired — use :event{${inner}} instead.`;\n }\n const planePart = inner ? `${inner}, plane:${target}` : `plane:${target}`;\n return `rows:${target}{…} is retired — use :session{${planePart}} instead.`;\n}\n\n// ── Colon heads & pipelines ─────────────────────────────────────────\n\n/** True when a pipe segment is a rows presentation clause, not a stage. */\nconst ROW_PIPE_RE = /^\\s*(?:select|order\\s+by|limit|offset)\\b/i;\n\n/** Split at top-level `|` — brace- AND quote-aware, so OR alternatives and\n * quoted phrases inside filters never become stage separators. */\nfunction splitTopPipes(raw: string): string[] {\n const segments: string[] = [];\n let depth = 0;\n let quoted = false;\n let start = 0;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === '|' && depth === 0) { segments.push(raw.slice(start, i)); start = i + 1; }\n }\n segments.push(raw.slice(start));\n return segments;\n}\n\n/** The leading colon/dataset head of a segment: `:name` or `@name`. */\nfunction leadingHeadName(segment: string): { name: string; dataset: boolean } | undefined {\n const m = /^\\s*([:@])([a-zA-Z0-9_-]+)/.exec(segment);\n return m ? { name: m[2]!.toLowerCase(), dataset: m[1] === '@' } : undefined;\n}\n\nfunction cannotParsePipeline(text: string): string {\n return `Cannot parse pipeline \"${text}\". Expected :source{filters} | :function{metric:key} | :chart{params} or @dataset | :function{…}`;\n}\n\n/** Retired `find:` primary — the family stays for narrowing; the message names the colon spelling. */\nfunction retiredFindQuery(raw: string): ParsedFindQuery {\n const head = /^find:([a-zA-Z0-9_-]*)/.exec(raw.trim())?.[1] ?? '';\n return {\n family: 'find',\n raw,\n target: '',\n filters: [],\n error: `The \"find:\" query family is retired — use the :${head || 'note'}{…} colon head instead.`,\n };\n}\n\n/** Single-stage query: legacy `agg:metric` head or a colon source/function head. */\nfunction parseSingleQuery(raw: string): AnyParsedQuery {\n const norm = normalizeWql(raw);\n const head = leadingHeadName(norm.query);\n let result: AnyParsedQuery;\n if (head && !head.dataset) {\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(head.name)) {\n result = parseAggregateQuery(norm.query, { colon: true });\n } else if ((WQL_SOURCE_HEADS as readonly string[]).includes(head.name)) {\n result = parseFindQuery(norm.query, { colon: true });\n } else {\n // Unknown colon word — let the source-head parser name it through\n // the closed target enum (Unknown find target \"…\").\n result = parseFindQuery(norm.query, { colon: true });\n }\n } else {\n result = parseAggregateQuery(norm.query, { colon: false });\n }\n if (norm.advisories.length) {\n result.advisories = [...new Set([...(result.advisories ?? []), ...norm.advisories])];\n }\n result.raw = raw;\n return result;\n}\n\n/**\n * Parse a WQL query string into one of the query families — analytics\n * aggregate, content find, or pipeline — discriminated by `family` (C5).\n * Dispatch: `rows` is a retired-error; `find:` is retired; a pipe-separated\n * stage list (or a lone `@dataset`/chart head) is a pipeline; a colon\n * source/function head or legacy `agg:metric` head parses as a single query.\n */\nexport function parseQuery(raw: string): AnyParsedQuery {\n const trimmed = raw.trimStart();\n if (/^rows(?=[:{]|\\s|$)/.test(trimmed)) {\n return {\n family: 'find',\n raw,\n target: '',\n filters: [],\n error: rowsParseError(raw.trim()),\n };\n }\n if (/^find:/.test(trimmed)) return retiredFindQuery(raw);\n const segments = splitTopPipes(raw);\n const first = segments[0]!;\n // Trailing `| select / order by / limit / offset` are presentation pipes on\n // a single query (existing families), not pipeline stages.\n if (segments.length > 1 && !ROW_PIPE_RE.test(first)\n && segments.slice(1).every((s) => ROW_PIPE_RE.test(s.trim()))) {\n return parseSingleQuery(raw);\n }\n const head = leadingHeadName(first);\n if (segments.length > 1 || (head && (head.dataset\n || (WQL_CHART_HEADS as readonly string[]).includes(head.name)))) {\n return parsePipelineQuery(raw, segments);\n }\n return parseSingleQuery(raw);\n}\n\n/**\n * C2 Compatibility normalizer: rewrites legacy query syntax into modern WQL.\n * - Legacy trailing `in <scope>` rewrites into `{source:<scope>}`\n * Returns the normalized query string and any deprecation advisories.\n */\nexport function normalizeWql(raw: string): { query: string; advisories: string[] } {\n const advisories: string[] = [];\n let text = raw.trim();\n\n const { primary, where } = splitAtWhere(text);\n const isFind = primary.startsWith('find:');\n if (isFind) {\n const suffixes = parseWqlSuffixes(primary);\n if (suffixes.legacyScope && !suffixes.conflicts?.length) {\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n const scope = suffixes.legacyScope;\n let head = suffixes.primaryText.trim();\n if (scope !== 'all') {\n const braceOpen = head.indexOf('{');\n const braceClose = head.lastIndexOf('}');\n if (braceOpen !== -1 && braceClose !== -1 && braceClose > braceOpen) {\n const beforeBrace = head.slice(0, braceOpen + 1);\n const inside = head.slice(braceOpen + 1, braceClose).trim();\n const afterBrace = head.slice(braceClose);\n const newInside = inside ? `${inside},source:${scope}` : `source:${scope}`;\n head = `${beforeBrace}${newInside}${afterBrace}`;\n } else {\n head = `${head}{source:${scope}}`;\n }\n }\n const parts: string[] = [head];\n if (suffixes.groupBy) {\n parts.push(`by {${suffixes.groupBy.join(', ')}}`);\n }\n if (suffixes.rollup) {\n parts.push(`.rollup(${suffixes.rollup.raw})`);\n }\n if (suffixes.window) {\n parts.push(suffixes.window.raw);\n }\n if (where) {\n parts.push(`where ${where}`);\n }\n text = parts.join(' ');\n }\n }\n\n return { query: text, advisories };\n}\n\n/** Validate source: filter values against canonical sources and catalog literals (C2). */\nfunction validateSourceFilter(filters: TagFilter[]): string | undefined {\n for (const f of filters) {\n if (f.key !== 'source') continue;\n for (const v of f.values) {\n const val = v.value;\n if (val === 'page' || val === 'pages') {\n return `source:${val} is retired — page-ness is handled by type: (e.g. type:feed or source:guides).`;\n }\n if (val === 'all') {\n return `source:all is retired — omit the source: filter to query all sources.`;\n }\n if (val === 'collection' || val === 'collections') {\n return `source:${val} is retired — collections were renamed to feeds; use source:feeds or :feed{}.`;\n }\n if (\n (WQL_SOURCE_VALUES as readonly string[]).includes(val) ||\n val === 'feed' ||\n val.startsWith('collection:') ||\n val.startsWith('feed:')\n ) {\n continue;\n }\n return `Unknown source \"${val}\". Try: ${WQL_SOURCE_VALUES.join(', ')} (or collection:<id>, feed:<id>)`;\n }\n }\n return undefined;\n}\n\n/** Extract pipe clauses (| select … | order by … | limit …) outside braces\n * and quotes — an OR `a|b` or quoted `\"x|y\"` inside filters is a value. */\nfunction extractPipes(raw: string): { text: string; pipes?: RowsPipes } {\n let pipeIndex = -1;\n let depth = 0;\n let quoted = false;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === '|' && depth === 0) {\n pipeIndex = i;\n break;\n }\n }\n if (pipeIndex !== -1) {\n const pipeText = raw.slice(pipeIndex + 1);\n const text = raw.slice(0, pipeIndex).trimEnd();\n const pipes = parseRowsPipes(pipeText);\n return { text, pipes };\n }\n return { text: raw };\n}\n\n\n/** True when `s` is a real civil date in YYYY-MM-DD form (rejects 02-30,\n * month 13, etc. via Date component round-trip). */\nfunction isCivilDate(s: string): boolean {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (!m) return false;\n const y = Number(m[1]);\n const mo = Number(m[2]);\n const d = Number(m[3]);\n const dt = new Date(y, mo - 1, d);\n return dt.getFullYear() === y && dt.getMonth() === mo - 1 && dt.getDate() === d;\n}\n\n/** Map the suffix-layer window to the AST window, validating civil dates. */\nfunction toQueryWindow(w: ParsedWqlWindowSuffix | undefined): { window?: QueryWindow; error?: string } {\n if (!w) return {};\n if (w.kind === 'relative') {\n return { window: { kind: 'relative', size: w.size, unit: w.unit } };\n }\n for (const d of [w.start, w.end]) {\n if (d !== undefined && !isCivilDate(d)) {\n return { error: `Invalid window date \"${d}\" — expected a real calendar date YYYY-MM-DD` };\n }\n }\n return { window: { kind: 'range', start: w.start, end: w.end } };\n}\n\n/** Ticket 003: grain:rollup is retired — rollup grains are never stored\n * under the unified model; they are computed at read time via the\n * .rollup suffix. The tag would silently match zero rows. */\nfunction retiredGrainRollup(filters: TagFilter[]): string | undefined {\n if (filters.some(f => f.key === 'grain' && f.values.some(v => v.value === 'rollup'))) {\n return 'grain:rollup is retired — rollup grains are never stored; compute them with the .rollup suffix';\n }\n return undefined;\n}\n\n/** Shared filter extraction from a Lezer Query top node. */\nfunction extractFilters(query: SyntaxNode, text: string): TagFilter[] {\n const out: TagFilter[] = [];\n const filters = query.getChild(terms.Filters);\n if (!filters) return out;\n for (const filter of filters.getChildren(terms.Filter)) {\n const keyNode = filter.getChild(terms.TagKey);\n const valueNode = filter.getChild(terms.TagValue);\n if (!keyNode || !valueNode) continue;\n const values: { value: string; wildcard: boolean }[] = [];\n for (const valueChild of valueNode.getChildren(terms.Value)) {\n // Each Value is `Word(:Word)?Star?` or a quoted phrase `\"...\"` per the\n // grammar. Slice its source text; a quoted node (#867) carries its\n // surrounding quotes (stripped here), a word value strips a trailing\n // wildcard — the colon stays in the value when the grammar accepts a\n // catalog-id style literal like `collection:crossfit-girls` for the\n // `source:` filter.\n const raw = text.slice(valueChild.from, valueChild.to);\n const quoted = valueChild.getChild(terms.Quoted) !== null;\n let value = quoted ? raw.slice(1, -1) : raw;\n const wildcard = quoted ? false : value.endsWith('*');\n if (wildcard) value = value.slice(0, -1);\n if (!value) continue;\n values.push({ value, wildcard });\n }\n if (values.length === 0) continue;\n out.push({\n key: text.slice(keyNode.from, keyNode.to),\n negate: filter.getChild(terms.Negate) !== null,\n values,\n });\n }\n return out;\n}\n\n/** Tree helpers over the Single/Pipeline grammar: a single query parses as\n * Query → Single → Stage → Head Filters?. */\nfunction queryStageNode(top: SyntaxNode): SyntaxNode | undefined {\n return top.getChild(terms.Single)?.getChild(terms.Stage) ?? top.getChild(terms.Stage) ?? undefined;\n}\n\nfunction cannotParseFunction(text: string): string {\n return `Cannot parse \"${text}\". Expected :function{metric:<key>, filters} by {dims} .rollup(period) — e.g. :sum{metric:tis}`;\n}\n\n/**\n * Parse an analytics query: the legacy `agg:metric{filters}` head (retained\n * numerical syntax) or the colon function head `:sum{metric:tis, …}` where\n * the metric is extracted from the filters (and excluded from fact filters).\n * `:count{}` without `metric:` is legal — it counts observations in scope.\n */\nfunction parseAggregateQuery(raw: string, opts: { colon: boolean; inheritedMetric?: string }): ParsedAggregateQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, displayUnit, groupBy, rollup, window: windowSuffix, primaryText: text } = suffixes;\n const win = toQueryWindow(windowSuffix);\n\n const base: ParsedAggregateQuery = {\n family: 'aggregate',\n raw,\n agg: 'sum',\n metric: '',\n filters: [],\n groupBy: groupBy ?? [],\n displayUnit,\n rollup: rollup ? { size: rollup.size, unit: rollup.unit as 'd' | 'w' } : undefined,\n window: win.window,\n };\n if (win.error) {\n base.error = win.error;\n return base;\n }\n if (suffixes.conflicts?.length) {\n base.error = suffixes.conflicts.join('; ');\n return base;\n }\n\n // Validate rollup unit if a rollup suffix was present\n if (rollup) {\n if (rollup.unit !== 'd' && rollup.unit !== 'w') {\n base.error = cannotParse(text);\n return base;\n }\n if ((rollup.unit === 'd' || rollup.unit === 'w') && rollup.size === 1) {\n base.error = `.rollup(1${rollup.unit}) is retired — use by {${rollup.unit === 'd' ? 'day' : 'week'}} instead.`;\n return base;\n }\n }\n\n const tree = wqlParser.parse(text);\n\n // Lezer recovers from malformed input by inserting ⚠ nodes — any of them\n // means the query is not the WQL surface.\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n base.error = cannotParse(text);\n return base;\n }\n\n const query = tree.topNode;\n const stage = queryStageNode(query);\n const head = stage?.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n base.filters = stage ? extractFilters(stage, text) : [];\n if (opts.colon) {\n // Colon function head — `:sum{metric:tis, …}`: the aggregate name is the\n // head word; the metric rides the `metric:` filter and is pulled out of\n // the fact filters.\n const word = head?.getChild(terms.Word);\n if (!head || !word) {\n base.error = cannotParseFunction(text);\n return base;\n }\n const fn = text.slice(word.from, word.to).toLowerCase();\n if (!(WQL_FUNCTION_HEADS as readonly string[]).includes(fn)) {\n base.error = `Unknown function \":${fn}\". Try: ${WQL_FUNCTION_HEADS.join(', ')}`;\n return base;\n }\n base.agg = fn as Aggregator;\n const metricFilters = base.filters.filter((f) => f.key === 'metric');\n base.filters = base.filters.filter((f) => f.key !== 'metric');\n const mf = metricFilters[0];\n if (!mf) {\n // :count{} counts observations in scope; a bare numeric function in a\n // pipeline inherits the previous stage's metric; standalone it errors.\n if (fn !== 'count' && opts.inheritedMetric === undefined) {\n base.error = `:${fn} requires 'metric:<key>' — e.g. :${fn}{metric:tis}`;\n return base;\n }\n base.metric = fn === 'count' ? '' : opts.inheritedMetric!;\n } else if (mf.negate || metricFilters.length > 1 || mf.values.length !== 1 || mf.values[0]!.wildcard) {\n base.error = `:${fn} takes a single 'metric:<key>' clause — no negation, OR values, or wildcards`;\n return base;\n } else {\n base.metric = mf.values[0]!.value;\n }\n } else {\n // Legacy head — agg:metric. Unknown aggregators are a semantic error,\n // reported exactly like the reference parser (metric left empty).\n if (!stage || !head || !aggNode || !metricNode) {\n base.error = cannotParse(text);\n return base;\n }\n const aggText = text.slice(aggNode.from, aggNode.to);\n if (!AGGS.includes(aggText as Aggregator)) {\n base.error = `Unknown aggregator \"${aggText}\". Try: ${AGGS.join(', ')}`;\n return base;\n }\n base.agg = aggText as Aggregator;\n base.metric = text.slice(metricNode.from, metricNode.to);\n }\n\n // Content-plane keys on an aggregate are a category error — a fact row\n // has no note text or source. Every other non-structural key is a\n // candidate custom dimension resolved at runtime (factTagValue falls\n // back to row.dimensions), so it is NOT rejected here.\n const contentKeys = base.filters.map(f => f.key).filter(k => (WQL_CONTENT_ONLY_KEYS as readonly string[]).includes(k));\n if (contentKeys.length > 0) {\n base.error = `Content filter key(s) ${contentKeys.map(k => `\"${k}\"`).join(', ')} cannot narrow an aggregate — facts carry effort/dimension data, not note text. Aggregate dims: ${WQL_TAG_KEYS.join(', ')}, plus any custom dimension.`;\n return base;\n }\n const grainError = retiredGrainRollup(base.filters);\n if (grainError) { base.error = grainError; return base; }\n if (whereText) {\n const join = parseJoinClause(whereText);\n if (join.error) {\n base.error = join.error;\n return base;\n }\n if (join.advisories?.length) {\n base.advisories = [...(base.advisories ?? []), ...join.advisories];\n }\n // An analytics query joins on a content (find:) clause — a metric half\n // here would be `sum:x{} where sum:y{}`, a no-op nonsensical join.\n if (!join.find) {\n base.error = `Cross-store join on an analytics query must be find:…, got \"${whereText}\"`;\n return base;\n }\n base.join = join.find;\n }\n return base;\n}\n\n// ── Find query parsing ──────────────────────────────────────────────\n\nfunction cannotParseFind(text: string): string {\n return `Cannot parse \"${text}\". Expected :source{key:value, !key:value}; filters are optional. Optional suffixes include by {dimension}, last <n>d or last <n>w, from YYYY-MM-DD [to YYYY-MM-DD], where <aggregator>:<metric>{filters} <operator> <number>, and | order by <column> | limit <n>. Support depends on the target.`;\n}\n\nfunction parseFindQuery(raw: string, opts?: { colon?: boolean }): ParsedFindQuery {\n const { text: rawNoPipes, pipes } = extractPipes(raw);\n const suffixes = parseWqlSuffixes(rawNoPipes);\n const { where: whereText, window: windowSuffix, legacyScope, groupBy, displayUnit, primaryText: text } = suffixes;\n const win = toQueryWindow(windowSuffix);\n const advisories: string[] = [];\n if (legacyScope) {\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n }\n const result: ParsedFindQuery = {\n family: 'find',\n raw,\n target: '',\n filters: [],\n window: win.window,\n ...(pipes ? { pipes } : {}),\n ...(groupBy ? { groupBy } : {}),\n ...(displayUnit ? { displayUnit } : {}),\n ...(advisories.length ? { advisories } : {}),\n };\n if (win.error) {\n result.error = win.error;\n return result;\n }\n if (pipes?.error) {\n result.error = pipes.error;\n return result;\n }\n if (suffixes.conflicts?.length) {\n result.error = suffixes.conflicts.join('; ');\n return result;\n }\n // Parse structural part: `:<target>{filters}` (or legacy `find:<target>`).\n const tree = wqlParser.parse(text);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n result.error = cannotParseFind(text);\n return result;\n }\n\n const stage = queryStageNode(tree.topNode);\n const head = stage?.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n let headName: string;\n if (opts?.colon) {\n const word = head?.getChild(terms.Word);\n if (!stage || !head || !word) {\n result.error = cannotParseFind(text);\n return result;\n }\n headName = text.slice(word.from, word.to).toLowerCase();\n } else {\n if (!stage || !head || !aggNode || !metricNode) {\n result.error = cannotParseFind(text);\n return result;\n }\n // The legacy dispatch keyword must be \"find\".\n const aggText = text.slice(aggNode.from, aggNode.to);\n if (aggText !== 'find') {\n result.error = `Expected \"find:\" but got \"${aggText}:\"`;\n return result;\n }\n headName = text.slice(metricNode.from, metricNode.to);\n }\n\n const scope = WQL_SOURCE_HEAD_SCOPES[headName];\n const typeScope = WQL_TYPE_HEADS[headName];\n if (scope || typeScope) {\n // Scoped note head: the head IS the scope, injected as authored filters\n // (they intersect any explicit source:/type: — plain AND).\n result.target = 'note';\n } else {\n result.target = headName;\n if (result.target === 'page') {\n result.error = 'find:page is retired — page-ness is handled by type: (e.g. :note{source:guides} or type:feed).';\n return result;\n }\n // C7: closed target enum — unknown targets error at parse instead of\n // silently returning empty at runtime.\n if (!(WQL_FIND_TARGETS as readonly string[]).includes(result.target)) {\n result.error = `Unknown find target \"${result.target}\". Try: ${WQL_FIND_TARGETS.join(', ')}`;\n return result;\n }\n }\n result.filters = extractFilters(stage, text);\n if (typeScope) {\n // Position 0 is the head-authored slot — the serializer's alias-head\n // collapse expects the injected filter first, matching the parse shape\n // of `:dashboard{…}` (authored filters follow).\n result.filters.unshift({\n key: 'type',\n negate: false,\n values: [{ value: typeScope, wildcard: false }],\n });\n }\n if (scope) {\n result.filters.push({\n key: 'source',\n negate: false,\n values: [{ value: scope, wildcard: false }],\n });\n if (headName === 'catalog' || headName === 'catalogs') {\n result.filters.push({\n key: 'type',\n negate: false,\n values: [{ value: 'feed', wildcard: false }],\n });\n }\n }\n // Colon heads treat a trailing non-unit `in <word>` as the legacy scope\n // clause (the suffix layer files it under display-unit for non-find text).\n const inScope = opts?.colon && result.displayUnit && result.displayUnit !== 'kg' && result.displayUnit !== 'lb'\n ? result.displayUnit\n : legacyScope;\n if (opts?.colon && inScope) {\n delete result.displayUnit;\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n }\n if (inScope && inScope !== 'all') {\n result.filters.push({\n key: 'source',\n negate: false,\n values: [{ value: inScope, wildcard: false }],\n });\n }\n // The generic `:note` head carries NO default scope — it is the inclusive\n // note plane (every row; authored source: filters and negations scope it).\n // WQL_NOTE_DEFAULT_SOURCES remains exported (empty) for the serializer.\n const sourceError = validateSourceFilter(result.filters);\n if (sourceError) { result.error = sourceError; return result; }\n const findGrainError = retiredGrainRollup(result.filters);\n if (findGrainError) { result.error = findGrainError; return result; }\n const target = result.target;\n if (suffixes.rollup) advisories.push(`:${target} ignores '.rollup(...)'; rollup is supported by aggregate queries.`);\n if (whereText) {\n const join = parseJoinClause(whereText);\n if (join.error) {\n result.error = join.error;\n return result;\n }\n // A find query joins on a metric predicate — a find half here would be\n // `find:note where find:block{}`, a no-op nonsensical join.\n if (!join.metric) {\n result.error = `Cross-store join on a find query must be agg:metric{} <op> <number>, got \"${whereText}\"`;\n return result;\n }\n result.join = join.metric;\n }\n const computed = findTargetAdvisories(result);\n if (advisories.length || computed.length) {\n result.advisories = [...new Set([...advisories, ...computed])];\n }\n return result;\n}\n\n// ── Pipeline parsing ────────────────────────────────────────────────\n\n/** Stage classification for pipeline validation. */\ntype StageKind = 'dataset' | 'source' | 'function' | 'chart' | 'unknown';\n\nfunction stageKind(head: { name: string; dataset: boolean } | undefined): StageKind {\n if (!head) return 'unknown';\n if (head.dataset) return 'dataset';\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(head.name)) return 'function';\n if ((WQL_SOURCE_HEADS as readonly string[]).includes(head.name)) return 'source';\n if ((WQL_CHART_HEADS as readonly string[]).includes(head.name)) return 'chart';\n return 'unknown';\n}\n\n/**\n * Parse a left-to-right value pipeline: one input stage (dataset, source or\n * function head), ordered function stages, at most one terminal chart. Every\n * stage keeps its own suffixes (windows/grouping/unit/joins). The stripped\n * stage list re-parses through the Lezer grammar so Head/Pipeline/\n * DatasetReference nodes are the structural authority — a stage that is not\n * a clean head+filters (or a `|` with nothing after it) fails here.\n */\nfunction parsePipelineQuery(raw: string, segments: string[]): ParsedPipelineQuery {\n const advisories: string[] = [];\n const fail = (error: string): ParsedPipelineQuery => ({\n family: 'pipeline',\n raw,\n source: { kind: 'dataset', name: '' },\n transforms: [],\n error,\n });\n\n const heads = segments.map(leadingHeadName);\n const kinds = heads.map(stageKind);\n // The first stage may also be the retained legacy aggregate head\n // (`sum:tis{…} by {session}`) — parse it through the single-query path;\n // anything else headless (row pipes, garbage) fails here.\n let legacySource: ParsedAggregateQuery | undefined;\n if (!heads[0]) {\n if (ROW_PIPE_RE.test(segments[0]!)) {\n return fail('Presentation pipes (| select / order by / limit) apply to a single source query — they cannot sit between pipeline stages.');\n }\n const legacy = parseAggregateQuery(segments[0]!, { colon: false });\n if (legacy.error) return fail(legacy.error);\n legacySource = legacy;\n kinds[0] = 'function';\n }\n for (let i = 0; i < segments.length; i++) {\n if (i === 0 && legacySource) continue;\n const name = heads[i] ? `:${heads[i]!.name}` : `\"${segments[i]!.trim()}\"`;\n if (!heads[i]) {\n return fail(`Empty or unparseable pipeline stage ${name} — check for doubled or trailing \"|\".`);\n }\n if (kinds[i] === 'unknown') {\n return fail(`Unknown pipeline head ${name}. Sources: ${WQL_SOURCE_HEADS.join(', ')}; functions: ${WQL_FUNCTION_HEADS.join(', ')}; charts: ${WQL_CHART_HEADS.join(', ')}.`);\n }\n if (i > 0 && (kinds[i] === 'source' || kinds[i] === 'dataset')) {\n return fail(`Pipeline stage ${name} must come first — a pipeline starts at its source, transforms follow.`);\n }\n if (kinds[i] === 'chart' && i < segments.length - 1) {\n return fail(`Chart head ${name} must be the final pipeline stage — nothing may follow a chart.`);\n }\n }\n\n // Structural gate: the stripped stages must re-parse as a clean Lezer\n // Pipeline (or a lone Stage for the implicit-source single chart).\n const stripped = segments.map((s) => parseWqlSuffixes(s).primaryText.trim());\n const treeText = stripped.join(' | ');\n const tree = wqlParser.parse(treeText);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n const pipelineNode = syntaxError ? undefined : tree.topNode.getChild(terms.Pipeline);\n const singleNode = syntaxError ? undefined : tree.topNode.getChild(terms.Single);\n const stageNodes = pipelineNode\n ? pipelineNode.getChildren(terms.Stage)\n : singleNode\n ? [singleNode.getChild(terms.Stage)].filter((s): s is SyntaxNode => s !== null)\n : [];\n if (!pipelineNode && segments.length > 1) return fail(cannotParsePipeline(raw));\n if (stageNodes.length !== segments.length) return fail(cannotParsePipeline(raw));\n\n const last = segments.length - 1;\n let source: PipelineSource;\n if (kinds[0] === 'dataset') {\n source = { kind: 'dataset', name: '@' + heads[0]!.name };\n } else if (kinds[0] === 'chart') {\n // Lone chart head: implicit `:segment` source — the executor may reject\n // unusable chart/data combinations rather than fabricate values.\n source = { kind: 'query', query: { family: 'find', raw: ':segment{}', target: 'segment', filters: [] } };\n } else {\n const q = kinds[0] === 'function'\n // Leading ':' chooses the colon grammar; the retained legacy\n // `sum:tis{…}` aggregate head stays parseable as a pipeline source.\n ? parseAggregateQuery(segments[0]!, { colon: segments[0]!.trimStart().startsWith(':') })\n : parseFindQuery(segments[0]!, { colon: true });\n if (q.error) return fail(q.error);\n source = { kind: 'query', query: q };\n }\n\n const transforms: ParsedAggregateQuery[] = [];\n // Bare numeric stages reduce the carried stage: `:sum{metric:tis} | :max{}`\n // inherits 'tis' at parse. count keeps its metric-less form; find sources\n // carry no single metric, so a bare function after one errors clearly.\n let carriedMetric: string | undefined =\n source.kind === 'query' && source.query.family === 'aggregate' ? source.query.metric : undefined;\n const lastFunction = kinds[last] === 'chart' ? last - 1 : last;\n for (let i = 1; i <= lastFunction; i++) {\n const t = parseAggregateQuery(segments[i]!, { colon: true, inheritedMetric: carriedMetric });\n if (t.error) return fail(t.error);\n transforms.push(t);\n carriedMetric = t.metric || carriedMetric;\n }\n\n let sink: PipelineSink | undefined;\n if (kinds[last] === 'chart') {\n const chartStage = stageNodes[last]!;\n const word = chartStage.getChild(terms.Head)?.getChild(terms.Word);\n if (!word) return fail(cannotParsePipeline(raw));\n const chartHead = treeText.slice(word.from, word.to).toLowerCase();\n if (!(WQL_CHART_HEADS as readonly string[]).includes(chartHead)) {\n return fail(`Unknown chart head \":${chartHead}\". Try: ${WQL_CHART_HEADS.join(', ')}`);\n }\n const chartSuffixes = parseWqlSuffixes(segments[last]!);\n if (chartSuffixes.window || chartSuffixes.rollup || chartSuffixes.groupBy\n || chartSuffixes.displayUnit || chartSuffixes.where || chartSuffixes.legacyScope) {\n advisories.push(`:${chartHead} ignores query suffixes — apply windows and grouping to the source or function stages.`);\n }\n sink = { head: chartHead as WqlChartHead, filters: extractFilters(chartStage, treeText) };\n }\n\n const result: ParsedPipelineQuery = {\n family: 'pipeline',\n raw,\n source,\n transforms,\n ...(sink ? { sink } : {}),\n ...(advisories.length ? { advisories } : {}),\n };\n return result;\n}\n\n/**\n * Target-capability advisories for a find AST: every clause the executor will\n * silently drop, apply differently than written, or group outside the\n * executor. A pure function of the parsed shape — `parseFindQuery` attaches\n * these at parse time and `QueryService.runFind` re-derives them, so\n * hand-built ASTs get the same loud disclosure without re-serializing text.\n */\nexport function findTargetAdvisories(query: ParsedFindQuery): string[] {\n const advisories: string[] = [];\n const target = query.target;\n const supported = allowedFilterTypesForTarget(target, 'find');\n const ignored = [...new Set(query.filters.filter(f => !supportsWqlFilterKey(target, 'find', f.key)).map(f => f.key))];\n if (ignored.length) {\n const custom = target === 'segment' || target === 'event' ? ', custom fact dimensions' : '';\n const effortKey = ignored.find(key => (WQL_EFFORT_FILTER_KEYS as readonly string[]).includes(key));\n const recovery = effortKey && target !== 'effort' ? ` To filter by ${effortKey}, use :effort{${effortKey}:…}.` : '';\n advisories.push(`:${target} ignores ${ignored.map(key => `'${key}:'`).join(', ')} — the filter is not applied.${recovery} Supported keys: ${wqlFilterKeys(target, 'find').join(', ')}${custom}.`);\n }\n for (const filter of query.filters) {\n if (ignored.includes(filter.key)) continue;\n const scope = ['result', 'block', 'note'].includes(filter.key);\n const negationIgnored = target === 'note'\n ? ['effort', 'text', 'type', 'domain', 'format', 'equipment', 'quality', 'intent'].includes(filter.key)\n : target === 'block' ? ['text', 'type', 'tags', 'effort'].includes(filter.key)\n : (target === 'session' || target === 'segment' || target === 'event') && scope;\n if (filter.negate && negationIgnored) {\n advisories.push(`:${target} does not support '!${filter.key}:' negation; this clause is not applied as a negated filter.`);\n }\n const wildcardSupported = target === 'effort' ? ['effort', 'text'].includes(filter.key)\n : (target === 'segment' || target === 'event') && !scope;\n if (filter.values.some(value => value.wildcard) && !wildcardSupported) {\n advisories.push(`:${target} does not support '${filter.key}:…*' wildcards; values are matched without wildcard expansion.`);\n }\n }\n if (query.window && !supported.has('time')) {\n advisories.push(`:${target} ignores the window because its registry has no time dimension.`);\n }\n if (query.groupBy?.length) {\n const dimensions = wqlGroupingDimensions(target, 'find');\n const unsupported = query.groupBy.filter(dim => !dimensions.some(d => d.toLowerCase() === dim.toLowerCase()));\n if (target === 'note' || target === 'block') {\n // Content grouping is open: any note property (typed-tag key) names a\n // valid dimension — values resolve from entry metadata, missing → Unassigned.\n } else if (target === 'segment' || target === 'event') {\n const selected = query.pipes?.select?.map(column => column.col);\n const unavailable = query.groupBy.filter(dim => selected ? !selected.includes(dim) : !dimensions.includes(dim));\n if (unavailable.length) advisories.push(`:${target} groups only emitted table columns; ${unavailable.join(', ')} may be unassigned. Select each grouping column explicitly.`);\n } else if (unsupported.length) {\n advisories.push(`:${target} cannot group by ${unsupported.join(', ')}; the view groups by content dimensions. Valid alternatives: ${dimensions.join(', ')}.`);\n }\n }\n if (query.displayUnit && !supported.has('unit')) advisories.push(`:${target} ignores the display unit 'in ${query.displayUnit}'.`);\n if (query.join && !supported.has('where')) advisories.push(`:${target} ignores the 'where' join; joins are supported by :note and :block.`);\n if (query.pipes?.select && target !== 'segment' && target !== 'event') advisories.push(`:${target} ignores '| select'; the result keeps its original fields.`);\n if (query.pipes?.order && target === 'session') advisories.push(`:session ignores '| order by'; sessions remain ordered by completion time.`);\n return [...new Set(advisories)];\n}\n","/**\n * WQL serializer (C6 — one structured interface for code).\n *\n * The total serializer over the C5 discriminated query union: code holds the\n * AST; strings live only at document edges (URL `?q=`, ```query``` fences,\n * dashboard bodies). Properties (proven by tests/serialize.test.ts):\n *\n * 1. `serialize(parse(x)) === x` for canonical inputs (fixed-point text), and\n * 2. `parse(serialize(a))` is structurally equal to `a` for every AST —\n * equal on all query-structure fields; `raw` (provenance text) and\n * `advisories` (parse-time deprecation notices) are intentionally not\n * reproduced, since serialization emits modern canonical syntax.\n *\n * Errored ASTs serialize to their original `raw` text — a query that failed\n * to parse has no well-defined structure to re-emit, and echoing the input\n * keeps the function total.\n *\n * Round-trip equality holds for text-surface-representable ASTs. Single\n * aggregate queries serialize in the retained legacy `sum:metric{…}` form;\n * find queries serialize with colon source heads (find: is retired) and\n * pipelines as `source | :fn{…} | :chart{…}`. Three value\n * shapes the grammar cannot express (or parses away) sit outside that\n * contract — documented here rather than silently corrupted:\n * - a `\"` inside a filter value: the quoted token has no escape form;\n * - a quoted value with `wildcard: true`: the parser forces wildcard=false\n * on quoted atoms (extractFilters), so the flag cannot survive;\n * - thresholds whose String() is exponential (>= 1e21): outside the join\n * comparison regex's plain-decimal domain.\n */\n\nimport { WQL_TYPE_HEADS } from './vocabulary';\nimport type { AnyParsedQuery, MetricPredicate, ParsedAggregateQuery, ParsedFindQuery, PipelineSource, ParsedPipelineQuery, QueryWindow, TagFilter } from './wql';\n\n/** `:note{…}` / `:session{…}` — always the target head with the filters in\n * their authored order. A source: filter is never collapsed into a\n * scope-alias head: the collapse can reorder/broaden (a :journal head on a\n * session query) and it breaks composer's filterText editing, which maps\n * serialized filter clauses back to AST positions. */\n/** A note-target AST in the exact shape the `:dashboard` alias head parses\n * to (first filter = literal `type:dashboard`, no source scope) — shared\n * by the head and scope serializers so both emit through the alias. */\nfunction isDashboardHeadShape(f: ParsedFindQuery): boolean {\n const first = f.filters[0];\n return f.target === 'note' && f.sourceScope === undefined\n && !!first && first.key === 'type' && !first.negate\n && first.values.length === 1 && !first.values[0]!.wildcard\n && first.values[0]!.value === WQL_TYPE_HEADS.dashboard;\n}\n\nfunction serializeFindHead(f: ParsedFindQuery, extra: TagFilter[] = []): string {\n // The type-alias head serializes back through its alias: reparse\n // re-injects the type filter at the same first position.\n if (isDashboardHeadShape(f)) {\n const filters = [...f.filters.slice(1), ...extra];\n return `:dashboard${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n }\n const filters = [...f.filters, ...extra];\n return `:${f.target}${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n}\n\n/** Scope handling for the generic note head. The note head is inclusive —\n * there is no default scope anymore, so no `in all` marker is emitted (the\n * legacy suffix still parses); a non-canonical sourceScope serializes as\n * explicit source: filters. */\nfunction serializeScopeInfo(f: ParsedFindQuery): { clause: string; scopeFilters: TagFilter[] } {\n if (f.target !== 'note' || f.filters.some((t) => t.key === 'source')) return { clause: '', scopeFilters: [] };\n // The alias head is scope-free by construction.\n if (isDashboardHeadShape(f)) return { clause: '', scopeFilters: [] };\n if (!f.sourceScope?.length) return { clause: '', scopeFilters: [] };\n return {\n clause: '',\n scopeFilters: [{ key: 'source', negate: false, values: f.sourceScope.map((v) => ({ value: v, wildcard: false })) }],\n };\n}\n\n/** Find query text without presentation pipes — a pipeline source stage\n * (pipes between stages are separators, so a source stage has none). */\nfunction serializeFindStage(f: ParsedFindQuery): string {\n const scope = serializeScopeInfo(f);\n const parts = [serializeFindHead(f, scope.scopeFilters)];\n if (f.groupBy?.length) parts.push(`by {${f.groupBy.join(', ')}}`);\n if (f.displayUnit) parts.push(`in ${f.displayUnit}`);\n parts.push(scope.clause);\n parts.push(serializeWindow(f.window));\n if (f.join) parts.push(`where ${serializeMetricHalf(f.join)}`);\n return parts.filter(Boolean).join(' ');\n}\n\n/** `:sum{metric:tis, <filters>} [by {..}] [.rollup(..)] [in u] [window] [where …]`\n * — the colon function form; the metric re-enters the filters. */\nfunction serializeFunctionStage(a: ParsedAggregateQuery): string {\n const filters = a.metric\n ? [{ key: 'metric', negate: false, values: [{ value: a.metric, wildcard: false }] }, ...a.filters]\n : a.filters;\n let text = `:${a.agg}{${serializeFilters(filters)}}`;\n if (a.groupBy.length) text += ` by {${a.groupBy.join(', ')}}`;\n if (a.rollup) text += `.rollup(${a.rollup.size}${a.rollup.unit})`;\n if (a.displayUnit) text += ` in ${a.displayUnit}`;\n const win = serializeWindow(a.window);\n if (win) text += ` ${win}`;\n if (a.join) text += ` where ${serializeFindHalf(a.join.target, a.join.filters, a.join.last)}`;\n return text;\n}\n\nfunction serializePipelineStage(source: PipelineSource): string {\n return source.kind === 'dataset'\n ? source.name\n : source.query.family === 'find' ? serializeFindStage(source.query) : serializeFunctionStage(source.query);\n}\n\n/** Serialize a pipeline: `source | :fn{…} | :chart{…}`. */\nfunction serializePipeline(p: ParsedPipelineQuery): string {\n const parts = [serializePipelineStage(p.source), ...p.transforms.map(serializeFunctionStage)];\n if (p.sink) {\n parts.push(`:${p.sink.head}${p.sink.filters.length ? `{${serializeFilters(p.sink.filters)}}` : ''}`);\n }\n return parts.join(' | ');\n}\n\n/** Quote a filter value unless it fits the grammar's bare forms — a dotted\n * `Word` chain (`calc.acwr`) or a catalog-id `Word:Word` chain. Quoted\n * phrases (`\"[^\"]*\"`) carry multi-word text; the grammar has no escape, so\n * values containing `\"` are outside the text surface entirely. */\nfunction serializeValue(value: string): string {\n if (/^[a-zA-Z0-9_-]+((:|\\.)[a-zA-Z0-9_-]+)*$/.test(value)) return value;\n return `\"${value}\"`;\n}\n\n/** `{key:val1|val2, !other:val*}` — commas between keys, `|` between a\n * key's OR-alternatives, per-value `*` wildcard, `!` negation. */\nfunction serializeFilters(filters: TagFilter[]): string {\n return filters\n .map((f) => `${f.negate ? '!' : ''}${f.key}:${f.values.map((v) => serializeValue(v.value) + (v.wildcard ? '*' : '')).join('|')}`)\n .join(',');\n}\n\n/** `<agg>:<metric>{filters}` — the head shared by aggregate queries and the\n * metric half of a cross-store join. Aggregate heads always carry braces,\n * matching the canonical corpus (`sum:tis{}`). */\nfunction serializeAggHead(agg: string, metric: string, filters: TagFilter[]): string {\n return `${agg}:${metric}{${serializeFilters(filters)}}`;\n}\n\nfunction serializeAggregateHead(a: ParsedAggregateQuery): string {\n return serializeAggHead(a.agg, a.metric, a.filters);\n}\n\n/** `find:target{filters}[ last <n><unit>]` — the content half of a cross-store\n * join reuses the find head plus its relative window (range windows are\n * rejected on join halves at parse). */\nfunction serializeFindHalf(target: string, filters: TagFilter[], last?: { size: number; unit: 'd' | 'w' }): string {\n const head = `find:${target}${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n return last ? `${head} last ${last.size}${last.unit}` : head;\n}\n\n/** `<agg>:<metric>{filters} <op> <threshold>` — the metric half of a\n * cross-store join attached to a find query. */\nfunction serializeMetricHalf(j: MetricPredicate): string {\n return `${serializeAggHead(j.agg, j.metric, j.filters)} ${j.operator} ${j.threshold}`;\n}\n\n\n/** Window clause (C1): `last 8w` or `from 2026-01-01 [to 2026-03-31]`.\n * Returns '' when the AST has no window. */\nfunction serializeWindow(w: QueryWindow | undefined): string {\n if (!w) return '';\n if (w.kind === 'relative') return `last ${w.size}${w.unit}`;\n return w.end ? `from ${w.start} to ${w.end}` : `from ${w.start}`;\n}\n\n/** Serialize any parsed query to canonical WQL text. Total: never throws. */\nexport function serialize(parsed: AnyParsedQuery): string {\n if (parsed.error) return parsed.raw;\n if (parsed.family === 'aggregate') {\n const a = parsed;\n let text = serializeAggregateHead(a);\n if (a.groupBy.length) text += ` by {${a.groupBy.join(', ')}}`;\n if (a.rollup) text += `.rollup(${a.rollup.size}${a.rollup.unit})`;\n if (a.displayUnit) text += ` in ${a.displayUnit}`;\n const win = serializeWindow(a.window);\n if (win) text += ` ${win}`;\n if (a.join) text += ` where ${serializeFindHalf(a.join.target, a.join.filters, a.join.last)}`;\n return text;\n }\n if (parsed.family === 'find') {\n // Suffix order mirrors the parser's end-anchored extraction (wqlSuffix):\n // head, by, in-unit, in-all scope, window, where-join — pipes trail after `|`.\n const scope = serializeScopeInfo(parsed);\n const parts = [serializeFindHead(parsed, scope.scopeFilters)];\n if (parsed.groupBy?.length) parts.push(`by {${parsed.groupBy.join(', ')}}`);\n if (parsed.displayUnit) parts.push(`in ${parsed.displayUnit}`);\n parts.push(scope.clause);\n parts.push(serializeWindow(parsed.window));\n if (parsed.join) parts.push(`where ${serializeMetricHalf(parsed.join)}`);\n let text = parts.filter(Boolean).join(' ');\n if (parsed.pipes) {\n const pipeParts: string[] = [];\n if (parsed.pipes.select) {\n pipeParts.push(`select ${parsed.pipes.select.map((s) => s.col + (s.unit ? ` in ${s.unit}` : '')).join(', ')}`);\n }\n if (parsed.pipes.order) {\n pipeParts.push(`order by ${parsed.pipes.order.map((o) => o.dir === 'desc' ? `${o.col} desc` : o.col).join(', ')}`);\n }\n if (parsed.pipes.limit !== undefined) {\n pipeParts.push(`limit ${parsed.pipes.limit}${parsed.pipes.offset !== undefined ? ` offset ${parsed.pipes.offset}` : ''}`);\n } else if (parsed.pipes.offset !== undefined) {\n pipeParts.push(`offset ${parsed.pipes.offset}`);\n }\n if (pipeParts.length > 0) {\n text += ` | ${pipeParts.join(' | ')}`;\n }\n }\n return text;\n }\n if (parsed.family === 'pipeline') {\n return serializePipeline(parsed);\n }\n const unhandled = parsed as { raw?: string };\n return unhandled.raw ?? '';\n}\n","/**\n * Canonical discipline vocabulary — the single source of truth for effort\n * disciplines across the resolver, the TIS factor table, fact-row tags, the\n * WQL tag dictionary, and UI filters.\n */\n\nexport const EFFORT_DISCIPLINES = [\n 'bodyweight',\n 'cycling',\n 'gymnastics',\n 'kettlebell',\n 'recovery',\n 'rowing',\n 'running',\n 'strength',\n 'swimming',\n 'walking',\n] as const;\n\nexport type EffortDiscipline = (typeof EFFORT_DISCIPLINES)[number];\n\nexport function isEffortDiscipline(value: unknown): value is EffortDiscipline {\n return typeof value === 'string'\n && (EFFORT_DISCIPLINES as readonly string[]).includes(value.toLowerCase());\n}\n\n/**\n * TIS discipline multiplier per canonical discipline. Loaded modalities\n * (strength + the loaded-skill pair kettlebell/gymnastics) score 1.2;\n * recovery absorbs the retired 'yoga' case at 0.9; the monostructural five\n * and bodyweight take the 1.0 default. Unknown/absent disciplines fall back\n * to 1.0.\n */\nexport const DISCIPLINE_FACTORS: Record<EffortDiscipline, number> = {\n strength: 1.2,\n kettlebell: 1.2,\n gymnastics: 1.2,\n recovery: 0.9,\n bodyweight: 1.0,\n cycling: 1.0,\n rowing: 1.0,\n running: 1.0,\n swimming: 1.0,\n walking: 1.0,\n};\n\n/** Factor for an arbitrary discipline string; 1.0 when absent or unknown. */\nexport function disciplineFactorFor(discipline: string | undefined): number {\n if (!discipline) return 1.0;\n const key = discipline.toLowerCase();\n return isEffortDiscipline(key) ? DISCIPLINE_FACTORS[key] : 1.0;\n}\n","/**\n * WQL language support — CodeMirror highlighting + autocomplete over the\n * Lezer grammar (grammar/wql.grammar).\n *\n * The completion vocabulary is the analytics dictionary:\n * - aggregators from the AST contract (WQL_AGGREGATORS)\n * - Canonical Metric Keys (CONTEXT.md §Analytics): base families, Tier-2\n * aggregates, and `<effortSlug>.<family>` for every known effort\n * - Tag keys read off fact rows by the Query Service, with value\n * vocabularies for discipline (canonical EFFORT_DISCIPLINES), intensity,\n * and grain; effort values come from the EffortResolver\n * - virtual dimensions day | week | session | round\n */\n\nimport { LRLanguage, LanguageSupport, HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { autocompletion, CompletionContext, CompletionResult, Completion, snippetCompletion, startCompletion } from \"@codemirror/autocomplete\";\nimport type { Extension } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\nimport { parser } from \"./grammar/wql.parser\";\nimport type { IFieldCatalog } from \"./catalog\";\nimport { EFFORT_DISCIPLINES } from \"./disciplines\";\nimport { wqlFilterKeys, wqlGroupingDimensions } from \"./capabilities\";\nimport {\n WQL_AGGREGATORS,\n WQL_CHART_HEADS,\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_CALC_TARGETS,\n WQL_INTENSITY_TIERS,\n WQL_GRAINS,\n WQL_ROLLUP_PERIODS,\n WQL_SOURCE_HEADS,\n WQL_SOURCE_HEAD_SCOPES,\n WQL_TYPE_HEADS,\n WQL_SOURCE_VALUES,\n WQL_STANDARD_DATASETS,\n WQL_FIND_TARGETS,\n WQL_FUNCTION_HEADS,\n WQL_DISPLAY_UNITS,\n} from \"./vocabulary\";\n\n// The vocabulary tables live in ./vocabulary (no editor deps); re-export\n// so existing importers of language keep working.\nexport {\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_TAG_KEYS,\n WQL_VIRTUAL_DIMS,\n WQL_CALC_TARGETS,\n WQL_FIND_TARGETS,\n WQL_RESULT_PLANES,\n WQL_SOURCE_VALUES,\n WQL_CONTENT_FILTER_KEYS,\n WQL_AGGREGATORS,\n WQL_COMPARISON_OPS,\n WQL_ROLLUP_PERIODS,\n} from \"./vocabulary\";\n\n// ── Highlighting ───────────────────────────────────────────────────\n\nexport const wqlLanguage = LRLanguage.define({\n parser: parser.configure({\n props: [\n styleTags({\n // Rule styles color stray punctuation; the Word tokens inside carry\n // the visible styling (unstyled children reset the parent class) —\n // so parents with punctuation children (Head spans `:journal`) are\n // NOT styled directly, or highlightTree merges the word into the\n // parent span.\n \"Aggregator/Word\": t.keyword,\n \"Metric/Word\": t.variableName,\n // Direct Word child of Head = the colon head name (`:sum`, `:journal`).\n \"Head/Word\": t.keyword,\n DatasetReference: t.keyword,\n \"DatasetReference/Word\": t.keyword,\n At: t.punctuation,\n TagKey: t.propertyName,\n \"TagKey/Word\": t.propertyName,\n TagValue: t.string,\n \"TagValue/Value/Word\": t.string,\n \"TagValue/Word\": t.string,\n Negate: t.operator,\n Star: t.operator,\n Dimension: t.attributeName,\n \"Dimension/Word\": t.attributeName,\n By: t.keyword,\n RollupDot: t.keyword,\n Int: t.number,\n \"Rollup/Word\": t.unit,\n braceOpen: t.bracket,\n braceClose: t.bracket,\n parenOpen: t.bracket,\n parenClose: t.bracket,\n colon: t.punctuation,\n comma: t.punctuation,\n pipe: t.punctuation,\n dot: t.punctuation,\n })\n ]\n }),\n languageData: {\n closeBrackets: { brackets: [\"{\", \"(\"] },\n }\n});\n\n// ── Completion ─────────────────────────────────────────────────────\n\nexport interface WqlCompletionOptions {\n /**\n * Effort slugs for `{effort:…}` values and `<effortSlug>.<family>` metric\n * keys — feed from the EffortResolver:\n * `() => resolver.list().map(e => e.slug)`.\n */\n effortNames?: () => readonly string[];\n /**\n * Dynamic values for the frontmatter typed-tag filters (`{domain:…}`,\n * `{format:…}`, `{equipment:…}`, `{quality:…}`, `{intent:…}`) — fed from\n * the tags store's `by-type` index:\n * `async key => (await storage.getAllFromIndex('tags', 'by-type', key)).map(t => t.label)`.\n * Absent or empty results fall through to catalog discovery.\n */\n tagTypeValues?: (key: string) => Promise<readonly string[]> | readonly string[];\n /**\n * Host-supplied values for a filter key (e.g. the composer's suggestion\n * feeds). Non-empty results win over the static vocabularies below.\n */\n values?: (key: string) => Promise<readonly Completion[]>;\n /**\n * Injected field catalog (ticket 15): discovered typed variants join the\n * static metric vocabulary, and categorical values back filter-value\n * suggestions for discovered fields. Bounded prefix lookups only — the\n * catalog never scans event/result history.\n */\n catalog?: IFieldCatalog;\n}\n\nfunction options(labels: readonly (string | Completion)[]): Completion[] {\n return labels.map((label) => (typeof label === 'string' ? { label } : label));\n}\n\n/**\n * Lexical cursor scan — quote- and brace-aware. Primary slot detection is\n * lexical because the suffix/pipe/window grammar lives outside the Lezer\n * tree, and quoted phrases / OR pipes inside braces must never be mistaken\n * for structural boundaries.\n */\ninterface WqlScan { depth: number; quoted: boolean; pipeFrom: number; lastBrace: number; fragStart: number; }\n\nfunction scanContext(doc: string, pos: number): WqlScan {\n let depth = 0, quoted = false, pipeFrom = -1, lastBrace = -1, fragStart = 0;\n for (let i = 0; i < pos; i++) {\n const ch = doc[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') { depth++; lastBrace = i; fragStart = i + 1; }\n else if (ch === '}') { depth = Math.max(0, depth - 1); fragStart = i + 1; }\n else if (ch === ',' && depth > 0) fragStart = i + 1;\n else if (ch === '|' && depth === 0) { pipeFrom = i + 1; fragStart = i + 1; }\n }\n return { depth, quoted, pipeFrom, lastBrace, fragStart };\n}\n\nfunction maskQuotes(text: string): string {\n let out = '';\n let quoted = false;\n for (const ch of text) {\n if (ch === '\"') { quoted = !quoted; out += ' '; }\n else out += quoted ? ' ' : ch;\n }\n return out;\n}\n\nfunction unquotedColonIndex(text: string): number {\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (ch === '\"') quoted = !quoted;\n else if (ch === ':' && !quoted) return i;\n }\n return -1;\n}\n\n/** Keys/dims already present in the open brace group, before the current fragment. */\nfunction usedEntries(doc: string, groupStart: number, fragStart: number): Set<string> {\n const text = maskQuotes(doc.slice(groupStart + 1, fragStart));\n const used = new Set<string>();\n for (const entry of text.split(',')) {\n const m = /!?\\s*([A-Za-z][\\w-]*)/.exec(entry);\n if (m) used.add(m[1]);\n }\n return used;\n}\n\nfunction valueOf(c: Completion): string {\n return typeof c.apply === 'string' ? c.apply : c.label;\n}\n\n/** Whitespace values insert quoted — never inside already-quoted replacements. */\nfunction quoteApply(c: Completion): Completion {\n const value = valueOf(c);\n if (!/\\s/.test(value)) return c;\n return {\n ...c,\n apply: (view: EditorView, _c: Completion, from: number, to: number) => {\n const text = view.state.sliceDoc(Math.max(0, from - 1), from) === '\"' ? value : `\"${value}\"`;\n view.dispatch({ changes: { from, to, insert: text }, selection: { anchor: from + text.length }, userEvent: 'input.complete' });\n },\n };\n}\n\n/** Host values first (rank-boosted so CM sort keeps vault order), static\n * canonical vocabulary after; case-insensitive dedup by value — labels are\n * display-only and never count as a second value. */\nfunction mergeValues(host: readonly Completion[], statics: readonly Completion[]): Completion[] {\n const seen = new Set<string>();\n const out: Completion[] = [];\n host.forEach((c, i) => {\n const k = valueOf(c).toLowerCase();\n if (!k || seen.has(k)) return;\n seen.add(k);\n out.push(quoteApply({ ...c, boost: Math.max(-99, Math.min(99, 80 - i)) }));\n });\n for (const c of statics) {\n const k = valueOf(c).toLowerCase();\n if (!k || seen.has(k)) continue;\n seen.add(k);\n out.push(quoteApply(c));\n }\n return out;\n}\n\n/** Prefix-first, case-insensitive substring narrowing. */\nfunction narrow(options: readonly Completion[], typed: string): Completion[] {\n const q = typed.toLowerCase();\n if (!q) return [...options];\n const prefix: Completion[] = [];\n const rest: Completion[] = [];\n for (const o of options) {\n const label = o.label.toLowerCase();\n if (label.startsWith(q)) prefix.push(o);\n else if (label.includes(q)) rest.push(o);\n }\n return [...prefix, ...rest];\n}\n\n/** Ranked result; empty matches close the popup (free text stays as written). */\nfunction finish(_context: CompletionContext, from: number, options: readonly Completion[], typed: string): CompletionResult | null {\n const ranked = narrow(options, typed);\n if (!ranked.length) return null;\n return {\n from,\n options: ranked.map((o, i) => (o.boost === undefined ? { ...o, boost: Math.max(-99, 50 - i) } : o)),\n filter: false,\n };\n}\n\n/**\n * Accepting a head aggregator or a filter key also writes its separator and\n * reopens the list, so the next slot (metric/target, filter value) is\n * offered immediately — typing becomes picking.\n */\nfunction chained(list: readonly Completion[], suffix: string): Completion[] {\n return list.map((c) => ({\n ...c,\n apply: (view: EditorView, _c: Completion, from: number, to: number) => {\n const text = typeof c.apply === 'string' ? c.apply : c.label;\n const present = view.state.sliceDoc(to, to + suffix.length) === suffix;\n view.dispatch({\n changes: { from, to, insert: present ? text : text + suffix },\n selection: { anchor: from + text.length + suffix.length },\n userEvent: 'input.complete',\n });\n startCompletion(view);\n },\n }));\n}\n\n/** Colon head vocabulary — canonical sources, functions, charts, datasets. */\nconst HEAD_OPTIONS: Completion[] = [\n ...WQL_FUNCTION_HEADS.map((label) => ({ label, detail: 'function head', type: 'keyword' as const })),\n ...WQL_SOURCE_HEADS.map((label) => ({ label, detail: 'source head', type: 'keyword' as const })),\n ...WQL_CHART_HEADS.map((label) => ({ label, detail: 'chart head', type: 'class' as const })),\n ...WQL_STANDARD_DATASETS.map((label) => ({ label, detail: 'page dataset', type: 'class' as const })),\n];\n\n/** Insertion for a head option: `:name{` at query start, `name{` when the\n * leading colon is already typed; datasets insert bare. */\nfunction headApply(o: Completion, colonTyped: boolean): Completion {\n if (o.label.startsWith('@')) return { ...o, apply: o.label };\n return { ...o, apply: `${colonTyped ? '' : ':'}${o.label}{` };\n}\n\n/** Legacy `agg:` heads still parse (retained numerical syntax); the retired\n * find/rows dispatch keywords are no longer offered. */\nconst LEGACY_HEAD_OPTIONS: Completion[] = WQL_AGGREGATORS.map((label) => ({ label, type: 'keyword' as const }));\n\n/** Sortable/selectable columns the executors actually read (QueryService). */\nconst NOTE_COLUMNS: readonly string[] = ['title', 'date', 'createdAt', 'type', 'sourceId', 'catalog'];\nconst BLOCK_COLUMNS: readonly string[] = ['noteTitle', 'dataType', 'position', 'createdAt', 'noteId', 'sourceId'];\nconst EFFORT_COLUMNS: readonly string[] = ['slug', 'label', 'registrySource'];\nconst SESSION_COLUMNS: readonly string[] = ['duration', 'startTime', 'origin'];\nconst TABLE_COLUMNS: readonly string[] = [\n 'date', 'effort', 'discipline', 'note', 'grade', 'intensity',\n ...WQL_METRIC_FAMILIES, ...WQL_METRIC_AGGREGATES,\n];\n/** Columns that accept an `in kg|lb` display unit. */\nconst UNIT_COLUMNS: ReadonlySet<string> = new Set(['distance', 'resistance', 'totalVolume', 'totalDistance']);\nconst DIR_OPTIONS: Completion[] = [\n { label: 'asc', detail: 'sort ascending', type: 'keyword' },\n { label: 'desc', detail: 'sort descending', type: 'keyword' },\n];\nconst UNIT_OPTIONS: Completion[] = WQL_DISPLAY_UNITS.map((label) => ({ label, detail: 'display unit', type: 'constant' }));\n\ntype Family = 'find' | 'aggregate';\ninterface Head { family: Family; target?: string }\n\n/** `find:`/rows: dispatch keywords are retired — a legacy `word:` head is\n * always the retained aggregate surface; the metric slot resolves below. */\nfunction resolveHead(_agg: string, _typedTarget: string): Head {\n return { family: 'aggregate' };\n}\n\n/** A colon head: function → aggregate family; source head → its content\n * plane (scoped aliases resolve to 'note'); chart → sink params. */\nfunction resolveColonHead(name: string): Head {\n const n = name.toLowerCase();\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(n)) return { family: 'aggregate' };\n if ((WQL_CHART_HEADS as readonly string[]).includes(n)) return { family: 'find' };\n // Partial head word resolves through the unique prefix (`:no{` → note).\n let source = n;\n if (!(WQL_SOURCE_HEADS as readonly string[]).includes(source)) {\n const partial = source ? WQL_SOURCE_HEADS.filter((t) => t.startsWith(source)) : [];\n if (partial.length === 1) source = partial[0]!;\n }\n if ((WQL_SOURCE_HEADS as readonly string[]).includes(source)) {\n const scoped = (WQL_SOURCE_HEAD_SCOPES as Readonly<Record<string, string>>)[source]\n || (WQL_TYPE_HEADS as Readonly<Record<string, string>>)[source];\n return { family: 'find', target: scoped ? 'note' : source };\n }\n return { family: 'find' }; // partial or unknown — union key suggestions\n}\n\nconst FIND_KEY_UNION: readonly string[] = [\n ...new Set(WQL_FIND_TARGETS.flatMap((t) => [...wqlFilterKeys(t, 'find')])),\n];\n\nfunction filterKeysFor(head: Head): readonly string[] {\n return head.family === 'find'\n ? (head.target ? wqlFilterKeys(head.target, 'find') : FIND_KEY_UNION)\n : wqlFilterKeys('', 'aggregate');\n}\n\nfunction pipeColumns(target: string | undefined): readonly string[] {\n switch (target) {\n case 'note': return NOTE_COLUMNS;\n case 'block': return BLOCK_COLUMNS;\n case 'effort': return EFFORT_COLUMNS;\n case 'session': return SESSION_COLUMNS;\n default: return TABLE_COLUMNS; // segment/event/rows table output\n }\n}\n\n/** Parser advisories: select is ignored for these targets, order for sessions. */\nconst SELECT_IGNORED: ReadonlySet<string> = new Set(['note', 'block', 'effort', 'session']);\n\nexport function wqlCompletionSource(options_: WqlCompletionOptions = {}) {\n const { effortNames, tagTypeValues, catalog, values: hostValues } = options_;\n\n /** Discovered typed variants for the typed metric word — bounded lookup. */\n const catalogMetricOptions = async (typed: string): Promise<Completion[]> => {\n if (!catalog) return [];\n const entries = await catalog.listByPrefix(typed, 20);\n return entries.map((entry) => ({\n label: entry.path,\n detail: [entry.kind, ...entry.units].filter(Boolean).join(' · '),\n type: 'variable',\n apply: entry.path,\n }));\n };\n\n /** Categorical values for a discovered field key (original spellings). */\n const catalogValueOptions = async (key: string, typed: string): Promise<Completion[]> => {\n if (!catalog) return [];\n const values = await catalog.listValues(key, typed, 20);\n return values.map((v) => ({ label: v.value, type: 'constant' }));\n };\n\n const metricOptions = (): Completion[] => {\n const efforts = effortNames?.() ?? [];\n return [\n ...options(WQL_METRIC_AGGREGATES).map((c) => ({ ...c, type: 'constant' })),\n ...options(WQL_METRIC_FAMILIES).map((c) => ({ ...c, type: 'variable' })),\n ...options(efforts.flatMap((slug) => WQL_METRIC_FAMILIES.map((family) => `${slug}.${family}`)))\n .map((c) => ({ ...c, type: 'variable' })),\n ...options(WQL_CALC_TARGETS).map((c) => ({ ...c, type: 'namespace' })),\n snippetCompletion('calc.${target}', { label: 'calc.', detail: 'calculated target', type: 'namespace' }),\n ];\n };\n\n /** Static canonical value vocabulary per key (null → free-form/catalog). */\n const staticValueOptions = (key: string): Completion[] | Promise<Completion[]> | null => {\n switch (key) {\n case 'effort': return options(effortNames?.() ?? []);\n case 'discipline': return options(EFFORT_DISCIPLINES);\n case 'intensity': return options(WQL_INTENSITY_TIERS);\n case 'grain': return options(WQL_GRAINS);\n case 'metric': return metricOptions();\n case 'source': return options(WQL_SOURCE_VALUES);\n case 'domain':\n case 'format':\n case 'equipment':\n case 'quality':\n case 'intent': {\n if (!tagTypeValues) return null;\n return Promise.resolve(tagTypeValues(key)).then((values) => options(values));\n }\n default: return null; // note/page/block/result/tags/origin — free-form or host-fed\n }\n };\n\n /** Filter value slot: host vault values first, static canonical after,\n * case-insensitive dedup; falls through to catalog discovery, then to a\n * plain close (free text stays as written). */\n const valueSlot = (\n key: string,\n context: CompletionContext,\n from: number,\n typed: string,\n ): CompletionResult | Promise<CompletionResult | null> | null => {\n const emit = (host: readonly Completion[], statics: readonly Completion[] | null): CompletionResult | Promise<CompletionResult | null> | null => {\n const merged = mergeValues(host, statics ?? []);\n if (merged.length) return finish(context, from, merged, typed);\n if (catalog) {\n return catalogValueOptions(key, typed).then((found) => finish(context, from, found, typed));\n }\n return finish(context, from, [], typed);\n };\n const statics = staticValueOptions(key);\n if (!hostValues) {\n return statics instanceof Promise ? statics.then((s) => emit([], s)) : emit([], statics);\n }\n const host = hostValues(key);\n if (statics instanceof Promise) return Promise.all([Promise.resolve(host), statics]).then(([h, s]) => emit(h, s));\n return Promise.resolve(host).then((h) => emit(h, statics));\n };\n\n /** Discovered typed variants join the static metric vocabulary (ticket 15). */\n const metricHeadSlot = (context: CompletionContext, from: number, typed: string): CompletionResult | Promise<CompletionResult | null> | null => {\n if (!catalog) return finish(context, from, metricOptions(), typed);\n return catalogMetricOptions(typed).then((extra) => finish(context, from, [...metricOptions(), ...extra], typed));\n };\n\n /** Inside braces: `by {…}` dims use target-aware grouping; filter braces\n * use target-aware keys (excluding keys already present), `!` reopens the\n * same list as an exclude, and `key:` values merge host + canonical. */\n const braceSlot = (\n context: CompletionContext,\n doc: string,\n scan: WqlScan,\n from: number,\n typed: string,\n head: Head,\n ): CompletionResult | Promise<CompletionResult | null> | null => {\n if (/\\bby\\s*$/.test(maskQuotes(doc.slice(0, scan.lastBrace)))) {\n const dims = wqlGroupingDimensions(head.target ?? '', head.family);\n const used = usedEntries(doc, scan.lastBrace, scan.fragStart);\n const avail = [...dims].filter((d) => !used.has(d));\n if (!avail.length) return finish(context, from, [], typed);\n return finish(\n context,\n from,\n chained(avail.map((d) => ({ label: d, type: 'atom' as const, detail: 'grouping dimension' })), ', '),\n typed,\n );\n }\n const frag = doc.slice(scan.fragStart, context.pos);\n const colon = unquotedColonIndex(frag);\n if (colon >= 0) {\n const key = frag.slice(0, colon).replace(/^!/, '').trim();\n return valueSlot(key, context, from, typed);\n }\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n const exclude = frag.trimStart().startsWith('!');\n const used = usedEntries(doc, scan.lastBrace, scan.fragStart);\n const avail = filterKeysFor(head).filter((k) => !used.has(k));\n const opts = chained(\n avail.map((k) => ({ label: k, type: 'property' as const, ...(exclude ? { detail: `exclude ${k} values` } : {}) })),\n ':',\n );\n return finish(context, keyWord.from, opts, typed);\n };\n\n /** After a complete head: rollup periods, group dims, `last <n>d|w`,\n * `from DATE [to DATE]`, or the structural suffix keywords. */\n const suffixSlot = (context: CompletionContext, doc: string, scan: WqlScan, from: number, typed: string, head: Head, headEnd: number): CompletionResult | null => {\n const tail = doc.slice(headEnd, context.pos);\n if (/\\.rollup\\([^)]*$/.test(tail)) {\n // find ignores .rollup (parser advises) — only aggregate heads get periods.\n return head.family === 'aggregate'\n ? finish(context, from, options(WQL_ROLLUP_PERIODS).map((c) => ({ ...c, type: 'constant' as const })), typed)\n : finish(context, from, [], typed);\n }\n if (/\\bby\\s*\\{[^}]*$/.test(tail)) return braceSlot(context, doc, scan, from, typed, head) as CompletionResult | null;\n if (/\\s+last\\s+$/i.test(tail)) {\n return finish(context, context.pos, [\n { label: '4w', detail: 'relative window', type: 'constant' },\n { label: '8w', detail: 'relative window', type: 'constant' },\n { label: '7d', detail: 'relative window', type: 'constant' },\n { label: '30d', detail: 'relative window', type: 'constant' },\n ], '');\n }\n const lastUnit = /\\s+last\\s+(\\d+)([dw]?)$/i.exec(tail);\n if (lastUnit) {\n if (lastUnit[2]) return null; // window already unit-complete\n return finish(context, context.pos, [\n { label: 'd', detail: 'days', type: 'constant' },\n { label: 'w', detail: 'weeks', type: 'constant' },\n ], '');\n }\n if (/\\s+from\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: '2026-01-01', apply: '2026-01-01 ', detail: 'start date (YYYY-MM-DD)', type: 'constant' }], '');\n }\n if (/\\s+from\\s+\\d{4}-\\d{2}-\\d{2}\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: 'to', apply: 'to ', detail: 'end date', type: 'keyword' }], '');\n }\n if (/\\s+to\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: '2026-03-31', detail: 'end date (YYYY-MM-DD)', type: 'constant' }], '');\n }\n const dims = wqlGroupingDimensions(head.target ?? '', head.family);\n const keywords: Completion[] = [\n { label: 'by {}', apply: 'by ', detail: dims.length ? 'group by dimensions' : `advisory: no grouping dimensions for find:${head.target}`, type: 'keyword' },\n ...(head.family === 'aggregate'\n ? [{ label: '.rollup()', apply: '.rollup(', detail: 'bucket period', type: 'keyword' as const }]\n : []),\n { label: 'last', apply: 'last ', detail: 'relative window: last <n>d|w', type: 'keyword' },\n { label: 'from', apply: 'from ', detail: 'date range: from YYYY-MM-DD [to YYYY-MM-DD]', type: 'keyword' },\n ...(head.family === 'find' ? [{ label: '|', apply: '| ', detail: 'presentation pipes: order by / select / limit', type: 'keyword' as const }] : []),\n ];\n return finish(context, from, chained(keywords, ' '), typed);\n };\n\n /** Presentation pipe zone (`| …`): clause keywords, then per-target\n * columns, asc/desc, `in <unit>`, numeric limit placeholder. */\n const pipeSlot = (context: CompletionContext, doc: string, scan: WqlScan, from: number, typed: string, head: Head): CompletionResult | null => {\n const text = doc.slice(scan.pipeFrom, context.pos);\n const orderM = /^\\s*order\\b/i.exec(text);\n if (orderM) {\n const rest = text.slice(orderM[0].length);\n const byM = /^\\s*by\\b/i.exec(rest);\n if (!byM) return finish(context, from, [{ label: 'by', apply: 'by ', type: 'keyword' }], typed);\n const last = rest.slice(byM[0].length).split(',').pop() ?? '';\n const words = last.trim().split(/\\s+/).filter(Boolean);\n const columns = pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const }));\n if (!words.length) return finish(context, from, columns, '');\n if (/\\s$/.test(last)) return finish(context, context.pos, DIR_OPTIONS, '');\n if (words.length >= 2) {\n if (/^(asc|desc)$/i.test(words[1])) return null;\n return finish(context, from, DIR_OPTIONS, typed);\n }\n return finish(context, from, columns, last.trim());\n }\n const selectM = /^\\s*select\\b/i.exec(text);\n if (selectM) {\n const last = text.slice(selectM[0].length).split(',').pop() ?? '';\n const words = last.trim().split(/\\s+/).filter(Boolean);\n if (!words.length) return finish(context, from, pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const })), '');\n if (/\\s$/.test(last)) {\n return UNIT_COLUMNS.has(words[0].toLowerCase())\n ? finish(context, context.pos, UNIT_OPTIONS, '')\n : finish(context, from, [], typed);\n }\n if (words.length >= 2) {\n const second = words[1].toLowerCase();\n if (second === 'in') return words[2] ? finish(context, from, UNIT_OPTIONS, words[2]) : finish(context, context.pos, UNIT_OPTIONS, '');\n if ('in'.startsWith(second)) return finish(context, context.pos, UNIT_OPTIONS, '');\n return null; // `col in unit` complete\n }\n return finish(context, from, pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const })), words[0]);\n }\n if (/^\\s*(limit|offset)\\b/i.test(text)) return null; // free numeric\n // Composer parity: the limit keyword inserts a numeric placeholder.\n const limitSnippet = snippetCompletion('limit ${10}', { label: 'limit', detail: 'cap result rows', type: 'keyword' });\n const kw: Completion[] = [\n { label: 'order by', apply: 'order by ', detail: head.target === 'session' ? 'advisory: order ignored for sessions' : 'sort rows', type: 'keyword' },\n { label: 'select', apply: 'select ', detail: SELECT_IGNORED.has(head.target ?? '') ? `advisory: select ignored for find:${head.target}` : 'choose columns', type: 'keyword' },\n ];\n return finish(context, from, [...chained(kw, ' '), limitSnippet], typed);\n };\n\n function inner(context: CompletionContext, replaceSelection = false): CompletionResult | Promise<CompletionResult | null> | null {\n const doc = context.state.doc.toString();\n const pos = context.pos;\n const word = context.matchBefore(/[\\w.*-]*/) ?? { from: pos, to: pos, text: '' };\n // Structural characters open the next slot immediately, no keystroke needed.\n const opens = word.from === word.to && pos > 0 && /[{,:|(!\"@]/.test(doc[pos - 1]);\n if (word.from === word.to && !context.explicit && !opens) return null;\n\n const scan = scanContext(doc, pos);\n if (scan.quoted && scan.depth === 0) return null; // free text inside a phrase\n\n // Selected-token replacement lists every slot alternative unfiltered.\n const typed = replaceSelection ? '' : word.text;\n\n // Colon heads (`:note{…}`, `:sum{metric:…}`) and the legacy word-colon head.\n const colonHeadM = /^[ \\t]*:[ \\t]*([A-Za-z][\\w-]*)/.exec(doc);\n const headM = colonHeadM ?? /^[ \\t]*([A-Za-z]+)[ \\t]*:[ \\t]*([A-Za-z0-9_.-]*)/.exec(doc);\n const head = colonHeadM\n ? resolveColonHead(colonHeadM[1]!)\n : headM ? resolveHead(headM[1]!, headM[2]!) : { family: 'aggregate' as const };\n\n if (scan.pipeFrom >= 0 && scan.depth === 0) return pipeSlot(context, doc, scan, word.from, typed, head);\n if (scan.depth > 0) return braceSlot(context, doc, scan, word.from, typed, head);\n\n // A '@' before the typed word means a dataset reference — offer only\n // datasets ('@to' must not surface 'toplist').\n const datasetTyped = word.from > 0 && doc[word.from - 1] === '@';\n const headPool = datasetTyped ? HEAD_OPTIONS.filter((o) => o.label.startsWith('@')) : HEAD_OPTIONS;\n const headTyped = datasetTyped ? '@' + typed : typed;\n\n const headFrom = datasetTyped ? word.from - 1 : word.from;\n\n if (!headM) return finish(context, headFrom, headPool.map((o) => headApply(o, false)), headTyped);\n\n if (colonHeadM) {\n // Before/inside the head word after ':': offer every head.\n if (pos <= colonHeadM[0].length) {\n return finish(context, headFrom, headPool.map((o) => headApply(o, true)), headTyped);\n }\n return suffixSlot(context, doc, scan, word.from, typed, head, colonHeadM[0].length);\n }\n\n const colonIdx = headM[0].indexOf(':');\n if (pos <= colonIdx) return finish(context, word.from, chained(LEGACY_HEAD_OPTIONS, ':'), typed);\n if (pos <= headM[0].length) {\n // Head target/metric slot: `last` the aggregator vs `last` the window\n // is disambiguated here — before/inside the head word it is the\n // aggregator; after the complete head it is a suffix (below). The\n // retired find:/rows: dispatch keywords offer nothing here.\n return metricHeadSlot(context, word.from, typed);\n }\n return suffixSlot(context, doc, scan, word.from, typed, head, headM[0].length);\n }\n\n /** A non-empty selection means \"replace this token\": offer every option for\n * the slot (unfiltered) over the selected range. */\n function source(context: CompletionContext): CompletionResult | Promise<CompletionResult | null> | null {\n const selection = context.state.selection.main;\n if (selection.empty) return inner(context);\n // Evaluate at the selection end so the slot resolved is the selected token's.\n const result = inner(new CompletionContext(context.state, selection.to, true), true);\n const widen = (r: CompletionResult | null) => r && { ...r, from: selection.from, to: selection.to, filter: false, validFor: undefined };\n return result instanceof Promise ? result.then(widen) : widen(result);\n }\n\n return source;\n}\n\nexport function wqlCompletion(options?: WqlCompletionOptions): Extension {\n return autocompletion({ override: [wqlCompletionSource(options)] });\n}\n\n// ── Language support ───────────────────────────────────────────────\n\n/**\n * Query-field colors, mapped onto the app's theme tokens so\n * the field follows light/dark mode: aggregator + structural keywords take\n * the primary hue, the metric takes accent, tag keys secondary, values\n * success-green, dimensions warning-ochre.\n */\nexport const wqlHighlightStyle = HighlightStyle.define([\n { tag: t.keyword, color: 'hsl(var(--primary))' },\n { tag: t.variableName, color: 'hsl(var(--accent-foreground))', fontWeight: '600' },\n { tag: t.propertyName, color: 'hsl(var(--secondary-foreground))' },\n { tag: t.string, color: 'hsl(var(--success))' },\n { tag: t.attributeName, color: 'hsl(var(--warning))' },\n { tag: t.number, color: 'hsl(var(--primary))' },\n { tag: t.unit, color: 'hsl(var(--muted-foreground))' },\n { tag: t.operator, color: 'hsl(var(--destructive))' },\n { tag: [t.bracket, t.punctuation], color: 'hsl(var(--muted-foreground))' },\n]);\n\nexport function wql(completionOptions?: WqlCompletionOptions) {\n return new LanguageSupport(wqlLanguage, [\n wqlCompletion(completionOptions),\n syntaxHighlighting(wqlHighlightStyle),\n ]);\n}\n","/**\n * WQL unit policy (wayfinder ticket 13, home per decision ticket 21).\n *\n * Recognition and conversion evidence live in the core catalog — this module\n * adds the wql application policy: strict conversion before arithmetic, the\n * system-default output table applied when the query has no `in <unit>`\n * directive, and errors (never pass-through) for unknown units and\n * dimension-incompatible conversions.\n *\n * Cutover notes (ticket 13): the old first-record-unit fallback and the\n * unknown/incompatible pass-through in `resolveDisplayUnit` are gone. The\n * host `kg | lb` widget preference is no longer a tier in the default chain —\n * `useAnalyticsUnitPreference` callers migrate to the system defaults under\n * ticket 19; no new callers allowed.\n */\n\nimport {\n SYSTEM_DEFAULT_OUTPUT_UNIT,\n UnitConversionError,\n convertViaCatalog,\n dimensionKeyOf,\n lookupUnit,\n systemDefaultUnit,\n} from '@bitcobblers/wod-wiki-core';\n\nexport {\n SYSTEM_DEFAULT_OUTPUT_UNIT,\n UnitConversionError,\n convertViaCatalog,\n dimensionKeyOf,\n lookupUnit,\n systemDefaultUnit,\n};\n\n/** Legacy 2-family vocabulary kept only as a type alias for existing\n * callers of the display seam; arithmetic dimensions come from the catalog. */\nexport type UnitFamily = 'mass' | 'distance';\n\n/** The fact-unit shape resolveOutputUnit reads. */\nexport interface UnitBearingFact {\n unit?: string;\n metricUnit?: string;\n}\n\n/** Display conversion for UI surfaces (RawPointsTable etc.): converts\n * within a shared dimension through the catalog, passes unknown or\n * cross-dimension values through unchanged instead of throwing. Arithmetic\n * must use {@link convertViaCatalog}. Ticket 19 migrates the remaining\n * display callers onto renderer formatting. */\nexport function convertDisplay(value: number, from: string | undefined, to: string | undefined): number {\n if (from === undefined || to === undefined || from === to) return value;\n const fromDim = dimensionKeyOf(from);\n if (!fromDim || fromDim !== dimensionKeyOf(to)) return value;\n try {\n return convertViaCatalog(value, from, to);\n } catch {\n return value;\n }\n}\n\n/** Dimension compatibility probe for display surfaces. */\nexport function getUnitFamily(unit: string | undefined): string | undefined {\n return unit ? dimensionKeyOf(unit) : undefined;\n}\n\nexport interface OutputUnitResolution {\n /** The resolved output unit — undefined means unitless / no conversion. */\n unit?: string;\n /** Whether fact values must be converted into `unit` before aggregation. */\n convert: boolean;\n /** Diagnostic when the directive is unusable for this result (unknown\n * unit, or dimension-incompatible with the selected observations). */\n error?: string;\n}\n\n/**\n * Resolve the output unit for an aggregate result (arithmetic contract §5):\n *\n * 1. an explicit `in <unit>` directive wins when it is a known unit and\n * dimensionally compatible with the observations; incompatible → error\n * for the affected calculation;\n * 2. otherwise the system default for the observations' dimension\n * (mass `kg`, distance `m`, duration `s`, …; ratio unitless);\n * 3. observations with no unit at all stay unitless — no first-record\n * fallback, no reinterpretation of stored measurements.\n */\nexport function resolveOutputUnit(\n facts: ReadonlyArray<UnitBearingFact>,\n {\n directive,\n preferred,\n }: { directive?: string; preferred?: string },\n): OutputUnitResolution {\n void preferred; // retired from the default chain (ticket 13); removed with ticket 19's caller migration\n\n const spellings = new Set<string>();\n for (const fact of facts) {\n const unit = fact.unit ?? fact.metricUnit;\n if (unit) spellings.add(unit);\n }\n\n // Determine the observations' shared dimension; unknown spellings are\n // errors — an explicit unknown unit is never passed through.\n let dimension: string | undefined;\n for (const spelling of spellings) {\n const dim = dimensionKeyOf(spelling);\n if (!dim) {\n return { error: `Unknown unit \"${spelling}\"`, convert: false };\n }\n if (dimension && dim !== dimension) {\n return { error: `Incompatible units in one calculation (${[...spellings].join(', ')})`, convert: false };\n }\n dimension = dim;\n }\n\n if (directive) {\n const directiveDim = dimensionKeyOf(directive);\n if (!directiveDim) {\n return { error: `Unknown unit \"${directive}\"`, convert: false };\n }\n if (dimension && directiveDim !== dimension) {\n return { error: `Output unit \"${directive}\" is not compatible with this result's dimension`, convert: false };\n }\n if (dimension) {\n return { unit: directive, convert: true };\n }\n // Dimensionless observations with a directive: nothing to convert.\n return { unit: directive, convert: false };\n }\n\n if (dimension) {\n const fallback = systemDefaultUnit(dimension as Parameters<typeof systemDefaultUnit>[0]);\n return { unit: fallback, convert: fallback !== undefined };\n }\n return { unit: undefined, convert: false };\n}\n","/**\n * Calendar — system-local civil calendar arithmetic over captured execution\n * contexts (wayfinder datadog-analytics ticket 12, per the time alignment\n * contract §§ Evaluation context, Calendar and duration windows).\n *\n * Calendar days run from local midnight to the next local midnight in the\n * context's timezone; weeks start on Monday. All arithmetic is component\n * math via the timezone's civil date — never multiplication by 86 400 000\n * ms, which mislabels DST-shifted days. Range endpoints are half-open:\n * start included, exclusive end; an inclusive `to` civil date is implemented\n * as an exclusive bound at the following local midnight.\n */\n\n/** One captured execution context: every relative window, bucket, and\n * boundary decision in a document run resolves against this one capture. */\nexport interface ExecutionContext {\n /** Captured current instant (ms epoch). */\n readonly instant: number;\n /** IANA timezone name of the effective system timezone. */\n readonly timeZone: string;\n}\n\n/** Capture the execution context — once per document run (ticket 19's\n * runner captures; QueryService consumes). */\nexport function captureContext(instant: number = Date.now(), timeZone: string = systemTimeZone()): ExecutionContext {\n return { instant, timeZone };\n}\n\n/** The system's IANA timezone. */\nexport function systemTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nconst CIVIL_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nfunction civilParts(iso: string): { y: number; m: number; d: number } {\n const match = CIVIL_DATE.exec(iso);\n if (!match) throw new Error(`Invalid civil date: ${iso}`);\n return { y: Number(match[1]), m: Number(match[2]), d: Number(match[3]) };\n}\n\n// Formatter cache (ticket 20): constructing Intl.DateTimeFormat dominates\n// civil-date formatting cost — one formatter per (locale, options) key.\nconst dateFormatterCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction dateFormatter(timeZone: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${timeZone}|${JSON.stringify(options)}`;\n let formatter = dateFormatterCache.get(key);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat('en-CA', { timeZone, ...options });\n dateFormatterCache.set(key, formatter);\n }\n return formatter;\n}\n\n/** Civil YYYY-MM-DD of `instant` interpreted in `timeZone` — the calendar\n * the athlete lives in, not UTC. */\nexport function civilDateOf(instant: number, timeZone: string): string {\n const parts = dateFormatter(timeZone, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(instant);\n const get = (type: string) => parts.find((p) => p.type === type)?.value ?? '';\n const year = get('year');\n const month = get('month');\n const day = get('day');\n return `${year}-${month}-${day}`;\n}\n\n/** Add `days` (may be negative) to a civil date — pure date math across\n * month/year boundaries and leap days; no timezone involved. */\nexport function civilDateAdd(iso: string, days: number): string {\n const { y, m, d } = civilParts(iso);\n const shifted = new Date(Date.UTC(y, m - 1, d + days));\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${shifted.getUTCFullYear()}-${pad(shifted.getUTCMonth() + 1)}-${pad(shifted.getUTCDate())}`;\n}\n\n/** Days between two civil dates (second minus first). */\nexport function civilDateDiff(a: string, b: string): number {\n const pa = civilParts(a);\n const pb = civilParts(b);\n return Math.round(\n (Date.UTC(pb.y, pb.m - 1, pb.d) - Date.UTC(pa.y, pa.m - 1, pa.d)) / 86_400_000,\n );\n}\n\n/** The Monday-starting civil week of a civil date. */\nexport function civilMonday(iso: string): string {\n const { y, m, d } = civilParts(iso);\n const dow = new Date(Date.UTC(y, m - 1, d)).getUTCDay(); // 0=Sunday\n const back = (dow + 6) % 7;\n return civilDateAdd(iso, -back);\n}\n\n/** Offset (ms) of `timeZone` at `instant`: local = UTC + offset. */\nfunction zonedOffset(instant: number, timeZone: string): number {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }).formatToParts(instant);\n const get = (type: string) => Number(parts.find((p) => p.type === type)?.value ?? '0');\n const asUTC = Date.UTC(get('year'), get('month') - 1, get('day'), get('hour') % 24, get('minute'), get('second'));\n return asUTC - instant;\n}\n\n/** The instant of local midnight (00:00) starting civil date `iso` in\n * `timeZone` — component math that survives DST boundaries (a 23h or 25h\n * day still starts at its own local 00:00). */\nexport function zonedStartOfDay(iso: string, timeZone: string): number {\n const { y, m, d } = civilParts(iso);\n // Two-iteration fixpoint: guess UTC midnight, correct by the zone's offset,\n // re-correct — settles DST shift edges (23h/25h days still start 00:00 local).\n const guess = Date.UTC(y, m - 1, d);\n const first = guess - zonedOffset(guess, timeZone);\n return guess - zonedOffset(first, timeZone);\n}\n\n/** Local noon of civil date `iso` in `timeZone` — the presentation-only\n * representative instant for calendar buckets (never a join key). */\nexport function zonedNoon(iso: string, timeZone: string): number {\n return zonedStartOfDay(iso, timeZone) + 12 * 3_600_000;\n}\n\n/** A resolved range: [start, end). `endExclusive` marks the half-open\n * convention; `end === Number.MAX_SAFE_INTEGER` with `endExclusive ===\n * false` is the unbounded side. */\nexport interface ResolvedRange {\n readonly start: number;\n readonly end: number;\n /** True when `end` is an exclusive half-open bound (calendar windows and\n * captured-instant relative cutoffs). */\n readonly endExclusive: boolean;\n}\n\n/** Resolve a parsed query window against the captured context — the single\n * window→range mapping every execution path shares (time contract):\n *\n * - `last Nd`: N local dates including today — midnight N−1 dates back\n * through the captured current instant (inclusive cutoff, exclusive\n * encoding `instant + 1`). Never N×86 400 000 ms.\n * - `last Nw`: current Monday-start week plus N−1 preceding complete\n * weeks, through the captured instant. Never a rolling 7N-date window.\n * - explicit `from`/`to`: both named dates included in full — implemented\n * as an exclusive bound at the following local midnight. An open `to`\n * stays unbounded. Future ranges are preserved, never replaced.\n */\nexport function resolveWindowRange(w: { kind: 'relative'; size: number; unit: 'd' | 'w' } | { kind: 'range'; start: string; end?: string } | undefined, ctx: ExecutionContext): ResolvedRange | undefined {\n if (!w) return undefined;\n if (w.kind === 'relative') {\n const today = civilDateOf(ctx.instant, ctx.timeZone);\n const start = w.unit === 'd'\n ? civilDateAdd(today, -(w.size - 1))\n : civilDateAdd(civilMonday(today), -7 * (w.size - 1));\n return {\n start: zonedStartOfDay(start, ctx.timeZone),\n end: ctx.instant + 1, // inclusive captured instant, exclusive encoding\n endExclusive: true,\n };\n }\n const start = zonedStartOfDay(w.start, ctx.timeZone);\n if (w.end === undefined) {\n return { start, end: Number.MAX_SAFE_INTEGER, endExclusive: false };\n }\n // Inclusive `to` civil date → exclusive bound at the following local midnight.\n return {\n start,\n end: zonedStartOfDay(civilDateAdd(w.end, 1), ctx.timeZone),\n endExclusive: true,\n };\n}\n\n/** Half-open membership predicate: start included, exclusive end excluded\n * (a metric exactly at Monday midnight belongs only to the new week).\n * Unbounded ends admit everything. */\nexport function inRange(instant: number, range: ResolvedRange | undefined): boolean {\n if (!range) return true;\n if (instant < range.start) return false;\n if (range.endExclusive) return instant < range.end;\n return instant <= range.end;\n}\n","/**\n * Query documents (wayfinder datadog-analytics ticket 17, per the query\n * documents contract).\n *\n * A query block is a self-contained document:\n *\n * defaults [by {dim, …}] [window]\n * <ident> = <query | expression> [(normalize <bucket>)] [-> <unit>]\n * show <ident>, …\n *\n * A body that carries no document constructs parses as a DEGENERATE document\n * wrapping the single query — zero behavior change for legacy bodies\n * (decision ticket 22: every widget body is a document; single-line bodies\n * are degenerate documents).\n *\n * Evaluation order follows the reference graph; forward references are\n * allowed; cycles are a document-level diagnostic.\n */\n\nimport { parseQuery, type AnyParsedQuery, type QueryWindow } from './wql';\n\nexport interface DocumentDefaults {\n groupBy?: string[];\n window?: QueryWindow;\n}\n\nexport interface DocumentFormula {\n expression: string;\n /** Referenced assignment names, in appearance order. */\n references: string[];\n /** Persisted normalization intent (user-selected target bucket). */\n normalize?: string;\n /** Explicit output unit directive. */\n unit?: string;\n}\n\nexport interface DocumentAssignment {\n name: string;\n kind: 'query' | 'formula';\n /** For kind 'query' — the parsed query of any family (defaults merged at run). */\n queryText?: string;\n parsed?: AnyParsedQuery;\n formula?: DocumentFormula;\n raw: string;\n}\n\nexport interface QueryDocument {\n defaults?: DocumentDefaults;\n assignments: DocumentAssignment[];\n show: string[];\n /** True when the body carried no document constructs (legacy single query). */\n degenerate: boolean;\n}\n\nexport interface ParsedDocument {\n doc: QueryDocument;\n diagnostics: string[];\n}\n\n/** A formula expression: identifiers bound to other assignments, arithmetic,\n * parentheses, numeric literals, and corr(a, b). */\nconst FORMULA_CHARS = /^[\\w\\s.+\\-*/(),]+$/;\n\n/** Extract referenced assignment names from a formula expression. */\nfunction referencesOf(expression: string, known: Set<string>): string[] {\n const refs: string[] = [];\n for (const match of expression.matchAll(/[A-Za-z_][\\w-]*/g)) {\n const name = match[0];\n if (known.has(name) && !refs.includes(name)) refs.push(name);\n }\n return refs;\n}\n\n/**\n * Parse a query-document body. Never throws: syntax problems surface as\n * diagnostics so one broken block never takes down a surface.\n */\nexport function parseDocument(text: string): ParsedDocument {\n const diagnostics: string[] = [];\n const lines = text.split('\\n').map((l) => l.trim()).filter((l) => l.length > 0 && !l.startsWith('//'));\n\n const defaults: DocumentDefaults = {};\n let hasDefaults = false;\n const assignments: DocumentAssignment[] = [];\n let show: string[] | undefined;\n let degenerate = false;\n\n const known = new Set<string>();\n\n for (const line of lines) {\n // defaults [by {…}] [window]\n if (line.startsWith('defaults ')) {\n hasDefaults = true;\n const rest = line.slice('defaults '.length).trim();\n const byMatch = /by\\s*\\{([^}]*)\\}/.exec(rest);\n if (byMatch) {\n defaults.groupBy = byMatch[1]!.split(',').map((d) => d.trim()).filter(Boolean);\n }\n const lastMatch = /last\\s+(\\d+)\\s*(d|w)/.exec(rest);\n if (lastMatch) {\n defaults.window = { kind: 'relative', size: Number(lastMatch[1]), unit: lastMatch[2] as 'd' | 'w' };\n }\n const fromMatch = /from\\s+(\\d{4}-\\d{2}-\\d{2})(?:\\s+to\\s+(\\d{4}-\\d{2}-\\d{2}))?/.exec(rest);\n if (fromMatch) {\n defaults.window = { kind: 'range', start: fromMatch[1]!, end: fromMatch[2] };\n }\n continue;\n }\n\n // show a, b\n if (line.startsWith('show ')) {\n show = line.slice('show '.length).split(',').map((s) => s.trim()).filter(Boolean);\n continue;\n }\n\n // <ident> = body\n const assign = /^([A-Za-z_][\\w-]*)\\s*=\\s*(.+)$/.exec(line);\n if (assign) {\n const name = assign[1]!;\n const body = assign[2]!.trim();\n known.add(name);\n\n // (normalize <bucket>) intent + -> <unit> directive\n const unitMatch = /->\\s*([\\w/%.]+)\\s*$/.exec(body);\n const normalizeMatch = /\\(normalize\\s+([^)]+)\\)/.exec(body);\n const expression = body\n .replace(/->\\s*[\\w/%.]+\\s*$/, '')\n .replace(/\\(normalize\\s+[^)]+\\)/, '')\n .trim();\n\n // Colon heads (`:journal{…}`, `:sum{…}`), dataset references\n // (`@today | …`), and pipe stages route to the query parser;\n // legacy `sum:`/`find:` heads keep their diagnostics.\n const looksLikeQuery = /^(sum|avg|min|max|count|last|delta|find|rows)\\b|^[:@|]/.test(expression);\n\n if (looksLikeQuery) {\n const parsed = parseQuery(expression);\n if (!parsed.error) {\n assignments.push({ name, kind: 'query', queryText: expression, parsed, raw: line });\n } else {\n diagnostics.push(`Assignment \"${name}\" is not a valid query`);\n }\n continue;\n }\n\n // Formula — must reference at least one known assignment and use\n // only expression characters.\n if (!FORMULA_CHARS.test(expression)) {\n diagnostics.push(`Assignment \"${name}\" has characters a formula cannot parse`);\n continue;\n }\n const formula: DocumentFormula = {\n expression,\n references: [],\n ...(normalizeMatch ? { normalize: normalizeMatch[1]!.trim() } : {}),\n ...(unitMatch ? { unit: unitMatch[1] } : {}),\n };\n assignments.push({ name, kind: 'formula', formula, raw: line });\n continue;\n }\n\n // Not a construct — legacy single-query body?\n degenerate = true;\n }\n\n // Degenerate: no document constructs → wrap the single query.\n if (!hasDefaults && show === undefined && !degenerate && assignments.length === 1 && assignments[0]!.kind === 'query') {\n // A bare single query is handled below.\n }\n if (!hasDefaults && show === undefined && assignments.length === 0) {\n const parsed = parseQuery(lines.join(' '));\n // Ticket 19: any family (aggregate / rows / find) runs degenerately.\n if (!parsed.error) {\n known.add('query');\n assignments.push({ name: 'query', kind: 'query', queryText: lines.join(' '), parsed, raw: lines.join(' ') });\n show = ['query'];\n degenerate = true;\n } else {\n diagnostics.push('Body is neither a valid query nor a valid document');\n }\n }\n\n // Resolve formula references AFTER all assignments are known (forward\n // references are legal); cycles are diagnostics.\n for (const assignment of assignments) {\n if (assignment.kind !== 'formula' || !assignment.formula) continue;\n assignment.formula.references = referencesOf(assignment.formula.expression, known);\n // Unknown identifiers are diagnostics, not silent zeros.\n for (const match of assignment.formula.expression.matchAll(/[A-Za-z_][\\w-]*/g)) {\n const name = match[0];\n if (!known.has(name)) {\n diagnostics.push(`Formula \"${assignment.name}\" references unknown name \"${name}\"`);\n }\n }\n if (assignment.formula.references.length === 0) {\n diagnostics.push(`Formula \"${assignment.name}\" references no named query or formula`);\n }\n }\n const cycle = findCycle(assignments);\n if (cycle) {\n diagnostics.push(`Reference cycle detected: ${cycle.join(' -> ')}`);\n }\n\n if (show === undefined) {\n // Default show: every query assignment (formulas surface when named).\n show = assignments.filter((a) => a.kind === 'query').map((a) => a.name);\n if (assignments.length > 0 && show.length === 0) show = [assignments[0]!.name];\n } else {\n for (const name of show) {\n if (!known.has(name)) diagnostics.push(`show references unknown name \"${name}\"`);\n }\n }\n\n return {\n doc: {\n ...(Object.keys(defaults).length > 0 ? { defaults } : {}),\n assignments,\n show,\n degenerate,\n },\n diagnostics,\n };\n}\n\nfunction findCycle(assignments: readonly DocumentAssignment[]): string[] | undefined {\n const formulas = new Map(assignments.filter((a) => a.kind === 'formula').map((a) => [a.name, a.formula!.references]));\n const state = new Map<string, 1 | 2>();\n const stack: string[] = [];\n const visit = (name: string): string[] | undefined => {\n const s = state.get(name);\n if (s === 2) return undefined;\n if (s === 1) {\n const start = stack.indexOf(name);\n return [...stack.slice(start === -1 ? 0 : start), name];\n }\n state.set(name, 1);\n stack.push(name);\n for (const ref of formulas.get(name) ?? []) {\n const cycle = visit(ref);\n if (cycle) return cycle;\n }\n stack.pop();\n state.set(name, 2);\n return undefined;\n };\n for (const name of formulas.keys()) {\n const cycle = visit(name);\n if (cycle) return cycle;\n }\n return undefined;\n}\n\n/** Lossless serialization: round-trips parse(serialize(parse(text))) to the\n * same document (used by dashboards and note rendering to persist intent). */\nexport function serializeDocument(doc: QueryDocument): string {\n if (doc.degenerate) {\n const only = doc.assignments[0];\n return only?.queryText ?? '';\n }\n const lines: string[] = [];\n if (doc.defaults) {\n const parts: string[] = [];\n if (doc.defaults.groupBy?.length) parts.push(`by {${doc.defaults.groupBy.join(', ')}}`);\n if (doc.defaults.window) {\n const w = doc.defaults.window;\n parts.push(w.kind === 'relative' ? `last ${w.size}${w.unit}` : `from ${w.start}${w.end ? ` to ${w.end}` : ''}`);\n }\n if (parts.length > 0) lines.push(`defaults ${parts.join(' ')}`);\n }\n for (const a of doc.assignments) {\n lines.push(a.raw);\n }\n if (doc.show.length > 0) lines.push(`show ${doc.show.join(', ')}`);\n return lines.join('\\n');\n}\n","/**\n * Document runner + formula evaluation (wayfinder datadog-analytics\n * ticket 17).\n *\n * - `FormulaEvaluator` is an INJECTED capability: the engine/app composition\n * adapts lang's calc Pratt evaluator behind it. `wql` ships a small\n * built-in pointwise arithmetic evaluator so documents evaluate without\n * the injection (add/sub/mul/div, corr) — never a dependency on lang.\n * - Post-aggregate formulas evaluate pointwise over the ALIGNMENT DOMAIN:\n * the intersection of input requested ranges and the union of observed\n * group tuples. Missing operands substitute zero, flagged as\n * missing-derived; missing-derived zeros are excluded from downstream\n * ordinary averages; division by zero propagates an error.\n * - `corr(a, b)` is paired-only over in-range positions; the pair count is\n * reported.\n */\n\nimport type { QueryWindow, PipelineSink } from './wql';\nimport type { Note, BlockIndexRow } from '@bitcobblers/wod-wiki-core';\nimport type { TabularResult, RowsRun, NoteContainer } from './QueryService';\nimport { parseDocument, type ParsedDocument, type QueryDocument, type DocumentAssignment } from './document';\n\n// ── Formula evaluation ──────────────────────────────────────────────────\n\n/** Presence provenance of one operand value at one aligned position. */\nexport interface OperandValue {\n value: number;\n /** True when the value was substituted for a missing input. */\n missingDerived: boolean;\n}\n\nexport type PointwiseInputs = Record<string, (position: number) => OperandValue | undefined>;\n\nexport interface FormulaEvaluation {\n value: number;\n missingDerived: boolean;\n error?: string;\n}\n\nexport interface FormulaEvaluator {\n /**\n * Evaluate `expression` at one aligned position. `inputs` maps referenced\n * assignment names to position accessors; a missing operand is `undefined`\n * (the evaluator substitutes zero and flags the result).\n */\n evaluate(expression: string, inputs: PointwiseInputs, position: number): FormulaEvaluation;\n}\n\n/** Built-in pointwise arithmetic evaluator (+ - * /, unary minus, corr-free). */\nexport function createBuiltinFormulaEvaluator(): FormulaEvaluator {\n const evalExpr = (expr: string, inputs: PointwiseInputs, position: number): FormulaEvaluation => {\n const trimmed = expr.trim();\n\n // Parenthesized group.\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\n return evalExpr(trimmed.slice(1, -1), inputs, position);\n }\n\n // Split on the lowest-precedence operator outside parentheses.\n const splitTop = (ops: string[]): { op: string; left: string; right: string } | undefined => {\n let depth = 0;\n for (let i = trimmed.length - 1; i >= 0; i--) {\n const ch = trimmed[i]!;\n if (ch === ')') depth++;\n else if (ch === '(') depth--;\n else if (depth === 0 && ops.includes(ch) && i > 0) {\n const op = ch;\n const left = trimmed.slice(0, i);\n const right = trimmed.slice(i + 1);\n if (left.trim() && right.trim()) return { op, left, right };\n }\n }\n return undefined;\n };\n\n const add = splitTop(['+']);\n if (add) {\n if (add.op === '+') {\n const l = evalExpr(add.left, inputs, position);\n const r = evalExpr(add.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value + r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n const sub = splitTop(['-']);\n if (sub && sub.op === '-') {\n const l = evalExpr(sub.left, inputs, position);\n const r = evalExpr(sub.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value - r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n const mul = splitTop(['*']);\n if (mul) {\n if (mul.op === '*') {\n const l = evalExpr(mul.left, inputs, position);\n const r = evalExpr(mul.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value * r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n const div = splitTop(['/']);\n if (div) {\n if (div.op === '/') {\n const l = evalExpr(div.left, inputs, position);\n const r = evalExpr(div.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n if (r.value === 0) {\n return { value: 0, missingDerived: false, error: 'Division by zero' };\n }\n return { value: l.value / r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n\n // Numeric literal.\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return { value: Number(trimmed), missingDerived: false };\n }\n\n // Operand reference.\n const accessor = inputs[trimmed];\n if (accessor) {\n const operand = accessor(position);\n if (operand === undefined) return { value: 0, missingDerived: true };\n return operand;\n }\n return { value: 0, missingDerived: true, error: `Unknown reference \"${trimmed}\"` };\n };\n\n return {\n evaluate(expression, inputs, position) {\n try {\n return evalExpr(expression, inputs, position);\n } catch (e) {\n return { value: 0, missingDerived: true, error: e instanceof Error ? e.message : String(e) };\n }\n },\n };\n}\n\n// ── Document results ────────────────────────────────────────────────────\n\n/** Append document-default window/groupBy as textual suffixes before family\n * dispatch — defaults apply to find and pipeline documents too (a bare\n * `last 4w` block default must bound a `:journal{…}` content run). */\nexport function appendSuffixes(queryText: string, window: QueryWindow, groupBy?: string[]): string {\n let text = queryText;\n if (groupBy && groupBy.length > 0 && !/by\\s*\\{/.test(text)) {\n text += ` by {${groupBy.join(', ')}}`;\n }\n if (window.kind === 'relative' && !/\\blast\\b/.test(text)) {\n text += ` last ${window.size}${window.unit}`;\n } else if (window.kind === 'range' && !/\\bfrom\\b/.test(text)) {\n text += ` from ${window.start}${window.end ? ` to ${window.end}` : ''}`;\n }\n return text;\n}\n\n\n/** One ordered `show` output — widget-independent (ticket 19 consumes). */\nexport interface DocumentOutput {\n name: string;\n kind: 'aggregate' | 'formula' | 'find' | 'pipeline';\n /** Ticket 19 — TabularResult for cross-workout rows outputs. */\n table?: TabularResult;\n unit?: string;\n groupBy?: string[];\n window?: QueryWindow;\n /** Series for aggregate and formula outputs. */\n series?: Array<{ key: string; label: string; points: Array<{ ts: number; value: number; missing?: boolean; missingDerived?: boolean }>; unit?: string }>;\n /** Formula provenance: pair counts for corr, coverage notes. */\n pairs?: number;\n /** Content-plane payloads (find / find-source pipeline outputs). */\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n /** Highest-container page/note links keyed by note id. */\n containers?: Record<string, NoteContainer>;\n /** Session run cards (find:session / session-source pipelines). */\n runs?: RowsRun[];\n /** Terminal chart sink of a pipeline output (renderer dispatch). */\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface DocumentResult {\n outputs: DocumentOutput[];\n diagnostics: string[];\n}\n\n/** Payload surfaces the ticket-19 family dispatch may hand back. */\nexport interface FamilyRunPayload {\n series?: DocumentOutput['series'];\n table?: TabularResult;\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n containers?: Record<string, NoteContainer>;\n runs?: RowsRun[];\n unit?: string;\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface QueryDocumentRunnerOptions {\n /** Injected formula evaluator (lang's calc evaluator via the engine). */\n formulaEvaluator?: FormulaEvaluator;\n /** Host default window — used only when the document has none. */\n rangeStart?: number;\n rangeEnd?: number;\n /** Ticket 19 family dispatch: find queries surface FindQueryResult. */\n runFind?: (queryText: string) => Promise<FamilyRunPayload>;\n /** Pipeline queries (`:source | :fn | :chart`, `@dataset | …`) surface\n * the pipeline result — the host's QueryService.runPipeline. */\n runPipeline?: (queryText: string) => Promise<FamilyRunPayload>;\n}\n\nexport class QueryDocumentRunner {\n private readonly evaluator: FormulaEvaluator;\n constructor(\n private readonly runAggregate: (queryText: string, overrides: { groupBy?: string[]; window?: QueryWindow }) => Promise<{\n series?: DocumentOutput['series'];\n unit?: string;\n error?: string;\n window?: QueryWindow;\n }>,\n options: QueryDocumentRunnerOptions = {},\n ) {\n this.options = options;\n this.evaluator = options.formulaEvaluator ?? createBuiltinFormulaEvaluator();\n }\n private readonly options: QueryDocumentRunnerOptions;\n\n /** Parse → validate → evaluate in reference order → ordered outputs. */\n async run(text: string): Promise<DocumentResult> {\n const parsed: ParsedDocument = parseDocument(text);\n const diagnostics = [...parsed.diagnostics];\n const doc: QueryDocument = parsed.doc;\n const outputs: DocumentOutput[] = [];\n\n const values = new Map<string, { byPosition: Map<number, OperandValue>; unit?: string; groupKeys: string[] }>();\n\n const evaluate = async (assignment: DocumentAssignment): Promise<void> => {\n if (assignment.kind === 'query') {\n const merged = this.mergeDefaults(assignment, doc);\n // Family dispatch: content nouns never aggregate; pipelines\n // run their source→transform→sink chain on the host.\n const parsedFamily = assignment.parsed?.family;\n if (parsedFamily === 'find') {\n const text = merged.window\n ? appendSuffixes(merged.queryText, merged.window, merged.groupBy)\n : merged.queryText;\n const findRun = (await this.options?.runFind?.(text)) ?? {\n error: 'find queries are not supported by this host',\n };\n outputs.push({\n name: assignment.name,\n kind: 'find',\n ...(findRun.notes ? { notes: findRun.notes } : {}),\n ...(findRun.blocks ? { blocks: findRun.blocks } : {}),\n ...(findRun.efforts ? { efforts: findRun.efforts } : {}),\n ...(findRun.containers ? { containers: findRun.containers } : {}),\n ...(findRun.runs ? { runs: findRun.runs } : {}),\n ...(findRun.table ? { table: findRun.table } : {}),\n ...(findRun.unit ? { unit: findRun.unit } : {}),\n ...(findRun.error ? { error: findRun.error } : {}),\n });\n return;\n }\n // NOTE: no 'rows' family exists in AnyParsedQuery — textual\n // rows: heads are retired at the parser, so no host dispatch.\n if (parsedFamily === 'pipeline') {\n const text = merged.window\n ? appendSuffixes(merged.queryText, merged.window, merged.groupBy)\n : merged.queryText;\n const pipelineRun = (await this.options?.runPipeline?.(text)) ?? {\n error: 'pipeline queries are not supported by this host',\n };\n // A numeric pipeline stage feeds downstream formulas.\n const byPosition = new Map<number, OperandValue>();\n for (const s of pipelineRun.series ?? []) {\n for (const point of s.points) {\n if (!point.missing) byPosition.set(point.ts, { value: point.value, missingDerived: false });\n }\n }\n if (byPosition.size > 0) {\n values.set(assignment.name, { byPosition, unit: pipelineRun.unit, groupKeys: (pipelineRun.series ?? []).map((s) => s.key) });\n }\n outputs.push({\n name: assignment.name,\n kind: 'pipeline',\n ...(pipelineRun.series ? { series: pipelineRun.series } : {}),\n ...(pipelineRun.table ? { table: pipelineRun.table } : {}),\n ...(pipelineRun.notes ? { notes: pipelineRun.notes } : {}),\n ...(pipelineRun.blocks ? { blocks: pipelineRun.blocks } : {}),\n ...(pipelineRun.efforts ? { efforts: pipelineRun.efforts } : {}),\n ...(pipelineRun.containers ? { containers: pipelineRun.containers } : {}),\n ...(pipelineRun.runs ? { runs: pipelineRun.runs } : {}),\n ...(pipelineRun.unit ? { unit: pipelineRun.unit } : {}),\n ...(pipelineRun.chart ? { chart: pipelineRun.chart } : {}),\n ...(pipelineRun.error ? { error: pipelineRun.error } : {}),\n });\n return;\n }\n const run = await this.runAggregate(merged.queryText, {\n groupBy: merged.groupBy,\n window: merged.window,\n });\n const series = run.series ?? [];\n // Record positions for downstream formulas.\n const byPosition = new Map<number, OperandValue>();\n for (const s of series) {\n for (const point of s.points) {\n if (!point.missing) {\n byPosition.set(point.ts, { value: point.value, missingDerived: false });\n }\n }\n }\n values.set(assignment.name, { byPosition, unit: run.unit, groupKeys: series.map((s) => s.key) });\n outputs.push({\n name: assignment.name,\n kind: 'aggregate',\n unit: run.unit,\n ...(doc.defaults?.groupBy ? { groupBy: doc.defaults.groupBy } : {}),\n ...(merged.window ? { window: merged.window } : {}),\n series,\n ...(run.error ? { error: run.error } : {}),\n });\n return;\n }\n\n // Formula — pointwise over the union of the inputs' positions.\n const formula = assignment.formula!;\n const inputs: PointwiseInputs = {};\n const positions = new Set<number>();\n for (const ref of formula.references) {\n const input = values.get(ref);\n if (!input) {\n diagnostics.push(`Formula \"${assignment.name}\" references unavailable input \"${ref}\"`);\n return;\n }\n for (const position of input.byPosition.keys()) positions.add(position);\n inputs[ref] = (position) => input.byPosition.get(position);\n }\n const byPosition = new Map<number, OperandValue>();\n let error: string | undefined;\n let pairCount: number | undefined;\n if (formula.expression.startsWith('corr(') && formula.expression.endsWith(')')) {\n // corr(a, b): Pearson over paired in-range positions —\n // either-side-missing pairs are excluded (paired-only).\n const [aName, bName] = formula.expression.slice(5, -1).split(',').map((s) => s.trim());\n const a = values.get(aName!)?.byPosition;\n const b = values.get(bName!)?.byPosition;\n if (!a || !b) {\n diagnostics.push(`corr(\"${aName}\", \"${bName}\") references unavailable inputs`);\n return;\n }\n const pairs: Array<[number, number]> = [];\n for (const [position, av] of a) {\n const bv = b.get(position);\n if (bv && !av.missingDerived && !bv.missingDerived) pairs.push([av.value, bv.value]);\n }\n pairCount = pairs.length;\n if (pairs.length < 2) {\n outputs.push({\n name: assignment.name, kind: 'formula', pairs: pairCount,\n error: 'corr needs at least two paired positions',\n });\n values.set(assignment.name, { byPosition: new Map(), groupKeys: [] });\n return;\n }\n const mean = (xs: number[]) => xs.reduce((s, v) => s + v, 0) / xs.length;\n const ma = mean(pairs.map(([x]) => x));\n const mb = mean(pairs.map(([, y]) => y));\n let cov = 0, va = 0, vb = 0;\n for (const [x, y] of pairs) {\n cov += (x - ma) * (y - mb);\n va += (x - ma) ** 2;\n vb += (y - mb) ** 2;\n }\n if (va === 0 || vb === 0) {\n outputs.push({\n name: assignment.name, kind: 'formula', pairs: pairCount,\n error: 'corr is undefined for zero-variance inputs',\n });\n values.set(assignment.name, { byPosition: new Map(), groupKeys: [] });\n return;\n }\n const value = cov / Math.sqrt(va * vb);\n byPosition.set(0, { value, missingDerived: false });\n outputs.push({ name: assignment.name, kind: 'formula', pairs: pairCount, series: [{ key: 'corr', label: 'corr', points: [{ ts: 0, value }] }] });\n values.set(assignment.name, { byPosition, groupKeys: ['corr'] });\n return;\n }\n\n for (const position of [...positions].sort((a, b) => a - b)) {\n const evaluation = this.evaluator.evaluate(formula.expression, inputs, position);\n if (evaluation.error) {\n error = evaluation.error;\n continue;\n }\n byPosition.set(position, { value: evaluation.value, missingDerived: evaluation.missingDerived });\n }\n const series = [{\n key: assignment.name,\n label: assignment.name,\n points: [...byPosition.entries()].map(([ts, v]) => ({\n ts,\n value: v.value,\n ...(v.missingDerived ? { missingDerived: true } : {}),\n })),\n }];\n values.set(assignment.name, { byPosition, unit: formula.unit, groupKeys: [assignment.name] });\n outputs.push({\n name: assignment.name,\n kind: 'formula',\n ...(formula.unit ? { unit: formula.unit } : {}),\n series,\n ...(error ? { error } : {}),\n });\n };\n\n // Evaluation follows the reference graph; cycles were diagnosed at\n // parse. Iterate to a fixpoint over unordered assignments.\n const pending = [...doc.assignments];\n let progressed = true;\n const evaluated = new Set<string>();\n while (pending.length > 0 && progressed) {\n progressed = false;\n for (let i = pending.length - 1; i >= 0; i--) {\n const assignment = pending[i]!;\n const refs = assignment.formula?.references ?? [];\n if (refs.every((r) => evaluated.has(r))) {\n await evaluate(assignment);\n evaluated.add(assignment.name);\n pending.splice(i, 1);\n progressed = true;\n }\n }\n }\n\n // Keep only ordered show outputs (plus diagnostics).\n const shown = new Set(doc.show);\n return {\n outputs: outputs.filter((o) => shown.has(o.name)),\n diagnostics,\n };\n }\n\n /** Defaults precedence (ticket 17): explicit per-query range/grouping >\n * block defaults > host. Explicit per-query by{} fully replaces block\n * grouping — never merges. */\n private mergeDefaults(\n assignment: DocumentAssignment,\n doc: QueryDocument,\n ): { queryText: string; groupBy?: string[]; window?: QueryWindow } {\n const parsed = assignment.parsed;\n const aggregateGroupBy = parsed?.family === 'aggregate' ? parsed.groupBy : undefined;\n const groupBy = aggregateGroupBy?.length ? aggregateGroupBy : doc.defaults?.groupBy;\n // Pipelines carry no defaultable window — their source query owns\n // one; aggregates/finds fall back to the document default as before.\n const window = (parsed && parsed.family !== 'pipeline' ? parsed.window : undefined) ?? doc.defaults?.window;\n return {\n queryText: assignment.queryText ?? '',\n ...(groupBy ? { groupBy } : {}),\n ...(window ? { window } : {}),\n };\n }\n}\n","/**\n * QueryDocumentRunner — the ONE execution path for query documents\n * (wayfinder datadog-analytics ticket 19, per the shared query execution\n * contract). Dashboard surfaces and embedded note query documents evaluate\n * through this runner via a host adapter; no surface runs queries itself.\n *\n * Per document run:\n * 1. token substitution (`$name` → active parameter values, raw text);\n * 2. parse as a QueryDocument (degenerate single query = legacy body);\n * 3. AST rollup inspection — `calc.*`-class targets (including pipeline\n * transform stages) trigger the host's rollup-ensure ONCE per run\n * (never string matching over query text);\n * 4. one captured execution context threads every window resolution;\n * 5. family dispatch: aggregate → aggregate run, find → runFind,\n * rows → runRows, pipeline → runPipeline.\n *\n * Zero browser dependencies — stores, catalog, and evaluator are injected.\n * Hosts that lack a family capability surface a diagnostic on the output —\n * never a silent empty result.\n */\n\nimport type { EventRecord, Note, BlockIndexRow } from '@bitcobblers/wod-wiki-core';\nimport { QueryDocumentRunner as FormulaAwareRunner, type DocumentResult, type DocumentOutput, type FormulaEvaluator, type FamilyRunPayload, appendSuffixes } from './documentRunner';\nimport { parseDocument, serializeDocument } from './document';\nimport { captureContext, type ExecutionContext } from './calendar';\nimport type { DocumentAssignment } from './document';\nimport type { AnyParsedQuery, QueryWindow } from './wql';\nimport type { RowsRun, TabularResult, NoteContainer } from './QueryService';\n\nexport interface RollupTarget {\n /** The calc target key, e.g. `calc.acwr`. */\n key: string;\n}\n\n/** Host-populated page source dataset: named standard sources (`@session`,\n * `@today`, user names include `@`) resolved in memory before queries run. */\nexport interface PageSourceEntry {\n events: EventRecord[];\n notes: Note[];\n}\n\n/**\n * PageSourceRegistry — the host's named page-source store (ticket 5).\n * Constructed/populated ONCE per page load / run context, BEFORE child\n * queries evaluate. Dataset pipeline stages (`@today | :sum{…}`) read it\n * synchronously through `QueryServiceStores.datasetStore` — no database\n * roundtrip downstream.\n */\nexport class PageSourceRegistry extends Map<string, PageSourceEntry> {\n /** QueryService datasetStore seam alias — names include the `@`. */\n getDataset(name: string): PageSourceEntry | undefined {\n return this.get(name);\n }\n}\n\nexport interface QueryDocumentRunnerHost {\n runAggregate(queryText: string, overrides: {\n groupBy?: string[];\n window?: QueryWindow;\n context?: ExecutionContext;\n }): Promise<{\n series?: DocumentOutput['series'];\n unit?: string;\n error?: string;\n }>;\n runFind?(queryText: string, context?: ExecutionContext): Promise<{\n kind: 'find';\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n containers?: Record<string, NoteContainer>;\n runs?: RowsRun[];\n table?: TabularResult;\n unit?: string;\n error?: string;\n }>;\n /** Pipeline execution (`:source | :fn | :chart`, `@dataset | …`) — the\n * host's QueryService.runPipeline. */\n runPipeline?(queryText: string, context?: ExecutionContext): Promise<FamilyRunPayload>;\n /** Injected formula evaluator override (engine/app composition adapts\n * lang's calc evaluator); the built-in pointwise evaluator otherwise. */\n formulaEvaluator?: FormulaEvaluator;\n /** Host rollup driver: recompute-on-open for `calc.*` facts. Must skip\n * already-up-to-date prerequisites (no ensure→refresh loop). */\n rollupEnsure?: () => Promise<void>;\n}\n\nexport interface SharedRunnerOptions {\n formulaEvaluator?: FormulaEvaluator;\n /** One captured execution context per document run (ticket 12). */\n context?: ExecutionContext;\n /** Host default range — applies only when the document has no window. */\n rangeStart?: number;\n rangeEnd?: number;\n /** Active token values (frontmatter controls, dashboard controls). */\n tokens?: Record<string, string>;\n}\n\nconst ROLLUP_TARGETS = ['calc.acwr', 'calc.monotony', 'calc.strain'];\n\nexport class QueryDocumentRunner {\n private readonly host: QueryDocumentRunnerHost;\n private readonly initialOptions: SharedRunnerOptions;\n\n constructor(host: QueryDocumentRunnerHost, options: SharedRunnerOptions = {}) {\n this.host = host;\n this.initialOptions = options;\n }\n\n /**\n * Run one document. `runOptions` override construction-time captures\n * (tokens, context) — one capture per run. Each run gets its OWN\n * evaluation snapshot: overlapping runs (one awaiting rollupEnsure while\n * another executes) can never borrow each other's context.\n */\n async run(text: string, runOptions: SharedRunnerOptions = {}): Promise<DocumentResult> {\n const captured: SharedRunnerOptions = {\n ...this.initialOptions,\n ...runOptions,\n tokens: { ...this.initialOptions.tokens, ...runOptions.tokens },\n // One captured execution context per run (ticket 12): callers\n // that supply none still get a single capture for the run.\n context: runOptions.context ?? this.initialOptions.context ?? captureContext(),\n };\n\n // 1. Token substitution — raw text at execution time.\n const substituted = substituteTokens(text, captured.tokens ?? {});\n\n // 3. AST rollup inspection on the substituted text: a calc.* target\n // in the parsed head — including pipeline transform stages — triggers\n // the host ensure exactly once.\n const parsed = parseDocument(substituted);\n if (parsed.doc.assignments.some((a: DocumentAssignment) => consumesRollupFacts(a.parsed))) {\n await this.host.rollupEnsure?.();\n }\n\n // 4+5. Document evaluation — the formula-aware runner (ticket 17)\n // drives semantics; its hooks bind THIS run's snapshot. Missing host\n // capabilities surface the diagnostic on the output — never a silent\n // empty result.\n const formulaRunner = new FormulaAwareRunner(async (queryText, overrides) => {\n if (overrides.window) {\n queryText = appendSuffixes(queryText, overrides.window, overrides.groupBy);\n }\n return this.host.runAggregate(queryText, { context: captured.context, window: overrides.window });\n }, {\n // The injected evaluator (ticket 17 seam) wins; the host may also\n // carry one; otherwise the built-in evaluates.\n formulaEvaluator: captured.formulaEvaluator ?? this.host.formulaEvaluator,\n runFind: async (queryText) => {\n const res = await this.host.runFind?.(queryText, captured.context);\n return res ?? { error: 'find queries are not supported by this host' };\n },\n runPipeline: async (queryText) => {\n const res = await this.host.runPipeline?.(queryText, captured.context);\n return res ?? { error: 'pipeline queries are not supported by this host' };\n },\n });\n return formulaRunner.run(substituted);\n }\n}\n\n/** Substitute `$name` tokens with active parameter values (raw text). */\nexport function substituteTokens(text: string, tokens: Record<string, string>): string {\n return text.replace(/\\$([A-Za-z_][\\w-]*)/g, (match, name: string) => {\n const value = tokens[name];\n return value !== undefined ? value : match;\n });\n}\n\n/**\n * AST rollup inspection (replaces `.includes('calc.')` string sniffing):\n * true when the parsed head's metric — a pipeline's source aggregate metric\n * or any transform stage's — is a calc target whose derivation depends on\n * workload rollup facts.\n */\nexport function consumesRollupFacts(parsed: AnyParsedQuery | undefined): boolean {\n if (!parsed) return false;\n if (parsed.family === 'aggregate') return ROLLUP_TARGETS.includes(parsed.metric);\n if (parsed.family === 'pipeline') {\n if (parsed.source.kind === 'query' && parsed.source.query.family === 'aggregate'\n && ROLLUP_TARGETS.includes(parsed.source.query.metric)) return true;\n return parsed.transforms.some((t) => ROLLUP_TARGETS.includes(t.metric));\n }\n return false;\n}\n\n/** Re-export for surface parity with the ticket-17 module. */\nexport { parseDocument, serializeDocument };\n","/**\n * Workout derivation helpers for WQL QueryService and cross-store joins.\n */\n\nimport {\n MetricType,\n fieldRefKey,\n normalizeFieldPath,\n valueKindOf,\n type AnalyticsDataPoint,\n type FieldRef,\n type ResultOrigin,\n type StoredOutputStatement,\n type EventRecord,\n} from '@bitcobblers/wod-wiki-core';\n\n/**\n * Map a summary projection name to its Canonical Metric Key — the one key two\n * workouts must share for an aggregate to be compared across them. Same key\n * in fact rows and display. 'Total Volume' → 'totalVolume', 'TIS' → 'tis'.\n */\nexport function resolveCanonicalMetricKey(projectionName: string): string {\n const words = projectionName.trim().split(/[^a-zA-Z0-9]+/).filter(Boolean);\n return words\n .map((word, index) =>\n index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1),\n )\n .join('');\n}\n\n/**\n * Identity of the block a result belongs to, stamped on every fact row.\n */\nexport interface SummaryFactIdentity {\n noteId: string;\n resultId: string;\n /** Actionable occurrence and saved revision that produced the result. */\n blockId?: string;\n blockVersion?: number;\n /** Content-stable cross-note join key. */\n blockContentId?: string;\n /** Which surface produced the result; trend queries exclude 'playground' by default. */\n origin?: ResultOrigin;\n /** FK to the `page` store (copied from the parent note). */\n pageId?: string;\n /**\n * Canonical workout time — WorkoutResult.createdAt (true workout end).\n * Every fact row carries it as `timestamp` so time-range queries mean\n * \"when the workout happened\", never \"when the metric was derived\".\n */\n workoutTimestamp?: number;\n}\n\n/** Logs shape read by normalizeSummaryFacts (StoredOutputStatement-compatible). */\nexport interface SummaryFactSourceOutput {\n outputType?: string;\n metrics: readonly {\n type?: string;\n value?: unknown;\n image?: string;\n unit?: string;\n /** Summary-processor payload (effortSlug / effortDiscipline / effortIntensityTier / …). */\n metadata?: Record<string, unknown>;\n }[];\n timeSpan?: { started?: number; ended?: number };\n}\n\n/** Read a string metadata field off the projection value metric, when present. */\nfunction metadataString(metadata: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = metadata?.[key];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/**\n * Read the typed field reference off a metric's metadata (ticket 11) —\n * `{ path, kind, dimension? }` stamped by PropertyMetric at authoring.\n * Defensive shape check: legacy logs predate the stamp.\n */\nfunction readFieldRef(metadata: Record<string, unknown> | undefined): FieldRef | undefined {\n const ref = metadata?.fieldRef;\n if (!ref || typeof ref !== 'object') return undefined;\n const { path, kind, dimension } = ref as Record<string, unknown>;\n if (typeof path !== 'string' || path.length === 0 || typeof kind !== 'string') return undefined;\n return { path, kind: kind as FieldRef['kind'], ...(typeof dimension === 'string' ? { dimension } : {}) };\n}\n\n/** Group-tag pairs from grouped composed-calc emission, key-sorted. */\nfunction readGroupTags(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n const tags = metadata?.groupTags;\n if (!tags || typeof tags !== 'object') return undefined;\n const entries = Object.entries(tags as Record<string, unknown>)\n .filter((pair): pair is [string, string] => typeof pair[1] === 'string' && pair[1].length > 0)\n .sort(([a], [b]) => (a < b ? -1 : 1));\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n/**\n * One fold definition shared by every summary emitter: Tier-2 outputs\n * (outputType 'analytics') folded keep-last per rowKey\n * (`metricKey[:k=v…]`, group tags key-sorted — spec §7.1).\n */\ninterface FoldedSummary {\n projectionName: string;\n metricKey: string;\n value: number;\n unit?: string;\n effortSlug?: string;\n discipline?: string;\n intensityTier?: string;\n grade?: string;\n groupTags?: Record<string, string>;\n /** Typed identity (ticket 11) — carried so re-emission keeps ONE catalog\n * identity for the field instead of splitting path-only duplicates. */\n fieldRef?: FieldRef;\n rowKey: string;\n started?: number;\n}\n\nfunction foldSummaryOutputs(logs: readonly SummaryFactSourceOutput[]): Map<string, FoldedSummary> {\n const folded = new Map<string, FoldedSummary>();\n for (const output of logs) {\n if (output.outputType !== 'analytics') continue;\n const label = output.metrics.find(m => m.type === MetricType.Label);\n const value = output.metrics.find(m => m.type !== MetricType.Label && typeof m.value === 'number');\n if (!label || !value) continue;\n\n const projectionName = String(label.value ?? label.image ?? '');\n if (!projectionName) continue;\n // Key resolution order (ticket 11): explicitly-stamped canonicalKey\n // (calc seeds, wellness) keeps working unchanged; the typed field\n // reference (PropertyMetric fieldRef) is the normalized custom identity;\n // legacy projections fall back to name-derived keys during cutover.\n const fieldRef = readFieldRef(value.metadata);\n const metricKey = metadataString(value.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? resolveCanonicalMetricKey(projectionName);\n\n const effortSlug = metadataString(value.metadata, 'effortSlug');\n const discipline = metadataString(value.metadata, 'effortDiscipline');\n const intensityTier = metadataString(value.metadata, 'effortIntensityTier');\n const grade = metadataString(value.metadata, 'grade');\n\n // Grouped dims auto-tag; legacy per-effort projections tag `effort`\n // from their effortSlug metadata.\n const groupTags = readGroupTags(value.metadata) ?? (effortSlug ? { effort: effortSlug } : undefined);\n // Fold identity (ticket 11): typed variants fold under the full typed\n // key — path + kind + dimension — so two variants of one path never\n // fold together. Legacy rows keep the metricKey[:k=v…] shape.\n const rowKey = fieldRef\n ? `${fieldRefKey(fieldRef)}${groupTags ? ':' + Object.entries(groupTags).map(([k, v]) => `${k}=${v}`).join(':') : ''}`\n : groupTags\n ? `${metricKey}:${Object.entries(groupTags).map(([k, v]) => `${k}=${v}`).join(':')}`\n : metricKey;\n\n folded.set(rowKey, {\n projectionName, metricKey, value: value.value as number, unit: value.unit,\n effortSlug, discipline, intensityTier, grade, groupTags, rowKey,\n ...(fieldRef ? { fieldRef } : {}),\n started: output.timeSpan?.started,\n });\n }\n return folded;\n}\n\n/**\n * Convert Tier-2 summary outputs (outputType 'analytics') in a result's logs\n * into persisted fact rows — one row per result × Canonical Metric Key.\n */\nexport function normalizeSummaryFacts(\n logs: readonly SummaryFactSourceOutput[],\n identity: SummaryFactIdentity,\n): AnalyticsDataPoint[] {\n const now = Date.now();\n return Array.from(foldSummaryOutputs(logs).values(), (f) => ({\n id: `${identity.resultId}-${f.rowKey}-${now}`,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n origin: identity.origin,\n pageId: identity.pageId,\n grain: 'summary' as const,\n blockId: identity.blockId ?? '',\n blockVersion: identity.blockVersion ?? 0,\n resultId: identity.resultId,\n type: f.metricKey,\n value: f.value,\n unit: f.unit,\n label: f.projectionName,\n metricKey: f.metricKey,\n metricLabel: f.projectionName,\n metricUnit: f.unit,\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.discipline ? { discipline: f.discipline } : {}),\n ...(f.intensityTier ? { intensityTier: f.intensityTier } : {}),\n ...(f.grade ? { grade: f.grade } : {}),\n // Ticket 12: anchored at the producing scope (workout timestamp); the\n // derivation clock is only the degenerate last resort.\n timestamp: identity.workoutTimestamp ?? f.started ?? now,\n createdAt: now,\n }));\n}\n\n/** Identity for unified event-row emission — same fields as the fact identity. */\nexport type EventRowIdentity = SummaryFactIdentity;\n\nfunction firstEffortSlug(metrics: StoredOutputStatement['metrics']): string | undefined {\n const loose = metrics as readonly { type?: string; value?: unknown; metadata?: Record<string, unknown> }[];\n for (const m of loose) {\n const slug = metadataString(m.metadata, 'effortSlug');\n if (slug) return slug;\n if (m.type === 'effort' || m.type === MetricType.Effort) {\n if (typeof m.value === 'string' && m.value) return m.value;\n }\n }\n return undefined;\n}\n\n/**\n * Logs → event rows, 1:1 per statement (ticket 002). Deterministic ids\n * `${resultId}:${seq}`; query-critical scalars promoted top-level.\n *\n * Ticket 12 temporal anchoring: the row timestamp is the statement's OWN\n * timeSpan start when it has one — the workout-start timestamp never\n * relocates a metric observation whose own instant differs. Statements with\n * a timeSpan carry per-metric temporal anchors ('instant') so projection\n * groups each observation under its own date.\n */\nexport function toEventRows(\n logs: readonly StoredOutputStatement[],\n identity: SummaryFactIdentity,\n): EventRecord[] {\n return logs.map((output, seq) => ({\n id: `${identity.resultId}:${seq}`,\n resultId: identity.resultId,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n pageId: identity.pageId,\n origin: identity.origin,\n timestamp: output.timeSpan?.started ?? identity.workoutTimestamp ?? Date.now(),\n grain: 'event' as const,\n outputType: output.outputType ?? 'segment',\n effortSlug: firstEffortSlug(output.metrics),\n metrics: output.metrics,\n timeSpan: output.timeSpan?.started !== undefined\n ? { started: output.timeSpan.started, ended: output.timeSpan.ended }\n : undefined,\n metricTemporal: output.timeSpan?.started !== undefined\n ? output.metrics.map(() => ({ temporalKind: 'instant' as const, instant: output.timeSpan!.started }))\n : undefined,\n sourceBlockKey: output.sourceBlockKey,\n stackLevel: output.stackLevel,\n line: output.line,\n sourceStatementId: output.sourceStatementId,\n text: output.text,\n dialect: output.dialect,\n completionReason: output.completionReason,\n blockId: identity.blockId,\n blockVersion: identity.blockVersion,\n }));\n}\n\n/**\n * Tier-2 analytics outputs → deterministic summary event rows (tickets\n * 002/004): id `${resultId}:summary:${rowKey}` — no timestamp salt, so\n * re-finalize overwrites cleanly. Fold identity lives in metrics[0].metadata\n * (canonicalKey, effort metadata, groupTags) — shape-uniform with events.\n */\nexport function toSummaryEventRows(\n logs: readonly StoredOutputStatement[],\n identity: SummaryFactIdentity,\n): EventRecord[] {\n const now = Date.now();\n return Array.from(foldSummaryOutputs(logs).values(), (f) => ({\n id: `${identity.resultId}:summary:${f.rowKey}`,\n resultId: identity.resultId,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n pageId: identity.pageId,\n origin: identity.origin,\n // Ticket 12: a summary is anchored at its producing scope — the workout\n // timestamp. The derivation clock is only the degenerate last resort\n // (rebuilding must never date a summary from the replay clock — a\n // headless replay's output timeSpan is derivation time, not coverage).\n // Coverage descriptors that describe the represented observations land\n // with ticket 14's summaryCoverage.\n timestamp: identity.workoutTimestamp ?? f.started ?? now,\n grain: 'summary' as const,\n outputType: 'analytics',\n // Ticket 14 provenance: engine-authored summaries are calculated\n // representations covering their producing scope. NO fabricated\n // reducerStats: the fold retains only the value, and the contract forbids\n // inventing observedCount (undefined = insufficient evidence for\n // count/avg; sum-shaped operations answer from the value alone).\n representationKind: 'calculated' as const,\n summaryCoverage: {\n scope: (f.effortSlug ? 'effort' : f.groupTags ? 'partition' : 'workout') as 'effort' | 'partition' | 'workout',\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.groupTags ? { groupTags: f.groupTags } : {}),\n },\n effortSlug: f.effortSlug,\n metrics: [{\n type: f.metricKey,\n value: f.value,\n ...(f.unit ? { unit: f.unit } : {}),\n metadata: {\n canonicalKey: f.metricKey,\n ...(f.fieldRef ? { fieldRef: f.fieldRef, originalKey: f.projectionName } : {}),\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.discipline ? { effortDiscipline: f.discipline } : {}),\n ...(f.intensityTier ? { effortIntensityTier: f.intensityTier } : {}),\n ...(f.groupTags ? { groupTags: f.groupTags } : {}),\n ...(f.grade ? { grade: f.grade } : {}),\n },\n }],\n blockId: identity.blockId,\n blockVersion: identity.blockVersion,\n }));\n}\n\n/**\n * Event row → flat fact currency for the four-stage plan (ticket 003):\n * one AnalyticsDataPoint per numeric metric. Canonical key resolution\n * mirrors the summary fold — metadata.canonicalKey first, name-derived\n * from the row's label metric as fallback. Deterministic fact ids:\n * `${record.id}:${factOrdinal}`.\n */\nexport function projectEventToFacts(record: EventRecord): AnalyticsDataPoint[] {\n const metrics = record.metrics as readonly {\n type?: string; value?: unknown; unit?: string; image?: string;\n metadata?: Record<string, unknown>;\n }[];\n\n if (record.grain === 'summary') {\n const m = metrics[0];\n if (!m || typeof m.value !== 'number') return [];\n // Ticket 11: canonicalKey (calc/wellness stamps) first, then the typed\n // field reference; legacy unkeyed summaries keep their type key.\n const fieldRef = readFieldRef(m.metadata);\n const metricKey = metadataString(m.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? (m.type ?? '');\n // Ticket 12: a civil-date temporal anchor keeps its recorded civil date\n // (never a fabricated midnight instant); instant facts group under the\n // anchor instant's civil date in the execution timezone at query time.\n const temporal = record.metricTemporal?.[0];\n // Partition identity (groupTags metadata) is a queryable dim set —\n // `{coach:greg}` / `by {coach}` resolve through factTagValue's fallback.\n const dims = readGroupTags(m.metadata);\n return [{\n id: `${record.id}:0`,\n noteId: record.noteId,\n blockContentId: record.blockContentId,\n origin: record.origin,\n pageId: record.pageId,\n grain: 'summary',\n blockId: record.blockId ?? '',\n blockVersion: record.blockVersion ?? 0,\n resultId: record.resultId,\n type: metricKey,\n value: m.value,\n unit: m.unit,\n label: metricKey,\n metricKey,\n metricLabel: metricKey,\n metricUnit: m.unit,\n ...(fieldRef ? { fieldRef } : {}),\n ...(temporal?.temporalKind === 'civil-date' && temporal.civilDate\n ? { metricDate: temporal.civilDate, temporalKind: 'civil-date' as const }\n : {}),\n // Wellness rows are reconcile-owned user recordings: DIRECT\n // observations even before ticket 14 stamps representationKind.\n representationKind: record.representationKind\n ?? (record.outputType === 'wellness' ? 'direct' as const : undefined),\n ...(record.summaryCoverage ? { summaryCoverage: record.summaryCoverage } : {}),\n ...(record.reducerStats ? { reducerStats: record.reducerStats } : {}),\n effortSlug: metadataString(m.metadata, 'effortSlug') ?? record.effortSlug,\n discipline: metadataString(m.metadata, 'effortDiscipline'),\n intensityTier: metadataString(m.metadata, 'effortIntensityTier'),\n grade: metadataString(m.metadata, 'grade'),\n ...(dims ? { dimensions: dims } : {}),\n timestamp: record.timestamp,\n createdAt: record.timestamp,\n }];\n }\n\n const label = metrics.find(m => m.type === MetricType.Label);\n const labelName = label ? String(label.value ?? label.image ?? '') : '';\n const effortMetric = metrics.find(m => m.type === MetricType.Effort || m.type === 'effort');\n const effortSlug = metadataString(metrics[0]?.metadata, 'effortSlug')\n ?? record.effortSlug\n ?? (effortMetric && typeof effortMetric.value === 'string' ? effortMetric.value : undefined);\n // A grade-typed metric (user-authored `grade: V8` or catalog-stamped)\n // names the observation's climb grade — the dim/filter twin of effortSlug.\n const gradeMetric = metrics.find(m => m.type === MetricType.Grade || m.type === 'grade');\n const rowGrade = metadataString(metrics[0]?.metadata, 'grade')\n ?? (gradeMetric && typeof gradeMetric.value === 'string' ? gradeMetric.value : undefined);\n\n const facts: AnalyticsDataPoint[] = [];\n // User-authored categorical dims: a property metric with a typed field\n // identity and a non-numeric value (e.g. `coach: greg`) projects no fact\n // of its own but names a dimension of every fact the statement emits —\n // queryable as `{coach:greg}` / `by {coach}` after factTagValue's switch.\n const dims: Record<string, string> = {};\n for (const m of metrics) {\n // Structural markers are display/compile-time plumbing, not user dims.\n if (m.type === MetricType.Label || m.type === 'label' || m.type === MetricType.Hint || m.type === 'hint') continue;\n const valueKind = valueKindOf(m.value);\n if (valueKind !== 'string' && valueKind !== 'boolean') continue;\n const ref = readFieldRef(m.metadata);\n const dimKey = ref?.path ?? normalizeFieldPath(m.type ?? '');\n if (dimKey) dims[dimKey] = String(m.value);\n }\n const rowDims = Object.keys(dims).length > 0 ? dims : undefined;\n metrics.forEach((m) => {\n if (m.type === MetricType.Label || m.type === 'label' || typeof m.value !== 'number') return;\n // Ticket 11 key resolution: explicitly-stamped canonicalKey first, then\n // the typed field reference — PropertyMetric variants survive under\n // their normalized path instead of collapsing into a pooled `custom`.\n // Legacy fallbacks for unlabeled legacy data only (pre-fieldRef logs):\n // label-derived key, `reps` for rep metrics, or the metric's own type.\n // A Custom-typed metric with no identity source no longer invents the\n // pooled `custom` key (finding 3.1) — it has no queryable identity, so\n // it projects no fact.\n const fieldRef = readFieldRef(m.metadata);\n const legacyFallback = m.type === MetricType.Rep || m.type === 'rep'\n ? 'reps'\n : (m.type ?? 'metric');\n if (!fieldRef && legacyFallback === 'custom') return;\n const metricKey = metadataString(m.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? (labelName ? resolveCanonicalMetricKey(labelName) : legacyFallback);\n const ordinal = facts.length;\n // Ticket 12: the fact carries its own temporal anchor — the metric's\n // occurrence instant when the row has one, so a workout-start\n // timestamp never relocates an observation whose own date differs.\n const temporal = record.metricTemporal?.[ordinal];\n const factTimestamp = temporal?.temporalKind === 'instant' && temporal.instant !== undefined\n ? temporal.instant\n : record.timestamp;\n facts.push({\n id: `${record.id}:${ordinal}`,\n noteId: record.noteId,\n blockContentId: record.blockContentId,\n origin: record.origin,\n pageId: record.pageId,\n grain: 'event',\n blockId: record.blockId ?? '',\n blockVersion: record.blockVersion ?? 0,\n resultId: record.resultId,\n type: metricKey,\n value: m.value,\n unit: m.unit,\n label: labelName || metricKey,\n metricKey,\n metricLabel: labelName || metricKey,\n metricUnit: m.unit,\n ...(fieldRef ? { fieldRef } : {}),\n ...(temporal?.temporalKind === 'civil-date' && temporal.civilDate\n ? { metricDate: temporal.civilDate, temporalKind: 'civil-date' as const }\n : {}),\n effortSlug: metadataString(m.metadata, 'effortSlug') ?? effortSlug,\n discipline: metadataString(m.metadata, 'effortDiscipline'),\n intensityTier: metadataString(m.metadata, 'effortIntensityTier'),\n grade: metadataString(m.metadata, 'grade') ?? rowGrade,\n ...(rowDims ? { dimensions: rowDims } : {}),\n timestamp: factTimestamp,\n createdAt: record.timestamp,\n });\n });\n return facts;\n}\n\n/**\n * Inverse of {@link toEventRows}/{@link toSummaryEventRows}: rebuild the\n * statement stream a session's event rows represent. Event rows keep their\n * recorded order (id `${resultId}:${seq}`); summary rows follow in fold\n * order. Consumers that need the statement shape (replay, review display)\n * read events and call this — the store keeps only event rows.\n */\nexport function eventsToStoredLogs(events: readonly EventRecord[]): StoredOutputStatement[] {\n const ordered = [...events].sort((a, b) => {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n return a.id.localeCompare(b.id);\n });\n return ordered.map((row, index) => ({\n id: index,\n outputType: row.outputType as StoredOutputStatement['outputType'],\n timeSpan: row.timeSpan ?? { started: row.timestamp },\n metrics: row.metrics,\n sourceBlockKey: row.sourceBlockKey,\n stackLevel: row.stackLevel,\n line: row.line,\n sourceStatementId: row.sourceStatementId,\n text: row.text,\n dialect: row.dialect,\n completionReason: row.completionReason,\n }));\n}\n","/**\n * Contribution selection — grain integrity and coverage (wayfinder\n * datadog-analytics ticket 16, per the automatic grain contract).\n *\n * Coverage is chosen within each workout/result and typed metric — never by\n * an `any attributed record exists` check over the whole query:\n *\n * - Detail observations and substitute summaries of the same population are\n * duplicate representations: only one is aggregated (detail wins).\n * - A summary with a coverage partition (effort / group tags) disjoint from\n * the present detail substitutes exactly for its uncovered partition —\n * provided its retained statistics answer the requested operation.\n * - A retained population represented only by an insufficient summary\n * reports insufficient evidence — never an invented observation.\n * - Explicit grain filters are hard source constraints and report\n * limitations rather than silently switching representation.\n */\n\nimport type { AnalyticsDataPoint, ReducerStats, SummaryCoverage } from '@bitcobblers/wod-wiki-core';\nimport type { Aggregator } from './wql';\n\n/** Compact coverage references carried on aggregate results (ticket 16\n * explainability; ticket 18's drill-down consumes the on-demand detail). */\nexport interface CoverageReport {\n /** (resultId, metric) populations selected as detail observations. */\n detailPopulations: number;\n /** Substitute summaries that answered the requested operation. */\n selectedSummaries: Array<{ resultId: string; metricKey: string; coverage?: SummaryCoverage }>;\n /** Duplicate representations dropped because detail covered them. */\n ignoredDuplicates: Array<{ resultId: string; metricKey: string; id: string }>;\n /** Populations that could not answer the operation — reported, never\n * silently omitted and never fabricated. */\n insufficientScopes: Array<{ resultId: string; metricKey: string; reason: string }>;\n}\n\n/** The partition a representation covers — effort + group-tag identity. */\nfunction partitionKey(coverage: SummaryCoverage | undefined, effortSlug: string | undefined): string {\n const tags = coverage?.groupTags\n ? Object.entries(coverage.groupTags).sort(([a], [b]) => (a < b ? -1 : 1)).map(([k, v]) => `${k}=${v}`).join(',')\n : '';\n return `${coverage?.effortSlug ?? effortSlug ?? ''}|${tags}`;\n}\n\n/** Whether the retained statistics answer the requested operation. */\nfunction statsSufficient(stats: ReducerStats | undefined, agg: Aggregator): boolean {\n if (!stats) {\n // A summary VALUE is itself the normalized total: sum-shaped and\n // endpoint aggregations are answerable from the value alone\n // (delta's two-observation rule is enforced by the reducer).\n return agg === 'sum' || agg === 'min' || agg === 'max' || agg === 'last' || agg === 'delta';\n }\n switch (agg) {\n case 'sum':\n case 'min':\n case 'max':\n case 'last':\n return true;\n case 'avg':\n case 'count':\n return typeof stats.observedCount === 'number';\n case 'delta':\n // Each summary contributes its value as one observation at its\n // metric date; the <2-observation rule is enforced by the\n // reducer (absent, not insufficient).\n return true;\n }\n}\n\nexport interface CoverageSelection {\n /** Facts to aggregate — one complete, non-overlapping representation. */\n selected: AnalyticsDataPoint[];\n report: CoverageReport;\n}\n\n/**\n * Coverage-based selection over the matched facts of one aggregate query.\n * Groups by (resultId, metricKey); within a group picks detail over\n * substituting summaries, admits only disjoint summary partitions, and\n * reports insufficient evidence instead of fabricating values.\n */\nexport function selectContributions(\n matched: readonly AnalyticsDataPoint[],\n agg: Aggregator,\n): CoverageSelection {\n const report: CoverageReport = {\n detailPopulations: 0,\n selectedSummaries: [],\n ignoredDuplicates: [],\n insufficientScopes: [],\n };\n const selected: AnalyticsDataPoint[] = [];\n\n // Population = one result × one metric key.\n const populations = new Map<string, AnalyticsDataPoint[]>();\n for (const fact of matched) {\n const key = `${fact.resultId}\\u0000${fact.metricKey ?? fact.type}`;\n const bucket = populations.get(key);\n if (bucket) bucket.push(fact);\n else populations.set(key, [fact]);\n }\n\n for (const [populationKey, facts] of populations) {\n const [resultId, metricKey] = populationKey.split('\\u0000');\n // Direct observations are detail regardless of storage grain —\n // user-recorded summary-grain values (wellness) are genuine\n // observations, not substitutes.\n const detail = facts.filter(\n (f) => f.grain !== 'summary' || f.representationKind === 'direct',\n );\n const summaries = facts.filter((f) => f.grain === 'summary');\n\n if (detail.length > 0) {\n report.detailPopulations += 1;\n selected.push(...detail);\n // Summaries whose coverage partition is already answered by the\n // detail are duplicate representations. A partition disjoint\n // from every detail observation substitutes for its partition.\n const detailPartitions = new Set(detail.map((f) => partitionKey(undefined, f.effortSlug)));\n for (const summary of summaries) {\n const summaryPartition = partitionKey(summary.summaryCoverage, summary.effortSlug);\n if (summaryPartition !== '|'\n && summary.summaryCoverage !== undefined\n && !detailPartitions.has(summaryPartition)\n && statsSufficient(summary.reducerStats, agg)) {\n report.selectedSummaries.push({ resultId, metricKey, coverage: summary.summaryCoverage });\n selected.push(summary);\n } else {\n report.ignoredDuplicates.push({ resultId, metricKey, id: summary.id });\n }\n }\n continue;\n }\n\n // Summaries only: every summary is a candidate substitute; each must\n // individually prove it answers the operation.\n let anyUsable = false;\n for (const summary of summaries) {\n if (statsSufficient(summary.reducerStats, agg)) {\n report.selectedSummaries.push({ resultId, metricKey, coverage: summary.summaryCoverage });\n selected.push(summary);\n anyUsable = true;\n }\n }\n if (!anyUsable) {\n report.insufficientScopes.push({\n resultId,\n metricKey,\n reason: agg === 'avg' || agg === 'count' || agg === 'delta'\n ? 'summary lacks the retained observation count this operation requires'\n : 'no detail rows and no sufficient summary for this population',\n });\n }\n }\n\n return { selected, report };\n}\n\n/**\n * Dedupe facts by stable observation identity — overlapping scope fetches\n * (note feed + explicit result:, content joins) contribute each observation\n * once. Repeated same-valued measurements keep their distinct ids.\n */\nexport function dedupeById<T extends { id: string }>(facts: readonly T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const fact of facts) {\n if (seen.has(fact.id)) continue;\n seen.add(fact.id);\n out.push(fact);\n }\n return out;\n}\n","/**\n * Query Service — the executor of WQL against the unified event store.\n * Four-stage physical plan:\n *\n * SELECT (window-first hybrid, ticket 003: windowed queries fetch through\n * by-timestamp — the one proven culling index; all-time queries\n * scan; by-metric is never used. Event rows are flattened to the\n * legacy flat-fact currency by projectEventToFacts.)\n * BUCKET (time dim or rollup period)\n * AGGREGATE (per bucket)\n * GROUP (tag-dimension fan-out)\n *\n * Inputs are uncapped — personal-journal scale; widgets and tables are dumb\n * consumers of QueryResult. The store serves UnifiedEventRecord rows\n * (grain 'event' | 'summary'); Tags are query-time dimensions read off the\n * projected fact row (effort, discipline, note, intensity, …) — 'tags'\n * resolves through the note_tags store.\n *\n * Fully inverted dependencies: zero IndexedDB/storage module-level imports.\n */\n\nimport type { AnalyticsDataPoint, Note, BlockIndexRow, EventRecord, Page, PageNote } from '@bitcobblers/wod-wiki-core';\nimport { normalizeFieldComponent, validateNoteBlocks } from '@bitcobblers/wod-wiki-core';\nimport {\n parseQuery,\n isFindQuery,\n isPipelineQuery,\n findTargetAdvisories,\n type Aggregator,\n type ComparisonOp,\n type ParsedAggregateQuery,\n type ParsedFindQuery,\n type ParsedPipelineQuery,\n type PipelineSink,\n type AnyParsedQuery,\n type QueryWindow,\n type ParsedRowsQuery,\n type FindPredicate,\n type MetricPredicate,\n type Series,\n type SeriesPoint,\n type TagFilter,\n} from './wql';\nimport { WQL_SOURCE_VALUES, WQL_TYPED_TAG_KEYS, type WqlTypedTagKey } from './vocabulary';\nimport { convertViaCatalog, resolveOutputUnit } from './units';\nimport { projectEventToFacts } from './derivation';\nimport { dedupeById, selectContributions, type CoverageReport } from './selection';\nimport {\n captureContext,\n civilDateAdd,\n civilDateDiff,\n civilDateOf,\n civilMonday,\n inRange,\n resolveWindowRange,\n zonedNoon,\n zonedStartOfDay,\n type ExecutionContext,\n type ResolvedRange,\n} from './calendar';\nimport type {\n EventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n NoteRelationBundle,\n WqlDomainOrder,\n WqlDomainPredicate,\n} from './stores';\n\nexport type {\n EventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n};\n\n\n/** User note identity shape — uuidv7 minted by the journal/persistence layer\n * (crypto.randomUUID on legacy rows). Seed corpus ids are path-shaped. */\nconst NOTE_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Extract the catalog directory id from a Note or BlockIndexRow.\n * Uses explicit `catalog` when present; falls back to parsing `sourceId`\n * (stripping `collection:`/`feed:` prefixes and `feeds/` path components) or `noteId`.\n * Exported so host mappers (Entry derivation) carry the exact field the\n * `catalog:` filter matches — presentation catalogs must not diverge. */\nexport function catalogOfItem(item: { id?: string; noteId?: string; sourceId?: string; catalog?: string }): string | undefined {\n if (item.catalog) return item.catalog;\n const isCollectionOrFeed = !!item.sourceId && /^(collection|feed):/.test(item.sourceId);\n const raw = isCollectionOrFeed ? item.sourceId!.replace(/^(collection|feed):/, '') : (item.noteId || item.id || '');\n if (!raw) return undefined;\n if (NOTE_UUID_RE.test(raw)) return undefined;\n const clean = raw.startsWith('feeds/') ? raw.slice('feeds/'.length) : raw;\n if (!isCollectionOrFeed && !clean.includes('/')) return undefined;\n return clean.split('/')[0];\n}\n\n/** Match a single row against one source filter value. The `journal` kind matches\n * rows with no sourceId, the literal 'journal', or UUID / journal/date lineage\n * pointing to the original note. Lineage also passes corpus exclusions below.\n * The feed / guide kinds match\n * rows whose sourceId starts with the kind (storage identities keep their\n * `collection:`/`page:collection:` prefixes — only the query vocabulary\n * was renamed). A `kind:id` literal matches the\n * exact id. `playground` matches the playground intake's sourceId convention\n * and, on the note plane, legacy rows typed 'playground' (playground pages\n * saved before the sourceId convention existed — their sourceId is absent).\n * `all` spans exactly the WQL source domain plus sourceless rows — identical\n * to the source fence. `journal` rejects the rest of the seed corpus: rows\n * with seed provenance (importer stamps, or surviving seedChunkId /\n * markdown/ sourcePath / catalog on legacy user-edited rows whose\n * seedOrigin flipped to 'user') and typed dashboards never journal — a user\n * journal note carries none of those markers. Exported so host mappers\n * classify result rows with the exact predicate the `source:` filter\n * applies. */\nexport function sourceMatches(\n item: {\n id?: string; noteId?: string; sourceId?: string; type?: string;\n seedOrigin?: string; seedChunkId?: string; sourcePath?: string; catalog?: string;\n },\n kind: string,\n): boolean {\n const sourceId = item.sourceId;\n if (kind === 'all') return !sourceId || WQL_SOURCE_VALUES.some((k) => sourceMatches(item, k));\n if (kind === 'journal') {\n if (item.type === 'playground' || item.id?.startsWith('playground/') || item.noteId?.startsWith('playground/')) return false;\n if (sourceId && sourceId !== 'journal' && !NOTE_UUID_RE.test(sourceId) && !/^journal\\/\\d{4}-\\d{2}-\\d{2}$/.test(sourceId)) return false;\n // UUID or legacy journal/date lineage still must pass corpus exclusions.\n return item.type !== 'dashboard'\n && item.type !== 'effort'\n && item.type !== 'equipment'\n && item.seedOrigin !== 'seed'\n && item.seedChunkId === undefined\n && !item.catalog\n && !(!!item.sourcePath && item.sourcePath.startsWith('markdown/'));\n }\n if (kind === 'feed' || kind === 'feeds') {\n return !!sourceId && (sourceId.startsWith('collection:') || sourceId.startsWith('page:collection:'));\n }\n if (kind === 'page' || kind === 'pages') {\n return !!sourceId && (sourceId === 'page' || sourceId.startsWith('page:') || sourceId.startsWith('guides:'));\n }\n if (kind === 'guide' || kind === 'guides') {\n return !!sourceId && sourceId.startsWith('guides:');\n }\n if (kind === 'playground') {\n return sourceId === 'playground' || item.type === 'playground';\n }\n if (kind.startsWith('feed:')) {\n // `feed:<slug>` targets one feed's notes; a full `feed:<slug>/<date>/<item>`\n // id targets that single note. Both the query value and the storage\n // sourceId may carry the optional `feeds/` path segment — compare with\n // it normalized away so the two feed-id conventions agree.\n const rest = kind.slice('feed:'.length).replace(/^feeds\\//, '');\n if (!rest || !sourceId?.startsWith('feed:')) return false;\n const idRest = sourceId.slice('feed:'.length).replace(/^feeds\\//, '');\n return idRest === rest || idRest.startsWith(`${rest}/`);\n }\n return sourceId === kind;\n}\n\n/** Apply the `source:` filter key to a list of objects that carry `sourceId`. */\nfunction applySourceFilter<T extends { sourceId?: string; type?: string }>(items: T[], filters: TagFilter[]): T[] {\n for (const filter of filters) {\n if (filter.key !== 'source') continue;\n const wants = filter.values.map(v => v.value);\n items = items.filter(item => {\n const match = wants.some(w => sourceMatches(item, w));\n return filter.negate ? !match : match;\n });\n }\n return items;\n}\n\n/** Source kinds whose matching is pure sourceId-shape logic on both planes.\n * `journal` additionally excludes legacy pg-* rows in JS and `all` spans the\n * whole WQL domain — queries naming them stay fully residual so the JS\n * predicate stays the sole decider. */\nconst DOMAIN_SOURCE_KINDS: Record<string, true> = {\n feed: true,\n feeds: true,\n page: true,\n pages: true,\n guide: true,\n guides: true,\n playground: true,\n};\n\n/** Compiled domain candidate read for a content plane. `selection` carries\n * the pre-count stages the wire performs before selectedCount (source\n * clauses + the :note defaultNotes exclusion + the explicit WQL source\n * fence); `filters` carries the post-count clauses (positive literal type /\n * exact id / literal text substring — the wire's case-insensitive text is\n * exactly the JS stage's lowercase-includes).\n * `residual` is true when ANY authored filter must still be\n * applied in JS — a residual read is never server-limited, because limiting\n * before a residual filter would drop rows the pipeline would have kept. */\ninterface CompiledContentRead {\n selection: WqlDomainPredicate[];\n filters: WqlDomainPredicate[];\n residual: boolean;\n}\n\n/** Compile a plane's content filters for the domain candidate read — only\n * clauses whose semantics match the storage wire exactly. Wildcards,\n * negations, tags/effort/catalog/date/page, and `journal`/`all` source\n * kinds stay residual JS filters. The candidate read is a SUPERSET either\n * way; the JS pipeline re-applies every stage and owns the final slice. */\nfunction compileContentRead(filters: TagFilter[], plane: 'note' | 'block', sourceScope?: string[]): CompiledContentRead {\n const selection: WqlDomainPredicate[] = [];\n const compiled: WqlDomainPredicate[] = [];\n let residual = false;\n for (const filter of filters) {\n const literal = !filter.negate && filter.values.every((v) => !v.wildcard);\n const values = literal ? filter.values.map((v) => v.value) : [];\n if (filter.key === 'source' && literal && filter.values.every((v) => DOMAIN_SOURCE_KINDS[v.value] === true)) {\n selection.push({ field: 'source', values });\n continue;\n }\n if (filter.key === 'type' && literal) {\n compiled.push({ field: 'type', values });\n continue;\n }\n if (filter.key === 'page') {\n // A page filter (any polarity) is applied in JS.\n residual = true;\n continue;\n }\n if (filter.key === 'text' && literal) {\n // Wire and JS both match title or the full authored Note body.\n compiled.push({ field: 'text', value: values.join(' ') });\n continue;\n }\n if (filter.key === 'note' && literal) {\n compiled.push({ field: plane === 'block' ? 'noteId' : 'id', values });\n continue;\n }\n residual = true;\n }\n if (plane === 'note' && sourceScope?.length) {\n selection.push({ field: 'source', values: sourceScope });\n }\n // The note plane is inclusive — no defaultNotes clause, no source fence\n // (generic :note surfaces every row). The block plane keeps its\n // historical fence: candidates come from the WQL source domain.\n if (plane === 'block') {\n selection.push({ field: 'sourceFence' });\n }\n return { selection, filters: compiled, residual };\n}\n\n/** :note pre-count selection stages — authored source clauses and the\n * parse-authored sourceScope, shared verbatim by the merged pipeline and\n * the static-plane selected count. The generic note plane is inclusive:\n * no default page exclusion and no source fence — feeds, arbitrary source\n * strings, typed pages and dashboards all surface; positive `source:`\n * filters and source negations do the scoping. */\nfunction applyNoteSelectionStages(notes: Note[], parsed: ParsedFindQuery): Note[] {\n let rows = applySourceFilter(notes, parsed.filters);\n if (parsed.sourceScope?.length) {\n const scope = parsed.sourceScope;\n rows = rows.filter((n) => scope.some((k) => sourceMatches(n, k)));\n }\n return rows;\n}\n\n/** Server order/page clauses for a candidate read. Natural id order rides\n * EVERY read: the server's default row order is unspecified, and id order\n * is exactly the historical whole-store iteration order the JS pipeline\n * surfaces when no `| order` pipe exists. offset/limit ride only when NO\n * residual filter, window, join, or authored order precedes the slice, so\n * limiting cannot drop rows the pipeline would keep. Authored `| order`\n * always sorts in JS over the complete candidate set instead. */\nfunction domainPaging(\n parsed: ParsedFindQuery,\n options: FindOptions,\n residual: boolean,\n): { order: WqlDomainOrder[]; offset?: number; limit?: number; paged: boolean } {\n const pipes = parsed.pipes;\n const wantsPage = pipes?.limit !== undefined || (pipes?.offset ?? 0) > 0;\n if (residual || parsed.join || parsed.window || options.range || pipes?.order || !wantsPage) {\n return { order: [{ field: 'id', direction: 'asc' }], paged: false };\n }\n return {\n order: [{ field: 'id', direction: 'asc' }],\n ...(pipes?.offset ? { offset: pipes.offset } : {}),\n ...(pipes?.limit !== undefined ? { limit: pipes.limit } : {}),\n paged: true,\n };\n}\n\n/** Resolve the single execution context for a run: the caller's captured\n * context when provided (ticket 19's runner captures once per document),\n * else a fresh capture from `anchorNow`/now in the system timezone. */\nfunction runContext(options: { context?: ExecutionContext; anchorNow?: number }): ExecutionContext {\n if (options.context) return options.context;\n return captureContext(options.anchorNow);\n}\n\n/** Time-window predicate for a row (C1 + ticket 12): the query's own window\n * WINS over the explicit host `range` option — the host range supplies the\n * default only when the query has none. Resolution happens against the one\n * captured execution context; membership is half-open [start, end). */\nfunction effectiveTimeWindow(\n createdAt: number,\n window: QueryWindow | undefined,\n range: ResolvedRange | undefined,\n ctx: ExecutionContext,\n): boolean {\n const resolved = window ? resolveWindowRange(window, ctx) : range;\n return inRange(createdAt, resolved);\n}\nfunction sessionCompletedAt(rows: EventRecord[]): number {\n const completion = rows.find((r) => r.outputType === 'completion');\n if (completion?.timestamp) return completion.timestamp;\n return rows[0]?.timestamp ?? 0;\n}\n\n/** C1 + ticket 12 range resolution for aggregate execution: the query's own\n * window WINS over the host range options — the host range is the default\n * when the query has none. Resolution against the one captured context;\n * membership half-open. */\nfunction resolveAggregateRange(\n parsed: ParsedAggregateQuery,\n options: QueryOptions,\n ctx: ExecutionContext,\n): ResolvedRange | undefined {\n if (parsed.window) return resolveWindowRange(parsed.window, ctx);\n if (options.rangeStart !== undefined || options.rangeEnd !== undefined) {\n return {\n start: options.rangeStart ?? 0,\n end: options.rangeEnd ?? Number.MAX_SAFE_INTEGER,\n endExclusive: false,\n };\n }\n return undefined;\n}\n\nconst defaultEventStore: EventStore = {\n getEventsByTimeRange: async () => [],\n getEventsByResult: async () => [],\n getEventsForNote: async () => [],\n getEventsByContent: async () => [],\n scanAll: async () => [],\n appendEvents: async () => {},\n finalizeSummaries: async () => {},\n deleteEvents: async () => {},\n};\n\nconst defaultNoteStore: NoteQueryStore = {\n getAllNotes: async () => [],\n getNoteIdsForTag: async () => new Set<string>(),\n getNoteTagLabels: async () => [],\n};\n\nconst defaultBlockStore: BlockQueryStore = {\n getAllBlocks: async () => [],\n};\n\nconst defaultEffortStore: EffortQueryStore = {\n getAllEfforts: async () => [],\n};\n\nexport interface FindQueryResult {\n parsed: ParsedFindQuery;\n notes: Note[];\n blocks: BlockIndexRow[];\n /** Registry rows for :effort queries. */\n efforts?: IEffort[];\n /** Session run cards for :session queries (#1041). */\n runs?: RowsRun[];\n /** Tabular output for :segment and :event queries (#1042). */\n table?: TabularResult;\n /** Raw event rows behind the result — session run statements and table\n * observations. Pipeline stages aggregate these in memory (no re-read). */\n events?: EventRecord[];\n /** Highest container per note id: the parent Page when the canonical\n * page_notes junction links one, else the standalone Note. Present only\n * when a pageStore is injected and notes were matched. */\n containers?: Record<string, NoteContainer>;\n stages: { selected: number; matched: number };\n}\n\n/** Highest-container link for a matched note (parent Page wins). `slug` and\n * `date` route app URLs (/p/:slug, /journal/:date). Core Page has no type —\n * the parent is never classified by the note's kind. */\nexport type NoteContainer =\n | { kind: 'page'; id: string; slug?: string; date?: string }\n | { kind: 'note'; id: string };\n\n/** Options for runPipeline: query options plus host-populated datasets.\n * `pageSources` wins over an injected `datasetStore`; both are synchronous\n * in-memory lookups — dataset stages never roundtrip the database. */\nexport interface PipelineOptions extends QueryOptions {\n /** Host-populated datasets keyed by name (names include `@`). */\n pageSources?: ReadonlyMap<string, { events: EventRecord[]; notes: Note[] }>;\n}\n\n/** Result of one pipeline run: the final stage's data under its existing\n * result type, plus the chart sink marker for the renderer. */\nexport interface PipelineResult {\n parsed: ParsedPipelineQuery;\n series?: Series[];\n table?: TabularResult;\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: IEffort[];\n runs?: RowsRun[];\n /** Highest container per note id (see FindQueryResult.containers). */\n containers?: Record<string, NoteContainer>;\n unit?: string;\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface QueryOptions {\n rangeStart?: number;\n rangeEnd?: number;\n /** App-level unit preference ('kg' | 'lb'). Used when query has no `in <unit>` directive. */\n preferredUnit?: string;\n /** Captured execution context (ticket 12) — one `{instant, timeZone}`\n * capture per document run; defaults to a fresh system capture. */\n context?: ExecutionContext;\n}\n\n/** Options for `runFind` / `runFindBlock` — overrides for the parsed WQL. */\nexport interface FindOptions {\n /** Host-supplied timestamp range (half-open [start, end)) — the DEFAULT\n * when the parsed WQL has no window; an explicit query window wins. */\n range?: ResolvedRange;\n /** Explicit reference time for the window (tests/replay). Superseded by\n * `context` when both are given. */\n anchorNow?: number;\n /** Captured execution context (ticket 12). */\n context?: ExecutionContext;\n}\n\nexport interface QueryResult {\n parsed: ParsedAggregateQuery;\n series: Series[];\n stages: { selected: number; buckets: number; aggregated: number; groups: number };\n matched: AnalyticsDataPoint[];\n /** Single scalar value when the result has exactly one point. */\n scalar?: number;\n /** Result display unit, if determined by directive, preference, or fact metadata. */\n unit?: string;\n /** First diagnostic across series (ticket 13) — per-widget badges in 19. */\n error?: string;\n /** Compact coverage references (ticket 16 explainability). */\n coverage?: CoverageReport;\n}\n\n/** One run in a rows result: the canonical result identity plus the event\n * rows that survived the optional output-type narrowing (`rows:segment{…}`). */\nexport interface RowsRun {\n resultId: string;\n noteId: string;\n /** Canonical workout time (result.createdAt under the unified model). */\n timestamp: number;\n events: EventRecord[];\n}\n\nexport interface RowsQueryResult {\n parsed: ParsedRowsQuery;\n runs: RowsRun[];\n error?: string;\n /** Ticket 18 — cross-workout tabular result (cross-workout rows only). */\n table?: TabularResult;\n}\n\n// ── Ticket 18: cross-workout analytical tables ──────────────────────────\n\nexport interface TabularColumn {\n name: string;\n type: 'date' | 'string' | 'number';\n unit?: string;\n}\n\n/** Civil dates (YYYY-MM-DD, `timeZone`-local) whose [local midnight,\n * next local midnight) windows intersect `[start, end)` — the by-metric-date\n * candidate set for the complete fetch (ticket 12/14). Callers pass bounded\n * ranges only: an unbounded side uses the all-store scan as the complete\n * fetch instead of enumerating an open horizon. */\nexport function civilDatesCoveredByRange(start: number, end: number, timeZone: string): string[] {\n const dates: string[] = [];\n let cursor = start;\n while (cursor < end) {\n const iso = civilDateOf(cursor, timeZone);\n // Cursor is monotone, so civil dates are non-decreasing — the\n // last-element check dedupes the mid-day start boundary.\n if (dates[dates.length - 1] !== iso) dates.push(iso);\n // Local midnight of the day AFTER `iso` — component math via\n // zonedStartOfDay: 23h/25h DST days still start at their own 00:00,\n // and nonexistent-midnight zones start the day at the transition\n // instant. Every covered civil date is enumerated, including the\n // end boundary's own (possibly partial) day.\n const nextMidnight = zonedStartOfDay(civilDateAdd(iso, 1), timeZone);\n // Progress guard: a stalled or backwards midnight must never loop\n // forever (NaN instants fail the `cursor < end` test and exit).\n if (nextMidnight <= cursor) break;\n cursor = nextMidnight;\n }\n return dates;\n}\n\n/** The stable tabular shape consumed by table widgets (ticket 19 wires\n * widgets): bounded page + full match count. Missing column values are\n * ABSENT (undefined) — strictly distinct from a recorded 0. */\nexport interface TabularGroup {\n key: string;\n label: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface TabularResult {\n columns: TabularColumn[];\n rows: Array<Record<string, unknown>>;\n groups?: TabularGroup[];\n totalCount: number;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Tag value for a fact row. Tag keys map onto fact fields; 'tags' is the\n * note_tags label set of the parent note (loaded per query, only when used).\n */\nfunction factTagValue(row: AnalyticsDataPoint, key: string, noteTags: ReadonlyMap<string, readonly string[]>): string | readonly string[] | undefined {\n switch (key) {\n case 'effort': return row.effortSlug;\n case 'discipline': return row.discipline;\n case 'intensity': return row.intensityTier;\n case 'grade': return row.grade;\n case 'note': return row.noteId;\n case 'page': return row.pageId;\n case 'origin': return row.origin;\n case 'grain': return row.grain;\n case 'metric': return row.metricKey;\n case 'block': return row.blockContentId;\n case 'result': return row.resultId;\n case 'tags': return noteTags.get(row.noteId) ?? [];\n default: {\n // Custom dimensions: user-authored property metrics and grouped\n // partitions live in row.dimensions under normalized (camelCase)\n // keys — `{coach:greg}` and `by {coach}` resolve here. Facts without\n // the dim group/filter as unassigned.\n const dims = row.dimensions;\n if (!dims) return undefined;\n return dims[key] ?? dims[normalizeFieldComponent(key)];\n }\n }\n}\n\nfunction matchesFilters(row: AnalyticsDataPoint, filters: TagFilter[], noteTags: ReadonlyMap<string, readonly string[]>): boolean {\n // OR within a key (and sign); AND across keys/signs. Negation spans the\n // whole value list for that key/sign.\n const groups = new Map<string, TagFilter[]>();\n for (const f of filters) {\n const groupKey = `${f.negate ? '!' : ''}${f.key}`;\n const bucket = groups.get(groupKey);\n if (bucket) bucket.push(f);\n else groups.set(groupKey, [f]);\n }\n return [...groups.values()].every((group) => {\n const key = group[0].key;\n const negate = group[0].negate;\n const raw = factTagValue(row, key, noteTags);\n const rowValues = Array.isArray(raw) ? raw : raw !== undefined ? [raw] : [];\n const hit = rowValues.some((value) =>\n group.some((f) =>\n f.values.some((a) =>\n a.wildcard ? value.startsWith(a.value) : value === a.value,\n ),\n ),\n );\n return negate ? !hit : hit;\n });\n}\n\n/** Dimension value for grouping; virtual time dims bucket the canonical\n * time by LOCAL CIVIL CALENDAR (spec v2 decision 2): `day` keys are local\n * YYYY-MM-DD; `week` keys are the civil Monday's YYYY-MM-DD, computed by\n * component math — never instant arithmetic, which mislabels DST-shifted\n * weeks. Keys are locale-independent and lexically sortable.\n *\n * NOTE: buildResult routes `day`/`week` groupBys to civil bucket keys and\n * filters them out of tagDims, so the time-dim branches below are\n * defensive only — kept canonical in case a caller surfaces time dims as\n * string keys. */\nfunction dimValue(\n row: AnalyticsDataPoint,\n dim: string,\n noteTags: ReadonlyMap<string, readonly string[]>,\n ctx: ExecutionContext,\n): string {\n // Calendar grouping uses the observation's own temporal anchor (ticket 12):\n // a date-only fact groups under its recorded civil date — never a fabricated\n // midnight instant; an instant fact under its civil date in the context tz.\n if (dim === 'day') return row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone);\n if (dim === 'week') return civilMonday(row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone));\n if (dim === 'session') return row.resultId;\n const raw = factTagValue(row, dim, noteTags);\n // Ticket 16 (finding 3.5): missing group values resolve to the structural\n // UNASSIGNED sentinel — never a literal '(none)' masquerading as data.\n if (raw === undefined) return UNASSIGNED;\n if (typeof raw === 'string') return raw;\n return raw.length ? raw.join(',') : UNASSIGNED;\n}\n\n/** Structural missing-group sentinel — distinct from any literal text\n * (group identity is the JSON tuple, so it cannot collide). */\nexport const UNASSIGNED = '\\u0000unassigned';\n\n/** Result state of a bucket reduction (arithmetic contract §2): observed\n * values are genuine reductions of recorded observations; absent results\n * have no observation (render zero only at display); errors are\n * diagnostics, not numbers. */\ntype ReducedValue =\n | { state: 'observed'; value: number }\n | { state: 'absent'; value: 0 }\n | { state: 'error'; message: string };\n\n/** Reduce one bucket's already-converted observation values per the\n * operation matrix. Missing domain positions are handled by the caller\n * (zero-filled synthetic points); this reduces actual observations. */\nfunction aggregate(values: number[], agg: Aggregator, points: AnalyticsDataPoint[]): ReducedValue {\n if (agg === 'count') return { state: 'observed', value: points.length };\n if (values.length === 0) return { state: 'absent', value: 0 };\n switch (agg) {\n case 'sum':\n return { state: 'observed', value: values.reduce((a, b) => a + b, 0) };\n case 'avg':\n return { state: 'observed', value: values.reduce((a, b) => a + b, 0) / values.length };\n case 'min':\n return { state: 'observed', value: Math.min(...values) };\n case 'max':\n return { state: 'observed', value: Math.max(...values) };\n case 'last': {\n // Metric-date order — fetch order never decides the endpoint. The\n // value comes from the already-converted array (values[i] ↔ points[i]).\n let latest = 0;\n for (let i = 0; i < points.length; i++) {\n if (points[i]!.timestamp > points[latest]!.timestamp) latest = i;\n }\n return { state: 'observed', value: values[latest]! };\n }\n case 'delta': {\n if (points.length < 2) return { state: 'absent', value: 0 };\n // Sort (point, converted value) PAIRS — the values[i] ↔ points[i]\n // alignment must survive the reorder (ticket 13: conversion before\n // arithmetic; metric-date chronological endpoints).\n const ordered = points\n .map((point, i) => ({ point, value: values[i]! }))\n .sort((a, b) => a.point.timestamp - b.point.timestamp);\n const first = ordered[0]!;\n const last = ordered[ordered.length - 1]!;\n // Equal-timestamp endpoints with different values and no recorded\n // order evidence are an ambiguous-order error.\n const atFirst = ordered.filter((p) => p.point.timestamp === first.point.timestamp);\n const atLast = ordered.filter((p) => p.point.timestamp === last.point.timestamp);\n const firstVals = new Set(atFirst.map((p) => p.point.value));\n const lastVals = new Set(atLast.map((p) => p.point.value));\n if (firstVals.size > 1 || lastVals.size > 1) {\n return { state: 'error', message: 'Ambiguous delta order: tied endpoint observations differ in value without recorded order' };\n }\n return { state: 'observed', value: last.value - first.value };\n }\n }\n}\n\n/** Apply a cross-store metric predicate's comparison op. */\nfunction compareOp(value: number, op: ComparisonOp, threshold: number): boolean {\n switch (op) {\n case '>': return value > threshold;\n case '>=': return value >= threshold;\n case '<': return value < threshold;\n case '<=': return value <= threshold;\n case '==': return value === threshold;\n case '!=': return value !== threshold;\n }\n}\n\n/** Reduce an already-aggregated pipeline stage with the next transform —\n * functions act on the PRECEDING numeric result, never re-query facts.\n * Supported authored modifiers on a carried stage: `last <n>d|w` /\n * `from…to…` windows (filter the carried points by ts) and `in <unit>`\n * (convert BEFORE arithmetic, ticket 13 — values and observation points\n * stay aligned for last/delta). Filters, group-bys, rollups, and content\n * joins have no fact dimensions to resolve on carried values — they error\n * explicitly instead of being silently ignored. `metric:` must match the\n * preceding stage's metric (rep≡reps) — a mismatch mislabels the result. */\nfunction reduceCarriedResult(qr: QueryResult, transform: ParsedAggregateQuery, options: QueryOptions, ctx: ExecutionContext): QueryResult {\n const zero = { selected: 0, buckets: 0, aggregated: 0, groups: 0 } as const;\n const unsupported = [\n transform.join && 'where <content> join',\n transform.filters.length > 0 && 'tag filters',\n transform.groupBy.length > 0 && 'by {…} grouping',\n transform.rollup && '.rollup(…)',\n ].filter(Boolean) as string[];\n if (unsupported.length > 0) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `:${transform.agg}{…} on a carried stage cannot apply ${unsupported.join(', ')} — carried values carry no fact dimensions; author them in the source stage.`,\n };\n }\n // An errored stage poisons everything downstream — stop before reducing.\n if (qr.error) return qr;\n\n const range = resolveAggregateRange(transform, options, ctx);\n const values: number[] = [];\n const points: AnalyticsDataPoint[] = [];\n let lastTs = 0;\n for (const s of qr.series) {\n for (const p of s.points) {\n if (p.missing) continue;\n if (range && !inRange(p.ts, range)) continue;\n values.push(p.value);\n points.push({ timestamp: p.ts, value: p.value, noteId: '', resultId: '' } as AnalyticsDataPoint);\n if (p.ts > lastTs) lastTs = p.ts;\n }\n }\n\n // Carried values are the previous stage's metric — a different metric:\n // mislabels the reduction. Empty metric inherits the carried provenance\n // (rep/reps aliases compare equal).\n const sameMetric = (a: string, b: string) =>\n a === b || (a === 'rep' && b === 'reps') || (a === 'reps' && b === 'rep');\n if (transform.metric && !(qr.parsed.metric && sameMetric(transform.metric, qr.parsed.metric))) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `:${transform.agg}{metric:${transform.metric}} on a carried stage reduces the preceding \"${qr.parsed.metric || 'metricless'}\" values — metric:${transform.metric} does not exist on them.`,\n };\n }\n\n // `in <unit>` on a carried stage converts the carried values (all one\n // unit) before the reduction; unitless or count stages cannot convert.\n let unit = transform.agg === 'count' ? 'count' : qr.unit;\n if (transform.displayUnit) {\n if (!unit || unit === 'count') {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `Cannot apply in ${transform.displayUnit} — the preceding stage carries no convertible unit.`,\n };\n }\n try {\n for (let i = 0; i < values.length; i++) {\n const converted = convertViaCatalog(values[i]!, unit, transform.displayUnit);\n values[i] = converted;\n // Keep the observation pair aligned — last/delta read point.value.\n points[i] = { ...points[i]!, value: converted };\n }\n unit = transform.displayUnit;\n } catch (e) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: e instanceof Error ? e.message : String(e),\n };\n }\n }\n\n const reduced = aggregate(values, transform.agg, points);\n if (reduced.state === 'error') {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: reduced.message,\n };\n }\n return {\n parsed: transform,\n series: [{\n key: transform.agg,\n label: transform.agg,\n points: [{ ts: lastTs || ctx.instant, value: reduced.value, ...(reduced.state === 'absent' ? { missing: true } : {}) }],\n unit,\n }],\n stages: { selected: values.length, buckets: 1, aggregated: 1, groups: 1 },\n matched: [],\n ...(unit ? { unit } : {}),\n };\n}\nexport class QueryService {\n private readonly store: EventStore;\n private readonly noteStore: NoteQueryStore;\n private readonly blockStore: BlockQueryStore;\n private readonly effortStore: EffortQueryStore;\n private readonly pageStore?: {\n getNotePages(noteId: string): Promise<PageNote[]>;\n getPage(pageId: string): Promise<Page | undefined>;\n };\n private readonly relationStore?: {\n getBatches(noteIds: readonly string[]): Promise<Map<string, NoteRelationBundle>>;\n };\n private readonly datasetStore?: {\n getDataset(name: string): { events: EventRecord[]; notes: Note[] } | undefined;\n };\n\n // Optional storage seam properties for block_efforts and typed tag resolution.\n // Injected by the app adapter (`services/queryService.ts`); tests can supply fakes.\n private blockEffortsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n private tagsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n private noteTagsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n\n constructor(\n storesOrEventStore?: QueryServiceStores | EventStore,\n noteStore?: NoteQueryStore,\n blockStore?: BlockQueryStore,\n effortStore?: EffortQueryStore,\n ) {\n if (\n storesOrEventStore &&\n typeof storesOrEventStore === 'object' &&\n ('eventStore' in storesOrEventStore ||\n 'noteStore' in storesOrEventStore ||\n 'blockStore' in storesOrEventStore ||\n 'effortStore' in storesOrEventStore ||\n 'pageStore' in storesOrEventStore ||\n 'relationStore' in storesOrEventStore ||\n 'datasetStore' in storesOrEventStore)\n ) {\n const stores = storesOrEventStore as QueryServiceStores;\n this.store = stores.eventStore ?? defaultEventStore;\n this.noteStore = stores.noteStore ?? defaultNoteStore;\n this.blockStore = stores.blockStore ?? defaultBlockStore;\n this.effortStore = stores.effortStore ?? defaultEffortStore;\n this.pageStore = stores.pageStore;\n this.relationStore = stores.relationStore;\n this.datasetStore = stores.datasetStore;\n if (stores.blockEffortsStore) this.blockEffortsStore = stores.blockEffortsStore;\n if (stores.tagsStore) this.tagsStore = stores.tagsStore;\n if (stores.noteTagsStore) this.noteTagsStore = stores.noteTagsStore;\n } else {\n this.store = (storesOrEventStore as EventStore | undefined) ?? defaultEventStore;\n this.noteStore = noteStore ?? defaultNoteStore;\n this.blockStore = blockStore ?? defaultBlockStore;\n this.effortStore = effortStore ?? defaultEffortStore;\n }\n }\n\n /** Windowed flat-fact fetch — the projected view over the event store. */\n async getFactsByTimeRange(start: number, end: number): Promise<AnalyticsDataPoint[]> {\n const rows = await this.store.getEventsByTimeRange(start, end);\n return rows.flatMap(projectEventToFacts);\n }\n\n async runQuery(raw: string, options: QueryOptions = {}): Promise<QueryResult> {\n const parsed = parseQuery(raw);\n if (isPipelineQuery(parsed)) return this.pipelineResultToQueryResult(await this.runPipelineParsed(parsed, options));\n return this.run(parsed, options);\n }\n\n /**\n * Legacy rows-family executor kept for hand-built ASTs (RowsTable, CLI).\n * Text `rows:…` no longer parses (#1044); this delegates to the find paths\n * so a programmatic ParsedRowsQuery still resolves.\n */\n async runRows(parsed: ParsedRowsQuery, options: { anchorNow?: number; context?: ExecutionContext } = {}): Promise<RowsQueryResult> {\n // Hand-built rows AST → find noun: `all`/missing → :session; a result\n // plane (segment/load/…) narrows via plane: on :session; rows:segment\n // without a scope is the cross-workout table (:segment).\n const scope = parsed.filters.some((f) => ['result', 'block', 'note'].includes(f.key));\n const plane = parsed.outputType ?? (parsed.target !== 'all' ? parsed.target : undefined);\n let target: string;\n let filters = parsed.filters;\n if (!plane) {\n target = 'session';\n } else if (plane === 'segment' && !scope) {\n target = 'segment';\n } else {\n target = 'session';\n filters = [...parsed.filters, { key: 'plane', negate: false, values: [{ value: plane, wildcard: false }] }];\n }\n const asFind: ParsedFindQuery = {\n family: 'find',\n raw: parsed.raw,\n target,\n filters,\n ...(parsed.window ? { window: parsed.window } : {}),\n ...(parsed.pipes ? { pipes: parsed.pipes } : {}),\n ...(parsed.error ? { error: parsed.error } : {}),\n };\n const res = await this.runFind(asFind, options);\n return { parsed, runs: res.runs ?? [], ...(res.table ? { table: res.table } : {}) };\n }\n\n /**\n * Execute a :session query (#1041/#1042) — grouped run cards per completed session.\n */\n async runFindSession(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const scopeValues = (key: string) =>\n parsed.filters.filter((f) => f.key === key).flatMap((f) => f.values.map((v) => v.value));\n const resultIds = scopeValues('result');\n const blockIds = scopeValues('block');\n const noteIds = scopeValues('note');\n\n const byResult = new Map<string, EventRecord[]>();\n const collected = new Set<string>();\n const collect = (rows: EventRecord[]) => {\n for (const row of rows) {\n if (collected.has(row.id)) continue;\n collected.add(row.id);\n const bucket = byResult.get(row.resultId);\n if (bucket) bucket.push(row);\n else byResult.set(row.resultId, [row]);\n }\n };\n\n if (resultIds.length + blockIds.length + noteIds.length === 0) {\n const range = parsed.window ? resolveWindowRange(parsed.window, ctx) : (options.range ? options.range : undefined);\n const eventRows = range\n ? await this.store.getEventsByTimeRange(range.start, range.end)\n : await this.store.scanAll();\n collect(eventRows);\n } else {\n for (const id of resultIds) collect(await this.store.getEventsByResult(id));\n for (const blockContentId of blockIds) collect(await this.store.getEventsByContent(blockContentId));\n for (const noteId of noteIds) collect(await this.store.getEventsForNote(noteId));\n }\n\n let groups = [...byResult.entries()].filter(([, rows]) => rows.length > 0);\n\n if (parsed.window || options.range) {\n groups = groups.filter(([, rows]) =>\n effectiveTimeWindow(sessionCompletedAt(rows), parsed.window, options.range, ctx),\n );\n }\n groups.sort((a, b) => sessionCompletedAt(b[1]) - sessionCompletedAt(a[1]));\n\n const planeFilters = parsed.filters.filter((f) => f.key === 'plane');\n let runs: RowsRun[] = groups\n .map(([resultId, rows]) => {\n let events = rows;\n if (planeFilters.length > 0) {\n events = events.filter((row) =>\n planeFilters.every((f) => {\n const matchesAny = f.values.some((v) => v.value === row.outputType);\n return f.negate ? !matchesAny : matchesAny;\n }),\n );\n }\n return {\n resultId,\n noteId: rows[0].noteId,\n timestamp: sessionCompletedAt(rows),\n events,\n };\n })\n .filter((run) => run.events.length > 0);\n // Pagination is presentation: the pipeline's event set stays the FULL\n // plane-narrowed selection, only the run cards are clipped.\n const runsFull = runs;\n const pipes = parsed.pipes;\n if (pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n runs = pipes.limit !== undefined ? runs.slice(offset, offset + pipes.limit) : runs.slice(offset);\n }\n\n return {\n parsed,\n notes: [],\n blocks: [],\n runs,\n events: runsFull.flatMap((run) => run.events),\n stages: { selected: groups.length, matched: runs.length },\n };\n }\n\n /**\n * Execute a :segment or :event query (#1042/#1048) — flat cross-workout table.\n */\n async runFindTable(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const scopeValues = (key: string) =>\n parsed.filters.filter((f) => f.key === key).flatMap((f) => f.values.map((v) => v.value));\n const resultIds = scopeValues('result');\n const blockIds = scopeValues('block');\n const noteIds = scopeValues('note');\n\n let eventRows: EventRecord[] = [];\n if (resultIds.length + blockIds.length + noteIds.length === 0) {\n const range = parsed.window ? resolveWindowRange(parsed.window, ctx) : (options.range ? options.range : undefined);\n // Complete fetch mirrors run(): bounded windows fetch through\n // by-timestamp and union by-metric-date candidates over EVERY covered\n // civil date; an unbounded side (sentinel bounds) scans — the all-store\n // scan IS the complete fetch. The anchorTs membership filter below\n // keeps either fetch exact.\n const boundedRange =\n range && range.start > 0 && range.end < Number.MAX_SAFE_INTEGER ? range : undefined;\n if (boundedRange) {\n eventRows = await this.store.getEventsByTimeRange(boundedRange.start, boundedRange.end);\n if (this.store.getEventsByMetricDates) {\n const civilDates = civilDatesCoveredByRange(boundedRange.start, boundedRange.end, ctx.timeZone);\n if (civilDates.length > 0) {\n const byDate = await this.store.getEventsByMetricDates(civilDates);\n if (byDate.length > 0) {\n const seen = new Set(eventRows.map((r) => r.id));\n eventRows = [...eventRows, ...byDate.filter((r) => !seen.has(r.id))];\n }\n }\n }\n } else {\n eventRows = await this.store.scanAll();\n }\n } else {\n const seen = new Set<string>();\n const collect = (rows: EventRecord[]) => {\n for (const row of rows) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n eventRows.push(row);\n }\n }\n };\n for (const id of resultIds) collect(await this.store.getEventsByResult(id));\n for (const blockContentId of blockIds) collect(await this.store.getEventsByContent(blockContentId));\n for (const noteId of noteIds) collect(await this.store.getEventsForNote(noteId));\n }\n\n const seen = new Set<string>();\n const eligibleRecords: EventRecord[] = [];\n for (const row of eventRows) {\n if (row.grain !== 'event') continue;\n if (parsed.target === 'segment' && row.outputType !== 'segment') continue;\n if (seen.has(row.id)) continue;\n seen.add(row.id);\n eligibleRecords.push(row);\n }\n\n // Selection anchors: a recorded civil date anchors at local noon (the\n // same convention as day bucketing), an instant row at its timestamp.\n const civilDateCache = new Map<number, string>();\n const dateOf = (row: EventRecord): string => {\n const temporal = row.metricTemporal?.[0];\n if (temporal?.temporalKind === 'civil-date' && temporal.civilDate) return temporal.civilDate;\n const cached = civilDateCache.get(row.timestamp);\n if (cached) return cached;\n const computed = civilDateOf(row.timestamp, ctx.timeZone);\n civilDateCache.set(row.timestamp, computed);\n return computed;\n };\n const anchorTs = (row: EventRecord): number => {\n const temporal = row.metricTemporal?.[0];\n if (temporal?.temporalKind === 'civil-date' && temporal.civilDate) return zonedNoon(temporal.civilDate, ctx.timeZone);\n return row.timestamp;\n };\n\n const noteTags: ReadonlyMap<string, readonly string[]> = new Map();\n const tagFilters = parsed.filters.filter((f) => !['result', 'block', 'note', 'plane'].includes(f.key));\n // C1 + ticket 12: the fetch bound is only a cutoff — scoped and windowed\n // queries alike filter membership by the row's own temporal anchor.\n const timeScoped = !!(parsed.window || options.range);\n const eligible = eligibleRecords\n .filter((row) => !timeScoped || effectiveTimeWindow(anchorTs(row), parsed.window, options.range, ctx))\n .filter((row) => {\n if (tagFilters.length === 0) return true;\n const facts = projectEventToFacts(row);\n if (facts.length === 0) return false;\n return facts.some((fact) => matchesFilters(fact, tagFilters, noteTags));\n });\n\n const totalCount = eligible.length;\n\n const unitByMetric = new Map<string, string>();\n const numericMetrics = new Set<string>();\n for (const row of eligible) {\n for (const m of row.metrics as Array<{ type?: string; value?: unknown; unit?: string; metadata?: Record<string, unknown> }>) {\n if (m.type && m.type !== 'label' && typeof m.value === 'number') {\n numericMetrics.add(m.type);\n const key = typeof m.metadata?.canonicalKey === 'string' ? m.metadata.canonicalKey : undefined;\n if (m.unit) {\n unitByMetric.set(m.type, m.unit);\n if (key) unitByMetric.set(key, m.unit);\n }\n }\n }\n }\n\n const pipes = parsed.pipes;\n const selectCols = pipes?.select?.map((s) => s.col) ?? [\n 'date', 'effort', 'discipline', ...numericMetrics,\n ];\n const unitFor = (col: string): string | undefined =>\n pipes?.select?.find((s) => s.col === col)?.unit ?? (parsed.displayUnit ? parsed.displayUnit : unitByMetric.get(col));\n\n const columns: TabularColumn[] = selectCols.map((col) => {\n if (col === 'date') return { name: 'date', type: 'date' as const };\n if (col === 'effort' || col === 'discipline' || col === 'note' || col === 'grade' || col === 'intensity') {\n return { name: col, type: 'string' as const };\n }\n return { name: col, type: 'number' as const, ...(unitFor(col) ? { unit: unitFor(col) } : {}) };\n });\n\n const typeOf = new Map(columns.map((c) => [c.name, c.type]));\n\n let records = eligible.map((row) => {\n const record: Record<string, unknown> = {};\n for (const col of selectCols) {\n const type = typeOf.get(col);\n if (type === 'date') {\n record.date = dateOf(row);\n } else if (col === 'effort') {\n record.effort = row.effortSlug;\n } else if (col === 'discipline') {\n const m = (row.metrics as Array<{ metadata?: Record<string, unknown> }>).find((m) => m.metadata?.effortDiscipline);\n record.discipline = m?.metadata?.effortDiscipline;\n } else {\n const m = (row.metrics as Array<{ type?: string; value?: unknown; unit?: string; metadata?: Record<string, unknown> }>).find(\n (m) => m.type === col || m.metadata?.canonicalKey === col,\n );\n if (m && typeof m.value === 'number') {\n let val = m.value;\n if (parsed.displayUnit && m.unit && m.unit !== parsed.displayUnit) {\n try {\n val = convertViaCatalog(val, m.unit, parsed.displayUnit);\n } catch {\n // ponytail: pass-through if conversion fails; full unit graph handled by units.ts\n }\n }\n record[col] = val;\n } else {\n record[col] = m ? m.value : undefined;\n }\n }\n }\n record.__id = row.id;\n record.__resultId = row.resultId;\n return record;\n });\n\n for (const order of [...(pipes?.order ?? [])].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n records = [...records].sort((a, b) => {\n const av = a[order.col] ?? a.__id;\n const bv = b[order.col] ?? b.__id;\n if (av === bv) return 0;\n return ((av as number | string) > (bv as number | string) ? 1 : -1) * dir;\n });\n }\n\n let groups: Array<{ key: string; label: string; rows: Array<Record<string, unknown>> }> | undefined;\n if (parsed.groupBy && parsed.groupBy.length > 0) {\n const groupMap = new Map<string, Array<Record<string, unknown>>>();\n for (const rec of records) {\n const groupVals = parsed.groupBy.map((dim) => String(rec[dim] ?? 'unassigned'));\n const key = groupVals.join(' · ');\n const existing = groupMap.get(key);\n if (existing) existing.push(rec);\n else groupMap.set(key, [rec]);\n }\n groups = [...groupMap.entries()].map(([key, rows]) => ({ key, label: key, rows }));\n }\n\n const offset = pipes?.offset ?? 0;\n const limit = pipes?.limit;\n const page = limit !== undefined ? records.slice(offset, offset + limit) : records.slice(offset);\n\n return {\n parsed,\n notes: [],\n blocks: [],\n runs: [],\n events: eligible,\n table: {\n columns,\n rows: page,\n ...(groups ? { groups } : {}),\n totalCount,\n ...(limit !== undefined ? { limit } : {}),\n ...(offset > 0 ? { offset } : {}),\n },\n stages: { selected: eligible.length, matched: totalCount },\n };\n }\n\n /**\n * Execute a content-discovery query (:note). Naive in-memory filtering\n * per the tracer-bullet scope (#797): load all notes, then apply tag/text/\n * time filters.\n */\n async runFind(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n if (parsed.error) {\n return { parsed, notes: [], blocks: [], stages: { selected: 0, matched: 0 } };\n }\n // Hand-built ASTs get the same loud target-capability disclosure as\n // parsed text — re-derived from the parsed shape, never from raw text.\n const computed = findTargetAdvisories(parsed);\n if (computed.length) {\n const merged = [...new Set([...(parsed.advisories ?? []), ...computed])];\n if (merged.length !== (parsed.advisories?.length ?? 0)) parsed = { ...parsed, advisories: merged };\n }\n\n if (parsed.target === 'block') {\n return this.runFindBlock(parsed, options);\n }\n if (parsed.target === 'effort') {\n return this.runFindEffort(parsed);\n }\n if (parsed.target === 'session') {\n return this.runFindSession(parsed, options);\n }\n if (parsed.target === 'segment' || parsed.target === 'event') {\n return this.runFindTable(parsed, options);\n }\n const isCatalogHead = parsed.target === 'note'\n && parsed.filters.some(f => f.key === 'type' && !f.negate && f.values.some(v => v.value === 'feed'))\n && (parsed.filters.some(f => f.key === 'source' && !f.negate && f.values.some(v => v.value === 'feed' || v.value === 'feeds'))\n || parsed.sourceScope?.includes('feeds'));\n if (isCatalogHead) {\n return this.runFindCatalog(parsed, options, await this.noteStore.getAllNotes());\n }\n // Domain candidate read: selection (source clauses + the explicit source\n // fence) narrows before the wire's selectedCount; compiled positive\n // literal type/id clauses ride as post-count FILTERS — never selection —\n // so the wire count baselines the historical pre-filter stages.selected.\n const read = compileContentRead(parsed.filters, 'note', parsed.sourceScope);\n const paging = domainPaging(parsed, options, read.residual);\n const fetchedNotes = (read.filters.length > 0 || read.selection.length > 0 || paging.paged) && this.noteStore.queryDomain\n ? await this.noteStore.queryDomain({\n plan: 'notes',\n selection: read.selection,\n ...(read.filters.length ? { filters: read.filters } : {}),\n ...(paging.order ? { order: paging.order } : {}),\n ...(paging.offset !== undefined ? { offset: paging.offset } : {}),\n ...(paging.limit !== undefined ? { limit: paging.limit } : {}),\n })\n : undefined;\n const domainNotes = fetchedNotes && fetchedNotes.plan === 'notes' ? fetchedNotes : undefined;\n let notes = domainNotes ? domainNotes.rows : await this.noteStore.getAllNotes();\n const selectedFromDomain = domainNotes ? domainNotes.selectedCount : undefined;\n const notesPaged = !!domainNotes && paging.paged;\n notes = applyNoteSelectionStages(notes, parsed);\n const selectedCount = selectedFromDomain ?? notes.length;\n const ctx = runContext(options);\n // Tag filters — intersect note IDs across OR'd values within a key.\n // Handles general 'tags' plus dynamic typed tags (domain, format, equipment, quality, intent)\n // and exercise containment ('effort').\n for (const filter of parsed.filters) {\n if (filter.key === 'tags' && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n } else if (filter.key === 'tags' && filter.negate) {\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n notes = notes.filter(n => !ids.has(n.id));\n }\n } else if (filter.key === 'effort' && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForEffort(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n } else if (WQL_TYPED_TAG_KEYS.includes(filter.key as WqlTypedTagKey) && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForTypedTag(filter.key, v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n }\n }\n\n for (const filter of parsed.filters) {\n if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n notes = notes.filter(n => {\n const hit = n.title.toLowerCase().includes(search) || n.rawContent.toLowerCase().includes(search);\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n // Type filter — note kind (wod, note, etc.)\n for (const filter of parsed.filters) {\n if (filter.key === 'type' && !filter.negate) {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => n.type && wanted.has(n.type));\n }\n }\n\n // Page filter\n for (const filter of parsed.filters) {\n if (filter.key === 'page') {\n const isTrue = filter.values.some(v => v.value === 'true' || v.value === '1');\n const wantsPage = filter.negate ? !isTrue : isTrue;\n notes = notes.filter(n => (wantsPage ? n.type === 'page' : n.type !== 'page'));\n }\n }\n\n // Catalog filter — static note catalog directory id (e.g. crossfit-girls)\n for (const filter of parsed.filters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => {\n const cat = catalogOfItem(n);\n if (!cat) return filter.negate;\n const hit = wanted.has(cat);\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n // Note filter — exact note id\n for (const filter of parsed.filters) {\n if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => (filter.negate ? !wanted.has(n.id) : wanted.has(n.id)));\n }\n }\n // Time window (ticket 12 precedence): an explicit query window wins; the\n // host `range` option supplies the default when the query has none.\n if (parsed.window || options.range) {\n notes = notes.filter(n => effectiveTimeWindow(n.date ?? n.createdAt, parsed.window, options.range, ctx));\n }\n\n // Cross-store join (direction 1): keep notes owning a wod block whose\n // raw-log metric aggregate satisfies the predicate.\n if (parsed.join) {\n const joined = await this.applyMetricJoin(parsed, notes, []);\n notes = joined.notes;\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n notes = [...notes].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n // Server-paged reads already applied offset/limit in natural id order —\n // re-slicing a pre-sliced page would skip rows (slice(offset) again).\n if (!notesPaged && pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n notes = pipes.limit !== undefined ? notes.slice(offset, offset + pipes.limit) : notes.slice(offset);\n }\n\n return {\n parsed,\n notes,\n blocks: [],\n ...(notes.length && (this.pageStore || this.relationStore)\n ? { containers: await this.containersForNotes(notes) }\n : {}),\n stages: { selected: selectedCount, matched: notes.length },\n };\n }\n\n /** Highest container per note id: the parent Page from the canonical\n * page_notes junction (first link by position) wins; a note with no page\n * link stays a standalone Note container. Batched when a relationStore\n * is injected — one bundle read per run instead of a link/page read per\n * matched note. */\n private async containersForNotes(notes: Note[]): Promise<Record<string, NoteContainer>> {\n const containers: Record<string, NoteContainer> = {};\n const bundles = this.relationStore\n ? await this.relationStore.getBatches([...new Set(notes.map((n) => n.id))])\n : undefined;\n const pageCache = new Map<string, Page | undefined>();\n for (const note of notes) {\n let page: Page | undefined;\n let bundle: NoteRelationBundle | undefined;\n if (bundles) {\n bundle = bundles.get(note.id);\n const [first] = [...(bundle?.links ?? [])].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n page = first ? bundle!.pages.find((p) => p.id === first.pageId) : undefined;\n // Inline the bundle's junction tags on notes without authored tags —\n // downstream Entry mapping hydrates from this same read (no-tag\n // stays a valid final state; inline tags are never overwritten).\n if (bundle && bundle.tags.length > 0 && (!note.tags || note.tags.length === 0)) {\n note.tags = bundle.tags.map((t) => t.label);\n }\n } else {\n const links = await this.pageStore!.getNotePages(note.id);\n if (links.length > 0) {\n const [first] = [...links].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n if (!pageCache.has(first!.pageId)) {\n pageCache.set(first!.pageId, await this.pageStore!.getPage(first!.pageId));\n }\n page = pageCache.get(first!.pageId);\n }\n }\n // Resolved parent page wins; a dangling link (page absent from the\n // bundle/store) stays fail-closed as a standalone Note container.\n containers[note.id] = page\n ? { kind: 'page', id: page.id, ...(page.slug ? { slug: page.slug } : {}), ...(page.date ? { date: page.date } : {}) }\n : { kind: 'note', id: note.id };\n }\n return containers;\n }\n\n private async hydrateBlocks(rows: BlockIndexRow[]): Promise<BlockIndexRow[]> {\n const ids = [...new Set(rows.map(row => row.noteId))];\n if (ids.length === 0) return [];\n const notes = this.noteStore.getNotesByIds\n ? await this.noteStore.getNotesByIds(ids)\n : await this.noteStore.getAllNotes();\n const parents = new Map<string, Note>();\n for (const note of notes) {\n if (!Number.isSafeInteger(note.sourceRevision) || note.sourceRevision < 1) continue;\n try {\n validateNoteBlocks(note.rawContent, note.blocks, note.sourceRevision);\n parents.set(note.id, note);\n } catch {\n // Corrupt source maps cannot supply actionable query results.\n }\n }\n return rows.flatMap(row => {\n const note = parents.get(row.noteId);\n const block = note?.blocks[row.blockId];\n if (!note || !block || row.id !== `${note.id}:${block.id}` || block.id !== row.blockId || block.kind !== row.dataType\n || block.version !== row.blockVersion || block.sourceRevision !== row.sourceRevision\n || note.sourceRevision !== row.sourceRevision || block.from !== row.from || block.to !== row.to) return [];\n return [{ ...row, rawContent: note.rawContent.slice(block.from, block.to) }];\n });\n }\n /**\n * Execute a :block query against the derived block_index store.\n */\n async runFindBlock(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n // One store: the seed importer materializes corpus rows next to user rows.\n // Domain candidate read — selection (source clauses + fence) narrows\n // before the wire's selectedCount; compiled positive literal type/noteId\n // clauses ride as post-count FILTERS so the count baselines the\n // historical pre-filter stages.selected. All remaining stages re-run in\n // JS and own the result.\n const read = compileContentRead(parsed.filters, 'block');\n const paging = domainPaging(parsed, options, read.residual);\n const fetchedBlocks = (read.filters.length > 0 || read.selection.length > 1 || paging.paged) && this.blockStore.queryDomain\n ? await this.blockStore.queryDomain({\n plan: 'blocks',\n selection: read.selection,\n ...(read.filters.length ? { filters: read.filters } : {}),\n ...(paging.order ? { order: paging.order } : {}),\n ...(paging.offset !== undefined ? { offset: paging.offset } : {}),\n ...(paging.limit !== undefined ? { limit: paging.limit } : {}),\n })\n : undefined;\n const domainBlocks = fetchedBlocks && fetchedBlocks.plan === 'blocks' ? fetchedBlocks : undefined;\n const candidates = domainBlocks ? domainBlocks.rows : await this.blockStore.getAllBlocks();\n let blocks = await this.hydrateBlocks(candidates);\n const invalidCandidates = blocks.length !== candidates.length;\n const selectedFromDomain = domainBlocks && !invalidCandidates ? domainBlocks.selectedCount : undefined;\n const blocksPaged = !!domainBlocks && paging.paged && !invalidCandidates;\n if (domainBlocks && invalidCandidates) blocks = await this.hydrateBlocks(await this.blockStore.getAllBlocks());\n blocks = applySourceFilter(blocks, parsed.filters);\n // WQL boundary (same as notes): the four allowed kinds plus sourceless\n // legacy rows — feeds excised at the vocabulary never enter results.\n blocks = blocks.filter((b) => !b.sourceId || WQL_SOURCE_VALUES.some((k) => sourceMatches(b, k)));\n const selectedCount = selectedFromDomain ?? blocks.length;\n const ctx = runContext(options);\n // Text filter — substring on rawContent\n for (const filter of parsed.filters) {\n if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n blocks = blocks.filter(b => filter.negate !== b.rawContent.toLowerCase().includes(search));\n }\n }\n\n // Type filter selects actionable kinds only.\n for (const filter of parsed.filters) {\n if (filter.key === 'type' && !filter.negate) {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => wanted.has(b.dataType));\n }\n }\n\n // Catalog filter — catalog directory id\n for (const filter of parsed.filters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => {\n const cat = catalogOfItem(b);\n if (!cat) return filter.negate;\n const hit = wanted.has(cat);\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n // Tags filter — matches if the parent note has the tag\n for (const filter of parsed.filters) {\n if (filter.key === 'tags' && !filter.negate) {\n const matchingNoteIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingNoteIds.add(id));\n }\n blocks = blocks.filter(b => matchingNoteIds.has(b.noteId));\n } else if (filter.key === 'effort' && !filter.negate) {\n const matchingBlockIds = new Set<string>();\n for (const v of filter.values) {\n const rows = await this.blockEffortsStore.getAllFromIndex('by-effort', v.value);\n for (const row of rows) matchingBlockIds.add(`${row.noteId}:${row.blockId}`);\n }\n blocks = blocks.filter(block => matchingBlockIds.has(`${block.noteId}:${block.blockId}`));\n }\n }\n\n // Note filter — exact parent note id\n for (const filter of parsed.filters) {\n if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => (filter.negate ? !wanted.has(b.noteId) : wanted.has(b.noteId)));\n }\n }\n\n // Time window: parent note's date, falling back to note createdAt, falling back to block createdAt\n if (parsed.window || options.range) {\n const allNotes = await this.noteStore.getAllNotes();\n const noteTimeMap = new Map<string, number>(allNotes.map((n) => [n.id, n.date ?? n.createdAt]));\n blocks = blocks.filter(b => effectiveTimeWindow(noteTimeMap.get(b.noteId) ?? b.createdAt, parsed.window, options.range, ctx));\n }\n\n // Cross-store join (direction 1): keep blocks whose raw-log metric\n // aggregate satisfies the predicate.\n if (parsed.join) {\n const joined = await this.applyMetricJoin(parsed, [], blocks);\n blocks = joined.blocks;\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n blocks = [...blocks].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n // Server-paged reads already applied offset/limit in natural id order —\n // re-slicing a pre-sliced page would skip rows.\n if (!blocksPaged && pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n blocks = pipes.limit !== undefined ? blocks.slice(offset, offset + pipes.limit) : blocks.slice(offset);\n }\n\n return { parsed, notes: [], blocks, stages: { selected: selectedCount, matched: blocks.length } };\n }\n\n /**\n * Execute a :effort query against the effort registry.\n */\n async runFindEffort(parsed: ParsedFindQuery): Promise<FindQueryResult> {\n const all = await this.effortStore.getAllEfforts();\n const selectedCount = all.length;\n\n const matches = (effort: IEffort, key: string, value: string, wildcard: boolean): boolean => {\n const needle = value.toLowerCase();\n switch (key) {\n case 'effort':\n if (wildcard) {\n return effort.slug.includes(needle)\n || effort.label.toLowerCase().includes(needle)\n || effort.aliases.some(a => a.toLowerCase().includes(needle));\n }\n return effort.slug === value\n || effort.label.toLowerCase() === needle\n || effort.aliases.some(a => a.toLowerCase() === needle);\n case 'discipline': return effort.baseAttributes.discipline === value;\n case 'intensity': return effort.baseAttributes.intensityTier === value;\n case 'origin': return effort.registrySource === value;\n case 'text':\n return effort.label.toLowerCase().includes(needle)\n || effort.slug.includes(needle)\n || effort.aliases.some(a => a.toLowerCase().includes(needle));\n default: return true;\n }\n };\n\n let efforts = all;\n for (const filter of parsed.filters) {\n if (!['effort', 'discipline', 'intensity', 'origin', 'text'].includes(filter.key)) continue;\n efforts = efforts.filter(effort => {\n const hit = filter.values.some(v => matches(effort, filter.key, v.value, v.wildcard));\n return filter.negate ? !hit : hit;\n });\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n efforts = [...efforts].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n if (pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n efforts = pipes.limit !== undefined ? efforts.slice(offset, offset + pipes.limit) : efforts.slice(offset);\n }\n\n return { parsed, notes: [], blocks: [], efforts, stages: { selected: selectedCount, matched: efforts.length } };\n }\n\n async run(parsed: AnyParsedQuery, options: QueryOptions = {}): Promise<QueryResult> {\n // Explicit family handling — no unchecked cast past the guards.\n if (isPipelineQuery(parsed)) {\n throw new Error('Pipeline queries do not aggregate directly — execute them with runPipeline().');\n }\n if (isFindQuery(parsed)) {\n // Content queries never aggregate; retired rows: text surfaces here as\n // a parse-errored find AST and returns the telemetry-zero result.\n return {\n parsed: { family: 'aggregate', raw: parsed.raw, agg: 'count', metric: parsed.target, filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n ...(parsed.error ? { error: parsed.error } : {}),\n };\n }\n const empty: QueryResult = {\n parsed,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n };\n if (parsed.error) return empty;\n\n // Cross-store join: reads stored summary rows over the content index —\n // the store is authoritative (finalize-owns, ticket 005).\n if (parsed.join) return this.runJoined(parsed, options);\n\n // Stage 1: SELECT — window-first hybrid (ticket 003): a time window\n // fetches through by-timestamp, the one proven culling index; all-time\n // queries scan. by-metric is never used — ticket 001 measured it\n // non-selective and slower than scanning.\n // C1 + ticket 12 precedence: the query's own window WINS over the host\n // range options — the host range is the default when the query has none.\n // Resolution uses the one captured execution context (half-open bounds).\n const ctx = runContext(options);\n const range = resolveAggregateRange(parsed, options, ctx);\n // The store fetch bound is an upper cutoff, not the membership test —\n // pass the resolved end through unchanged (MAX_SAFE_INTEGER for the\n // unbounded side).\n const fetchRange = range ? { start: range.start, end: range.end } : undefined;\n // Complete fetch (ticket 12/14): a bounded window fetches through\n // by-timestamp and unions by-metric-date candidates over EVERY covered\n // civil date — no cap, DST-safe enumeration. An unbounded side (the 0 /\n // MAX_SAFE_INTEGER sentinels, or a negative open bound) has no finite\n // date horizon to enumerate — the all-store scan IS the complete fetch;\n // membership filtering below stays exact either way.\n const boundedRange =\n fetchRange && fetchRange.start > 0 && fetchRange.end < Number.MAX_SAFE_INTEGER ? fetchRange : undefined;\n let eventRows = boundedRange\n ? await this.store.getEventsByTimeRange(boundedRange.start, boundedRange.end)\n : await this.store.scanAll();\n if (boundedRange && this.store.getEventsByMetricDates) {\n const civilDates = civilDatesCoveredByRange(boundedRange.start, boundedRange.end, ctx.timeZone);\n if (civilDates.length > 0) {\n const byDate = await this.store.getEventsByMetricDates(civilDates);\n if (byDate.length > 0) {\n const seen = new Set(eventRows.map((r) => r.id));\n eventRows = [...eventRows, ...byDate.filter((r) => !seen.has(r.id))];\n }\n }\n }\n return this.aggregateEventRows(parsed, eventRows, options, range);\n }\n\n /**\n * In-memory aggregation over ALREADY-FETCHED event rows — the pipeline\n * dataset/transform path. Identical metric projection, selection,\n * bucketing, unit, and aggregation stages as `run`; no store reads (a\n * content join on carried data is REJECTED by runAggregateEvents — it\n * would abandon the carried population).\n */\n async runAggregateEvents(query: ParsedAggregateQuery, events: readonly EventRecord[], options: QueryOptions = {}): Promise<QueryResult> {\n const empty: QueryResult = {\n parsed: query,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n };\n if (query.error) return empty;\n // A content join resolves its scope from the STORE — that would abandon\n // the carried population. Author the join on the pipeline's source stage\n // instead.\n if (query.join) {\n return {\n ...empty,\n error: 'where <content> joins re-read the store and cannot run on carried pipeline data — author the join in the source stage.',\n };\n }\n const ctx = runContext(options);\n const range = resolveAggregateRange(query, options, ctx);\n return this.aggregateEventRows(query, events, options, range);\n }\n\n /** Public pipeline executor — parse the text, then run. */\n async runPipeline(queryText: string, options: PipelineOptions = {}): Promise<PipelineResult> {\n return this.runPipelineParsed(parseQuery(queryText), options);\n }\n\n /** Execute an already-parsed pipeline: resolve the source once, then flow\n * the carried value left to right through the transforms — each function\n * reduces the PRECEDING stage, never an independent re-query. Dataset\n * stages look up `pageSources` (then an injected datasetStore)\n * synchronously; no database roundtrip. */\n async runPipelineParsed(parsed: AnyParsedQuery, options: PipelineOptions = {}): Promise<PipelineResult> {\n if (!isPipelineQuery(parsed)) {\n const error = parsed.error ?? `Not a pipeline: \"${parsed.raw}\". Pipelines look like :source{filters} | :sum{metric:x} | :table.`;\n return { parsed: { family: 'pipeline', raw: parsed.raw, source: { kind: 'dataset', name: '' }, transforms: [], error }, error };\n }\n const fail = (error: string): PipelineResult => ({ parsed, error });\n if (parsed.error) return fail(parsed.error);\n\n let content: FindQueryResult | undefined;\n let carried: QueryResult | undefined;\n let sourceEvents: EventRecord[] | undefined;\n let datasetNotes: Note[] = [];\n\n if (parsed.source.kind === 'dataset') {\n const name = parsed.source.name;\n const dataset = options.pageSources?.get(name) ?? this.datasetStore?.getDataset(name);\n if (!dataset) return fail(`Unknown dataset \"${name}\" — the host must register it before the query runs.`);\n sourceEvents = dataset.events;\n datasetNotes = dataset.notes;\n } else if (isFindQuery(parsed.source.query)) {\n const q = parsed.source.query;\n content = await this.runFind(q, {\n context: options.context,\n ...((options.rangeStart !== undefined || options.rangeEnd !== undefined)\n ? { range: { start: options.rangeStart ?? 0, end: options.rangeEnd ?? Number.MAX_SAFE_INTEGER, endExclusive: false } }\n : {}),\n });\n if (q.error) return fail(q.error);\n } else {\n carried = await this.run(parsed.source.query, options);\n if (parsed.source.query.error) return fail(parsed.source.query.error);\n }\n\n if (parsed.transforms.length === 0) {\n // Source-only pipeline (optionally with a chart sink) — the stage\n // result surfaces as-is, no event resolution.\n if (content) {\n return {\n parsed,\n ...(content.notes.length ? { notes: content.notes } : {}),\n ...(content.blocks.length ? { blocks: content.blocks } : {}),\n ...(content.efforts?.length ? { efforts: content.efforts } : {}),\n ...(content.runs?.length ? { runs: content.runs } : {}),\n ...(content.table ? { table: content.table } : {}),\n ...(content.containers ? { containers: content.containers } : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n if (parsed.source.kind === 'dataset') {\n // Dataset alone — its notes are the surface; telemetry flows only\n // through transforms.\n return { parsed, notes: datasetNotes, ...(parsed.sink ? { chart: parsed.sink } : {}) };\n }\n return {\n parsed,\n ...(carried\n ? { series: carried.series, ...(carried.unit ? { unit: carried.unit } : {}), ...(carried.error ? { error: carried.error } : {}) }\n : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n\n if (!carried) {\n if (!sourceEvents && content) sourceEvents = await this.sourceEventsFromFind(content);\n carried = await this.runAggregateEvents(parsed.transforms[0]!, sourceEvents ?? [], options);\n for (const transform of parsed.transforms.slice(1)) {\n if (carried.error) break; // an errored stage stops the pipeline\n carried = reduceCarriedResult(carried, transform, options, runContext(options));\n }\n } else {\n for (const transform of parsed.transforms) {\n if (carried.error) break; // an errored stage stops the pipeline\n carried = reduceCarriedResult(carried, transform, options, runContext(options));\n }\n }\n return {\n parsed,\n series: carried.series,\n ...(carried.unit ? { unit: carried.unit } : {}),\n ...(carried.error ? { error: carried.error } : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n\n /** Events behind a content source — resolved ONLY when a transform needs\n * them: session/table sources already carry their rows; note sources read\n * the per-note index; block sources read the content index. */\n private async sourceEventsFromFind(content: FindQueryResult): Promise<EventRecord[]> {\n if (content.events) return content.events;\n const rows: EventRecord[] = [];\n for (const note of content.notes) rows.push(...await this.store.getEventsForNote(note.id));\n for (const block of content.blocks) {\n if (block.dataType === 'wod' && block.blockContentId) rows.push(...await this.store.getEventsByContent(block.blockContentId));\n }\n return rows;\n }\n\n /** QueryExecutor adapter: a pipeline run's final stage rendered as the\n * aggregate QueryResult shape chart consumers already read. */\n private pipelineResultToQueryResult(pr: PipelineResult): QueryResult {\n const parsed: ParsedAggregateQuery = { family: 'aggregate', raw: pr.parsed.raw, agg: 'count', metric: '', filters: [], groupBy: [] };\n if (pr.series) {\n const aggregated = pr.series.reduce((n, s) => n + s.points.length, 0);\n return {\n parsed,\n series: pr.series,\n stages: { selected: 0, buckets: pr.series[0]?.points.length ?? 0, aggregated, groups: pr.series.length },\n matched: [],\n ...(pr.unit ? { unit: pr.unit } : {}),\n ...(pr.error ? { error: pr.error } : {}),\n };\n }\n return {\n parsed, series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n ...(pr.error ? { error: pr.error } : {}),\n };\n }\n\n /** Stages 2–4 over raw event rows: project → metric filter → range filter\n * → tag filters → coverage selection → BUCKET/GROUP/AGGREGATE. */\n private async aggregateEventRows(\n parsed: ParsedAggregateQuery,\n eventRows: readonly EventRecord[],\n options: QueryOptions,\n range: ResolvedRange | undefined,\n ): Promise<QueryResult> {\n const ctx = runContext(options);\n if (!parsed.metric && parsed.agg !== 'count') {\n return {\n parsed,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n error: `Aggregate \"${parsed.agg}\" requires a metric — use ${parsed.agg}{metric:<key>}`,\n };\n }\n const matchesMetric = (metricKey: string | undefined, queryMetric: string) =>\n !queryMetric ||\n metricKey === queryMetric ||\n (queryMetric === 'rep' && metricKey === 'reps') ||\n (queryMetric === 'reps' && metricKey === 'rep');\n\n const factTime = (row: AnalyticsDataPoint): number => {\n if (row.metricDate) return zonedNoon(row.metricDate, ctx.timeZone);\n return row.timestamp;\n };\n\n const candidates = eventRows\n .flatMap(projectEventToFacts)\n .filter(row => matchesMetric(row.metricKey, parsed.metric))\n .filter(row => !range || inRange(factTime(row), range));\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(candidates, touchesTags);\n // Ticket 16: no global effort suppression — coverage selection below\n // keeps every population represented exactly once.\n const matched = candidates.filter(row => matchesFilters(row, parsed.filters, noteTags));\n\n const { selected, report } = selectContributions(matched, parsed.agg);\n return this.buildResult(selected, parsed, options, noteTags, range, report);\n }\n\n /**\n * Stages 2–4 — BUCKET → GROUP → AGGREGATE over an already-selected +\n * filtered `matched` set.\n */\n private buildResult(\n matched: AnalyticsDataPoint[],\n parsed: ParsedAggregateQuery,\n options: QueryOptions,\n noteTags: ReadonlyMap<string, readonly string[]>,\n range: ResolvedRange | undefined,\n coverage?: CoverageReport,\n ): QueryResult {\n const ctx = runContext(options);\n // Stage 2: BUCKET — structural bucket identity (ticket 12): calendar\n // day buckets anchor on the observation's civil date in the context\n // timezone, week buckets on the Monday date; fixed-duration `.rollup`\n // keeps its epoch-aligned width (a deliberately distinct kind, not a\n // calendar week). Display timestamps (local noon / epoch midpoint) are\n // presentation-only — never join keys.\n const timeDim = parsed.groupBy.find((d) => d === 'day' || d === 'week');\n const tagDims = parsed.groupBy.filter((d) => d !== 'day' && d !== 'week');\n const rollup = parsed.rollup;\n\n /** The observation's own temporal anchor: its recorded metric date when\n * it carries one (date-only facts keep their civil date), else the\n * fact timestamp's civil date in the context timezone. */\n const anchorDate = (row: AnalyticsDataPoint): string =>\n row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone);\n const bucketKey = (row: AnalyticsDataPoint): string => {\n if (timeDim === 'day') return `d:${anchorDate(row)}`;\n if (timeDim === 'week') return `w:${civilMonday(anchorDate(row))}`;\n if (rollup) {\n const ad = anchorDate(row);\n if (rollup.unit === 'w') {\n const m = civilMonday(ad);\n const weeksSince = Math.floor(civilDateDiff('1970-01-05', m) / 7);\n const bucketIndex = Math.floor(weeksSince / rollup.size);\n const bucketStart = civilDateAdd('1970-01-05', bucketIndex * rollup.size * 7);\n return `w:${bucketStart}`;\n }\n if (rollup.unit === 'd') {\n const daysSince = civilDateDiff('1970-01-01', ad);\n const bucketIndex = Math.floor(daysSince / rollup.size);\n const bucketStart = civilDateAdd('1970-01-01', bucketIndex * rollup.size);\n return `d:${bucketStart}`;\n }\n }\n return '';\n };\n /** Presentation-only representative instant for a structural key. */\n const bucketDisplayTs = (key: string): number => {\n if (key.startsWith('d:') || key.startsWith('w:')) return zonedNoon(key.slice(2), ctx.timeZone);\n return Number.MAX_SAFE_INTEGER;\n };\n\n // Chronological bucket domain (ticket 12): bounded calendar queries\n // generate every period in the requested bounds — including empty ones;\n // unbounded sides use the observed extent; relative windows never\n // generate future buckets because their exclusive end is the captured\n // instant. No domain generation for rollup (duration buckets are\n // observed-only) or ungrouped queries.\n const MAX_DOMAIN = 10_000;\n const bareDate = (key: string): string => (key.startsWith('d:') || key.startsWith('w:') ? key.slice(2) : key);\n const calendarDomain = (observed: string[]): string[] => {\n const activeDim = timeDim ?? (rollup?.unit === 'w' ? 'week' : rollup?.unit === 'd' ? 'day' : undefined);\n if (!activeDim || observed.length === 0) return observed;\n const bounds = range && range.end !== Number.MAX_SAFE_INTEGER\n ? {\n startIso: civilDateOf(range.start, ctx.timeZone),\n endIso: range.endExclusive ? civilDateOf(range.end - 1, ctx.timeZone) : civilDateOf(range.end, ctx.timeZone),\n }\n : { startIso: bareDate(observed[0]!), endIso: bareDate(observed[observed.length - 1]!) };\n const first = activeDim === 'week' ? civilMonday(bounds.startIso) : bounds.startIso;\n const last = activeDim === 'week' ? civilMonday(bounds.endIso) : bounds.endIso;\n const step = activeDim === 'week' ? 7 * (rollup?.size ?? 1) : (rollup?.size ?? 1);\n const span = civilDateDiff(first, last);\n if (span < 0 || span / step > MAX_DOMAIN) return observed;\n const domain: string[] = [];\n for (let cursor = first; ; cursor = civilDateAdd(cursor, step)) {\n domain.push(activeDim === 'week' ? `w:${cursor}` : `d:${cursor}`);\n if (cursor >= last) break;\n }\n return domain;\n };\n\n // Output unit (ticket 13): explicit `in <unit>` directive wins when\n // dimensionally compatible; otherwise the system default for the\n // observations' dimension; unitless observations stay unitless. No\n // first-record fallback, no widget-preference tier.\n const unitResolution = resolveOutputUnit(matched, {\n directive: parsed.displayUnit,\n preferred: options.preferredUnit,\n });\n const targetUnit = unitResolution.unit;\n const shouldConvert = unitResolution.convert === true;\n const seriesError = unitResolution.error;\n\n // Stage 3+4: GROUP + AGGREGATE per bucket. Group identity (ticket 16)\n // is the canonical ordered tuple of resolved dimension values, JSON\n // encoded — delimiter-containing labels cannot collide; a missing\n // dimension resolves to the structural UNASSIGNED sentinel (distinct\n // from any literal text). The display label is derived, never identity.\n const UNASSIGNED = '\\u0000unassigned';\n const unassignedLabel = 'unassigned';\n const groups = new Map<string, { label: string; rows: AnalyticsDataPoint[] }>();\n for (const row of matched) {\n const tuple = tagDims.map((d) => dimValue(row, d, noteTags, ctx));\n const key = tagDims.length ? JSON.stringify(tuple) : parsed.metric;\n const label = tagDims.length\n ? tuple.map((v) => (v === UNASSIGNED ? unassignedLabel : v)).join(' · ')\n : parsed.metric;\n const bucket = groups.get(key);\n if (bucket) bucket.rows.push(row);\n else groups.set(key, { label, rows: [row] });\n }\n\n const series: Series[] = [...groups.entries()].map(([key, group]) => {\n const rows = group.rows;\n if (seriesError) {\n return { key, label: group.label, points: [], unit: undefined, error: seriesError };\n }\n const byBucket = new Map<string, AnalyticsDataPoint[]>();\n for (const row of rows) {\n const b = bucketKey(row);\n const members = byBucket.get(b);\n if (members) members.push(row);\n else byBucket.set(b, [row]);\n }\n const observedKeys = [...byBucket.keys()].sort();\n const domain = timeDim ? calendarDomain(observedKeys) : observedKeys;\n let error: string | undefined;\n const points: SeriesPoint[] = domain.map((b) => {\n const members = byBucket.get(b);\n if (!members) {\n // Missing query position (ticket 12 domain + ticket 13 matrix):\n // zero-filled with absence provenance — never an observation.\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n // Compatible-unit normalization BEFORE arithmetic (finding 3.3).\n let values: number[];\n try {\n values = members.map((m) =>\n shouldConvert && targetUnit && (m.unit ?? m.metricUnit) !== undefined\n ? convertViaCatalog(m.value as number, (m.unit ?? m.metricUnit) as string, targetUnit)\n : m.value as number,\n );\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n const reduced = aggregate(values, parsed.agg, members);\n if (reduced.state === 'error') {\n error = reduced.message;\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n return {\n ts: timeDim || rollup\n ? bucketDisplayTs(b)\n : Math.min(...members.map((m) => m.timestamp)),\n // Unrounded — renderers format (ticket 13 precision policy).\n value: reduced.value,\n ...(reduced.state === 'absent' ? { missing: true } : {}),\n };\n });\n // `count` reduces to the count dimension regardless of input.\n // Output unit is the resolved one — count reduces to count; no\n // first-record fallback (ticket 13 cutover).\n const seriesUnit = parsed.agg === 'count' ? 'count' : targetUnit;\n return { key, label: group.label, points, unit: seriesUnit, ...(error ? { error } : {}) };\n });\n\n const aggregated = series.reduce((n, s) => n + s.points.length, 0);\n const scalar = series.length === 1 && series[0].points.length === 1 ? series[0].points[0].value : undefined;\n const resultUnit = series.length > 0 ? series[0].unit : undefined;\n const bucketCount = timeDim || rollup\n ? (series[0]?.points.length ?? 0)\n : (matched.length ? 1 : 0);\n\n const insufficient = coverage?.insufficientScopes ?? [];\n const resultError = series.find((s) => s.error)?.error\n ?? (insufficient.length > 0\n ? `Insufficient evidence: ${insufficient.map((s) => `${s.resultId}/${s.metricKey} (${s.reason})`).join('; ')}`\n : undefined);\n return {\n parsed,\n series,\n stages: { selected: matched.length, buckets: bucketCount, aggregated, groups: series.length },\n matched,\n scalar,\n unit: resultUnit,\n ...(resultError ? { error: resultError } : {}),\n ...(coverage ? { coverage } : {}),\n };\n }\n\n /** Direction 2 — re-derive the metric from raw logs, restricted to the\n * blockContentIds owned by the find predicate's content matches. */\n private async runJoined(parsed: ParsedAggregateQuery, options: QueryOptions): Promise<QueryResult> {\n const empty: QueryResult = {\n parsed, series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n const join = parsed.join as FindPredicate;\n const findResult = await this.runFind({\n family: 'find',\n raw: '', target: join.target, filters: join.filters,\n window: join.last ? { kind: 'relative', size: join.last.size, unit: join.last.unit } : undefined,\n });\n const contentIds = await this.contentIdsFromFindResult(findResult);\n if (contentIds.size === 0) return empty;\n\n // Ticket 16: content-joined queries keep eligible event-grain\n // observations (the summary-only join filter is gone); overlapping\n // scope fetches dedupe by stable observation identity.\n let facts = dedupeById(await this.deriveMetricFacts(contentIds, parsed.metric));\n // Ticket 12 precedence + context: query window wins; host range is the\n // default; membership half-open against the captured context.\n const ctx = runContext(options);\n const joinRange = resolveAggregateRange(parsed, options, ctx);\n if (joinRange) {\n facts = facts.filter(f => inRange(f.timestamp, joinRange));\n }\n\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(facts, touchesTags);\n const matched = facts.filter(f => matchesFilters(f, parsed.filters, noteTags));\n const { selected, report } = selectContributions(matched, parsed.agg);\n return this.buildResult(selected, parsed, options, noteTags, joinRange, report);\n }\n\n /** Direction 1 — keep only content owning a wod block whose raw-log metric\n * aggregate satisfies the predicate. `notes` for :note, `blocks` for\n * :block. */\n private async applyMetricJoin(\n parsed: ParsedFindQuery,\n notes: Note[],\n blocks: BlockIndexRow[],\n ): Promise<{ notes: Note[]; blocks: BlockIndexRow[] }> {\n const join = parsed.join as MetricPredicate;\n // Resolve the wod blockContentIds owned by each candidate note.\n const noteToContent = await this.noteContentMap(new Set(notes.map(n => n.id)));\n // Candidate content ids: wod blocks owned by matched notes or blocks.\n const candidateIds = new Set<string>();\n for (const set of noteToContent.values()) for (const id of set) candidateIds.add(id);\n for (const b of blocks) if (b.dataType === 'wod' && b.blockContentId) candidateIds.add(b.blockContentId);\n\n const passing = await this.contentIdsSatisfying(candidateIds, join);\n\n // :block — only wod blocks whose content id passes (prose has no metric).\n blocks = blocks.filter(b => b.dataType === 'wod' && !!b.blockContentId && passing.has(b.blockContentId!));\n // :note — keep notes owning ≥1 passing wod block.\n notes = notes.filter(n => {\n const cids = noteToContent.get(n.id);\n return !!cids && [...cids].some(id => passing.has(id));\n });\n return { notes, blocks };\n }\n\n /** Re-derive the metric from raw logs for each content id, aggregate per id,\n * and return the ids whose aggregate satisfies the join predicate. */\n private async contentIdsSatisfying(\n contentIds: Set<string>,\n join: MetricPredicate,\n ): Promise<Set<string>> {\n const facts = dedupeById(await this.deriveMetricFacts(contentIds, join.metric));\n const noteTags = await this.loadNoteTags(facts, join.filters.some(f => f.key === 'tags'));\n const filtered = selectContributions(\n facts.filter(f => matchesFilters(f, join.filters, noteTags)),\n join.agg,\n ).selected;\n const byContent = new Map<string, AnalyticsDataPoint[]>();\n for (const f of filtered) {\n const cid = f.blockContentId ?? '';\n const arr = byContent.get(cid);\n if (arr) arr.push(f);\n else byContent.set(cid, [f]);\n }\n const passing = new Set<string>();\n for (const [cid, rows] of byContent) {\n const values = rows.map(r => r.value as number);\n const reduced = aggregate(values, join.agg, rows);\n if (reduced.state !== 'observed') continue; // absent/insufficient never satisfies\n if (compareOp(reduced.value, join.operator, join.threshold)) passing.add(cid);\n }\n return passing;\n }\n\n\n /** Summary facts for one Canonical Metric Key across the given content ids —\n * the cross-store join source. Reads finalize-written summary rows straight\n * off the content index (ticket 003: the store is authoritative; the old\n * freshness re-derivation is moot). One fact row per result × rowKey. */\n private async deriveMetricFacts(\n contentIds: Iterable<string>,\n metricKey: string,\n ): Promise<AnalyticsDataPoint[]> {\n const ids = [...new Set(contentIds)];\n const rows = await Promise.all(ids.map((blockContentId) => this.store.getEventsByContent(blockContentId)));\n // Ticket 16 (finding 3.7): content-joined queries read every eligible\n // representation — the coverage selection shares the direct path's\n // contract, so detail rows are no longer filtered out here.\n return rows\n .flat()\n .flatMap(projectEventToFacts)\n .filter((f) => f.metricKey === metricKey);\n }\n\n /** All content blocks — journal and seeded corpus in one store. */\n private async allContentBlocks(): Promise<BlockIndexRow[]> {\n return this.hydrateBlocks(await this.blockStore.getAllBlocks());\n }\n\n /** Map each note id to the wod blockContentIds it owns. */\n private async noteContentMap(noteIds: Set<string>): Promise<Map<string, Set<string>>> {\n const map = new Map<string, Set<string>>();\n if (!noteIds.size) return map;\n const allBlocks = await this.allContentBlocks();\n for (const b of allBlocks) {\n if (b.dataType !== 'wod' || !b.blockContentId || !noteIds.has(b.noteId)) continue;\n let set = map.get(b.noteId);\n if (!set) { set = new Set(); map.set(b.noteId, set); }\n set.add(b.blockContentId);\n }\n return map;\n }\n\n /** Collect wod blockContentIds owned by a find query's content matches. */\n private async contentIdsFromFindResult(findResult: FindQueryResult): Promise<Set<string>> {\n const ids = new Set<string>();\n for (const b of findResult.blocks) if (b.dataType === 'wod' && b.blockContentId) ids.add(b.blockContentId);\n if (findResult.notes.length) {\n const noteIds = new Set(findResult.notes.map(n => n.id));\n const noteMap = await this.noteContentMap(noteIds);\n for (const set of noteMap.values()) for (const id of set) ids.add(id);\n }\n return ids;\n }\n\n /** Load note tag labels only when the query touches 'tags'. Batched when\n * a relationStore is injected — one bundle read per run instead of a\n * junction read per row's note. */\n private async loadNoteTags(rows: AnalyticsDataPoint[], touchesTags: boolean): Promise<Map<string, readonly string[]>> {\n const noteTags = new Map<string, readonly string[]>();\n if (!touchesTags) return noteTags;\n const noteIds = [...new Set(rows.map(r => r.noteId))];\n if (this.relationStore) {\n const bundles = await this.relationStore.getBatches(noteIds);\n for (const id of noteIds) {\n noteTags.set(id, (bundles.get(id)?.tags ?? []).map((t) => t.label));\n }\n return noteTags;\n }\n await Promise.all(noteIds.map(async (id) => noteTags.set(id, await this.noteStore.getNoteTagLabels(id))));\n return noteTags;\n }\n\n /** Resolve matching note IDs for an exercise slug via the block_efforts containment index. */\n private async getNoteIdsForEffort(effortSlug: string): Promise<Set<string>> {\n const rows = await this.blockEffortsStore.getAllFromIndex('by-effort', effortSlug);\n return new Set(rows.map(r => r.noteId));\n }\n\n /** Resolve matching note IDs for a canonical typed tag (e.g. equipment:kettlebell). */\n private async getNoteIdsForTypedTag(type: string, label: string): Promise<Set<string>> {\n const tags = await this.tagsStore.getAllFromIndex('by-label', label);\n const typedTag = tags.find(t => t.type === type);\n if (!typedTag) return new Set();\n const links = await this.noteTagsStore.getAllFromIndex('by-tag', typedTag.id);\n return new Set(links.map(l => l.noteId));\n }\n\n /**\n * Find catalogs: identifies catalogs whose member notes (or catalog landing\n * notes) match the authored criteria (effort, tags, text, typed tags, etc.).\n */\n private async runFindCatalog(parsed: ParsedFindQuery, options: FindOptions, allNotes: Note[]): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const feedNotes = allNotes.filter(n => sourceMatches(n, 'feeds') || (n.catalog && !n.sourceId));\n\n let catalogNotes = feedNotes.filter(n => n.type === 'feed' || n.sourceId?.startsWith('page:collection:'));\n const existingCatIds = new Set(catalogNotes.map(n => catalogOfItem(n) ?? n.id));\n for (const n of feedNotes) {\n const cat = catalogOfItem(n);\n if (cat && !existingCatIds.has(cat)) {\n catalogNotes.push({\n id: cat,\n title: cat,\n type: 'feed',\n sourceId: `page:collection:${cat}`,\n catalog: cat,\n createdAt: n.createdAt ?? 0,\n rawContent: '', sourceRevision: 1, blocks: {},\n });\n existingCatIds.add(cat);\n }\n }\n\n const membersByCat = new Map<string, Note[]>();\n for (const catNote of catalogNotes) {\n const catId = catalogOfItem(catNote) ?? catNote.id;\n membersByCat.set(catId, [catNote]);\n }\n for (const n of feedNotes) {\n const catId = catalogOfItem(n);\n if (catId) {\n const list = membersByCat.get(catId);\n if (list) {\n if (!list.includes(n)) list.push(n);\n } else {\n membersByCat.set(catId, [n]);\n }\n }\n }\n\n const criteriaFilters = parsed.filters.filter(f =>\n !(f.key === 'source' && !f.negate && f.values.some(v => v.value === 'feeds' || v.value === 'feed')) &&\n !(f.key === 'type' && !f.negate && f.values.some(v => v.value === 'feed'))\n );\n\n let matchingCatalogs = [...catalogNotes];\n\n for (const filter of criteriaFilters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const hit = wanted.has(catId);\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'effort') {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForEffort(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'tags') {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id) || (m.tags && filter.values.some(v => m.tags!.includes(v.value))));\n return filter.negate ? !hit : hit;\n });\n } else if (WQL_TYPED_TAG_KEYS.includes(filter.key as WqlTypedTagKey)) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForTypedTag(filter.key, v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => m.title.toLowerCase().includes(search) || m.rawContent.toLowerCase().includes(search));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => wanted.has(m.id));\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n if (parsed.window || options.range) {\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n return members.some(m => effectiveTimeWindow(m.date ?? m.createdAt, parsed.window, options.range, ctx));\n });\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n matchingCatalogs = [...matchingCatalogs].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n\n return {\n parsed,\n notes: matchingCatalogs,\n blocks: [],\n stages: { selected: catalogNotes.length, matched: matchingCatalogs.length },\n };\n }\n}\n","/**\n * Dashboard Note model (#898 map, format locked in #899).\n *\n * A dashboard is a markdown note: frontmatter marks it (`dashboard: true`) and\n * declares top-level controls as `dashboard.*` dot-keys; the body composes\n * ```query[:<type>][-<N>|-full] blocks whose title/question associate from the\n * markdown heading/paragraph directly above each block. Queries reference\n * tokens as `$name`, substituted as raw text at execution time. A block body\n * body is a Query Document (decision 22); presentation params ride the\n * fence tag as `key=value` attributes.\n *\n * This module is pure — no React, no editor, no query service — so the editor\n * extensions, the inline block renderer, and the dashboard route all share it.\n */\n\nimport { WQL_CALC_TARGETS } from '../vocabulary';\n\n// ── Widget types ───────────────────────────────────────────────────────────\n\nexport const DASHBOARD_WIDGET_TYPES = [\n 'table',\n 'list',\n 'value',\n 'timeseries',\n 'bar',\n 'donut',\n 'toplist',\n 'stacked-bar',\n 'goal-rings',\n 'zone-distribution',\n] as const;\nexport type DashboardWidgetType = (typeof DASHBOARD_WIDGET_TYPES)[number];\n\nexport function isDashboardWidgetType(type: string): type is DashboardWidgetType {\n return (DASHBOARD_WIDGET_TYPES as readonly string[]).includes(type);\n}\n\n/** The widget type a block renders as: a bare ```query fence defaults to `table`. */\nexport function resolveWidgetType(type: string | undefined): string {\n return type == null || type === '' ? 'table' : type;\n}\n\n/** Shared badge messages — the editor, inline renderer, and route all word these identically. */\nexport function unknownWidgetTypeMessage(type: string): string {\n return `unknown widget type \"${type}\"`;\n}\n\nexport function unknownTokensMessage(missing: readonly string[]): string {\n return `unknown token${missing.length > 1 ? 's' : ''}: ${missing.map((m) => `$${m}`).join(', ')}`;\n}\n\n/** Types whose renderer is planned for future maps (none remaining in #901). */\nexport const PLANNED_WIDGET_TYPES: readonly string[] = [];\n\n// The known calc.* metric set IS the canonical vocabulary (WQL_CALC_TARGETS,\n// kept in sync with the calc engine's registered outputs — #871). No\n// hand-synced duplicate here; proposed/unknown calc.* keys render as the\n// labeled placeholder badge via isProposedMetric (#901).\nconst KNOWN_CALC_METRICS: ReadonlySet<string> = new Set(WQL_CALC_TARGETS);\n\n/**\n * True when a metric is a proposed calculation not yet landed in the engine\n * (e.g. `calc.readiness`, `calc.mvcBw`, `calc.hrv`). Renderers show a labeled\n * placeholder badge (#901).\n */\nexport function isProposedMetric(metricKey: string | undefined): boolean {\n if (!metricKey) return false;\n if (!metricKey.startsWith('calc.')) return false;\n return !KNOWN_CALC_METRICS.has(metricKey);\n}\n\n// ── Fence-tag suffix parse ─────────────────────────────────────────────────\n\nexport const DASHBOARD_GRID_MAX_COLS = 4;\n\nexport interface QueryWidgetSuffix {\n /** Raw widget type from the tag, lowercased; '' for a bare ```query fence. */\n type: string;\n /** Grid column span 1..4 (`-N`). */\n spanCols?: number;\n /** Full-row flag (`-full`). Mutually exclusive with spanCols. */\n spanFull?: boolean;\n /** Presentation attributes: `key=value` tokens after the type/span\n * (decision 22 — positional params ride the fence tag, not the body). */\n attributes: Record<string, string>;\n /** Attribute order for stable re-serialization. */\n attributeOrder: string[];\n /** Set when the suffix is malformed (the type is still reported raw). */\n error?: string;\n}\n\n/**\n * Parse the suffix after `query:` in a fence tag — `<type>`, `<type>-<N>` or\n * `<type>-full`. Unknown types parse fine (renderers badge them); structural\n * problems (empty type, bad span, `-N-full` combo) set `error`.\n */\nexport function parseQueryWidgetSuffix(suffix: string): QueryWidgetSuffix {\n if (suffix === '') {\n return { type: '', attributes: {}, attributeOrder: [], error: 'missing widget type after \"query:\"' };\n }\n\n // Attributes: `key=value` pairs after the type/span token (a quoted value\n // may contain spaces). The head token carries type + span; everything\n // after the first whitespace is attribute tail.\n const attributes: Record<string, string> = {};\n const attributeOrder: string[] = [];\n const trimmedSuffix = suffix.trim();\n const headEnd = trimmedSuffix.search(/\\s/);\n const head = headEnd === -1 ? trimmedSuffix : trimmedSuffix.slice(0, headEnd);\n const attrTail = headEnd === -1 ? '' : trimmedSuffix.slice(headEnd);\n const attrPattern = /([a-zA-Z][a-zA-Z0-9_-]*)=(\"([^\"]*)\"|\\S+)/g;\n let consumed = 0;\n for (const match of attrTail.matchAll(attrPattern)) {\n consumed += match[0].length;\n const key = match[1]!.toLowerCase();\n const value = match[3] !== undefined ? match[3] : match[2]!;\n if (key in attributes) {\n return { type: head, attributes, attributeOrder, error: `duplicate attribute \"${key}\"` };\n }\n attributes[key] = value;\n attributeOrder.push(key);\n }\n const leftover = attrTail.replace(attrPattern, '').trim();\n if (leftover !== '') {\n return { type: head, attributes, attributeOrder, error: `malformed attribute \"${leftover.split(/\\s+/)[0]}\"` };\n }\n void consumed;\n\n let rest = head.toLowerCase();\n let spanCols: number | undefined;\n let spanFull: boolean | undefined;\n\n if (rest.endsWith('-full')) {\n spanFull = true;\n rest = rest.slice(0, -'-full'.length);\n } else {\n const spanMatch = rest.match(/-(\\d+)$/);\n if (spanMatch) {\n spanCols = Number(spanMatch[1]);\n rest = rest.slice(0, -spanMatch[0].length);\n }\n }\n\n if (rest === '' || !/^[a-z][a-z0-9-]*$/.test(rest)) {\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `malformed widget type \"${suffix}\"` };\n }\n if (/-(\\d+|full)$/.test(rest)) {\n // A second trailing modifier (e.g. `bar-2-full`, `bar-full-2`) — span and\n // full are mutually exclusive. Kebab hyphens inside the type are fine.\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `malformed widget suffix \"${suffix}\"` };\n }\n if (spanCols != null && (spanCols < 1 || spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `span ${spanCols} outside 1..${DASHBOARD_GRID_MAX_COLS}` };\n }\n return { type: rest, spanCols, spanFull, attributes, attributeOrder };\n}\n\n// ── Frontmatter tokens ─────────────────────────────────────────────────────\n\n/** Frontmatter meta shape. */\nexport type DashboardMeta = Record<string, string | number | string[]>;\n\nconst TOKEN_PREFIX = 'dashboard.';\n\nexport interface DashboardToken {\n /** Token name without the `dashboard.` prefix (referenced as `$name`). */\n name: string;\n /** Scalar → single entry; block list → entries in declared order. */\n values: string[];\n /** List tokens render as segmented controls; scalars as inputs. */\n isList: boolean;\n}\n\n/** True when the note's frontmatter marks it as a dashboard (`dashboard: true`). */\nexport function isDashboardMeta(meta: DashboardMeta): boolean {\n return meta['dashboard'] === 'true' || meta['dashboard'] === true as unknown as string;\n}\n\n/** Extract `dashboard.*` dot-keys as tokens, in frontmatter declaration order. */\nexport function extractDashboardTokens(meta: DashboardMeta): DashboardToken[] {\n const tokens: DashboardToken[] = [];\n for (const [key, value] of Object.entries(meta)) {\n if (!key.startsWith(TOKEN_PREFIX) || key === TOKEN_PREFIX) continue;\n const name = key.slice(TOKEN_PREFIX.length);\n if (name === '') continue;\n if (Array.isArray(value)) {\n if (value.length > 0) tokens.push({ name, values: value.map(String), isList: true });\n } else {\n tokens.push({ name, values: [String(value)], isList: false });\n }\n }\n return tokens;\n}\n\n/** Default value per token: the scalar, or the first list entry (its control default). */\nexport function defaultTokenValues(tokens: readonly DashboardToken[]): Record<string, string> {\n const values: Record<string, string> = {};\n for (const token of tokens) values[token.name] = token.values[0];\n return values;\n}\n\n/**\n * Write a control change back into frontmatter meta (decision #899-6): a list\n * token reorders so the chosen value becomes the first entry (the default);\n * a scalar token's value is replaced. Returns a NEW meta object — serialize\n * with `serializeFrontmatter` and patch the note's frontmatter section.\n */\nexport function setDashboardTokenValue(\n meta: DashboardMeta,\n name: string,\n value: string,\n): DashboardMeta {\n const key = `${TOKEN_PREFIX}${name}`;\n const current = meta[key];\n const next: DashboardMeta = { ...meta };\n if (Array.isArray(current)) {\n if (!current.includes(value)) return meta; // controls only offer declared values\n next[key] = [value, ...current.filter((v) => v !== value)];\n } else if (current != null) {\n next[key] = typeof current === 'number' && !isNaN(Number(value)) ? Number(value) : value;\n } else {\n next[key] = value;\n }\n return next;\n}\n\n// ── Token substitution ─────────────────────────────────────────────────────\n\nconst TOKEN_REF_RE = /\\$([A-Za-z][\\w-]*)/g;\n\n/**\n * Substitute `$name` references with token values — raw text replacement at\n * execution time (decision #899-6). Unknown references stay literal and are\n * reported in `missing` (renderers badge them; never silent).\n */\nexport function substituteTokens(\n query: string,\n values: Record<string, string>,\n): { query: string; missing: string[] } {\n const missing = new Set<string>();\n const substituted = query.replace(TOKEN_REF_RE, (raw, name: string) => {\n const value = values[name];\n if (value == null) {\n missing.add(name);\n return raw;\n }\n return value;\n });\n return { query: substituted, missing: [...missing] };\n}\n\n/** Token names a query references, in order of first appearance. */\nexport function referencedTokens(query: string): string[] {\n const names = new Set<string>();\n for (const match of query.matchAll(TOKEN_REF_RE)) names.add(match[1]);\n return [...names];\n}\n\n// ── Widget body ────────────────────────────────────────────────────────────\n\n// ── Dashboard document ─────────────────────────────────────────────────────\n\n/** Structural input for the builder — satisfied by EditorSection + doc text. */\nexport interface DashboardSectionInput {\n /** Section type ('query', 'markdown', 'frontmatter', …). */\n type: string;\n /** Markdown subtype ('heading', 'paragraph', …) for markdown sections. */\n subtype?: string;\n /** Raw inner content of the section. */\n content: string;\n /** Widget type suffix parsed from the fence tag (query sections). */\n widgetType?: string;\n /** Grid column span parsed from the fence tag (query sections). */\n spanCols?: number;\n /** Full-row flag parsed from the fence tag (query sections). */\n spanFull?: boolean;\n /** Malformed fence-suffix reason — carried so route mode badges it too. */\n widgetError?: string;\n /** Fence-tag presentation attributes (decision 22). */\n attributes?: Record<string, string>;\n attributeOrder?: string[];\n}\n\nexport interface DashboardWidget {\n /** Stable key within the document (section index). */\n key: string;\n /** Raw widget type ('' → default `table` in dashboard composition). */\n type: string;\n spanCols?: number;\n spanFull?: boolean;\n /** Full fenced body — a Query Document (decision 22), comment lines\n * stripped, surrounding whitespace trimmed, line structure preserved. */\n body: string;\n /** Malformed fence-suffix reason — renderers badge instead of executing. */\n widgetError?: string;\n /** Fence-tag presentation attributes (decision 22) — positional params\n * ride the tag, never the body. */\n attributes: Record<string, string>;\n attributeOrder: string[];\n /** Title from the markdown heading directly above (or above the question). */\n title?: string;\n /** Coaching question from the paragraph directly above the block. */\n question?: string;\n}\n\nexport interface DashboardDocument {\n isDashboard: boolean;\n /** Note title from frontmatter. */\n title?: string;\n tokens: DashboardToken[];\n widgets: DashboardWidget[];\n}\n\n/** First line of a heading section's content, without the leading #'s. */\nfunction headingText(content: string): string | undefined {\n const line = content.split('\\n', 1)[0].replace(/^#{1,6}\\s*/, '').trim();\n return line === '' ? undefined : line;\n}\n\n/** Paragraph content collapsed to one line. */\nfunction paragraphText(content: string): string | undefined {\n const text = content.replace(/\\s*\\n\\s*/g, ' ').trim();\n return text === '' ? undefined : text;\n}\n\n/**\n * Build the dashboard document from ordered sections + frontmatter meta.\n *\n * Title/question association (decision #899-4) is strictly adjacency-based:\n * a paragraph directly above the block is its question; a heading directly\n * above that paragraph — or directly above the block — is its title. Anything\n * else leaves the widget untitled (renderers fall back to the query text).\n */\nexport function buildDashboardDocument(\n sections: readonly DashboardSectionInput[],\n meta: DashboardMeta,\n): DashboardDocument {\n const widgets: DashboardWidget[] = [];\n\n sections.forEach((section, i) => {\n if (section.type !== 'query') return;\n\n // Decision 22: the widget body is the FULL fenced content — a multi-line\n // Query Document. Comment lines are stripped; line structure is kept so\n // documents survive round-trips byte-for-byte.\n const body = section.content\n .split('\\n')\n .filter((l) => { const s = l.trim(); return s !== '' && !s.startsWith('#'); })\n .map((l) => l.trim())\n .join('\\n');\n\n let title: string | undefined;\n let question: string | undefined;\n const above = sections[i - 1];\n if (above?.type === 'markdown' && above.subtype === 'paragraph') {\n question = paragraphText(above.content);\n const heading = sections[i - 2];\n if (heading?.type === 'markdown' && heading.subtype === 'heading') {\n title = headingText(heading.content);\n }\n } else if (above?.type === 'markdown' && above.subtype === 'heading') {\n title = headingText(above.content);\n }\n\n widgets.push({\n key: `w${widgets.length}`,\n type: section.widgetType ?? '',\n spanCols: section.spanCols,\n spanFull: section.spanFull,\n widgetError: section.widgetError,\n body,\n attributes: section.attributes ?? {},\n attributeOrder: section.attributeOrder ?? [],\n title,\n question,\n });\n });\n\n const titleMeta = meta['title'];\n return {\n isDashboard: isDashboardMeta(meta),\n title: typeof titleMeta === 'string' && titleMeta !== '' ? titleMeta : undefined,\n tokens: extractDashboardTokens(meta),\n widgets,\n };\n}\n","/**\n * Shared frontmatter parser utilities for WQL dashboard models and notes.\n */\n\nexport interface ParsedFrontmatter {\n meta: Record<string, string | number | string[]>;\n body: string;\n}\n\nexport interface LinkWidget {\n kind: 'youtube' | 'amazon' | 'strava' | 'source' | 'website' | 'book';\n url?: string;\n label: string;\n videoId?: string;\n}\n\n/** Leading `---` … `---` block; body is everything after the closing delimiter. */\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/** Strip matched wrapping quotes: `\"x\"` / `'x'` → `x`; mismatched quotes are kept. */\nfunction unquote(value: string): string {\n return value.replace(/^(['\"])(.*)\\1$/, (_match, quote: string, inner: string) =>\n quote === '\"' ? inner.replace(/\\\\([\"\\\\])/g, '$1') : inner,\n );\n}\n\n/**\n * Parse the leading YAML frontmatter block of a markdown string.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = raw.match(FRONTMATTER_RE);\n if (!match) return { meta: {}, body: raw };\n\n return { meta: parseMetaLines(match[1].split(/\\r?\\n/)), body: raw.slice(match[0].length) };\n}\n\n/** Shared scalar/list line parser behind `parseFrontmatter` and `parseFrontmatterBody`. */\nfunction parseMetaLines(lines: string[]): ParsedFrontmatter['meta'] {\n const meta: ParsedFrontmatter['meta'] = {};\n\n for (let i = 0; i < lines.length; i++) {\n const keyMatch = lines[i].match(/^([A-Za-z][\\w.-]*)\\s*:(.*)$/);\n if (!keyMatch) continue;\n\n const key = keyMatch[1];\n const rawVal = keyMatch[2].trim();\n\n if (rawVal === '') {\n const items: string[] = [];\n while (i + 1 < lines.length) {\n const itemMatch = lines[i + 1].match(/^\\s+-\\s+(.+)$/);\n if (!itemMatch) break;\n items.push(itemMatch[1].trim());\n i++;\n }\n meta[key] = items.length > 0 ? items : '';\n } else {\n const wasQuoted = /^(['\"])(.*)\\1$/.test(rawVal);\n const value = unquote(rawVal);\n const num = Number(value);\n meta[key] = !wasQuoted && value !== '' && !isNaN(num) ? num : value;\n }\n }\n\n return meta;\n}\n\n/**\n * Parse frontmatter body content (the lines between the `---` delimiters).\n */\nexport function parseFrontmatterBody(innerContent: string): ParsedFrontmatter['meta'] {\n return parseMetaLines(innerContent.split(/\\r?\\n/));\n}\n\nfunction quoteYamlScalar(value: string): string {\n if (value === '') return '\"\"';\n const looksNumeric = !isNaN(Number(value));\n const looksKeyword = /^(true|false|null|yes|no|on|off)$/i.test(value);\n if (/[\":'\\n#{}[\\\\],&*?|<>=%!@`]/.test(value) || value !== value.trim() || value.startsWith('-') || looksNumeric || looksKeyword) {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\n/**\n * Serialize frontmatter metadata back to YAML body lines.\n */\nexport function serializeFrontmatter(meta: ParsedFrontmatter['meta']): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(meta)) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n lines.push(`${key}: \"\"`);\n continue;\n }\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - ${quoteYamlScalar(item)}`);\n }\n } else if (typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else {\n lines.push(`${key}: ${quoteYamlScalar(value)}`);\n }\n }\n return lines.join('\\n');\n}\n\n/** Body of `raw` with the leading frontmatter block removed. */\nexport function stripFrontmatter(raw: string): string {\n return parseFrontmatter(raw).body;\n}\n\n/** Scalar value at `key`, or `undefined` when absent or a list. */\nexport function getScalar(\n meta: ParsedFrontmatter['meta'],\n key: string,\n): string | number | undefined {\n const value = meta[key];\n return typeof value === 'string' || typeof value === 'number' ? value : undefined;\n}\n\n/** List value at `key`, or `[]` when absent or a scalar. */\nexport function getList(meta: ParsedFrontmatter['meta'], key: string): string[] {\n const value = meta[key];\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Parse the `category` YAML array from a full markdown string's frontmatter.\n */\nexport function parseFrontmatterCategories(raw: string): string[] {\n return getList(parseFrontmatter(raw).meta, 'category').map(c => c.toLowerCase());\n}\n\n/**\n * Extract the `tags` list from a frontmatter block's raw content.\n */\nexport function extractFrontmatterTags(raw: string): string[] {\n const meta = FRONTMATTER_RE.test(raw)\n ? parseFrontmatter(raw).meta\n : parseFrontmatterBody(raw);\n const tags = meta['tags'];\n const list = Array.isArray(tags)\n ? tags\n : typeof tags === 'string' && tags.trim()\n ? tags.trim().startsWith('[') && tags.trim().endsWith(']')\n ? tags.trim().slice(1, -1).split(',')\n : [tags]\n : [];\n return [...new Set(list.map(tag => tag.trim()).filter(Boolean))];\n}\n\n/**\n * Parse flat scalar key-value pairs from raw inner content (no delimiters).\n */\nexport function parseFlatProperties(innerContent: string): Record<string, string> {\n const props: Record<string, string> = {};\n for (const line of innerContent.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/);\n if (match) {\n props[match[1].trim()] = match[2].trim();\n }\n }\n return props;\n}\n\n/**\n * Parse scalar key-value pairs from an array of lines.\n */\nexport function parseFrontmatterProps(lines: string[]): Record<string, string> {\n const props: Record<string, string> = {};\n for (const line of lines) {\n const match = line.match(/^([^:]+):\\s*(.*)$/);\n if (match) {\n props[match[1].trim()] = match[2].trim();\n }\n }\n return props;\n}\n","import { parseFrontmatter } from './frontmatter';\nimport { parseQueryWidgetSuffix, type DashboardSectionInput, type DashboardMeta } from './model';\n\nexport interface DashboardParsedSection extends DashboardSectionInput {\n /** 0-indexed start line of the section in the raw content. */\n startLine: number;\n /** 0-indexed inclusive end line of the section in the raw content. */\n endLine: number;\n}\n\n/**\n * Parses a raw markdown note into sections suitable for `buildDashboardDocument`,\n * keeping track of line numbers so edits can write back to the source text.\n */\nexport function parseDashboardNote(rawContent: string): { meta: DashboardMeta; sections: DashboardParsedSection[] } {\n const { meta } = parseFrontmatter(rawContent);\n const lines = rawContent.split(/\\r?\\n/);\n const sections: DashboardParsedSection[] = [];\n\n // Find where the body starts (skip frontmatter)\n let i = 0;\n if (lines.length > 0 && lines[0].trim() === '---') {\n i = 1;\n while (i < lines.length && lines[i].trim() !== '---') {\n i++;\n }\n i++; // skip the closing ---\n }\n\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Query block\n if (/^```query/.test(trimmed)) {\n // The full suffix (after ```query) may carry `key=value` presentation\n // attributes (decision 22) — the whole remainder parses as one suffix.\n // NOT lowercased: attribute values are case-sensitive ($Token names);\n // parseQueryWidgetSuffix lowercases the type and keys itself.\n const tag = trimmed.slice(3);\n let widgetType;\n let spanCols;\n let spanFull;\n let widgetError;\n let attributes: Record<string, string> | undefined;\n let attributeOrder: string[] | undefined;\n\n if (tag.startsWith('query:')) {\n const spec = parseQueryWidgetSuffix(tag.slice('query:'.length));\n widgetType = spec.type || undefined;\n spanCols = spec.spanCols;\n spanFull = spec.spanFull;\n widgetError = spec.error;\n attributes = spec.attributes;\n attributeOrder = spec.attributeOrder;\n }\n\n const startLine = i;\n i++;\n const bodyLines: string[] = [];\n while (i < lines.length && !/^```[\\w\\d_:-]*$/.test(lines[i].trim())) {\n bodyLines.push(lines[i]);\n i++;\n }\n const endLine = i; // The closing ``` line\n\n sections.push({\n type: 'query',\n content: bodyLines.join('\\n'),\n widgetType,\n spanCols,\n spanFull,\n widgetError,\n attributes,\n attributeOrder,\n startLine,\n endLine,\n });\n i++;\n continue;\n }\n\n // Generic fenced block (non-query code fence, e.g. ```wellness)\n if (/^```[\\w\\d_:-]*$/.test(trimmed)) {\n const startLine = i;\n const fenceLines: string[] = [lines[i]];\n i++;\n while (i < lines.length && !/^```[\\w\\d_:-]*$/.test(lines[i].trim())) {\n fenceLines.push(lines[i]);\n i++;\n }\n if (i < lines.length) {\n fenceLines.push(lines[i]);\n i++;\n }\n sections.push({\n type: 'markdown',\n subtype: 'paragraph',\n content: fenceLines.join('\\n'),\n startLine,\n endLine: i - 1,\n });\n continue;\n }\n\n // Heading\n if (trimmed.startsWith('#')) {\n sections.push({\n type: 'markdown',\n subtype: 'heading',\n content: trimmed,\n startLine: i,\n endLine: i,\n });\n i++;\n continue;\n }\n\n // Paragraph (contiguous non-empty, non-heading, non-fence lines)\n if (trimmed !== '') {\n const startLine = i;\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== '' &&\n !lines[i].trim().startsWith('#') &&\n !/^```[\\w\\d_:-]*$/.test(lines[i].trim())\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n sections.push({\n type: 'markdown',\n subtype: 'paragraph',\n content: paraLines.join('\\n'),\n startLine,\n endLine: i - 1,\n });\n continue;\n }\n\n // Blank lines\n i++;\n }\n\n return { meta, sections };\n}\n","/**\n * buildDashboardScaffold — raw markdown for a freshly created dashboard note\n * (#907 creation flow, format locked in #899).\n */\n\nexport const DEFAULT_DASHBOARD_TITLE = 'New Dashboard';\n\n/** Slugify a dashboard title for route addressing (/dashboard/:slug). */\nexport function dashboardSlug(title: string): string {\n return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '') || 'dashboard';\n}\n\nexport function buildDashboardScaffold(title: string = DEFAULT_DASHBOARD_TITLE): string {\n return `---\ndashboard: true\ndashboard.active: true\ntitle: ${title}\nslug: ${dashboardSlug(title)}\ndashboard.metric:\n - totalVolume\n---\n\n## Weekly Trend\nHow does $metric trend week over week?\n\n\\`\\`\\`query:timeseries\nsum:$metric{} by {week}\n\\`\\`\\`\n`;\n}\n","/**\n * Dashboard note operations — pure markdown↔markdown transforms over the\n * locked dashboard-note format (#899). Every operation:\n *\n * - takes the note's raw content and returns the NEW raw content (the caller\n * persists through journalNotes, the only write path);\n * - is identity-guarded: the target widget is located by its positional key\n * (`w${index}`, matching buildDashboardDocument) AND its expected body\n * content. A guard mismatch returns null and writes NOTHING — a concurrent\n * edit or reorder between read and write can never retarget the splice to\n * the wrong widget.\n *\n * A widget's editable unit is its \"group\": the title heading / coaching\n * question paragraph the document builder associates with the block (strict\n * adjacency, same rule as buildDashboardDocument) plus the ```query fence\n * itself. Move/duplicate/remove operate on the whole group so the rendered\n * card — title, question, chart — travels together.\n */\n\nimport { parseDashboardNote, type DashboardParsedSection } from './parser';\nimport { DASHBOARD_GRID_MAX_COLS } from './model';\nimport type { NoteBlockChange } from '@bitcobblers/wod-wiki-core';\n\n// ── Widget spec ────────────────────────────────────────────────────────────\n\nexport interface WidgetSpec {\n /** Card title — renders as a `## ` heading above the block. */\n title?: string;\n /** Coaching question — the paragraph between the heading and the block. */\n question?: string;\n /** Raw widget type from the fence suffix ('' → the `table` default). */\n type: string;\n spanCols?: number;\n spanFull?: boolean;\n /** The composed Query Document text — stored verbatim as the block body\n * (single-line or multi-line; decision 22). */\n wql: string;\n /** Fence-tag presentation attributes (goal targets, …). */\n attributes?: Record<string, string>;\n /** Attribute emission order (defaults to Object key order). */\n attributeOrder?: string[];\n}\n\nexport type WidgetSpan = Pick<WidgetSpec, 'spanCols' | 'spanFull'>;\n\n/** Opening fence line for a widget spec — type/span plus `key=value`\n * attributes (decision 22: presentation params ride the fence tag). */\nexport function widgetFenceTag(spec: Pick<WidgetSpec, 'type' | 'spanCols' | 'spanFull' | 'attributes' | 'attributeOrder'>): string {\n const type = spec.type.trim();\n let suffix = type === '' ? '' : `:${type}`;\n if (spec.spanFull) {\n suffix += '-full';\n } else if (spec.spanCols != null && spec.spanCols > 1) {\n suffix += `-${spec.spanCols}`;\n }\n const attrs = spec.attributes ?? {};\n for (const key of spec.attributeOrder ?? Object.keys(attrs)) {\n if (!(key in attrs)) continue;\n const value = attrs[key];\n const encoded = /^[a-zA-Z0-9_.-]+$/.test(value) ? value : `\"${value.replace(/\"/g, '')}\"`;\n suffix += ` ${key}=${encoded}`;\n }\n return `\\`\\`\\`query${suffix}`;\n}\n\n/** Block body: the Query Document text verbatim (trimmed). */\nexport function widgetBodyLine(spec: Pick<WidgetSpec, 'wql'>): string {\n return spec.wql.trim();\n}\n\n/** The markdown lines of a whole widget group (heading? / question? / fence block). */\nexport function renderWidgetGroup(spec: WidgetSpec): string[] {\n const lines: string[] = [];\n const title = spec.title?.trim();\n const question = spec.question?.trim();\n if (title) lines.push(`## ${title}`);\n if (question) lines.push(question);\n if (lines.length > 0) lines.push('');\n lines.push(widgetFenceTag(spec));\n lines.push(widgetBodyLine(spec));\n lines.push('```');\n return lines;\n}\n\n// ── Group location ─────────────────────────────────────────────────────────\n\ninterface WidgetGroup {\n /** Index into the query-section (widget) ordering — the `w${i}` key. */\n widgetIndex: number;\n /** Absolute line range in the raw content, covering the whole group. */\n startLine: number;\n endLine: number;\n}\n\n/**\n * Locate a widget's group, identity-guarded by its expected block body (the\n * `body` field buildDashboardDocument produced when the caller last parsed).\n * Returns null when the widget vanished or the body no longer matches —\n * the caller must re-read and never write.\n */\nfunction findWidgetGroup(\n sections: readonly DashboardParsedSection[],\n key: string,\n expectedBody: string,\n): { ok: true; group: WidgetGroup } | { ok: false; reason: 'not-found' | 'stale-body' } {\n const querySections = sections.filter((s) => s.type === 'query');\n const widgetIndex = querySections.findIndex((_, i) => `w${i}` === key);\n if (widgetIndex === -1) return { ok: false, reason: 'not-found' };\n const block = querySections[widgetIndex]!;\n\n // Identity guard (decision 22): the widget's EXACT full fenced body must\n // still be what the caller's last parse saw — any concurrent change\n // stale-marks the operation (re-read; never a blind or partial write).\n const body = block.content\n .split('\\n')\n .filter((l) => { const s = l.trim(); return s !== '' && !s.startsWith('#'); })\n .map((l) => l.trim())\n .join('\\n');\n if (body !== expectedBody.trim()) return { ok: false, reason: 'stale-body' };\n\n return {\n ok: true,\n group: { widgetIndex, startLine: groupStartLine(sections, block), endLine: block.endLine },\n };\n}\n\n/**\n * Group start for a query block: the associated title heading / coaching\n * question paragraph directly above it (strict adjacency — the document\n * builder's association rule), or the block's own line when untitled.\n */\nfunction groupStartLine(sections: readonly DashboardParsedSection[], block: DashboardParsedSection): number {\n const idx = sections.indexOf(block);\n const above = sections[idx - 1];\n if (above?.type === 'markdown' && above.subtype === 'paragraph') {\n const heading = sections[idx - 2];\n return heading?.type === 'markdown' && heading.subtype === 'heading'\n ? heading.startLine\n : above.startLine;\n }\n if (above?.type === 'markdown' && above.subtype === 'heading') return above.startLine;\n return block.startLine;\n}\n\n/** Line ranges of every widget group, in widget order. */\nfunction widgetGroupRanges(sections: readonly DashboardParsedSection[]): WidgetGroup[] {\n return sections\n .filter((s) => s.type === 'query')\n .map((block, widgetIndex) => ({\n widgetIndex,\n startLine: groupStartLine(sections, block),\n endLine: block.endLine,\n }));\n}\n\n// ── Operations ─────────────────────────────────────────────────────────────\n\n/**\n * Append a new widget group at the end of the note body. Frontmatter and all\n * existing content are preserved verbatim.\n */\nexport function appendWidget(raw: string, spec: WidgetSpec): string {\n const lines = raw.split('\\n');\n const group = renderWidgetGroup(spec);\n // Separate the new group from the body with exactly one blank line.\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n return [...lines, '', ...group, ''].join('\\n');\n}\n\n/** Structured operation result (decision 22): a missing widget is distinct\n * from a concurrent edit, and neither silently no-ops. */\nexport type WidgetOpResult =\n | { ok: true; note: string; changes: NoteBlockChange[]; retainedBlocks: Array<{ from: number; to: number; nextFrom: number; nextTo: number }> }\n | { ok: false; reason: 'not-found' | 'stale-body' };\n\nfunction widgetResult(raw: string, note: string, order?: Array<number | null>): Extract<WidgetOpResult, { ok: true }> {\n let from = 0;\n while (from < raw.length && from < note.length && raw[from] === note[from]) from++;\n let to = raw.length;\n let nextTo = note.length;\n while (to > from && nextTo > from && raw[to - 1] === note[nextTo - 1]) { to--; nextTo--; }\n const queries = parseDashboardNote(raw).sections.filter(section => section.type === 'query');\n const nextQueries = parseDashboardNote(note).sections.filter(section => section.type === 'query');\n const oldOffsets = lineOffsets(raw);\n const nextOffsets = lineOffsets(note);\n const oldLines = raw.split('\\n');\n const nextLines = note.split('\\n');\n const retainedBlocks: Extract<WidgetOpResult, { ok: true }>['retainedBlocks'] = [];\n for (const [nextIndex, oldIndex] of (order ?? queries.map((_, index) => index)).entries()) {\n if (oldIndex === null) continue;\n const block = queries[oldIndex];\n const next = nextQueries[nextIndex];\n if (!block || !next) throw new Error('Widget mutation lost its source lineage');\n retainedBlocks.push({ from: oldOffsets[block.startLine], to: oldOffsets[block.endLine] + oldLines[block.endLine].replace(/\\r$/, '').length,\n nextFrom: nextOffsets[next.startLine], nextTo: nextOffsets[next.endLine] + nextLines[next.endLine].replace(/\\r$/, '').length });\n }\n return { ok: true, note, changes: raw === note ? [] : [{ from, to, insert: note.slice(from, nextTo) }], retainedBlocks };\n}\n\nfunction lineOffsets(raw: string): number[] {\n let offset = 0;\n return raw.split('\\n').map(line => { const from = offset; offset += line.length + 1; return from; });\n}\n\n/**\n * Replace a widget's whole group (title/question/type/body) in place.\n * Identity-guarded against the widget's exact full body text.\n */\nexport function updateWidget(\n raw: string,\n key: string,\n expectedBody: string,\n spec: WidgetSpec,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n lines.splice(group.startLine, group.endLine - group.startLine + 1, ...renderWidgetGroup(spec));\n return widgetResult(raw, lines.join('\\n'));\n}\n\n/** Duplicate a widget's group directly below itself. Identity-guarded. */\nexport function duplicateWidget(\n raw: string,\n key: string,\n expectedBody: string,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n const copy = lines.slice(group.startLine, group.endLine + 1);\n // Insert the copy after the original, blank-line separated.\n lines.splice(group.endLine + 1, 0, '', ...copy);\n const order: Array<number | null> = sections.filter(section => section.type === 'query').map((_, index) => index);\n order.splice(group.widgetIndex + 1, 0, null);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Remove a widget's group (title/question/fence). Identity-guarded. Collapses\n * the blank-line gap the removal leaves behind.\n */\nexport function removeWidget(\n raw: string,\n key: string,\n expectedBody: string,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n // Collapse a blank sandwich (line before + line after both empty).\n if (\n group.startLine > 0 &&\n group.startLine < lines.length &&\n lines[group.startLine - 1] === '' &&\n lines[group.startLine] === ''\n ) {\n lines.splice(group.startLine, 1);\n }\n const order = sections.filter(section => section.type === 'query').map((_, index) => index);\n order.splice(group.widgetIndex, 1);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Reorder a widget among the query blocks — the whole group (title, question,\n * block) moves past its neighbor. `delta` is -1 (up) or +1 (down); out-of-range\n * moves are no-ops that return the content unchanged. Identity-guarded.\n */\nexport function moveWidget(\n raw: string,\n key: string,\n expectedBody: string,\n delta: -1 | 1,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const groups = widgetGroupRanges(sections);\n const neighbor = groups[group.widgetIndex + delta];\n if (!neighbor) return widgetResult(raw, raw);\n\n const lines = raw.split('\\n');\n const moving = lines.slice(group.startLine, group.endLine + 1);\n\n if (delta === -1) {\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n lines.splice(neighbor.startLine, 0, ...moving);\n } else {\n // Remove the moving group first (shifts the neighbor's start when the\n // neighbor comes after), then insert past the neighbor's new end.\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n const shift = group.startLine < neighbor.startLine ? group.endLine - group.startLine + 1 : 0;\n const insertAt = neighbor.endLine - shift + 1;\n lines.splice(insertAt, 0, ...moving);\n }\n const order = groups.map((_, index) => index);\n order.splice(group.widgetIndex, 1);\n order.splice(group.widgetIndex + delta, 0, group.widgetIndex);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Resize (or re-span) a widget: rewrites only the opening fence line, leaving\n * the body, params, and surrounding markdown untouched. `spanFull` wins over\n * `spanCols`. Identity-guarded.\n */\nexport function resizeWidget(\n raw: string,\n key: string,\n expectedBody: string,\n span: WidgetSpan,\n): WidgetOpResult {\n if (span.spanCols != null && (span.spanCols < 1 || span.spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { ok: false, reason: 'stale-body' }; // out-of-range span: refuse the write\n }\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const block = sections.find(\n (s) => s.type === 'query' && s.startLine >= group.startLine && s.endLine <= group.endLine,\n )!;\n const lines = raw.split('\\n');\n const indent = lines[block.startLine].match(/^\\s*/)![0];\n lines[block.startLine] =\n indent +\n widgetFenceTag({\n type: block.widgetType ?? '',\n spanCols: span.spanCols,\n spanFull: span.spanFull,\n attributes: block.attributes,\n attributeOrder: block.attributeOrder,\n });\n return widgetResult(raw, lines.join('\\n'));\n}\n\n// ── Legacy body migration (decision 22) ───────────────────────────────────\n\n/**\n * Rewrite one dashboard note's legacy widget bodies to Query Documents\n * (decision 22, answer 1): the first-` / ` positional split is retired.\n * For each query fence whose body carries ` / ` positional params, the\n * query text stays the body and the params move onto the fence tag as\n * numbered attributes (`param1=…`) — values preserved verbatim, losslessly\n * editable. A body already document-shaped is untouched; the note that\n * cannot be rewritten safely returns unchanged (the caller badges it).\n */\nexport function migrateLegacyDashboardBodies(raw: string): string {\n let out = raw;\n // Iterate fence blocks: ```query<suffix>\\n<body>\\n```\n const pattern = /(?:^|\\n)([ \\t]*)```query([^\\n]*)\\n([\\s\\S]*?)\\n[ \\t]*```/g;\n out = out.replace(pattern, (match, indent: string, suffix: string, body: string) => {\n const trimmed = body.trim();\n const sep = trimmed.indexOf(' / ');\n if (sep === -1) return match; // already a document — untouched\n const query = trimmed.slice(0, sep).trim();\n const params = trimmed.slice(sep + 3).split(/\\s+/).filter((p) => p !== '');\n const attrs = params\n .map((p, i) => (/^[a-zA-Z][a-zA-Z0-9_-]*=/.test(p) ? p : `param${i + 1}=${p}`))\n .join(' ');\n const newSuffix = suffix.trimEnd() + (suffix.includes('=') ? '' : (suffix.trim() === '' ? ' ' : ' ')) + attrs;\n return `${indent}\\`\\`\\`query${newSuffix}\\n${query}\\n\\`\\`\\``;\n });\n return out;\n}\n","/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.37.2139';\nexport const GIT_SHA = '491ec71';\nexport const BUILD_TIME = '2026-10-17T15:36:01.834Z';\nexport const SEMVER = {\n version: '0.37.2139',\n gitSha: '491ec71',\n buildTime: '2026-10-17T15:36:01.834Z',\n} as const;\n"]}
1
+ {"version":3,"sources":["../src/vocabulary.ts","../src/capabilities.ts","../src/grammar/wql.parser.ts","../src/grammar/wql.parser.terms.ts","../src/wqlSuffix.ts","../src/wql.ts","../src/serialize.ts","../src/disciplines.ts","../src/language.ts","../src/units.ts","../src/calendar.ts","../src/document.ts","../src/documentRunner.ts","../src/queryDocumentRunner.ts","../src/derivation.ts","../src/selection.ts","../src/QueryService.ts","../src/dashboard/model.ts","../src/dashboard/frontmatter.ts","../src/dashboard/parser.ts","../src/dashboard/scaffold.ts","../src/dashboard/noteOps.ts","../src/version.ts"],"names":["options","t","filters","host","statics","used","avail","start","text","byPosition","series","QueryDocumentRunner","dims","seen","m","UNASSIGNED","substituteTokens"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * WQL vocabulary — the single owner of the WQL dictionary: aggregators,\n * comparison operators, metric families/aggregates, calc.* targets, tag\n * keys, dimensions, rollup periods, grains, sources, scopes, display units,\n * and structural keywords. Every surface that needs these words imports from\n * here (or from language.ts, which re-exports this module for editor\n * consumers) rather than hand-writing its own copy — issue #871.\n *\n * The calc registry's built-in calcs (@bitcobblers/wod-wiki-lang's calc seeds)\n * publish exactly the `calc.*` targets listed in WQL_CALC_TARGETS; keep the\n * two in sync. User-authored calcs extend this set at runtime.\n */\n\nimport { KNOWN_OUTPUT_TYPES } from '@bitcobblers/wod-wiki-core';\n\n/** Canonical Metric Key families (CONTEXT.md §Analytics). */\nexport const WQL_METRIC_FAMILIES = ['reps', 'distance', 'resistance', 'elapsed', 'power', 'pace'] as const;\nexport type WqlMetricFamily = (typeof WQL_METRIC_FAMILIES)[number];\n\n/** Tier-2 aggregate keys written to the Analytics Store. */\nexport const WQL_METRIC_AGGREGATES = ['totalVolume', 'totalDistance', 'tis', 'sessionLoad'] as const;\nexport type WqlMetricAggregate = (typeof WQL_METRIC_AGGREGATES)[number];\n\n/** Aggregate head operators for the analytics grammar (agg:metric{filters}). */\nexport const WQL_AGGREGATORS = ['sum', 'avg', 'min', 'max', 'count', 'last', 'delta'] as const;\nexport type WqlAggregator = (typeof WQL_AGGREGATORS)[number];\n\n/** Comparison operators for cross-store `where` joins (#800). */\nexport const WQL_COMPARISON_OPS = ['>', '>=', '<', '<=', '==', '!='] as const;\nexport type WqlComparisonOp = (typeof WQL_COMPARISON_OPS)[number];\n\n/** Frontmatter typed-tag keys (CONTEXT.md § Tags) — values are dynamic,\n * backed by the host's tags store (`by-type` index), not a static enum. */\nexport const WQL_TYPED_TAG_KEYS = ['domain', 'format', 'equipment', 'quality', 'intent'] as const;\nexport type WqlTypedTagKey = (typeof WQL_TYPED_TAG_KEYS)[number];\n\n/** Tag keys the Query Service reads off a fact row (QueryService.factTagValue). */\nexport const WQL_TAG_KEYS = [\n ...WQL_TYPED_TAG_KEYS,\n 'effort', 'discipline', 'intensity', 'grade', 'note', 'page', 'origin',\n 'grain', 'metric', 'block', 'result', 'tags',\n] as const;\nexport type WqlTagKey = (typeof WQL_TAG_KEYS)[number];\n\n/** Content-plane keys — meaningful only on find:/rows:. On an aggregate\n * they are a category error (a fact row has no note text or source);\n * every other non-structural key is a candidate custom dimension. */\nexport const WQL_CONTENT_ONLY_KEYS = ['type', 'text', 'has', 'source', 'catalog', 'notebook'] as const;\n\n/** Filter keys the effort registry can resolve (runFindEffort) — anything\n * else on find:effort is ignored and reported as an advisory. */\nexport const WQL_EFFORT_FILTER_KEYS = ['effort', 'discipline', 'intensity', 'origin', 'text'] as const;\n\n/** Virtual dimensions — time buckets and stream positions, not fact fields. */\nexport const WQL_VIRTUAL_DIMS = ['day', 'week', 'session', 'round'] as const;\nexport type WqlVirtualDim = (typeof WQL_VIRTUAL_DIMS)[number];\n\n/**\n * Canonical `calc.*` targets. The single source of truth for the set of\n * calculation metric keys: source for the composer/CM6 typeahead (#871) and\n * the dashboard's known-vs-proposed gate (model.ts). Must\n * match the keys the calc engine registers in\n * @bitcobblers/wod-wiki-lang seeds (`calc.e1rm`, `calc.metMinutes`,\n * `calc.acwr`, `calc.monotony`, `calc.strain`, `calc.ctl`, `calc.atl`,\n * `calc.tsb`, etc.). NOTE: `calc.pmc` (composite {ctl, atl, tsb} series) is\n * deliberately absent — the store calc model publishes one scalar key per\n * definition, so PMC ships as the three loads (#905); a composite stays\n * 'proposed' until a dedicated series widget lands.\n */\nexport const WQL_CALC_TARGETS = [\n 'calc.metMinutes',\n 'calc.acwr',\n 'calc.monotony',\n 'calc.strain',\n 'calc.e1rm',\n 'calc.ctl',\n 'calc.atl',\n 'calc.tsb',\n // Wellness + capture metrics (seeds in seeds.ts): soreness/sleep/hrv are\n // user-captured passthroughs; readiness is their composite; mvcBw is\n // hang/%BW; ef is running pace ÷ HR; adherence is sessions ÷ planned;\n // pct1rm is the Epley-inverse intensity; sends count climbing sends.\n 'calc.soreness',\n 'calc.sleep',\n 'calc.hrv',\n 'calc.readiness',\n 'calc.mvcBw',\n 'calc.ef',\n 'calc.adherence',\n 'calc.pct1rm',\n 'calc.sends',\n] as const;\nexport type WqlCalcTarget = (typeof WQL_CALC_TARGETS)[number];\n\nexport const WQL_INTENSITY_TIERS = ['low', 'moderate', 'high'] as const;\nexport type WqlIntensityTier = (typeof WQL_INTENSITY_TIERS)[number];\n\n/** Unified store grains (ticket 003): 'summary' | 'event'. The legacy\n * 'segment' grain was renamed to 'event' (ticket 002); 'rollup' is retired —\n * rollups are computed at read time via the .rollup suffix, never stored. */\nexport const WQL_GRAINS = ['summary', 'event'] as const;\nexport type WqlGrain = (typeof WQL_GRAINS)[number];\n\n/** Content-discovery query targets (find:<target>). */\nexport const WQL_FIND_TARGETS = ['note', 'block', 'effort', 'session', 'segment', 'event'] as const;\nexport type WqlFindTarget = (typeof WQL_FIND_TARGETS)[number];\n\n/** Canonical source filter values: the allowed storage locations (the\n * former `collections` spelling is retired — renamed to feeds; storage\n * identities keep their `collection:` prefixes). Seed corpus locations\n * joined the note plane: prebuilt dashboards, the effort library and the\n * equipment library. */\nexport const WQL_SOURCE_VALUES = ['journal', 'feeds', 'guides', 'playground', 'dashboards', 'efforts', 'equipment'] as const;\nexport type WqlSourceValue = (typeof WQL_SOURCE_VALUES)[number];\n\n/** Colon source heads — the unprefixed `:<head>` names. Find targets map\n * 1:1 to the content planes; journal/feed(s)/catalog(s)/playground are\n * source-scoped note heads (they parse to target 'note' plus an injected\n * `source:` filter). */\nexport const WQL_SOURCE_HEADS = [\n 'note', 'block', 'effort', 'session', 'segment', 'event',\n 'journal', 'feed', 'feeds', 'catalog', 'catalogs', 'playground',\n 'dashboard',\n] as const;\nexport type WqlSourceHead = (typeof WQL_SOURCE_HEADS)[number];\n\n/** Storage scope a source-scoped note head binds (undefined = plain target). */\nexport const WQL_SOURCE_HEAD_SCOPES: Readonly<Record<string, WqlSourceValue>> = {\n journal: 'journal',\n feed: 'feeds',\n feeds: 'feeds',\n catalog: 'feeds',\n catalogs: 'feeds',\n playground: 'playground',\n};\n\n/** Type-alias note heads — `:<head>` parses to target 'note' plus an injected\n * `type:` filter (no storage scope, so the head never narrows by source).\n * `:dashboard` is the canonical member: dashboards are notes typed\n * 'dashboard', findable with ordinary note tags/text/frontmatter filters. */\nexport const WQL_TYPE_HEADS: Readonly<Record<string, string>> = {\n dashboard: 'dashboard',\n};\n\n/** Former generic `:note` default scope — now EMPTY: the generic note head\n * is the inclusive note plane (every row). Kept exported (empty) so the\n * serializer and host surfaces keep a single name for \"the default scope\",\n * which no longer narrows anything. */\nexport const WQL_NOTE_DEFAULT_SOURCES: readonly WqlSourceValue[] = [];\n\n/** Colon function heads — the unprefixed `:<fn>{metric:…}` aggregate stage. */\nexport const WQL_FUNCTION_HEADS = WQL_AGGREGATORS;\nexport type WqlFunctionHead = WqlAggregator;\n\n/** Colon chart heads — terminal pipeline sinks (`:timeseries`, `:bar`, …). */\nexport const WQL_CHART_HEADS = ['timeseries', 'bar', 'table', 'donut', 'toplist', 'value'] as const;\nexport type WqlChartHead = (typeof WQL_CHART_HEADS)[number];\n\n/** Standard datasets the host registers per page/run before children\n * evaluate (`@session` active session, `@today` civil-day telemetry+notes). */\nexport const WQL_STANDARD_DATASETS = ['@session', '@today'] as const;\nexport type WqlStandardDataset = (typeof WQL_STANDARD_DATASETS)[number];\n\n\n/** Result planes — `rows:<plane>` narrows raw output-statement rows by the\n * unified store's promoted `outputType` column. The STORE vocabulary is\n * open (core KNOWN_OUTPUT_TYPES, ticket 002: unknowns are stored and\n * returned); the QUERY surface is a closed enum at parse (prototype C7) —\n * reopening toward a registry is a later, separate decision. Custom types\n * stay addressable programmatically via hand-built ASTs. */\nexport const WQL_RESULT_PLANES = KNOWN_OUTPUT_TYPES;\nexport type WqlResultPlane = (typeof WQL_RESULT_PLANES)[number];\n\n/** Content-specific filter keys (beyond the analytics tag keys). */\nexport const WQL_CONTENT_FILTER_KEYS = ['type', 'text', 'has', 'source', 'catalog', ...WQL_TAG_KEYS] as const;\nexport type WqlContentFilterKey = (typeof WQL_CONTENT_FILTER_KEYS)[number];\n\n/**\n * Composer source planes (issue #838, decision #836): the single `source`\n * head slot that pivots the query kind. Content sources compile the `find:`\n * skeleton; `metrics` compiles the aggregate skeleton. `efforts` compiles\n * `find:effort` against the effort registry (origin/intensity/discipline\n * vocab from types.ts). The `results` plane is\n * deliberately absent — it needs new grammar/engine semantics and is\n * deferred to its own ticket.\n */\nexport const WQL_SOURCES = ['note', 'block', 'effort', 'session', 'segment', 'event'] as const;\nexport type WqlSource = (typeof WQL_SOURCES)[number];\n\n/** Rollup periods the aggregate grammar accepts (wql.ts: N > 1, unit d|w). */\nexport const WQL_ROLLUP_PERIODS = ['2w', '4w'] as const;\nexport type WqlRollupPeriod = (typeof WQL_ROLLUP_PERIODS)[number];\n\n/** Display units the app can render (analytics unit preference, kg/lb). The\n * `in <unit>` directive accepts any word; these are the canonical options. */\nexport const WQL_DISPLAY_UNITS = ['kg', 'lb'] as const;\nexport type WqlDisplayUnit = (typeof WQL_DISPLAY_UNITS)[number];\n\n/** All WQL keywords */\nexport const WQL_KEYWORDS = [\n 'find',\n 'rows',\n 'where',\n 'group',\n 'by',\n 'order',\n 'limit',\n 'sum',\n 'avg',\n 'min',\n 'max',\n 'count',\n 'last',\n 'delta',\n] as const;\nexport type WqlKeyword = (typeof WQL_KEYWORDS)[number];\n","import {\n WQL_CALC_TARGETS,\n WQL_CONTENT_ONLY_KEYS,\n WQL_EFFORT_FILTER_KEYS,\n WQL_METRIC_AGGREGATES,\n WQL_METRIC_FAMILIES,\n WQL_TAG_KEYS,\n WQL_TYPED_TAG_KEYS,\n} from './vocabulary';\n\n/**\n * Grouping dimensions the content consumer (stream entryGrouping) applies on\n * top of find results: the note/block/effort/session executors return flat\n * results and the view groups them, ordered and multi-dim. The find tables\n * (segment/event) group inside the executor over selected columns instead.\n */\nexport const CONTENT_GROUPING_DIMENSIONS = ['date', 'day', 'week', 'month', 'year', 'discipline', 'origin', 'source', 'kind', 'type', 'tag'] as const;\n\n/** Clause types that never name a data field. `metric` is NOT structural:\n * as a filter key it selects fact rows by their metric (metric:reps); the\n * guided `metric` clause meaning \"measure\" is an aggregate-head concern. */\nconst STRUCTURAL_TYPES: Record<string, true> = { time: true, groupby: true, rollup: true, unit: true, where: true, agg: true };\nconst FACT_KEYS = WQL_TAG_KEYS.filter(key => key !== 'metric');\n/** Table facts filter by real row keys. `tags` is excluded: the table\n * executor resolves note tags against an empty map, so a tags: filter would\n * silently match nothing. */\nconst TABLE_KEYS = WQL_TAG_KEYS.filter(key => key !== 'tags');\nconst AGGREGATE_TYPES: ReadonlySet<string> = new Set([\n ...FACT_KEYS.map(key => key === 'tags' ? 'tag' : key),\n 'time', 'groupby', 'rollup', 'unit', 'where', 'agg', 'metric',\n]);\nconst TARGET_TYPES: Readonly<Record<string, ReadonlySet<string>>> = {\n note: new Set(['text', 'catalog', 'notebook', 'tag', 'effort', ...WQL_TYPED_TAG_KEYS, 'type', 'page', 'source', 'note', 'time', 'groupby', 'where']),\n block: new Set(['text', 'catalog', 'notebook', 'tag', 'effort', 'type', 'source', 'note', 'time', 'groupby', 'where']),\n effort: new Set([...WQL_EFFORT_FILTER_KEYS, 'groupby']),\n session: new Set(['result', 'block', 'note', 'plane', 'time', 'groupby']),\n segment: new Set([...TABLE_KEYS, 'time', 'groupby', 'unit']),\n event: new Set([...TABLE_KEYS, 'time', 'groupby', 'unit']),\n};\n/** Empty fallback keeps the exported ReadonlySet contract for unknown targets. */\nconst EMPTY_TYPES: ReadonlySet<string> = new Set();\n/** Executor-exact aggregate filter keys. `metric` here is the fact-row\n * metric filter (`agg:sum{metric:reps}` selects those rows) — the guided\n * `metric` clause is the measure head, a different slot. `tags` is the AST\n * key of the canonical `tag` clause. */\nconst AGGREGATE_KEYS: readonly string[] = WQL_TAG_KEYS;\nconst TARGET_KEYS: Readonly<Record<string, readonly string[]>> = Object.fromEntries(\n Object.entries(TARGET_TYPES).map(([target, types]) => [\n target,\n [...types].filter(type => !STRUCTURAL_TYPES[type]).map(type => type === 'tag' ? 'tags' : type),\n ]),\n);\n/** `round` resolves through custom fact dimensions; absent rows group under\n * the UNASSIGNED sentinel, matching the open dimension policy. */\nconst AGGREGATE_DIMENSIONS = ['day', 'week', 'session', 'round', ...WQL_TAG_KEYS];\nconst TABLE_DIMENSIONS = ['date', 'effort', 'discipline', ...WQL_METRIC_FAMILIES, ...WQL_METRIC_AGGREGATES, ...WQL_CALC_TARGETS];\n\n/** Guided clause types, including structural clauses honored by their consumers. */\nexport function allowedFilterTypesForTarget(target: string, family: 'find' | 'aggregate'): ReadonlySet<string> {\n return family === 'aggregate' ? AGGREGATE_TYPES : TARGET_TYPES[target] ?? EMPTY_TYPES;\n}\n\n/** Suggested filter keys. Fact-backed queries also accept custom dimension keys. */\nexport function wqlFilterKeys(target: string, family: 'find' | 'aggregate'): readonly string[] {\n return family === 'aggregate' ? AGGREGATE_KEYS : TARGET_KEYS[target] ?? [];\n}\n\n/** Content grouping is applied by the stream consumer; table grouping reads\n * selected columns. Effort/session have no executor grouping but their views\n * group content (the effort view profile groups by discipline). */\nexport function wqlGroupingDimensions(target: string, family: 'find' | 'aggregate'): readonly string[] {\n if (family === 'aggregate') return AGGREGATE_DIMENSIONS;\n if (target === 'segment' || target === 'event') return TABLE_DIMENSIONS;\n return CONTENT_GROUPING_DIMENSIONS;\n}\n\n/** Fact dimensions are open, but content-only fields and plane have no fact meaning. */\nexport function supportsWqlFilterKey(target: string, family: 'find' | 'aggregate', rawKey: string): boolean {\n const key = rawKey === 'tag' ? 'tags' : rawKey;\n if (family === 'aggregate' || target === 'segment' || target === 'event') {\n return !(WQL_CONTENT_ONLY_KEYS as readonly string[]).includes(key)\n && key !== 'plane'\n && !(family === 'find' && key === 'tags');\n }\n return wqlFilterKeys(target, family).includes(key);\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"+^OVQPOOOOQO'#Cb'#CbObQPO'#C`OgQPO'#C`OlQPO'#ClOqQQO'#C_OOQO'#C_'#C_O!SQQO'#CnQOQPOOOOQO,58z,58zO!bQPO,58zOOQO,59W,59WO!gQPO'#CdOOQO,58y,58yOVQPO,58xO!rQPO'#CoO!wQPO'#CrOOQO,59Y,59YO!|QPO,59YO#UQQO'#CcOOQO1G.f1G.fOOQO'#Cg'#CgO#jQPO'#CeO#oQPO'#CeOOQO,59O,59OO#tQPO,59OO#|QPO'#C_O$XQPO1G.dO$aQPO,59ZO$iQQO,59^OOQO1G.t1G.tO$nQPO'#CuO$sQQO,58}O%XQPO,59PO%aQPO,59PO%fQPO'#CxO%nQPO1G.jOOQO1G.j1G.jOVQPO'#CyO%vQPO7+$OOOQO'#Cq'#CqOOQO1G.u1G.uO&OQPO1G.uO&WQPO1G.xOOQO,59a,59aOOQO-E6s-E6sO&]QPO'#CiO&qQPO'#CiO'PQPO'#ChOOQO1G.k1G.kO%XQPO1G.kOOQO,59d,59dOOQO-E6v-E6vOOQO7+$U7+$UO'[QPO'#CcOOQO,59e,59eOOQO-E6w-E6wO'jQPO'#CzO'oQPO7+$aOOQO7+$a7+$aO'wQPO7+$dO'|QPO'#CvO(RQPO,59TOOQO,59T,59TO%XQPO'#CwO(gQPO,59SOOQO7+$V7+$VO(rQPO,58}OOQO,59f,59fOOQO-E6x-E6xOOQO<<G{<<G{OOQO<<HO<<HOOOQO,59b,59bOOQO-E6t-E6tOOQO1G.o1G.oOOQO,59c,59cOOQO-E6u-E6uO)QQPO,58zO)VQPO'#C`\",\n stateData: \")[~OqOS~OTPOaSOrQO~OTXO~OrYO~OTZO~Ot[OdRXgRXoRXuRX~Od_Og`Ou^OobX~OTcO~OTeOYgOwhO~OtlO~OxmO~Og`Ooba~OsoOdVXgVXoVXtVXuVX~OrqO~OTeO~OvsOwuO~Ot[OoRXuRX~OuvOoQi~OTxOwyO~Oh{O~OT|O~OsoOdVagVaoVatVauVa~OT!OO_!PO~Or!SO~OTeOYgO~OvsOw!VO~OuvOoQq~Ov!ZOw!]O~OT!^O~O^!aOr!_Os!_Ou]Xv]Xw]X~O^!aOu]Xv]Xw]X~Ou!bOv[Xw[X~OsoOoVXtVXuVX~OTxO~Ov!ZOw!hO~Oy!iO~OT!jO~O^!lOr!_Os!_Ou]av]aw]a~Ou!bOv[aw[a~OsoOoVatVauVa~OT!WO~Or!oO~O\",\n goto: \"$^oPPps|P!T![!`!dP!j!q!wPP#OPp#TP#W#^PP#d#n#t#z$Q$WRWOQVOQk^R!XvQTOTj^vQROT!p^vTdY!oT]TjQi[R!TsSf[sRrgQ!RqR!d!SS!Qq!SR!m!bVUO^vRbVQzlR!f!ZQaVRnbQpcS}p!eR!e!WQ!`!OR!k!`Q!c!QR!n!cQtiR!UtQwkR!YwQ![zR!g![\",\n nodeNames: \"⚠ Query Pipeline Stage Head Word Aggregator Metric Filters Filter Negate TagKey TagValue Value Star Quoted DatasetReference At Single GroupBy By Dimension Rollup RollupDot Int\",\n maxTerm: 41,\n skippedNodes: [0],\n repeatNodeCount: 6,\n tokenData: \"'i~RgXY!jYZ!j]^!jpq!jqr!{rs#Qxy#oyz#tz{#y|}$O}!O$T!O!P$i!Q![%f![!]%|!b!c&R!c!}$T#R#S$T#T#U$T#U#V&W#V#o$T#o#p'Y#p#q'_#q#r'd~!oSq~XY!jYZ!j]^!jpq!j~#QOY~~#TTOr#Qrs#ds;'S#Q;'S;=`#i<%lO#Q~#iO_~~#lP;=`<%l#Q~#tOx~~#yOy~~$OO^~~$TOv~P$YTTP}!O$T!Q![$T!c!}$T#R#S$T#T#o$T~$nPs~#f#g$q~$tP#c#d$w~$zP#`#a$}~%QP#`#a%T~%WP#i#j%Z~%^P#d#e%a~%fOg~R%mThQTP}!O$T!Q![%f!c!}$T#R#S$T#T#o$T~&ROr~~&WOa~R&]VTP}!O$T!Q![$T!c!}$T#R#S$T#T#m$T#m#n&r#n#o$TR&yTdQTP}!O$T!Q![$T!c!}$T#R#S$T#T#o$T~'_Ot~~'dOu~~'iOw~\",\n tokenizers: [0, 1],\n topRules: {\"Query\":[0,1]},\n tokenPrec: 0\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Query = 1,\n Pipeline = 2,\n Stage = 3,\n Head = 4,\n Word = 5,\n Aggregator = 6,\n Metric = 7,\n Filters = 8,\n Filter = 9,\n Negate = 10,\n TagKey = 11,\n TagValue = 12,\n Value = 13,\n Star = 14,\n Quoted = 15,\n DatasetReference = 16,\n At = 17,\n Single = 18,\n GroupBy = 19,\n By = 20,\n Dimension = 21,\n Rollup = 22,\n RollupDot = 23,\n Int = 24\n","/**\n * WqlSuffix — Unified WQL suffix parser and adapter (issue #870).\n *\n * Encapsulates suffix parsing order, regexes, depth-0 brace-aware splitting,\n * and AST extraction for all WQL suffix clauses:\n * - Outer join: `where <joinClause>`\n * - Display unit: `in <unit>` (analytics queries only — C2 de-overloaded `in`)\n * - Rollup period: `.rollup(<size><unit>)`\n * - Group-by: `by {<dims>}`\n * - Time window: `last <n><unit>` or `from <YYYY-MM-DD> [to <YYYY-MM-DD>]`\n * (C1 — one window per query, every family)\n */\n\nexport interface ParsedWqlRollupSuffix {\n size: number;\n unit: string;\n raw: string;\n}\n\n/** A window clause (C1): relative (`last 8w`) or civil-date range\n * (`from 2026-01-01 [to 2026-03-31]`). One window per query — `last` and\n * `from` are mutually exclusive (validated as a C3-style conflict). */\nexport type ParsedWqlWindowSuffix =\n | { kind: 'relative'; size: number; unit: 'd' | 'w'; raw: string }\n | { kind: 'range'; start: string; end?: string; raw: string };\n\nexport interface ParsedWqlSuffixes {\n /** Outer cross-store join clause text (`where ...`). */\n where?: string;\n /** Stored source binding target (`=> @sourceName`). */\n storedAs?: string;\n /** Source dataset reference for downstream query (`@source | ...` or `in @source`). */\n sourceRef?: string;\n /** Display unit directive (`in kg`). */\n displayUnit?: string;\n /** Rollup period (`.rollup(2w)` — 1-unit forms are rejected in parseQuery). */\n rollup?: ParsedWqlRollupSuffix;\n /** Group-by dimensions (`by {week, effort}`). */\n groupBy?: string[];\n /** Time window — relative or civil-date range, legal on every family (C1). */\n window?: ParsedWqlWindowSuffix;\n /** Legacy scope clause (`in journal` / `in all`) stripped for the C2 compatibility normalizer. */\n legacyScope?: string;\n /** Duplicate-clause diagnostics (C3) — each names both conflicting spans. */\n conflicts?: string[];\n /** Primary query text with suffixes removed. */\n primaryText: string;\n}\n\n/**\n * Split a query at the first top-level `where` keyword (depth-0, word-bounded).\n * Returns the primary half and, when present, the join clause text.\n */\nexport function splitAtWhere(text: string): { primary: string; where?: string } {\n let depth = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (c === '{') depth++;\n else if (c === '}') depth = Math.max(0, depth - 1);\n else if (\n depth === 0 &&\n c === 'w' &&\n text.slice(i, i + 5) === 'where' &&\n (i === 0 || /\\s/.test(text[i - 1])) &&\n (i + 5 >= text.length || /\\s/.test(text[i + 5]))\n ) {\n return { primary: text.slice(0, i).trim(), where: text.slice(i + 5).trim() };\n }\n }\n return { primary: text.trim() };\n}\n\n// ponytail: regex suffix/prefix peel for => @source and @source | ...; upgrade to Lezer AST node when source pipelines support sub-expression branches.\nconst STORED_AS_RE = /\\s*=>\\s*@?([a-zA-Z0-9_-]+)\\s*$/;\nconst SOURCE_PREFIX_RE = /^@([a-zA-Z0-9_-]+)\\s*(?:\\||=>)\\s*/;\nconst IN_SOURCE_RE = /\\s+(?:in|from)\\s+@([a-zA-Z0-9_-]+)\\s*$/i;\nconst DISPLAY_UNIT_RE = /\\s+in\\s+([a-zA-Z0-9_-]+)\\s*$/;\nconst ROLLUP_RE = /\\.rollup\\((\\d+)?([a-zA-Z]*)\\)\\s*$/;\nconst BY_RE = /\\s+by\\s+\\{([^}]*)\\}\\s*$/;\nconst LAST_RE = /\\s+last\\s+(\\d+)([dw])\\s*$/i;\nconst FROM_TO_RE = /\\s+from\\s+(\\d{4}-\\d{2}-\\d{2})(?:\\s+to\\s+(\\d{4}-\\d{2}-\\d{2}))?\\s*$/i;\n/**\n * Extract suffixes from a raw WQL query string.\n * Strips outer join (`where`), display unit (`in kg`), rollup (`.rollup(Nw)`),\n * group-by (`by {week}`), time window (`last 8w` / `from … [to …]`), and\n * legacy scope (`in journal`).\n */\nexport function parseWqlSuffixes(raw: string): ParsedWqlSuffixes {\n const { primary, where } = splitAtWhere(raw);\n let text = primary.trim();\n\n let storedAs: string | undefined;\n let sourceRef: string | undefined;\n let displayUnit: string | undefined;\n let rollup: ParsedWqlRollupSuffix | undefined;\n let groupBy: string[] | undefined;\n let window: ParsedWqlWindowSuffix | undefined;\n let legacyScope: string | undefined;\n const conflicts: string[] = [];\n\n // Prefix pipeline source binding: `@olyLifts | ...` or `@olyLifts => ...`\n const prefixMatch = text.match(SOURCE_PREFIX_RE);\n if (prefixMatch) {\n sourceRef = '@' + prefixMatch[1];\n text = text.slice(prefixMatch[0].length).trim();\n }\n const isFind = text.startsWith('find:');\n const isRows = /^rows(?=[:{]|\\s|$)/.test(text);\n\n // C3: a suffix kind may appear once. Each peel site strips its kind until\n // exhausted (right-to-left); more than one occurrence becomes a conflict\n // naming the first and last occurrences instead of silent rightmost-wins.\n // A duplicate hidden behind a different leftover kind still fails through\n // the normal cannot-parse path — single-occurrence parsing is unchanged.\n const stripRepeated = (re: RegExp): RegExpExecArray[] => {\n const matches: RegExpExecArray[] = [];\n for (let m = re.exec(text); m; m = re.exec(text)) {\n matches.unshift(m);\n text = text.slice(0, m.index).trim();\n }\n return matches;\n };\n const conflictFrom = (label: string, ms: RegExpExecArray[]) => {\n // Lockstep across six call sites: one conflict line naming both spans.\n if (ms.length > 1) {\n conflicts.push(\n `Duplicate '${label}' clause: '${ms[0][0].trim()}' conflicts with '${ms[ms.length - 1][0].trim()}'`,\n );\n }\n };\n\n // Suffix stored-source binding: `... => @olyLifts`\n const storeMatches = stripRepeated(STORED_AS_RE);\n conflictFrom('=>', storeMatches);\n if (storeMatches.length) {\n storedAs = '@' + storeMatches[storeMatches.length - 1][1];\n }\n\n // Window (C1) — one clause per query, every family. `from/to` strips\n // first (it is the rightmost window form when both appear), then `last`;\n // any second occurrence — same kind or cross-kind — is a C3 conflict.\n const froms = stripRepeated(FROM_TO_RE);\n const lasts = stripRepeated(LAST_RE);\n {\n const windows = [\n ...froms.map((m) => ({\n kind: 'range' as const,\n start: m[1],\n end: m[2],\n raw: m[0].trim(),\n at: m.index,\n })),\n ...lasts.map((m) => ({\n kind: 'relative' as const,\n size: parseInt(m[1], 10),\n unit: m[2].toLowerCase() as 'd' | 'w',\n raw: m[0].trim(),\n at: m.index,\n })),\n ].sort((a, b) => a.at - b.at);\n if (windows.length > 1) {\n conflicts.push(\n `Duplicate 'window' clause: '${windows[0].raw}' conflicts with '${windows[windows.length - 1].raw}'`,\n );\n }\n if (windows.length === 1) {\n const w = windows[0];\n window = w.kind === 'range' ? { kind: 'range', start: w.start, end: w.end, raw: w.raw } : { kind: 'relative', size: w.size, unit: w.unit, raw: w.raw };\n }\n }\n\n // Uniform suffix peeling: display-unit / legacy scope, rollup, and by {...}\n const units = stripRepeated(DISPLAY_UNIT_RE);\n conflictFrom(isFind || isRows ? 'scope' : 'display-unit', units);\n if (units.length) {\n const val = units[units.length - 1][1];\n if (val === 'kg' || val === 'lb') {\n displayUnit = val;\n } else if (isFind || isRows) {\n legacyScope = val;\n } else {\n displayUnit = val;\n }\n }\n\n const rollups = stripRepeated(ROLLUP_RE);\n conflictFrom('.rollup', rollups);\n if (rollups.length) {\n const m = rollups[rollups.length - 1];\n rollup = { size: m[1] ? parseInt(m[1], 10) : 1, unit: m[2] || '', raw: m[1] + m[2] };\n }\n\n const bys = stripRepeated(BY_RE);\n conflictFrom('by', bys);\n if (bys.length) {\n groupBy = bys[bys.length - 1][1]\n .split(',')\n .map((d) => d.trim().toLowerCase())\n .filter(Boolean);\n }\n const inSourceMatches = stripRepeated(IN_SOURCE_RE);\n if (inSourceMatches.length) {\n sourceRef = '@' + inSourceMatches[inSourceMatches.length - 1][1];\n }\n\n return {\n where,\n storedAs,\n sourceRef,\n displayUnit,\n rollup,\n groupBy,\n window,\n legacyScope,\n conflicts: conflicts.length ? conflicts : undefined,\n primaryText: normalizeCommaFilterValues(text),\n };\n}\n\n/** `key:v1,v2` → `key:v1|v2` — the annotation's comma multi-value spelling,\n * rewritten inside the structural filter braces before the grammar parse\n * (the grammar's comma separates filters). A comma merges into the running\n * filter only while the following segment is a bare value — no colon, no\n * quote — so `text:a,feed:x` stays two filters while\n * `source:journal,feeds` becomes one OR. `by {…}` groups are already\n * peeled; quoted segments never merge. */\nfunction normalizeCommaFilterValues(text: string): string {\n const open = text.indexOf('{');\n const close = open === -1 ? -1 : text.lastIndexOf('}');\n if (open === -1 || close <= open) return text;\n const inside = text.slice(open + 1, close);\n if (!inside.includes(',')) return text;\n const parts: string[] = [];\n let current = '';\n let quoted = false;\n for (const ch of inside) {\n if (ch === '\"') quoted = !quoted;\n if (ch === ',' && !quoted) {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n parts.push(current);\n const merged: string[] = [];\n for (let i = 0; i < parts.length; i++) {\n let part = parts[i]!;\n while (i + 1 < parts.length) {\n const next = parts[i + 1]!.trim();\n if (next && !next.includes(':') && !next.includes('\"')) {\n part = `${part}|${next}`;\n i++;\n } else break;\n }\n merged.push(part);\n }\n return `${text.slice(0, open + 1)}${merged.join(',')}${text.slice(close)}`;\n}\n","/**\n * WQL — Wod Query Language (Datadog-flavored). See CONTEXT.md glossary.\n *\n * <aggregator>:<metric.namespace>{<tag filters>} by {<dimensions>} .rollup(<period>)\n *\n * sum:totalVolume{discipline:strength} by {week}\n * avg:tis{effort:thruster,!discipline:recovery} by {session}\n *\n * This module holds the AST contract the Query Service executes and the\n * Lezer-backed `parseQuery` front-end over grammar/wql.grammar (house\n * pattern). The grammar accepts the full WQL surface with error recovery;\n * this mapper validates the recovered tree and produces the AST below.\n */\n\nimport { parser as wqlParser } from './grammar/wql.parser';\nimport type { SyntaxNode } from '@lezer/common';\nimport * as terms from './grammar/wql.parser.terms';\nimport {\n WQL_AGGREGATORS,\n WQL_CHART_HEADS,\n WQL_CONTENT_ONLY_KEYS,\n WQL_EFFORT_FILTER_KEYS,\n WQL_FIND_TARGETS,\n WQL_FUNCTION_HEADS,\n WQL_SOURCE_HEADS,\n WQL_SOURCE_HEAD_SCOPES,\n WQL_SOURCE_VALUES,\n WQL_TYPE_HEADS,\n type WqlAggregator,\n type WqlChartHead,\n WQL_TAG_KEYS,\n type WqlComparisonOp,\n} from './vocabulary';\nimport { parseWqlSuffixes, splitAtWhere, type ParsedWqlWindowSuffix } from './wqlSuffix';\nimport { allowedFilterTypesForTarget, supportsWqlFilterKey, wqlFilterKeys, wqlGroupingDimensions } from './capabilities';\n\nexport { WQL_AGGREGATORS, WQL_COMPARISON_OPS, WQL_SOURCE_VALUES } from './vocabulary';\nexport { parseWqlSuffixes, splitAtWhere } from './wqlSuffix';\n\nexport type Aggregator = WqlAggregator;\n\nexport interface TagValue {\n value: string;\n wildcard: boolean;\n}\n\nexport interface TagFilter {\n key: string;\n negate: boolean;\n values: TagValue[];\n}\n\n/** Comparison operator in a cross-store metric predicate (`> 5000`). */\nexport type ComparisonOp = WqlComparisonOp;\n\n/**\n * Analytics half of a cross-store join — the metric predicate attached to a\n * find query via `where`. Example: `sum:totalVolume{discipline:strength} > 5000`.\n * Aggregates are evaluated against RAW WorkoutResult logs (not derived facts),\n * joined at the blockContentId level (\"logs win\", issue #800).\n */\nexport interface MetricPredicate {\n agg: Aggregator;\n metric: string;\n filters: TagFilter[];\n operator: ComparisonOp;\n threshold: number;\n}\n\n/**\n * Content half of a cross-store join — the find predicate attached to an\n * analytics query via `where`. Example: `find:note{tags:competition,source:journal}`.\n * Restricts the metric computation to the blockContentIds owned by matching\n * content; the metric is recomputed from raw logs for those blocks only.\n */\nexport interface FindPredicate {\n target: string;\n filters: TagFilter[];\n last?: { size: number; unit: 'd' | 'w' };\n}\n\n/**\n * Result of parsing an analytics (aggregate) query — `agg:metric{filters} …`.\n * Discriminated union member: `family === 'aggregate'` (C5).\n */\nexport interface ParsedAggregateQuery {\n family: 'aggregate';\n raw: string;\n agg: Aggregator;\n /** Canonical Metric Key (fact row `metricKey`). */\n metric: string;\n filters: TagFilter[];\n /** Tag keys, or virtual dims: day | week | session | round. */\n groupBy: string[];\n rollup?: { size: number; unit: 'd' | 'w' };\n /** Time-selection window (C1): `last 6w` or `from … [to …]`. */\n window?: QueryWindow;\n /** Optional display unit directive — `in kg` / `in lb`. */\n displayUnit?: string;\n /** Cross-store content join (`where find:note{...}`); restricts to raw logs. */\n join?: FindPredicate;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/** Parse `| select col [in unit], … | order by col [asc|desc] | limit n [offset m]`. */\nfunction parseRowsPipes(text: string): RowsPipes {\n const pipes: RowsPipes = {};\n const segments = text.split('|').map((s) => s.trim()).filter(Boolean);\n for (const segment of segments) {\n const lower = segment.toLowerCase();\n if (lower.startsWith('select')) {\n const body = segment.slice(6).trim();\n pipes.select = body.split(',').map((col) => {\n const m = /^([\\w-]+)(?:\\s+in\\s+([\\w/%]+))?$/i.exec(col.trim());\n return m\n ? { col: m[1]!, ...(m[2] ? { unit: m[2] } : {}) }\n : { col: col.trim() };\n });\n } else if (lower.startsWith('order by')) {\n const body = segment.slice(8).trim();\n pipes.order = body.split(',').map((col) => {\n const m = /^(\\S+)(?:\\s+(asc|desc))?$/i.exec(col.trim());\n return { col: m?.[1] ?? col.trim(), dir: (m?.[2]?.toLowerCase() as 'asc' | 'desc') ?? 'asc' };\n });\n } else if (lower.startsWith('limit')) {\n const m = /^limit\\s+(\\d+)(?:\\s+offset\\s+(\\d+))?$/i.exec(segment);\n if (!m) {\n pipes.error = `Cannot parse pipe \"${segment}\". Expected limit <n> [offset <m>]`;\n return pipes;\n }\n pipes.limit = Number(m[1]);\n if (m[2]) pipes.offset = Number(m[2]);\n } else if (lower.startsWith('offset')) {\n const m = /^offset\\s+(\\d+)$/i.exec(segment);\n if (!m) {\n pipes.error = `Cannot parse pipe \"${segment}\". Expected offset <n>`;\n return pipes;\n }\n pipes.offset = Number(m[1]);\n } else {\n pipes.error = `Unknown pipe \"${segment}\". Try: select, order by, limit`;\n return pipes;\n }\n }\n return pipes;\n}\n\n/**\n * Ticket 18 — drill-down: construct a cross-workout `rows:segment` query\n * inheriting an aggregate point's tag/metadata filters, the clicked bucket's\n * EXACT half-open civil boundaries (structural, not display timestamps), and\n * the clicked group tuple as exact filters.\n */\nexport function buildDrillDownQuery(options: {\n filters?: Array<{ key: string; values: readonly string[] }>;\n /** Half-open bucket bounds (ms epoch) from the clicked point's bucket. */\n start?: number;\n end?: number;\n /** Civil dates (YYYY-MM-DD) — used when the point is a calendar bucket. */\n startIso?: string;\n endIso?: string;\n timeZone?: string;\n limit?: number;\n}): string {\n const parts: string[] = [];\n const filterText = (options.filters ?? [])\n .map((f) => `${f.key}:${f.values.join('|')}`)\n .join(',');\n parts.push(`:segment{${filterText}}`);\n if (options.startIso && options.endIso) parts.push(`from ${options.startIso} to ${options.endIso}`);\n else if (options.start !== undefined && options.end !== undefined && options.timeZone) {\n const fmt = (ts: number, tz: string) => new Intl.DateTimeFormat('en-CA', { timeZone: tz, year: 'numeric', month: '2-digit', day: '2-digit' }).format(ts);\n parts.push(`from ${fmt(options.start, options.timeZone)} to ${fmt(options.end - 1, options.timeZone)}`);\n }\n let query = parts.join(' ');\n if (options.limit !== undefined) query += ` | limit ${options.limit}`;\n return query;\n}\n\n/** Result of parsing a content-discovery query — the colon source heads\n * (`:note{…}`, `:journal{…}`); the legacy `find:` spelling is retired and\n * survives only inside `where` join halves. */\nexport interface ParsedFindQuery {\n family: 'find';\n raw: string;\n /** Content target — a WQL_FIND_TARGETS value (C7 closed enum). */\n target: string;\n filters: TagFilter[];\n /** Implicit default source scope for the generic `:note` head —\n * journal | feeds | playground. NOT a filter: authored filters stay\n * untouched (composer pills never see it); the executor ANDs it in only\n * when no explicit `source:` filter was written. */\n sourceScope?: string[];\n /** Time-selection window (C1): `last 8w` or `from … [to …]`. */\n window?: QueryWindow;\n /** Cross-store metric join (`where sum:totalVolume{} > 5000`). */\n join?: MetricPredicate;\n /** Presentation pipes (`| select … | order by … | limit …`). */\n pipes?: RowsPipes;\n /** Group-by dimensions (`by {effort}`). */\n groupBy?: string[];\n /** Optional display unit directive (`in kg` / `in lb`). */\n displayUnit?: string;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/**\n * Time-selection window (C1) — legal on every query family. `last <n><d|w>`\n * is relative; `from <YYYY-MM-DD> [to <YYYY-MM-DD>]` is a civil-date range\n * (local-midnight semantics, inclusive end day). One window per query;\n * `last` and `from` are mutually exclusive (C3-style conflict).\n */\nexport type QueryWindow =\n | { kind: 'relative'; size: number; unit: 'd' | 'w' }\n | { kind: 'range'; start: string; end?: string };\n\nexport type AnyParsedQuery = ParsedAggregateQuery | ParsedFindQuery | ParsedPipelineQuery;\n\n/** Type guard: true for content-discovery queries. */\nexport function isFindQuery(parsed: AnyParsedQuery): parsed is ParsedFindQuery {\n return parsed.family === 'find';\n}\n\n/** Type guard: true for analytics (aggregate) queries. */\nexport function isAggregateQuery(parsed: AnyParsedQuery): parsed is ParsedAggregateQuery {\n return parsed.family === 'aggregate';\n}\n\n/** Type guard: true for left-to-right value pipelines (`:src | :fn | :chart`). */\nexport function isPipelineQuery(parsed: AnyParsedQuery): parsed is ParsedPipelineQuery {\n return parsed.family === 'pipeline';\n}\n\n/** A pipeline's input: a full single query, or a named dataset\n * (`@session` / `@today` / a host-registered page source — name keeps `@`). */\nexport type PipelineSource =\n | { kind: 'query'; query: ParsedFindQuery | ParsedAggregateQuery }\n | { kind: 'dataset'; name: string };\n\n/** Terminal chart stage of a pipeline: the chart head plus its authored\n * parameter filters (`:bar{type:session}` → `{head:'bar', filters:[…]}`). */\nexport interface PipelineSink {\n head: WqlChartHead;\n filters: TagFilter[];\n}\n\n/**\n * Left-to-right value pipeline (`:journal{…} last 8w | :sum{metric:tis} | :timeseries{}`).\n * Transforms apply in order to the previous stage's output — the executor\n * reduces in memory, it never rescans stores. A dataset alone (`@today`) is\n * a pipeline with no transforms; a lone chart head starts from an implicit\n * `:segment` source.\n */\nexport interface ParsedPipelineQuery {\n family: 'pipeline';\n raw: string;\n source: PipelineSource;\n /** Ordered aggregate stages, each applied to the previous stage's rows. */\n transforms: ParsedAggregateQuery[];\n sink?: PipelineSink;\n /** Parse-time disclosures (ignored chart suffixes, …). */\n advisories?: string[];\n error?: string;\n}\n\nexport interface SeriesPoint {\n ts: number;\n value: number;\n /** True for a structurally present bucket with no recorded observations\n * (ticket 12 calendar domain generation) — display zero-fill, never an\n * observation. */\n missing?: boolean;\n}\n\n/**\n * Result of parsing a rows query (`rows:{filters}` / `rows:segment{filters}`) —\n * the third WQL family (ADR docs/adr/rows-query-plane.md, #949): raw\n * output-statement rows re-derived from WorkoutResult logs, scoped by\n * `result:` / `block:` / `note:`. Never aggregates — no by/rollup/where.\n */\n/** Ticket 18 — pipe clauses: presentation only, never alter the match. */\nexport interface RowsPipes {\n error?: string;\n select?: Array<{ col: string; unit?: string }>;\n order?: Array<{ col: string; dir: 'asc' | 'desc' }>;\n limit?: number;\n offset?: number;\n}\n\nexport interface ParsedRowsQuery {\n /** Ticket 18 — pipe clauses (| select / | order by / | limit). */\n pipes?: RowsPipes;\n raw: string;\n /** Family discriminator shared by all three query ASTs (C5). */\n family: 'rows';\n /** Output-statement type narrowing from the optional target (`rows:segment{…}`); undefined = all types. */\n outputType?: string;\n /** The rows target itself — 'all' | 'segment' | content plane (ticket 18:\n * segment without scope = cross-workout form). */\n target?: string;\n filters: TagFilter[];\n /** Time-selection window (C1): `last 4w` or `from … [to …]` over the\n * workout end time. */\n window?: QueryWindow;\n /** Deprecation advisories (C2 normalizer). */\n advisories?: string[];\n error?: string;\n}\n\n/** One aggregated series. `error` carries the diagnostic when this series'\n * calculation failed (ticket 13) — an errored series has no valid values. */\nexport interface Series { key: string; label: string; points: SeriesPoint[]; unit?: string; error?: string }\n/** Aggregate head vocabulary is owned by vocabulary.ts (#871). */\nconst AGGS: readonly Aggregator[] = WQL_AGGREGATORS;\n\nfunction cannotParse(text: string): string {\n return `Cannot parse \"${text}\". Expected agg:metric{filters} by {dims} .rollup(period)`;\n}\n// ── Cross-store `where` joins (#800) ───────────────────────────────\n//\n// `where` is the join glue between a content query and an analytics query.\n// Like `in <scope>` / `last <n>w` / `in <unit>`, it is stripped in JS rather\n// than lexed: a top-level WhereClause node ending in a free `Word` would\n// reintroduce the token-overlap conflict documented at the top of the\n// grammar. The split is brace-aware so a `where` inside `{filters}` (a tag\n// value such as `text:where`) is never mistaken for the join.\n\n/** Comparison predicate at the tail of a metric join: `<op> <number>`. */\nconst CMP_RE = /^(.+?)\\s*(>=|<=|!=|==|>|<)\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/;\n\nfunction cannotParseJoin(text: string): string {\n return `Cannot parse join \"${text}\". Expected :source{filters} or find:target{filters}, or agg:metric{filters} <op> <number>`;\n}\n\n/**\n * Parse the `where` clause of a cross-store join — the OTHER half of the\n * query. A find predicate on an analytics query (`where find:note{tags:x}`),\n * or a metric predicate on a find query (`where sum:totalVolume{} > 5000`).\n * Both halves reuse the same Lezer Head→Filters grammar; the join keyword is\n * JS-stripped, so no grammar change is required.\n */\nfunction parseJoinClause(where: string): { metric?: MetricPredicate; find?: FindPredicate; advisories?: string[]; error?: string } {\n const t = where.trimStart();\n const headName = /^:?([a-zA-Z0-9_-]+)/.exec(t)?.[1]?.toLowerCase() ?? '';\n // Content half: legacy `find:…` or a colon source head `:note{…}`.\n if (t.startsWith('find:') || (t.startsWith(':') && (WQL_SOURCE_HEADS as readonly string[]).includes(headName))) {\n const fp = parseFindQuery(where, { colon: t.startsWith(':') });\n if (fp.error) return { error: fp.error };\n if (fp.window?.kind === 'range') {\n return { error: 'Range windows are not supported on join halves — use last <n>d|w' };\n }\n return {\n find: { target: fp.target, filters: fp.filters, last: fp.window?.kind === 'relative' ? { size: fp.window.size, unit: fp.window.unit } : undefined },\n advisories: fp.advisories,\n };\n }\n const m = CMP_RE.exec(where.trim());\n if (!m) return { error: cannotParseJoin(where) };\n const head = parseAggregateQuery(m[1].trim(), { colon: m[1]!.trimStart().startsWith(':') });\n if (head.error) return { error: head.error };\n return {\n metric: {\n agg: head.agg,\n metric: head.metric,\n filters: head.filters,\n operator: m[2] as ComparisonOp,\n threshold: parseFloat(m[3]),\n },\n };\n}\n\n/**\n * Parse a WQL query string into one of the three query families —\n * analytics aggregate, content find, or rows — discriminated by `family`\n * (C5). Dispatch is textual: a leading `find:` routes to the content path,\n * `rows` to the rows path, everything else to analytics.\n */\nexport function rowsParseError(raw: string): string {\n const m = /^rows(?::(\\w+))?\\{([^}]*)\\}/.exec(raw);\n if (!m) {\n return 'The \"rows:\" query family is retired — use :session, :segment, or :event instead.';\n }\n const target = m[1] ?? 'all';\n const inner = m[2].trim();\n if (target === 'all' || ['note', 'block', 'effort', 'page'].includes(target)) {\n return `rows:${target}{…} is retired — use :session{${inner}} instead.`;\n }\n if (target === 'segment' && !inner.includes('result:') && !inner.includes('block:') && !inner.includes('note:')) {\n return `rows:segment{…} is retired — use :segment{${inner}} instead.`;\n }\n if (target === 'event') {\n return `rows:event{…} is retired — use :event{${inner}} instead.`;\n }\n const planePart = inner ? `${inner}, plane:${target}` : `plane:${target}`;\n return `rows:${target}{…} is retired — use :session{${planePart}} instead.`;\n}\n\n// ── Colon heads & pipelines ─────────────────────────────────────────\n\n/** True when a pipe segment is a rows presentation clause, not a stage. */\nconst ROW_PIPE_RE = /^\\s*(?:select|order\\s+by|limit|offset)\\b/i;\n\n/** Split at top-level `|` — brace- AND quote-aware, so OR alternatives and\n * quoted phrases inside filters never become stage separators. */\nfunction splitTopPipes(raw: string): string[] {\n const segments: string[] = [];\n let depth = 0;\n let quoted = false;\n let start = 0;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === '|' && depth === 0) { segments.push(raw.slice(start, i)); start = i + 1; }\n }\n segments.push(raw.slice(start));\n return segments;\n}\n\n/** The leading colon/dataset head of a segment: `:name` or `@name`. */\nfunction leadingHeadName(segment: string): { name: string; dataset: boolean } | undefined {\n const m = /^\\s*([:@])([a-zA-Z0-9_-]+)/.exec(segment);\n return m ? { name: m[2]!.toLowerCase(), dataset: m[1] === '@' } : undefined;\n}\n\nfunction cannotParsePipeline(text: string): string {\n return `Cannot parse pipeline \"${text}\". Expected :source{filters} | :function{metric:key} | :chart{params} or @dataset | :function{…}`;\n}\n\n/** Retired `find:` primary — the family stays for narrowing; the message names the colon spelling. */\nfunction retiredFindQuery(raw: string): ParsedFindQuery {\n const head = /^find:([a-zA-Z0-9_-]*)/.exec(raw.trim())?.[1] ?? '';\n return {\n family: 'find',\n raw,\n target: '',\n filters: [],\n error: `The \"find:\" query family is retired — use the :${head || 'note'}{…} colon head instead.`,\n };\n}\n\n/** Single-stage query: legacy `agg:metric` head or a colon source/function head. */\nfunction parseSingleQuery(raw: string): AnyParsedQuery {\n const norm = normalizeWql(raw);\n const head = leadingHeadName(norm.query);\n let result: AnyParsedQuery;\n if (head && !head.dataset) {\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(head.name)) {\n result = parseAggregateQuery(norm.query, { colon: true });\n } else if ((WQL_SOURCE_HEADS as readonly string[]).includes(head.name)) {\n result = parseFindQuery(norm.query, { colon: true });\n } else {\n // Unknown colon word — let the source-head parser name it through\n // the closed target enum (Unknown find target \"…\").\n result = parseFindQuery(norm.query, { colon: true });\n }\n } else {\n result = parseAggregateQuery(norm.query, { colon: false });\n }\n if (norm.advisories.length) {\n result.advisories = [...new Set([...(result.advisories ?? []), ...norm.advisories])];\n }\n result.raw = raw;\n return result;\n}\n\n/**\n * Parse a WQL query string into one of the query families — analytics\n * aggregate, content find, or pipeline — discriminated by `family` (C5).\n * Dispatch: `rows` is a retired-error; `find:` is retired; a pipe-separated\n * stage list (or a lone `@dataset`/chart head) is a pipeline; a colon\n * source/function head or legacy `agg:metric` head parses as a single query.\n */\nexport function parseQuery(raw: string): AnyParsedQuery {\n const trimmed = raw.trimStart();\n if (/^rows(?=[:{]|\\s|$)/.test(trimmed)) {\n return {\n family: 'find',\n raw,\n target: '',\n filters: [],\n error: rowsParseError(raw.trim()),\n };\n }\n if (/^find:/.test(trimmed)) return retiredFindQuery(raw);\n const segments = splitTopPipes(raw);\n const first = segments[0]!;\n // Trailing `| select / order by / limit / offset` are presentation pipes on\n // a single query (existing families), not pipeline stages.\n if (segments.length > 1 && !ROW_PIPE_RE.test(first)\n && segments.slice(1).every((s) => ROW_PIPE_RE.test(s.trim()))) {\n return parseSingleQuery(raw);\n }\n const head = leadingHeadName(first);\n if (segments.length > 1 || (head && (head.dataset\n || (WQL_CHART_HEADS as readonly string[]).includes(head.name)))) {\n return parsePipelineQuery(raw, segments);\n }\n return parseSingleQuery(raw);\n}\n\n/**\n * C2 Compatibility normalizer: rewrites legacy query syntax into modern WQL.\n * - Legacy trailing `in <scope>` rewrites into `{source:<scope>}`\n * Returns the normalized query string and any deprecation advisories.\n */\nfunction normalizeNotebookFilterText(raw: string): string {\n return raw.replace(/\\bnotebook:notebook\\/([a-zA-Z0-9_-]+)/g, 'notebook:\"notebook/$1\"');\n}\n\nexport function normalizeWql(raw: string): { query: string; advisories: string[] } {\n const advisories: string[] = [];\n let text = normalizeNotebookFilterText(raw.trim());\n\n const { primary, where } = splitAtWhere(text);\n const isFind = primary.startsWith('find:');\n if (isFind) {\n const suffixes = parseWqlSuffixes(primary);\n if (suffixes.legacyScope && !suffixes.conflicts?.length) {\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n const scope = suffixes.legacyScope;\n let head = suffixes.primaryText.trim();\n if (scope !== 'all') {\n const braceOpen = head.indexOf('{');\n const braceClose = head.lastIndexOf('}');\n if (braceOpen !== -1 && braceClose !== -1 && braceClose > braceOpen) {\n const beforeBrace = head.slice(0, braceOpen + 1);\n const inside = head.slice(braceOpen + 1, braceClose).trim();\n const afterBrace = head.slice(braceClose);\n const newInside = inside ? `${inside},source:${scope}` : `source:${scope}`;\n head = `${beforeBrace}${newInside}${afterBrace}`;\n } else {\n head = `${head}{source:${scope}}`;\n }\n }\n const parts: string[] = [head];\n if (suffixes.groupBy) {\n parts.push(`by {${suffixes.groupBy.join(', ')}}`);\n }\n if (suffixes.rollup) {\n parts.push(`.rollup(${suffixes.rollup.raw})`);\n }\n if (suffixes.window) {\n parts.push(suffixes.window.raw);\n }\n if (where) {\n parts.push(`where ${where}`);\n }\n text = parts.join(' ');\n }\n }\n\n return { query: text, advisories };\n}\n\n/** Validate source: filter values against canonical sources and catalog literals (C2). */\nfunction validateSourceFilter(filters: TagFilter[]): string | undefined {\n for (const f of filters) {\n if (f.key !== 'source') continue;\n for (const v of f.values) {\n const val = v.value;\n if (val === 'page' || val === 'pages') {\n return `source:${val} is retired — page-ness is handled by type: (e.g. type:feed or source:guides).`;\n }\n if (val === 'all') {\n return `source:all is retired — omit the source: filter to query all sources.`;\n }\n if (val === 'collection' || val === 'collections') {\n return `source:${val} is retired — collections were renamed to feeds; use source:feeds or :feed{}.`;\n }\n if (\n (WQL_SOURCE_VALUES as readonly string[]).includes(val) ||\n val === 'feed' ||\n val.startsWith('collection:') ||\n val.startsWith('feed:')\n ) {\n continue;\n }\n return `Unknown source \"${val}\". Try: ${WQL_SOURCE_VALUES.join(', ')} (or collection:<id>, feed:<id>)`;\n }\n }\n return undefined;\n}\n\n/** Extract pipe clauses (| select … | order by … | limit …) outside braces\n * and quotes — an OR `a|b` or quoted `\"x|y\"` inside filters is a value. */\nfunction extractPipes(raw: string): { text: string; pipes?: RowsPipes } {\n let pipeIndex = -1;\n let depth = 0;\n let quoted = false;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n else if (ch === '|' && depth === 0) {\n pipeIndex = i;\n break;\n }\n }\n if (pipeIndex !== -1) {\n const pipeText = raw.slice(pipeIndex + 1);\n const text = raw.slice(0, pipeIndex).trimEnd();\n const pipes = parseRowsPipes(pipeText);\n return { text, pipes };\n }\n return { text: raw };\n}\n\n\n/** True when `s` is a real civil date in YYYY-MM-DD form (rejects 02-30,\n * month 13, etc. via Date component round-trip). */\nfunction isCivilDate(s: string): boolean {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n if (!m) return false;\n const y = Number(m[1]);\n const mo = Number(m[2]);\n const d = Number(m[3]);\n const dt = new Date(y, mo - 1, d);\n return dt.getFullYear() === y && dt.getMonth() === mo - 1 && dt.getDate() === d;\n}\n\n/** Map the suffix-layer window to the AST window, validating civil dates. */\nfunction toQueryWindow(w: ParsedWqlWindowSuffix | undefined): { window?: QueryWindow; error?: string } {\n if (!w) return {};\n if (w.kind === 'relative') {\n return { window: { kind: 'relative', size: w.size, unit: w.unit } };\n }\n for (const d of [w.start, w.end]) {\n if (d !== undefined && !isCivilDate(d)) {\n return { error: `Invalid window date \"${d}\" — expected a real calendar date YYYY-MM-DD` };\n }\n }\n return { window: { kind: 'range', start: w.start, end: w.end } };\n}\n\n/** Ticket 003: grain:rollup is retired — rollup grains are never stored\n * under the unified model; they are computed at read time via the\n * .rollup suffix. The tag would silently match zero rows. */\nfunction retiredGrainRollup(filters: TagFilter[]): string | undefined {\n if (filters.some(f => f.key === 'grain' && f.values.some(v => v.value === 'rollup'))) {\n return 'grain:rollup is retired — rollup grains are never stored; compute them with the .rollup suffix';\n }\n return undefined;\n}\n\n/** Shared filter extraction from a Lezer Query top node. */\nfunction extractFilters(query: SyntaxNode, text: string): TagFilter[] {\n const out: TagFilter[] = [];\n const filters = query.getChild(terms.Filters);\n if (!filters) return out;\n for (const filter of filters.getChildren(terms.Filter)) {\n const keyNode = filter.getChild(terms.TagKey);\n const valueNode = filter.getChild(terms.TagValue);\n if (!keyNode || !valueNode) continue;\n const values: { value: string; wildcard: boolean }[] = [];\n for (const valueChild of valueNode.getChildren(terms.Value)) {\n // Each Value is `Word(:Word)?Star?` or a quoted phrase `\"...\"` per the\n // grammar. Slice its source text; a quoted node (#867) carries its\n // surrounding quotes (stripped here), a word value strips a trailing\n // wildcard — the colon stays in the value when the grammar accepts a\n // catalog-id style literal like `collection:crossfit-girls` for the\n // `source:` filter.\n const raw = text.slice(valueChild.from, valueChild.to);\n const quoted = valueChild.getChild(terms.Quoted) !== null;\n let value = quoted ? raw.slice(1, -1) : raw;\n const wildcard = quoted ? false : value.endsWith('*');\n if (wildcard) value = value.slice(0, -1);\n if (!value) continue;\n values.push({ value, wildcard });\n }\n if (values.length === 0) continue;\n out.push({\n key: text.slice(keyNode.from, keyNode.to),\n negate: filter.getChild(terms.Negate) !== null,\n values,\n });\n }\n return out;\n}\n\n/** Tree helpers over the Single/Pipeline grammar: a single query parses as\n * Query → Single → Stage → Head Filters?. */\nfunction queryStageNode(top: SyntaxNode): SyntaxNode | undefined {\n return top.getChild(terms.Single)?.getChild(terms.Stage) ?? top.getChild(terms.Stage) ?? undefined;\n}\n\nfunction cannotParseFunction(text: string): string {\n return `Cannot parse \"${text}\". Expected :function{metric:<key>, filters} by {dims} .rollup(period) — e.g. :sum{metric:tis}`;\n}\n\n/**\n * Parse an analytics query: the legacy `agg:metric{filters}` head (retained\n * numerical syntax) or the colon function head `:sum{metric:tis, …}` where\n * the metric is extracted from the filters (and excluded from fact filters).\n * `:count{}` without `metric:` is legal — it counts observations in scope.\n */\nfunction parseAggregateQuery(raw: string, opts: { colon: boolean; inheritedMetric?: string }): ParsedAggregateQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, displayUnit, groupBy, rollup, window: windowSuffix, primaryText: text } = suffixes;\n const win = toQueryWindow(windowSuffix);\n\n const base: ParsedAggregateQuery = {\n family: 'aggregate',\n raw,\n agg: 'sum',\n metric: '',\n filters: [],\n groupBy: groupBy ?? [],\n displayUnit,\n rollup: rollup ? { size: rollup.size, unit: rollup.unit as 'd' | 'w' } : undefined,\n window: win.window,\n };\n if (win.error) {\n base.error = win.error;\n return base;\n }\n if (suffixes.conflicts?.length) {\n base.error = suffixes.conflicts.join('; ');\n return base;\n }\n\n // Validate rollup unit if a rollup suffix was present\n if (rollup) {\n if (rollup.unit !== 'd' && rollup.unit !== 'w') {\n base.error = cannotParse(text);\n return base;\n }\n if ((rollup.unit === 'd' || rollup.unit === 'w') && rollup.size === 1) {\n base.error = `.rollup(1${rollup.unit}) is retired — use by {${rollup.unit === 'd' ? 'day' : 'week'}} instead.`;\n return base;\n }\n }\n\n const tree = wqlParser.parse(text);\n\n // Lezer recovers from malformed input by inserting ⚠ nodes — any of them\n // means the query is not the WQL surface.\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n base.error = cannotParse(text);\n return base;\n }\n\n const query = tree.topNode;\n const stage = queryStageNode(query);\n const head = stage?.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n base.filters = stage ? extractFilters(stage, text) : [];\n if (opts.colon) {\n // Colon function head — `:sum{metric:tis, …}`: the aggregate name is the\n // head word; the metric rides the `metric:` filter and is pulled out of\n // the fact filters.\n const word = head?.getChild(terms.Word);\n if (!head || !word) {\n base.error = cannotParseFunction(text);\n return base;\n }\n const fn = text.slice(word.from, word.to).toLowerCase();\n if (!(WQL_FUNCTION_HEADS as readonly string[]).includes(fn)) {\n base.error = `Unknown function \":${fn}\". Try: ${WQL_FUNCTION_HEADS.join(', ')}`;\n return base;\n }\n base.agg = fn as Aggregator;\n const metricFilters = base.filters.filter((f) => f.key === 'metric');\n base.filters = base.filters.filter((f) => f.key !== 'metric');\n const mf = metricFilters[0];\n if (!mf) {\n // :count{} counts observations in scope; a bare numeric function in a\n // pipeline inherits the previous stage's metric; standalone it errors.\n if (fn !== 'count' && opts.inheritedMetric === undefined) {\n base.error = `:${fn} requires 'metric:<key>' — e.g. :${fn}{metric:tis}`;\n return base;\n }\n base.metric = fn === 'count' ? '' : opts.inheritedMetric!;\n } else if (mf.negate || metricFilters.length > 1 || mf.values.length !== 1 || mf.values[0]!.wildcard) {\n base.error = `:${fn} takes a single 'metric:<key>' clause — no negation, OR values, or wildcards`;\n return base;\n } else {\n base.metric = mf.values[0]!.value;\n }\n } else {\n // Legacy head — agg:metric. Unknown aggregators are a semantic error,\n // reported exactly like the reference parser (metric left empty).\n if (!stage || !head || !aggNode || !metricNode) {\n base.error = cannotParse(text);\n return base;\n }\n const aggText = text.slice(aggNode.from, aggNode.to);\n if (!AGGS.includes(aggText as Aggregator)) {\n base.error = `Unknown aggregator \"${aggText}\". Try: ${AGGS.join(', ')}`;\n return base;\n }\n base.agg = aggText as Aggregator;\n base.metric = text.slice(metricNode.from, metricNode.to);\n }\n\n // Content-plane keys on an aggregate are a category error — a fact row\n // has no note text or source. Every other non-structural key is a\n // candidate custom dimension resolved at runtime (factTagValue falls\n // back to row.dimensions), so it is NOT rejected here.\n const contentKeys = base.filters.map(f => f.key).filter(k => (WQL_CONTENT_ONLY_KEYS as readonly string[]).includes(k));\n if (contentKeys.length > 0) {\n base.error = `Content filter key(s) ${contentKeys.map(k => `\"${k}\"`).join(', ')} cannot narrow an aggregate — facts carry effort/dimension data, not note text. Aggregate dims: ${WQL_TAG_KEYS.join(', ')}, plus any custom dimension.`;\n return base;\n }\n const grainError = retiredGrainRollup(base.filters);\n if (grainError) { base.error = grainError; return base; }\n if (whereText) {\n const join = parseJoinClause(whereText);\n if (join.error) {\n base.error = join.error;\n return base;\n }\n if (join.advisories?.length) {\n base.advisories = [...(base.advisories ?? []), ...join.advisories];\n }\n // An analytics query joins on a content (find:) clause — a metric half\n // here would be `sum:x{} where sum:y{}`, a no-op nonsensical join.\n if (!join.find) {\n base.error = `Cross-store join on an analytics query must be find:…, got \"${whereText}\"`;\n return base;\n }\n base.join = join.find;\n }\n return base;\n}\n\n// ── Find query parsing ──────────────────────────────────────────────\n\nfunction cannotParseFind(text: string): string {\n return `Cannot parse \"${text}\". Expected :source{key:value, !key:value}; filters are optional. Optional suffixes include by {dimension}, last <n>d or last <n>w, from YYYY-MM-DD [to YYYY-MM-DD], where <aggregator>:<metric>{filters} <operator> <number>, and | order by <column> | limit <n>. Support depends on the target.`;\n}\n\nfunction parseFindQuery(raw: string, opts?: { colon?: boolean }): ParsedFindQuery {\n const normalizedRaw = normalizeNotebookFilterText(raw);\n const { text: rawNoPipes, pipes } = extractPipes(normalizedRaw);\n const suffixes = parseWqlSuffixes(rawNoPipes);\n const { where: whereText, window: windowSuffix, legacyScope, groupBy, displayUnit, primaryText: text } = suffixes;\n const win = toQueryWindow(windowSuffix);\n const advisories: string[] = [];\n if (legacyScope) {\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n }\n const result: ParsedFindQuery = {\n family: 'find',\n raw,\n target: '',\n filters: [],\n window: win.window,\n ...(pipes ? { pipes } : {}),\n ...(groupBy ? { groupBy } : {}),\n ...(displayUnit ? { displayUnit } : {}),\n ...(advisories.length ? { advisories } : {}),\n };\n if (win.error) {\n result.error = win.error;\n return result;\n }\n if (pipes?.error) {\n result.error = pipes.error;\n return result;\n }\n if (suffixes.conflicts?.length) {\n result.error = suffixes.conflicts.join('; ');\n return result;\n }\n // Parse structural part: `:<target>{filters}` (or legacy `find:<target>`).\n const tree = wqlParser.parse(text);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n result.error = cannotParseFind(text);\n return result;\n }\n\n const stage = queryStageNode(tree.topNode);\n const head = stage?.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n let headName: string;\n if (opts?.colon) {\n const word = head?.getChild(terms.Word);\n if (!stage || !head || !word) {\n result.error = cannotParseFind(text);\n return result;\n }\n headName = text.slice(word.from, word.to).toLowerCase();\n } else {\n if (!stage || !head || !aggNode || !metricNode) {\n result.error = cannotParseFind(text);\n return result;\n }\n // The legacy dispatch keyword must be \"find\".\n const aggText = text.slice(aggNode.from, aggNode.to);\n if (aggText !== 'find') {\n result.error = `Expected \"find:\" but got \"${aggText}:\"`;\n return result;\n }\n headName = text.slice(metricNode.from, metricNode.to);\n }\n\n const scope = WQL_SOURCE_HEAD_SCOPES[headName];\n const typeScope = WQL_TYPE_HEADS[headName];\n if (scope || typeScope) {\n // Scoped note head: the head IS the scope, injected as authored filters\n // (they intersect any explicit source:/type: — plain AND).\n result.target = 'note';\n } else {\n result.target = headName;\n if (result.target === 'page') {\n result.error = 'find:page is retired — page-ness is handled by type: (e.g. :note{source:guides} or type:feed).';\n return result;\n }\n // C7: closed target enum — unknown targets error at parse instead of\n // silently returning empty at runtime.\n if (!(WQL_FIND_TARGETS as readonly string[]).includes(result.target)) {\n result.error = `Unknown find target \"${result.target}\". Try: ${WQL_FIND_TARGETS.join(', ')}`;\n return result;\n }\n }\n result.filters = extractFilters(stage, text);\n if (typeScope) {\n // Position 0 is the head-authored slot — the serializer's alias-head\n // collapse expects the injected filter first, matching the parse shape\n // of `:dashboard{…}` (authored filters follow).\n result.filters.unshift({\n key: 'type',\n negate: false,\n values: [{ value: typeScope, wildcard: false }],\n });\n }\n if (scope) {\n result.filters.push({\n key: 'source',\n negate: false,\n values: [{ value: scope, wildcard: false }],\n });\n if (headName === 'catalog' || headName === 'catalogs') {\n result.filters.push({\n key: 'type',\n negate: false,\n values: [{ value: 'feed', wildcard: false }],\n });\n }\n }\n // Colon heads treat a trailing non-unit `in <word>` as the legacy scope\n // clause (the suffix layer files it under display-unit for non-find text).\n const inScope = opts?.colon && result.displayUnit && result.displayUnit !== 'kg' && result.displayUnit !== 'lb'\n ? result.displayUnit\n : legacyScope;\n if (opts?.colon && inScope) {\n delete result.displayUnit;\n advisories.push(\"Legacy 'in <scope>' syntax is deprecated; use 'source:<scope>' filter instead.\");\n }\n if (inScope && inScope !== 'all') {\n result.filters.push({\n key: 'source',\n negate: false,\n values: [{ value: inScope, wildcard: false }],\n });\n }\n // The generic `:note` head carries NO default scope — it is the inclusive\n // note plane (every row; authored source: filters and negations scope it).\n // WQL_NOTE_DEFAULT_SOURCES remains exported (empty) for the serializer.\n const sourceError = validateSourceFilter(result.filters);\n if (sourceError) { result.error = sourceError; return result; }\n const findGrainError = retiredGrainRollup(result.filters);\n if (findGrainError) { result.error = findGrainError; return result; }\n const target = result.target;\n if (suffixes.rollup) advisories.push(`:${target} ignores '.rollup(...)'; rollup is supported by aggregate queries.`);\n if (whereText) {\n const join = parseJoinClause(whereText);\n if (join.error) {\n result.error = join.error;\n return result;\n }\n // A find query joins on a metric predicate — a find half here would be\n // `find:note where find:block{}`, a no-op nonsensical join.\n if (!join.metric) {\n result.error = `Cross-store join on a find query must be agg:metric{} <op> <number>, got \"${whereText}\"`;\n return result;\n }\n result.join = join.metric;\n }\n const computed = findTargetAdvisories(result);\n if (advisories.length || computed.length) {\n result.advisories = [...new Set([...advisories, ...computed])];\n }\n return result;\n}\n\n// ── Pipeline parsing ────────────────────────────────────────────────\n\n/** Stage classification for pipeline validation. */\ntype StageKind = 'dataset' | 'source' | 'function' | 'chart' | 'unknown';\n\nfunction stageKind(head: { name: string; dataset: boolean } | undefined): StageKind {\n if (!head) return 'unknown';\n if (head.dataset) return 'dataset';\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(head.name)) return 'function';\n if ((WQL_SOURCE_HEADS as readonly string[]).includes(head.name)) return 'source';\n if ((WQL_CHART_HEADS as readonly string[]).includes(head.name)) return 'chart';\n return 'unknown';\n}\n\n/**\n * Parse a left-to-right value pipeline: one input stage (dataset, source or\n * function head), ordered function stages, at most one terminal chart. Every\n * stage keeps its own suffixes (windows/grouping/unit/joins). The stripped\n * stage list re-parses through the Lezer grammar so Head/Pipeline/\n * DatasetReference nodes are the structural authority — a stage that is not\n * a clean head+filters (or a `|` with nothing after it) fails here.\n */\nfunction parsePipelineQuery(raw: string, segments: string[]): ParsedPipelineQuery {\n const advisories: string[] = [];\n const fail = (error: string): ParsedPipelineQuery => ({\n family: 'pipeline',\n raw,\n source: { kind: 'dataset', name: '' },\n transforms: [],\n error,\n });\n\n const heads = segments.map(leadingHeadName);\n const kinds = heads.map(stageKind);\n // The first stage may also be the retained legacy aggregate head\n // (`sum:tis{…} by {session}`) — parse it through the single-query path;\n // anything else headless (row pipes, garbage) fails here.\n let legacySource: ParsedAggregateQuery | undefined;\n if (!heads[0]) {\n if (ROW_PIPE_RE.test(segments[0]!)) {\n return fail('Presentation pipes (| select / order by / limit) apply to a single source query — they cannot sit between pipeline stages.');\n }\n const legacy = parseAggregateQuery(segments[0]!, { colon: false });\n if (legacy.error) return fail(legacy.error);\n legacySource = legacy;\n kinds[0] = 'function';\n }\n for (let i = 0; i < segments.length; i++) {\n if (i === 0 && legacySource) continue;\n const name = heads[i] ? `:${heads[i]!.name}` : `\"${segments[i]!.trim()}\"`;\n if (!heads[i]) {\n return fail(`Empty or unparseable pipeline stage ${name} — check for doubled or trailing \"|\".`);\n }\n if (kinds[i] === 'unknown') {\n return fail(`Unknown pipeline head ${name}. Sources: ${WQL_SOURCE_HEADS.join(', ')}; functions: ${WQL_FUNCTION_HEADS.join(', ')}; charts: ${WQL_CHART_HEADS.join(', ')}.`);\n }\n if (i > 0 && (kinds[i] === 'source' || kinds[i] === 'dataset')) {\n return fail(`Pipeline stage ${name} must come first — a pipeline starts at its source, transforms follow.`);\n }\n if (kinds[i] === 'chart' && i < segments.length - 1) {\n return fail(`Chart head ${name} must be the final pipeline stage — nothing may follow a chart.`);\n }\n }\n\n // Structural gate: the stripped stages must re-parse as a clean Lezer\n // Pipeline (or a lone Stage for the implicit-source single chart).\n const stripped = segments.map((s) => parseWqlSuffixes(s).primaryText.trim());\n const treeText = stripped.join(' | ');\n const tree = wqlParser.parse(treeText);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n const pipelineNode = syntaxError ? undefined : tree.topNode.getChild(terms.Pipeline);\n const singleNode = syntaxError ? undefined : tree.topNode.getChild(terms.Single);\n const stageNodes = pipelineNode\n ? pipelineNode.getChildren(terms.Stage)\n : singleNode\n ? [singleNode.getChild(terms.Stage)].filter((s): s is SyntaxNode => s !== null)\n : [];\n if (!pipelineNode && segments.length > 1) return fail(cannotParsePipeline(raw));\n if (stageNodes.length !== segments.length) return fail(cannotParsePipeline(raw));\n\n const last = segments.length - 1;\n let source: PipelineSource;\n if (kinds[0] === 'dataset') {\n source = { kind: 'dataset', name: '@' + heads[0]!.name };\n } else if (kinds[0] === 'chart') {\n // Lone chart head: implicit `:segment` source — the executor may reject\n // unusable chart/data combinations rather than fabricate values.\n source = { kind: 'query', query: { family: 'find', raw: ':segment{}', target: 'segment', filters: [] } };\n } else {\n const q = kinds[0] === 'function'\n // Leading ':' chooses the colon grammar; the retained legacy\n // `sum:tis{…}` aggregate head stays parseable as a pipeline source.\n ? parseAggregateQuery(segments[0]!, { colon: segments[0]!.trimStart().startsWith(':') })\n : parseFindQuery(segments[0]!, { colon: true });\n if (q.error) return fail(q.error);\n source = { kind: 'query', query: q };\n }\n\n const transforms: ParsedAggregateQuery[] = [];\n // Bare numeric stages reduce the carried stage: `:sum{metric:tis} | :max{}`\n // inherits 'tis' at parse. count keeps its metric-less form; find sources\n // carry no single metric, so a bare function after one errors clearly.\n let carriedMetric: string | undefined =\n source.kind === 'query' && source.query.family === 'aggregate' ? source.query.metric : undefined;\n const lastFunction = kinds[last] === 'chart' ? last - 1 : last;\n for (let i = 1; i <= lastFunction; i++) {\n const t = parseAggregateQuery(segments[i]!, { colon: true, inheritedMetric: carriedMetric });\n if (t.error) return fail(t.error);\n transforms.push(t);\n carriedMetric = t.metric || carriedMetric;\n }\n\n let sink: PipelineSink | undefined;\n if (kinds[last] === 'chart') {\n const chartStage = stageNodes[last]!;\n const word = chartStage.getChild(terms.Head)?.getChild(terms.Word);\n if (!word) return fail(cannotParsePipeline(raw));\n const chartHead = treeText.slice(word.from, word.to).toLowerCase();\n if (!(WQL_CHART_HEADS as readonly string[]).includes(chartHead)) {\n return fail(`Unknown chart head \":${chartHead}\". Try: ${WQL_CHART_HEADS.join(', ')}`);\n }\n const chartSuffixes = parseWqlSuffixes(segments[last]!);\n if (chartSuffixes.window || chartSuffixes.rollup || chartSuffixes.groupBy\n || chartSuffixes.displayUnit || chartSuffixes.where || chartSuffixes.legacyScope) {\n advisories.push(`:${chartHead} ignores query suffixes — apply windows and grouping to the source or function stages.`);\n }\n sink = { head: chartHead as WqlChartHead, filters: extractFilters(chartStage, treeText) };\n }\n\n const result: ParsedPipelineQuery = {\n family: 'pipeline',\n raw,\n source,\n transforms,\n ...(sink ? { sink } : {}),\n ...(advisories.length ? { advisories } : {}),\n };\n return result;\n}\n\n/**\n * Target-capability advisories for a find AST: every clause the executor will\n * silently drop, apply differently than written, or group outside the\n * executor. A pure function of the parsed shape — `parseFindQuery` attaches\n * these at parse time and `QueryService.runFind` re-derives them, so\n * hand-built ASTs get the same loud disclosure without re-serializing text.\n */\nexport function findTargetAdvisories(query: ParsedFindQuery): string[] {\n const advisories: string[] = [];\n const target = query.target;\n const supported = allowedFilterTypesForTarget(target, 'find');\n const ignored = [...new Set(query.filters.filter(f => !supportsWqlFilterKey(target, 'find', f.key)).map(f => f.key))];\n if (ignored.length) {\n const custom = target === 'segment' || target === 'event' ? ', custom fact dimensions' : '';\n const effortKey = ignored.find(key => (WQL_EFFORT_FILTER_KEYS as readonly string[]).includes(key));\n const recovery = effortKey && target !== 'effort' ? ` To filter by ${effortKey}, use :effort{${effortKey}:…}.` : '';\n advisories.push(`:${target} ignores ${ignored.map(key => `'${key}:'`).join(', ')} — the filter is not applied.${recovery} Supported keys: ${wqlFilterKeys(target, 'find').join(', ')}${custom}.`);\n }\n for (const filter of query.filters) {\n if (ignored.includes(filter.key)) continue;\n const scope = ['result', 'block', 'note'].includes(filter.key);\n const negationIgnored = target === 'note'\n ? ['effort', 'text', 'type', 'domain', 'format', 'equipment', 'quality', 'intent'].includes(filter.key)\n : target === 'block' ? ['text', 'type', 'tags', 'effort'].includes(filter.key)\n : (target === 'session' || target === 'segment' || target === 'event') && scope;\n if (filter.negate && negationIgnored) {\n advisories.push(`:${target} does not support '!${filter.key}:' negation; this clause is not applied as a negated filter.`);\n }\n const wildcardSupported = target === 'effort' ? ['effort', 'text'].includes(filter.key)\n : (target === 'segment' || target === 'event') && !scope;\n if (filter.values.some(value => value.wildcard) && !wildcardSupported) {\n advisories.push(`:${target} does not support '${filter.key}:…*' wildcards; values are matched without wildcard expansion.`);\n }\n }\n if (query.window && !supported.has('time')) {\n advisories.push(`:${target} ignores the window because its registry has no time dimension.`);\n }\n if (query.groupBy?.length) {\n const dimensions = wqlGroupingDimensions(target, 'find');\n const unsupported = query.groupBy.filter(dim => !dimensions.some(d => d.toLowerCase() === dim.toLowerCase()));\n if (target === 'note' || target === 'block') {\n // Content grouping is open: any note property (typed-tag key) names a\n // valid dimension — values resolve from entry metadata, missing → Unassigned.\n } else if (target === 'segment' || target === 'event') {\n const selected = query.pipes?.select?.map(column => column.col);\n const unavailable = query.groupBy.filter(dim => selected ? !selected.includes(dim) : !dimensions.includes(dim));\n if (unavailable.length) advisories.push(`:${target} groups only emitted table columns; ${unavailable.join(', ')} may be unassigned. Select each grouping column explicitly.`);\n } else if (unsupported.length) {\n advisories.push(`:${target} cannot group by ${unsupported.join(', ')}; the view groups by content dimensions. Valid alternatives: ${dimensions.join(', ')}.`);\n }\n }\n if (query.displayUnit && !supported.has('unit')) advisories.push(`:${target} ignores the display unit 'in ${query.displayUnit}'.`);\n if (query.join && !supported.has('where')) advisories.push(`:${target} ignores the 'where' join; joins are supported by :note and :block.`);\n if (query.pipes?.select && target !== 'segment' && target !== 'event') advisories.push(`:${target} ignores '| select'; the result keeps its original fields.`);\n if (query.pipes?.order && target === 'session') advisories.push(`:session ignores '| order by'; sessions remain ordered by completion time.`);\n return [...new Set(advisories)];\n}\n","/**\n * WQL serializer (C6 — one structured interface for code).\n *\n * The total serializer over the C5 discriminated query union: code holds the\n * AST; strings live only at document edges (URL `?q=`, ```query``` fences,\n * dashboard bodies). Properties (proven by tests/serialize.test.ts):\n *\n * 1. `serialize(parse(x)) === x` for canonical inputs (fixed-point text), and\n * 2. `parse(serialize(a))` is structurally equal to `a` for every AST —\n * equal on all query-structure fields; `raw` (provenance text) and\n * `advisories` (parse-time deprecation notices) are intentionally not\n * reproduced, since serialization emits modern canonical syntax.\n *\n * Errored ASTs serialize to their original `raw` text — a query that failed\n * to parse has no well-defined structure to re-emit, and echoing the input\n * keeps the function total.\n *\n * Round-trip equality holds for text-surface-representable ASTs. Single\n * aggregate queries serialize in the retained legacy `sum:metric{…}` form;\n * find queries serialize with colon source heads (find: is retired) and\n * pipelines as `source | :fn{…} | :chart{…}`. Three value\n * shapes the grammar cannot express (or parses away) sit outside that\n * contract — documented here rather than silently corrupted:\n * - a `\"` inside a filter value: the quoted token has no escape form;\n * - a quoted value with `wildcard: true`: the parser forces wildcard=false\n * on quoted atoms (extractFilters), so the flag cannot survive;\n * - thresholds whose String() is exponential (>= 1e21): outside the join\n * comparison regex's plain-decimal domain.\n */\n\nimport { WQL_TYPE_HEADS } from './vocabulary';\nimport type { AnyParsedQuery, MetricPredicate, ParsedAggregateQuery, ParsedFindQuery, PipelineSource, ParsedPipelineQuery, QueryWindow, TagFilter } from './wql';\n\n/** `:note{…}` / `:session{…}` — always the target head with the filters in\n * their authored order. A source: filter is never collapsed into a\n * scope-alias head: the collapse can reorder/broaden (a :journal head on a\n * session query) and it breaks composer's filterText editing, which maps\n * serialized filter clauses back to AST positions. */\n/** A note-target AST in the exact shape the `:dashboard` alias head parses\n * to (first filter = literal `type:dashboard`, no source scope) — shared\n * by the head and scope serializers so both emit through the alias. */\nfunction isDashboardHeadShape(f: ParsedFindQuery): boolean {\n const first = f.filters[0];\n return f.target === 'note' && f.sourceScope === undefined\n && !!first && first.key === 'type' && !first.negate\n && first.values.length === 1 && !first.values[0]!.wildcard\n && first.values[0]!.value === WQL_TYPE_HEADS.dashboard;\n}\n\nfunction serializeFindHead(f: ParsedFindQuery, extra: TagFilter[] = []): string {\n // The type-alias head serializes back through its alias: reparse\n // re-injects the type filter at the same first position.\n if (isDashboardHeadShape(f)) {\n const filters = [...f.filters.slice(1), ...extra];\n return `:dashboard${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n }\n const filters = [...f.filters, ...extra];\n return `:${f.target}${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n}\n\n/** Scope handling for the generic note head. The note head is inclusive —\n * there is no default scope anymore, so no `in all` marker is emitted (the\n * legacy suffix still parses); a non-canonical sourceScope serializes as\n * explicit source: filters. */\nfunction serializeScopeInfo(f: ParsedFindQuery): { clause: string; scopeFilters: TagFilter[] } {\n if (f.target !== 'note' || f.filters.some((t) => t.key === 'source')) return { clause: '', scopeFilters: [] };\n // The alias head is scope-free by construction.\n if (isDashboardHeadShape(f)) return { clause: '', scopeFilters: [] };\n if (!f.sourceScope?.length) return { clause: '', scopeFilters: [] };\n return {\n clause: '',\n scopeFilters: [{ key: 'source', negate: false, values: f.sourceScope.map((v) => ({ value: v, wildcard: false })) }],\n };\n}\n\n/** Find query text without presentation pipes — a pipeline source stage\n * (pipes between stages are separators, so a source stage has none). */\nfunction serializeFindStage(f: ParsedFindQuery): string {\n const scope = serializeScopeInfo(f);\n const parts = [serializeFindHead(f, scope.scopeFilters)];\n if (f.groupBy?.length) parts.push(`by {${f.groupBy.join(', ')}}`);\n if (f.displayUnit) parts.push(`in ${f.displayUnit}`);\n parts.push(scope.clause);\n parts.push(serializeWindow(f.window));\n if (f.join) parts.push(`where ${serializeMetricHalf(f.join)}`);\n return parts.filter(Boolean).join(' ');\n}\n\n/** `:sum{metric:tis, <filters>} [by {..}] [.rollup(..)] [in u] [window] [where …]`\n * — the colon function form; the metric re-enters the filters. */\nfunction serializeFunctionStage(a: ParsedAggregateQuery): string {\n const filters = a.metric\n ? [{ key: 'metric', negate: false, values: [{ value: a.metric, wildcard: false }] }, ...a.filters]\n : a.filters;\n let text = `:${a.agg}{${serializeFilters(filters)}}`;\n if (a.groupBy.length) text += ` by {${a.groupBy.join(', ')}}`;\n if (a.rollup) text += `.rollup(${a.rollup.size}${a.rollup.unit})`;\n if (a.displayUnit) text += ` in ${a.displayUnit}`;\n const win = serializeWindow(a.window);\n if (win) text += ` ${win}`;\n if (a.join) text += ` where ${serializeFindHalf(a.join.target, a.join.filters, a.join.last)}`;\n return text;\n}\n\nfunction serializePipelineStage(source: PipelineSource): string {\n return source.kind === 'dataset'\n ? source.name\n : source.query.family === 'find' ? serializeFindStage(source.query) : serializeFunctionStage(source.query);\n}\n\n/** Serialize a pipeline: `source | :fn{…} | :chart{…}`. */\nfunction serializePipeline(p: ParsedPipelineQuery): string {\n const parts = [serializePipelineStage(p.source), ...p.transforms.map(serializeFunctionStage)];\n if (p.sink) {\n parts.push(`:${p.sink.head}${p.sink.filters.length ? `{${serializeFilters(p.sink.filters)}}` : ''}`);\n }\n return parts.join(' | ');\n}\n\n/** Quote a filter value unless it fits the grammar's bare forms — a dotted\n * `Word` chain (`calc.acwr`) or a catalog-id `Word:Word` chain. Quoted\n * phrases (`\"[^\"]*\"`) carry multi-word text; the grammar has no escape, so\n * values containing `\"` are outside the text surface entirely. */\nfunction serializeValue(value: string): string {\n if (/^[a-zA-Z0-9_-]+((:|\\.)[a-zA-Z0-9_-]+)*$/.test(value)) return value;\n return `\"${value}\"`;\n}\n\n/** `{key:val1|val2, !other:val*}` — commas between keys, `|` between a\n * key's OR-alternatives, per-value `*` wildcard, `!` negation. */\nfunction serializeFilters(filters: TagFilter[]): string {\n return filters\n .map((f) => `${f.negate ? '!' : ''}${f.key}:${f.values.map((v) => serializeValue(v.value) + (v.wildcard ? '*' : '')).join('|')}`)\n .join(',');\n}\n\n/** `<agg>:<metric>{filters}` — the head shared by aggregate queries and the\n * metric half of a cross-store join. Aggregate heads always carry braces,\n * matching the canonical corpus (`sum:tis{}`). */\nfunction serializeAggHead(agg: string, metric: string, filters: TagFilter[]): string {\n return `${agg}:${metric}{${serializeFilters(filters)}}`;\n}\n\nfunction serializeAggregateHead(a: ParsedAggregateQuery): string {\n return serializeAggHead(a.agg, a.metric, a.filters);\n}\n\n/** `find:target{filters}[ last <n><unit>]` — the content half of a cross-store\n * join reuses the find head plus its relative window (range windows are\n * rejected on join halves at parse). */\nfunction serializeFindHalf(target: string, filters: TagFilter[], last?: { size: number; unit: 'd' | 'w' }): string {\n const head = `find:${target}${filters.length ? `{${serializeFilters(filters)}}` : ''}`;\n return last ? `${head} last ${last.size}${last.unit}` : head;\n}\n\n/** `<agg>:<metric>{filters} <op> <threshold>` — the metric half of a\n * cross-store join attached to a find query. */\nfunction serializeMetricHalf(j: MetricPredicate): string {\n return `${serializeAggHead(j.agg, j.metric, j.filters)} ${j.operator} ${j.threshold}`;\n}\n\n\n/** Window clause (C1): `last 8w` or `from 2026-01-01 [to 2026-03-31]`.\n * Returns '' when the AST has no window. */\nfunction serializeWindow(w: QueryWindow | undefined): string {\n if (!w) return '';\n if (w.kind === 'relative') return `last ${w.size}${w.unit}`;\n return w.end ? `from ${w.start} to ${w.end}` : `from ${w.start}`;\n}\n\n/** Serialize any parsed query to canonical WQL text. Total: never throws. */\nexport function serialize(parsed: AnyParsedQuery): string {\n if (parsed.error) return parsed.raw;\n if (parsed.family === 'aggregate') {\n const a = parsed;\n let text = serializeAggregateHead(a);\n if (a.groupBy.length) text += ` by {${a.groupBy.join(', ')}}`;\n if (a.rollup) text += `.rollup(${a.rollup.size}${a.rollup.unit})`;\n if (a.displayUnit) text += ` in ${a.displayUnit}`;\n const win = serializeWindow(a.window);\n if (win) text += ` ${win}`;\n if (a.join) text += ` where ${serializeFindHalf(a.join.target, a.join.filters, a.join.last)}`;\n return text;\n }\n if (parsed.family === 'find') {\n // Suffix order mirrors the parser's end-anchored extraction (wqlSuffix):\n // head, by, in-unit, in-all scope, window, where-join — pipes trail after `|`.\n const scope = serializeScopeInfo(parsed);\n const parts = [serializeFindHead(parsed, scope.scopeFilters)];\n if (parsed.groupBy?.length) parts.push(`by {${parsed.groupBy.join(', ')}}`);\n if (parsed.displayUnit) parts.push(`in ${parsed.displayUnit}`);\n parts.push(scope.clause);\n parts.push(serializeWindow(parsed.window));\n if (parsed.join) parts.push(`where ${serializeMetricHalf(parsed.join)}`);\n let text = parts.filter(Boolean).join(' ');\n if (parsed.pipes) {\n const pipeParts: string[] = [];\n if (parsed.pipes.select) {\n pipeParts.push(`select ${parsed.pipes.select.map((s) => s.col + (s.unit ? ` in ${s.unit}` : '')).join(', ')}`);\n }\n if (parsed.pipes.order) {\n pipeParts.push(`order by ${parsed.pipes.order.map((o) => o.dir === 'desc' ? `${o.col} desc` : o.col).join(', ')}`);\n }\n if (parsed.pipes.limit !== undefined) {\n pipeParts.push(`limit ${parsed.pipes.limit}${parsed.pipes.offset !== undefined ? ` offset ${parsed.pipes.offset}` : ''}`);\n } else if (parsed.pipes.offset !== undefined) {\n pipeParts.push(`offset ${parsed.pipes.offset}`);\n }\n if (pipeParts.length > 0) {\n text += ` | ${pipeParts.join(' | ')}`;\n }\n }\n return text;\n }\n if (parsed.family === 'pipeline') {\n return serializePipeline(parsed);\n }\n const unhandled = parsed as { raw?: string };\n return unhandled.raw ?? '';\n}\n","/**\n * Canonical discipline vocabulary — the single source of truth for effort\n * disciplines across the resolver, the TIS factor table, fact-row tags, the\n * WQL tag dictionary, and UI filters.\n */\n\nexport const EFFORT_DISCIPLINES = [\n 'bodyweight',\n 'cycling',\n 'gymnastics',\n 'kettlebell',\n 'recovery',\n 'rowing',\n 'running',\n 'strength',\n 'swimming',\n 'walking',\n] as const;\n\nexport type EffortDiscipline = (typeof EFFORT_DISCIPLINES)[number];\n\nexport function isEffortDiscipline(value: unknown): value is EffortDiscipline {\n return typeof value === 'string'\n && (EFFORT_DISCIPLINES as readonly string[]).includes(value.toLowerCase());\n}\n\n/**\n * TIS discipline multiplier per canonical discipline. Loaded modalities\n * (strength + the loaded-skill pair kettlebell/gymnastics) score 1.2;\n * recovery absorbs the retired 'yoga' case at 0.9; the monostructural five\n * and bodyweight take the 1.0 default. Unknown/absent disciplines fall back\n * to 1.0.\n */\nexport const DISCIPLINE_FACTORS: Record<EffortDiscipline, number> = {\n strength: 1.2,\n kettlebell: 1.2,\n gymnastics: 1.2,\n recovery: 0.9,\n bodyweight: 1.0,\n cycling: 1.0,\n rowing: 1.0,\n running: 1.0,\n swimming: 1.0,\n walking: 1.0,\n};\n\n/** Factor for an arbitrary discipline string; 1.0 when absent or unknown. */\nexport function disciplineFactorFor(discipline: string | undefined): number {\n if (!discipline) return 1.0;\n const key = discipline.toLowerCase();\n return isEffortDiscipline(key) ? DISCIPLINE_FACTORS[key] : 1.0;\n}\n","/**\n * WQL language support — CodeMirror highlighting + autocomplete over the\n * Lezer grammar (grammar/wql.grammar).\n *\n * The completion vocabulary is the analytics dictionary:\n * - aggregators from the AST contract (WQL_AGGREGATORS)\n * - Canonical Metric Keys (CONTEXT.md §Analytics): base families, Tier-2\n * aggregates, and `<effortSlug>.<family>` for every known effort\n * - Tag keys read off fact rows by the Query Service, with value\n * vocabularies for discipline (canonical EFFORT_DISCIPLINES), intensity,\n * and grain; effort values come from the EffortResolver\n * - virtual dimensions day | week | session | round\n */\n\nimport { LRLanguage, LanguageSupport, HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { autocompletion, CompletionContext, CompletionResult, Completion, snippetCompletion, startCompletion } from \"@codemirror/autocomplete\";\nimport type { Extension } from \"@codemirror/state\";\nimport type { EditorView } from \"@codemirror/view\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\nimport { parser } from \"./grammar/wql.parser\";\nimport type { IFieldCatalog } from \"./catalog\";\nimport { EFFORT_DISCIPLINES } from \"./disciplines\";\nimport { wqlFilterKeys, wqlGroupingDimensions } from \"./capabilities\";\nimport {\n WQL_AGGREGATORS,\n WQL_CHART_HEADS,\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_CALC_TARGETS,\n WQL_INTENSITY_TIERS,\n WQL_GRAINS,\n WQL_ROLLUP_PERIODS,\n WQL_SOURCE_HEADS,\n WQL_SOURCE_HEAD_SCOPES,\n WQL_TYPE_HEADS,\n WQL_SOURCE_VALUES,\n WQL_STANDARD_DATASETS,\n WQL_FIND_TARGETS,\n WQL_FUNCTION_HEADS,\n WQL_DISPLAY_UNITS,\n} from \"./vocabulary\";\n\n// The vocabulary tables live in ./vocabulary (no editor deps); re-export\n// so existing importers of language keep working.\nexport {\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_TAG_KEYS,\n WQL_VIRTUAL_DIMS,\n WQL_CALC_TARGETS,\n WQL_FIND_TARGETS,\n WQL_RESULT_PLANES,\n WQL_SOURCE_VALUES,\n WQL_CONTENT_FILTER_KEYS,\n WQL_AGGREGATORS,\n WQL_COMPARISON_OPS,\n WQL_ROLLUP_PERIODS,\n} from \"./vocabulary\";\n\n// ── Highlighting ───────────────────────────────────────────────────\n\nexport const wqlLanguage = LRLanguage.define({\n parser: parser.configure({\n props: [\n styleTags({\n // Rule styles color stray punctuation; the Word tokens inside carry\n // the visible styling (unstyled children reset the parent class) —\n // so parents with punctuation children (Head spans `:journal`) are\n // NOT styled directly, or highlightTree merges the word into the\n // parent span.\n \"Aggregator/Word\": t.keyword,\n \"Metric/Word\": t.variableName,\n // Direct Word child of Head = the colon head name (`:sum`, `:journal`).\n \"Head/Word\": t.keyword,\n DatasetReference: t.keyword,\n \"DatasetReference/Word\": t.keyword,\n At: t.punctuation,\n TagKey: t.propertyName,\n \"TagKey/Word\": t.propertyName,\n TagValue: t.string,\n \"TagValue/Value/Word\": t.string,\n \"TagValue/Word\": t.string,\n Negate: t.operator,\n Star: t.operator,\n Dimension: t.attributeName,\n \"Dimension/Word\": t.attributeName,\n By: t.keyword,\n RollupDot: t.keyword,\n Int: t.number,\n \"Rollup/Word\": t.unit,\n braceOpen: t.bracket,\n braceClose: t.bracket,\n parenOpen: t.bracket,\n parenClose: t.bracket,\n colon: t.punctuation,\n comma: t.punctuation,\n pipe: t.punctuation,\n dot: t.punctuation,\n })\n ]\n }),\n languageData: {\n closeBrackets: { brackets: [\"{\", \"(\"] },\n }\n});\n\n// ── Completion ─────────────────────────────────────────────────────\n\nexport interface WqlCompletionOptions {\n /**\n * Effort slugs for `{effort:…}` values and `<effortSlug>.<family>` metric\n * keys — feed from the EffortResolver:\n * `() => resolver.list().map(e => e.slug)`.\n */\n effortNames?: () => readonly string[];\n /**\n * Dynamic values for the frontmatter typed-tag filters (`{domain:…}`,\n * `{format:…}`, `{equipment:…}`, `{quality:…}`, `{intent:…}`) — fed from\n * the tags store's `by-type` index:\n * `async key => (await storage.getAllFromIndex('tags', 'by-type', key)).map(t => t.label)`.\n * Absent or empty results fall through to catalog discovery.\n */\n tagTypeValues?: (key: string) => Promise<readonly string[]> | readonly string[];\n /**\n * Host-supplied values for a filter key (e.g. the composer's suggestion\n * feeds). Non-empty results win over the static vocabularies below.\n */\n values?: (key: string) => Promise<readonly Completion[]>;\n /**\n * Injected field catalog (ticket 15): discovered typed variants join the\n * static metric vocabulary, and categorical values back filter-value\n * suggestions for discovered fields. Bounded prefix lookups only — the\n * catalog never scans event/result history.\n */\n catalog?: IFieldCatalog;\n}\n\nfunction options(labels: readonly (string | Completion)[]): Completion[] {\n return labels.map((label) => (typeof label === 'string' ? { label } : label));\n}\n\n/**\n * Lexical cursor scan — quote- and brace-aware. Primary slot detection is\n * lexical because the suffix/pipe/window grammar lives outside the Lezer\n * tree, and quoted phrases / OR pipes inside braces must never be mistaken\n * for structural boundaries.\n */\ninterface WqlScan { depth: number; quoted: boolean; pipeFrom: number; lastBrace: number; fragStart: number; }\n\nfunction scanContext(doc: string, pos: number): WqlScan {\n let depth = 0, quoted = false, pipeFrom = -1, lastBrace = -1, fragStart = 0;\n for (let i = 0; i < pos; i++) {\n const ch = doc[i];\n if (quoted) { if (ch === '\"') quoted = false; continue; }\n if (ch === '\"') { quoted = true; continue; }\n if (ch === '{') { depth++; lastBrace = i; fragStart = i + 1; }\n else if (ch === '}') { depth = Math.max(0, depth - 1); fragStart = i + 1; }\n else if (ch === ',' && depth > 0) fragStart = i + 1;\n else if (ch === '|' && depth === 0) { pipeFrom = i + 1; fragStart = i + 1; }\n }\n return { depth, quoted, pipeFrom, lastBrace, fragStart };\n}\n\nfunction maskQuotes(text: string): string {\n let out = '';\n let quoted = false;\n for (const ch of text) {\n if (ch === '\"') { quoted = !quoted; out += ' '; }\n else out += quoted ? ' ' : ch;\n }\n return out;\n}\n\nfunction unquotedColonIndex(text: string): number {\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (ch === '\"') quoted = !quoted;\n else if (ch === ':' && !quoted) return i;\n }\n return -1;\n}\n\n/** Keys/dims already present in the open brace group, before the current fragment. */\nfunction usedEntries(doc: string, groupStart: number, fragStart: number): Set<string> {\n const text = maskQuotes(doc.slice(groupStart + 1, fragStart));\n const used = new Set<string>();\n for (const entry of text.split(',')) {\n const m = /!?\\s*([A-Za-z][\\w-]*)/.exec(entry);\n if (m) used.add(m[1]);\n }\n return used;\n}\n\nfunction valueOf(c: Completion): string {\n return typeof c.apply === 'string' ? c.apply : c.label;\n}\n\n/** Whitespace values insert quoted — never inside already-quoted replacements. */\nfunction quoteApply(c: Completion): Completion {\n const value = valueOf(c);\n if (!/\\s/.test(value)) return c;\n return {\n ...c,\n apply: (view: EditorView, _c: Completion, from: number, to: number) => {\n const text = view.state.sliceDoc(Math.max(0, from - 1), from) === '\"' ? value : `\"${value}\"`;\n view.dispatch({ changes: { from, to, insert: text }, selection: { anchor: from + text.length }, userEvent: 'input.complete' });\n },\n };\n}\n\n/** Host values first (rank-boosted so CM sort keeps vault order), static\n * canonical vocabulary after; case-insensitive dedup by value — labels are\n * display-only and never count as a second value. */\nfunction mergeValues(host: readonly Completion[], statics: readonly Completion[]): Completion[] {\n const seen = new Set<string>();\n const out: Completion[] = [];\n host.forEach((c, i) => {\n const k = valueOf(c).toLowerCase();\n if (!k || seen.has(k)) return;\n seen.add(k);\n out.push(quoteApply({ ...c, boost: Math.max(-99, Math.min(99, 80 - i)) }));\n });\n for (const c of statics) {\n const k = valueOf(c).toLowerCase();\n if (!k || seen.has(k)) continue;\n seen.add(k);\n out.push(quoteApply(c));\n }\n return out;\n}\n\n/** Prefix-first, case-insensitive substring narrowing. */\nfunction narrow(options: readonly Completion[], typed: string): Completion[] {\n const q = typed.toLowerCase();\n if (!q) return [...options];\n const prefix: Completion[] = [];\n const rest: Completion[] = [];\n for (const o of options) {\n const label = o.label.toLowerCase();\n if (label.startsWith(q)) prefix.push(o);\n else if (label.includes(q)) rest.push(o);\n }\n return [...prefix, ...rest];\n}\n\n/** Ranked result; empty matches close the popup (free text stays as written). */\nfunction finish(_context: CompletionContext, from: number, options: readonly Completion[], typed: string): CompletionResult | null {\n const ranked = narrow(options, typed);\n if (!ranked.length) return null;\n return {\n from,\n options: ranked.map((o, i) => (o.boost === undefined ? { ...o, boost: Math.max(-99, 50 - i) } : o)),\n filter: false,\n };\n}\n\n/**\n * Accepting a head aggregator or a filter key also writes its separator and\n * reopens the list, so the next slot (metric/target, filter value) is\n * offered immediately — typing becomes picking.\n */\nfunction chained(list: readonly Completion[], suffix: string): Completion[] {\n return list.map((c) => ({\n ...c,\n apply: (view: EditorView, _c: Completion, from: number, to: number) => {\n const text = typeof c.apply === 'string' ? c.apply : c.label;\n const present = view.state.sliceDoc(to, to + suffix.length) === suffix;\n view.dispatch({\n changes: { from, to, insert: present ? text : text + suffix },\n selection: { anchor: from + text.length + suffix.length },\n userEvent: 'input.complete',\n });\n startCompletion(view);\n },\n }));\n}\n\n/** Colon head vocabulary — canonical sources, functions, charts, datasets. */\nconst HEAD_OPTIONS: Completion[] = [\n ...WQL_FUNCTION_HEADS.map((label) => ({ label, detail: 'function head', type: 'keyword' as const })),\n ...WQL_SOURCE_HEADS.map((label) => ({ label, detail: 'source head', type: 'keyword' as const })),\n ...WQL_CHART_HEADS.map((label) => ({ label, detail: 'chart head', type: 'class' as const })),\n ...WQL_STANDARD_DATASETS.map((label) => ({ label, detail: 'page dataset', type: 'class' as const })),\n];\n\n/** Insertion for a head option: `:name{` at query start, `name{` when the\n * leading colon is already typed; datasets insert bare. */\nfunction headApply(o: Completion, colonTyped: boolean): Completion {\n if (o.label.startsWith('@')) return { ...o, apply: o.label };\n return { ...o, apply: `${colonTyped ? '' : ':'}${o.label}{` };\n}\n\n/** Legacy `agg:` heads still parse (retained numerical syntax); the retired\n * find/rows dispatch keywords are no longer offered. */\nconst LEGACY_HEAD_OPTIONS: Completion[] = WQL_AGGREGATORS.map((label) => ({ label, type: 'keyword' as const }));\n\n/** Sortable/selectable columns the executors actually read (QueryService). */\nconst NOTE_COLUMNS: readonly string[] = ['title', 'date', 'createdAt', 'type', 'sourceId', 'catalog'];\nconst BLOCK_COLUMNS: readonly string[] = ['noteTitle', 'dataType', 'position', 'createdAt', 'noteId', 'sourceId'];\nconst EFFORT_COLUMNS: readonly string[] = ['slug', 'label', 'registrySource'];\nconst SESSION_COLUMNS: readonly string[] = ['duration', 'startTime', 'origin'];\nconst TABLE_COLUMNS: readonly string[] = [\n 'date', 'effort', 'discipline', 'note', 'grade', 'intensity',\n ...WQL_METRIC_FAMILIES, ...WQL_METRIC_AGGREGATES,\n];\n/** Columns that accept an `in kg|lb` display unit. */\nconst UNIT_COLUMNS: ReadonlySet<string> = new Set(['distance', 'resistance', 'totalVolume', 'totalDistance']);\nconst DIR_OPTIONS: Completion[] = [\n { label: 'asc', detail: 'sort ascending', type: 'keyword' },\n { label: 'desc', detail: 'sort descending', type: 'keyword' },\n];\nconst UNIT_OPTIONS: Completion[] = WQL_DISPLAY_UNITS.map((label) => ({ label, detail: 'display unit', type: 'constant' }));\n\ntype Family = 'find' | 'aggregate';\ninterface Head { family: Family; target?: string }\n\n/** `find:`/rows: dispatch keywords are retired — a legacy `word:` head is\n * always the retained aggregate surface; the metric slot resolves below. */\nfunction resolveHead(_agg: string, _typedTarget: string): Head {\n return { family: 'aggregate' };\n}\n\n/** A colon head: function → aggregate family; source head → its content\n * plane (scoped aliases resolve to 'note'); chart → sink params. */\nfunction resolveColonHead(name: string): Head {\n const n = name.toLowerCase();\n if ((WQL_FUNCTION_HEADS as readonly string[]).includes(n)) return { family: 'aggregate' };\n if ((WQL_CHART_HEADS as readonly string[]).includes(n)) return { family: 'find' };\n // Partial head word resolves through the unique prefix (`:no{` → note).\n let source = n;\n if (!(WQL_SOURCE_HEADS as readonly string[]).includes(source)) {\n const partial = source ? WQL_SOURCE_HEADS.filter((t) => t.startsWith(source)) : [];\n if (partial.length === 1) source = partial[0]!;\n }\n if ((WQL_SOURCE_HEADS as readonly string[]).includes(source)) {\n const scoped = (WQL_SOURCE_HEAD_SCOPES as Readonly<Record<string, string>>)[source]\n || (WQL_TYPE_HEADS as Readonly<Record<string, string>>)[source];\n return { family: 'find', target: scoped ? 'note' : source };\n }\n return { family: 'find' }; // partial or unknown — union key suggestions\n}\n\nconst FIND_KEY_UNION: readonly string[] = [\n ...new Set(WQL_FIND_TARGETS.flatMap((t) => [...wqlFilterKeys(t, 'find')])),\n];\n\nfunction filterKeysFor(head: Head): readonly string[] {\n return head.family === 'find'\n ? (head.target ? wqlFilterKeys(head.target, 'find') : FIND_KEY_UNION)\n : wqlFilterKeys('', 'aggregate');\n}\n\nfunction pipeColumns(target: string | undefined): readonly string[] {\n switch (target) {\n case 'note': return NOTE_COLUMNS;\n case 'block': return BLOCK_COLUMNS;\n case 'effort': return EFFORT_COLUMNS;\n case 'session': return SESSION_COLUMNS;\n default: return TABLE_COLUMNS; // segment/event/rows table output\n }\n}\n\n/** Parser advisories: select is ignored for these targets, order for sessions. */\nconst SELECT_IGNORED: ReadonlySet<string> = new Set(['note', 'block', 'effort', 'session']);\n\nexport function wqlCompletionSource(options_: WqlCompletionOptions = {}) {\n const { effortNames, tagTypeValues, catalog, values: hostValues } = options_;\n\n /** Discovered typed variants for the typed metric word — bounded lookup. */\n const catalogMetricOptions = async (typed: string): Promise<Completion[]> => {\n if (!catalog) return [];\n const entries = await catalog.listByPrefix(typed, 20);\n return entries.map((entry) => ({\n label: entry.path,\n detail: [entry.kind, ...entry.units].filter(Boolean).join(' · '),\n type: 'variable',\n apply: entry.path,\n }));\n };\n\n /** Categorical values for a discovered field key (original spellings). */\n const catalogValueOptions = async (key: string, typed: string): Promise<Completion[]> => {\n if (!catalog) return [];\n const values = await catalog.listValues(key, typed, 20);\n return values.map((v) => ({ label: v.value, type: 'constant' }));\n };\n\n const metricOptions = (): Completion[] => {\n const efforts = effortNames?.() ?? [];\n return [\n ...options(WQL_METRIC_AGGREGATES).map((c) => ({ ...c, type: 'constant' })),\n ...options(WQL_METRIC_FAMILIES).map((c) => ({ ...c, type: 'variable' })),\n ...options(efforts.flatMap((slug) => WQL_METRIC_FAMILIES.map((family) => `${slug}.${family}`)))\n .map((c) => ({ ...c, type: 'variable' })),\n ...options(WQL_CALC_TARGETS).map((c) => ({ ...c, type: 'namespace' })),\n snippetCompletion('calc.${target}', { label: 'calc.', detail: 'calculated target', type: 'namespace' }),\n ];\n };\n\n /** Static canonical value vocabulary per key (null → free-form/catalog). */\n const staticValueOptions = (key: string): Completion[] | Promise<Completion[]> | null => {\n switch (key) {\n case 'effort': return options(effortNames?.() ?? []);\n case 'discipline': return options(EFFORT_DISCIPLINES);\n case 'intensity': return options(WQL_INTENSITY_TIERS);\n case 'grain': return options(WQL_GRAINS);\n case 'metric': return metricOptions();\n case 'source': return options(WQL_SOURCE_VALUES);\n case 'domain':\n case 'format':\n case 'equipment':\n case 'quality':\n case 'intent': {\n if (!tagTypeValues) return null;\n return Promise.resolve(tagTypeValues(key)).then((values) => options(values));\n }\n default: return null; // note/page/block/result/tags/origin — free-form or host-fed\n }\n };\n\n /** Filter value slot: host vault values first, static canonical after,\n * case-insensitive dedup; falls through to catalog discovery, then to a\n * plain close (free text stays as written). */\n const valueSlot = (\n key: string,\n context: CompletionContext,\n from: number,\n typed: string,\n ): CompletionResult | Promise<CompletionResult | null> | null => {\n const emit = (host: readonly Completion[], statics: readonly Completion[] | null): CompletionResult | Promise<CompletionResult | null> | null => {\n const merged = mergeValues(host, statics ?? []);\n if (merged.length) return finish(context, from, merged, typed);\n if (catalog) {\n return catalogValueOptions(key, typed).then((found) => finish(context, from, found, typed));\n }\n return finish(context, from, [], typed);\n };\n const statics = staticValueOptions(key);\n if (!hostValues) {\n return statics instanceof Promise ? statics.then((s) => emit([], s)) : emit([], statics);\n }\n const host = hostValues(key);\n if (statics instanceof Promise) return Promise.all([Promise.resolve(host), statics]).then(([h, s]) => emit(h, s));\n return Promise.resolve(host).then((h) => emit(h, statics));\n };\n\n /** Discovered typed variants join the static metric vocabulary (ticket 15). */\n const metricHeadSlot = (context: CompletionContext, from: number, typed: string): CompletionResult | Promise<CompletionResult | null> | null => {\n if (!catalog) return finish(context, from, metricOptions(), typed);\n return catalogMetricOptions(typed).then((extra) => finish(context, from, [...metricOptions(), ...extra], typed));\n };\n\n /** Inside braces: `by {…}` dims use target-aware grouping; filter braces\n * use target-aware keys (excluding keys already present), `!` reopens the\n * same list as an exclude, and `key:` values merge host + canonical. */\n const braceSlot = (\n context: CompletionContext,\n doc: string,\n scan: WqlScan,\n from: number,\n typed: string,\n head: Head,\n ): CompletionResult | Promise<CompletionResult | null> | null => {\n if (/\\bby\\s*$/.test(maskQuotes(doc.slice(0, scan.lastBrace)))) {\n const dims = wqlGroupingDimensions(head.target ?? '', head.family);\n const used = usedEntries(doc, scan.lastBrace, scan.fragStart);\n const avail = [...dims].filter((d) => !used.has(d));\n if (!avail.length) return finish(context, from, [], typed);\n return finish(\n context,\n from,\n chained(avail.map((d) => ({ label: d, type: 'atom' as const, detail: 'grouping dimension' })), ', '),\n typed,\n );\n }\n const frag = doc.slice(scan.fragStart, context.pos);\n const colon = unquotedColonIndex(frag);\n if (colon >= 0) {\n const key = frag.slice(0, colon).replace(/^!/, '').trim();\n return valueSlot(key, context, from, typed);\n }\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n const exclude = frag.trimStart().startsWith('!');\n const used = usedEntries(doc, scan.lastBrace, scan.fragStart);\n const avail = filterKeysFor(head).filter((k) => !used.has(k));\n const opts = chained(\n avail.map((k) => ({ label: k, type: 'property' as const, ...(exclude ? { detail: `exclude ${k} values` } : {}) })),\n ':',\n );\n return finish(context, keyWord.from, opts, typed);\n };\n\n /** After a complete head: rollup periods, group dims, `last <n>d|w`,\n * `from DATE [to DATE]`, or the structural suffix keywords. */\n const suffixSlot = (context: CompletionContext, doc: string, scan: WqlScan, from: number, typed: string, head: Head, headEnd: number): CompletionResult | null => {\n const tail = doc.slice(headEnd, context.pos);\n if (/\\.rollup\\([^)]*$/.test(tail)) {\n // find ignores .rollup (parser advises) — only aggregate heads get periods.\n return head.family === 'aggregate'\n ? finish(context, from, options(WQL_ROLLUP_PERIODS).map((c) => ({ ...c, type: 'constant' as const })), typed)\n : finish(context, from, [], typed);\n }\n if (/\\bby\\s*\\{[^}]*$/.test(tail)) return braceSlot(context, doc, scan, from, typed, head) as CompletionResult | null;\n if (/\\s+last\\s+$/i.test(tail)) {\n return finish(context, context.pos, [\n { label: '4w', detail: 'relative window', type: 'constant' },\n { label: '8w', detail: 'relative window', type: 'constant' },\n { label: '7d', detail: 'relative window', type: 'constant' },\n { label: '30d', detail: 'relative window', type: 'constant' },\n ], '');\n }\n const lastUnit = /\\s+last\\s+(\\d+)([dw]?)$/i.exec(tail);\n if (lastUnit) {\n if (lastUnit[2]) return null; // window already unit-complete\n return finish(context, context.pos, [\n { label: 'd', detail: 'days', type: 'constant' },\n { label: 'w', detail: 'weeks', type: 'constant' },\n ], '');\n }\n if (/\\s+from\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: '2026-01-01', apply: '2026-01-01 ', detail: 'start date (YYYY-MM-DD)', type: 'constant' }], '');\n }\n if (/\\s+from\\s+\\d{4}-\\d{2}-\\d{2}\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: 'to', apply: 'to ', detail: 'end date', type: 'keyword' }], '');\n }\n if (/\\s+to\\s+$/i.test(tail)) {\n return finish(context, context.pos, [{ label: '2026-03-31', detail: 'end date (YYYY-MM-DD)', type: 'constant' }], '');\n }\n const dims = wqlGroupingDimensions(head.target ?? '', head.family);\n const keywords: Completion[] = [\n { label: 'by {}', apply: 'by ', detail: dims.length ? 'group by dimensions' : `advisory: no grouping dimensions for find:${head.target}`, type: 'keyword' },\n ...(head.family === 'aggregate'\n ? [{ label: '.rollup()', apply: '.rollup(', detail: 'bucket period', type: 'keyword' as const }]\n : []),\n { label: 'last', apply: 'last ', detail: 'relative window: last <n>d|w', type: 'keyword' },\n { label: 'from', apply: 'from ', detail: 'date range: from YYYY-MM-DD [to YYYY-MM-DD]', type: 'keyword' },\n ...(head.family === 'find' ? [{ label: '|', apply: '| ', detail: 'presentation pipes: order by / select / limit', type: 'keyword' as const }] : []),\n ];\n return finish(context, from, chained(keywords, ' '), typed);\n };\n\n /** Presentation pipe zone (`| …`): clause keywords, then per-target\n * columns, asc/desc, `in <unit>`, numeric limit placeholder. */\n const pipeSlot = (context: CompletionContext, doc: string, scan: WqlScan, from: number, typed: string, head: Head): CompletionResult | null => {\n const text = doc.slice(scan.pipeFrom, context.pos);\n const orderM = /^\\s*order\\b/i.exec(text);\n if (orderM) {\n const rest = text.slice(orderM[0].length);\n const byM = /^\\s*by\\b/i.exec(rest);\n if (!byM) return finish(context, from, [{ label: 'by', apply: 'by ', type: 'keyword' }], typed);\n const last = rest.slice(byM[0].length).split(',').pop() ?? '';\n const words = last.trim().split(/\\s+/).filter(Boolean);\n const columns = pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const }));\n if (!words.length) return finish(context, from, columns, '');\n if (/\\s$/.test(last)) return finish(context, context.pos, DIR_OPTIONS, '');\n if (words.length >= 2) {\n if (/^(asc|desc)$/i.test(words[1])) return null;\n return finish(context, from, DIR_OPTIONS, typed);\n }\n return finish(context, from, columns, last.trim());\n }\n const selectM = /^\\s*select\\b/i.exec(text);\n if (selectM) {\n const last = text.slice(selectM[0].length).split(',').pop() ?? '';\n const words = last.trim().split(/\\s+/).filter(Boolean);\n if (!words.length) return finish(context, from, pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const })), '');\n if (/\\s$/.test(last)) {\n return UNIT_COLUMNS.has(words[0].toLowerCase())\n ? finish(context, context.pos, UNIT_OPTIONS, '')\n : finish(context, from, [], typed);\n }\n if (words.length >= 2) {\n const second = words[1].toLowerCase();\n if (second === 'in') return words[2] ? finish(context, from, UNIT_OPTIONS, words[2]) : finish(context, context.pos, UNIT_OPTIONS, '');\n if ('in'.startsWith(second)) return finish(context, context.pos, UNIT_OPTIONS, '');\n return null; // `col in unit` complete\n }\n return finish(context, from, pipeColumns(head.target).map((c) => ({ label: c, type: 'property' as const })), words[0]);\n }\n if (/^\\s*(limit|offset)\\b/i.test(text)) return null; // free numeric\n // Composer parity: the limit keyword inserts a numeric placeholder.\n const limitSnippet = snippetCompletion('limit ${10}', { label: 'limit', detail: 'cap result rows', type: 'keyword' });\n const kw: Completion[] = [\n { label: 'order by', apply: 'order by ', detail: head.target === 'session' ? 'advisory: order ignored for sessions' : 'sort rows', type: 'keyword' },\n { label: 'select', apply: 'select ', detail: SELECT_IGNORED.has(head.target ?? '') ? `advisory: select ignored for find:${head.target}` : 'choose columns', type: 'keyword' },\n ];\n return finish(context, from, [...chained(kw, ' '), limitSnippet], typed);\n };\n\n function inner(context: CompletionContext, replaceSelection = false): CompletionResult | Promise<CompletionResult | null> | null {\n const doc = context.state.doc.toString();\n const pos = context.pos;\n const word = context.matchBefore(/[\\w.*-]*/) ?? { from: pos, to: pos, text: '' };\n // Structural characters open the next slot immediately, no keystroke needed.\n const opens = word.from === word.to && pos > 0 && /[{,:|(!\"@]/.test(doc[pos - 1]);\n if (word.from === word.to && !context.explicit && !opens) return null;\n\n const scan = scanContext(doc, pos);\n if (scan.quoted && scan.depth === 0) return null; // free text inside a phrase\n\n // Selected-token replacement lists every slot alternative unfiltered.\n const typed = replaceSelection ? '' : word.text;\n\n // Colon heads (`:note{…}`, `:sum{metric:…}`) and the legacy word-colon head.\n const colonHeadM = /^[ \\t]*:[ \\t]*([A-Za-z][\\w-]*)/.exec(doc);\n const headM = colonHeadM ?? /^[ \\t]*([A-Za-z]+)[ \\t]*:[ \\t]*([A-Za-z0-9_.-]*)/.exec(doc);\n const head = colonHeadM\n ? resolveColonHead(colonHeadM[1]!)\n : headM ? resolveHead(headM[1]!, headM[2]!) : { family: 'aggregate' as const };\n\n if (scan.pipeFrom >= 0 && scan.depth === 0) return pipeSlot(context, doc, scan, word.from, typed, head);\n if (scan.depth > 0) return braceSlot(context, doc, scan, word.from, typed, head);\n\n // A '@' before the typed word means a dataset reference — offer only\n // datasets ('@to' must not surface 'toplist').\n const datasetTyped = word.from > 0 && doc[word.from - 1] === '@';\n const headPool = datasetTyped ? HEAD_OPTIONS.filter((o) => o.label.startsWith('@')) : HEAD_OPTIONS;\n const headTyped = datasetTyped ? '@' + typed : typed;\n\n const headFrom = datasetTyped ? word.from - 1 : word.from;\n\n if (!headM) return finish(context, headFrom, headPool.map((o) => headApply(o, false)), headTyped);\n\n if (colonHeadM) {\n // Before/inside the head word after ':': offer every head.\n if (pos <= colonHeadM[0].length) {\n return finish(context, headFrom, headPool.map((o) => headApply(o, true)), headTyped);\n }\n return suffixSlot(context, doc, scan, word.from, typed, head, colonHeadM[0].length);\n }\n\n const colonIdx = headM[0].indexOf(':');\n if (pos <= colonIdx) return finish(context, word.from, chained(LEGACY_HEAD_OPTIONS, ':'), typed);\n if (pos <= headM[0].length) {\n // Head target/metric slot: `last` the aggregator vs `last` the window\n // is disambiguated here — before/inside the head word it is the\n // aggregator; after the complete head it is a suffix (below). The\n // retired find:/rows: dispatch keywords offer nothing here.\n return metricHeadSlot(context, word.from, typed);\n }\n return suffixSlot(context, doc, scan, word.from, typed, head, headM[0].length);\n }\n\n /** A non-empty selection means \"replace this token\": offer every option for\n * the slot (unfiltered) over the selected range. */\n function source(context: CompletionContext): CompletionResult | Promise<CompletionResult | null> | null {\n const selection = context.state.selection.main;\n if (selection.empty) return inner(context);\n // Evaluate at the selection end so the slot resolved is the selected token's.\n const result = inner(new CompletionContext(context.state, selection.to, true), true);\n const widen = (r: CompletionResult | null) => r && { ...r, from: selection.from, to: selection.to, filter: false, validFor: undefined };\n return result instanceof Promise ? result.then(widen) : widen(result);\n }\n\n return source;\n}\n\nexport function wqlCompletion(options?: WqlCompletionOptions): Extension {\n return autocompletion({ override: [wqlCompletionSource(options)] });\n}\n\n// ── Language support ───────────────────────────────────────────────\n\n/**\n * Query-field colors, mapped onto the app's theme tokens so\n * the field follows light/dark mode: aggregator + structural keywords take\n * the primary hue, the metric takes accent, tag keys secondary, values\n * success-green, dimensions warning-ochre.\n */\nexport const wqlHighlightStyle = HighlightStyle.define([\n { tag: t.keyword, color: 'hsl(var(--primary))' },\n { tag: t.variableName, color: 'hsl(var(--accent-foreground))', fontWeight: '600' },\n { tag: t.propertyName, color: 'hsl(var(--secondary-foreground))' },\n { tag: t.string, color: 'hsl(var(--success))' },\n { tag: t.attributeName, color: 'hsl(var(--warning))' },\n { tag: t.number, color: 'hsl(var(--primary))' },\n { tag: t.unit, color: 'hsl(var(--muted-foreground))' },\n { tag: t.operator, color: 'hsl(var(--destructive))' },\n { tag: [t.bracket, t.punctuation], color: 'hsl(var(--muted-foreground))' },\n]);\n\nexport function wql(completionOptions?: WqlCompletionOptions) {\n return new LanguageSupport(wqlLanguage, [\n wqlCompletion(completionOptions),\n syntaxHighlighting(wqlHighlightStyle),\n ]);\n}\n","/**\n * WQL unit policy (wayfinder ticket 13, home per decision ticket 21).\n *\n * Recognition and conversion evidence live in the core catalog — this module\n * adds the wql application policy: strict conversion before arithmetic, the\n * system-default output table applied when the query has no `in <unit>`\n * directive, and errors (never pass-through) for unknown units and\n * dimension-incompatible conversions.\n *\n * Cutover notes (ticket 13): the old first-record-unit fallback and the\n * unknown/incompatible pass-through in `resolveDisplayUnit` are gone. The\n * host `kg | lb` widget preference is no longer a tier in the default chain —\n * `useAnalyticsUnitPreference` callers migrate to the system defaults under\n * ticket 19; no new callers allowed.\n */\n\nimport {\n SYSTEM_DEFAULT_OUTPUT_UNIT,\n UnitConversionError,\n convertViaCatalog,\n dimensionKeyOf,\n lookupUnit,\n systemDefaultUnit,\n} from '@bitcobblers/wod-wiki-core';\n\nexport {\n SYSTEM_DEFAULT_OUTPUT_UNIT,\n UnitConversionError,\n convertViaCatalog,\n dimensionKeyOf,\n lookupUnit,\n systemDefaultUnit,\n};\n\n/** Legacy 2-family vocabulary kept only as a type alias for existing\n * callers of the display seam; arithmetic dimensions come from the catalog. */\nexport type UnitFamily = 'mass' | 'distance';\n\n/** The fact-unit shape resolveOutputUnit reads. */\nexport interface UnitBearingFact {\n unit?: string;\n metricUnit?: string;\n}\n\n/** Display conversion for UI surfaces (RawPointsTable etc.): converts\n * within a shared dimension through the catalog, passes unknown or\n * cross-dimension values through unchanged instead of throwing. Arithmetic\n * must use {@link convertViaCatalog}. Ticket 19 migrates the remaining\n * display callers onto renderer formatting. */\nexport function convertDisplay(value: number, from: string | undefined, to: string | undefined): number {\n if (from === undefined || to === undefined || from === to) return value;\n const fromDim = dimensionKeyOf(from);\n if (!fromDim || fromDim !== dimensionKeyOf(to)) return value;\n try {\n return convertViaCatalog(value, from, to);\n } catch {\n return value;\n }\n}\n\n/** Dimension compatibility probe for display surfaces. */\nexport function getUnitFamily(unit: string | undefined): string | undefined {\n return unit ? dimensionKeyOf(unit) : undefined;\n}\n\nexport interface OutputUnitResolution {\n /** The resolved output unit — undefined means unitless / no conversion. */\n unit?: string;\n /** Whether fact values must be converted into `unit` before aggregation. */\n convert: boolean;\n /** Diagnostic when the directive is unusable for this result (unknown\n * unit, or dimension-incompatible with the selected observations). */\n error?: string;\n}\n\n/**\n * Resolve the output unit for an aggregate result (arithmetic contract §5):\n *\n * 1. an explicit `in <unit>` directive wins when it is a known unit and\n * dimensionally compatible with the observations; incompatible → error\n * for the affected calculation;\n * 2. otherwise the system default for the observations' dimension\n * (mass `kg`, distance `m`, duration `s`, …; ratio unitless);\n * 3. observations with no unit at all stay unitless — no first-record\n * fallback, no reinterpretation of stored measurements.\n */\nexport function resolveOutputUnit(\n facts: ReadonlyArray<UnitBearingFact>,\n {\n directive,\n preferred,\n }: { directive?: string; preferred?: string },\n): OutputUnitResolution {\n void preferred; // retired from the default chain (ticket 13); removed with ticket 19's caller migration\n\n const spellings = new Set<string>();\n for (const fact of facts) {\n const unit = fact.unit ?? fact.metricUnit;\n if (unit) spellings.add(unit);\n }\n\n // Determine the observations' shared dimension; unknown spellings are\n // errors — an explicit unknown unit is never passed through.\n let dimension: string | undefined;\n for (const spelling of spellings) {\n const dim = dimensionKeyOf(spelling);\n if (!dim) {\n return { error: `Unknown unit \"${spelling}\"`, convert: false };\n }\n if (dimension && dim !== dimension) {\n return { error: `Incompatible units in one calculation (${[...spellings].join(', ')})`, convert: false };\n }\n dimension = dim;\n }\n\n if (directive) {\n const directiveDim = dimensionKeyOf(directive);\n if (!directiveDim) {\n return { error: `Unknown unit \"${directive}\"`, convert: false };\n }\n if (dimension && directiveDim !== dimension) {\n return { error: `Output unit \"${directive}\" is not compatible with this result's dimension`, convert: false };\n }\n if (dimension) {\n return { unit: directive, convert: true };\n }\n // Dimensionless observations with a directive: nothing to convert.\n return { unit: directive, convert: false };\n }\n\n if (dimension) {\n const fallback = systemDefaultUnit(dimension as Parameters<typeof systemDefaultUnit>[0]);\n return { unit: fallback, convert: fallback !== undefined };\n }\n return { unit: undefined, convert: false };\n}\n","/**\n * Calendar — system-local civil calendar arithmetic over captured execution\n * contexts (wayfinder datadog-analytics ticket 12, per the time alignment\n * contract §§ Evaluation context, Calendar and duration windows).\n *\n * Calendar days run from local midnight to the next local midnight in the\n * context's timezone; weeks start on Monday. All arithmetic is component\n * math via the timezone's civil date — never multiplication by 86 400 000\n * ms, which mislabels DST-shifted days. Range endpoints are half-open:\n * start included, exclusive end; an inclusive `to` civil date is implemented\n * as an exclusive bound at the following local midnight.\n */\n\n/** One captured execution context: every relative window, bucket, and\n * boundary decision in a document run resolves against this one capture. */\nexport interface ExecutionContext {\n /** Captured current instant (ms epoch). */\n readonly instant: number;\n /** IANA timezone name of the effective system timezone. */\n readonly timeZone: string;\n}\n\n/** Capture the execution context — once per document run (ticket 19's\n * runner captures; QueryService consumes). */\nexport function captureContext(instant: number = Date.now(), timeZone: string = systemTimeZone()): ExecutionContext {\n return { instant, timeZone };\n}\n\n/** The system's IANA timezone. */\nexport function systemTimeZone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n } catch {\n return 'UTC';\n }\n}\n\nconst CIVIL_DATE = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nfunction civilParts(iso: string): { y: number; m: number; d: number } {\n const match = CIVIL_DATE.exec(iso);\n if (!match) throw new Error(`Invalid civil date: ${iso}`);\n return { y: Number(match[1]), m: Number(match[2]), d: Number(match[3]) };\n}\n\n// Formatter cache (ticket 20): constructing Intl.DateTimeFormat dominates\n// civil-date formatting cost — one formatter per (locale, options) key.\nconst dateFormatterCache = new Map<string, Intl.DateTimeFormat>();\n\nfunction dateFormatter(timeZone: string, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${timeZone}|${JSON.stringify(options)}`;\n let formatter = dateFormatterCache.get(key);\n if (!formatter) {\n formatter = new Intl.DateTimeFormat('en-CA', { timeZone, ...options });\n dateFormatterCache.set(key, formatter);\n }\n return formatter;\n}\n\n/** Civil YYYY-MM-DD of `instant` interpreted in `timeZone` — the calendar\n * the athlete lives in, not UTC. */\nexport function civilDateOf(instant: number, timeZone: string): string {\n const parts = dateFormatter(timeZone, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(instant);\n const get = (type: string) => parts.find((p) => p.type === type)?.value ?? '';\n const year = get('year');\n const month = get('month');\n const day = get('day');\n return `${year}-${month}-${day}`;\n}\n\n/** Add `days` (may be negative) to a civil date — pure date math across\n * month/year boundaries and leap days; no timezone involved. */\nexport function civilDateAdd(iso: string, days: number): string {\n const { y, m, d } = civilParts(iso);\n const shifted = new Date(Date.UTC(y, m - 1, d + days));\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${shifted.getUTCFullYear()}-${pad(shifted.getUTCMonth() + 1)}-${pad(shifted.getUTCDate())}`;\n}\n\n/** Days between two civil dates (second minus first). */\nexport function civilDateDiff(a: string, b: string): number {\n const pa = civilParts(a);\n const pb = civilParts(b);\n return Math.round(\n (Date.UTC(pb.y, pb.m - 1, pb.d) - Date.UTC(pa.y, pa.m - 1, pa.d)) / 86_400_000,\n );\n}\n\n/** The Monday-starting civil week of a civil date. */\nexport function civilMonday(iso: string): string {\n const { y, m, d } = civilParts(iso);\n const dow = new Date(Date.UTC(y, m - 1, d)).getUTCDay(); // 0=Sunday\n const back = (dow + 6) % 7;\n return civilDateAdd(iso, -back);\n}\n\n/** Offset (ms) of `timeZone` at `instant`: local = UTC + offset. */\nfunction zonedOffset(instant: number, timeZone: string): number {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n }).formatToParts(instant);\n const get = (type: string) => Number(parts.find((p) => p.type === type)?.value ?? '0');\n const asUTC = Date.UTC(get('year'), get('month') - 1, get('day'), get('hour') % 24, get('minute'), get('second'));\n return asUTC - instant;\n}\n\n/** The instant of local midnight (00:00) starting civil date `iso` in\n * `timeZone` — component math that survives DST boundaries (a 23h or 25h\n * day still starts at its own local 00:00). */\nexport function zonedStartOfDay(iso: string, timeZone: string): number {\n const { y, m, d } = civilParts(iso);\n // Two-iteration fixpoint: guess UTC midnight, correct by the zone's offset,\n // re-correct — settles DST shift edges (23h/25h days still start 00:00 local).\n const guess = Date.UTC(y, m - 1, d);\n const first = guess - zonedOffset(guess, timeZone);\n return guess - zonedOffset(first, timeZone);\n}\n\n/** Local noon of civil date `iso` in `timeZone` — the presentation-only\n * representative instant for calendar buckets (never a join key). */\nexport function zonedNoon(iso: string, timeZone: string): number {\n return zonedStartOfDay(iso, timeZone) + 12 * 3_600_000;\n}\n\n/** A resolved range: [start, end). `endExclusive` marks the half-open\n * convention; `end === Number.MAX_SAFE_INTEGER` with `endExclusive ===\n * false` is the unbounded side. */\nexport interface ResolvedRange {\n readonly start: number;\n readonly end: number;\n /** True when `end` is an exclusive half-open bound (calendar windows and\n * captured-instant relative cutoffs). */\n readonly endExclusive: boolean;\n}\n\n/** Resolve a parsed query window against the captured context — the single\n * window→range mapping every execution path shares (time contract):\n *\n * - `last Nd`: N local dates including today — midnight N−1 dates back\n * through the captured current instant (inclusive cutoff, exclusive\n * encoding `instant + 1`). Never N×86 400 000 ms.\n * - `last Nw`: current Monday-start week plus N−1 preceding complete\n * weeks, through the captured instant. Never a rolling 7N-date window.\n * - explicit `from`/`to`: both named dates included in full — implemented\n * as an exclusive bound at the following local midnight. An open `to`\n * stays unbounded. Future ranges are preserved, never replaced.\n */\nexport function resolveWindowRange(w: { kind: 'relative'; size: number; unit: 'd' | 'w' } | { kind: 'range'; start: string; end?: string } | undefined, ctx: ExecutionContext): ResolvedRange | undefined {\n if (!w) return undefined;\n if (w.kind === 'relative') {\n const today = civilDateOf(ctx.instant, ctx.timeZone);\n const start = w.unit === 'd'\n ? civilDateAdd(today, -(w.size - 1))\n : civilDateAdd(civilMonday(today), -7 * (w.size - 1));\n return {\n start: zonedStartOfDay(start, ctx.timeZone),\n end: ctx.instant + 1, // inclusive captured instant, exclusive encoding\n endExclusive: true,\n };\n }\n const start = zonedStartOfDay(w.start, ctx.timeZone);\n if (w.end === undefined) {\n return { start, end: Number.MAX_SAFE_INTEGER, endExclusive: false };\n }\n // Inclusive `to` civil date → exclusive bound at the following local midnight.\n return {\n start,\n end: zonedStartOfDay(civilDateAdd(w.end, 1), ctx.timeZone),\n endExclusive: true,\n };\n}\n\n/** Half-open membership predicate: start included, exclusive end excluded\n * (a metric exactly at Monday midnight belongs only to the new week).\n * Unbounded ends admit everything. */\nexport function inRange(instant: number, range: ResolvedRange | undefined): boolean {\n if (!range) return true;\n if (instant < range.start) return false;\n if (range.endExclusive) return instant < range.end;\n return instant <= range.end;\n}\n","/**\n * Query documents (wayfinder datadog-analytics ticket 17, per the query\n * documents contract).\n *\n * A query block is a self-contained document:\n *\n * defaults [by {dim, …}] [window]\n * <ident> = <query | expression> [(normalize <bucket>)] [-> <unit>]\n * show <ident>, …\n *\n * A body that carries no document constructs parses as a DEGENERATE document\n * wrapping the single query — zero behavior change for legacy bodies\n * (decision ticket 22: every widget body is a document; single-line bodies\n * are degenerate documents).\n *\n * Evaluation order follows the reference graph; forward references are\n * allowed; cycles are a document-level diagnostic.\n */\n\nimport { parseQuery, type AnyParsedQuery, type QueryWindow } from './wql';\n\nexport interface DocumentDefaults {\n groupBy?: string[];\n window?: QueryWindow;\n}\n\nexport interface DocumentFormula {\n expression: string;\n /** Referenced assignment names, in appearance order. */\n references: string[];\n /** Persisted normalization intent (user-selected target bucket). */\n normalize?: string;\n /** Explicit output unit directive. */\n unit?: string;\n}\n\nexport interface DocumentAssignment {\n name: string;\n kind: 'query' | 'formula';\n /** For kind 'query' — the parsed query of any family (defaults merged at run). */\n queryText?: string;\n parsed?: AnyParsedQuery;\n formula?: DocumentFormula;\n raw: string;\n}\n\nexport interface QueryDocument {\n defaults?: DocumentDefaults;\n assignments: DocumentAssignment[];\n show: string[];\n /** True when the body carried no document constructs (legacy single query). */\n degenerate: boolean;\n}\n\nexport interface ParsedDocument {\n doc: QueryDocument;\n diagnostics: string[];\n}\n\n/** A formula expression: identifiers bound to other assignments, arithmetic,\n * parentheses, numeric literals, and corr(a, b). */\nconst FORMULA_CHARS = /^[\\w\\s.+\\-*/(),]+$/;\n\n/** Extract referenced assignment names from a formula expression. */\nfunction referencesOf(expression: string, known: Set<string>): string[] {\n const refs: string[] = [];\n for (const match of expression.matchAll(/[A-Za-z_][\\w-]*/g)) {\n const name = match[0];\n if (known.has(name) && !refs.includes(name)) refs.push(name);\n }\n return refs;\n}\n\n/**\n * Parse a query-document body. Never throws: syntax problems surface as\n * diagnostics so one broken block never takes down a surface.\n */\nexport function parseDocument(text: string): ParsedDocument {\n const diagnostics: string[] = [];\n const lines = text.split('\\n').map((l) => l.trim()).filter((l) => l.length > 0 && !l.startsWith('//'));\n\n const defaults: DocumentDefaults = {};\n let hasDefaults = false;\n const assignments: DocumentAssignment[] = [];\n let show: string[] | undefined;\n let degenerate = false;\n\n const known = new Set<string>();\n\n for (const line of lines) {\n // defaults [by {…}] [window]\n if (line.startsWith('defaults ')) {\n hasDefaults = true;\n const rest = line.slice('defaults '.length).trim();\n const byMatch = /by\\s*\\{([^}]*)\\}/.exec(rest);\n if (byMatch) {\n defaults.groupBy = byMatch[1]!.split(',').map((d) => d.trim()).filter(Boolean);\n }\n const lastMatch = /last\\s+(\\d+)\\s*(d|w)/.exec(rest);\n if (lastMatch) {\n defaults.window = { kind: 'relative', size: Number(lastMatch[1]), unit: lastMatch[2] as 'd' | 'w' };\n }\n const fromMatch = /from\\s+(\\d{4}-\\d{2}-\\d{2})(?:\\s+to\\s+(\\d{4}-\\d{2}-\\d{2}))?/.exec(rest);\n if (fromMatch) {\n defaults.window = { kind: 'range', start: fromMatch[1]!, end: fromMatch[2] };\n }\n continue;\n }\n\n // show a, b\n if (line.startsWith('show ')) {\n show = line.slice('show '.length).split(',').map((s) => s.trim()).filter(Boolean);\n continue;\n }\n\n // <ident> = body\n const assign = /^([A-Za-z_][\\w-]*)\\s*=\\s*(.+)$/.exec(line);\n if (assign) {\n const name = assign[1]!;\n const body = assign[2]!.trim();\n known.add(name);\n\n // (normalize <bucket>) intent + -> <unit> directive\n const unitMatch = /->\\s*([\\w/%.]+)\\s*$/.exec(body);\n const normalizeMatch = /\\(normalize\\s+([^)]+)\\)/.exec(body);\n const expression = body\n .replace(/->\\s*[\\w/%.]+\\s*$/, '')\n .replace(/\\(normalize\\s+[^)]+\\)/, '')\n .trim();\n\n // Colon heads (`:journal{…}`, `:sum{…}`), dataset references\n // (`@today | …`), and pipe stages route to the query parser;\n // legacy `sum:`/`find:` heads keep their diagnostics.\n const looksLikeQuery = /^(sum|avg|min|max|count|last|delta|find|rows)\\b|^[:@|]/.test(expression);\n\n if (looksLikeQuery) {\n const parsed = parseQuery(expression);\n if (!parsed.error) {\n assignments.push({ name, kind: 'query', queryText: expression, parsed, raw: line });\n } else {\n diagnostics.push(`Assignment \"${name}\" is not a valid query`);\n }\n continue;\n }\n\n // Formula — must reference at least one known assignment and use\n // only expression characters.\n if (!FORMULA_CHARS.test(expression)) {\n diagnostics.push(`Assignment \"${name}\" has characters a formula cannot parse`);\n continue;\n }\n const formula: DocumentFormula = {\n expression,\n references: [],\n ...(normalizeMatch ? { normalize: normalizeMatch[1]!.trim() } : {}),\n ...(unitMatch ? { unit: unitMatch[1] } : {}),\n };\n assignments.push({ name, kind: 'formula', formula, raw: line });\n continue;\n }\n\n // Not a construct — legacy single-query body?\n degenerate = true;\n }\n\n // Degenerate: no document constructs → wrap the single query.\n if (!hasDefaults && show === undefined && !degenerate && assignments.length === 1 && assignments[0]!.kind === 'query') {\n // A bare single query is handled below.\n }\n if (!hasDefaults && show === undefined && assignments.length === 0) {\n const parsed = parseQuery(lines.join(' '));\n // Ticket 19: any family (aggregate / rows / find) runs degenerately.\n if (!parsed.error) {\n known.add('query');\n assignments.push({ name: 'query', kind: 'query', queryText: lines.join(' '), parsed, raw: lines.join(' ') });\n show = ['query'];\n degenerate = true;\n } else {\n diagnostics.push('Body is neither a valid query nor a valid document');\n }\n }\n\n // Resolve formula references AFTER all assignments are known (forward\n // references are legal); cycles are diagnostics.\n for (const assignment of assignments) {\n if (assignment.kind !== 'formula' || !assignment.formula) continue;\n assignment.formula.references = referencesOf(assignment.formula.expression, known);\n // Unknown identifiers are diagnostics, not silent zeros.\n for (const match of assignment.formula.expression.matchAll(/[A-Za-z_][\\w-]*/g)) {\n const name = match[0];\n if (!known.has(name)) {\n diagnostics.push(`Formula \"${assignment.name}\" references unknown name \"${name}\"`);\n }\n }\n if (assignment.formula.references.length === 0) {\n diagnostics.push(`Formula \"${assignment.name}\" references no named query or formula`);\n }\n }\n const cycle = findCycle(assignments);\n if (cycle) {\n diagnostics.push(`Reference cycle detected: ${cycle.join(' -> ')}`);\n }\n\n if (show === undefined) {\n // Default show: every query assignment (formulas surface when named).\n show = assignments.filter((a) => a.kind === 'query').map((a) => a.name);\n if (assignments.length > 0 && show.length === 0) show = [assignments[0]!.name];\n } else {\n for (const name of show) {\n if (!known.has(name)) diagnostics.push(`show references unknown name \"${name}\"`);\n }\n }\n\n return {\n doc: {\n ...(Object.keys(defaults).length > 0 ? { defaults } : {}),\n assignments,\n show,\n degenerate,\n },\n diagnostics,\n };\n}\n\nfunction findCycle(assignments: readonly DocumentAssignment[]): string[] | undefined {\n const formulas = new Map(assignments.filter((a) => a.kind === 'formula').map((a) => [a.name, a.formula!.references]));\n const state = new Map<string, 1 | 2>();\n const stack: string[] = [];\n const visit = (name: string): string[] | undefined => {\n const s = state.get(name);\n if (s === 2) return undefined;\n if (s === 1) {\n const start = stack.indexOf(name);\n return [...stack.slice(start === -1 ? 0 : start), name];\n }\n state.set(name, 1);\n stack.push(name);\n for (const ref of formulas.get(name) ?? []) {\n const cycle = visit(ref);\n if (cycle) return cycle;\n }\n stack.pop();\n state.set(name, 2);\n return undefined;\n };\n for (const name of formulas.keys()) {\n const cycle = visit(name);\n if (cycle) return cycle;\n }\n return undefined;\n}\n\n/** Lossless serialization: round-trips parse(serialize(parse(text))) to the\n * same document (used by dashboards and note rendering to persist intent). */\nexport function serializeDocument(doc: QueryDocument): string {\n if (doc.degenerate) {\n const only = doc.assignments[0];\n return only?.queryText ?? '';\n }\n const lines: string[] = [];\n if (doc.defaults) {\n const parts: string[] = [];\n if (doc.defaults.groupBy?.length) parts.push(`by {${doc.defaults.groupBy.join(', ')}}`);\n if (doc.defaults.window) {\n const w = doc.defaults.window;\n parts.push(w.kind === 'relative' ? `last ${w.size}${w.unit}` : `from ${w.start}${w.end ? ` to ${w.end}` : ''}`);\n }\n if (parts.length > 0) lines.push(`defaults ${parts.join(' ')}`);\n }\n for (const a of doc.assignments) {\n lines.push(a.raw);\n }\n if (doc.show.length > 0) lines.push(`show ${doc.show.join(', ')}`);\n return lines.join('\\n');\n}\n","/**\n * Document runner + formula evaluation (wayfinder datadog-analytics\n * ticket 17).\n *\n * - `FormulaEvaluator` is an INJECTED capability: the engine/app composition\n * adapts lang's calc Pratt evaluator behind it. `wql` ships a small\n * built-in pointwise arithmetic evaluator so documents evaluate without\n * the injection (add/sub/mul/div, corr) — never a dependency on lang.\n * - Post-aggregate formulas evaluate pointwise over the ALIGNMENT DOMAIN:\n * the intersection of input requested ranges and the union of observed\n * group tuples. Missing operands substitute zero, flagged as\n * missing-derived; missing-derived zeros are excluded from downstream\n * ordinary averages; division by zero propagates an error.\n * - `corr(a, b)` is paired-only over in-range positions; the pair count is\n * reported.\n */\n\nimport type { QueryWindow, PipelineSink } from './wql';\nimport type { Note, BlockIndexRow } from '@bitcobblers/wod-wiki-core';\nimport type { TabularResult, RowsRun, NoteContainer } from './QueryService';\nimport { parseDocument, type ParsedDocument, type QueryDocument, type DocumentAssignment } from './document';\n\n// ── Formula evaluation ──────────────────────────────────────────────────\n\n/** Presence provenance of one operand value at one aligned position. */\nexport interface OperandValue {\n value: number;\n /** True when the value was substituted for a missing input. */\n missingDerived: boolean;\n}\n\nexport type PointwiseInputs = Record<string, (position: number) => OperandValue | undefined>;\n\nexport interface FormulaEvaluation {\n value: number;\n missingDerived: boolean;\n error?: string;\n}\n\nexport interface FormulaEvaluator {\n /**\n * Evaluate `expression` at one aligned position. `inputs` maps referenced\n * assignment names to position accessors; a missing operand is `undefined`\n * (the evaluator substitutes zero and flags the result).\n */\n evaluate(expression: string, inputs: PointwiseInputs, position: number): FormulaEvaluation;\n}\n\n/** Built-in pointwise arithmetic evaluator (+ - * /, unary minus, corr-free). */\nexport function createBuiltinFormulaEvaluator(): FormulaEvaluator {\n const evalExpr = (expr: string, inputs: PointwiseInputs, position: number): FormulaEvaluation => {\n const trimmed = expr.trim();\n\n // Parenthesized group.\n if (trimmed.startsWith('(') && trimmed.endsWith(')')) {\n return evalExpr(trimmed.slice(1, -1), inputs, position);\n }\n\n // Split on the lowest-precedence operator outside parentheses.\n const splitTop = (ops: string[]): { op: string; left: string; right: string } | undefined => {\n let depth = 0;\n for (let i = trimmed.length - 1; i >= 0; i--) {\n const ch = trimmed[i]!;\n if (ch === ')') depth++;\n else if (ch === '(') depth--;\n else if (depth === 0 && ops.includes(ch) && i > 0) {\n const op = ch;\n const left = trimmed.slice(0, i);\n const right = trimmed.slice(i + 1);\n if (left.trim() && right.trim()) return { op, left, right };\n }\n }\n return undefined;\n };\n\n const add = splitTop(['+']);\n if (add) {\n if (add.op === '+') {\n const l = evalExpr(add.left, inputs, position);\n const r = evalExpr(add.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value + r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n const sub = splitTop(['-']);\n if (sub && sub.op === '-') {\n const l = evalExpr(sub.left, inputs, position);\n const r = evalExpr(sub.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value - r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n const mul = splitTop(['*']);\n if (mul) {\n if (mul.op === '*') {\n const l = evalExpr(mul.left, inputs, position);\n const r = evalExpr(mul.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n return { value: l.value * r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n const div = splitTop(['/']);\n if (div) {\n if (div.op === '/') {\n const l = evalExpr(div.left, inputs, position);\n const r = evalExpr(div.right, inputs, position);\n if (l.error || r.error) return { value: 0, missingDerived: true, error: l.error ?? r.error };\n if (r.value === 0) {\n return { value: 0, missingDerived: false, error: 'Division by zero' };\n }\n return { value: l.value / r.value, missingDerived: l.missingDerived || r.missingDerived };\n }\n }\n\n // Numeric literal.\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return { value: Number(trimmed), missingDerived: false };\n }\n\n // Operand reference.\n const accessor = inputs[trimmed];\n if (accessor) {\n const operand = accessor(position);\n if (operand === undefined) return { value: 0, missingDerived: true };\n return operand;\n }\n return { value: 0, missingDerived: true, error: `Unknown reference \"${trimmed}\"` };\n };\n\n return {\n evaluate(expression, inputs, position) {\n try {\n return evalExpr(expression, inputs, position);\n } catch (e) {\n return { value: 0, missingDerived: true, error: e instanceof Error ? e.message : String(e) };\n }\n },\n };\n}\n\n// ── Document results ────────────────────────────────────────────────────\n\n/** Append document-default window/groupBy as textual suffixes before family\n * dispatch — defaults apply to find and pipeline documents too (a bare\n * `last 4w` block default must bound a `:journal{…}` content run). */\nexport function appendSuffixes(queryText: string, window: QueryWindow, groupBy?: string[]): string {\n let text = queryText;\n if (groupBy && groupBy.length > 0 && !/by\\s*\\{/.test(text)) {\n text += ` by {${groupBy.join(', ')}}`;\n }\n if (window.kind === 'relative' && !/\\blast\\b/.test(text)) {\n text += ` last ${window.size}${window.unit}`;\n } else if (window.kind === 'range' && !/\\bfrom\\b/.test(text)) {\n text += ` from ${window.start}${window.end ? ` to ${window.end}` : ''}`;\n }\n return text;\n}\n\n\n/** One ordered `show` output — widget-independent (ticket 19 consumes). */\nexport interface DocumentOutput {\n name: string;\n kind: 'aggregate' | 'formula' | 'find' | 'pipeline';\n /** Ticket 19 — TabularResult for cross-workout rows outputs. */\n table?: TabularResult;\n unit?: string;\n groupBy?: string[];\n window?: QueryWindow;\n /** Series for aggregate and formula outputs. */\n series?: Array<{ key: string; label: string; points: Array<{ ts: number; value: number; missing?: boolean; missingDerived?: boolean }>; unit?: string }>;\n /** Formula provenance: pair counts for corr, coverage notes. */\n pairs?: number;\n /** Content-plane payloads (find / find-source pipeline outputs). */\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n /** Highest-container page/note links keyed by note id. */\n containers?: Record<string, NoteContainer>;\n /** Session run cards (find:session / session-source pipelines). */\n runs?: RowsRun[];\n /** Terminal chart sink of a pipeline output (renderer dispatch). */\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface DocumentResult {\n outputs: DocumentOutput[];\n diagnostics: string[];\n}\n\n/** Payload surfaces the ticket-19 family dispatch may hand back. */\nexport interface FamilyRunPayload {\n series?: DocumentOutput['series'];\n table?: TabularResult;\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n containers?: Record<string, NoteContainer>;\n runs?: RowsRun[];\n unit?: string;\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface QueryDocumentRunnerOptions {\n /** Injected formula evaluator (lang's calc evaluator via the engine). */\n formulaEvaluator?: FormulaEvaluator;\n /** Host default window — used only when the document has none. */\n rangeStart?: number;\n rangeEnd?: number;\n /** Ticket 19 family dispatch: find queries surface FindQueryResult. */\n runFind?: (queryText: string) => Promise<FamilyRunPayload>;\n /** Pipeline queries (`:source | :fn | :chart`, `@dataset | …`) surface\n * the pipeline result — the host's QueryService.runPipeline. */\n runPipeline?: (queryText: string) => Promise<FamilyRunPayload>;\n}\n\nexport class QueryDocumentRunner {\n private readonly evaluator: FormulaEvaluator;\n constructor(\n private readonly runAggregate: (queryText: string, overrides: { groupBy?: string[]; window?: QueryWindow }) => Promise<{\n series?: DocumentOutput['series'];\n unit?: string;\n error?: string;\n window?: QueryWindow;\n }>,\n options: QueryDocumentRunnerOptions = {},\n ) {\n this.options = options;\n this.evaluator = options.formulaEvaluator ?? createBuiltinFormulaEvaluator();\n }\n private readonly options: QueryDocumentRunnerOptions;\n\n /** Parse → validate → evaluate in reference order → ordered outputs. */\n async run(text: string): Promise<DocumentResult> {\n const parsed: ParsedDocument = parseDocument(text);\n const diagnostics = [...parsed.diagnostics];\n const doc: QueryDocument = parsed.doc;\n const outputs: DocumentOutput[] = [];\n\n const values = new Map<string, { byPosition: Map<number, OperandValue>; unit?: string; groupKeys: string[] }>();\n\n const evaluate = async (assignment: DocumentAssignment): Promise<void> => {\n if (assignment.kind === 'query') {\n const merged = this.mergeDefaults(assignment, doc);\n // Family dispatch: content nouns never aggregate; pipelines\n // run their source→transform→sink chain on the host.\n const parsedFamily = assignment.parsed?.family;\n if (parsedFamily === 'find') {\n const text = merged.window\n ? appendSuffixes(merged.queryText, merged.window, merged.groupBy)\n : merged.queryText;\n const findRun = (await this.options?.runFind?.(text)) ?? {\n error: 'find queries are not supported by this host',\n };\n outputs.push({\n name: assignment.name,\n kind: 'find',\n ...(findRun.notes ? { notes: findRun.notes } : {}),\n ...(findRun.blocks ? { blocks: findRun.blocks } : {}),\n ...(findRun.efforts ? { efforts: findRun.efforts } : {}),\n ...(findRun.containers ? { containers: findRun.containers } : {}),\n ...(findRun.runs ? { runs: findRun.runs } : {}),\n ...(findRun.table ? { table: findRun.table } : {}),\n ...(findRun.unit ? { unit: findRun.unit } : {}),\n ...(findRun.error ? { error: findRun.error } : {}),\n });\n return;\n }\n // NOTE: no 'rows' family exists in AnyParsedQuery — textual\n // rows: heads are retired at the parser, so no host dispatch.\n if (parsedFamily === 'pipeline') {\n const text = merged.window\n ? appendSuffixes(merged.queryText, merged.window, merged.groupBy)\n : merged.queryText;\n const pipelineRun = (await this.options?.runPipeline?.(text)) ?? {\n error: 'pipeline queries are not supported by this host',\n };\n // A numeric pipeline stage feeds downstream formulas.\n const byPosition = new Map<number, OperandValue>();\n for (const s of pipelineRun.series ?? []) {\n for (const point of s.points) {\n if (!point.missing) byPosition.set(point.ts, { value: point.value, missingDerived: false });\n }\n }\n if (byPosition.size > 0) {\n values.set(assignment.name, { byPosition, unit: pipelineRun.unit, groupKeys: (pipelineRun.series ?? []).map((s) => s.key) });\n }\n outputs.push({\n name: assignment.name,\n kind: 'pipeline',\n ...(pipelineRun.series ? { series: pipelineRun.series } : {}),\n ...(pipelineRun.table ? { table: pipelineRun.table } : {}),\n ...(pipelineRun.notes ? { notes: pipelineRun.notes } : {}),\n ...(pipelineRun.blocks ? { blocks: pipelineRun.blocks } : {}),\n ...(pipelineRun.efforts ? { efforts: pipelineRun.efforts } : {}),\n ...(pipelineRun.containers ? { containers: pipelineRun.containers } : {}),\n ...(pipelineRun.runs ? { runs: pipelineRun.runs } : {}),\n ...(pipelineRun.unit ? { unit: pipelineRun.unit } : {}),\n ...(pipelineRun.chart ? { chart: pipelineRun.chart } : {}),\n ...(pipelineRun.error ? { error: pipelineRun.error } : {}),\n });\n return;\n }\n const run = await this.runAggregate(merged.queryText, {\n groupBy: merged.groupBy,\n window: merged.window,\n });\n const series = run.series ?? [];\n // Record positions for downstream formulas.\n const byPosition = new Map<number, OperandValue>();\n for (const s of series) {\n for (const point of s.points) {\n if (!point.missing) {\n byPosition.set(point.ts, { value: point.value, missingDerived: false });\n }\n }\n }\n values.set(assignment.name, { byPosition, unit: run.unit, groupKeys: series.map((s) => s.key) });\n outputs.push({\n name: assignment.name,\n kind: 'aggregate',\n unit: run.unit,\n ...(doc.defaults?.groupBy ? { groupBy: doc.defaults.groupBy } : {}),\n ...(merged.window ? { window: merged.window } : {}),\n series,\n ...(run.error ? { error: run.error } : {}),\n });\n return;\n }\n\n // Formula — pointwise over the union of the inputs' positions.\n const formula = assignment.formula!;\n const inputs: PointwiseInputs = {};\n const positions = new Set<number>();\n for (const ref of formula.references) {\n const input = values.get(ref);\n if (!input) {\n diagnostics.push(`Formula \"${assignment.name}\" references unavailable input \"${ref}\"`);\n return;\n }\n for (const position of input.byPosition.keys()) positions.add(position);\n inputs[ref] = (position) => input.byPosition.get(position);\n }\n const byPosition = new Map<number, OperandValue>();\n let error: string | undefined;\n let pairCount: number | undefined;\n if (formula.expression.startsWith('corr(') && formula.expression.endsWith(')')) {\n // corr(a, b): Pearson over paired in-range positions —\n // either-side-missing pairs are excluded (paired-only).\n const [aName, bName] = formula.expression.slice(5, -1).split(',').map((s) => s.trim());\n const a = values.get(aName!)?.byPosition;\n const b = values.get(bName!)?.byPosition;\n if (!a || !b) {\n diagnostics.push(`corr(\"${aName}\", \"${bName}\") references unavailable inputs`);\n return;\n }\n const pairs: Array<[number, number]> = [];\n for (const [position, av] of a) {\n const bv = b.get(position);\n if (bv && !av.missingDerived && !bv.missingDerived) pairs.push([av.value, bv.value]);\n }\n pairCount = pairs.length;\n if (pairs.length < 2) {\n outputs.push({\n name: assignment.name, kind: 'formula', pairs: pairCount,\n error: 'corr needs at least two paired positions',\n });\n values.set(assignment.name, { byPosition: new Map(), groupKeys: [] });\n return;\n }\n const mean = (xs: number[]) => xs.reduce((s, v) => s + v, 0) / xs.length;\n const ma = mean(pairs.map(([x]) => x));\n const mb = mean(pairs.map(([, y]) => y));\n let cov = 0, va = 0, vb = 0;\n for (const [x, y] of pairs) {\n cov += (x - ma) * (y - mb);\n va += (x - ma) ** 2;\n vb += (y - mb) ** 2;\n }\n if (va === 0 || vb === 0) {\n outputs.push({\n name: assignment.name, kind: 'formula', pairs: pairCount,\n error: 'corr is undefined for zero-variance inputs',\n });\n values.set(assignment.name, { byPosition: new Map(), groupKeys: [] });\n return;\n }\n const value = cov / Math.sqrt(va * vb);\n byPosition.set(0, { value, missingDerived: false });\n outputs.push({ name: assignment.name, kind: 'formula', pairs: pairCount, series: [{ key: 'corr', label: 'corr', points: [{ ts: 0, value }] }] });\n values.set(assignment.name, { byPosition, groupKeys: ['corr'] });\n return;\n }\n\n for (const position of [...positions].sort((a, b) => a - b)) {\n const evaluation = this.evaluator.evaluate(formula.expression, inputs, position);\n if (evaluation.error) {\n error = evaluation.error;\n continue;\n }\n byPosition.set(position, { value: evaluation.value, missingDerived: evaluation.missingDerived });\n }\n const series = [{\n key: assignment.name,\n label: assignment.name,\n points: [...byPosition.entries()].map(([ts, v]) => ({\n ts,\n value: v.value,\n ...(v.missingDerived ? { missingDerived: true } : {}),\n })),\n }];\n values.set(assignment.name, { byPosition, unit: formula.unit, groupKeys: [assignment.name] });\n outputs.push({\n name: assignment.name,\n kind: 'formula',\n ...(formula.unit ? { unit: formula.unit } : {}),\n series,\n ...(error ? { error } : {}),\n });\n };\n\n // Evaluation follows the reference graph; cycles were diagnosed at\n // parse. Iterate to a fixpoint over unordered assignments.\n const pending = [...doc.assignments];\n let progressed = true;\n const evaluated = new Set<string>();\n while (pending.length > 0 && progressed) {\n progressed = false;\n for (let i = pending.length - 1; i >= 0; i--) {\n const assignment = pending[i]!;\n const refs = assignment.formula?.references ?? [];\n if (refs.every((r) => evaluated.has(r))) {\n await evaluate(assignment);\n evaluated.add(assignment.name);\n pending.splice(i, 1);\n progressed = true;\n }\n }\n }\n\n // Keep only ordered show outputs (plus diagnostics).\n const shown = new Set(doc.show);\n return {\n outputs: outputs.filter((o) => shown.has(o.name)),\n diagnostics,\n };\n }\n\n /** Defaults precedence (ticket 17): explicit per-query range/grouping >\n * block defaults > host. Explicit per-query by{} fully replaces block\n * grouping — never merges. */\n private mergeDefaults(\n assignment: DocumentAssignment,\n doc: QueryDocument,\n ): { queryText: string; groupBy?: string[]; window?: QueryWindow } {\n const parsed = assignment.parsed;\n const aggregateGroupBy = parsed?.family === 'aggregate' ? parsed.groupBy : undefined;\n const groupBy = aggregateGroupBy?.length ? aggregateGroupBy : doc.defaults?.groupBy;\n // Pipelines carry no defaultable window — their source query owns\n // one; aggregates/finds fall back to the document default as before.\n const window = (parsed && parsed.family !== 'pipeline' ? parsed.window : undefined) ?? doc.defaults?.window;\n return {\n queryText: assignment.queryText ?? '',\n ...(groupBy ? { groupBy } : {}),\n ...(window ? { window } : {}),\n };\n }\n}\n","/**\n * QueryDocumentRunner — the ONE execution path for query documents\n * (wayfinder datadog-analytics ticket 19, per the shared query execution\n * contract). Dashboard surfaces and embedded note query documents evaluate\n * through this runner via a host adapter; no surface runs queries itself.\n *\n * Per document run:\n * 1. token substitution (`$name` → active parameter values, raw text);\n * 2. parse as a QueryDocument (degenerate single query = legacy body);\n * 3. AST rollup inspection — `calc.*`-class targets (including pipeline\n * transform stages) trigger the host's rollup-ensure ONCE per run\n * (never string matching over query text);\n * 4. one captured execution context threads every window resolution;\n * 5. family dispatch: aggregate → aggregate run, find → runFind,\n * rows → runRows, pipeline → runPipeline.\n *\n * Zero browser dependencies — stores, catalog, and evaluator are injected.\n * Hosts that lack a family capability surface a diagnostic on the output —\n * never a silent empty result.\n */\n\nimport type { EventRecord, Note, BlockIndexRow } from '@bitcobblers/wod-wiki-core';\nimport { QueryDocumentRunner as FormulaAwareRunner, type DocumentResult, type DocumentOutput, type FormulaEvaluator, type FamilyRunPayload, appendSuffixes } from './documentRunner';\nimport { parseDocument, serializeDocument } from './document';\nimport { captureContext, type ExecutionContext } from './calendar';\nimport type { DocumentAssignment } from './document';\nimport type { AnyParsedQuery, QueryWindow } from './wql';\nimport type { RowsRun, TabularResult, NoteContainer } from './QueryService';\n\nexport interface RollupTarget {\n /** The calc target key, e.g. `calc.acwr`. */\n key: string;\n}\n\n/** Host-populated page source dataset: named standard sources (`@session`,\n * `@today`, user names include `@`) resolved in memory before queries run. */\nexport interface PageSourceEntry {\n events: EventRecord[];\n notes: Note[];\n}\n\n/**\n * PageSourceRegistry — the host's named page-source store (ticket 5).\n * Constructed/populated ONCE per page load / run context, BEFORE child\n * queries evaluate. Dataset pipeline stages (`@today | :sum{…}`) read it\n * synchronously through `QueryServiceStores.datasetStore` — no database\n * roundtrip downstream.\n */\nexport class PageSourceRegistry extends Map<string, PageSourceEntry> {\n /** QueryService datasetStore seam alias — names include the `@`. */\n getDataset(name: string): PageSourceEntry | undefined {\n return this.get(name);\n }\n}\n\nexport interface QueryDocumentRunnerHost {\n runAggregate(queryText: string, overrides: {\n groupBy?: string[];\n window?: QueryWindow;\n context?: ExecutionContext;\n }): Promise<{\n series?: DocumentOutput['series'];\n unit?: string;\n error?: string;\n }>;\n runFind?(queryText: string, context?: ExecutionContext): Promise<{\n kind: 'find';\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: unknown[];\n containers?: Record<string, NoteContainer>;\n runs?: RowsRun[];\n table?: TabularResult;\n unit?: string;\n error?: string;\n }>;\n /** Pipeline execution (`:source | :fn | :chart`, `@dataset | …`) — the\n * host's QueryService.runPipeline. */\n runPipeline?(queryText: string, context?: ExecutionContext): Promise<FamilyRunPayload>;\n /** Injected formula evaluator override (engine/app composition adapts\n * lang's calc evaluator); the built-in pointwise evaluator otherwise. */\n formulaEvaluator?: FormulaEvaluator;\n /** Host rollup driver: recompute-on-open for `calc.*` facts. Must skip\n * already-up-to-date prerequisites (no ensure→refresh loop). */\n rollupEnsure?: () => Promise<void>;\n}\n\nexport interface SharedRunnerOptions {\n formulaEvaluator?: FormulaEvaluator;\n /** One captured execution context per document run (ticket 12). */\n context?: ExecutionContext;\n /** Host default range — applies only when the document has no window. */\n rangeStart?: number;\n rangeEnd?: number;\n /** Active token values (frontmatter controls, dashboard controls). */\n tokens?: Record<string, string>;\n}\n\nconst ROLLUP_TARGETS = ['calc.acwr', 'calc.monotony', 'calc.strain'];\n\nexport class QueryDocumentRunner {\n private readonly host: QueryDocumentRunnerHost;\n private readonly initialOptions: SharedRunnerOptions;\n\n constructor(host: QueryDocumentRunnerHost, options: SharedRunnerOptions = {}) {\n this.host = host;\n this.initialOptions = options;\n }\n\n /**\n * Run one document. `runOptions` override construction-time captures\n * (tokens, context) — one capture per run. Each run gets its OWN\n * evaluation snapshot: overlapping runs (one awaiting rollupEnsure while\n * another executes) can never borrow each other's context.\n */\n async run(text: string, runOptions: SharedRunnerOptions = {}): Promise<DocumentResult> {\n const captured: SharedRunnerOptions = {\n ...this.initialOptions,\n ...runOptions,\n tokens: { ...this.initialOptions.tokens, ...runOptions.tokens },\n // One captured execution context per run (ticket 12): callers\n // that supply none still get a single capture for the run.\n context: runOptions.context ?? this.initialOptions.context ?? captureContext(),\n };\n\n // 1. Token substitution — raw text at execution time.\n const substituted = substituteTokens(text, captured.tokens ?? {});\n\n // 3. AST rollup inspection on the substituted text: a calc.* target\n // in the parsed head — including pipeline transform stages — triggers\n // the host ensure exactly once.\n const parsed = parseDocument(substituted);\n if (parsed.doc.assignments.some((a: DocumentAssignment) => consumesRollupFacts(a.parsed))) {\n await this.host.rollupEnsure?.();\n }\n\n // 4+5. Document evaluation — the formula-aware runner (ticket 17)\n // drives semantics; its hooks bind THIS run's snapshot. Missing host\n // capabilities surface the diagnostic on the output — never a silent\n // empty result.\n const formulaRunner = new FormulaAwareRunner(async (queryText, overrides) => {\n if (overrides.window) {\n queryText = appendSuffixes(queryText, overrides.window, overrides.groupBy);\n }\n return this.host.runAggregate(queryText, { context: captured.context, window: overrides.window });\n }, {\n // The injected evaluator (ticket 17 seam) wins; the host may also\n // carry one; otherwise the built-in evaluates.\n formulaEvaluator: captured.formulaEvaluator ?? this.host.formulaEvaluator,\n runFind: async (queryText) => {\n const res = await this.host.runFind?.(queryText, captured.context);\n return res ?? { error: 'find queries are not supported by this host' };\n },\n runPipeline: async (queryText) => {\n const res = await this.host.runPipeline?.(queryText, captured.context);\n return res ?? { error: 'pipeline queries are not supported by this host' };\n },\n });\n return formulaRunner.run(substituted);\n }\n}\n\n/** Substitute `$name` tokens with active parameter values (raw text). */\nexport function substituteTokens(text: string, tokens: Record<string, string>): string {\n return text.replace(/\\$([A-Za-z_][\\w-]*)/g, (match, name: string) => {\n const value = tokens[name];\n return value !== undefined ? value : match;\n });\n}\n\n/**\n * AST rollup inspection (replaces `.includes('calc.')` string sniffing):\n * true when the parsed head's metric — a pipeline's source aggregate metric\n * or any transform stage's — is a calc target whose derivation depends on\n * workload rollup facts.\n */\nexport function consumesRollupFacts(parsed: AnyParsedQuery | undefined): boolean {\n if (!parsed) return false;\n if (parsed.family === 'aggregate') return ROLLUP_TARGETS.includes(parsed.metric);\n if (parsed.family === 'pipeline') {\n if (parsed.source.kind === 'query' && parsed.source.query.family === 'aggregate'\n && ROLLUP_TARGETS.includes(parsed.source.query.metric)) return true;\n return parsed.transforms.some((t) => ROLLUP_TARGETS.includes(t.metric));\n }\n return false;\n}\n\n/** Re-export for surface parity with the ticket-17 module. */\nexport { parseDocument, serializeDocument };\n","/**\n * Workout derivation helpers for WQL QueryService and cross-store joins.\n */\n\nimport {\n MetricType,\n fieldRefKey,\n normalizeFieldPath,\n valueKindOf,\n type AnalyticsDataPoint,\n type FieldRef,\n type ResultOrigin,\n type StoredOutputStatement,\n type EventRecord,\n} from '@bitcobblers/wod-wiki-core';\n\n/**\n * Map a summary projection name to its Canonical Metric Key — the one key two\n * workouts must share for an aggregate to be compared across them. Same key\n * in fact rows and display. 'Total Volume' → 'totalVolume', 'TIS' → 'tis'.\n */\nexport function resolveCanonicalMetricKey(projectionName: string): string {\n const words = projectionName.trim().split(/[^a-zA-Z0-9]+/).filter(Boolean);\n return words\n .map((word, index) =>\n index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1),\n )\n .join('');\n}\n\n/**\n * Identity of the block a result belongs to, stamped on every fact row.\n */\nexport interface SummaryFactIdentity {\n noteId: string;\n resultId: string;\n /** Actionable occurrence and saved revision that produced the result. */\n blockId?: string;\n blockVersion?: number;\n /** Content-stable cross-note join key. */\n blockContentId?: string;\n /** Which surface produced the result; trend queries exclude 'playground' by default. */\n origin?: ResultOrigin;\n /** FK to the `page` store (copied from the parent note). */\n pageId?: string;\n /**\n * Canonical workout time — WorkoutResult.createdAt (true workout end).\n * Every fact row carries it as `timestamp` so time-range queries mean\n * \"when the workout happened\", never \"when the metric was derived\".\n */\n workoutTimestamp?: number;\n}\n\n/** Logs shape read by normalizeSummaryFacts (StoredOutputStatement-compatible). */\nexport interface SummaryFactSourceOutput {\n outputType?: string;\n metrics: readonly {\n type?: string;\n value?: unknown;\n image?: string;\n unit?: string;\n /** Summary-processor payload (effortSlug / effortDiscipline / effortIntensityTier / …). */\n metadata?: Record<string, unknown>;\n }[];\n timeSpan?: { started?: number; ended?: number };\n}\n\n/** Read a string metadata field off the projection value metric, when present. */\nfunction metadataString(metadata: Record<string, unknown> | undefined, key: string): string | undefined {\n const value = metadata?.[key];\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/**\n * Read the typed field reference off a metric's metadata (ticket 11) —\n * `{ path, kind, dimension? }` stamped by PropertyMetric at authoring.\n * Defensive shape check: legacy logs predate the stamp.\n */\nfunction readFieldRef(metadata: Record<string, unknown> | undefined): FieldRef | undefined {\n const ref = metadata?.fieldRef;\n if (!ref || typeof ref !== 'object') return undefined;\n const { path, kind, dimension } = ref as Record<string, unknown>;\n if (typeof path !== 'string' || path.length === 0 || typeof kind !== 'string') return undefined;\n return { path, kind: kind as FieldRef['kind'], ...(typeof dimension === 'string' ? { dimension } : {}) };\n}\n\n/** Group-tag pairs from grouped composed-calc emission, key-sorted. */\nfunction readGroupTags(metadata: Record<string, unknown> | undefined): Record<string, string> | undefined {\n const tags = metadata?.groupTags;\n if (!tags || typeof tags !== 'object') return undefined;\n const entries = Object.entries(tags as Record<string, unknown>)\n .filter((pair): pair is [string, string] => typeof pair[1] === 'string' && pair[1].length > 0)\n .sort(([a], [b]) => (a < b ? -1 : 1));\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\n/**\n * One fold definition shared by every summary emitter: Tier-2 outputs\n * (outputType 'analytics') folded keep-last per rowKey\n * (`metricKey[:k=v…]`, group tags key-sorted — spec §7.1).\n */\ninterface FoldedSummary {\n projectionName: string;\n metricKey: string;\n value: number;\n unit?: string;\n effortSlug?: string;\n discipline?: string;\n intensityTier?: string;\n grade?: string;\n groupTags?: Record<string, string>;\n /** Typed identity (ticket 11) — carried so re-emission keeps ONE catalog\n * identity for the field instead of splitting path-only duplicates. */\n fieldRef?: FieldRef;\n rowKey: string;\n started?: number;\n}\n\nfunction foldSummaryOutputs(logs: readonly SummaryFactSourceOutput[]): Map<string, FoldedSummary> {\n const folded = new Map<string, FoldedSummary>();\n for (const output of logs) {\n if (output.outputType !== 'analytics') continue;\n const label = output.metrics.find(m => m.type === MetricType.Label);\n const value = output.metrics.find(m => m.type !== MetricType.Label && typeof m.value === 'number');\n if (!label || !value) continue;\n\n const projectionName = String(label.value ?? label.image ?? '');\n if (!projectionName) continue;\n // Key resolution order (ticket 11): explicitly-stamped canonicalKey\n // (calc seeds, wellness) keeps working unchanged; the typed field\n // reference (PropertyMetric fieldRef) is the normalized custom identity;\n // legacy projections fall back to name-derived keys during cutover.\n const fieldRef = readFieldRef(value.metadata);\n const metricKey = metadataString(value.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? resolveCanonicalMetricKey(projectionName);\n\n const effortSlug = metadataString(value.metadata, 'effortSlug');\n const discipline = metadataString(value.metadata, 'effortDiscipline');\n const intensityTier = metadataString(value.metadata, 'effortIntensityTier');\n const grade = metadataString(value.metadata, 'grade');\n\n // Grouped dims auto-tag; legacy per-effort projections tag `effort`\n // from their effortSlug metadata.\n const groupTags = readGroupTags(value.metadata) ?? (effortSlug ? { effort: effortSlug } : undefined);\n // Fold identity (ticket 11): typed variants fold under the full typed\n // key — path + kind + dimension — so two variants of one path never\n // fold together. Legacy rows keep the metricKey[:k=v…] shape.\n const rowKey = fieldRef\n ? `${fieldRefKey(fieldRef)}${groupTags ? ':' + Object.entries(groupTags).map(([k, v]) => `${k}=${v}`).join(':') : ''}`\n : groupTags\n ? `${metricKey}:${Object.entries(groupTags).map(([k, v]) => `${k}=${v}`).join(':')}`\n : metricKey;\n\n folded.set(rowKey, {\n projectionName, metricKey, value: value.value as number, unit: value.unit,\n effortSlug, discipline, intensityTier, grade, groupTags, rowKey,\n ...(fieldRef ? { fieldRef } : {}),\n started: output.timeSpan?.started,\n });\n }\n return folded;\n}\n\n/**\n * Convert Tier-2 summary outputs (outputType 'analytics') in a result's logs\n * into persisted fact rows — one row per result × Canonical Metric Key.\n */\nexport function normalizeSummaryFacts(\n logs: readonly SummaryFactSourceOutput[],\n identity: SummaryFactIdentity,\n): AnalyticsDataPoint[] {\n const now = Date.now();\n return Array.from(foldSummaryOutputs(logs).values(), (f) => ({\n id: `${identity.resultId}-${f.rowKey}-${now}`,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n origin: identity.origin,\n pageId: identity.pageId,\n grain: 'summary' as const,\n blockId: identity.blockId ?? '',\n blockVersion: identity.blockVersion ?? 0,\n resultId: identity.resultId,\n type: f.metricKey,\n value: f.value,\n unit: f.unit,\n label: f.projectionName,\n metricKey: f.metricKey,\n metricLabel: f.projectionName,\n metricUnit: f.unit,\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.discipline ? { discipline: f.discipline } : {}),\n ...(f.intensityTier ? { intensityTier: f.intensityTier } : {}),\n ...(f.grade ? { grade: f.grade } : {}),\n // Ticket 12: anchored at the producing scope (workout timestamp); the\n // derivation clock is only the degenerate last resort.\n timestamp: identity.workoutTimestamp ?? f.started ?? now,\n createdAt: now,\n }));\n}\n\n/** Identity for unified event-row emission — same fields as the fact identity. */\nexport type EventRowIdentity = SummaryFactIdentity;\n\nfunction firstEffortSlug(metrics: StoredOutputStatement['metrics']): string | undefined {\n const loose = metrics as readonly { type?: string; value?: unknown; metadata?: Record<string, unknown> }[];\n for (const m of loose) {\n const slug = metadataString(m.metadata, 'effortSlug');\n if (slug) return slug;\n if (m.type === 'effort' || m.type === MetricType.Effort) {\n if (typeof m.value === 'string' && m.value) return m.value;\n }\n }\n return undefined;\n}\n\n/**\n * Logs → event rows, 1:1 per statement (ticket 002). Deterministic ids\n * `${resultId}:${seq}`; query-critical scalars promoted top-level.\n *\n * Ticket 12 temporal anchoring: the row timestamp is the statement's OWN\n * timeSpan start when it has one — the workout-start timestamp never\n * relocates a metric observation whose own instant differs. Statements with\n * a timeSpan carry per-metric temporal anchors ('instant') so projection\n * groups each observation under its own date.\n */\nexport function toEventRows(\n logs: readonly StoredOutputStatement[],\n identity: SummaryFactIdentity,\n): EventRecord[] {\n return logs.map((output, seq) => ({\n id: `${identity.resultId}:${seq}`,\n resultId: identity.resultId,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n pageId: identity.pageId,\n origin: identity.origin,\n timestamp: output.timeSpan?.started ?? identity.workoutTimestamp ?? Date.now(),\n grain: 'event' as const,\n outputType: output.outputType ?? 'segment',\n effortSlug: firstEffortSlug(output.metrics),\n metrics: output.metrics,\n timeSpan: output.timeSpan?.started !== undefined\n ? { started: output.timeSpan.started, ended: output.timeSpan.ended }\n : undefined,\n metricTemporal: output.timeSpan?.started !== undefined\n ? output.metrics.map(() => ({ temporalKind: 'instant' as const, instant: output.timeSpan!.started }))\n : undefined,\n sourceBlockKey: output.sourceBlockKey,\n stackLevel: output.stackLevel,\n line: output.line,\n sourceStatementId: output.sourceStatementId,\n text: output.text,\n dialect: output.dialect,\n completionReason: output.completionReason,\n blockId: identity.blockId,\n blockVersion: identity.blockVersion,\n }));\n}\n\n/**\n * Tier-2 analytics outputs → deterministic summary event rows (tickets\n * 002/004): id `${resultId}:summary:${rowKey}` — no timestamp salt, so\n * re-finalize overwrites cleanly. Fold identity lives in metrics[0].metadata\n * (canonicalKey, effort metadata, groupTags) — shape-uniform with events.\n */\nexport function toSummaryEventRows(\n logs: readonly StoredOutputStatement[],\n identity: SummaryFactIdentity,\n): EventRecord[] {\n const now = Date.now();\n return Array.from(foldSummaryOutputs(logs).values(), (f) => ({\n id: `${identity.resultId}:summary:${f.rowKey}`,\n resultId: identity.resultId,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n pageId: identity.pageId,\n origin: identity.origin,\n // Ticket 12: a summary is anchored at its producing scope — the workout\n // timestamp. The derivation clock is only the degenerate last resort\n // (rebuilding must never date a summary from the replay clock — a\n // headless replay's output timeSpan is derivation time, not coverage).\n // Coverage descriptors that describe the represented observations land\n // with ticket 14's summaryCoverage.\n timestamp: identity.workoutTimestamp ?? f.started ?? now,\n grain: 'summary' as const,\n outputType: 'analytics',\n // Ticket 14 provenance: engine-authored summaries are calculated\n // representations covering their producing scope. NO fabricated\n // reducerStats: the fold retains only the value, and the contract forbids\n // inventing observedCount (undefined = insufficient evidence for\n // count/avg; sum-shaped operations answer from the value alone).\n representationKind: 'calculated' as const,\n summaryCoverage: {\n scope: (f.effortSlug ? 'effort' : f.groupTags ? 'partition' : 'workout') as 'effort' | 'partition' | 'workout',\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.groupTags ? { groupTags: f.groupTags } : {}),\n },\n effortSlug: f.effortSlug,\n metrics: [{\n type: f.metricKey,\n value: f.value,\n ...(f.unit ? { unit: f.unit } : {}),\n metadata: {\n canonicalKey: f.metricKey,\n ...(f.fieldRef ? { fieldRef: f.fieldRef, originalKey: f.projectionName } : {}),\n ...(f.effortSlug ? { effortSlug: f.effortSlug } : {}),\n ...(f.discipline ? { effortDiscipline: f.discipline } : {}),\n ...(f.intensityTier ? { effortIntensityTier: f.intensityTier } : {}),\n ...(f.groupTags ? { groupTags: f.groupTags } : {}),\n ...(f.grade ? { grade: f.grade } : {}),\n },\n }],\n blockId: identity.blockId,\n blockVersion: identity.blockVersion,\n }));\n}\n\n/**\n * Event row → flat fact currency for the four-stage plan (ticket 003):\n * one AnalyticsDataPoint per numeric metric. Canonical key resolution\n * mirrors the summary fold — metadata.canonicalKey first, name-derived\n * from the row's label metric as fallback. Deterministic fact ids:\n * `${record.id}:${factOrdinal}`.\n */\nexport function projectEventToFacts(record: EventRecord): AnalyticsDataPoint[] {\n const metrics = record.metrics as readonly {\n type?: string; value?: unknown; unit?: string; image?: string;\n metadata?: Record<string, unknown>;\n }[];\n\n if (record.grain === 'summary') {\n const m = metrics[0];\n if (!m || typeof m.value !== 'number') return [];\n // Ticket 11: canonicalKey (calc/wellness stamps) first, then the typed\n // field reference; legacy unkeyed summaries keep their type key.\n const fieldRef = readFieldRef(m.metadata);\n const metricKey = metadataString(m.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? (m.type ?? '');\n // Ticket 12: a civil-date temporal anchor keeps its recorded civil date\n // (never a fabricated midnight instant); instant facts group under the\n // anchor instant's civil date in the execution timezone at query time.\n const temporal = record.metricTemporal?.[0];\n // Partition identity (groupTags metadata) is a queryable dim set —\n // `{coach:greg}` / `by {coach}` resolve through factTagValue's fallback.\n const dims = readGroupTags(m.metadata);\n return [{\n id: `${record.id}:0`,\n noteId: record.noteId,\n blockContentId: record.blockContentId,\n origin: record.origin,\n pageId: record.pageId,\n grain: 'summary',\n blockId: record.blockId ?? '',\n blockVersion: record.blockVersion ?? 0,\n resultId: record.resultId,\n type: metricKey,\n value: m.value,\n unit: m.unit,\n label: metricKey,\n metricKey,\n metricLabel: metricKey,\n metricUnit: m.unit,\n ...(fieldRef ? { fieldRef } : {}),\n ...(temporal?.temporalKind === 'civil-date' && temporal.civilDate\n ? { metricDate: temporal.civilDate, temporalKind: 'civil-date' as const }\n : {}),\n // Wellness rows are reconcile-owned user recordings: DIRECT\n // observations even before ticket 14 stamps representationKind.\n representationKind: record.representationKind\n ?? (record.outputType === 'wellness' ? 'direct' as const : undefined),\n ...(record.summaryCoverage ? { summaryCoverage: record.summaryCoverage } : {}),\n ...(record.reducerStats ? { reducerStats: record.reducerStats } : {}),\n effortSlug: metadataString(m.metadata, 'effortSlug') ?? record.effortSlug,\n discipline: metadataString(m.metadata, 'effortDiscipline'),\n intensityTier: metadataString(m.metadata, 'effortIntensityTier'),\n grade: metadataString(m.metadata, 'grade'),\n ...(dims ? { dimensions: dims } : {}),\n timestamp: record.timestamp,\n createdAt: record.timestamp,\n }];\n }\n\n const label = metrics.find(m => m.type === MetricType.Label);\n const labelName = label ? String(label.value ?? label.image ?? '') : '';\n const effortMetric = metrics.find(m => m.type === MetricType.Effort || m.type === 'effort');\n const effortSlug = metadataString(metrics[0]?.metadata, 'effortSlug')\n ?? record.effortSlug\n ?? (effortMetric && typeof effortMetric.value === 'string' ? effortMetric.value : undefined);\n // A grade-typed metric (user-authored `grade: V8` or catalog-stamped)\n // names the observation's climb grade — the dim/filter twin of effortSlug.\n const gradeMetric = metrics.find(m => m.type === MetricType.Grade || m.type === 'grade');\n const rowGrade = metadataString(metrics[0]?.metadata, 'grade')\n ?? (gradeMetric && typeof gradeMetric.value === 'string' ? gradeMetric.value : undefined);\n\n const facts: AnalyticsDataPoint[] = [];\n // User-authored categorical dims: a property metric with a typed field\n // identity and a non-numeric value (e.g. `coach: greg`) projects no fact\n // of its own but names a dimension of every fact the statement emits —\n // queryable as `{coach:greg}` / `by {coach}` after factTagValue's switch.\n const dims: Record<string, string> = {};\n for (const m of metrics) {\n // Structural markers are display/compile-time plumbing, not user dims.\n if (m.type === MetricType.Label || m.type === 'label' || m.type === MetricType.Hint || m.type === 'hint') continue;\n const valueKind = valueKindOf(m.value);\n if (valueKind !== 'string' && valueKind !== 'boolean') continue;\n const ref = readFieldRef(m.metadata);\n const dimKey = ref?.path ?? normalizeFieldPath(m.type ?? '');\n if (dimKey) dims[dimKey] = String(m.value);\n }\n const rowDims = Object.keys(dims).length > 0 ? dims : undefined;\n metrics.forEach((m) => {\n if (m.type === MetricType.Label || m.type === 'label' || typeof m.value !== 'number') return;\n // Ticket 11 key resolution: explicitly-stamped canonicalKey first, then\n // the typed field reference — PropertyMetric variants survive under\n // their normalized path instead of collapsing into a pooled `custom`.\n // Legacy fallbacks for unlabeled legacy data only (pre-fieldRef logs):\n // label-derived key, `reps` for rep metrics, or the metric's own type.\n // A Custom-typed metric with no identity source no longer invents the\n // pooled `custom` key (finding 3.1) — it has no queryable identity, so\n // it projects no fact.\n const fieldRef = readFieldRef(m.metadata);\n const legacyFallback = m.type === MetricType.Rep || m.type === 'rep'\n ? 'reps'\n : (m.type ?? 'metric');\n if (!fieldRef && legacyFallback === 'custom') return;\n const metricKey = metadataString(m.metadata, 'canonicalKey')\n ?? fieldRef?.path\n ?? (labelName ? resolveCanonicalMetricKey(labelName) : legacyFallback);\n const ordinal = facts.length;\n // Ticket 12: the fact carries its own temporal anchor — the metric's\n // occurrence instant when the row has one, so a workout-start\n // timestamp never relocates an observation whose own date differs.\n const temporal = record.metricTemporal?.[ordinal];\n const factTimestamp = temporal?.temporalKind === 'instant' && temporal.instant !== undefined\n ? temporal.instant\n : record.timestamp;\n facts.push({\n id: `${record.id}:${ordinal}`,\n noteId: record.noteId,\n blockContentId: record.blockContentId,\n origin: record.origin,\n pageId: record.pageId,\n grain: 'event',\n blockId: record.blockId ?? '',\n blockVersion: record.blockVersion ?? 0,\n resultId: record.resultId,\n type: metricKey,\n value: m.value,\n unit: m.unit,\n label: labelName || metricKey,\n metricKey,\n metricLabel: labelName || metricKey,\n metricUnit: m.unit,\n ...(fieldRef ? { fieldRef } : {}),\n ...(temporal?.temporalKind === 'civil-date' && temporal.civilDate\n ? { metricDate: temporal.civilDate, temporalKind: 'civil-date' as const }\n : {}),\n effortSlug: metadataString(m.metadata, 'effortSlug') ?? effortSlug,\n discipline: metadataString(m.metadata, 'effortDiscipline'),\n intensityTier: metadataString(m.metadata, 'effortIntensityTier'),\n grade: metadataString(m.metadata, 'grade') ?? rowGrade,\n ...(rowDims ? { dimensions: rowDims } : {}),\n timestamp: factTimestamp,\n createdAt: record.timestamp,\n });\n });\n return facts;\n}\n\n/**\n * Inverse of {@link toEventRows}/{@link toSummaryEventRows}: rebuild the\n * statement stream a session's event rows represent. Event rows keep their\n * recorded order (id `${resultId}:${seq}`); summary rows follow in fold\n * order. Consumers that need the statement shape (replay, review display)\n * read events and call this — the store keeps only event rows.\n */\nexport function eventsToStoredLogs(events: readonly EventRecord[]): StoredOutputStatement[] {\n const ordered = [...events].sort((a, b) => {\n if (a.timestamp !== b.timestamp) return a.timestamp - b.timestamp;\n return a.id.localeCompare(b.id);\n });\n return ordered.map((row, index) => ({\n id: index,\n outputType: row.outputType as StoredOutputStatement['outputType'],\n timeSpan: row.timeSpan ?? { started: row.timestamp },\n metrics: row.metrics,\n sourceBlockKey: row.sourceBlockKey,\n stackLevel: row.stackLevel,\n line: row.line,\n sourceStatementId: row.sourceStatementId,\n text: row.text,\n dialect: row.dialect,\n completionReason: row.completionReason,\n }));\n}\n","/**\n * Contribution selection — grain integrity and coverage (wayfinder\n * datadog-analytics ticket 16, per the automatic grain contract).\n *\n * Coverage is chosen within each workout/result and typed metric — never by\n * an `any attributed record exists` check over the whole query:\n *\n * - Detail observations and substitute summaries of the same population are\n * duplicate representations: only one is aggregated (detail wins).\n * - A summary with a coverage partition (effort / group tags) disjoint from\n * the present detail substitutes exactly for its uncovered partition —\n * provided its retained statistics answer the requested operation.\n * - A retained population represented only by an insufficient summary\n * reports insufficient evidence — never an invented observation.\n * - Explicit grain filters are hard source constraints and report\n * limitations rather than silently switching representation.\n */\n\nimport type { AnalyticsDataPoint, ReducerStats, SummaryCoverage } from '@bitcobblers/wod-wiki-core';\nimport type { Aggregator } from './wql';\n\n/** Compact coverage references carried on aggregate results (ticket 16\n * explainability; ticket 18's drill-down consumes the on-demand detail). */\nexport interface CoverageReport {\n /** (resultId, metric) populations selected as detail observations. */\n detailPopulations: number;\n /** Substitute summaries that answered the requested operation. */\n selectedSummaries: Array<{ resultId: string; metricKey: string; coverage?: SummaryCoverage }>;\n /** Duplicate representations dropped because detail covered them. */\n ignoredDuplicates: Array<{ resultId: string; metricKey: string; id: string }>;\n /** Populations that could not answer the operation — reported, never\n * silently omitted and never fabricated. */\n insufficientScopes: Array<{ resultId: string; metricKey: string; reason: string }>;\n}\n\n/** The partition a representation covers — effort + group-tag identity. */\nfunction partitionKey(coverage: SummaryCoverage | undefined, effortSlug: string | undefined): string {\n const tags = coverage?.groupTags\n ? Object.entries(coverage.groupTags).sort(([a], [b]) => (a < b ? -1 : 1)).map(([k, v]) => `${k}=${v}`).join(',')\n : '';\n return `${coverage?.effortSlug ?? effortSlug ?? ''}|${tags}`;\n}\n\n/** Whether the retained statistics answer the requested operation. */\nfunction statsSufficient(stats: ReducerStats | undefined, agg: Aggregator): boolean {\n if (!stats) {\n // A summary VALUE is itself the normalized total: sum-shaped and\n // endpoint aggregations are answerable from the value alone\n // (delta's two-observation rule is enforced by the reducer).\n return agg === 'sum' || agg === 'min' || agg === 'max' || agg === 'last' || agg === 'delta';\n }\n switch (agg) {\n case 'sum':\n case 'min':\n case 'max':\n case 'last':\n return true;\n case 'avg':\n case 'count':\n return typeof stats.observedCount === 'number';\n case 'delta':\n // Each summary contributes its value as one observation at its\n // metric date; the <2-observation rule is enforced by the\n // reducer (absent, not insufficient).\n return true;\n }\n}\n\nexport interface CoverageSelection {\n /** Facts to aggregate — one complete, non-overlapping representation. */\n selected: AnalyticsDataPoint[];\n report: CoverageReport;\n}\n\n/**\n * Coverage-based selection over the matched facts of one aggregate query.\n * Groups by (resultId, metricKey); within a group picks detail over\n * substituting summaries, admits only disjoint summary partitions, and\n * reports insufficient evidence instead of fabricating values.\n */\nexport function selectContributions(\n matched: readonly AnalyticsDataPoint[],\n agg: Aggregator,\n): CoverageSelection {\n const report: CoverageReport = {\n detailPopulations: 0,\n selectedSummaries: [],\n ignoredDuplicates: [],\n insufficientScopes: [],\n };\n const selected: AnalyticsDataPoint[] = [];\n\n // Population = one result × one metric key.\n const populations = new Map<string, AnalyticsDataPoint[]>();\n for (const fact of matched) {\n const key = `${fact.resultId}\\u0000${fact.metricKey ?? fact.type}`;\n const bucket = populations.get(key);\n if (bucket) bucket.push(fact);\n else populations.set(key, [fact]);\n }\n\n for (const [populationKey, facts] of populations) {\n const [resultId, metricKey] = populationKey.split('\\u0000');\n // Direct observations are detail regardless of storage grain —\n // user-recorded summary-grain values (wellness) are genuine\n // observations, not substitutes.\n const detail = facts.filter(\n (f) => f.grain !== 'summary' || f.representationKind === 'direct',\n );\n const summaries = facts.filter((f) => f.grain === 'summary');\n\n if (detail.length > 0) {\n report.detailPopulations += 1;\n selected.push(...detail);\n // Summaries whose coverage partition is already answered by the\n // detail are duplicate representations. A partition disjoint\n // from every detail observation substitutes for its partition.\n const detailPartitions = new Set(detail.map((f) => partitionKey(undefined, f.effortSlug)));\n for (const summary of summaries) {\n const summaryPartition = partitionKey(summary.summaryCoverage, summary.effortSlug);\n if (summaryPartition !== '|'\n && summary.summaryCoverage !== undefined\n && !detailPartitions.has(summaryPartition)\n && statsSufficient(summary.reducerStats, agg)) {\n report.selectedSummaries.push({ resultId, metricKey, coverage: summary.summaryCoverage });\n selected.push(summary);\n } else {\n report.ignoredDuplicates.push({ resultId, metricKey, id: summary.id });\n }\n }\n continue;\n }\n\n // Summaries only: every summary is a candidate substitute; each must\n // individually prove it answers the operation.\n let anyUsable = false;\n for (const summary of summaries) {\n if (statsSufficient(summary.reducerStats, agg)) {\n report.selectedSummaries.push({ resultId, metricKey, coverage: summary.summaryCoverage });\n selected.push(summary);\n anyUsable = true;\n }\n }\n if (!anyUsable) {\n report.insufficientScopes.push({\n resultId,\n metricKey,\n reason: agg === 'avg' || agg === 'count' || agg === 'delta'\n ? 'summary lacks the retained observation count this operation requires'\n : 'no detail rows and no sufficient summary for this population',\n });\n }\n }\n\n return { selected, report };\n}\n\n/**\n * Dedupe facts by stable observation identity — overlapping scope fetches\n * (note feed + explicit result:, content joins) contribute each observation\n * once. Repeated same-valued measurements keep their distinct ids.\n */\nexport function dedupeById<T extends { id: string }>(facts: readonly T[]): T[] {\n const seen = new Set<string>();\n const out: T[] = [];\n for (const fact of facts) {\n if (seen.has(fact.id)) continue;\n seen.add(fact.id);\n out.push(fact);\n }\n return out;\n}\n","/**\n * Query Service — the executor of WQL against the unified event store.\n * Four-stage physical plan:\n *\n * SELECT (window-first hybrid, ticket 003: windowed queries fetch through\n * by-timestamp — the one proven culling index; all-time queries\n * scan; by-metric is never used. Event rows are flattened to the\n * legacy flat-fact currency by projectEventToFacts.)\n * BUCKET (time dim or rollup period)\n * AGGREGATE (per bucket)\n * GROUP (tag-dimension fan-out)\n *\n * Inputs are uncapped — personal-journal scale; widgets and tables are dumb\n * consumers of QueryResult. The store serves UnifiedEventRecord rows\n * (grain 'event' | 'summary'); Tags are query-time dimensions read off the\n * projected fact row (effort, discipline, note, intensity, …) — 'tags'\n * resolves through the note_tags store.\n *\n * Fully inverted dependencies: zero IndexedDB/storage module-level imports.\n */\n\nimport type { AnalyticsDataPoint, Note, BlockIndexRow, EventRecord, Page, PageNote } from '@bitcobblers/wod-wiki-core';\nimport { normalizeFieldComponent, validateNoteBlocks } from '@bitcobblers/wod-wiki-core';\nimport {\n parseQuery,\n isFindQuery,\n isPipelineQuery,\n findTargetAdvisories,\n type Aggregator,\n type ComparisonOp,\n type ParsedAggregateQuery,\n type ParsedFindQuery,\n type ParsedPipelineQuery,\n type PipelineSink,\n type AnyParsedQuery,\n type QueryWindow,\n type ParsedRowsQuery,\n type FindPredicate,\n type MetricPredicate,\n type Series,\n type SeriesPoint,\n type TagFilter,\n} from './wql';\nimport { WQL_SOURCE_VALUES, WQL_TYPED_TAG_KEYS, type WqlTypedTagKey } from './vocabulary';\nimport { convertViaCatalog, resolveOutputUnit } from './units';\nimport { projectEventToFacts } from './derivation';\nimport { dedupeById, selectContributions, type CoverageReport } from './selection';\nimport {\n captureContext,\n civilDateAdd,\n civilDateDiff,\n civilDateOf,\n civilMonday,\n inRange,\n resolveWindowRange,\n zonedNoon,\n zonedStartOfDay,\n type ExecutionContext,\n type ResolvedRange,\n} from './calendar';\nimport type {\n EventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n NoteRelationBundle,\n WqlDomainOrder,\n WqlDomainPredicate,\n} from './stores';\n\nexport type {\n EventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n};\n\n\n/** User note identity shape — uuidv7 minted by the journal/persistence layer\n * (crypto.randomUUID on legacy rows). Seed corpus ids are path-shaped. */\nconst NOTE_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Extract the catalog directory id from a Note or BlockIndexRow.\n * Uses explicit `catalog` when present; falls back to parsing `sourceId`\n * (stripping `collection:`/`feed:` prefixes and `feeds/` path components) or `noteId`.\n * Exported so host mappers (Entry derivation) carry the exact field the\n * `catalog:` filter matches — presentation catalogs must not diverge. */\nexport function catalogOfItem(item: { id?: string; noteId?: string; sourceId?: string; catalog?: string }): string | undefined {\n if (item.catalog) return item.catalog;\n const isCollectionOrFeed = !!item.sourceId && /^(collection|feed):/.test(item.sourceId);\n const raw = isCollectionOrFeed ? item.sourceId!.replace(/^(collection|feed):/, '') : (item.noteId || item.id || '');\n if (!raw) return undefined;\n if (NOTE_UUID_RE.test(raw)) return undefined;\n const clean = raw.startsWith('feeds/') ? raw.slice('feeds/'.length) : raw;\n if (!isCollectionOrFeed && !clean.includes('/')) return undefined;\n return clean.split('/')[0];\n}\n\nimport {\n DEFAULT_NOTEBOOK_SLUGS,\n isNoteEditable,\n notebookSlugFromId,\n toNotebookId,\n type DefaultNotebookSlug,\n type NotebookId,\n} from '@bitcobblers/wod-wiki-core';\n\nexport {\n DEFAULT_NOTEBOOK_SLUGS,\n isNoteEditable,\n notebookSlugFromId,\n toNotebookId,\n type DefaultNotebookSlug,\n type NotebookId,\n};\n\n/**\n * Resolve the canonical `notebook/{slug}` container for any Note or BlockIndexRow.\n * Unifies explicit `notebookId`, default notebooks (`notebook/journal`, `notebook/playground`,\n * `notebook/guides`), `notebook:{slug}` tags, and seed catalogs (`notebook/{catalog}`).\n */\nexport function notebookOfItem(item: {\n id?: string;\n noteId?: string;\n sourceId?: string;\n type?: string;\n seedOrigin?: string;\n seedChunkId?: string;\n sourcePath?: string;\n catalog?: string;\n notebookId?: string;\n tags?: readonly string[];\n}): NotebookId | undefined {\n if (item.notebookId && item.notebookId.trim()) {\n return toNotebookId(item.notebookId);\n }\n if (item.tags) {\n for (const tag of item.tags) {\n if (tag.startsWith('notebook:') || tag.startsWith('notebook/')) {\n const slug = notebookSlugFromId(tag);\n if (slug) return toNotebookId(slug);\n }\n }\n }\n if (sourceMatches(item, 'playground')) return 'notebook/playground';\n if (sourceMatches(item, 'guides')) return 'notebook/guides';\n const cat = catalogOfItem(item);\n if (cat) return toNotebookId(cat);\n if (sourceMatches(item, 'journal')) return 'notebook/journal';\n return undefined;\n}\n\n/** Match a single row against one source filter value. The `journal` kind matches\n * rows with no sourceId, the literal 'journal', or UUID / journal/date lineage\n * pointing to the original note. Lineage also passes corpus exclusions below.\n * The feed / guide kinds match\n * rows whose sourceId starts with the kind (storage identities keep their\n * `collection:`/`page:collection:` prefixes — only the query vocabulary\n * was renamed). A `kind:id` literal matches the\n * exact id. `playground` matches the playground intake's sourceId convention\n * and, on the note plane, legacy rows typed 'playground' (playground pages\n * saved before the sourceId convention existed — their sourceId is absent).\n * `all` spans exactly the WQL source domain plus sourceless rows — identical\n * to the source fence. `journal` rejects the rest of the seed corpus: rows\n * with seed provenance (importer stamps, or surviving seedChunkId /\n * markdown/ sourcePath / catalog on legacy user-edited rows whose\n * seedOrigin flipped to 'user') and typed dashboards never journal — a user\n * journal note carries none of those markers. Exported so host mappers\n * classify result rows with the exact predicate the `source:` filter\n * applies. */\nexport function sourceMatches(\n item: {\n id?: string; noteId?: string; sourceId?: string; type?: string;\n seedOrigin?: string; seedChunkId?: string; sourcePath?: string; catalog?: string; notebookId?: string;\n },\n kind: string,\n): boolean {\n const sourceId = item.sourceId;\n if (kind === 'all') return !sourceId || WQL_SOURCE_VALUES.some((k) => sourceMatches(item, k));\n if (kind === 'journal') {\n if (item.type === 'playground' || item.id?.startsWith('playground/') || item.noteId?.startsWith('playground/')) return false;\n if (sourceId && sourceId !== 'journal' && !NOTE_UUID_RE.test(sourceId) && !/^journal\\/\\d{4}-\\d{2}-\\d{2}$/.test(sourceId)) return false;\n // UUID or legacy journal/date lineage still must pass corpus exclusions.\n return item.type !== 'dashboard'\n && item.type !== 'effort'\n && item.type !== 'equipment'\n && item.seedOrigin !== 'seed'\n && item.seedChunkId === undefined\n && !item.catalog\n && !(!!item.sourcePath && item.sourcePath.startsWith('markdown/'));\n }\n if (kind === 'feed' || kind === 'feeds') {\n return !!sourceId && (sourceId.startsWith('collection:') || sourceId.startsWith('page:collection:'));\n }\n if (kind === 'page' || kind === 'pages') {\n return !!sourceId && (sourceId === 'page' || sourceId.startsWith('page:') || sourceId.startsWith('guides:'));\n }\n if (kind === 'guide' || kind === 'guides') {\n return !!sourceId && sourceId.startsWith('guides:');\n }\n if (kind === 'playground') {\n return sourceId === 'playground' || item.type === 'playground';\n }\n if (kind.startsWith('feed:')) {\n // `feed:<slug>` targets one feed's notes; a full `feed:<slug>/<date>/<item>`\n // id targets that single note. Both the query value and the storage\n // sourceId may carry the optional `feeds/` path segment — compare with\n // it normalized away so the two feed-id conventions agree.\n const rest = kind.slice('feed:'.length).replace(/^feeds\\//, '');\n if (!rest || !sourceId?.startsWith('feed:')) return false;\n const idRest = sourceId.slice('feed:'.length).replace(/^feeds\\//, '');\n return idRest === rest || idRest.startsWith(`${rest}/`);\n }\n return sourceId === kind;\n}\n\n/** Apply the `source:` filter key to a list of objects that carry `sourceId`. */\nfunction applySourceFilter<T extends { sourceId?: string; type?: string }>(items: T[], filters: TagFilter[]): T[] {\n for (const filter of filters) {\n if (filter.key !== 'source') continue;\n const wants = filter.values.map(v => v.value);\n items = items.filter(item => {\n const match = wants.some(w => sourceMatches(item, w));\n return filter.negate ? !match : match;\n });\n }\n return items;\n}\n\n/** Apply the `notebook:` filter key to a list of Note or BlockIndexRow items. */\nfunction applyNotebookFilter<T extends Parameters<typeof notebookOfItem>[0]>(items: T[], filters: TagFilter[]): T[] {\n for (const filter of filters) {\n if (filter.key !== 'notebook') continue;\n const wanted = new Set(filter.values.map(v => toNotebookId(v.value)));\n items = items.filter(item => {\n const nb = notebookOfItem(item);\n if (!nb) return filter.negate;\n const hit = wanted.has(nb);\n return filter.negate ? !hit : hit;\n });\n }\n return items;\n}\n\n/** Source kinds whose matching is pure sourceId-shape logic on both planes.\n * `journal` additionally excludes legacy pg-* rows in JS and `all` spans the\n * whole WQL domain — queries naming them stay fully residual so the JS\n * predicate stays the sole decider. */\nconst DOMAIN_SOURCE_KINDS: Record<string, true> = {\n feed: true,\n feeds: true,\n page: true,\n pages: true,\n guide: true,\n guides: true,\n playground: true,\n};\n\n/** Compiled domain candidate read for a content plane. `selection` carries\n * the pre-count stages the wire performs before selectedCount (source\n * clauses + the :note defaultNotes exclusion + the explicit WQL source\n * fence); `filters` carries the post-count clauses (positive literal type /\n * exact id / literal text substring — the wire's case-insensitive text is\n * exactly the JS stage's lowercase-includes).\n * `residual` is true when ANY authored filter must still be\n * applied in JS — a residual read is never server-limited, because limiting\n * before a residual filter would drop rows the pipeline would have kept. */\ninterface CompiledContentRead {\n selection: WqlDomainPredicate[];\n filters: WqlDomainPredicate[];\n residual: boolean;\n}\n\n/** Compile a plane's content filters for the domain candidate read — only\n * clauses whose semantics match the storage wire exactly. Wildcards,\n * negations, tags/effort/catalog/date/page, and `journal`/`all` source\n * kinds stay residual JS filters. The candidate read is a SUPERSET either\n * way; the JS pipeline re-applies every stage and owns the final slice. */\nfunction compileContentRead(filters: TagFilter[], plane: 'note' | 'block', sourceScope?: string[]): CompiledContentRead {\n const selection: WqlDomainPredicate[] = [];\n const compiled: WqlDomainPredicate[] = [];\n let residual = false;\n for (const filter of filters) {\n const literal = !filter.negate && filter.values.every((v) => !v.wildcard);\n const values = literal ? filter.values.map((v) => v.value) : [];\n if (filter.key === 'source' && literal && filter.values.every((v) => DOMAIN_SOURCE_KINDS[v.value] === true)) {\n selection.push({ field: 'source', values });\n continue;\n }\n if (filter.key === 'type' && literal) {\n compiled.push({ field: 'type', values });\n continue;\n }\n if (filter.key === 'page') {\n // A page filter (any polarity) is applied in JS.\n residual = true;\n continue;\n }\n if (filter.key === 'text' && literal) {\n // Wire and JS both match title or the full authored Note body.\n compiled.push({ field: 'text', value: values.join(' ') });\n continue;\n }\n if (filter.key === 'note' && literal) {\n compiled.push({ field: plane === 'block' ? 'noteId' : 'id', values });\n continue;\n }\n residual = true;\n }\n if (plane === 'note' && sourceScope?.length) {\n selection.push({ field: 'source', values: sourceScope });\n }\n // The note plane is inclusive — no defaultNotes clause, no source fence\n // (generic :note surfaces every row). The block plane keeps its\n // historical fence: candidates come from the WQL source domain.\n if (plane === 'block') {\n selection.push({ field: 'sourceFence' });\n }\n return { selection, filters: compiled, residual };\n}\n\n/** :note pre-count selection stages — authored source clauses and the\n * parse-authored sourceScope, shared verbatim by the merged pipeline and\n * the static-plane selected count. The generic note plane is inclusive:\n * no default page exclusion and no source fence — feeds, arbitrary source\n * strings, typed pages and dashboards all surface; positive `source:`\n * filters and source negations do the scoping. */\nfunction applyNoteSelectionStages(notes: Note[], parsed: ParsedFindQuery): Note[] {\n let rows = applySourceFilter(notes, parsed.filters);\n if (parsed.sourceScope?.length) {\n const scope = parsed.sourceScope;\n rows = rows.filter((n) => scope.some((k) => sourceMatches(n, k)));\n }\n return rows;\n}\n\n/** Server order/page clauses for a candidate read. Natural id order rides\n * EVERY read: the server's default row order is unspecified, and id order\n * is exactly the historical whole-store iteration order the JS pipeline\n * surfaces when no `| order` pipe exists. offset/limit ride only when NO\n * residual filter, window, join, or authored order precedes the slice, so\n * limiting cannot drop rows the pipeline would keep. Authored `| order`\n * always sorts in JS over the complete candidate set instead. */\nfunction domainPaging(\n parsed: ParsedFindQuery,\n options: FindOptions,\n residual: boolean,\n): { order: WqlDomainOrder[]; offset?: number; limit?: number; paged: boolean } {\n const pipes = parsed.pipes;\n const wantsPage = pipes?.limit !== undefined || (pipes?.offset ?? 0) > 0;\n if (residual || parsed.join || parsed.window || options.range || pipes?.order || !wantsPage) {\n return { order: [{ field: 'id', direction: 'asc' }], paged: false };\n }\n return {\n order: [{ field: 'id', direction: 'asc' }],\n ...(pipes?.offset ? { offset: pipes.offset } : {}),\n ...(pipes?.limit !== undefined ? { limit: pipes.limit } : {}),\n paged: true,\n };\n}\n\n/** Resolve the single execution context for a run: the caller's captured\n * context when provided (ticket 19's runner captures once per document),\n * else a fresh capture from `anchorNow`/now in the system timezone. */\nfunction runContext(options: { context?: ExecutionContext; anchorNow?: number }): ExecutionContext {\n if (options.context) return options.context;\n return captureContext(options.anchorNow);\n}\n\n/** Time-window predicate for a row (C1 + ticket 12): the query's own window\n * WINS over the explicit host `range` option — the host range supplies the\n * default only when the query has none. Resolution happens against the one\n * captured execution context; membership is half-open [start, end). */\nfunction effectiveTimeWindow(\n createdAt: number,\n window: QueryWindow | undefined,\n range: ResolvedRange | undefined,\n ctx: ExecutionContext,\n): boolean {\n const resolved = window ? resolveWindowRange(window, ctx) : range;\n return inRange(createdAt, resolved);\n}\nfunction sessionCompletedAt(rows: EventRecord[]): number {\n const completion = rows.find((r) => r.outputType === 'completion');\n if (completion?.timestamp) return completion.timestamp;\n return rows[0]?.timestamp ?? 0;\n}\n\n/** C1 + ticket 12 range resolution for aggregate execution: the query's own\n * window WINS over the host range options — the host range is the default\n * when the query has none. Resolution against the one captured context;\n * membership half-open. */\nfunction resolveAggregateRange(\n parsed: ParsedAggregateQuery,\n options: QueryOptions,\n ctx: ExecutionContext,\n): ResolvedRange | undefined {\n if (parsed.window) return resolveWindowRange(parsed.window, ctx);\n if (options.rangeStart !== undefined || options.rangeEnd !== undefined) {\n return {\n start: options.rangeStart ?? 0,\n end: options.rangeEnd ?? Number.MAX_SAFE_INTEGER,\n endExclusive: false,\n };\n }\n return undefined;\n}\n\nconst defaultEventStore: EventStore = {\n getEventsByTimeRange: async () => [],\n getEventsByResult: async () => [],\n getEventsForNote: async () => [],\n getEventsByContent: async () => [],\n scanAll: async () => [],\n appendEvents: async () => {},\n finalizeSummaries: async () => {},\n deleteEvents: async () => {},\n};\n\nconst defaultNoteStore: NoteQueryStore = {\n getAllNotes: async () => [],\n getNoteIdsForTag: async () => new Set<string>(),\n getNoteTagLabels: async () => [],\n};\n\nconst defaultBlockStore: BlockQueryStore = {\n getAllBlocks: async () => [],\n};\n\nconst defaultEffortStore: EffortQueryStore = {\n getAllEfforts: async () => [],\n};\n\nexport interface FindQueryResult {\n parsed: ParsedFindQuery;\n notes: Note[];\n blocks: BlockIndexRow[];\n /** Registry rows for :effort queries. */\n efforts?: IEffort[];\n /** Session run cards for :session queries (#1041). */\n runs?: RowsRun[];\n /** Tabular output for :segment and :event queries (#1042). */\n table?: TabularResult;\n /** Raw event rows behind the result — session run statements and table\n * observations. Pipeline stages aggregate these in memory (no re-read). */\n events?: EventRecord[];\n /** Highest container per note id: the parent Page when the canonical\n * page_notes junction links one, else the standalone Note. Present only\n * when a pageStore is injected and notes were matched. */\n containers?: Record<string, NoteContainer>;\n stages: { selected: number; matched: number };\n}\n\n/** Highest-container link for a matched note (parent Page wins). `slug` and\n * `date` route app URLs (/p/:slug, /journal/:date). Core Page has no type —\n * the parent is never classified by the note's kind. */\nexport type NoteContainer =\n | { kind: 'page'; id: string; slug?: string; date?: string }\n | { kind: 'note'; id: string };\n\n/** Options for runPipeline: query options plus host-populated datasets.\n * `pageSources` wins over an injected `datasetStore`; both are synchronous\n * in-memory lookups — dataset stages never roundtrip the database. */\nexport interface PipelineOptions extends QueryOptions {\n /** Host-populated datasets keyed by name (names include `@`). */\n pageSources?: ReadonlyMap<string, { events: EventRecord[]; notes: Note[] }>;\n}\n\n/** Result of one pipeline run: the final stage's data under its existing\n * result type, plus the chart sink marker for the renderer. */\nexport interface PipelineResult {\n parsed: ParsedPipelineQuery;\n series?: Series[];\n table?: TabularResult;\n notes?: Note[];\n blocks?: BlockIndexRow[];\n efforts?: IEffort[];\n runs?: RowsRun[];\n /** Highest container per note id (see FindQueryResult.containers). */\n containers?: Record<string, NoteContainer>;\n unit?: string;\n chart?: PipelineSink;\n error?: string;\n}\n\nexport interface QueryOptions {\n rangeStart?: number;\n rangeEnd?: number;\n /** App-level unit preference ('kg' | 'lb'). Used when query has no `in <unit>` directive. */\n preferredUnit?: string;\n /** Captured execution context (ticket 12) — one `{instant, timeZone}`\n * capture per document run; defaults to a fresh system capture. */\n context?: ExecutionContext;\n}\n\n/** Options for `runFind` / `runFindBlock` — overrides for the parsed WQL. */\nexport interface FindOptions {\n /** Host-supplied timestamp range (half-open [start, end)) — the DEFAULT\n * when the parsed WQL has no window; an explicit query window wins. */\n range?: ResolvedRange;\n /** Explicit reference time for the window (tests/replay). Superseded by\n * `context` when both are given. */\n anchorNow?: number;\n /** Captured execution context (ticket 12). */\n context?: ExecutionContext;\n}\n\nexport interface QueryResult {\n parsed: ParsedAggregateQuery;\n series: Series[];\n stages: { selected: number; buckets: number; aggregated: number; groups: number };\n matched: AnalyticsDataPoint[];\n /** Single scalar value when the result has exactly one point. */\n scalar?: number;\n /** Result display unit, if determined by directive, preference, or fact metadata. */\n unit?: string;\n /** First diagnostic across series (ticket 13) — per-widget badges in 19. */\n error?: string;\n /** Compact coverage references (ticket 16 explainability). */\n coverage?: CoverageReport;\n}\n\n/** One run in a rows result: the canonical result identity plus the event\n * rows that survived the optional output-type narrowing (`rows:segment{…}`). */\nexport interface RowsRun {\n resultId: string;\n noteId: string;\n /** Canonical workout time (result.createdAt under the unified model). */\n timestamp: number;\n events: EventRecord[];\n}\n\nexport interface RowsQueryResult {\n parsed: ParsedRowsQuery;\n runs: RowsRun[];\n error?: string;\n /** Ticket 18 — cross-workout tabular result (cross-workout rows only). */\n table?: TabularResult;\n}\n\n// ── Ticket 18: cross-workout analytical tables ──────────────────────────\n\nexport interface TabularColumn {\n name: string;\n type: 'date' | 'string' | 'number';\n unit?: string;\n}\n\n/** Civil dates (YYYY-MM-DD, `timeZone`-local) whose [local midnight,\n * next local midnight) windows intersect `[start, end)` — the by-metric-date\n * candidate set for the complete fetch (ticket 12/14). Callers pass bounded\n * ranges only: an unbounded side uses the all-store scan as the complete\n * fetch instead of enumerating an open horizon. */\nexport function civilDatesCoveredByRange(start: number, end: number, timeZone: string): string[] {\n const dates: string[] = [];\n let cursor = start;\n while (cursor < end) {\n const iso = civilDateOf(cursor, timeZone);\n // Cursor is monotone, so civil dates are non-decreasing — the\n // last-element check dedupes the mid-day start boundary.\n if (dates[dates.length - 1] !== iso) dates.push(iso);\n // Local midnight of the day AFTER `iso` — component math via\n // zonedStartOfDay: 23h/25h DST days still start at their own 00:00,\n // and nonexistent-midnight zones start the day at the transition\n // instant. Every covered civil date is enumerated, including the\n // end boundary's own (possibly partial) day.\n const nextMidnight = zonedStartOfDay(civilDateAdd(iso, 1), timeZone);\n // Progress guard: a stalled or backwards midnight must never loop\n // forever (NaN instants fail the `cursor < end` test and exit).\n if (nextMidnight <= cursor) break;\n cursor = nextMidnight;\n }\n return dates;\n}\n\n/** The stable tabular shape consumed by table widgets (ticket 19 wires\n * widgets): bounded page + full match count. Missing column values are\n * ABSENT (undefined) — strictly distinct from a recorded 0. */\nexport interface TabularGroup {\n key: string;\n label: string;\n rows: Array<Record<string, unknown>>;\n}\n\nexport interface TabularResult {\n columns: TabularColumn[];\n rows: Array<Record<string, unknown>>;\n groups?: TabularGroup[];\n totalCount: number;\n limit?: number;\n offset?: number;\n}\n\n/**\n * Tag value for a fact row. Tag keys map onto fact fields; 'tags' is the\n * note_tags label set of the parent note (loaded per query, only when used).\n */\nfunction factTagValue(row: AnalyticsDataPoint, key: string, noteTags: ReadonlyMap<string, readonly string[]>): string | readonly string[] | undefined {\n switch (key) {\n case 'effort': return row.effortSlug;\n case 'discipline': return row.discipline;\n case 'intensity': return row.intensityTier;\n case 'grade': return row.grade;\n case 'note': return row.noteId;\n case 'page': return row.pageId;\n case 'origin': return row.origin;\n case 'grain': return row.grain;\n case 'metric': return row.metricKey;\n case 'block': return row.blockContentId;\n case 'result': return row.resultId;\n case 'tags': return noteTags.get(row.noteId) ?? [];\n default: {\n // Custom dimensions: user-authored property metrics and grouped\n // partitions live in row.dimensions under normalized (camelCase)\n // keys — `{coach:greg}` and `by {coach}` resolve here. Facts without\n // the dim group/filter as unassigned.\n const dims = row.dimensions;\n if (!dims) return undefined;\n return dims[key] ?? dims[normalizeFieldComponent(key)];\n }\n }\n}\n\nfunction matchesFilters(row: AnalyticsDataPoint, filters: TagFilter[], noteTags: ReadonlyMap<string, readonly string[]>): boolean {\n // OR within a key (and sign); AND across keys/signs. Negation spans the\n // whole value list for that key/sign.\n const groups = new Map<string, TagFilter[]>();\n for (const f of filters) {\n const groupKey = `${f.negate ? '!' : ''}${f.key}`;\n const bucket = groups.get(groupKey);\n if (bucket) bucket.push(f);\n else groups.set(groupKey, [f]);\n }\n return [...groups.values()].every((group) => {\n const key = group[0].key;\n const negate = group[0].negate;\n const raw = factTagValue(row, key, noteTags);\n const rowValues = Array.isArray(raw) ? raw : raw !== undefined ? [raw] : [];\n const hit = rowValues.some((value) =>\n group.some((f) =>\n f.values.some((a) =>\n a.wildcard ? value.startsWith(a.value) : value === a.value,\n ),\n ),\n );\n return negate ? !hit : hit;\n });\n}\n\n/** Dimension value for grouping; virtual time dims bucket the canonical\n * time by LOCAL CIVIL CALENDAR (spec v2 decision 2): `day` keys are local\n * YYYY-MM-DD; `week` keys are the civil Monday's YYYY-MM-DD, computed by\n * component math — never instant arithmetic, which mislabels DST-shifted\n * weeks. Keys are locale-independent and lexically sortable.\n *\n * NOTE: buildResult routes `day`/`week` groupBys to civil bucket keys and\n * filters them out of tagDims, so the time-dim branches below are\n * defensive only — kept canonical in case a caller surfaces time dims as\n * string keys. */\nfunction dimValue(\n row: AnalyticsDataPoint,\n dim: string,\n noteTags: ReadonlyMap<string, readonly string[]>,\n ctx: ExecutionContext,\n): string {\n // Calendar grouping uses the observation's own temporal anchor (ticket 12):\n // a date-only fact groups under its recorded civil date — never a fabricated\n // midnight instant; an instant fact under its civil date in the context tz.\n if (dim === 'day') return row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone);\n if (dim === 'week') return civilMonday(row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone));\n if (dim === 'session') return row.resultId;\n const raw = factTagValue(row, dim, noteTags);\n // Ticket 16 (finding 3.5): missing group values resolve to the structural\n // UNASSIGNED sentinel — never a literal '(none)' masquerading as data.\n if (raw === undefined) return UNASSIGNED;\n if (typeof raw === 'string') return raw;\n return raw.length ? raw.join(',') : UNASSIGNED;\n}\n\n/** Structural missing-group sentinel — distinct from any literal text\n * (group identity is the JSON tuple, so it cannot collide). */\nexport const UNASSIGNED = '\\u0000unassigned';\n\n/** Result state of a bucket reduction (arithmetic contract §2): observed\n * values are genuine reductions of recorded observations; absent results\n * have no observation (render zero only at display); errors are\n * diagnostics, not numbers. */\ntype ReducedValue =\n | { state: 'observed'; value: number }\n | { state: 'absent'; value: 0 }\n | { state: 'error'; message: string };\n\n/** Reduce one bucket's already-converted observation values per the\n * operation matrix. Missing domain positions are handled by the caller\n * (zero-filled synthetic points); this reduces actual observations. */\nfunction aggregate(values: number[], agg: Aggregator, points: AnalyticsDataPoint[]): ReducedValue {\n if (agg === 'count') return { state: 'observed', value: points.length };\n if (values.length === 0) return { state: 'absent', value: 0 };\n switch (agg) {\n case 'sum':\n return { state: 'observed', value: values.reduce((a, b) => a + b, 0) };\n case 'avg':\n return { state: 'observed', value: values.reduce((a, b) => a + b, 0) / values.length };\n case 'min':\n return { state: 'observed', value: Math.min(...values) };\n case 'max':\n return { state: 'observed', value: Math.max(...values) };\n case 'last': {\n // Metric-date order — fetch order never decides the endpoint. The\n // value comes from the already-converted array (values[i] ↔ points[i]).\n let latest = 0;\n for (let i = 0; i < points.length; i++) {\n if (points[i]!.timestamp > points[latest]!.timestamp) latest = i;\n }\n return { state: 'observed', value: values[latest]! };\n }\n case 'delta': {\n if (points.length < 2) return { state: 'absent', value: 0 };\n // Sort (point, converted value) PAIRS — the values[i] ↔ points[i]\n // alignment must survive the reorder (ticket 13: conversion before\n // arithmetic; metric-date chronological endpoints).\n const ordered = points\n .map((point, i) => ({ point, value: values[i]! }))\n .sort((a, b) => a.point.timestamp - b.point.timestamp);\n const first = ordered[0]!;\n const last = ordered[ordered.length - 1]!;\n // Equal-timestamp endpoints with different values and no recorded\n // order evidence are an ambiguous-order error.\n const atFirst = ordered.filter((p) => p.point.timestamp === first.point.timestamp);\n const atLast = ordered.filter((p) => p.point.timestamp === last.point.timestamp);\n const firstVals = new Set(atFirst.map((p) => p.point.value));\n const lastVals = new Set(atLast.map((p) => p.point.value));\n if (firstVals.size > 1 || lastVals.size > 1) {\n return { state: 'error', message: 'Ambiguous delta order: tied endpoint observations differ in value without recorded order' };\n }\n return { state: 'observed', value: last.value - first.value };\n }\n }\n}\n\n/** Apply a cross-store metric predicate's comparison op. */\nfunction compareOp(value: number, op: ComparisonOp, threshold: number): boolean {\n switch (op) {\n case '>': return value > threshold;\n case '>=': return value >= threshold;\n case '<': return value < threshold;\n case '<=': return value <= threshold;\n case '==': return value === threshold;\n case '!=': return value !== threshold;\n }\n}\n\n/** Reduce an already-aggregated pipeline stage with the next transform —\n * functions act on the PRECEDING numeric result, never re-query facts.\n * Supported authored modifiers on a carried stage: `last <n>d|w` /\n * `from…to…` windows (filter the carried points by ts) and `in <unit>`\n * (convert BEFORE arithmetic, ticket 13 — values and observation points\n * stay aligned for last/delta). Filters, group-bys, rollups, and content\n * joins have no fact dimensions to resolve on carried values — they error\n * explicitly instead of being silently ignored. `metric:` must match the\n * preceding stage's metric (rep≡reps) — a mismatch mislabels the result. */\nfunction reduceCarriedResult(qr: QueryResult, transform: ParsedAggregateQuery, options: QueryOptions, ctx: ExecutionContext): QueryResult {\n const zero = { selected: 0, buckets: 0, aggregated: 0, groups: 0 } as const;\n const unsupported = [\n transform.join && 'where <content> join',\n transform.filters.length > 0 && 'tag filters',\n transform.groupBy.length > 0 && 'by {…} grouping',\n transform.rollup && '.rollup(…)',\n ].filter(Boolean) as string[];\n if (unsupported.length > 0) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `:${transform.agg}{…} on a carried stage cannot apply ${unsupported.join(', ')} — carried values carry no fact dimensions; author them in the source stage.`,\n };\n }\n // An errored stage poisons everything downstream — stop before reducing.\n if (qr.error) return qr;\n\n const range = resolveAggregateRange(transform, options, ctx);\n const values: number[] = [];\n const points: AnalyticsDataPoint[] = [];\n let lastTs = 0;\n for (const s of qr.series) {\n for (const p of s.points) {\n if (p.missing) continue;\n if (range && !inRange(p.ts, range)) continue;\n values.push(p.value);\n points.push({ timestamp: p.ts, value: p.value, noteId: '', resultId: '' } as AnalyticsDataPoint);\n if (p.ts > lastTs) lastTs = p.ts;\n }\n }\n\n // Carried values are the previous stage's metric — a different metric:\n // mislabels the reduction. Empty metric inherits the carried provenance\n // (rep/reps aliases compare equal).\n const sameMetric = (a: string, b: string) =>\n a === b || (a === 'rep' && b === 'reps') || (a === 'reps' && b === 'rep');\n if (transform.metric && !(qr.parsed.metric && sameMetric(transform.metric, qr.parsed.metric))) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `:${transform.agg}{metric:${transform.metric}} on a carried stage reduces the preceding \"${qr.parsed.metric || 'metricless'}\" values — metric:${transform.metric} does not exist on them.`,\n };\n }\n\n // `in <unit>` on a carried stage converts the carried values (all one\n // unit) before the reduction; unitless or count stages cannot convert.\n let unit = transform.agg === 'count' ? 'count' : qr.unit;\n if (transform.displayUnit) {\n if (!unit || unit === 'count') {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: `Cannot apply in ${transform.displayUnit} — the preceding stage carries no convertible unit.`,\n };\n }\n try {\n for (let i = 0; i < values.length; i++) {\n const converted = convertViaCatalog(values[i]!, unit, transform.displayUnit);\n values[i] = converted;\n // Keep the observation pair aligned — last/delta read point.value.\n points[i] = { ...points[i]!, value: converted };\n }\n unit = transform.displayUnit;\n } catch (e) {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: e instanceof Error ? e.message : String(e),\n };\n }\n }\n\n const reduced = aggregate(values, transform.agg, points);\n if (reduced.state === 'error') {\n return {\n parsed: transform, series: [], stages: { ...zero }, matched: [],\n error: reduced.message,\n };\n }\n return {\n parsed: transform,\n series: [{\n key: transform.agg,\n label: transform.agg,\n points: [{ ts: lastTs || ctx.instant, value: reduced.value, ...(reduced.state === 'absent' ? { missing: true } : {}) }],\n unit,\n }],\n stages: { selected: values.length, buckets: 1, aggregated: 1, groups: 1 },\n matched: [],\n ...(unit ? { unit } : {}),\n };\n}\nexport class QueryService {\n private readonly store: EventStore;\n private readonly noteStore: NoteQueryStore;\n private readonly blockStore: BlockQueryStore;\n private readonly effortStore: EffortQueryStore;\n private readonly pageStore?: {\n getNotePages(noteId: string): Promise<PageNote[]>;\n getPage(pageId: string): Promise<Page | undefined>;\n };\n private readonly relationStore?: {\n getBatches(noteIds: readonly string[]): Promise<Map<string, NoteRelationBundle>>;\n };\n private readonly datasetStore?: {\n getDataset(name: string): { events: EventRecord[]; notes: Note[] } | undefined;\n };\n\n // Optional storage seam properties for block_efforts and typed tag resolution.\n // Injected by the app adapter (`services/queryService.ts`); tests can supply fakes.\n private blockEffortsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n private tagsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n private noteTagsStore: { getAllFromIndex(index: string, key: string): Promise<any[]> } = {\n getAllFromIndex: async () => [],\n };\n\n constructor(\n storesOrEventStore?: QueryServiceStores | EventStore,\n noteStore?: NoteQueryStore,\n blockStore?: BlockQueryStore,\n effortStore?: EffortQueryStore,\n ) {\n if (\n storesOrEventStore &&\n typeof storesOrEventStore === 'object' &&\n ('eventStore' in storesOrEventStore ||\n 'noteStore' in storesOrEventStore ||\n 'blockStore' in storesOrEventStore ||\n 'effortStore' in storesOrEventStore ||\n 'pageStore' in storesOrEventStore ||\n 'relationStore' in storesOrEventStore ||\n 'datasetStore' in storesOrEventStore)\n ) {\n const stores = storesOrEventStore as QueryServiceStores;\n this.store = stores.eventStore ?? defaultEventStore;\n this.noteStore = stores.noteStore ?? defaultNoteStore;\n this.blockStore = stores.blockStore ?? defaultBlockStore;\n this.effortStore = stores.effortStore ?? defaultEffortStore;\n this.pageStore = stores.pageStore;\n this.relationStore = stores.relationStore;\n this.datasetStore = stores.datasetStore;\n if (stores.blockEffortsStore) this.blockEffortsStore = stores.blockEffortsStore;\n if (stores.tagsStore) this.tagsStore = stores.tagsStore;\n if (stores.noteTagsStore) this.noteTagsStore = stores.noteTagsStore;\n } else {\n this.store = (storesOrEventStore as EventStore | undefined) ?? defaultEventStore;\n this.noteStore = noteStore ?? defaultNoteStore;\n this.blockStore = blockStore ?? defaultBlockStore;\n this.effortStore = effortStore ?? defaultEffortStore;\n }\n }\n\n /** Windowed flat-fact fetch — the projected view over the event store. */\n async getFactsByTimeRange(start: number, end: number): Promise<AnalyticsDataPoint[]> {\n const rows = await this.store.getEventsByTimeRange(start, end);\n return rows.flatMap(projectEventToFacts);\n }\n\n async runQuery(raw: string, options: QueryOptions = {}): Promise<QueryResult> {\n const parsed = parseQuery(raw);\n if (isPipelineQuery(parsed)) return this.pipelineResultToQueryResult(await this.runPipelineParsed(parsed, options));\n return this.run(parsed, options);\n }\n\n /**\n * Legacy rows-family executor kept for hand-built ASTs (RowsTable, CLI).\n * Text `rows:…` no longer parses (#1044); this delegates to the find paths\n * so a programmatic ParsedRowsQuery still resolves.\n */\n async runRows(parsed: ParsedRowsQuery, options: { anchorNow?: number; context?: ExecutionContext } = {}): Promise<RowsQueryResult> {\n // Hand-built rows AST → find noun: `all`/missing → :session; a result\n // plane (segment/load/…) narrows via plane: on :session; rows:segment\n // without a scope is the cross-workout table (:segment).\n const scope = parsed.filters.some((f) => ['result', 'block', 'note'].includes(f.key));\n const plane = parsed.outputType ?? (parsed.target !== 'all' ? parsed.target : undefined);\n let target: string;\n let filters = parsed.filters;\n if (!plane) {\n target = 'session';\n } else if (plane === 'segment' && !scope) {\n target = 'segment';\n } else {\n target = 'session';\n filters = [...parsed.filters, { key: 'plane', negate: false, values: [{ value: plane, wildcard: false }] }];\n }\n const asFind: ParsedFindQuery = {\n family: 'find',\n raw: parsed.raw,\n target,\n filters,\n ...(parsed.window ? { window: parsed.window } : {}),\n ...(parsed.pipes ? { pipes: parsed.pipes } : {}),\n ...(parsed.error ? { error: parsed.error } : {}),\n };\n const res = await this.runFind(asFind, options);\n return { parsed, runs: res.runs ?? [], ...(res.table ? { table: res.table } : {}) };\n }\n\n /**\n * Execute a :session query (#1041/#1042) — grouped run cards per completed session.\n */\n async runFindSession(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const scopeValues = (key: string) =>\n parsed.filters.filter((f) => f.key === key).flatMap((f) => f.values.map((v) => v.value));\n const resultIds = scopeValues('result');\n const blockIds = scopeValues('block');\n const noteIds = scopeValues('note');\n\n const byResult = new Map<string, EventRecord[]>();\n const collected = new Set<string>();\n const collect = (rows: EventRecord[]) => {\n for (const row of rows) {\n if (collected.has(row.id)) continue;\n collected.add(row.id);\n const bucket = byResult.get(row.resultId);\n if (bucket) bucket.push(row);\n else byResult.set(row.resultId, [row]);\n }\n };\n\n if (resultIds.length + blockIds.length + noteIds.length === 0) {\n const range = parsed.window ? resolveWindowRange(parsed.window, ctx) : (options.range ? options.range : undefined);\n const eventRows = range\n ? await this.store.getEventsByTimeRange(range.start, range.end)\n : await this.store.scanAll();\n collect(eventRows);\n } else {\n for (const id of resultIds) collect(await this.store.getEventsByResult(id));\n for (const blockContentId of blockIds) collect(await this.store.getEventsByContent(blockContentId));\n for (const noteId of noteIds) collect(await this.store.getEventsForNote(noteId));\n }\n\n let groups = [...byResult.entries()].filter(([, rows]) => rows.length > 0);\n\n if (parsed.window || options.range) {\n groups = groups.filter(([, rows]) =>\n effectiveTimeWindow(sessionCompletedAt(rows), parsed.window, options.range, ctx),\n );\n }\n groups.sort((a, b) => sessionCompletedAt(b[1]) - sessionCompletedAt(a[1]));\n\n const planeFilters = parsed.filters.filter((f) => f.key === 'plane');\n let runs: RowsRun[] = groups\n .map(([resultId, rows]) => {\n let events = rows;\n if (planeFilters.length > 0) {\n events = events.filter((row) =>\n planeFilters.every((f) => {\n const matchesAny = f.values.some((v) => v.value === row.outputType);\n return f.negate ? !matchesAny : matchesAny;\n }),\n );\n }\n return {\n resultId,\n noteId: rows[0].noteId,\n timestamp: sessionCompletedAt(rows),\n events,\n };\n })\n .filter((run) => run.events.length > 0);\n // Pagination is presentation: the pipeline's event set stays the FULL\n // plane-narrowed selection, only the run cards are clipped.\n const runsFull = runs;\n const pipes = parsed.pipes;\n if (pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n runs = pipes.limit !== undefined ? runs.slice(offset, offset + pipes.limit) : runs.slice(offset);\n }\n\n return {\n parsed,\n notes: [],\n blocks: [],\n runs,\n events: runsFull.flatMap((run) => run.events),\n stages: { selected: groups.length, matched: runs.length },\n };\n }\n\n /**\n * Execute a :segment or :event query (#1042/#1048) — flat cross-workout table.\n */\n async runFindTable(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const scopeValues = (key: string) =>\n parsed.filters.filter((f) => f.key === key).flatMap((f) => f.values.map((v) => v.value));\n const resultIds = scopeValues('result');\n const blockIds = scopeValues('block');\n const noteIds = scopeValues('note');\n\n let eventRows: EventRecord[] = [];\n if (resultIds.length + blockIds.length + noteIds.length === 0) {\n const range = parsed.window ? resolveWindowRange(parsed.window, ctx) : (options.range ? options.range : undefined);\n // Complete fetch mirrors run(): bounded windows fetch through\n // by-timestamp and union by-metric-date candidates over EVERY covered\n // civil date; an unbounded side (sentinel bounds) scans — the all-store\n // scan IS the complete fetch. The anchorTs membership filter below\n // keeps either fetch exact.\n const boundedRange =\n range && range.start > 0 && range.end < Number.MAX_SAFE_INTEGER ? range : undefined;\n if (boundedRange) {\n eventRows = await this.store.getEventsByTimeRange(boundedRange.start, boundedRange.end);\n if (this.store.getEventsByMetricDates) {\n const civilDates = civilDatesCoveredByRange(boundedRange.start, boundedRange.end, ctx.timeZone);\n if (civilDates.length > 0) {\n const byDate = await this.store.getEventsByMetricDates(civilDates);\n if (byDate.length > 0) {\n const seen = new Set(eventRows.map((r) => r.id));\n eventRows = [...eventRows, ...byDate.filter((r) => !seen.has(r.id))];\n }\n }\n }\n } else {\n eventRows = await this.store.scanAll();\n }\n } else {\n const seen = new Set<string>();\n const collect = (rows: EventRecord[]) => {\n for (const row of rows) {\n if (!seen.has(row.id)) {\n seen.add(row.id);\n eventRows.push(row);\n }\n }\n };\n for (const id of resultIds) collect(await this.store.getEventsByResult(id));\n for (const blockContentId of blockIds) collect(await this.store.getEventsByContent(blockContentId));\n for (const noteId of noteIds) collect(await this.store.getEventsForNote(noteId));\n }\n\n const seen = new Set<string>();\n const eligibleRecords: EventRecord[] = [];\n for (const row of eventRows) {\n if (row.grain !== 'event') continue;\n if (parsed.target === 'segment' && row.outputType !== 'segment') continue;\n if (seen.has(row.id)) continue;\n seen.add(row.id);\n eligibleRecords.push(row);\n }\n\n // Selection anchors: a recorded civil date anchors at local noon (the\n // same convention as day bucketing), an instant row at its timestamp.\n const civilDateCache = new Map<number, string>();\n const dateOf = (row: EventRecord): string => {\n const temporal = row.metricTemporal?.[0];\n if (temporal?.temporalKind === 'civil-date' && temporal.civilDate) return temporal.civilDate;\n const cached = civilDateCache.get(row.timestamp);\n if (cached) return cached;\n const computed = civilDateOf(row.timestamp, ctx.timeZone);\n civilDateCache.set(row.timestamp, computed);\n return computed;\n };\n const anchorTs = (row: EventRecord): number => {\n const temporal = row.metricTemporal?.[0];\n if (temporal?.temporalKind === 'civil-date' && temporal.civilDate) return zonedNoon(temporal.civilDate, ctx.timeZone);\n return row.timestamp;\n };\n\n const noteTags: ReadonlyMap<string, readonly string[]> = new Map();\n const tagFilters = parsed.filters.filter((f) => !['result', 'block', 'note', 'plane'].includes(f.key));\n // C1 + ticket 12: the fetch bound is only a cutoff — scoped and windowed\n // queries alike filter membership by the row's own temporal anchor.\n const timeScoped = !!(parsed.window || options.range);\n const eligible = eligibleRecords\n .filter((row) => !timeScoped || effectiveTimeWindow(anchorTs(row), parsed.window, options.range, ctx))\n .filter((row) => {\n if (tagFilters.length === 0) return true;\n const facts = projectEventToFacts(row);\n if (facts.length === 0) return false;\n return facts.some((fact) => matchesFilters(fact, tagFilters, noteTags));\n });\n\n const totalCount = eligible.length;\n\n const unitByMetric = new Map<string, string>();\n const numericMetrics = new Set<string>();\n for (const row of eligible) {\n for (const m of row.metrics as Array<{ type?: string; value?: unknown; unit?: string; metadata?: Record<string, unknown> }>) {\n if (m.type && m.type !== 'label' && typeof m.value === 'number') {\n numericMetrics.add(m.type);\n const key = typeof m.metadata?.canonicalKey === 'string' ? m.metadata.canonicalKey : undefined;\n if (m.unit) {\n unitByMetric.set(m.type, m.unit);\n if (key) unitByMetric.set(key, m.unit);\n }\n }\n }\n }\n\n const pipes = parsed.pipes;\n const selectCols = pipes?.select?.map((s) => s.col) ?? [\n 'date', 'effort', 'discipline', ...numericMetrics,\n ];\n const unitFor = (col: string): string | undefined =>\n pipes?.select?.find((s) => s.col === col)?.unit ?? (parsed.displayUnit ? parsed.displayUnit : unitByMetric.get(col));\n\n const columns: TabularColumn[] = selectCols.map((col) => {\n if (col === 'date') return { name: 'date', type: 'date' as const };\n if (col === 'effort' || col === 'discipline' || col === 'note' || col === 'grade' || col === 'intensity') {\n return { name: col, type: 'string' as const };\n }\n return { name: col, type: 'number' as const, ...(unitFor(col) ? { unit: unitFor(col) } : {}) };\n });\n\n const typeOf = new Map(columns.map((c) => [c.name, c.type]));\n\n let records = eligible.map((row) => {\n const record: Record<string, unknown> = {};\n for (const col of selectCols) {\n const type = typeOf.get(col);\n if (type === 'date') {\n record.date = dateOf(row);\n } else if (col === 'effort') {\n record.effort = row.effortSlug;\n } else if (col === 'discipline') {\n const m = (row.metrics as Array<{ metadata?: Record<string, unknown> }>).find((m) => m.metadata?.effortDiscipline);\n record.discipline = m?.metadata?.effortDiscipline;\n } else {\n const m = (row.metrics as Array<{ type?: string; value?: unknown; unit?: string; metadata?: Record<string, unknown> }>).find(\n (m) => m.type === col || m.metadata?.canonicalKey === col,\n );\n if (m && typeof m.value === 'number') {\n let val = m.value;\n if (parsed.displayUnit && m.unit && m.unit !== parsed.displayUnit) {\n try {\n val = convertViaCatalog(val, m.unit, parsed.displayUnit);\n } catch {\n // ponytail: pass-through if conversion fails; full unit graph handled by units.ts\n }\n }\n record[col] = val;\n } else {\n record[col] = m ? m.value : undefined;\n }\n }\n }\n record.__id = row.id;\n record.__resultId = row.resultId;\n return record;\n });\n\n for (const order of [...(pipes?.order ?? [])].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n records = [...records].sort((a, b) => {\n const av = a[order.col] ?? a.__id;\n const bv = b[order.col] ?? b.__id;\n if (av === bv) return 0;\n return ((av as number | string) > (bv as number | string) ? 1 : -1) * dir;\n });\n }\n\n let groups: Array<{ key: string; label: string; rows: Array<Record<string, unknown>> }> | undefined;\n if (parsed.groupBy && parsed.groupBy.length > 0) {\n const groupMap = new Map<string, Array<Record<string, unknown>>>();\n for (const rec of records) {\n const groupVals = parsed.groupBy.map((dim) => String(rec[dim] ?? 'unassigned'));\n const key = groupVals.join(' · ');\n const existing = groupMap.get(key);\n if (existing) existing.push(rec);\n else groupMap.set(key, [rec]);\n }\n groups = [...groupMap.entries()].map(([key, rows]) => ({ key, label: key, rows }));\n }\n\n const offset = pipes?.offset ?? 0;\n const limit = pipes?.limit;\n const page = limit !== undefined ? records.slice(offset, offset + limit) : records.slice(offset);\n\n return {\n parsed,\n notes: [],\n blocks: [],\n runs: [],\n events: eligible,\n table: {\n columns,\n rows: page,\n ...(groups ? { groups } : {}),\n totalCount,\n ...(limit !== undefined ? { limit } : {}),\n ...(offset > 0 ? { offset } : {}),\n },\n stages: { selected: eligible.length, matched: totalCount },\n };\n }\n\n /**\n * Execute a content-discovery query (:note). Naive in-memory filtering\n * per the tracer-bullet scope (#797): load all notes, then apply tag/text/\n * time filters.\n */\n async runFind(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n if (parsed.error) {\n return { parsed, notes: [], blocks: [], stages: { selected: 0, matched: 0 } };\n }\n // Hand-built ASTs get the same loud target-capability disclosure as\n // parsed text — re-derived from the parsed shape, never from raw text.\n const computed = findTargetAdvisories(parsed);\n if (computed.length) {\n const merged = [...new Set([...(parsed.advisories ?? []), ...computed])];\n if (merged.length !== (parsed.advisories?.length ?? 0)) parsed = { ...parsed, advisories: merged };\n }\n\n if (parsed.target === 'block') {\n return this.runFindBlock(parsed, options);\n }\n if (parsed.target === 'effort') {\n return this.runFindEffort(parsed);\n }\n if (parsed.target === 'session') {\n return this.runFindSession(parsed, options);\n }\n if (parsed.target === 'segment' || parsed.target === 'event') {\n return this.runFindTable(parsed, options);\n }\n const isCatalogHead = parsed.target === 'note'\n && parsed.filters.some(f => f.key === 'type' && !f.negate && f.values.some(v => v.value === 'feed'))\n && (parsed.filters.some(f => f.key === 'source' && !f.negate && f.values.some(v => v.value === 'feed' || v.value === 'feeds'))\n || parsed.sourceScope?.includes('feeds'));\n if (isCatalogHead) {\n return this.runFindCatalog(parsed, options, await this.noteStore.getAllNotes());\n }\n // Domain candidate read: selection (source clauses + the explicit source\n // fence) narrows before the wire's selectedCount; compiled positive\n // literal type/id clauses ride as post-count FILTERS — never selection —\n // so the wire count baselines the historical pre-filter stages.selected.\n const read = compileContentRead(parsed.filters, 'note', parsed.sourceScope);\n const paging = domainPaging(parsed, options, read.residual);\n const fetchedNotes = (read.filters.length > 0 || read.selection.length > 0 || paging.paged) && this.noteStore.queryDomain\n ? await this.noteStore.queryDomain({\n plan: 'notes',\n selection: read.selection,\n ...(read.filters.length ? { filters: read.filters } : {}),\n ...(paging.order ? { order: paging.order } : {}),\n ...(paging.offset !== undefined ? { offset: paging.offset } : {}),\n ...(paging.limit !== undefined ? { limit: paging.limit } : {}),\n })\n : undefined;\n const domainNotes = fetchedNotes && fetchedNotes.plan === 'notes' ? fetchedNotes : undefined;\n let notes = domainNotes ? domainNotes.rows : await this.noteStore.getAllNotes();\n const selectedFromDomain = domainNotes ? domainNotes.selectedCount : undefined;\n const notesPaged = !!domainNotes && paging.paged;\n notes = applyNoteSelectionStages(notes, parsed);\n const selectedCount = selectedFromDomain ?? notes.length;\n const ctx = runContext(options);\n // Tag filters — intersect note IDs across OR'd values within a key.\n // Handles general 'tags' plus dynamic typed tags (domain, format, equipment, quality, intent)\n // and exercise containment ('effort').\n for (const filter of parsed.filters) {\n if (filter.key === 'tags' && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n } else if (filter.key === 'tags' && filter.negate) {\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n notes = notes.filter(n => !ids.has(n.id));\n }\n } else if (filter.key === 'effort' && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForEffort(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n } else if (WQL_TYPED_TAG_KEYS.includes(filter.key as WqlTypedTagKey) && !filter.negate) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForTypedTag(filter.key, v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n notes = notes.filter(n => matchingIds.has(n.id));\n }\n }\n\n for (const filter of parsed.filters) {\n if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n notes = notes.filter(n => {\n const hit = n.title.toLowerCase().includes(search) || n.rawContent.toLowerCase().includes(search);\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n // Type filter — note kind (wod, note, etc.)\n for (const filter of parsed.filters) {\n if (filter.key === 'type' && !filter.negate) {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => n.type && wanted.has(n.type));\n }\n }\n\n // Page filter\n for (const filter of parsed.filters) {\n if (filter.key === 'page') {\n const isTrue = filter.values.some(v => v.value === 'true' || v.value === '1');\n const wantsPage = filter.negate ? !isTrue : isTrue;\n notes = notes.filter(n => (wantsPage ? n.type === 'page' : n.type !== 'page'));\n }\n }\n\n // Catalog filter — static note catalog directory id (e.g. crossfit-girls)\n for (const filter of parsed.filters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => {\n const cat = catalogOfItem(n);\n if (!cat) return filter.negate;\n const hit = wanted.has(cat);\n return filter.negate ? !hit : hit;\n });\n }\n }\n notes = applyNotebookFilter(notes, parsed.filters);\n\n // Note filter — exact note id\n for (const filter of parsed.filters) {\n if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n notes = notes.filter(n => (filter.negate ? !wanted.has(n.id) : wanted.has(n.id)));\n }\n }\n // Time window (ticket 12 precedence): an explicit query window wins; the\n // host `range` option supplies the default when the query has none.\n if (parsed.window || options.range) {\n notes = notes.filter(n => effectiveTimeWindow(n.date ?? n.createdAt, parsed.window, options.range, ctx));\n }\n\n // Cross-store join (direction 1): keep notes owning a wod block whose\n // raw-log metric aggregate satisfies the predicate.\n if (parsed.join) {\n const joined = await this.applyMetricJoin(parsed, notes, []);\n notes = joined.notes;\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n notes = [...notes].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n // Server-paged reads already applied offset/limit in natural id order —\n // re-slicing a pre-sliced page would skip rows (slice(offset) again).\n if (!notesPaged && pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n notes = pipes.limit !== undefined ? notes.slice(offset, offset + pipes.limit) : notes.slice(offset);\n }\n\n return {\n parsed,\n notes,\n blocks: [],\n ...(notes.length && (this.pageStore || this.relationStore)\n ? { containers: await this.containersForNotes(notes) }\n : {}),\n stages: { selected: selectedCount, matched: notes.length },\n };\n }\n\n /** Highest container per note id: the parent Page from the canonical\n * page_notes junction (first link by position) wins; a note with no page\n * link stays a standalone Note container. Batched when a relationStore\n * is injected — one bundle read per run instead of a link/page read per\n * matched note. */\n private async containersForNotes(notes: Note[]): Promise<Record<string, NoteContainer>> {\n const containers: Record<string, NoteContainer> = {};\n const bundles = this.relationStore\n ? await this.relationStore.getBatches([...new Set(notes.map((n) => n.id))])\n : undefined;\n const pageCache = new Map<string, Page | undefined>();\n for (const note of notes) {\n let page: Page | undefined;\n let bundle: NoteRelationBundle | undefined;\n if (bundles) {\n bundle = bundles.get(note.id);\n const [first] = [...(bundle?.links ?? [])].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n page = first ? bundle!.pages.find((p) => p.id === first.pageId) : undefined;\n // Inline the bundle's junction tags on notes without authored tags —\n // downstream Entry mapping hydrates from this same read (no-tag\n // stays a valid final state; inline tags are never overwritten).\n if (bundle && bundle.tags.length > 0 && (!note.tags || note.tags.length === 0)) {\n note.tags = bundle.tags.map((t) => t.label);\n }\n } else {\n const links = await this.pageStore!.getNotePages(note.id);\n if (links.length > 0) {\n const [first] = [...links].sort((a, b) => (a.position ?? 0) - (b.position ?? 0));\n if (!pageCache.has(first!.pageId)) {\n pageCache.set(first!.pageId, await this.pageStore!.getPage(first!.pageId));\n }\n page = pageCache.get(first!.pageId);\n }\n }\n // Resolved parent page wins; a dangling link (page absent from the\n // bundle/store) stays fail-closed as a standalone Note container.\n containers[note.id] = page\n ? { kind: 'page', id: page.id, ...(page.slug ? { slug: page.slug } : {}), ...(page.date ? { date: page.date } : {}) }\n : { kind: 'note', id: note.id };\n }\n return containers;\n }\n\n private async hydrateBlocks(rows: BlockIndexRow[]): Promise<BlockIndexRow[]> {\n const ids = [...new Set(rows.map(row => row.noteId))];\n if (ids.length === 0) return [];\n const notes = this.noteStore.getNotesByIds\n ? await this.noteStore.getNotesByIds(ids)\n : await this.noteStore.getAllNotes();\n const parents = new Map<string, Note>();\n for (const note of notes) {\n if (!Number.isSafeInteger(note.sourceRevision) || note.sourceRevision < 1) continue;\n try {\n validateNoteBlocks(note.rawContent, note.blocks, note.sourceRevision);\n parents.set(note.id, note);\n } catch {\n // Corrupt source maps cannot supply actionable query results.\n }\n }\n return rows.flatMap(row => {\n const note = parents.get(row.noteId);\n const block = note?.blocks[row.blockId];\n if (!note || !block || row.id !== `${note.id}:${block.id}` || block.id !== row.blockId || block.kind !== row.dataType\n || block.version !== row.blockVersion || block.sourceRevision !== row.sourceRevision\n || note.sourceRevision !== row.sourceRevision || block.from !== row.from || block.to !== row.to) return [];\n return [{ ...row, rawContent: note.rawContent.slice(block.from, block.to) }];\n });\n }\n /**\n * Execute a :block query against the derived block_index store.\n */\n async runFindBlock(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n // One store: the seed importer materializes corpus rows next to user rows.\n // Domain candidate read — selection (source clauses + fence) narrows\n // before the wire's selectedCount; compiled positive literal type/noteId\n // clauses ride as post-count FILTERS so the count baselines the\n // historical pre-filter stages.selected. All remaining stages re-run in\n // JS and own the result.\n const read = compileContentRead(parsed.filters, 'block');\n const paging = domainPaging(parsed, options, read.residual);\n const fetchedBlocks = (read.filters.length > 0 || read.selection.length > 1 || paging.paged) && this.blockStore.queryDomain\n ? await this.blockStore.queryDomain({\n plan: 'blocks',\n selection: read.selection,\n ...(read.filters.length ? { filters: read.filters } : {}),\n ...(paging.order ? { order: paging.order } : {}),\n ...(paging.offset !== undefined ? { offset: paging.offset } : {}),\n ...(paging.limit !== undefined ? { limit: paging.limit } : {}),\n })\n : undefined;\n const domainBlocks = fetchedBlocks && fetchedBlocks.plan === 'blocks' ? fetchedBlocks : undefined;\n const candidates = domainBlocks ? domainBlocks.rows : await this.blockStore.getAllBlocks();\n let blocks = await this.hydrateBlocks(candidates);\n const invalidCandidates = blocks.length !== candidates.length;\n const selectedFromDomain = domainBlocks && !invalidCandidates ? domainBlocks.selectedCount : undefined;\n const blocksPaged = !!domainBlocks && paging.paged && !invalidCandidates;\n if (domainBlocks && invalidCandidates) blocks = await this.hydrateBlocks(await this.blockStore.getAllBlocks());\n blocks = applySourceFilter(blocks, parsed.filters);\n // WQL boundary (same as notes): the four allowed kinds plus sourceless\n // legacy rows — feeds excised at the vocabulary never enter results.\n blocks = blocks.filter((b) => !b.sourceId || WQL_SOURCE_VALUES.some((k) => sourceMatches(b, k)));\n const selectedCount = selectedFromDomain ?? blocks.length;\n const ctx = runContext(options);\n // Text filter — substring on rawContent\n for (const filter of parsed.filters) {\n if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n blocks = blocks.filter(b => filter.negate !== b.rawContent.toLowerCase().includes(search));\n }\n }\n\n // Type filter selects actionable kinds only.\n for (const filter of parsed.filters) {\n if (filter.key === 'type' && !filter.negate) {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => wanted.has(b.dataType));\n }\n }\n\n // Catalog filter — catalog directory id\n for (const filter of parsed.filters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => {\n const cat = catalogOfItem(b);\n if (!cat) return filter.negate;\n const hit = wanted.has(cat);\n return filter.negate ? !hit : hit;\n });\n }\n }\n blocks = applyNotebookFilter(blocks, parsed.filters);\n\n // Tags filter — matches if the parent note has the tag\n for (const filter of parsed.filters) {\n if (filter.key === 'tags' && !filter.negate) {\n const matchingNoteIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingNoteIds.add(id));\n }\n blocks = blocks.filter(b => matchingNoteIds.has(b.noteId));\n } else if (filter.key === 'effort' && !filter.negate) {\n const matchingBlockIds = new Set<string>();\n for (const v of filter.values) {\n const rows = await this.blockEffortsStore.getAllFromIndex('by-effort', v.value);\n for (const row of rows) matchingBlockIds.add(`${row.noteId}:${row.blockId}`);\n }\n blocks = blocks.filter(block => matchingBlockIds.has(`${block.noteId}:${block.blockId}`));\n }\n }\n\n // Note filter — exact parent note id\n for (const filter of parsed.filters) {\n if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n blocks = blocks.filter(b => (filter.negate ? !wanted.has(b.noteId) : wanted.has(b.noteId)));\n }\n }\n\n // Time window: parent note's date, falling back to note createdAt, falling back to block createdAt\n if (parsed.window || options.range) {\n const allNotes = await this.noteStore.getAllNotes();\n const noteTimeMap = new Map<string, number>(allNotes.map((n) => [n.id, n.date ?? n.createdAt]));\n blocks = blocks.filter(b => effectiveTimeWindow(noteTimeMap.get(b.noteId) ?? b.createdAt, parsed.window, options.range, ctx));\n }\n\n // Cross-store join (direction 1): keep blocks whose raw-log metric\n // aggregate satisfies the predicate.\n if (parsed.join) {\n const joined = await this.applyMetricJoin(parsed, [], blocks);\n blocks = joined.blocks;\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n blocks = [...blocks].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n // Server-paged reads already applied offset/limit in natural id order —\n // re-slicing a pre-sliced page would skip rows.\n if (!blocksPaged && pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n blocks = pipes.limit !== undefined ? blocks.slice(offset, offset + pipes.limit) : blocks.slice(offset);\n }\n\n return { parsed, notes: [], blocks, stages: { selected: selectedCount, matched: blocks.length } };\n }\n\n /**\n * Execute a :effort query against the effort registry.\n */\n async runFindEffort(parsed: ParsedFindQuery): Promise<FindQueryResult> {\n const all = await this.effortStore.getAllEfforts();\n const selectedCount = all.length;\n\n const matches = (effort: IEffort, key: string, value: string, wildcard: boolean): boolean => {\n const needle = value.toLowerCase();\n switch (key) {\n case 'effort':\n if (wildcard) {\n return effort.slug.includes(needle)\n || effort.label.toLowerCase().includes(needle)\n || effort.aliases.some(a => a.toLowerCase().includes(needle));\n }\n return effort.slug === value\n || effort.label.toLowerCase() === needle\n || effort.aliases.some(a => a.toLowerCase() === needle);\n case 'discipline': return effort.baseAttributes.discipline === value;\n case 'intensity': return effort.baseAttributes.intensityTier === value;\n case 'origin': return effort.registrySource === value;\n case 'text':\n return effort.label.toLowerCase().includes(needle)\n || effort.slug.includes(needle)\n || effort.aliases.some(a => a.toLowerCase().includes(needle));\n default: return true;\n }\n };\n\n let efforts = all;\n for (const filter of parsed.filters) {\n if (!['effort', 'discipline', 'intensity', 'origin', 'text'].includes(filter.key)) continue;\n efforts = efforts.filter(effort => {\n const hit = filter.values.some(v => matches(effort, filter.key, v.value, v.wildcard));\n return filter.negate ? !hit : hit;\n });\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n efforts = [...efforts].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n const pipes = parsed.pipes;\n if (pipes && (pipes.limit !== undefined || (pipes.offset ?? 0) > 0)) {\n const offset = pipes.offset ?? 0;\n efforts = pipes.limit !== undefined ? efforts.slice(offset, offset + pipes.limit) : efforts.slice(offset);\n }\n\n return { parsed, notes: [], blocks: [], efforts, stages: { selected: selectedCount, matched: efforts.length } };\n }\n\n async run(parsed: AnyParsedQuery, options: QueryOptions = {}): Promise<QueryResult> {\n // Explicit family handling — no unchecked cast past the guards.\n if (isPipelineQuery(parsed)) {\n throw new Error('Pipeline queries do not aggregate directly — execute them with runPipeline().');\n }\n if (isFindQuery(parsed)) {\n // Content queries never aggregate; retired rows: text surfaces here as\n // a parse-errored find AST and returns the telemetry-zero result.\n return {\n parsed: { family: 'aggregate', raw: parsed.raw, agg: 'count', metric: parsed.target, filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n ...(parsed.error ? { error: parsed.error } : {}),\n };\n }\n const empty: QueryResult = {\n parsed,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n };\n if (parsed.error) return empty;\n\n // Cross-store join: reads stored summary rows over the content index —\n // the store is authoritative (finalize-owns, ticket 005).\n if (parsed.join) return this.runJoined(parsed, options);\n\n // Stage 1: SELECT — window-first hybrid (ticket 003): a time window\n // fetches through by-timestamp, the one proven culling index; all-time\n // queries scan. by-metric is never used — ticket 001 measured it\n // non-selective and slower than scanning.\n // C1 + ticket 12 precedence: the query's own window WINS over the host\n // range options — the host range is the default when the query has none.\n // Resolution uses the one captured execution context (half-open bounds).\n const ctx = runContext(options);\n const range = resolveAggregateRange(parsed, options, ctx);\n // The store fetch bound is an upper cutoff, not the membership test —\n // pass the resolved end through unchanged (MAX_SAFE_INTEGER for the\n // unbounded side).\n const fetchRange = range ? { start: range.start, end: range.end } : undefined;\n // Complete fetch (ticket 12/14): a bounded window fetches through\n // by-timestamp and unions by-metric-date candidates over EVERY covered\n // civil date — no cap, DST-safe enumeration. An unbounded side (the 0 /\n // MAX_SAFE_INTEGER sentinels, or a negative open bound) has no finite\n // date horizon to enumerate — the all-store scan IS the complete fetch;\n // membership filtering below stays exact either way.\n const boundedRange =\n fetchRange && fetchRange.start > 0 && fetchRange.end < Number.MAX_SAFE_INTEGER ? fetchRange : undefined;\n let eventRows = boundedRange\n ? await this.store.getEventsByTimeRange(boundedRange.start, boundedRange.end)\n : await this.store.scanAll();\n if (boundedRange && this.store.getEventsByMetricDates) {\n const civilDates = civilDatesCoveredByRange(boundedRange.start, boundedRange.end, ctx.timeZone);\n if (civilDates.length > 0) {\n const byDate = await this.store.getEventsByMetricDates(civilDates);\n if (byDate.length > 0) {\n const seen = new Set(eventRows.map((r) => r.id));\n eventRows = [...eventRows, ...byDate.filter((r) => !seen.has(r.id))];\n }\n }\n }\n return this.aggregateEventRows(parsed, eventRows, options, range);\n }\n\n /**\n * In-memory aggregation over ALREADY-FETCHED event rows — the pipeline\n * dataset/transform path. Identical metric projection, selection,\n * bucketing, unit, and aggregation stages as `run`; no store reads (a\n * content join on carried data is REJECTED by runAggregateEvents — it\n * would abandon the carried population).\n */\n async runAggregateEvents(query: ParsedAggregateQuery, events: readonly EventRecord[], options: QueryOptions = {}): Promise<QueryResult> {\n const empty: QueryResult = {\n parsed: query,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n };\n if (query.error) return empty;\n // A content join resolves its scope from the STORE — that would abandon\n // the carried population. Author the join on the pipeline's source stage\n // instead.\n if (query.join) {\n return {\n ...empty,\n error: 'where <content> joins re-read the store and cannot run on carried pipeline data — author the join in the source stage.',\n };\n }\n const ctx = runContext(options);\n const range = resolveAggregateRange(query, options, ctx);\n return this.aggregateEventRows(query, events, options, range);\n }\n\n /** Public pipeline executor — parse the text, then run. */\n async runPipeline(queryText: string, options: PipelineOptions = {}): Promise<PipelineResult> {\n return this.runPipelineParsed(parseQuery(queryText), options);\n }\n\n /** Execute an already-parsed pipeline: resolve the source once, then flow\n * the carried value left to right through the transforms — each function\n * reduces the PRECEDING stage, never an independent re-query. Dataset\n * stages look up `pageSources` (then an injected datasetStore)\n * synchronously; no database roundtrip. */\n async runPipelineParsed(parsed: AnyParsedQuery, options: PipelineOptions = {}): Promise<PipelineResult> {\n if (!isPipelineQuery(parsed)) {\n const error = parsed.error ?? `Not a pipeline: \"${parsed.raw}\". Pipelines look like :source{filters} | :sum{metric:x} | :table.`;\n return { parsed: { family: 'pipeline', raw: parsed.raw, source: { kind: 'dataset', name: '' }, transforms: [], error }, error };\n }\n const fail = (error: string): PipelineResult => ({ parsed, error });\n if (parsed.error) return fail(parsed.error);\n\n let content: FindQueryResult | undefined;\n let carried: QueryResult | undefined;\n let sourceEvents: EventRecord[] | undefined;\n let datasetNotes: Note[] = [];\n\n if (parsed.source.kind === 'dataset') {\n const name = parsed.source.name;\n const dataset = options.pageSources?.get(name) ?? this.datasetStore?.getDataset(name);\n if (!dataset) return fail(`Unknown dataset \"${name}\" — the host must register it before the query runs.`);\n sourceEvents = dataset.events;\n datasetNotes = dataset.notes;\n } else if (isFindQuery(parsed.source.query)) {\n const q = parsed.source.query;\n content = await this.runFind(q, {\n context: options.context,\n ...((options.rangeStart !== undefined || options.rangeEnd !== undefined)\n ? { range: { start: options.rangeStart ?? 0, end: options.rangeEnd ?? Number.MAX_SAFE_INTEGER, endExclusive: false } }\n : {}),\n });\n if (q.error) return fail(q.error);\n } else {\n carried = await this.run(parsed.source.query, options);\n if (parsed.source.query.error) return fail(parsed.source.query.error);\n }\n\n if (parsed.transforms.length === 0) {\n // Source-only pipeline (optionally with a chart sink) — the stage\n // result surfaces as-is, no event resolution.\n if (content) {\n return {\n parsed,\n ...(content.notes.length ? { notes: content.notes } : {}),\n ...(content.blocks.length ? { blocks: content.blocks } : {}),\n ...(content.efforts?.length ? { efforts: content.efforts } : {}),\n ...(content.runs?.length ? { runs: content.runs } : {}),\n ...(content.table ? { table: content.table } : {}),\n ...(content.containers ? { containers: content.containers } : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n if (parsed.source.kind === 'dataset') {\n // Dataset alone — its notes are the surface; telemetry flows only\n // through transforms.\n return { parsed, notes: datasetNotes, ...(parsed.sink ? { chart: parsed.sink } : {}) };\n }\n return {\n parsed,\n ...(carried\n ? { series: carried.series, ...(carried.unit ? { unit: carried.unit } : {}), ...(carried.error ? { error: carried.error } : {}) }\n : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n\n if (!carried) {\n if (!sourceEvents && content) sourceEvents = await this.sourceEventsFromFind(content);\n carried = await this.runAggregateEvents(parsed.transforms[0]!, sourceEvents ?? [], options);\n for (const transform of parsed.transforms.slice(1)) {\n if (carried.error) break; // an errored stage stops the pipeline\n carried = reduceCarriedResult(carried, transform, options, runContext(options));\n }\n } else {\n for (const transform of parsed.transforms) {\n if (carried.error) break; // an errored stage stops the pipeline\n carried = reduceCarriedResult(carried, transform, options, runContext(options));\n }\n }\n return {\n parsed,\n series: carried.series,\n ...(carried.unit ? { unit: carried.unit } : {}),\n ...(carried.error ? { error: carried.error } : {}),\n ...(parsed.sink ? { chart: parsed.sink } : {}),\n };\n }\n\n /** Events behind a content source — resolved ONLY when a transform needs\n * them: session/table sources already carry their rows; note sources read\n * the per-note index; block sources read the content index. */\n private async sourceEventsFromFind(content: FindQueryResult): Promise<EventRecord[]> {\n if (content.events) return content.events;\n const rows: EventRecord[] = [];\n for (const note of content.notes) rows.push(...await this.store.getEventsForNote(note.id));\n for (const block of content.blocks) {\n if (block.dataType === 'wod' && block.blockContentId) rows.push(...await this.store.getEventsByContent(block.blockContentId));\n }\n return rows;\n }\n\n /** QueryExecutor adapter: a pipeline run's final stage rendered as the\n * aggregate QueryResult shape chart consumers already read. */\n private pipelineResultToQueryResult(pr: PipelineResult): QueryResult {\n const parsed: ParsedAggregateQuery = { family: 'aggregate', raw: pr.parsed.raw, agg: 'count', metric: '', filters: [], groupBy: [] };\n if (pr.series) {\n const aggregated = pr.series.reduce((n, s) => n + s.points.length, 0);\n return {\n parsed,\n series: pr.series,\n stages: { selected: 0, buckets: pr.series[0]?.points.length ?? 0, aggregated, groups: pr.series.length },\n matched: [],\n ...(pr.unit ? { unit: pr.unit } : {}),\n ...(pr.error ? { error: pr.error } : {}),\n };\n }\n return {\n parsed, series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n ...(pr.error ? { error: pr.error } : {}),\n };\n }\n\n /** Stages 2–4 over raw event rows: project → metric filter → range filter\n * → tag filters → coverage selection → BUCKET/GROUP/AGGREGATE. */\n private async aggregateEventRows(\n parsed: ParsedAggregateQuery,\n eventRows: readonly EventRecord[],\n options: QueryOptions,\n range: ResolvedRange | undefined,\n ): Promise<QueryResult> {\n const ctx = runContext(options);\n if (!parsed.metric && parsed.agg !== 'count') {\n return {\n parsed,\n series: [],\n stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 },\n matched: [],\n error: `Aggregate \"${parsed.agg}\" requires a metric — use ${parsed.agg}{metric:<key>}`,\n };\n }\n const matchesMetric = (metricKey: string | undefined, queryMetric: string) =>\n !queryMetric ||\n metricKey === queryMetric ||\n (queryMetric === 'rep' && metricKey === 'reps') ||\n (queryMetric === 'reps' && metricKey === 'rep');\n\n const factTime = (row: AnalyticsDataPoint): number => {\n if (row.metricDate) return zonedNoon(row.metricDate, ctx.timeZone);\n return row.timestamp;\n };\n\n const candidates = eventRows\n .flatMap(projectEventToFacts)\n .filter(row => matchesMetric(row.metricKey, parsed.metric))\n .filter(row => !range || inRange(factTime(row), range));\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(candidates, touchesTags);\n // Ticket 16: no global effort suppression — coverage selection below\n // keeps every population represented exactly once.\n const matched = candidates.filter(row => matchesFilters(row, parsed.filters, noteTags));\n\n const { selected, report } = selectContributions(matched, parsed.agg);\n return this.buildResult(selected, parsed, options, noteTags, range, report);\n }\n\n /**\n * Stages 2–4 — BUCKET → GROUP → AGGREGATE over an already-selected +\n * filtered `matched` set.\n */\n private buildResult(\n matched: AnalyticsDataPoint[],\n parsed: ParsedAggregateQuery,\n options: QueryOptions,\n noteTags: ReadonlyMap<string, readonly string[]>,\n range: ResolvedRange | undefined,\n coverage?: CoverageReport,\n ): QueryResult {\n const ctx = runContext(options);\n // Stage 2: BUCKET — structural bucket identity (ticket 12): calendar\n // day buckets anchor on the observation's civil date in the context\n // timezone, week buckets on the Monday date; fixed-duration `.rollup`\n // keeps its epoch-aligned width (a deliberately distinct kind, not a\n // calendar week). Display timestamps (local noon / epoch midpoint) are\n // presentation-only — never join keys.\n const timeDim = parsed.groupBy.find((d) => d === 'day' || d === 'week');\n const tagDims = parsed.groupBy.filter((d) => d !== 'day' && d !== 'week');\n const rollup = parsed.rollup;\n\n /** The observation's own temporal anchor: its recorded metric date when\n * it carries one (date-only facts keep their civil date), else the\n * fact timestamp's civil date in the context timezone. */\n const anchorDate = (row: AnalyticsDataPoint): string =>\n row.metricDate ?? civilDateOf(row.timestamp, ctx.timeZone);\n const bucketKey = (row: AnalyticsDataPoint): string => {\n if (timeDim === 'day') return `d:${anchorDate(row)}`;\n if (timeDim === 'week') return `w:${civilMonday(anchorDate(row))}`;\n if (rollup) {\n const ad = anchorDate(row);\n if (rollup.unit === 'w') {\n const m = civilMonday(ad);\n const weeksSince = Math.floor(civilDateDiff('1970-01-05', m) / 7);\n const bucketIndex = Math.floor(weeksSince / rollup.size);\n const bucketStart = civilDateAdd('1970-01-05', bucketIndex * rollup.size * 7);\n return `w:${bucketStart}`;\n }\n if (rollup.unit === 'd') {\n const daysSince = civilDateDiff('1970-01-01', ad);\n const bucketIndex = Math.floor(daysSince / rollup.size);\n const bucketStart = civilDateAdd('1970-01-01', bucketIndex * rollup.size);\n return `d:${bucketStart}`;\n }\n }\n return '';\n };\n /** Presentation-only representative instant for a structural key. */\n const bucketDisplayTs = (key: string): number => {\n if (key.startsWith('d:') || key.startsWith('w:')) return zonedNoon(key.slice(2), ctx.timeZone);\n return Number.MAX_SAFE_INTEGER;\n };\n\n // Chronological bucket domain (ticket 12): bounded calendar queries\n // generate every period in the requested bounds — including empty ones;\n // unbounded sides use the observed extent; relative windows never\n // generate future buckets because their exclusive end is the captured\n // instant. No domain generation for rollup (duration buckets are\n // observed-only) or ungrouped queries.\n const MAX_DOMAIN = 10_000;\n const bareDate = (key: string): string => (key.startsWith('d:') || key.startsWith('w:') ? key.slice(2) : key);\n const calendarDomain = (observed: string[]): string[] => {\n const activeDim = timeDim ?? (rollup?.unit === 'w' ? 'week' : rollup?.unit === 'd' ? 'day' : undefined);\n if (!activeDim || observed.length === 0) return observed;\n const bounds = range && range.end !== Number.MAX_SAFE_INTEGER\n ? {\n startIso: civilDateOf(range.start, ctx.timeZone),\n endIso: range.endExclusive ? civilDateOf(range.end - 1, ctx.timeZone) : civilDateOf(range.end, ctx.timeZone),\n }\n : { startIso: bareDate(observed[0]!), endIso: bareDate(observed[observed.length - 1]!) };\n const first = activeDim === 'week' ? civilMonday(bounds.startIso) : bounds.startIso;\n const last = activeDim === 'week' ? civilMonday(bounds.endIso) : bounds.endIso;\n const step = activeDim === 'week' ? 7 * (rollup?.size ?? 1) : (rollup?.size ?? 1);\n const span = civilDateDiff(first, last);\n if (span < 0 || span / step > MAX_DOMAIN) return observed;\n const domain: string[] = [];\n for (let cursor = first; ; cursor = civilDateAdd(cursor, step)) {\n domain.push(activeDim === 'week' ? `w:${cursor}` : `d:${cursor}`);\n if (cursor >= last) break;\n }\n return domain;\n };\n\n // Output unit (ticket 13): explicit `in <unit>` directive wins when\n // dimensionally compatible; otherwise the system default for the\n // observations' dimension; unitless observations stay unitless. No\n // first-record fallback, no widget-preference tier.\n const unitResolution = resolveOutputUnit(matched, {\n directive: parsed.displayUnit,\n preferred: options.preferredUnit,\n });\n const targetUnit = unitResolution.unit;\n const shouldConvert = unitResolution.convert === true;\n const seriesError = unitResolution.error;\n\n // Stage 3+4: GROUP + AGGREGATE per bucket. Group identity (ticket 16)\n // is the canonical ordered tuple of resolved dimension values, JSON\n // encoded — delimiter-containing labels cannot collide; a missing\n // dimension resolves to the structural UNASSIGNED sentinel (distinct\n // from any literal text). The display label is derived, never identity.\n const UNASSIGNED = '\\u0000unassigned';\n const unassignedLabel = 'unassigned';\n const groups = new Map<string, { label: string; rows: AnalyticsDataPoint[] }>();\n for (const row of matched) {\n const tuple = tagDims.map((d) => dimValue(row, d, noteTags, ctx));\n const key = tagDims.length ? JSON.stringify(tuple) : parsed.metric;\n const label = tagDims.length\n ? tuple.map((v) => (v === UNASSIGNED ? unassignedLabel : v)).join(' · ')\n : parsed.metric;\n const bucket = groups.get(key);\n if (bucket) bucket.rows.push(row);\n else groups.set(key, { label, rows: [row] });\n }\n\n const series: Series[] = [...groups.entries()].map(([key, group]) => {\n const rows = group.rows;\n if (seriesError) {\n return { key, label: group.label, points: [], unit: undefined, error: seriesError };\n }\n const byBucket = new Map<string, AnalyticsDataPoint[]>();\n for (const row of rows) {\n const b = bucketKey(row);\n const members = byBucket.get(b);\n if (members) members.push(row);\n else byBucket.set(b, [row]);\n }\n const observedKeys = [...byBucket.keys()].sort();\n const domain = timeDim ? calendarDomain(observedKeys) : observedKeys;\n let error: string | undefined;\n const points: SeriesPoint[] = domain.map((b) => {\n const members = byBucket.get(b);\n if (!members) {\n // Missing query position (ticket 12 domain + ticket 13 matrix):\n // zero-filled with absence provenance — never an observation.\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n // Compatible-unit normalization BEFORE arithmetic (finding 3.3).\n let values: number[];\n try {\n values = members.map((m) =>\n shouldConvert && targetUnit && (m.unit ?? m.metricUnit) !== undefined\n ? convertViaCatalog(m.value as number, (m.unit ?? m.metricUnit) as string, targetUnit)\n : m.value as number,\n );\n } catch (e) {\n error = e instanceof Error ? e.message : String(e);\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n const reduced = aggregate(values, parsed.agg, members);\n if (reduced.state === 'error') {\n error = reduced.message;\n return { ts: bucketDisplayTs(b), value: 0, missing: true };\n }\n return {\n ts: timeDim || rollup\n ? bucketDisplayTs(b)\n : Math.min(...members.map((m) => m.timestamp)),\n // Unrounded — renderers format (ticket 13 precision policy).\n value: reduced.value,\n ...(reduced.state === 'absent' ? { missing: true } : {}),\n };\n });\n // `count` reduces to the count dimension regardless of input.\n // Output unit is the resolved one — count reduces to count; no\n // first-record fallback (ticket 13 cutover).\n const seriesUnit = parsed.agg === 'count' ? 'count' : targetUnit;\n return { key, label: group.label, points, unit: seriesUnit, ...(error ? { error } : {}) };\n });\n\n const aggregated = series.reduce((n, s) => n + s.points.length, 0);\n const scalar = series.length === 1 && series[0].points.length === 1 ? series[0].points[0].value : undefined;\n const resultUnit = series.length > 0 ? series[0].unit : undefined;\n const bucketCount = timeDim || rollup\n ? (series[0]?.points.length ?? 0)\n : (matched.length ? 1 : 0);\n\n const insufficient = coverage?.insufficientScopes ?? [];\n const resultError = series.find((s) => s.error)?.error\n ?? (insufficient.length > 0\n ? `Insufficient evidence: ${insufficient.map((s) => `${s.resultId}/${s.metricKey} (${s.reason})`).join('; ')}`\n : undefined);\n return {\n parsed,\n series,\n stages: { selected: matched.length, buckets: bucketCount, aggregated, groups: series.length },\n matched,\n scalar,\n unit: resultUnit,\n ...(resultError ? { error: resultError } : {}),\n ...(coverage ? { coverage } : {}),\n };\n }\n\n /** Direction 2 — re-derive the metric from raw logs, restricted to the\n * blockContentIds owned by the find predicate's content matches. */\n private async runJoined(parsed: ParsedAggregateQuery, options: QueryOptions): Promise<QueryResult> {\n const empty: QueryResult = {\n parsed, series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n const join = parsed.join as FindPredicate;\n const findResult = await this.runFind({\n family: 'find',\n raw: '', target: join.target, filters: join.filters,\n window: join.last ? { kind: 'relative', size: join.last.size, unit: join.last.unit } : undefined,\n });\n const contentIds = await this.contentIdsFromFindResult(findResult);\n if (contentIds.size === 0) return empty;\n\n // Ticket 16: content-joined queries keep eligible event-grain\n // observations (the summary-only join filter is gone); overlapping\n // scope fetches dedupe by stable observation identity.\n let facts = dedupeById(await this.deriveMetricFacts(contentIds, parsed.metric));\n // Ticket 12 precedence + context: query window wins; host range is the\n // default; membership half-open against the captured context.\n const ctx = runContext(options);\n const joinRange = resolveAggregateRange(parsed, options, ctx);\n if (joinRange) {\n facts = facts.filter(f => inRange(f.timestamp, joinRange));\n }\n\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(facts, touchesTags);\n const matched = facts.filter(f => matchesFilters(f, parsed.filters, noteTags));\n const { selected, report } = selectContributions(matched, parsed.agg);\n return this.buildResult(selected, parsed, options, noteTags, joinRange, report);\n }\n\n /** Direction 1 — keep only content owning a wod block whose raw-log metric\n * aggregate satisfies the predicate. `notes` for :note, `blocks` for\n * :block. */\n private async applyMetricJoin(\n parsed: ParsedFindQuery,\n notes: Note[],\n blocks: BlockIndexRow[],\n ): Promise<{ notes: Note[]; blocks: BlockIndexRow[] }> {\n const join = parsed.join as MetricPredicate;\n // Resolve the wod blockContentIds owned by each candidate note.\n const noteToContent = await this.noteContentMap(new Set(notes.map(n => n.id)));\n // Candidate content ids: wod blocks owned by matched notes or blocks.\n const candidateIds = new Set<string>();\n for (const set of noteToContent.values()) for (const id of set) candidateIds.add(id);\n for (const b of blocks) if (b.dataType === 'wod' && b.blockContentId) candidateIds.add(b.blockContentId);\n\n const passing = await this.contentIdsSatisfying(candidateIds, join);\n\n // :block — only wod blocks whose content id passes (prose has no metric).\n blocks = blocks.filter(b => b.dataType === 'wod' && !!b.blockContentId && passing.has(b.blockContentId!));\n // :note — keep notes owning ≥1 passing wod block.\n notes = notes.filter(n => {\n const cids = noteToContent.get(n.id);\n return !!cids && [...cids].some(id => passing.has(id));\n });\n return { notes, blocks };\n }\n\n /** Re-derive the metric from raw logs for each content id, aggregate per id,\n * and return the ids whose aggregate satisfies the join predicate. */\n private async contentIdsSatisfying(\n contentIds: Set<string>,\n join: MetricPredicate,\n ): Promise<Set<string>> {\n const facts = dedupeById(await this.deriveMetricFacts(contentIds, join.metric));\n const noteTags = await this.loadNoteTags(facts, join.filters.some(f => f.key === 'tags'));\n const filtered = selectContributions(\n facts.filter(f => matchesFilters(f, join.filters, noteTags)),\n join.agg,\n ).selected;\n const byContent = new Map<string, AnalyticsDataPoint[]>();\n for (const f of filtered) {\n const cid = f.blockContentId ?? '';\n const arr = byContent.get(cid);\n if (arr) arr.push(f);\n else byContent.set(cid, [f]);\n }\n const passing = new Set<string>();\n for (const [cid, rows] of byContent) {\n const values = rows.map(r => r.value as number);\n const reduced = aggregate(values, join.agg, rows);\n if (reduced.state !== 'observed') continue; // absent/insufficient never satisfies\n if (compareOp(reduced.value, join.operator, join.threshold)) passing.add(cid);\n }\n return passing;\n }\n\n\n /** Summary facts for one Canonical Metric Key across the given content ids —\n * the cross-store join source. Reads finalize-written summary rows straight\n * off the content index (ticket 003: the store is authoritative; the old\n * freshness re-derivation is moot). One fact row per result × rowKey. */\n private async deriveMetricFacts(\n contentIds: Iterable<string>,\n metricKey: string,\n ): Promise<AnalyticsDataPoint[]> {\n const ids = [...new Set(contentIds)];\n const rows = await Promise.all(ids.map((blockContentId) => this.store.getEventsByContent(blockContentId)));\n // Ticket 16 (finding 3.7): content-joined queries read every eligible\n // representation — the coverage selection shares the direct path's\n // contract, so detail rows are no longer filtered out here.\n return rows\n .flat()\n .flatMap(projectEventToFacts)\n .filter((f) => f.metricKey === metricKey);\n }\n\n /** All content blocks — journal and seeded corpus in one store. */\n private async allContentBlocks(): Promise<BlockIndexRow[]> {\n return this.hydrateBlocks(await this.blockStore.getAllBlocks());\n }\n\n /** Map each note id to the wod blockContentIds it owns. */\n private async noteContentMap(noteIds: Set<string>): Promise<Map<string, Set<string>>> {\n const map = new Map<string, Set<string>>();\n if (!noteIds.size) return map;\n const allBlocks = await this.allContentBlocks();\n for (const b of allBlocks) {\n if (b.dataType !== 'wod' || !b.blockContentId || !noteIds.has(b.noteId)) continue;\n let set = map.get(b.noteId);\n if (!set) { set = new Set(); map.set(b.noteId, set); }\n set.add(b.blockContentId);\n }\n return map;\n }\n\n /** Collect wod blockContentIds owned by a find query's content matches. */\n private async contentIdsFromFindResult(findResult: FindQueryResult): Promise<Set<string>> {\n const ids = new Set<string>();\n for (const b of findResult.blocks) if (b.dataType === 'wod' && b.blockContentId) ids.add(b.blockContentId);\n if (findResult.notes.length) {\n const noteIds = new Set(findResult.notes.map(n => n.id));\n const noteMap = await this.noteContentMap(noteIds);\n for (const set of noteMap.values()) for (const id of set) ids.add(id);\n }\n return ids;\n }\n\n /** Load note tag labels only when the query touches 'tags'. Batched when\n * a relationStore is injected — one bundle read per run instead of a\n * junction read per row's note. */\n private async loadNoteTags(rows: AnalyticsDataPoint[], touchesTags: boolean): Promise<Map<string, readonly string[]>> {\n const noteTags = new Map<string, readonly string[]>();\n if (!touchesTags) return noteTags;\n const noteIds = [...new Set(rows.map(r => r.noteId))];\n if (this.relationStore) {\n const bundles = await this.relationStore.getBatches(noteIds);\n for (const id of noteIds) {\n noteTags.set(id, (bundles.get(id)?.tags ?? []).map((t) => t.label));\n }\n return noteTags;\n }\n await Promise.all(noteIds.map(async (id) => noteTags.set(id, await this.noteStore.getNoteTagLabels(id))));\n return noteTags;\n }\n\n /** Resolve matching note IDs for an exercise slug via the block_efforts containment index. */\n private async getNoteIdsForEffort(effortSlug: string): Promise<Set<string>> {\n const rows = await this.blockEffortsStore.getAllFromIndex('by-effort', effortSlug);\n return new Set(rows.map(r => r.noteId));\n }\n\n /** Resolve matching note IDs for a canonical typed tag (e.g. equipment:kettlebell). */\n private async getNoteIdsForTypedTag(type: string, label: string): Promise<Set<string>> {\n const tags = await this.tagsStore.getAllFromIndex('by-label', label);\n const typedTag = tags.find(t => t.type === type);\n if (!typedTag) return new Set();\n const links = await this.noteTagsStore.getAllFromIndex('by-tag', typedTag.id);\n return new Set(links.map(l => l.noteId));\n }\n\n /**\n * Find catalogs: identifies catalogs whose member notes (or catalog landing\n * notes) match the authored criteria (effort, tags, text, typed tags, etc.).\n */\n private async runFindCatalog(parsed: ParsedFindQuery, options: FindOptions, allNotes: Note[]): Promise<FindQueryResult> {\n const ctx = runContext(options);\n const feedNotes = allNotes.filter(n => sourceMatches(n, 'feeds') || (n.catalog && !n.sourceId));\n\n let catalogNotes = feedNotes.filter(n => n.type === 'feed' || n.sourceId?.startsWith('page:collection:'));\n const existingCatIds = new Set(catalogNotes.map(n => catalogOfItem(n) ?? n.id));\n for (const n of feedNotes) {\n const cat = catalogOfItem(n);\n if (cat && !existingCatIds.has(cat)) {\n catalogNotes.push({\n id: cat,\n title: cat,\n type: 'feed',\n sourceId: `page:collection:${cat}`,\n catalog: cat,\n createdAt: n.createdAt ?? 0,\n rawContent: '', sourceRevision: 1, blocks: {},\n });\n existingCatIds.add(cat);\n }\n }\n\n const membersByCat = new Map<string, Note[]>();\n for (const catNote of catalogNotes) {\n const catId = catalogOfItem(catNote) ?? catNote.id;\n membersByCat.set(catId, [catNote]);\n }\n for (const n of feedNotes) {\n const catId = catalogOfItem(n);\n if (catId) {\n const list = membersByCat.get(catId);\n if (list) {\n if (!list.includes(n)) list.push(n);\n } else {\n membersByCat.set(catId, [n]);\n }\n }\n }\n\n const criteriaFilters = parsed.filters.filter(f =>\n !(f.key === 'source' && !f.negate && f.values.some(v => v.value === 'feeds' || v.value === 'feed')) &&\n !(f.key === 'type' && !f.negate && f.values.some(v => v.value === 'feed'))\n );\n\n let matchingCatalogs = [...catalogNotes];\n\n for (const filter of criteriaFilters) {\n if (filter.key === 'catalog') {\n const wanted = new Set(filter.values.map(v => v.value));\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const hit = wanted.has(catId);\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'effort') {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForEffort(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'tags') {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.noteStore.getNoteIdsForTag(v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id) || (m.tags && filter.values.some(v => m.tags!.includes(v.value))));\n return filter.negate ? !hit : hit;\n });\n } else if (WQL_TYPED_TAG_KEYS.includes(filter.key as WqlTypedTagKey)) {\n const matchingIds = new Set<string>();\n for (const v of filter.values) {\n const ids = await this.getNoteIdsForTypedTag(filter.key, v.value);\n ids.forEach(id => matchingIds.add(id));\n }\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => matchingIds.has(m.id));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'text') {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => m.title.toLowerCase().includes(search) || m.rawContent.toLowerCase().includes(search));\n return filter.negate ? !hit : hit;\n });\n } else if (filter.key === 'note') {\n const wanted = new Set(filter.values.map(v => v.value));\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n const hit = members.some(m => wanted.has(m.id));\n return filter.negate ? !hit : hit;\n });\n }\n }\n\n if (parsed.window || options.range) {\n matchingCatalogs = matchingCatalogs.filter(c => {\n const catId = catalogOfItem(c) ?? c.id;\n const members = membersByCat.get(catId) ?? [];\n return members.some(m => effectiveTimeWindow(m.date ?? m.createdAt, parsed.window, options.range, ctx));\n });\n }\n\n if (parsed.pipes?.order) {\n for (const order of [...parsed.pipes.order].reverse()) {\n const dir = order.dir === 'desc' ? -1 : 1;\n matchingCatalogs = [...matchingCatalogs].sort((a, b) => {\n const av = (a as unknown as Record<string, unknown>)[order.col] ?? '';\n const bv = (b as unknown as Record<string, unknown>)[order.col] ?? '';\n if (av === bv) return 0;\n return ((av as string | number) > (bv as string | number) ? 1 : -1) * dir;\n });\n }\n }\n\n return {\n parsed,\n notes: matchingCatalogs,\n blocks: [],\n stages: { selected: catalogNotes.length, matched: matchingCatalogs.length },\n };\n }\n}\n","/**\n * Dashboard Note model (#898 map, format locked in #899).\n *\n * A dashboard is a markdown note: frontmatter marks it (`dashboard: true`) and\n * declares top-level controls as `dashboard.*` dot-keys; the body composes\n * ```query[:<type>][-<N>|-full] blocks whose title/question associate from the\n * markdown heading/paragraph directly above each block. Queries reference\n * tokens as `$name`, substituted as raw text at execution time. A block body\n * body is a Query Document (decision 22); presentation params ride the\n * fence tag as `key=value` attributes.\n *\n * This module is pure — no React, no editor, no query service — so the editor\n * extensions, the inline block renderer, and the dashboard route all share it.\n */\n\nimport { WQL_CALC_TARGETS } from '../vocabulary';\n\n// ── Widget types ───────────────────────────────────────────────────────────\n\nexport const DASHBOARD_WIDGET_TYPES = [\n 'table',\n 'list',\n 'value',\n 'timeseries',\n 'bar',\n 'donut',\n 'toplist',\n 'stacked-bar',\n 'goal-rings',\n 'zone-distribution',\n] as const;\nexport type DashboardWidgetType = (typeof DASHBOARD_WIDGET_TYPES)[number];\n\nexport function isDashboardWidgetType(type: string): type is DashboardWidgetType {\n return (DASHBOARD_WIDGET_TYPES as readonly string[]).includes(type);\n}\n\n/** The widget type a block renders as: a bare ```query fence defaults to `table`. */\nexport function resolveWidgetType(type: string | undefined): string {\n return type == null || type === '' ? 'table' : type;\n}\n\n/** Shared badge messages — the editor, inline renderer, and route all word these identically. */\nexport function unknownWidgetTypeMessage(type: string): string {\n return `unknown widget type \"${type}\"`;\n}\n\nexport function unknownTokensMessage(missing: readonly string[]): string {\n return `unknown token${missing.length > 1 ? 's' : ''}: ${missing.map((m) => `$${m}`).join(', ')}`;\n}\n\n/** Types whose renderer is planned for future maps (none remaining in #901). */\nexport const PLANNED_WIDGET_TYPES: readonly string[] = [];\n\n// The known calc.* metric set IS the canonical vocabulary (WQL_CALC_TARGETS,\n// kept in sync with the calc engine's registered outputs — #871). No\n// hand-synced duplicate here; proposed/unknown calc.* keys render as the\n// labeled placeholder badge via isProposedMetric (#901).\nconst KNOWN_CALC_METRICS: ReadonlySet<string> = new Set(WQL_CALC_TARGETS);\n\n/**\n * True when a metric is a proposed calculation not yet landed in the engine\n * (e.g. `calc.readiness`, `calc.mvcBw`, `calc.hrv`). Renderers show a labeled\n * placeholder badge (#901).\n */\nexport function isProposedMetric(metricKey: string | undefined): boolean {\n if (!metricKey) return false;\n if (!metricKey.startsWith('calc.')) return false;\n return !KNOWN_CALC_METRICS.has(metricKey);\n}\n\n// ── Fence-tag suffix parse ─────────────────────────────────────────────────\n\nexport const DASHBOARD_GRID_MAX_COLS = 4;\n\nexport interface QueryWidgetSuffix {\n /** Raw widget type from the tag, lowercased; '' for a bare ```query fence. */\n type: string;\n /** Grid column span 1..4 (`-N`). */\n spanCols?: number;\n /** Full-row flag (`-full`). Mutually exclusive with spanCols. */\n spanFull?: boolean;\n /** Presentation attributes: `key=value` tokens after the type/span\n * (decision 22 — positional params ride the fence tag, not the body). */\n attributes: Record<string, string>;\n /** Attribute order for stable re-serialization. */\n attributeOrder: string[];\n /** Set when the suffix is malformed (the type is still reported raw). */\n error?: string;\n}\n\n/**\n * Parse the suffix after `query:` in a fence tag — `<type>`, `<type>-<N>` or\n * `<type>-full`. Unknown types parse fine (renderers badge them); structural\n * problems (empty type, bad span, `-N-full` combo) set `error`.\n */\nexport function parseQueryWidgetSuffix(suffix: string): QueryWidgetSuffix {\n if (suffix === '') {\n return { type: '', attributes: {}, attributeOrder: [], error: 'missing widget type after \"query:\"' };\n }\n\n // Attributes: `key=value` pairs after the type/span token (a quoted value\n // may contain spaces). The head token carries type + span; everything\n // after the first whitespace is attribute tail.\n const attributes: Record<string, string> = {};\n const attributeOrder: string[] = [];\n const trimmedSuffix = suffix.trim();\n const headEnd = trimmedSuffix.search(/\\s/);\n const head = headEnd === -1 ? trimmedSuffix : trimmedSuffix.slice(0, headEnd);\n const attrTail = headEnd === -1 ? '' : trimmedSuffix.slice(headEnd);\n const attrPattern = /([a-zA-Z][a-zA-Z0-9_-]*)=(\"([^\"]*)\"|\\S+)/g;\n let consumed = 0;\n for (const match of attrTail.matchAll(attrPattern)) {\n consumed += match[0].length;\n const key = match[1]!.toLowerCase();\n const value = match[3] !== undefined ? match[3] : match[2]!;\n if (key in attributes) {\n return { type: head, attributes, attributeOrder, error: `duplicate attribute \"${key}\"` };\n }\n attributes[key] = value;\n attributeOrder.push(key);\n }\n const leftover = attrTail.replace(attrPattern, '').trim();\n if (leftover !== '') {\n return { type: head, attributes, attributeOrder, error: `malformed attribute \"${leftover.split(/\\s+/)[0]}\"` };\n }\n void consumed;\n\n let rest = head.toLowerCase();\n let spanCols: number | undefined;\n let spanFull: boolean | undefined;\n\n if (rest.endsWith('-full')) {\n spanFull = true;\n rest = rest.slice(0, -'-full'.length);\n } else {\n const spanMatch = rest.match(/-(\\d+)$/);\n if (spanMatch) {\n spanCols = Number(spanMatch[1]);\n rest = rest.slice(0, -spanMatch[0].length);\n }\n }\n\n if (rest === '' || !/^[a-z][a-z0-9-]*$/.test(rest)) {\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `malformed widget type \"${suffix}\"` };\n }\n if (/-(\\d+|full)$/.test(rest)) {\n // A second trailing modifier (e.g. `bar-2-full`, `bar-full-2`) — span and\n // full are mutually exclusive. Kebab hyphens inside the type are fine.\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `malformed widget suffix \"${suffix}\"` };\n }\n if (spanCols != null && (spanCols < 1 || spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { type: rest, spanCols, spanFull, attributes, attributeOrder, error: `span ${spanCols} outside 1..${DASHBOARD_GRID_MAX_COLS}` };\n }\n return { type: rest, spanCols, spanFull, attributes, attributeOrder };\n}\n\n// ── Frontmatter tokens ─────────────────────────────────────────────────────\n\n/** Frontmatter meta shape. */\nexport type DashboardMeta = Record<string, string | number | string[]>;\n\nconst TOKEN_PREFIX = 'dashboard.';\n\nexport interface DashboardToken {\n /** Token name without the `dashboard.` prefix (referenced as `$name`). */\n name: string;\n /** Scalar → single entry; block list → entries in declared order. */\n values: string[];\n /** List tokens render as segmented controls; scalars as inputs. */\n isList: boolean;\n}\n\n/** True when the note's frontmatter marks it as a dashboard (`dashboard: true`). */\nexport function isDashboardMeta(meta: DashboardMeta): boolean {\n return meta['dashboard'] === 'true' || meta['dashboard'] === true as unknown as string;\n}\n\n/** Extract `dashboard.*` dot-keys as tokens, in frontmatter declaration order. */\nexport function extractDashboardTokens(meta: DashboardMeta): DashboardToken[] {\n const tokens: DashboardToken[] = [];\n for (const [key, value] of Object.entries(meta)) {\n if (!key.startsWith(TOKEN_PREFIX) || key === TOKEN_PREFIX) continue;\n const name = key.slice(TOKEN_PREFIX.length);\n if (name === '') continue;\n if (Array.isArray(value)) {\n if (value.length > 0) tokens.push({ name, values: value.map(String), isList: true });\n } else {\n tokens.push({ name, values: [String(value)], isList: false });\n }\n }\n return tokens;\n}\n\n/** Default value per token: the scalar, or the first list entry (its control default). */\nexport function defaultTokenValues(tokens: readonly DashboardToken[]): Record<string, string> {\n const values: Record<string, string> = {};\n for (const token of tokens) values[token.name] = token.values[0];\n return values;\n}\n\n/**\n * Write a control change back into frontmatter meta (decision #899-6): a list\n * token reorders so the chosen value becomes the first entry (the default);\n * a scalar token's value is replaced. Returns a NEW meta object — serialize\n * with `serializeFrontmatter` and patch the note's frontmatter section.\n */\nexport function setDashboardTokenValue(\n meta: DashboardMeta,\n name: string,\n value: string,\n): DashboardMeta {\n const key = `${TOKEN_PREFIX}${name}`;\n const current = meta[key];\n const next: DashboardMeta = { ...meta };\n if (Array.isArray(current)) {\n if (!current.includes(value)) return meta; // controls only offer declared values\n next[key] = [value, ...current.filter((v) => v !== value)];\n } else if (current != null) {\n next[key] = typeof current === 'number' && !isNaN(Number(value)) ? Number(value) : value;\n } else {\n next[key] = value;\n }\n return next;\n}\n\n// ── Token substitution ─────────────────────────────────────────────────────\n\nconst TOKEN_REF_RE = /\\$([A-Za-z][\\w-]*)/g;\n\n/**\n * Substitute `$name` references with token values — raw text replacement at\n * execution time (decision #899-6). Unknown references stay literal and are\n * reported in `missing` (renderers badge them; never silent).\n */\nexport function substituteTokens(\n query: string,\n values: Record<string, string>,\n): { query: string; missing: string[] } {\n const missing = new Set<string>();\n const substituted = query.replace(TOKEN_REF_RE, (raw, name: string) => {\n const value = values[name];\n if (value == null) {\n missing.add(name);\n return raw;\n }\n return value;\n });\n return { query: substituted, missing: [...missing] };\n}\n\n/** Token names a query references, in order of first appearance. */\nexport function referencedTokens(query: string): string[] {\n const names = new Set<string>();\n for (const match of query.matchAll(TOKEN_REF_RE)) names.add(match[1]);\n return [...names];\n}\n\n// ── Widget body ────────────────────────────────────────────────────────────\n\n// ── Dashboard document ─────────────────────────────────────────────────────\n\n/** Structural input for the builder — satisfied by EditorSection + doc text. */\nexport interface DashboardSectionInput {\n /** Section type ('query', 'markdown', 'frontmatter', …). */\n type: string;\n /** Markdown subtype ('heading', 'paragraph', …) for markdown sections. */\n subtype?: string;\n /** Raw inner content of the section. */\n content: string;\n /** Widget type suffix parsed from the fence tag (query sections). */\n widgetType?: string;\n /** Grid column span parsed from the fence tag (query sections). */\n spanCols?: number;\n /** Full-row flag parsed from the fence tag (query sections). */\n spanFull?: boolean;\n /** Malformed fence-suffix reason — carried so route mode badges it too. */\n widgetError?: string;\n /** Fence-tag presentation attributes (decision 22). */\n attributes?: Record<string, string>;\n attributeOrder?: string[];\n}\n\nexport interface DashboardWidget {\n /** Stable key within the document (section index). */\n key: string;\n /** Raw widget type ('' → default `table` in dashboard composition). */\n type: string;\n spanCols?: number;\n spanFull?: boolean;\n /** Full fenced body — a Query Document (decision 22), comment lines\n * stripped, surrounding whitespace trimmed, line structure preserved. */\n body: string;\n /** Malformed fence-suffix reason — renderers badge instead of executing. */\n widgetError?: string;\n /** Fence-tag presentation attributes (decision 22) — positional params\n * ride the tag, never the body. */\n attributes: Record<string, string>;\n attributeOrder: string[];\n /** Title from the markdown heading directly above (or above the question). */\n title?: string;\n /** Coaching question from the paragraph directly above the block. */\n question?: string;\n}\n\nexport interface DashboardDocument {\n isDashboard: boolean;\n /** Note title from frontmatter. */\n title?: string;\n tokens: DashboardToken[];\n widgets: DashboardWidget[];\n}\n\n/** First line of a heading section's content, without the leading #'s. */\nfunction headingText(content: string): string | undefined {\n const line = content.split('\\n', 1)[0].replace(/^#{1,6}\\s*/, '').trim();\n return line === '' ? undefined : line;\n}\n\n/** Paragraph content collapsed to one line. */\nfunction paragraphText(content: string): string | undefined {\n const text = content.replace(/\\s*\\n\\s*/g, ' ').trim();\n return text === '' ? undefined : text;\n}\n\n/**\n * Build the dashboard document from ordered sections + frontmatter meta.\n *\n * Title/question association (decision #899-4) is strictly adjacency-based:\n * a paragraph directly above the block is its question; a heading directly\n * above that paragraph — or directly above the block — is its title. Anything\n * else leaves the widget untitled (renderers fall back to the query text).\n */\nexport function buildDashboardDocument(\n sections: readonly DashboardSectionInput[],\n meta: DashboardMeta,\n): DashboardDocument {\n const widgets: DashboardWidget[] = [];\n\n sections.forEach((section, i) => {\n if (section.type !== 'query') return;\n\n // Decision 22: the widget body is the FULL fenced content — a multi-line\n // Query Document. Comment lines are stripped; line structure is kept so\n // documents survive round-trips byte-for-byte.\n const body = section.content\n .split('\\n')\n .filter((l) => { const s = l.trim(); return s !== '' && !s.startsWith('#'); })\n .map((l) => l.trim())\n .join('\\n');\n\n let title: string | undefined;\n let question: string | undefined;\n const above = sections[i - 1];\n if (above?.type === 'markdown' && above.subtype === 'paragraph') {\n question = paragraphText(above.content);\n const heading = sections[i - 2];\n if (heading?.type === 'markdown' && heading.subtype === 'heading') {\n title = headingText(heading.content);\n }\n } else if (above?.type === 'markdown' && above.subtype === 'heading') {\n title = headingText(above.content);\n }\n\n widgets.push({\n key: `w${widgets.length}`,\n type: section.widgetType ?? '',\n spanCols: section.spanCols,\n spanFull: section.spanFull,\n widgetError: section.widgetError,\n body,\n attributes: section.attributes ?? {},\n attributeOrder: section.attributeOrder ?? [],\n title,\n question,\n });\n });\n\n const titleMeta = meta['title'];\n return {\n isDashboard: isDashboardMeta(meta),\n title: typeof titleMeta === 'string' && titleMeta !== '' ? titleMeta : undefined,\n tokens: extractDashboardTokens(meta),\n widgets,\n };\n}\n","/**\n * Shared frontmatter parser utilities for WQL dashboard models and notes.\n */\n\nexport interface ParsedFrontmatter {\n meta: Record<string, string | number | string[]>;\n body: string;\n}\n\nexport interface LinkWidget {\n kind: 'youtube' | 'amazon' | 'strava' | 'source' | 'website' | 'book';\n url?: string;\n label: string;\n videoId?: string;\n}\n\n/** Leading `---` … `---` block; body is everything after the closing delimiter. */\nconst FRONTMATTER_RE = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/;\n\n/** Strip matched wrapping quotes: `\"x\"` / `'x'` → `x`; mismatched quotes are kept. */\nfunction unquote(value: string): string {\n return value.replace(/^(['\"])(.*)\\1$/, (_match, quote: string, inner: string) =>\n quote === '\"' ? inner.replace(/\\\\([\"\\\\])/g, '$1') : inner,\n );\n}\n\n/**\n * Parse the leading YAML frontmatter block of a markdown string.\n */\nexport function parseFrontmatter(raw: string): ParsedFrontmatter {\n const match = raw.match(FRONTMATTER_RE);\n if (!match) return { meta: {}, body: raw };\n\n return { meta: parseMetaLines(match[1].split(/\\r?\\n/)), body: raw.slice(match[0].length) };\n}\n\n/** Shared scalar/list line parser behind `parseFrontmatter` and `parseFrontmatterBody`. */\nfunction parseMetaLines(lines: string[]): ParsedFrontmatter['meta'] {\n const meta: ParsedFrontmatter['meta'] = {};\n\n for (let i = 0; i < lines.length; i++) {\n const keyMatch = lines[i].match(/^([A-Za-z][\\w.-]*)\\s*:(.*)$/);\n if (!keyMatch) continue;\n\n const key = keyMatch[1];\n const rawVal = keyMatch[2].trim();\n\n if (rawVal === '') {\n const items: string[] = [];\n while (i + 1 < lines.length) {\n const itemMatch = lines[i + 1].match(/^\\s+-\\s+(.+)$/);\n if (!itemMatch) break;\n items.push(itemMatch[1].trim());\n i++;\n }\n meta[key] = items.length > 0 ? items : '';\n } else {\n const wasQuoted = /^(['\"])(.*)\\1$/.test(rawVal);\n const value = unquote(rawVal);\n const num = Number(value);\n meta[key] = !wasQuoted && value !== '' && !isNaN(num) ? num : value;\n }\n }\n\n return meta;\n}\n\n/**\n * Parse frontmatter body content (the lines between the `---` delimiters).\n */\nexport function parseFrontmatterBody(innerContent: string): ParsedFrontmatter['meta'] {\n return parseMetaLines(innerContent.split(/\\r?\\n/));\n}\n\nfunction quoteYamlScalar(value: string): string {\n if (value === '') return '\"\"';\n const looksNumeric = !isNaN(Number(value));\n const looksKeyword = /^(true|false|null|yes|no|on|off)$/i.test(value);\n if (/[\":'\\n#{}[\\\\],&*?|<>=%!@`]/.test(value) || value !== value.trim() || value.startsWith('-') || looksNumeric || looksKeyword) {\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n}\n\n/**\n * Serialize frontmatter metadata back to YAML body lines.\n */\nexport function serializeFrontmatter(meta: ParsedFrontmatter['meta']): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(meta)) {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n lines.push(`${key}: \"\"`);\n continue;\n }\n lines.push(`${key}:`);\n for (const item of value) {\n lines.push(` - ${quoteYamlScalar(item)}`);\n }\n } else if (typeof value === 'number') {\n lines.push(`${key}: ${value}`);\n } else {\n lines.push(`${key}: ${quoteYamlScalar(value)}`);\n }\n }\n return lines.join('\\n');\n}\n\n/** Body of `raw` with the leading frontmatter block removed. */\nexport function stripFrontmatter(raw: string): string {\n return parseFrontmatter(raw).body;\n}\n\n/** Scalar value at `key`, or `undefined` when absent or a list. */\nexport function getScalar(\n meta: ParsedFrontmatter['meta'],\n key: string,\n): string | number | undefined {\n const value = meta[key];\n return typeof value === 'string' || typeof value === 'number' ? value : undefined;\n}\n\n/** List value at `key`, or `[]` when absent or a scalar. */\nexport function getList(meta: ParsedFrontmatter['meta'], key: string): string[] {\n const value = meta[key];\n return Array.isArray(value) ? value : [];\n}\n\n/**\n * Parse the `category` YAML array from a full markdown string's frontmatter.\n */\nexport function parseFrontmatterCategories(raw: string): string[] {\n return getList(parseFrontmatter(raw).meta, 'category').map(c => c.toLowerCase());\n}\n\n/**\n * Extract the `tags` list from a frontmatter block's raw content.\n */\nexport function extractFrontmatterTags(raw: string): string[] {\n const meta = FRONTMATTER_RE.test(raw)\n ? parseFrontmatter(raw).meta\n : parseFrontmatterBody(raw);\n const tags = meta['tags'];\n const list = Array.isArray(tags)\n ? tags\n : typeof tags === 'string' && tags.trim()\n ? tags.trim().startsWith('[') && tags.trim().endsWith(']')\n ? tags.trim().slice(1, -1).split(',')\n : [tags]\n : [];\n return [...new Set(list.map(tag => tag.trim()).filter(Boolean))];\n}\n\n/**\n * Parse flat scalar key-value pairs from raw inner content (no delimiters).\n */\nexport function parseFlatProperties(innerContent: string): Record<string, string> {\n const props: Record<string, string> = {};\n for (const line of innerContent.split(/\\r?\\n/)) {\n const match = line.match(/^([^:]+):\\s*(.*)$/);\n if (match) {\n props[match[1].trim()] = match[2].trim();\n }\n }\n return props;\n}\n\n/**\n * Parse scalar key-value pairs from an array of lines.\n */\nexport function parseFrontmatterProps(lines: string[]): Record<string, string> {\n const props: Record<string, string> = {};\n for (const line of lines) {\n const match = line.match(/^([^:]+):\\s*(.*)$/);\n if (match) {\n props[match[1].trim()] = match[2].trim();\n }\n }\n return props;\n}\n","import { parseFrontmatter } from './frontmatter';\nimport { parseQueryWidgetSuffix, type DashboardSectionInput, type DashboardMeta } from './model';\n\nexport interface DashboardParsedSection extends DashboardSectionInput {\n /** 0-indexed start line of the section in the raw content. */\n startLine: number;\n /** 0-indexed inclusive end line of the section in the raw content. */\n endLine: number;\n}\n\n/**\n * Parses a raw markdown note into sections suitable for `buildDashboardDocument`,\n * keeping track of line numbers so edits can write back to the source text.\n */\nexport function parseDashboardNote(rawContent: string): { meta: DashboardMeta; sections: DashboardParsedSection[] } {\n const { meta } = parseFrontmatter(rawContent);\n const lines = rawContent.split(/\\r?\\n/);\n const sections: DashboardParsedSection[] = [];\n\n // Find where the body starts (skip frontmatter)\n let i = 0;\n if (lines.length > 0 && lines[0].trim() === '---') {\n i = 1;\n while (i < lines.length && lines[i].trim() !== '---') {\n i++;\n }\n i++; // skip the closing ---\n }\n\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Query block\n if (/^```query/.test(trimmed)) {\n // The full suffix (after ```query) may carry `key=value` presentation\n // attributes (decision 22) — the whole remainder parses as one suffix.\n // NOT lowercased: attribute values are case-sensitive ($Token names);\n // parseQueryWidgetSuffix lowercases the type and keys itself.\n const tag = trimmed.slice(3);\n let widgetType;\n let spanCols;\n let spanFull;\n let widgetError;\n let attributes: Record<string, string> | undefined;\n let attributeOrder: string[] | undefined;\n\n if (tag.startsWith('query:')) {\n const spec = parseQueryWidgetSuffix(tag.slice('query:'.length));\n widgetType = spec.type || undefined;\n spanCols = spec.spanCols;\n spanFull = spec.spanFull;\n widgetError = spec.error;\n attributes = spec.attributes;\n attributeOrder = spec.attributeOrder;\n }\n\n const startLine = i;\n i++;\n const bodyLines: string[] = [];\n while (i < lines.length && !/^```[\\w\\d_:-]*$/.test(lines[i].trim())) {\n bodyLines.push(lines[i]);\n i++;\n }\n const endLine = i; // The closing ``` line\n\n sections.push({\n type: 'query',\n content: bodyLines.join('\\n'),\n widgetType,\n spanCols,\n spanFull,\n widgetError,\n attributes,\n attributeOrder,\n startLine,\n endLine,\n });\n i++;\n continue;\n }\n\n // Generic fenced block (non-query code fence, e.g. ```wellness)\n if (/^```[\\w\\d_:-]*$/.test(trimmed)) {\n const startLine = i;\n const fenceLines: string[] = [lines[i]];\n i++;\n while (i < lines.length && !/^```[\\w\\d_:-]*$/.test(lines[i].trim())) {\n fenceLines.push(lines[i]);\n i++;\n }\n if (i < lines.length) {\n fenceLines.push(lines[i]);\n i++;\n }\n sections.push({\n type: 'markdown',\n subtype: 'paragraph',\n content: fenceLines.join('\\n'),\n startLine,\n endLine: i - 1,\n });\n continue;\n }\n\n // Heading\n if (trimmed.startsWith('#')) {\n sections.push({\n type: 'markdown',\n subtype: 'heading',\n content: trimmed,\n startLine: i,\n endLine: i,\n });\n i++;\n continue;\n }\n\n // Paragraph (contiguous non-empty, non-heading, non-fence lines)\n if (trimmed !== '') {\n const startLine = i;\n const paraLines: string[] = [];\n while (\n i < lines.length &&\n lines[i].trim() !== '' &&\n !lines[i].trim().startsWith('#') &&\n !/^```[\\w\\d_:-]*$/.test(lines[i].trim())\n ) {\n paraLines.push(lines[i]);\n i++;\n }\n sections.push({\n type: 'markdown',\n subtype: 'paragraph',\n content: paraLines.join('\\n'),\n startLine,\n endLine: i - 1,\n });\n continue;\n }\n\n // Blank lines\n i++;\n }\n\n return { meta, sections };\n}\n","/**\n * buildDashboardScaffold — raw markdown for a freshly created dashboard note\n * (#907 creation flow, format locked in #899).\n */\n\nexport const DEFAULT_DASHBOARD_TITLE = 'New Dashboard';\n\n/** Slugify a dashboard title for route addressing (/dashboard/:slug). */\nexport function dashboardSlug(title: string): string {\n return title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '') || 'dashboard';\n}\n\nexport function buildDashboardScaffold(title: string = DEFAULT_DASHBOARD_TITLE): string {\n return `---\ndashboard: true\ndashboard.active: true\ntitle: ${title}\nslug: ${dashboardSlug(title)}\ndashboard.metric:\n - totalVolume\n---\n\n## Weekly Trend\nHow does $metric trend week over week?\n\n\\`\\`\\`query:timeseries\nsum:$metric{} by {week}\n\\`\\`\\`\n`;\n}\n","/**\n * Dashboard note operations — pure markdown↔markdown transforms over the\n * locked dashboard-note format (#899). Every operation:\n *\n * - takes the note's raw content and returns the NEW raw content (the caller\n * persists through journalNotes, the only write path);\n * - is identity-guarded: the target widget is located by its positional key\n * (`w${index}`, matching buildDashboardDocument) AND its expected body\n * content. A guard mismatch returns null and writes NOTHING — a concurrent\n * edit or reorder between read and write can never retarget the splice to\n * the wrong widget.\n *\n * A widget's editable unit is its \"group\": the title heading / coaching\n * question paragraph the document builder associates with the block (strict\n * adjacency, same rule as buildDashboardDocument) plus the ```query fence\n * itself. Move/duplicate/remove operate on the whole group so the rendered\n * card — title, question, chart — travels together.\n */\n\nimport { parseDashboardNote, type DashboardParsedSection } from './parser';\nimport { DASHBOARD_GRID_MAX_COLS } from './model';\nimport type { NoteBlockChange } from '@bitcobblers/wod-wiki-core';\n\n// ── Widget spec ────────────────────────────────────────────────────────────\n\nexport interface WidgetSpec {\n /** Card title — renders as a `## ` heading above the block. */\n title?: string;\n /** Coaching question — the paragraph between the heading and the block. */\n question?: string;\n /** Raw widget type from the fence suffix ('' → the `table` default). */\n type: string;\n spanCols?: number;\n spanFull?: boolean;\n /** The composed Query Document text — stored verbatim as the block body\n * (single-line or multi-line; decision 22). */\n wql: string;\n /** Fence-tag presentation attributes (goal targets, …). */\n attributes?: Record<string, string>;\n /** Attribute emission order (defaults to Object key order). */\n attributeOrder?: string[];\n}\n\nexport type WidgetSpan = Pick<WidgetSpec, 'spanCols' | 'spanFull'>;\n\n/** Opening fence line for a widget spec — type/span plus `key=value`\n * attributes (decision 22: presentation params ride the fence tag). */\nexport function widgetFenceTag(spec: Pick<WidgetSpec, 'type' | 'spanCols' | 'spanFull' | 'attributes' | 'attributeOrder'>): string {\n const type = spec.type.trim();\n let suffix = type === '' ? '' : `:${type}`;\n if (spec.spanFull) {\n suffix += '-full';\n } else if (spec.spanCols != null && spec.spanCols > 1) {\n suffix += `-${spec.spanCols}`;\n }\n const attrs = spec.attributes ?? {};\n for (const key of spec.attributeOrder ?? Object.keys(attrs)) {\n if (!(key in attrs)) continue;\n const value = attrs[key];\n const encoded = /^[a-zA-Z0-9_.-]+$/.test(value) ? value : `\"${value.replace(/\"/g, '')}\"`;\n suffix += ` ${key}=${encoded}`;\n }\n return `\\`\\`\\`query${suffix}`;\n}\n\n/** Block body: the Query Document text verbatim (trimmed). */\nexport function widgetBodyLine(spec: Pick<WidgetSpec, 'wql'>): string {\n return spec.wql.trim();\n}\n\n/** The markdown lines of a whole widget group (heading? / question? / fence block). */\nexport function renderWidgetGroup(spec: WidgetSpec): string[] {\n const lines: string[] = [];\n const title = spec.title?.trim();\n const question = spec.question?.trim();\n if (title) lines.push(`## ${title}`);\n if (question) lines.push(question);\n if (lines.length > 0) lines.push('');\n lines.push(widgetFenceTag(spec));\n lines.push(widgetBodyLine(spec));\n lines.push('```');\n return lines;\n}\n\n// ── Group location ─────────────────────────────────────────────────────────\n\ninterface WidgetGroup {\n /** Index into the query-section (widget) ordering — the `w${i}` key. */\n widgetIndex: number;\n /** Absolute line range in the raw content, covering the whole group. */\n startLine: number;\n endLine: number;\n}\n\n/**\n * Locate a widget's group, identity-guarded by its expected block body (the\n * `body` field buildDashboardDocument produced when the caller last parsed).\n * Returns null when the widget vanished or the body no longer matches —\n * the caller must re-read and never write.\n */\nfunction findWidgetGroup(\n sections: readonly DashboardParsedSection[],\n key: string,\n expectedBody: string,\n): { ok: true; group: WidgetGroup } | { ok: false; reason: 'not-found' | 'stale-body' } {\n const querySections = sections.filter((s) => s.type === 'query');\n const widgetIndex = querySections.findIndex((_, i) => `w${i}` === key);\n if (widgetIndex === -1) return { ok: false, reason: 'not-found' };\n const block = querySections[widgetIndex]!;\n\n // Identity guard (decision 22): the widget's EXACT full fenced body must\n // still be what the caller's last parse saw — any concurrent change\n // stale-marks the operation (re-read; never a blind or partial write).\n const body = block.content\n .split('\\n')\n .filter((l) => { const s = l.trim(); return s !== '' && !s.startsWith('#'); })\n .map((l) => l.trim())\n .join('\\n');\n if (body !== expectedBody.trim()) return { ok: false, reason: 'stale-body' };\n\n return {\n ok: true,\n group: { widgetIndex, startLine: groupStartLine(sections, block), endLine: block.endLine },\n };\n}\n\n/**\n * Group start for a query block: the associated title heading / coaching\n * question paragraph directly above it (strict adjacency — the document\n * builder's association rule), or the block's own line when untitled.\n */\nfunction groupStartLine(sections: readonly DashboardParsedSection[], block: DashboardParsedSection): number {\n const idx = sections.indexOf(block);\n const above = sections[idx - 1];\n if (above?.type === 'markdown' && above.subtype === 'paragraph') {\n const heading = sections[idx - 2];\n return heading?.type === 'markdown' && heading.subtype === 'heading'\n ? heading.startLine\n : above.startLine;\n }\n if (above?.type === 'markdown' && above.subtype === 'heading') return above.startLine;\n return block.startLine;\n}\n\n/** Line ranges of every widget group, in widget order. */\nfunction widgetGroupRanges(sections: readonly DashboardParsedSection[]): WidgetGroup[] {\n return sections\n .filter((s) => s.type === 'query')\n .map((block, widgetIndex) => ({\n widgetIndex,\n startLine: groupStartLine(sections, block),\n endLine: block.endLine,\n }));\n}\n\n// ── Operations ─────────────────────────────────────────────────────────────\n\n/**\n * Append a new widget group at the end of the note body. Frontmatter and all\n * existing content are preserved verbatim.\n */\nexport function appendWidget(raw: string, spec: WidgetSpec): string {\n const lines = raw.split('\\n');\n const group = renderWidgetGroup(spec);\n // Separate the new group from the body with exactly one blank line.\n while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n return [...lines, '', ...group, ''].join('\\n');\n}\n\n/** Structured operation result (decision 22): a missing widget is distinct\n * from a concurrent edit, and neither silently no-ops. */\nexport type WidgetOpResult =\n | { ok: true; note: string; changes: NoteBlockChange[]; retainedBlocks: Array<{ from: number; to: number; nextFrom: number; nextTo: number }> }\n | { ok: false; reason: 'not-found' | 'stale-body' };\n\nfunction widgetResult(raw: string, note: string, order?: Array<number | null>): Extract<WidgetOpResult, { ok: true }> {\n let from = 0;\n while (from < raw.length && from < note.length && raw[from] === note[from]) from++;\n let to = raw.length;\n let nextTo = note.length;\n while (to > from && nextTo > from && raw[to - 1] === note[nextTo - 1]) { to--; nextTo--; }\n const queries = parseDashboardNote(raw).sections.filter(section => section.type === 'query');\n const nextQueries = parseDashboardNote(note).sections.filter(section => section.type === 'query');\n const oldOffsets = lineOffsets(raw);\n const nextOffsets = lineOffsets(note);\n const oldLines = raw.split('\\n');\n const nextLines = note.split('\\n');\n const retainedBlocks: Extract<WidgetOpResult, { ok: true }>['retainedBlocks'] = [];\n for (const [nextIndex, oldIndex] of (order ?? queries.map((_, index) => index)).entries()) {\n if (oldIndex === null) continue;\n const block = queries[oldIndex];\n const next = nextQueries[nextIndex];\n if (!block || !next) throw new Error('Widget mutation lost its source lineage');\n retainedBlocks.push({ from: oldOffsets[block.startLine], to: oldOffsets[block.endLine] + oldLines[block.endLine].replace(/\\r$/, '').length,\n nextFrom: nextOffsets[next.startLine], nextTo: nextOffsets[next.endLine] + nextLines[next.endLine].replace(/\\r$/, '').length });\n }\n return { ok: true, note, changes: raw === note ? [] : [{ from, to, insert: note.slice(from, nextTo) }], retainedBlocks };\n}\n\nfunction lineOffsets(raw: string): number[] {\n let offset = 0;\n return raw.split('\\n').map(line => { const from = offset; offset += line.length + 1; return from; });\n}\n\n/**\n * Replace a widget's whole group (title/question/type/body) in place.\n * Identity-guarded against the widget's exact full body text.\n */\nexport function updateWidget(\n raw: string,\n key: string,\n expectedBody: string,\n spec: WidgetSpec,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n lines.splice(group.startLine, group.endLine - group.startLine + 1, ...renderWidgetGroup(spec));\n return widgetResult(raw, lines.join('\\n'));\n}\n\n/** Duplicate a widget's group directly below itself. Identity-guarded. */\nexport function duplicateWidget(\n raw: string,\n key: string,\n expectedBody: string,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n const copy = lines.slice(group.startLine, group.endLine + 1);\n // Insert the copy after the original, blank-line separated.\n lines.splice(group.endLine + 1, 0, '', ...copy);\n const order: Array<number | null> = sections.filter(section => section.type === 'query').map((_, index) => index);\n order.splice(group.widgetIndex + 1, 0, null);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Remove a widget's group (title/question/fence). Identity-guarded. Collapses\n * the blank-line gap the removal leaves behind.\n */\nexport function removeWidget(\n raw: string,\n key: string,\n expectedBody: string,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const lines = raw.split('\\n');\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n // Collapse a blank sandwich (line before + line after both empty).\n if (\n group.startLine > 0 &&\n group.startLine < lines.length &&\n lines[group.startLine - 1] === '' &&\n lines[group.startLine] === ''\n ) {\n lines.splice(group.startLine, 1);\n }\n const order = sections.filter(section => section.type === 'query').map((_, index) => index);\n order.splice(group.widgetIndex, 1);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Reorder a widget among the query blocks — the whole group (title, question,\n * block) moves past its neighbor. `delta` is -1 (up) or +1 (down); out-of-range\n * moves are no-ops that return the content unchanged. Identity-guarded.\n */\nexport function moveWidget(\n raw: string,\n key: string,\n expectedBody: string,\n delta: -1 | 1,\n): WidgetOpResult {\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const groups = widgetGroupRanges(sections);\n const neighbor = groups[group.widgetIndex + delta];\n if (!neighbor) return widgetResult(raw, raw);\n\n const lines = raw.split('\\n');\n const moving = lines.slice(group.startLine, group.endLine + 1);\n\n if (delta === -1) {\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n lines.splice(neighbor.startLine, 0, ...moving);\n } else {\n // Remove the moving group first (shifts the neighbor's start when the\n // neighbor comes after), then insert past the neighbor's new end.\n lines.splice(group.startLine, group.endLine - group.startLine + 1);\n const shift = group.startLine < neighbor.startLine ? group.endLine - group.startLine + 1 : 0;\n const insertAt = neighbor.endLine - shift + 1;\n lines.splice(insertAt, 0, ...moving);\n }\n const order = groups.map((_, index) => index);\n order.splice(group.widgetIndex, 1);\n order.splice(group.widgetIndex + delta, 0, group.widgetIndex);\n return widgetResult(raw, lines.join('\\n'), order);\n}\n\n/**\n * Resize (or re-span) a widget: rewrites only the opening fence line, leaving\n * the body, params, and surrounding markdown untouched. `spanFull` wins over\n * `spanCols`. Identity-guarded.\n */\nexport function resizeWidget(\n raw: string,\n key: string,\n expectedBody: string,\n span: WidgetSpan,\n): WidgetOpResult {\n if (span.spanCols != null && (span.spanCols < 1 || span.spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { ok: false, reason: 'stale-body' }; // out-of-range span: refuse the write\n }\n const { sections } = parseDashboardNote(raw);\n const found = findWidgetGroup(sections, key, expectedBody);\n if (!found.ok) return found;\n const { group } = found;\n const block = sections.find(\n (s) => s.type === 'query' && s.startLine >= group.startLine && s.endLine <= group.endLine,\n )!;\n const lines = raw.split('\\n');\n const indent = lines[block.startLine].match(/^\\s*/)![0];\n lines[block.startLine] =\n indent +\n widgetFenceTag({\n type: block.widgetType ?? '',\n spanCols: span.spanCols,\n spanFull: span.spanFull,\n attributes: block.attributes,\n attributeOrder: block.attributeOrder,\n });\n return widgetResult(raw, lines.join('\\n'));\n}\n\n// ── Legacy body migration (decision 22) ───────────────────────────────────\n\n/**\n * Rewrite one dashboard note's legacy widget bodies to Query Documents\n * (decision 22, answer 1): the first-` / ` positional split is retired.\n * For each query fence whose body carries ` / ` positional params, the\n * query text stays the body and the params move onto the fence tag as\n * numbered attributes (`param1=…`) — values preserved verbatim, losslessly\n * editable. A body already document-shaped is untouched; the note that\n * cannot be rewritten safely returns unchanged (the caller badges it).\n */\nexport function migrateLegacyDashboardBodies(raw: string): string {\n let out = raw;\n // Iterate fence blocks: ```query<suffix>\\n<body>\\n```\n const pattern = /(?:^|\\n)([ \\t]*)```query([^\\n]*)\\n([\\s\\S]*?)\\n[ \\t]*```/g;\n out = out.replace(pattern, (match, indent: string, suffix: string, body: string) => {\n const trimmed = body.trim();\n const sep = trimmed.indexOf(' / ');\n if (sep === -1) return match; // already a document — untouched\n const query = trimmed.slice(0, sep).trim();\n const params = trimmed.slice(sep + 3).split(/\\s+/).filter((p) => p !== '');\n const attrs = params\n .map((p, i) => (/^[a-zA-Z][a-zA-Z0-9_-]*=/.test(p) ? p : `param${i + 1}=${p}`))\n .join(' ');\n const newSuffix = suffix.trimEnd() + (suffix.includes('=') ? '' : (suffix.trim() === '' ? ' ' : ' ')) + attrs;\n return `${indent}\\`\\`\\`query${newSuffix}\\n${query}\\n\\`\\`\\``;\n });\n return out;\n}\n","/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.38.2141';\nexport const GIT_SHA = 'b9b40a7';\nexport const BUILD_TIME = '2026-10-19T12:09:48.802Z';\nexport const SEMVER = {\n version: '0.38.2141',\n gitSha: 'b9b40a7',\n buildTime: '2026-10-19T12:09:48.802Z',\n} as const;\n"]}