@bitcobblers/wod-wiki-wql 0.6.32 → 0.7.37

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/grammar/wql.parser.ts","../src/grammar/wql.parser.terms.ts","../src/wqlSuffix.ts","../src/wql.ts","../src/disciplines.ts","../src/language.ts","../src/units.ts","../src/derivation.ts","../src/dashboard/frontmatter.ts","../src/static.ts","../src/QueryService.ts","../src/dashboard/model.ts","../src/dashboard/parser.ts","../src/dashboard/scaffold.ts","../src/version.ts"],"names":["LRParser","LRLanguage","styleTags","t","snippetCompletion","syntaxTree","options","autocompletion","HighlightStyle","LanguageSupport","syntaxHighlighting","MetricType"],"mappings":"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","file":"index.cjs","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\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/** Tag keys the Query Service reads off a fact row (QueryService.factTagValue). */\nexport const WQL_TAG_KEYS = [\n 'effort', 'discipline', 'intensity', 'note', 'page', 'origin',\n 'grain', 'metric', 'block', 'result', 'tags',\n] as const;\nexport type WqlTagKey = (typeof WQL_TAG_KEYS)[number];\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\nexport const WQL_GRAINS = ['segment', 'summary', 'rollup'] 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'] as const;\nexport type WqlFindTarget = (typeof WQL_FIND_TARGETS)[number];\n\n/** Content query scopes (in <scope>). */\nexport const WQL_SCOPES = ['journal', 'collections', 'feeds', 'all'] as const;\nexport type WqlScope = (typeof WQL_SCOPES)[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 = ['journal', 'collections', 'feeds', 'notes', 'blocks', 'efforts', 'metrics'] as const;\nexport type WqlSource = (typeof WQL_SOURCES)[number];\n\n/** Rollup periods the aggregate grammar accepts (wql.ts: unit d|w only). */\nexport const WQL_ROLLUP_PERIODS = ['1d', '1w'] 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","// 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: \"(jOVQPOOOOQO'#C_'#C_O[QPO'#C^QaQQOOOlQPO,58xOqQPO'#CbO|QPO'#CjO!RQPO'#CmQOQPOOQ!WQPOOQ!]QQOOO!eQQO'#CaOOQO1G.d1G.dOOQO'#Ce'#CeO!vQPO'#CcO!{QPO'#CcOOQO,58|,58|O#QQPO,58|O#YQPO,59UO#bQQO,59XO#gQPO'#CpO#lQQO,58{O#}QPO,58}O$VQPO,58}O$[QPO'#CrO$dQPO1G.hOOQO1G.h1G.hOOQO'#Cl'#ClOOQO1G.p1G.pO$lQPO1G.pO$tQPO1G.sOOQO,59[,59[OOQO-E6n-E6nO$yQPO'#CgO%[QPO'#CgO%jQPO'#CfOOQO1G.i1G.iO#}QPO1G.iOOQO,59^,59^OOQO-E6p-E6pOOQO7+$S7+$SO%uQPO'#CsO%zQPO7+$[OOQO7+$[7+$[O&SQPO7+$_OOQO,59R,59RO&XQPO,59RO#}QPO'#CqO&^QPO,59QOOQO7+$T7+$TOOQO,59_,59_OOQO-E6q-E6qOOQO<<Gv<<GvOOQO<<Gy<<GyO&iQPO1G.mOOQO,59],59]OOQO-E6o-E6oOOQO7+$X7+$X\",\n stateData: \"&w~OjOS~OSPO~OkSO~O_UObVOmTO~OSZO~OS]OW_Op`O~OmbO~OqcO~ObVO~O_UObVO~OldO_TXbTXhTXmTX~OkfO~OS]O~OohOpjO~OSkOplO~OcnO~OSoO~OldO_TabTahTamTa~OSqO]rO~OkuO~OS]OW_O~OohOpxO~OoyOp{O~OS|O~O[}Ok!OOnZXoZXpZX~O[}OnZXoZXpZX~On!POoYXpYX~OSkO~OoyOp!UO~Or!VO~OS!WO~On!POoYapYa~O[!ZOnZioZipZi~O\",\n goto: \"#YhPPilPoruP{!S!YPP!aP!e!kPP!p!v!|#SRRORQOR[SRYRQaTRvhS^ThRg_QtfR!RuSsfuR!X!PTXRYQmbR!SyVWRXYQeZRpeQ!QsR!Y!QQiaRwiQzmR!Tz\",\n nodeNames: \"⚠ Query Head Aggregator Word Metric Filters Filter Negate TagKey TagValue Value Star Quoted GroupBy By Dimension Rollup RollupDot Int\",\n maxTerm: 34,\n skippedNodes: [0],\n repeatNodeCount: 4,\n tokenData: \"'a~RfXY!gYZ!g]^!gpq!gqr!xrs!}xy#lyz#qz{#v|}#{}!O$Q!O!P$f!Q![%c![!]%y!c!}$Q#R#S$Q#T#U$Q#U#V&O#V#o$Q#o#p'Q#p#q'V#q#r'[~!lSj~XY!gYZ!g]^!gpq!g~!}OW~~#QTOr!}rs#as;'S!};'S;=`#f<%lO!}~#fO]~~#iP;=`<%l!}~#qOq~~#vOr~~#{O[~~$QOo~P$VTSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#o$Q~$kPl~#f#g$n~$qP#c#d$t~$wP#`#a$z~$}P#`#a%Q~%TP#i#j%W~%ZP#d#e%^~%cOb~R%jTcQSP}!O$Q!Q![%c!c!}$Q#R#S$Q#T#o$Q~&OOk~R&TVSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#m$Q#m#n&j#n#o$QR&qT_QSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#o$Q~'VOm~~'[On~~'aOp~\",\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 Head = 2,\n Aggregator = 3,\n Word = 4,\n Metric = 5,\n Filters = 6,\n Filter = 7,\n Negate = 8,\n TagKey = 9,\n TagValue = 10,\n Value = 11,\n Star = 12,\n Quoted = 13,\n GroupBy = 14,\n By = 15,\n Dimension = 16,\n Rollup = 17,\n RollupDot = 18,\n Int = 19\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>`\n * - Rollup period: `.rollup(<size><unit>)`\n * - Group-by: `by {<dims>}`\n * - Time window: `last <n><unit>`\n * - Scope: `in <scope>`\n */\n\nexport interface ParsedWqlRollupSuffix {\n size: number;\n unit: string;\n raw: string;\n}\n\nexport interface ParsedWqlLastSuffix {\n size: number;\n unit: 'd' | 'w';\n raw: string;\n}\n\nexport interface ParsedWqlSuffixes {\n /** Outer cross-store join clause text (`where ...`). */\n where?: string;\n /** Display unit directive (`in kg`). */\n displayUnit?: string;\n /** Rollup period (`.rollup(1w)`). */\n rollup?: ParsedWqlRollupSuffix;\n /** Group-by dimensions (`by {week, effort}`). */\n groupBy?: string[];\n /** Content time window (`last 8w`). */\n last?: ParsedWqlLastSuffix;\n /** Content scope (`in journal` / `in all`). */\n scope?: 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\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 IN_SCOPE_RE = /\\s+in\\s+(\\w+)\\s*$/;\n\n/**\n * Extract suffixes from a raw WQL query string.\n * Strips outer join (`where`), display unit (`in kg`), rollup (`.rollup(1w)`),\n * group-by (`by {week}`), time window (`last 8w`), and scope (`in journal`).\n */\nexport function parseWqlSuffixes(raw: string): ParsedWqlSuffixes {\n const { primary, where } = splitAtWhere(raw);\n let text = primary.trim();\n\n let displayUnit: string | undefined;\n let rollup: ParsedWqlRollupSuffix | undefined;\n let groupBy: string[] | undefined;\n let last: ParsedWqlLastSuffix | undefined;\n let scope: string | undefined;\n\n const isFind = text.startsWith('find:');\n const isRows = /^rows(?=[:{]|\\s|$)/.test(text);\n\n if (isFind || isRows) {\n // Content find queries strip `last <n><unit>` then `in <scope>`;\n // rows queries (#949) strip `last` plus the aggregation suffixes\n // (surfaced as loud errors downstream — rows never aggregates).\n const lastMatch = LAST_RE.exec(text);\n if (lastMatch) {\n last = {\n size: parseInt(lastMatch[1], 10),\n unit: lastMatch[2].toLowerCase() as 'd' | 'w',\n raw: lastMatch[0].trim(),\n };\n text = text.slice(0, lastMatch.index).trim();\n }\n\n if (isFind) {\n const scopeMatch = IN_SCOPE_RE.exec(text);\n if (scopeMatch) {\n scope = scopeMatch[1];\n text = text.slice(0, scopeMatch.index).trim();\n }\n } else {\n const rollupMatch = ROLLUP_RE.exec(text);\n if (rollupMatch) {\n const rawRollup = rollupMatch[1] + rollupMatch[2];\n rollup = { size: rollupMatch[1] ? parseInt(rollupMatch[1], 10) : 1, unit: rollupMatch[2] || '', raw: rawRollup };\n text = text.slice(0, rollupMatch.index).trim();\n }\n const byMatch = BY_RE.exec(text);\n if (byMatch) {\n groupBy = byMatch[1].split(',').map((d) => d.trim()).filter(Boolean);\n text = text.slice(0, byMatch.index).trim();\n }\n }\n } else {\n // Analytics queries strip `in <unit>`, `.rollup(<period>)`, `by {<dims>}`\n const unitMatch = DISPLAY_UNIT_RE.exec(text);\n if (unitMatch) {\n displayUnit = unitMatch[1];\n text = text.slice(0, unitMatch.index).trim();\n }\n\n const rollupMatch = ROLLUP_RE.exec(text);\n if (rollupMatch) {\n const rawRollup = rollupMatch[1] + rollupMatch[2];\n const size = rollupMatch[1] ? parseInt(rollupMatch[1], 10) : 1;\n const unit = rollupMatch[2] || '';\n rollup = { size, unit, raw: rawRollup };\n text = text.slice(0, rollupMatch.index).trim();\n }\n\n const byMatch = BY_RE.exec(text);\n if (byMatch) {\n groupBy = byMatch[1]\n .split(',')\n .map((d) => d.trim())\n .filter(Boolean);\n text = text.slice(0, byMatch.index).trim();\n }\n }\n\n return {\n where,\n displayUnit,\n rollup,\n groupBy,\n last,\n scope,\n primaryText: text,\n };\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}.rollup(1w)\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 type WqlAggregator,\n type WqlComparisonOp,\n} from './vocabulary';\nimport { parseWqlSuffixes } from './wqlSuffix';\n\nexport { WQL_AGGREGATORS, WQL_COMPARISON_OPS } 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} in 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 scope?: string;\n last?: { size: number; unit: 'd' | 'w' };\n}\n\nexport interface ParsedQuery {\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 /** 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 error?: string;\n}\n\n/** Result of parsing a content-discovery query (`find:target{filters} in scope`). */\nexport interface ParsedFindQuery {\n raw: string;\n /** Content target: 'note' or 'block'. */\n target: string;\n filters: TagFilter[];\n /** Where to look: journal | collections | feeds | all. */\n scope?: string;\n /** Time window: last 8w, last 4d. */\n last?: { size: number; unit: 'd' | 'w' };\n /** Cross-store metric join (`where sum:totalVolume{} > 5000`). */\n join?: MetricPredicate;\n error?: string;\n}\n\nexport type AnyParsedQuery = ParsedQuery | ParsedFindQuery | ParsedRowsQuery;\n\n/** Type guard: true for content-discovery queries. */\nexport function isFindQuery(parsed: AnyParsedQuery): parsed is ParsedFindQuery {\n return 'target' in parsed;\n}\n\n/** Type guard: true for rows queries. */\nexport function isRowsQuery(parsed: AnyParsedQuery): parsed is ParsedRowsQuery {\n return (parsed as ParsedRowsQuery).family === 'rows';\n}\n\nexport interface SeriesPoint { ts: number; value: number }\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 */\nexport interface ParsedRowsQuery {\n raw: string;\n /** Family discriminator (the other families are told apart by 'target'/'agg'). */\n family: 'rows';\n /** Output-statement type narrowing from the optional target (`rows:segment{…}`); undefined = all types. */\n outputType?: string;\n filters: TagFilter[];\n /** Time window over the workout end time: last 8w, last 4d. */\n last?: { size: number; unit: 'd' | 'w' };\n error?: string;\n}\nexport interface Series { key: string; label: string; points: SeriesPoint[]; unit?: string }\n\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 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; error?: string } {\n if (where.trimStart().startsWith('find:')) {\n const fp = parseFindQuery(where);\n if (fp.error) return { error: fp.error };\n return { find: { target: fp.target, filters: fp.filters, scope: fp.scope, last: fp.last } };\n }\n const m = CMP_RE.exec(where.trim());\n if (!m) return { error: cannotParseJoin(where) };\n const head = parseAnalyticsQuery(m[1].trim());\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 either an analytics ParsedQuery or a content\n * ParsedFindQuery. Dispatch is textual: a leading `find:` routes to the\n * content path, everything else to analytics.\n */\nexport function parseQuery(raw: string): AnyParsedQuery {\n const trimmed = raw.trimStart();\n if (trimmed.startsWith('find:')) {\n return parseFindQuery(raw);\n }\n if (/^rows(?=[:{]|\\s|$)/.test(trimmed)) {\n return parseRowsQuery(raw);\n }\n return parseAnalyticsQuery(raw);\n}\n\n// ── Rows query parsing (#949) ────────────────────────────────────\n\nfunction cannotParseRows(text: string): string {\n return `Cannot parse \"${text}\". Expected rows:{result:…|block:…|note:…} or rows:segment{…} last 8w`;\n}\n\n/**\n * Parse a rows query. The head is JS-split (`rows` / `rows:<outputType>`);\n * the `{filters}` half reuses the shared Lezer filter grammar by wrapping it\n * in a synthetic find head — one filter syntax for all three families.\n */\nfunction parseRowsQuery(raw: string): ParsedRowsQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, last, groupBy, rollup, primaryText } = suffixes;\n const result: ParsedRowsQuery = {\n raw,\n family: 'rows',\n filters: [],\n last: last ? { size: last.size, unit: last.unit } : undefined,\n };\n if (whereText || groupBy || rollup) {\n result.error = `Rows queries return raw statements — no where / by / rollup. Got \"${primaryText.trim()}\"`;\n return result;\n }\n\n const text = primaryText.trim();\n const brace = text.indexOf('{');\n const head = (brace === -1 ? text : text.slice(0, brace)).trim();\n const filterText = brace === -1 ? '' : text.slice(brace).trim();\n\n if (head === 'rows' || head === 'rows:') {\n // Bare head (`rows:{…}`) — all output-statement types.\n } else if (head.startsWith('rows:')) {\n const target = head.slice('rows:'.length).trim();\n if (!target || /\\s/.test(target)) {\n result.error = cannotParseRows(text);\n return result;\n }\n result.outputType = target;\n } else {\n result.error = cannotParseRows(text);\n return result;\n }\n\n if (filterText) {\n if (!/^\\{.*\\}$/.test(filterText)) {\n result.error = cannotParseRows(text);\n return result;\n }\n const synthetic = `find:_${filterText}`;\n const tree = wqlParser.parse(synthetic);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n result.error = cannotParseRows(text);\n return result;\n }\n result.filters = extractFilters(tree.topNode, synthetic);\n }\n return result;\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\nfunction parseAnalyticsQuery(raw: string): ParsedQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, displayUnit, groupBy, rollup, primaryText: text } = suffixes;\n\n const base: ParsedQuery = {\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 };\n\n // Validate rollup unit if a rollup suffix was present\n if (rollup && rollup.unit !== 'd' && rollup.unit !== 'w') {\n base.error = cannotParse(text);\n return base;\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\n // Head — agg:metric. Unknown aggregators are a semantic error, reported\n // exactly like the reference parser (metric left empty).\n const head = query.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n if (!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 base.filters = extractFilters(query, text);\n if (whereText) {\n const join = parseJoinClause(whereText);\n if (join.error) {\n base.error = join.error;\n return base;\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 find:target{filters} in scope last 8w`;\n}\n\nfunction parseFindQuery(raw: string): ParsedFindQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, last, scope, primaryText: text } = suffixes;\n const result: ParsedFindQuery = {\n raw,\n target: '',\n filters: [],\n scope,\n last: last ? { size: last.size, unit: last.unit } : undefined,\n };\n // Parse structural part: find:target{filters}\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 query = tree.topNode;\n const head = query.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n if (!head || !aggNode || !metricNode) {\n result.error = cannotParseFind(text);\n return result;\n }\n\n // The first word must be \"find\" (the dispatch keyword).\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\n result.target = text.slice(metricNode.from, metricNode.to);\n result.filters = extractFilters(query, text);\n\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 return result;\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, syntaxTree, HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { autocompletion, CompletionContext, CompletionResult, Completion, snippetCompletion } from \"@codemirror/autocomplete\";\nimport type { Extension } from \"@codemirror/state\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\nimport type { SyntaxNode } from \"@lezer/common\";\nimport { parser } from \"./grammar/wql.parser\";\nimport { EFFORT_DISCIPLINES } from \"./disciplines\";\nimport {\n WQL_AGGREGATORS,\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_TAG_KEYS,\n WQL_VIRTUAL_DIMS,\n WQL_CALC_TARGETS,\n WQL_INTENSITY_TIERS,\n WQL_GRAINS,\n WQL_ROLLUP_PERIODS,\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_SCOPES,\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 Aggregator: t.keyword,\n \"Aggregator/Word\": t.keyword,\n Metric: t.variableName,\n \"Metric/Word\": t.variableName,\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\n/** Nearest ancestor (or self) of `node` with one of `names`. */\nfunction ancestor(node: SyntaxNode | null, ...names: string[]): SyntaxNode | null {\n for (let n = node; n; n = n.parent) {\n if (names.includes(n.name)) return n;\n }\n return null;\n}\n\nfunction options(labels: readonly (string | Completion)[]): Completion[] {\n return labels.map((label) => (typeof label === 'string' ? { label } : label));\n}\n\nexport function wqlCompletionSource(options_: WqlCompletionOptions = {}) {\n const { effortNames } = options_;\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 const tagValueOptions = (key: string): 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 default: return null; // note/page/block/result/tags — free-form\n }\n };\n\n function source(context: CompletionContext): CompletionResult | null {\n const word = context.matchBefore(/[\\w.*-]*/)!;\n if (!word || (word.from === word.to && !context.explicit)) return null;\n const tree = syntaxTree(context.state);\n const node = tree.resolveInner(context.pos, -1);\n\n // Inside a Filter: before the colon → tag keys; after → values for that key.\n const filter = ancestor(node, 'Filter');\n if (filter) {\n const filterText = context.state.sliceDoc(filter.from, context.pos);\n const colonIndex = filterText.indexOf(':');\n if (colonIndex === -1) {\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n return { from: keyWord.from, options: options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })), validFor: /^[\\w-]*$/ };\n }\n const key = filterText.slice(0, colonIndex).replace(/^!/, '').trim();\n const valueOptions = tagValueOptions(key);\n if (!valueOptions) return null;\n return { from: word.from, options: valueOptions, validFor: /^[\\w*-]*$/ };\n }\n\n // Inside Filters braces but not in a parsed Filter yet (e.g. `{` + cursor).\n if (ancestor(node, 'Filters')) {\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n return { from: keyWord.from, options: options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })), validFor: /^[\\w-]*$/ };\n }\n\n // Inside GroupBy: virtual dims + tag keys.\n if (ancestor(node, 'GroupBy')) {\n const dimWord = context.matchBefore(/[\\w-]*/)!;\n return {\n from: dimWord.from,\n options: [\n ...options(WQL_VIRTUAL_DIMS).map((c) => ({ ...c, type: 'atom' })),\n ...options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })),\n ],\n validFor: /^[\\w-]*$/,\n };\n }\n\n // Head-relative positions. The top node's Head child tells whether the\n // query already has a complete head; node ancestry tells whether the\n // cursor sits inside it.\n const head = tree.topNode.getChild('Head');\n const insideHead = ancestor(node, 'Head') !== null;\n const inMetric = node.name === 'Metric' || (node.name === 'Word' && node.parent?.name === 'Metric');\n\n if (inMetric) {\n return { from: word.from, options: metricOptions(), validFor: /^[\\w.-]*$/ };\n }\n\n if (insideHead && head) {\n // Inside the head: before the colon → aggregators, after → metrics\n // (the error-tolerant tree may not have grown a Metric yet).\n const afterColon = context.state.sliceDoc(head.from, context.pos).includes(':');\n // The error-tolerant parser absorbs a space-separated word after the\n // metric into the Metric node — whitespace after the metric's first\n // word means the user is typing past it (`sum:tis by …`).\n const metricWord = head.getChild('Metric')?.getChild('Word');\n const typedPastMetric = metricWord !== null && metricWord !== undefined\n && /\\s/.test(context.state.sliceDoc(metricWord.to, context.pos));\n if (afterColon && !typedPastMetric) {\n return { from: word.from, options: metricOptions(), validFor: /^[\\w.-]*$/ };\n }\n if (!afterColon) {\n return { from: word.from, options: options(WQL_AGGREGATORS).map((c) => ({ ...c, type: 'keyword' })), validFor: /^[\\w-]*$/ };\n }\n }\n\n // Inside .rollup(…): period sizes.\n if (ancestor(node, 'Rollup')) {\n return {\n from: word.from,\n options: options(WQL_ROLLUP_PERIODS).map((c) => ({ ...c, type: 'constant' })),\n validFor: /^[\\w]*$/,\n };\n }\n\n // Query start — no head yet → aggregators. Past a complete head →\n // structural suffixes.\n if (!head) {\n return { from: word.from, options: options(WQL_AGGREGATORS).map((c) => ({ ...c, type: 'keyword' })), validFor: /^[\\w-]*$/ };\n }\n\n // Top level after the head: structural suffixes.\n return {\n from: word.from,\n options: [\n snippetCompletion('by {${dimension}}', { label: 'by {}', detail: 'group by dimensions', type: 'keyword' }),\n snippetCompletion('.rollup(${1}${d|w})', { label: '.rollup()', detail: 'bucket period', type: 'keyword' }),\n ],\n validFor: /^[\\w.-]*$/,\n };\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 * Analytics unit conversion seam — narrow, fake-free, pure.\n *\n * Supports exactly the unit families analytics currently needs:\n * - mass: kg ↔ lb (exact 0.45359237 kg per lb)\n * - distance: m ↔ km\n *\n * Any unknown or incompatible units pass through unchanged.\n */\n\nexport const KG_PER_LB = 0.45359237;\n\nexport type UnitFamily = 'mass' | 'distance';\n\nexport interface UnitFamilyDef {\n /** Base unit for the family (used for documentation, not conversion). */\n base: string;\n /** Factor to convert FROM this unit TO the base unit. */\n units: Record<string, number>;\n}\n\nexport const UNIT_FAMILIES: Record<UnitFamily, UnitFamilyDef> = {\n mass: {\n base: 'kg',\n units: {\n kg: 1,\n lb: KG_PER_LB,\n },\n },\n distance: {\n base: 'm',\n units: {\n m: 1,\n km: 1000,\n },\n },\n};\n\nexport function getUnitFamily(unit: string | undefined): UnitFamily | undefined {\n if (!unit) return undefined;\n for (const [family, def] of Object.entries(UNIT_FAMILIES) as [UnitFamily, UnitFamilyDef][]) {\n if (def.units[unit] !== undefined) return family;\n }\n return undefined;\n}\n\n/**\n * Convert a value between known units.\n *\n * Returns the input unchanged when:\n * - from === to\n * - either unit is unknown\n * - the units belong to different families\n */\nexport function convert(value: number, from: string | undefined, to: string | undefined): number {\n if (from === to || from === undefined || to === undefined) return value;\n const family = getUnitFamily(from);\n if (!family || family !== getUnitFamily(to)) return value;\n const def = UNIT_FAMILIES[family];\n const fromFactor = def.units[from];\n const toFactor = def.units[to];\n if (fromFactor === undefined || toFactor === undefined) return value;\n return (value * fromFactor) / toFactor;\n}\n\n/**\n * Determine the target display unit for a set of matched facts and query\n * options. Returns the unit to render and whether values should be converted.\n */\nexport function resolveDisplayUnit(\n facts: ReadonlyArray<{ unit?: string; metricUnit?: string }>,\n {\n directive,\n preferred,\n }: { directive?: string; preferred?: string },\n): { unit?: string; convert: boolean } {\n const sourceUnits = facts\n .map((row) => row.unit ?? row.metricUnit)\n .filter((u): u is string => Boolean(u));\n const firstSource = sourceUnits[0];\n\n if (directive) {\n const directiveFamily = getUnitFamily(directive);\n const applicable =\n directiveFamily !== undefined &&\n sourceUnits.some((u) => getUnitFamily(u) === directiveFamily);\n return { unit: directive, convert: applicable };\n }\n\n if (preferred) {\n const preferredFamily = getUnitFamily(preferred);\n if (\n preferredFamily &&\n sourceUnits.some((u) => getUnitFamily(u) === preferredFamily)\n ) {\n return { unit: preferred, convert: true };\n }\n }\n\n return { unit: firstSource, convert: false };\n}\n","/**\n * Workout derivation helpers for WQL QueryService and cross-store joins.\n */\n\nimport { MetricType, type AnalyticsDataPoint, type ResultOrigin } 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 /** FK to NoteSegment.id (positional section id of the block run). */\n segmentId?: string;\n /** NoteSegment.version at record time. */\n segmentVersion?: 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/** 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 * 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 const rowsByKey = new Map<string, AnalyticsDataPoint>();\n\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 // Composed calcs carry their Canonical Metric Key explicitly (#878);\n // legacy projections fall back to name-derived keys during cutover.\n const metricKey = metadataString(value.metadata, 'canonicalKey') ?? 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 // Row key = metricKey + sorted group-tag pairs (spec §7.1:\n // `totalVolume:effort=thruster`). Grouped dims auto-tag; legacy\n // per-effort projections tag `effort` from their effortSlug metadata.\n const groupTags = readGroupTags(value.metadata) ?? (effortSlug ? { effort: effortSlug } : undefined);\n const rowKey = groupTags\n ? `${metricKey}:${Object.entries(groupTags).map(([k, v]) => `${k}=${v}`).join(':')}`\n : metricKey;\n\n rowsByKey.set(rowKey, {\n id: `${identity.resultId}-${rowKey}-${now}`,\n noteId: identity.noteId,\n blockContentId: identity.blockContentId,\n origin: identity.origin,\n pageId: identity.pageId,\n grain: 'summary',\n segmentId: identity.segmentId ?? '',\n segmentVersion: identity.segmentVersion ?? 0,\n resultId: identity.resultId,\n type: metricKey,\n value: value.value as number,\n unit: value.unit,\n label: projectionName,\n metricKey,\n metricLabel: projectionName,\n metricUnit: value.unit,\n ...(effortSlug ? { effortSlug } : {}),\n ...(discipline ? { discipline } : {}),\n ...(intensityTier ? { intensityTier } : {}),\n ...(grade ? { grade } : {}),\n timestamp: identity.workoutTimestamp ?? output.timeSpan?.started ?? now,\n createdAt: now,\n });\n }\n\n return Array.from(rowsByKey.values());\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 type { BlockIndexRow, Note } from '@bitcobblers/wod-wiki-core';\nimport { extractFrontmatterTags } from './dashboard/frontmatter';\n\n/**\n * Pure projection of a block_index into static Notes — one Note per distinct\n * noteId, with a `catalog` field set to `noteId.split('/')[0]`. The catalog is\n * the directory the file lives under (e.g. `crossfit-girls` for collections,\n * `crossfit-programming` for feeds) and is what the Library's panel uses to\n * target the `+ Filter → Catalog` menu.\n */\nexport function staticNotesFromBlocks(blocks: BlockIndexRow[]): Note[] {\n const map = new Map<string, Note>();\n for (const block of blocks) {\n if (!map.has(block.noteId)) {\n map.set(block.noteId, {\n id: block.noteId,\n title: block.noteTitle,\n createdAt: block.createdAt,\n type: 'note',\n sourceId: block.sourceId,\n catalog: (block.noteId.startsWith('feeds/') ? block.noteId.slice('feeds/'.length) : block.noteId).split('/')[0],\n });\n }\n }\n return Array.from(map.values());\n}\n\n/**\n * Tag → noteIds index over a block index's frontmatter rows. Static-corpus\n * notes declare tags only in frontmatter `tags:`; this recovers the mapping\n * the note store needs to answer `tags:` clauses (issue #853 — the store\n * previously returned an empty set for every tag).\n */\nexport function staticTagIndexFromBlocks(blocks: BlockIndexRow[]): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const block of blocks) {\n if (block.dataType !== 'frontmatter') continue;\n for (const tag of extractFrontmatterTags(block.rawContent)) {\n const ids = index.get(tag);\n if (ids) ids.add(block.noteId);\n else index.set(tag, new Set([block.noteId]));\n }\n }\n return index;\n}\n","/**\n * Query Service — the executor of WQL against the Analytics Store\n * (CONTEXT.md glossary). Four-stage physical plan:\n *\n * SELECT (index-first: by-metric + by-timestamp IDBKeyRange fetches,\n * intersected in memory)\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. Fact rows are summary-grain AnalyticsDataPoint\n * rows; Tags are query-time dimensions read off the row (effort, discipline,\n * note, intensity, …) — 'tags' resolves through the note_tags store.\n *\n * Fully inverted dependencies: zero IndexedDB/storage module-level imports.\n */\n\nimport type { AnalyticsDataPoint, Note, BlockIndexRow, WorkoutResult, StoredOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport {\n parseQuery,\n isFindQuery,\n isRowsQuery,\n type Aggregator,\n type ComparisonOp,\n type ParsedQuery,\n type ParsedFindQuery,\n type ParsedRowsQuery,\n type FindPredicate,\n type MetricPredicate,\n type Series,\n type SeriesPoint,\n type TagFilter,\n} from './wql';\nimport { convert, resolveDisplayUnit } from './units';\nimport { normalizeSummaryFacts } from './derivation';\nimport type {\n FactQueryStore,\n NoteQueryStore,\n BlockQueryStore,\n ResultLogStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n} from './stores';\n\nexport type {\n FactQueryStore,\n NoteQueryStore,\n BlockQueryStore,\n ResultLogStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n};\n\nconst DAY = 86_400_000;\n\nfunction localDateString(ts: number): string {\n return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\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`. */\nfunction catalogOfItem(item: { id?: string; noteId?: string; sourceId?: string; catalog?: string }): string | undefined {\n if (item.catalog) return item.catalog;\n const raw = item.sourceId ? item.sourceId.replace(/^(collection|feed):/, '') : (item.noteId || item.id || '');\n if (!raw) return undefined;\n const clean = raw.startsWith('feeds/') ? raw.slice('feeds/'.length) : raw;\n return clean.split('/')[0];\n}\n\n/** Match a single sourceId against one filter value. The `journal` kind matches\n * rows with no sourceId prefix; the `collection` / `feed` kinds match rows whose\n * sourceId starts with the kind. A `kind:id` literal matches the exact id. */\nfunction sourceMatches(sourceId: string | undefined, kind: string): boolean {\n if (kind === 'journal') return !sourceId || sourceId === 'journal';\n if (kind === 'collection' || kind === 'feed') {\n return !!sourceId && sourceId.startsWith(`${kind}:`);\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 }>(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.sourceId, w));\n return filter.negate ? !match : match;\n });\n }\n return items;\n}\n\n/** Time-window predicate for a row, given the parsed WQL's `last` clause and\n * the optional explicit `range` parameter. The range overrides `last`; when\n * neither is set, the row passes. */\nfunction effectiveTimeWindow(\n createdAt: number,\n last: { size: number; unit: 'd' | 'w' } | undefined,\n range: { start: number; end: number } | undefined,\n anchorNow?: number,\n): boolean {\n if (range) return createdAt >= range.start && createdAt <= range.end;\n if (last) {\n const cutoff = (anchorNow ?? Date.now()) - last.size * (last.unit === 'w' ? 7 : 1) * DAY;\n return createdAt >= cutoff;\n }\n return true;\n}\n\n/** Newest `createdAt` in a scope-selected set — the `'latest-activity'`\n * window anchor (#857). Undated rows (0) never win; an all-undated set\n * anchors at 0, which lets every row pass (no dated activity to window\n * against). Computed over the scope selection, before filters: the anchor\n * is the index's latest activity, not the filtered subset's. */\nfunction latestActivity(rows: ReadonlyArray<{ createdAt: number }>): number {\n let max = 0;\n for (const r of rows) if (r.createdAt > max) max = r.createdAt;\n return max;\n}\n\n/** Resolve the window anchor timestamp for a find run, per FindOptions. */\nfunction windowAnchor<T extends { createdAt: number }>(\n selected: T[],\n parsed: ParsedFindQuery,\n options: FindOptions,\n): number | undefined {\n if (options.anchorNow !== undefined) return options.anchorNow;\n if (options.anchor === 'latest-activity' && parsed.last) return latestActivity(selected);\n return undefined;\n}\n\nconst defaultFactStore: FactQueryStore = {\n getFactsByMetric: async () => [],\n getFactsByTimeRange: async () => [],\n getNoteTagLabels: async () => [],\n};\n\nconst defaultNoteStore: NoteQueryStore = {\n getAllNotes: async () => [],\n getNoteIdsForTag: async () => new Set<string>(),\n};\n\nconst defaultBlockStore: BlockQueryStore = {\n getAllBlocks: async () => [],\n};\n\nconst defaultResultStore: ResultLogStore = {\n getResultsByContentId: async () => [],\n getResultById: async () => undefined,\n getResultsForNote: 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 find:effort queries. */\n efforts?: IEffort[];\n stages: { selected: number; matched: number };\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}\n\n/** Options for `runFind` / `runFindBlock` — overrides for the parsed WQL. */\nexport interface FindOptions {\n /** Explicit timestamp range; overrides parsed WQL's `last` clause when set. */\n range?: { start: number; end: number };\n /** Time-window anchoring mode. 'wall-clock' anchors to Date.now();\n * 'latest-activity' anchors to the newest row in the scope selection\n * (#857). Defaults to 'wall-clock'. */\n anchor?: 'wall-clock' | 'latest-activity';\n /** Explicit reference time for the window (useful for tests/replay).\n * Overrides `anchor`. */\n anchorNow?: number;\n}\n\nexport interface QueryResult {\n parsed: ParsedQuery;\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}\n\n/** One run in a rows result: the stored result plus the output statements\n * that survived the optional output-type narrowing (`rows:segment{…}`). */\nexport interface RowsRun {\n result: WorkoutResult;\n logs: StoredOutputStatement[];\n}\n\nexport interface RowsQueryResult {\n parsed: ParsedRowsQuery;\n runs: RowsRun[];\n error?: string;\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 'grade': return row.grade;\n case 'intensity': return row.intensityTier;\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: return undefined;\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 = group.some((f) =>\n f.values.some((a) =>\n rowValues.some((v) => (a.wildcard ? v.startsWith(a.value) : v === a.value)),\n ),\n );\n return negate ? !hit : hit;\n });\n}\n\n/** Dimension value for grouping; virtual time dims bucket the canonical time. */\nfunction dimValue(row: AnalyticsDataPoint, dim: string, noteTags: ReadonlyMap<string, readonly string[]>): string {\n if (dim === 'day') return localDateString(row.timestamp);\n if (dim === 'week') {\n const d = new Date(row.timestamp);\n const monday = new Date(row.timestamp - ((d.getDay() + 6) % 7) * DAY);\n return `w/${monday.toISOString().slice(5, 10)}`;\n }\n if (dim === 'session') return row.resultId;\n const raw = factTagValue(row, dim, noteTags);\n if (raw === undefined) return '(none)';\n if (typeof raw === 'string') return raw;\n return raw.length ? raw.join(',') : '(none)';\n}\n\n/** Convert a single fact value to the target display unit, if known. */\nfunction toDisplayValue(value: number, unit: string | undefined, targetUnit: string | undefined): number {\n if (!targetUnit || unit === targetUnit) return value;\n return convert(value, unit, targetUnit);\n}\n\n/** Aggregate values already converted to the target display unit. */\nfunction aggregate(values: number[], agg: Aggregator, points: AnalyticsDataPoint[], targetUnit: string | undefined): number {\n if (agg === 'count') return points.length;\n if (values.length === 0) return 0;\n switch (agg) {\n case 'sum': return values.reduce((a, b) => a + b, 0);\n case 'avg': return values.reduce((a, b) => a + b, 0) / values.length;\n case 'min': return Math.min(...values);\n case 'max': return Math.max(...values);\n case 'last': {\n const latest = [...points].sort((a, b) => b.timestamp - a.timestamp)[0];\n return toDisplayValue(latest.value as number, latest.unit ?? latest.metricUnit, targetUnit);\n }\n case 'delta': return values[values.length - 1] - values[0];\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\nexport class QueryService {\n private readonly store: FactQueryStore;\n private readonly noteStore: NoteQueryStore;\n private readonly blockStore: BlockQueryStore;\n private readonly resultStore: ResultLogStore;\n private readonly effortStore: EffortQueryStore;\n private readonly staticNoteStore?: NoteQueryStore;\n private readonly staticBlockStore?: BlockQueryStore;\n\n constructor(\n storesOrFactStore?: QueryServiceStores | FactQueryStore,\n noteStore?: NoteQueryStore,\n blockStore?: BlockQueryStore,\n resultStore?: ResultLogStore,\n effortStore?: EffortQueryStore,\n staticNoteStore?: NoteQueryStore,\n staticBlockStore?: BlockQueryStore,\n ) {\n if (\n storesOrFactStore &&\n typeof storesOrFactStore === 'object' &&\n ('factStore' in storesOrFactStore ||\n 'noteStore' in storesOrFactStore ||\n 'blockStore' in storesOrFactStore ||\n 'resultStore' in storesOrFactStore ||\n 'effortStore' in storesOrFactStore ||\n 'staticNoteStore' in storesOrFactStore ||\n 'staticBlockStore' in storesOrFactStore)\n ) {\n const stores = storesOrFactStore as QueryServiceStores;\n this.store = stores.factStore ?? defaultFactStore;\n this.noteStore = stores.noteStore ?? defaultNoteStore;\n this.blockStore = stores.blockStore ?? defaultBlockStore;\n this.resultStore = stores.resultStore ?? defaultResultStore;\n this.effortStore = stores.effortStore ?? defaultEffortStore;\n this.staticNoteStore = stores.staticNoteStore;\n this.staticBlockStore = stores.staticBlockStore;\n } else {\n this.store = (storesOrFactStore as FactQueryStore | undefined) ?? defaultFactStore;\n this.noteStore = noteStore ?? defaultNoteStore;\n this.blockStore = blockStore ?? defaultBlockStore;\n this.resultStore = resultStore ?? defaultResultStore;\n this.effortStore = effortStore ?? defaultEffortStore;\n this.staticNoteStore = staticNoteStore;\n this.staticBlockStore = staticBlockStore;\n }\n }\n\n async getFactsByTimeRange(start: number, end: number): Promise<AnalyticsDataPoint[]> {\n return this.store.getFactsByTimeRange(start, end);\n }\n\n async runQuery(raw: string, options: QueryOptions = {}): Promise<QueryResult> {\n const parsed = parseQuery(raw);\n if (isFindQuery(parsed)) {\n return {\n parsed: { raw, agg: 'count', metric: parsed.target, filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n }\n if (isRowsQuery(parsed)) {\n return {\n parsed: { raw, agg: 'count', metric: 'rows', filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n }\n return this.run(parsed, options);\n }\n\n /**\n * Execute a rows query (rows:{…}, #949) — the session results table plane.\n * Re-derives output statements from raw WorkoutResult logs through the\n * ResultLogStore seam (\"logs win\" — facts are never read for this path).\n */\n async runRows(parsed: ParsedRowsQuery, options: { anchorNow?: number } = {}): Promise<RowsQueryResult> {\n const empty: RowsQueryResult = { parsed, runs: [] };\n if (parsed.error) return { ...empty, error: parsed.error };\n\n const ROWS_SCOPE_KEYS = new Set(['result', 'block', 'note']);\n const unsupported = parsed.filters.filter(\n (f) => !ROWS_SCOPE_KEYS.has(f.key) || f.negate || f.values.some((v) => v.wildcard),\n );\n if (unsupported.length > 0) {\n return {\n ...empty,\n error: `Unsupported rows filter(s): ${unsupported.map((f) => (f.negate ? '!' : '') + f.key).join(', ')}. Rows queries support exact result:, block:, note: values.`,\n };\n }\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 if (resultIds.length + blockIds.length + noteIds.length === 0) {\n return { ...empty, error: 'Rows query needs a scope: result:, block:, or note:.' };\n }\n\n const byId = new Map<string, WorkoutResult>();\n for (const id of resultIds) {\n const r = await this.resultStore.getResultById(id);\n if (r) byId.set(r.id, r);\n }\n for (const blockContentId of blockIds) {\n for (const r of await this.resultStore.getResultsByContentId(blockContentId)) byId.set(r.id, r);\n }\n for (const noteId of noteIds) {\n for (const r of await this.resultStore.getResultsForNote(noteId)) byId.set(r.id, r);\n }\n\n let results = [...byId.values()].filter((r) => r.data?.logs?.length);\n if (parsed.last) {\n results = results.filter((r) =>\n effectiveTimeWindow(r.data.endTime ?? r.createdAt ?? 0, parsed.last, undefined, options.anchorNow),\n );\n }\n results.sort((a, b) => (b.data.endTime ?? b.createdAt) - (a.data.endTime ?? a.createdAt));\n\n const runs = results\n .map((result) => ({\n result,\n logs: parsed.outputType\n ? result.data.logs!.filter((l) => l.outputType === parsed.outputType)\n : result.data.logs!,\n }))\n .filter((run) => run.logs.length > 0);\n return { parsed, runs };\n }\n\n /**\n * Execute a content-discovery query (find: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\n if (parsed.target === 'block') {\n return this.runFindBlock(parsed, options);\n }\n if (parsed.target === 'effort') {\n return this.runFindEffort(parsed);\n }\n let notes: Note[] = [];\n const scope = parsed.scope || 'journal';\n if (scope === 'journal' || scope === 'all') {\n notes = notes.concat(await this.noteStore.getAllNotes());\n }\n if (scope === 'collections' || scope === 'feeds' || scope === 'all') {\n let sNotes = this.staticNoteStore ? await this.staticNoteStore.getAllNotes() : [];\n if (scope === 'collections') sNotes = sNotes.filter(n => n.sourceId?.startsWith('collection:'));\n if (scope === 'feeds') sNotes = sNotes.filter(n => n.sourceId?.startsWith('feed:'));\n notes = notes.concat(sNotes);\n }\n const selectedCount = notes.length;\n const anchorNow = windowAnchor(notes, parsed, options);\n notes = applySourceFilter(notes, parsed.filters);\n\n // Tag filters — intersect note IDs across OR'd values within a key.\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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n ids.forEach(id => matchingIds.add(id));\n sIds.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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n notes = notes.filter(n => !ids.has(n.id) && !sIds.has(n.id));\n }\n }\n }\n\n // Text filter — substring on title\n for (const filter of parsed.filters) {\n if (filter.key === 'text' && !filter.negate) {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n notes = notes.filter(n => n.title.toLowerCase().includes(search));\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 // 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 // Time window — the `range` parameter overrides the WQL's `last` clause.\n if (parsed.last || options.range) {\n notes = notes.filter(n => effectiveTimeWindow(n.createdAt, parsed.last, options.range, anchorNow));\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 return { parsed, notes, blocks: [], stages: { selected: selectedCount, matched: notes.length } };\n }\n\n /**\n * Execute a find:block query against the derived block_index store.\n */\n async runFindBlock(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n let blocks: BlockIndexRow[] = [];\n const scope = parsed.scope || 'journal';\n if (scope === 'journal' || scope === 'all') {\n blocks = blocks.concat(await this.blockStore.getAllBlocks());\n }\n if (scope === 'collections' || scope === 'feeds' || scope === 'all') {\n let sBlocks = this.staticBlockStore ? await this.staticBlockStore.getAllBlocks() : [];\n if (scope === 'collections') sBlocks = sBlocks.filter(b => b.sourceId?.startsWith('collection:'));\n if (scope === 'feeds') sBlocks = sBlocks.filter(b => b.sourceId?.startsWith('feed:'));\n blocks = blocks.concat(sBlocks);\n }\n const selectedCount = blocks.length;\n const anchorNow = windowAnchor(blocks, parsed, options);\n blocks = applySourceFilter(blocks, parsed.filters);\n\n // Text filter — substring on rawContent\n for (const filter of parsed.filters) {\n if (filter.key === 'text' && !filter.negate) {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n blocks = blocks.filter(b => b.rawContent.toLowerCase().includes(search));\n }\n }\n\n // Type filter — dataType (wod, prose, 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 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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n ids.forEach(id => matchingNoteIds.add(id));\n sIds.forEach(id => matchingNoteIds.add(id));\n }\n blocks = blocks.filter(b => matchingNoteIds.has(b.noteId));\n }\n }\n\n // Time window\n if (parsed.last || options.range) {\n blocks = blocks.filter(b => effectiveTimeWindow(b.createdAt, parsed.last, options.range, anchorNow));\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 return { parsed, notes: [], blocks, stages: { selected: selectedCount, matched: blocks.length } };\n }\n\n /**\n * Execute a find: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 return { parsed, notes: [], blocks: [], efforts, stages: { selected: selectedCount, matched: efforts.length } };\n }\n\n async run(parsed: ParsedQuery, options: QueryOptions = {}): Promise<QueryResult> {\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 (direction 2): bypass the analytics store and re-derive\n // from raw WorkoutResult logs. Logs win (#800).\n if (parsed.join) return this.runJoined(parsed, options);\n\n // Stage 1: SELECT — index-first.\n const byMetric = await this.store.getFactsByMetric(parsed.metric);\n let candidates = byMetric;\n if (options.rangeStart !== undefined || options.rangeEnd !== undefined) {\n const start = options.rangeStart ?? 0;\n const end = options.rangeEnd ?? Number.MAX_SAFE_INTEGER;\n const inRange = new Set((await this.store.getFactsByTimeRange(start, end)).map(row => row.id));\n candidates = candidates.filter(row => inRange.has(row.id));\n }\n\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(candidates, touchesTags);\n const matched = this.applyEffortScope(\n candidates.filter(row => matchesFilters(row, parsed.filters, noteTags)), parsed,\n );\n\n return this.buildResult(matched, parsed, options, noteTags);\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: ParsedQuery,\n options: QueryOptions,\n noteTags: ReadonlyMap<string, readonly string[]>,\n ): QueryResult {\n // Stage 2: BUCKET\n const timeDim = parsed.groupBy.find((d) => d === 'day' || d === 'week');\n const tagDims = parsed.groupBy.filter((d) => d !== 'day' && d !== 'week');\n const bucketMs = timeDim\n ? (timeDim === 'week' ? 7 : 1) * DAY\n : parsed.rollup\n ? parsed.rollup.size * (parsed.rollup.unit === 'w' ? 7 : 1) * DAY\n : null;\n const bucketKey = (ts: number) => (bucketMs ? Math.floor(ts / bucketMs) : 0);\n const bucketCount = bucketMs\n ? new Set(matched.map((p) => bucketKey(p.timestamp))).size\n : (matched.length ? 1 : 0);\n\n // Unit display preference / directive\n const { unit: targetUnit, convert: shouldConvert } = resolveDisplayUnit(matched, {\n directive: parsed.displayUnit,\n preferred: options.preferredUnit,\n });\n\n // Stage 3+4: GROUP + AGGREGATE per bucket\n const groups = new Map<string, AnalyticsDataPoint[]>();\n for (const row of matched) {\n const key = tagDims.length\n ? tagDims.map((d) => dimValue(row, d, noteTags)).join(' · ')\n : parsed.metric;\n const bucket = groups.get(key);\n if (bucket) bucket.push(row);\n else groups.set(key, [row]);\n }\n\n const series: Series[] = [...groups.entries()].map(([key, rows]) => {\n const byBucket = new Map<number, AnalyticsDataPoint[]>();\n for (const row of rows) {\n const b = bucketKey(row.timestamp);\n const members = byBucket.get(b);\n if (members) members.push(row);\n else byBucket.set(b, [row]);\n }\n const points: SeriesPoint[] = [...byBucket.entries()]\n .sort(([a], [b]) => a - b)\n .map(([b, members]) => {\n const values = members.map((m) =>\n toDisplayValue(m.value as number, m.unit ?? m.metricUnit, shouldConvert ? targetUnit : undefined),\n );\n return {\n ts: bucketMs ? b * bucketMs + bucketMs / 2 : Math.min(...members.map((m) => m.timestamp)),\n value: Math.round(aggregate(values, parsed.agg, members, shouldConvert ? targetUnit : undefined) * 100) / 100,\n };\n });\n const seriesUnit = shouldConvert\n ? targetUnit\n : (rows[0]?.unit ?? rows[0]?.metricUnit);\n return { key, label: key, points, unit: seriesUnit };\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\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 };\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: ParsedQuery, 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 raw: '', target: join.target, filters: join.filters, scope: join.scope, last: join.last,\n });\n const contentIds = await this.contentIdsFromFindResult(findResult);\n if (contentIds.size === 0) return empty;\n\n let facts = await this.deriveMetricFacts(contentIds, parsed.metric);\n if (facts.length === 0) return empty;\n if (options.rangeStart !== undefined || options.rangeEnd !== undefined) {\n const start = options.rangeStart ?? 0;\n const end = options.rangeEnd ?? Number.MAX_SAFE_INTEGER;\n facts = facts.filter(f => f.timestamp >= start && f.timestamp <= end);\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 = this.applyEffortScope(\n facts.filter(f => matchesFilters(f, parsed.filters, noteTags)), parsed,\n );\n\n return this.buildResult(matched, parsed, options, noteTags);\n }\n\n /** Direction 1 — keep only content owning a wod block whose raw-log metric\n * aggregate satisfies the predicate. `notes` for find:note, `blocks` for\n * find: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 // find: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 // find: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 = await this.deriveMetricFacts(contentIds, join.metric);\n const noteTags = await this.loadNoteTags(facts, join.filters.some(f => f.key === 'tags'));\n const filtered = this.applyEffortScope(\n facts.filter(f => matchesFilters(f, join.filters, noteTags)),\n { filters: join.filters, groupBy: [] },\n );\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 if (compareOp(aggregate(values, join.agg, rows, undefined), join.operator, join.threshold)) passing.add(cid);\n }\n return passing;\n }\n\n /** Filter per-effort vs un-attributed overall summary rows to avoid\n * double-counting. */\n private applyEffortScope(matched: AnalyticsDataPoint[], scope: { filters: TagFilter[]; groupBy: string[] }): AnalyticsDataPoint[] {\n if (scope.groupBy.includes('effort') || scope.filters.some(f => f.key === 'effort')) {\n return matched.some(r => r.effortSlug !== undefined)\n ? matched.filter(r => r.effortSlug !== undefined)\n : matched;\n }\n return matched.some(r => r.effortSlug === undefined)\n ? matched.filter(r => r.effortSlug === undefined)\n : matched;\n }\n\n /** Re-derive summary facts for one Canonical Metric Key from RAW WorkoutResult\n * logs across the given content ids — the cross-store join source. One fact\n * row per result (normalizeSummaryFacts dedupes within a result). */\n private async deriveMetricFacts(\n contentIds: Iterable<string>,\n metricKey: string,\n ): Promise<AnalyticsDataPoint[]> {\n const out: AnalyticsDataPoint[] = [];\n const ids = [...new Set(contentIds)];\n await Promise.all(ids.map(async (blockContentId) => {\n const results = await this.resultStore.getResultsByContentId(blockContentId);\n for (const result of results) {\n const facts = normalizeSummaryFacts(result.data.logs ?? [], {\n noteId: result.noteId,\n resultId: result.id,\n segmentId: result.segmentId,\n segmentVersion: result.segmentVersion,\n blockContentId,\n origin: result.origin,\n pageId: result.pageId,\n workoutTimestamp: result.createdAt,\n });\n for (const f of facts) if (f.metricKey === metricKey) out.push(f);\n }\n }));\n return out;\n }\n\n /** All content blocks across the journal + static corpus. */\n private async allContentBlocks(): Promise<BlockIndexRow[]> {\n const blocks = await this.blockStore.getAllBlocks();\n const staticBlocks = this.staticBlockStore ? await this.staticBlockStore.getAllBlocks() : [];\n return blocks.concat(staticBlocks);\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'. */\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 await Promise.all(noteIds.map(async (id) => noteTags.set(id, await this.store.getNoteTagLabels(id))));\n return noteTags;\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 * is one line: WQL query + optional `/`-separated positional params.\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 'value',\n 'timeseries',\n 'bar',\n 'toplist',\n 'stacked-bar',\n 'goal-rings',\n 'zone-distribution',\n] as const;\n\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 /** 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 === '') return { type: '', error: 'missing widget type after \"query:\"' };\n\n let rest = suffix.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, 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, error: `malformed widget suffix \"${suffix}\"` };\n }\n if (spanCols != null && (spanCols < 1 || spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { type: rest, spanCols, spanFull, error: `span ${spanCols} outside 1..${DASHBOARD_GRID_MAX_COLS}` };\n }\n return { type: rest, spanCols, spanFull };\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/**\n * Split a block body into the WQL query and its trailing `/`-separated\n * positional parameters (decision #899-7). Splits at the FIRST ` / ` so\n * params stay trailing; a literal ` / ` inside a tag value is pathological\n * and unsupported. Params are whitespace-split literals or `$token` refs.\n */\nexport function splitWidgetBody(body: string): { query: string; params: string[] } {\n const trimmed = body.trim();\n const sep = trimmed.indexOf(' / ');\n if (sep === -1) return { query: trimmed, params: [] };\n const query = trimmed.slice(0, sep).trim();\n const params = trimmed\n .slice(sep + 3)\n .split(/\\s+/)\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n return { query, params };\n}\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}\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 /** Raw block body (query + params). */\n body: string;\n /** Malformed fence-suffix reason — renderers badge instead of executing. */\n widgetError?: string;\n /** WQL query after parameter split. */\n query: string;\n /** Positional parameters (literals or `$token` refs). */\n params: 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 const bodyLine =\n section.content\n .split('\\n')\n .map((l) => l.trim())\n .find((l) => l !== '' && !l.startsWith('#')) ?? '';\n const { query, params } = splitWidgetBody(bodyLine);\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: bodyLine,\n query,\n params,\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","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 const tag = trimmed.slice(3).split(/[\\s\\t]/)[0].toLowerCase();\n let widgetType;\n let spanCols;\n let spanFull;\n let widgetError;\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 }\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 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: [totalVolume, totalReps]\n---\n\n## Weekly Trend\nHow does $metric trend week over week?\n\n\\`\\`\\`query:timeseries\nsum:$metric{} rollup:1w\n\\`\\`\\`\n`;\n}\n","/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.6.32';\nexport const GIT_SHA = 'bc13c0f';\nexport const BUILD_TIME = '2026-08-21T20:12:50.453Z';\nexport const SEMVER = {\n version: '0.6.32',\n gitSha: 'bc13c0f',\n buildTime: '2026-08-21T20:12:50.453Z',\n} as const;\n"]}
1
+ {"version":3,"sources":["../src/vocabulary.ts","../src/grammar/wql.parser.ts","../src/grammar/wql.parser.terms.ts","../src/wqlSuffix.ts","../src/wql.ts","../src/disciplines.ts","../src/language.ts","../src/units.ts","../src/derivation.ts","../src/dashboard/frontmatter.ts","../src/static.ts","../src/QueryService.ts","../src/dashboard/model.ts","../src/dashboard/parser.ts","../src/dashboard/scaffold.ts","../src/version.ts"],"names":["LRParser","LRLanguage","styleTags","t","snippetCompletion","syntaxTree","options","autocompletion","HighlightStyle","LanguageSupport","syntaxHighlighting","MetricType"],"mappings":"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","file":"index.cjs","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\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/** Tag keys the Query Service reads off a fact row (QueryService.factTagValue). */\nexport const WQL_TAG_KEYS = [\n 'effort', 'discipline', 'intensity', 'note', 'page', 'origin',\n 'grain', 'metric', 'block', 'result', 'tags',\n] as const;\nexport type WqlTagKey = (typeof WQL_TAG_KEYS)[number];\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'] as const;\nexport type WqlFindTarget = (typeof WQL_FIND_TARGETS)[number];\n\n/** Content query scopes (in <scope>). */\nexport const WQL_SCOPES = ['journal', 'collections', 'feeds', 'all'] as const;\nexport type WqlScope = (typeof WQL_SCOPES)[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 = ['journal', 'collections', 'feeds', 'notes', 'blocks', 'efforts', 'metrics'] as const;\nexport type WqlSource = (typeof WQL_SOURCES)[number];\n\n/** Rollup periods the aggregate grammar accepts (wql.ts: unit d|w only). */\nexport const WQL_ROLLUP_PERIODS = ['1d', '1w'] 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","// 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: \"(jOVQPOOOOQO'#C_'#C_O[QPO'#C^QaQQOOOlQPO,58xOqQPO'#CbO|QPO'#CjO!RQPO'#CmQOQPOOQ!WQPOOQ!]QQOOO!eQQO'#CaOOQO1G.d1G.dOOQO'#Ce'#CeO!vQPO'#CcO!{QPO'#CcOOQO,58|,58|O#QQPO,58|O#YQPO,59UO#bQQO,59XO#gQPO'#CpO#lQQO,58{O#}QPO,58}O$VQPO,58}O$[QPO'#CrO$dQPO1G.hOOQO1G.h1G.hOOQO'#Cl'#ClOOQO1G.p1G.pO$lQPO1G.pO$tQPO1G.sOOQO,59[,59[OOQO-E6n-E6nO$yQPO'#CgO%[QPO'#CgO%jQPO'#CfOOQO1G.i1G.iO#}QPO1G.iOOQO,59^,59^OOQO-E6p-E6pOOQO7+$S7+$SO%uQPO'#CsO%zQPO7+$[OOQO7+$[7+$[O&SQPO7+$_OOQO,59R,59RO&XQPO,59RO#}QPO'#CqO&^QPO,59QOOQO7+$T7+$TOOQO,59_,59_OOQO-E6q-E6qOOQO<<Gv<<GvOOQO<<Gy<<GyO&iQPO1G.mOOQO,59],59]OOQO-E6o-E6oOOQO7+$X7+$X\",\n stateData: \"&w~OjOS~OSPO~OkSO~O_UObVOmTO~OSZO~OS]OW_Op`O~OmbO~OqcO~ObVO~O_UObVO~OldO_TXbTXhTXmTX~OkfO~OS]O~OohOpjO~OSkOplO~OcnO~OSoO~OldO_TabTahTamTa~OSqO]rO~OkuO~OS]OW_O~OohOpxO~OoyOp{O~OS|O~O[}Ok!OOnZXoZXpZX~O[}OnZXoZXpZX~On!POoYXpYX~OSkO~OoyOp!UO~Or!VO~OS!WO~On!POoYapYa~O[!ZOnZioZipZi~O\",\n goto: \"#YhPPilPoruP{!S!YPP!aP!e!kPP!p!v!|#SRRORQOR[SRYRQaTRvhS^ThRg_QtfR!RuSsfuR!X!PTXRYQmbR!SyVWRXYQeZRpeQ!QsR!Y!QQiaRwiQzmR!Tz\",\n nodeNames: \"⚠ Query Head Aggregator Word Metric Filters Filter Negate TagKey TagValue Value Star Quoted GroupBy By Dimension Rollup RollupDot Int\",\n maxTerm: 34,\n skippedNodes: [0],\n repeatNodeCount: 4,\n tokenData: \"'a~RfXY!gYZ!g]^!gpq!gqr!xrs!}xy#lyz#qz{#v|}#{}!O$Q!O!P$f!Q![%c![!]%y!c!}$Q#R#S$Q#T#U$Q#U#V&O#V#o$Q#o#p'Q#p#q'V#q#r'[~!lSj~XY!gYZ!g]^!gpq!g~!}OW~~#QTOr!}rs#as;'S!};'S;=`#f<%lO!}~#fO]~~#iP;=`<%l!}~#qOq~~#vOr~~#{O[~~$QOo~P$VTSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#o$Q~$kPl~#f#g$n~$qP#c#d$t~$wP#`#a$z~$}P#`#a%Q~%TP#i#j%W~%ZP#d#e%^~%cOb~R%jTcQSP}!O$Q!Q![%c!c!}$Q#R#S$Q#T#o$Q~&OOk~R&TVSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#m$Q#m#n&j#n#o$QR&qT_QSP}!O$Q!Q![$Q!c!}$Q#R#S$Q#T#o$Q~'VOm~~'[On~~'aOp~\",\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 Head = 2,\n Aggregator = 3,\n Word = 4,\n Metric = 5,\n Filters = 6,\n Filter = 7,\n Negate = 8,\n TagKey = 9,\n TagValue = 10,\n Value = 11,\n Star = 12,\n Quoted = 13,\n GroupBy = 14,\n By = 15,\n Dimension = 16,\n Rollup = 17,\n RollupDot = 18,\n Int = 19\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>`\n * - Rollup period: `.rollup(<size><unit>)`\n * - Group-by: `by {<dims>}`\n * - Time window: `last <n><unit>`\n * - Scope: `in <scope>`\n */\n\nexport interface ParsedWqlRollupSuffix {\n size: number;\n unit: string;\n raw: string;\n}\n\nexport interface ParsedWqlLastSuffix {\n size: number;\n unit: 'd' | 'w';\n raw: string;\n}\n\nexport interface ParsedWqlSuffixes {\n /** Outer cross-store join clause text (`where ...`). */\n where?: string;\n /** Display unit directive (`in kg`). */\n displayUnit?: string;\n /** Rollup period (`.rollup(1w)`). */\n rollup?: ParsedWqlRollupSuffix;\n /** Group-by dimensions (`by {week, effort}`). */\n groupBy?: string[];\n /** Content time window (`last 8w`). */\n last?: ParsedWqlLastSuffix;\n /** Content scope (`in journal` / `in all`). */\n scope?: 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\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 IN_SCOPE_RE = /\\s+in\\s+(\\w+)\\s*$/;\n\n/**\n * Extract suffixes from a raw WQL query string.\n * Strips outer join (`where`), display unit (`in kg`), rollup (`.rollup(1w)`),\n * group-by (`by {week}`), time window (`last 8w`), and scope (`in journal`).\n */\nexport function parseWqlSuffixes(raw: string): ParsedWqlSuffixes {\n const { primary, where } = splitAtWhere(raw);\n let text = primary.trim();\n\n let displayUnit: string | undefined;\n let rollup: ParsedWqlRollupSuffix | undefined;\n let groupBy: string[] | undefined;\n let last: ParsedWqlLastSuffix | undefined;\n let scope: string | undefined;\n const conflicts: string[] = [];\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 five 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 if (isFind || isRows) {\n // Content find queries strip `last <n><unit>` then `in <scope>`;\n // rows queries (#949) strip `last` plus the aggregation suffixes\n // (surfaced as loud errors downstream — rows never aggregates).\n const lasts = stripRepeated(LAST_RE);\n conflictFrom('window', lasts);\n if (lasts.length) {\n const m = lasts[lasts.length - 1];\n last = { size: parseInt(m[1], 10), unit: m[2].toLowerCase() as 'd' | 'w', raw: m[0].trim() };\n }\n\n if (isFind) {\n const scopes = stripRepeated(IN_SCOPE_RE);\n conflictFrom('scope', scopes);\n if (scopes.length) scope = scopes[scopes.length - 1][1];\n } else {\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 const bys = stripRepeated(BY_RE);\n conflictFrom('by', bys);\n if (bys.length) {\n groupBy = bys[bys.length - 1][1].split(',').map((d) => d.trim()).filter(Boolean);\n }\n }\n } else {\n // Analytics queries strip `in <unit>`, `.rollup(<period>)`, `by {<dims>}`\n const units = stripRepeated(DISPLAY_UNIT_RE);\n conflictFrom('display-unit', units);\n if (units.length) displayUnit = units[units.length - 1][1];\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())\n .filter(Boolean);\n }\n }\n\n return {\n where,\n displayUnit,\n rollup,\n groupBy,\n last,\n scope,\n conflicts: conflicts.length ? conflicts : undefined,\n primaryText: text,\n };\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}.rollup(1w)\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 type WqlAggregator,\n type WqlComparisonOp,\n} from './vocabulary';\nimport { parseWqlSuffixes } from './wqlSuffix';\n\nexport { WQL_AGGREGATORS, WQL_COMPARISON_OPS } 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} in 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 scope?: string;\n last?: { size: number; unit: 'd' | 'w' };\n}\n\nexport interface ParsedQuery {\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 /** 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 error?: string;\n}\n\n/** Result of parsing a content-discovery query (`find:target{filters} in scope`). */\nexport interface ParsedFindQuery {\n raw: string;\n /** Content target: 'note' or 'block'. */\n target: string;\n filters: TagFilter[];\n /** Where to look: journal | collections | feeds | all. */\n scope?: string;\n /** Time window: last 8w, last 4d. */\n last?: { size: number; unit: 'd' | 'w' };\n /** Cross-store metric join (`where sum:totalVolume{} > 5000`). */\n join?: MetricPredicate;\n error?: string;\n}\n\nexport type AnyParsedQuery = ParsedQuery | ParsedFindQuery | ParsedRowsQuery;\n\n/** Type guard: true for content-discovery queries. */\nexport function isFindQuery(parsed: AnyParsedQuery): parsed is ParsedFindQuery {\n return 'target' in parsed;\n}\n\n/** Type guard: true for rows queries. */\nexport function isRowsQuery(parsed: AnyParsedQuery): parsed is ParsedRowsQuery {\n return (parsed as ParsedRowsQuery).family === 'rows';\n}\n\nexport interface SeriesPoint { ts: number; value: number }\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 */\nexport interface ParsedRowsQuery {\n raw: string;\n /** Family discriminator (the other families are told apart by 'target'/'agg'). */\n family: 'rows';\n /** Output-statement type narrowing from the optional target (`rows:segment{…}`); undefined = all types. */\n outputType?: string;\n filters: TagFilter[];\n /** Time window over the workout end time: last 8w, last 4d. */\n last?: { size: number; unit: 'd' | 'w' };\n error?: string;\n}\nexport interface Series { key: string; label: string; points: SeriesPoint[]; unit?: string }\n\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 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; error?: string } {\n if (where.trimStart().startsWith('find:')) {\n const fp = parseFindQuery(where);\n if (fp.error) return { error: fp.error };\n return { find: { target: fp.target, filters: fp.filters, scope: fp.scope, last: fp.last } };\n }\n const m = CMP_RE.exec(where.trim());\n if (!m) return { error: cannotParseJoin(where) };\n const head = parseAnalyticsQuery(m[1].trim());\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 either an analytics ParsedQuery or a content\n * ParsedFindQuery. Dispatch is textual: a leading `find:` routes to the\n * content path, everything else to analytics.\n */\nexport function parseQuery(raw: string): AnyParsedQuery {\n const trimmed = raw.trimStart();\n if (trimmed.startsWith('find:')) {\n return parseFindQuery(raw);\n }\n if (/^rows(?=[:{]|\\s|$)/.test(trimmed)) {\n return parseRowsQuery(raw);\n }\n return parseAnalyticsQuery(raw);\n}\n\n// ── Rows query parsing (#949) ────────────────────────────────────\n\nfunction cannotParseRows(text: string): string {\n return `Cannot parse \"${text}\". Expected rows:{result:…|block:…|note:…} or rows:segment{…} last 8w`;\n}\n\n/**\n * Parse a rows query. The head is JS-split (`rows` / `rows:<outputType>`);\n * the `{filters}` half reuses the shared Lezer filter grammar by wrapping it\n * in a synthetic find head — one filter syntax for all three families.\n */\nfunction parseRowsQuery(raw: string): ParsedRowsQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, last, groupBy, rollup, primaryText } = suffixes;\n const result: ParsedRowsQuery = {\n raw,\n family: 'rows',\n filters: [],\n last: last ? { size: last.size, unit: last.unit } : undefined,\n };\n if (suffixes.conflicts?.length) {\n result.error = suffixes.conflicts.join('; ');\n return result;\n }\n if (whereText || groupBy || rollup) {\n result.error = `Rows queries return raw statements — no where / by / rollup. Got \"${primaryText.trim()}\"`;\n return result;\n }\n\n const text = primaryText.trim();\n const brace = text.indexOf('{');\n const head = (brace === -1 ? text : text.slice(0, brace)).trim();\n const filterText = brace === -1 ? '' : text.slice(brace).trim();\n\n if (head === 'rows' || head === 'rows:') {\n // Bare head (`rows:{…}`) — all output-statement types.\n } else if (head.startsWith('rows:')) {\n const target = head.slice('rows:'.length).trim();\n if (!target || /\\s/.test(target)) {\n result.error = cannotParseRows(text);\n return result;\n }\n result.outputType = target;\n } else {\n result.error = cannotParseRows(text);\n return result;\n }\n\n if (filterText) {\n if (!/^\\{.*\\}$/.test(filterText)) {\n result.error = cannotParseRows(text);\n return result;\n }\n const synthetic = `find:_${filterText}`;\n const tree = wqlParser.parse(synthetic);\n let syntaxError = false;\n tree.iterate({ enter(node) { if (node.type.isError) syntaxError = true; } });\n if (syntaxError) {\n result.error = cannotParseRows(text);\n return result;\n }\n result.filters = extractFilters(tree.topNode, synthetic);\n const grainError = retiredGrainRollup(result.filters);\n if (grainError) { result.error = grainError; return result; }\n }\n return result;\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\nfunction parseAnalyticsQuery(raw: string): ParsedQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, displayUnit, groupBy, rollup, primaryText: text } = suffixes;\n\n const base: ParsedQuery = {\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 };\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 && rollup.unit !== 'd' && rollup.unit !== 'w') {\n base.error = cannotParse(text);\n return base;\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\n // Head — agg:metric. Unknown aggregators are a semantic error, reported\n // exactly like the reference parser (metric left empty).\n const head = query.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n if (!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 base.filters = extractFilters(query, text);\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 // 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 find:target{filters} in scope last 8w`;\n}\n\nfunction parseFindQuery(raw: string): ParsedFindQuery {\n const suffixes = parseWqlSuffixes(raw);\n const { where: whereText, last, scope, primaryText: text } = suffixes;\n const result: ParsedFindQuery = {\n raw,\n target: '',\n filters: [],\n scope,\n last: last ? { size: last.size, unit: last.unit } : undefined,\n };\n if (suffixes.conflicts?.length) {\n result.error = suffixes.conflicts.join('; ');\n return result;\n }\n // Parse structural part: find:target{filters}\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 query = tree.topNode;\n const head = query.getChild(terms.Head);\n const aggNode = head?.getChild(terms.Aggregator);\n const metricNode = head?.getChild(terms.Metric);\n if (!head || !aggNode || !metricNode) {\n result.error = cannotParseFind(text);\n return result;\n }\n\n // The first word must be \"find\" (the dispatch keyword).\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\n result.target = text.slice(metricNode.from, metricNode.to);\n result.filters = extractFilters(query, text);\n const findGrainError = retiredGrainRollup(result.filters);\n if (findGrainError) { result.error = findGrainError; return result; }\n\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 return result;\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, syntaxTree, HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { autocompletion, CompletionContext, CompletionResult, Completion, snippetCompletion } from \"@codemirror/autocomplete\";\nimport type { Extension } from \"@codemirror/state\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\nimport type { SyntaxNode } from \"@lezer/common\";\nimport { parser } from \"./grammar/wql.parser\";\nimport { EFFORT_DISCIPLINES } from \"./disciplines\";\nimport {\n WQL_AGGREGATORS,\n WQL_METRIC_FAMILIES,\n WQL_METRIC_AGGREGATES,\n WQL_TAG_KEYS,\n WQL_VIRTUAL_DIMS,\n WQL_CALC_TARGETS,\n WQL_INTENSITY_TIERS,\n WQL_GRAINS,\n WQL_ROLLUP_PERIODS,\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_SCOPES,\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 Aggregator: t.keyword,\n \"Aggregator/Word\": t.keyword,\n Metric: t.variableName,\n \"Metric/Word\": t.variableName,\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\n/** Nearest ancestor (or self) of `node` with one of `names`. */\nfunction ancestor(node: SyntaxNode | null, ...names: string[]): SyntaxNode | null {\n for (let n = node; n; n = n.parent) {\n if (names.includes(n.name)) return n;\n }\n return null;\n}\n\nfunction options(labels: readonly (string | Completion)[]): Completion[] {\n return labels.map((label) => (typeof label === 'string' ? { label } : label));\n}\n\nexport function wqlCompletionSource(options_: WqlCompletionOptions = {}) {\n const { effortNames } = options_;\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 const tagValueOptions = (key: string): 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 default: return null; // note/page/block/result/tags — free-form\n }\n };\n\n function source(context: CompletionContext): CompletionResult | null {\n const word = context.matchBefore(/[\\w.*-]*/)!;\n if (!word || (word.from === word.to && !context.explicit)) return null;\n const tree = syntaxTree(context.state);\n const node = tree.resolveInner(context.pos, -1);\n\n // Inside a Filter: before the colon → tag keys; after → values for that key.\n const filter = ancestor(node, 'Filter');\n if (filter) {\n const filterText = context.state.sliceDoc(filter.from, context.pos);\n const colonIndex = filterText.indexOf(':');\n if (colonIndex === -1) {\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n return { from: keyWord.from, options: options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })), validFor: /^[\\w-]*$/ };\n }\n const key = filterText.slice(0, colonIndex).replace(/^!/, '').trim();\n const valueOptions = tagValueOptions(key);\n if (!valueOptions) return null;\n return { from: word.from, options: valueOptions, validFor: /^[\\w*-]*$/ };\n }\n\n // Inside Filters braces but not in a parsed Filter yet (e.g. `{` + cursor).\n if (ancestor(node, 'Filters')) {\n const keyWord = context.matchBefore(/[\\w-]*/)!;\n return { from: keyWord.from, options: options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })), validFor: /^[\\w-]*$/ };\n }\n\n // Inside GroupBy: virtual dims + tag keys.\n if (ancestor(node, 'GroupBy')) {\n const dimWord = context.matchBefore(/[\\w-]*/)!;\n return {\n from: dimWord.from,\n options: [\n ...options(WQL_VIRTUAL_DIMS).map((c) => ({ ...c, type: 'atom' })),\n ...options(WQL_TAG_KEYS).map((c) => ({ ...c, type: 'property' })),\n ],\n validFor: /^[\\w-]*$/,\n };\n }\n\n // Head-relative positions. The top node's Head child tells whether the\n // query already has a complete head; node ancestry tells whether the\n // cursor sits inside it.\n const head = tree.topNode.getChild('Head');\n const insideHead = ancestor(node, 'Head') !== null;\n const inMetric = node.name === 'Metric' || (node.name === 'Word' && node.parent?.name === 'Metric');\n\n if (inMetric) {\n return { from: word.from, options: metricOptions(), validFor: /^[\\w.-]*$/ };\n }\n\n if (insideHead && head) {\n // Inside the head: before the colon → aggregators, after → metrics\n // (the error-tolerant tree may not have grown a Metric yet).\n const afterColon = context.state.sliceDoc(head.from, context.pos).includes(':');\n // The error-tolerant parser absorbs a space-separated word after the\n // metric into the Metric node — whitespace after the metric's first\n // word means the user is typing past it (`sum:tis by …`).\n const metricWord = head.getChild('Metric')?.getChild('Word');\n const typedPastMetric = metricWord !== null && metricWord !== undefined\n && /\\s/.test(context.state.sliceDoc(metricWord.to, context.pos));\n if (afterColon && !typedPastMetric) {\n return { from: word.from, options: metricOptions(), validFor: /^[\\w.-]*$/ };\n }\n if (!afterColon) {\n return { from: word.from, options: options(WQL_AGGREGATORS).map((c) => ({ ...c, type: 'keyword' })), validFor: /^[\\w-]*$/ };\n }\n }\n\n // Inside .rollup(…): period sizes.\n if (ancestor(node, 'Rollup')) {\n return {\n from: word.from,\n options: options(WQL_ROLLUP_PERIODS).map((c) => ({ ...c, type: 'constant' })),\n validFor: /^[\\w]*$/,\n };\n }\n\n // Query start — no head yet → aggregators. Past a complete head →\n // structural suffixes.\n if (!head) {\n return { from: word.from, options: options(WQL_AGGREGATORS).map((c) => ({ ...c, type: 'keyword' })), validFor: /^[\\w-]*$/ };\n }\n\n // Top level after the head: structural suffixes.\n return {\n from: word.from,\n options: [\n snippetCompletion('by {${dimension}}', { label: 'by {}', detail: 'group by dimensions', type: 'keyword' }),\n snippetCompletion('.rollup(${1}${d|w})', { label: '.rollup()', detail: 'bucket period', type: 'keyword' }),\n ],\n validFor: /^[\\w.-]*$/,\n };\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 * Analytics unit conversion seam — narrow, fake-free, pure.\n *\n * Supports exactly the unit families analytics currently needs:\n * - mass: kg ↔ lb (exact 0.45359237 kg per lb)\n * - distance: m ↔ km\n *\n * Any unknown or incompatible units pass through unchanged.\n */\n\nexport const KG_PER_LB = 0.45359237;\n\nexport type UnitFamily = 'mass' | 'distance';\n\nexport interface UnitFamilyDef {\n /** Base unit for the family (used for documentation, not conversion). */\n base: string;\n /** Factor to convert FROM this unit TO the base unit. */\n units: Record<string, number>;\n}\n\nexport const UNIT_FAMILIES: Record<UnitFamily, UnitFamilyDef> = {\n mass: {\n base: 'kg',\n units: {\n kg: 1,\n lb: KG_PER_LB,\n },\n },\n distance: {\n base: 'm',\n units: {\n m: 1,\n km: 1000,\n },\n },\n};\n\nexport function getUnitFamily(unit: string | undefined): UnitFamily | undefined {\n if (!unit) return undefined;\n for (const [family, def] of Object.entries(UNIT_FAMILIES) as [UnitFamily, UnitFamilyDef][]) {\n if (def.units[unit] !== undefined) return family;\n }\n return undefined;\n}\n\n/**\n * Convert a value between known units.\n *\n * Returns the input unchanged when:\n * - from === to\n * - either unit is unknown\n * - the units belong to different families\n */\nexport function convert(value: number, from: string | undefined, to: string | undefined): number {\n if (from === to || from === undefined || to === undefined) return value;\n const family = getUnitFamily(from);\n if (!family || family !== getUnitFamily(to)) return value;\n const def = UNIT_FAMILIES[family];\n const fromFactor = def.units[from];\n const toFactor = def.units[to];\n if (fromFactor === undefined || toFactor === undefined) return value;\n return (value * fromFactor) / toFactor;\n}\n\n/**\n * Determine the target display unit for a set of matched facts and query\n * options. Returns the unit to render and whether values should be converted.\n */\nexport function resolveDisplayUnit(\n facts: ReadonlyArray<{ unit?: string; metricUnit?: string }>,\n {\n directive,\n preferred,\n }: { directive?: string; preferred?: string },\n): { unit?: string; convert: boolean } {\n const sourceUnits = facts\n .map((row) => row.unit ?? row.metricUnit)\n .filter((u): u is string => Boolean(u));\n const firstSource = sourceUnits[0];\n\n if (directive) {\n const directiveFamily = getUnitFamily(directive);\n const applicable =\n directiveFamily !== undefined &&\n sourceUnits.some((u) => getUnitFamily(u) === directiveFamily);\n return { unit: directive, convert: applicable };\n }\n\n if (preferred) {\n const preferredFamily = getUnitFamily(preferred);\n if (\n preferredFamily &&\n sourceUnits.some((u) => getUnitFamily(u) === preferredFamily)\n ) {\n return { unit: preferred, convert: true };\n }\n }\n\n return { unit: firstSource, convert: false };\n}\n","/**\n * Workout derivation helpers for WQL QueryService and cross-store joins.\n */\n\nimport {\n MetricType,\n type AnalyticsDataPoint,\n type ResultOrigin,\n type StoredOutputStatement,\n type UnifiedEventRecord,\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 /** FK to NoteSegment.id (positional section id of the block run). */\n segmentId?: string;\n /** NoteSegment.version at record time. */\n segmentVersion?: 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/** 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 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 // Composed calcs carry their Canonical Metric Key explicitly (#878);\n // legacy projections fall back to name-derived keys during cutover.\n const metricKey = metadataString(value.metadata, 'canonicalKey') ?? 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 const rowKey = 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 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 segmentId: identity.segmentId ?? '',\n segmentVersion: identity.segmentVersion ?? 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 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 { metadata?: Record<string, unknown> }[];\n for (const m of loose) {\n const slug = metadataString(m.metadata, 'effortSlug');\n if (slug) return slug;\n }\n return undefined;\n}\n\n/**\n * Logs → event rows, 1:1 per statement (ticket 002). Deterministic ids\n * `${resultId}:${seq}`; canonical workout time wins over the statement's own\n * timeSpan; query-critical scalars promoted top-level.\n */\nexport function toEventRows(\n logs: readonly StoredOutputStatement[],\n identity: SummaryFactIdentity,\n): UnifiedEventRecord[] {\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: identity.workoutTimestamp ?? output.timeSpan?.started ?? 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 sourceBlockKey: output.sourceBlockKey,\n stackLevel: output.stackLevel,\n completionReason: output.completionReason,\n segmentId: identity.segmentId,\n segmentVersion: identity.segmentVersion,\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): UnifiedEventRecord[] {\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 timestamp: identity.workoutTimestamp ?? f.started ?? now,\n grain: 'summary' as const,\n outputType: 'analytics',\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.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 segmentId: identity.segmentId,\n segmentVersion: identity.segmentVersion,\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: UnifiedEventRecord): 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 const metricKey = metadataString(m.metadata, 'canonicalKey') ?? (m.type ?? '');\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 segmentId: record.segmentId ?? '',\n segmentVersion: record.segmentVersion ?? 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 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 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 facts: AnalyticsDataPoint[] = [];\n metrics.forEach((m) => {\n if (m.type === MetricType.Label || typeof m.value !== 'number') return;\n const metricKey = metadataString(m.metadata, 'canonicalKey')\n ?? (labelName ? resolveCanonicalMetricKey(labelName) : (m.type ?? 'metric'));\n const ordinal = facts.length;\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 segmentId: record.segmentId ?? '',\n segmentVersion: record.segmentVersion ?? 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 effortSlug: metadataString(m.metadata, 'effortSlug') ?? record.effortSlug,\n intensityTier: metadataString(m.metadata, 'effortIntensityTier'),\n grade: metadataString(m.metadata, 'grade'),\n timestamp: record.timestamp,\n createdAt: record.timestamp,\n });\n });\n return facts;\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 type { BlockIndexRow, Note } from '@bitcobblers/wod-wiki-core';\nimport { extractFrontmatterTags } from './dashboard/frontmatter';\n\n/**\n * Pure projection of a block_index into static Notes — one Note per distinct\n * noteId, with a `catalog` field set to `noteId.split('/')[0]`. The catalog is\n * the directory the file lives under (e.g. `crossfit-girls` for collections,\n * `crossfit-programming` for feeds) and is what the Library's panel uses to\n * target the `+ Filter → Catalog` menu.\n */\nexport function staticNotesFromBlocks(blocks: BlockIndexRow[]): Note[] {\n const map = new Map<string, Note>();\n for (const block of blocks) {\n if (!map.has(block.noteId)) {\n map.set(block.noteId, {\n id: block.noteId,\n title: block.noteTitle,\n createdAt: block.createdAt,\n type: 'note',\n sourceId: block.sourceId,\n catalog: (block.noteId.startsWith('feeds/') ? block.noteId.slice('feeds/'.length) : block.noteId).split('/')[0],\n });\n }\n }\n return Array.from(map.values());\n}\n\n/**\n * Tag → noteIds index over a block index's frontmatter rows. Static-corpus\n * notes declare tags only in frontmatter `tags:`; this recovers the mapping\n * the note store needs to answer `tags:` clauses (issue #853 — the store\n * previously returned an empty set for every tag).\n */\nexport function staticTagIndexFromBlocks(blocks: BlockIndexRow[]): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const block of blocks) {\n if (block.dataType !== 'frontmatter') continue;\n for (const tag of extractFrontmatterTags(block.rawContent)) {\n const ids = index.get(tag);\n if (ids) ids.add(block.noteId);\n else index.set(tag, new Set([block.noteId]));\n }\n }\n return index;\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, UnifiedEventRecord } from '@bitcobblers/wod-wiki-core';\nimport {\n parseQuery,\n isFindQuery,\n isRowsQuery,\n type Aggregator,\n type ComparisonOp,\n type ParsedQuery,\n type ParsedFindQuery,\n type ParsedRowsQuery,\n type FindPredicate,\n type MetricPredicate,\n type Series,\n type SeriesPoint,\n type TagFilter,\n} from './wql';\nimport { convert, resolveDisplayUnit } from './units';\nimport { projectEventToFacts } from './derivation';\nimport type {\n UnifiedEventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n} from './stores';\n\nexport type {\n UnifiedEventStore,\n NoteQueryStore,\n BlockQueryStore,\n EffortQueryStore,\n IEffort,\n QueryServiceStores,\n};\n\nconst DAY = 86_400_000;\n\nfunction localDateString(ts: number): string {\n return new Date(ts).toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\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`. */\nfunction catalogOfItem(item: { id?: string; noteId?: string; sourceId?: string; catalog?: string }): string | undefined {\n if (item.catalog) return item.catalog;\n const raw = item.sourceId ? item.sourceId.replace(/^(collection|feed):/, '') : (item.noteId || item.id || '');\n if (!raw) return undefined;\n const clean = raw.startsWith('feeds/') ? raw.slice('feeds/'.length) : raw;\n return clean.split('/')[0];\n}\n\n/** Match a single sourceId against one filter value. The `journal` kind matches\n * rows with no sourceId prefix; the `collection` / `feed` kinds match rows whose\n * sourceId starts with the kind. A `kind:id` literal matches the exact id. */\nfunction sourceMatches(sourceId: string | undefined, kind: string): boolean {\n if (kind === 'journal') return !sourceId || sourceId === 'journal';\n if (kind === 'collection' || kind === 'feed') {\n return !!sourceId && sourceId.startsWith(`${kind}:`);\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 }>(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.sourceId, w));\n return filter.negate ? !match : match;\n });\n }\n return items;\n}\n\n/** Time-window predicate for a row, given the parsed WQL's `last` clause and\n * the optional explicit `range` parameter. The range overrides `last`; when\n * neither is set, the row passes. */\nfunction effectiveTimeWindow(\n createdAt: number,\n last: { size: number; unit: 'd' | 'w' } | undefined,\n range: { start: number; end: number } | undefined,\n anchorNow?: number,\n): boolean {\n if (range) return createdAt >= range.start && createdAt <= range.end;\n if (last) {\n const cutoff = (anchorNow ?? Date.now()) - last.size * (last.unit === 'w' ? 7 : 1) * DAY;\n return createdAt >= cutoff;\n }\n return true;\n}\n\n/** Newest `createdAt` in a scope-selected set — the `'latest-activity'`\n * window anchor (#857). Undated rows (0) never win; an all-undated set\n * anchors at 0, which lets every row pass (no dated activity to window\n * against). Computed over the scope selection, before filters: the anchor\n * is the index's latest activity, not the filtered subset's. */\nfunction latestActivity(rows: ReadonlyArray<{ createdAt: number }>): number {\n let max = 0;\n for (const r of rows) if (r.createdAt > max) max = r.createdAt;\n return max;\n}\n\n/** Resolve the window anchor timestamp for a find run, per FindOptions. */\nfunction windowAnchor<T extends { createdAt: number }>(\n selected: T[],\n parsed: ParsedFindQuery,\n options: FindOptions,\n): number | undefined {\n if (options.anchorNow !== undefined) return options.anchorNow;\n if (options.anchor === 'latest-activity' && parsed.last) return latestActivity(selected);\n return undefined;\n}\n\nconst defaultEventStore: UnifiedEventStore = {\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 find:effort queries. */\n efforts?: IEffort[];\n stages: { selected: number; matched: number };\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}\n\n/** Options for `runFind` / `runFindBlock` — overrides for the parsed WQL. */\nexport interface FindOptions {\n /** Explicit timestamp range; overrides parsed WQL's `last` clause when set. */\n range?: { start: number; end: number };\n /** Time-window anchoring mode. 'wall-clock' anchors to Date.now();\n * 'latest-activity' anchors to the newest row in the scope selection\n * (#857). Defaults to 'wall-clock'. */\n anchor?: 'wall-clock' | 'latest-activity';\n /** Explicit reference time for the window (useful for tests/replay).\n * Overrides `anchor`. */\n anchorNow?: number;\n}\n\nexport interface QueryResult {\n parsed: ParsedQuery;\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}\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: UnifiedEventRecord[];\n}\n\nexport interface RowsQueryResult {\n parsed: ParsedRowsQuery;\n runs: RowsRun[];\n error?: string;\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 'grade': return row.grade;\n case 'intensity': return row.intensityTier;\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: return undefined;\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 = group.some((f) =>\n f.values.some((a) =>\n rowValues.some((v) => (a.wildcard ? v.startsWith(a.value) : v === a.value)),\n ),\n );\n return negate ? !hit : hit;\n });\n}\n\n/** Dimension value for grouping; virtual time dims bucket the canonical time. */\nfunction dimValue(row: AnalyticsDataPoint, dim: string, noteTags: ReadonlyMap<string, readonly string[]>): string {\n if (dim === 'day') return localDateString(row.timestamp);\n if (dim === 'week') {\n const d = new Date(row.timestamp);\n const monday = new Date(row.timestamp - ((d.getDay() + 6) % 7) * DAY);\n return `w/${monday.toISOString().slice(5, 10)}`;\n }\n if (dim === 'session') return row.resultId;\n const raw = factTagValue(row, dim, noteTags);\n if (raw === undefined) return '(none)';\n if (typeof raw === 'string') return raw;\n return raw.length ? raw.join(',') : '(none)';\n}\n\n/** Convert a single fact value to the target display unit, if known. */\nfunction toDisplayValue(value: number, unit: string | undefined, targetUnit: string | undefined): number {\n if (!targetUnit || unit === targetUnit) return value;\n return convert(value, unit, targetUnit);\n}\n\n/** Aggregate values already converted to the target display unit. */\nfunction aggregate(values: number[], agg: Aggregator, points: AnalyticsDataPoint[], targetUnit: string | undefined): number {\n if (agg === 'count') return points.length;\n if (values.length === 0) return 0;\n switch (agg) {\n case 'sum': return values.reduce((a, b) => a + b, 0);\n case 'avg': return values.reduce((a, b) => a + b, 0) / values.length;\n case 'min': return Math.min(...values);\n case 'max': return Math.max(...values);\n case 'last': {\n const latest = [...points].sort((a, b) => b.timestamp - a.timestamp)[0];\n return toDisplayValue(latest.value as number, latest.unit ?? latest.metricUnit, targetUnit);\n }\n case 'delta': return values[values.length - 1] - values[0];\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\nexport class QueryService {\n private readonly store: UnifiedEventStore;\n private readonly noteStore: NoteQueryStore;\n private readonly blockStore: BlockQueryStore;\n private readonly effortStore: EffortQueryStore;\n private readonly staticNoteStore?: NoteQueryStore;\n private readonly staticBlockStore?: BlockQueryStore;\n\n constructor(\n storesOrEventStore?: QueryServiceStores | UnifiedEventStore,\n noteStore?: NoteQueryStore,\n blockStore?: BlockQueryStore,\n effortStore?: EffortQueryStore,\n staticNoteStore?: NoteQueryStore,\n staticBlockStore?: BlockQueryStore,\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 'staticNoteStore' in storesOrEventStore ||\n 'staticBlockStore' 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.staticNoteStore = stores.staticNoteStore;\n this.staticBlockStore = stores.staticBlockStore;\n } else {\n this.store = (storesOrEventStore as UnifiedEventStore | undefined) ?? defaultEventStore;\n this.noteStore = noteStore ?? defaultNoteStore;\n this.blockStore = blockStore ?? defaultBlockStore;\n this.effortStore = effortStore ?? defaultEffortStore;\n this.staticNoteStore = staticNoteStore;\n this.staticBlockStore = staticBlockStore;\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 (isFindQuery(parsed)) {\n return {\n parsed: { raw, agg: 'count', metric: parsed.target, filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n }\n if (isRowsQuery(parsed)) {\n return {\n parsed: { raw, agg: 'count', metric: 'rows', filters: [], groupBy: [] },\n series: [], stages: { selected: 0, buckets: 0, aggregated: 0, groups: 0 }, matched: [],\n };\n }\n return this.run(parsed, options);\n }\n\n /**\n * Execute a rows query (rows:{…}, #949) — the session results table plane.\n * Reads event rows directly over the unified store (ticket 003): no\n * WorkoutResult blob parsing; outputType narrowing hits the promoted column.\n */\n async runRows(parsed: ParsedRowsQuery, options: { anchorNow?: number } = {}): Promise<RowsQueryResult> {\n const empty: RowsQueryResult = { parsed, runs: [] };\n if (parsed.error) return { ...empty, error: parsed.error };\n\n const ROWS_SCOPE_KEYS = new Set(['result', 'block', 'note']);\n const unsupported = parsed.filters.filter(\n (f) => !ROWS_SCOPE_KEYS.has(f.key) || f.negate || f.values.some((v) => v.wildcard),\n );\n if (unsupported.length > 0) {\n return {\n ...empty,\n error: `Unsupported rows filter(s): ${unsupported.map((f) => (f.negate ? '!' : '') + f.key).join(', ')}. Rows queries support exact result:, block:, note: values.`,\n };\n }\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 if (resultIds.length + blockIds.length + noteIds.length === 0) {\n return { ...empty, error: 'Rows query needs a scope: result:, block:, or note:.' };\n }\n\n // Scope → event rows, grouped per result (insertion order = first seen).\n const byResult = new Map<string, UnifiedEventRecord[]>();\n const collect = (rows: UnifiedEventRecord[]) => {\n for (const row of rows) {\n const bucket = byResult.get(row.resultId);\n if (bucket) bucket.push(row);\n else byResult.set(row.resultId, [row]);\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 let groups = [...byResult.entries()].filter(([, rows]) => rows.length > 0);\n if (parsed.last) {\n groups = groups.filter(([, rows]) =>\n effectiveTimeWindow(rows[0].timestamp, parsed.last, undefined, options.anchorNow),\n );\n }\n groups.sort((a, b) => b[1][0].timestamp - a[1][0].timestamp);\n\n const runs = groups\n .map(([resultId, rows]) => ({\n resultId,\n noteId: rows[0].noteId,\n timestamp: rows[0].timestamp,\n events: parsed.outputType\n ? rows.filter((row) => row.outputType === parsed.outputType)\n : rows,\n }))\n .filter((run) => run.events.length > 0);\n return { parsed, runs };\n }\n\n /**\n * Execute a content-discovery query (find: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\n if (parsed.target === 'block') {\n return this.runFindBlock(parsed, options);\n }\n if (parsed.target === 'effort') {\n return this.runFindEffort(parsed);\n }\n let notes: Note[] = [];\n const scope = parsed.scope || 'journal';\n if (scope === 'journal' || scope === 'all') {\n notes = notes.concat(await this.noteStore.getAllNotes());\n }\n if (scope === 'collections' || scope === 'feeds' || scope === 'all') {\n let sNotes = this.staticNoteStore ? await this.staticNoteStore.getAllNotes() : [];\n if (scope === 'collections') sNotes = sNotes.filter(n => n.sourceId?.startsWith('collection:'));\n if (scope === 'feeds') sNotes = sNotes.filter(n => n.sourceId?.startsWith('feed:'));\n notes = notes.concat(sNotes);\n }\n const selectedCount = notes.length;\n const anchorNow = windowAnchor(notes, parsed, options);\n notes = applySourceFilter(notes, parsed.filters);\n\n // Tag filters — intersect note IDs across OR'd values within a key.\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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n ids.forEach(id => matchingIds.add(id));\n sIds.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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n notes = notes.filter(n => !ids.has(n.id) && !sIds.has(n.id));\n }\n }\n }\n\n // Text filter — substring on title\n for (const filter of parsed.filters) {\n if (filter.key === 'text' && !filter.negate) {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n notes = notes.filter(n => n.title.toLowerCase().includes(search));\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 // 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 // Time window — the `range` parameter overrides the WQL's `last` clause.\n if (parsed.last || options.range) {\n notes = notes.filter(n => effectiveTimeWindow(n.createdAt, parsed.last, options.range, anchorNow));\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 return { parsed, notes, blocks: [], stages: { selected: selectedCount, matched: notes.length } };\n }\n\n /**\n * Execute a find:block query against the derived block_index store.\n */\n async runFindBlock(parsed: ParsedFindQuery, options: FindOptions = {}): Promise<FindQueryResult> {\n let blocks: BlockIndexRow[] = [];\n const scope = parsed.scope || 'journal';\n if (scope === 'journal' || scope === 'all') {\n blocks = blocks.concat(await this.blockStore.getAllBlocks());\n }\n if (scope === 'collections' || scope === 'feeds' || scope === 'all') {\n let sBlocks = this.staticBlockStore ? await this.staticBlockStore.getAllBlocks() : [];\n if (scope === 'collections') sBlocks = sBlocks.filter(b => b.sourceId?.startsWith('collection:'));\n if (scope === 'feeds') sBlocks = sBlocks.filter(b => b.sourceId?.startsWith('feed:'));\n blocks = blocks.concat(sBlocks);\n }\n const selectedCount = blocks.length;\n const anchorNow = windowAnchor(blocks, parsed, options);\n blocks = applySourceFilter(blocks, parsed.filters);\n\n // Text filter — substring on rawContent\n for (const filter of parsed.filters) {\n if (filter.key === 'text' && !filter.negate) {\n const search = filter.values.map(v => v.value).join(' ').toLowerCase();\n blocks = blocks.filter(b => b.rawContent.toLowerCase().includes(search));\n }\n }\n\n // Type filter — dataType (wod, prose, 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 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 const sIds = this.staticNoteStore ? await this.staticNoteStore.getNoteIdsForTag(v.value) : new Set<string>();\n ids.forEach(id => matchingNoteIds.add(id));\n sIds.forEach(id => matchingNoteIds.add(id));\n }\n blocks = blocks.filter(b => matchingNoteIds.has(b.noteId));\n }\n }\n\n // Time window\n if (parsed.last || options.range) {\n blocks = blocks.filter(b => effectiveTimeWindow(b.createdAt, parsed.last, options.range, anchorNow));\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 return { parsed, notes: [], blocks, stages: { selected: selectedCount, matched: blocks.length } };\n }\n\n /**\n * Execute a find: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 return { parsed, notes: [], blocks: [], efforts, stages: { selected: selectedCount, matched: efforts.length } };\n }\n\n async run(parsed: ParsedQuery, options: QueryOptions = {}): Promise<QueryResult> {\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 // (the dashboard default) fetches through by-timestamp, the one proven\n // culling index; all-time queries scan. by-metric is never used —\n // ticket 001 measured it non-selective and slower than scanning.\n const windowed = options.rangeStart !== undefined || options.rangeEnd !== undefined;\n const start = options.rangeStart ?? 0;\n const end = options.rangeEnd ?? Number.MAX_SAFE_INTEGER;\n const eventRows = windowed\n ? await this.store.getEventsByTimeRange(start, end)\n : await this.store.scanAll();\n const candidates = eventRows\n .flatMap(projectEventToFacts)\n .filter(row => row.metricKey === parsed.metric);\n\n const touchesTags =\n parsed.filters.some(f => f.key === 'tags') || parsed.groupBy.includes('tags');\n const noteTags = await this.loadNoteTags(candidates, touchesTags);\n const matched = this.applyEffortScope(\n candidates.filter(row => matchesFilters(row, parsed.filters, noteTags)), parsed,\n );\n\n return this.buildResult(matched, parsed, options, noteTags);\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: ParsedQuery,\n options: QueryOptions,\n noteTags: ReadonlyMap<string, readonly string[]>,\n ): QueryResult {\n // Stage 2: BUCKET\n const timeDim = parsed.groupBy.find((d) => d === 'day' || d === 'week');\n const tagDims = parsed.groupBy.filter((d) => d !== 'day' && d !== 'week');\n const bucketMs = timeDim\n ? (timeDim === 'week' ? 7 : 1) * DAY\n : parsed.rollup\n ? parsed.rollup.size * (parsed.rollup.unit === 'w' ? 7 : 1) * DAY\n : null;\n const bucketKey = (ts: number) => (bucketMs ? Math.floor(ts / bucketMs) : 0);\n const bucketCount = bucketMs\n ? new Set(matched.map((p) => bucketKey(p.timestamp))).size\n : (matched.length ? 1 : 0);\n\n // Unit display preference / directive\n const { unit: targetUnit, convert: shouldConvert } = resolveDisplayUnit(matched, {\n directive: parsed.displayUnit,\n preferred: options.preferredUnit,\n });\n\n // Stage 3+4: GROUP + AGGREGATE per bucket\n const groups = new Map<string, AnalyticsDataPoint[]>();\n for (const row of matched) {\n const key = tagDims.length\n ? tagDims.map((d) => dimValue(row, d, noteTags)).join(' · ')\n : parsed.metric;\n const bucket = groups.get(key);\n if (bucket) bucket.push(row);\n else groups.set(key, [row]);\n }\n\n const series: Series[] = [...groups.entries()].map(([key, rows]) => {\n const byBucket = new Map<number, AnalyticsDataPoint[]>();\n for (const row of rows) {\n const b = bucketKey(row.timestamp);\n const members = byBucket.get(b);\n if (members) members.push(row);\n else byBucket.set(b, [row]);\n }\n const points: SeriesPoint[] = [...byBucket.entries()]\n .sort(([a], [b]) => a - b)\n .map(([b, members]) => {\n const values = members.map((m) =>\n toDisplayValue(m.value as number, m.unit ?? m.metricUnit, shouldConvert ? targetUnit : undefined),\n );\n return {\n ts: bucketMs ? b * bucketMs + bucketMs / 2 : Math.min(...members.map((m) => m.timestamp)),\n value: Math.round(aggregate(values, parsed.agg, members, shouldConvert ? targetUnit : undefined) * 100) / 100,\n };\n });\n const seriesUnit = shouldConvert\n ? targetUnit\n : (rows[0]?.unit ?? rows[0]?.metricUnit);\n return { key, label: key, points, unit: seriesUnit };\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\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 };\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: ParsedQuery, 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 raw: '', target: join.target, filters: join.filters, scope: join.scope, last: join.last,\n });\n const contentIds = await this.contentIdsFromFindResult(findResult);\n if (contentIds.size === 0) return empty;\n\n let facts = await this.deriveMetricFacts(contentIds, parsed.metric);\n if (facts.length === 0) return empty;\n if (options.rangeStart !== undefined || options.rangeEnd !== undefined) {\n const start = options.rangeStart ?? 0;\n const end = options.rangeEnd ?? Number.MAX_SAFE_INTEGER;\n facts = facts.filter(f => f.timestamp >= start && f.timestamp <= end);\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 = this.applyEffortScope(\n facts.filter(f => matchesFilters(f, parsed.filters, noteTags)), parsed,\n );\n\n return this.buildResult(matched, parsed, options, noteTags);\n }\n\n /** Direction 1 — keep only content owning a wod block whose raw-log metric\n * aggregate satisfies the predicate. `notes` for find:note, `blocks` for\n * find: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 // find: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 // find: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 = await this.deriveMetricFacts(contentIds, join.metric);\n const noteTags = await this.loadNoteTags(facts, join.filters.some(f => f.key === 'tags'));\n const filtered = this.applyEffortScope(\n facts.filter(f => matchesFilters(f, join.filters, noteTags)),\n { filters: join.filters, groupBy: [] },\n );\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 if (compareOp(aggregate(values, join.agg, rows, undefined), join.operator, join.threshold)) passing.add(cid);\n }\n return passing;\n }\n\n /** Filter per-effort vs un-attributed overall summary rows to avoid\n * double-counting. */\n private applyEffortScope(matched: AnalyticsDataPoint[], scope: { filters: TagFilter[]; groupBy: string[] }): AnalyticsDataPoint[] {\n if (scope.groupBy.includes('effort') || scope.filters.some(f => f.key === 'effort')) {\n return matched.some(r => r.effortSlug !== undefined)\n ? matched.filter(r => r.effortSlug !== undefined)\n : matched;\n }\n return matched.some(r => r.effortSlug === undefined)\n ? matched.filter(r => r.effortSlug === undefined)\n : matched;\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 return rows\n .flat()\n .filter((row) => row.grain === 'summary')\n .flatMap(projectEventToFacts)\n .filter((f) => f.metricKey === metricKey);\n }\n\n /** All content blocks across the journal + static corpus. */\n private async allContentBlocks(): Promise<BlockIndexRow[]> {\n const blocks = await this.blockStore.getAllBlocks();\n const staticBlocks = this.staticBlockStore ? await this.staticBlockStore.getAllBlocks() : [];\n return blocks.concat(staticBlocks);\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'. */\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 await Promise.all(noteIds.map(async (id) => noteTags.set(id, await this.noteStore.getNoteTagLabels(id))));\n return noteTags;\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 * is one line: WQL query + optional `/`-separated positional params.\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 'value',\n 'timeseries',\n 'bar',\n 'toplist',\n 'stacked-bar',\n 'goal-rings',\n 'zone-distribution',\n] as const;\n\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 /** 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 === '') return { type: '', error: 'missing widget type after \"query:\"' };\n\n let rest = suffix.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, 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, error: `malformed widget suffix \"${suffix}\"` };\n }\n if (spanCols != null && (spanCols < 1 || spanCols > DASHBOARD_GRID_MAX_COLS)) {\n return { type: rest, spanCols, spanFull, error: `span ${spanCols} outside 1..${DASHBOARD_GRID_MAX_COLS}` };\n }\n return { type: rest, spanCols, spanFull };\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/**\n * Split a block body into the WQL query and its trailing `/`-separated\n * positional parameters (decision #899-7). Splits at the FIRST ` / ` so\n * params stay trailing; a literal ` / ` inside a tag value is pathological\n * and unsupported. Params are whitespace-split literals or `$token` refs.\n */\nexport function splitWidgetBody(body: string): { query: string; params: string[] } {\n const trimmed = body.trim();\n const sep = trimmed.indexOf(' / ');\n if (sep === -1) return { query: trimmed, params: [] };\n const query = trimmed.slice(0, sep).trim();\n const params = trimmed\n .slice(sep + 3)\n .split(/\\s+/)\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n return { query, params };\n}\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}\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 /** Raw block body (query + params). */\n body: string;\n /** Malformed fence-suffix reason — renderers badge instead of executing. */\n widgetError?: string;\n /** WQL query after parameter split. */\n query: string;\n /** Positional parameters (literals or `$token` refs). */\n params: 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 const bodyLine =\n section.content\n .split('\\n')\n .map((l) => l.trim())\n .find((l) => l !== '' && !l.startsWith('#')) ?? '';\n const { query, params } = splitWidgetBody(bodyLine);\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: bodyLine,\n query,\n params,\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","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 const tag = trimmed.slice(3).split(/[\\s\\t]/)[0].toLowerCase();\n let widgetType;\n let spanCols;\n let spanFull;\n let widgetError;\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 }\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 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: [totalVolume, totalReps]\n---\n\n## Weekly Trend\nHow does $metric trend week over week?\n\n\\`\\`\\`query:timeseries\nsum:$metric{} rollup:1w\n\\`\\`\\`\n`;\n}\n","/**\n * Auto-generated build version metadata.\n * Do not edit directly; updated by scripts/stamp-version.ts\n */\nexport const VERSION = '0.7.37';\nexport const GIT_SHA = '713c593';\nexport const BUILD_TIME = '2026-08-25T00:18:25.714Z';\nexport const SEMVER = {\n version: '0.7.37',\n gitSha: '713c593',\n buildTime: '2026-08-25T00:18:25.714Z',\n} as const;\n"]}