@bitcobblers/wod-wiki-wql 0.45.2167 → 0.47.2169

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.
package/dist/index.cjs CHANGED
@@ -31,7 +31,7 @@ var WQL_TAG_KEYS = [
31
31
  "result",
32
32
  "tags"
33
33
  ];
34
- var WQL_CONTENT_ONLY_KEYS = ["type", "text", "source", "notebook", "contributes"];
34
+ var WQL_CONTENT_ONLY_KEYS = ["type", "text", "source", "notebook", "contributes", "feed", "subscribed"];
35
35
  var WQL_EFFORT_FILTER_KEYS = ["effort", "discipline", "intensity", "origin", "text"];
36
36
  var WQL_VIRTUAL_DIMS = ["day", "week", "session", "round"];
37
37
  var WQL_CALC_TARGETS = [
@@ -92,7 +92,7 @@ var WQL_FUNCTION_HEADS = WQL_AGGREGATORS;
92
92
  var WQL_CHART_HEADS = ["timeseries", "bar", "table", "donut", "toplist", "value"];
93
93
  var WQL_STANDARD_DATASETS = ["@session", "@today"];
94
94
  var WQL_RESULT_PLANES = wodWikiCore.KNOWN_OUTPUT_TYPES;
95
- var WQL_CONTENT_FILTER_KEYS = ["type", "text", "source", "notebook", "page", "contributes", ...WQL_TAG_KEYS];
95
+ var WQL_CONTENT_FILTER_KEYS = ["type", "text", "source", "notebook", "page", "contributes", "feed", "subscribed", ...WQL_TAG_KEYS];
96
96
  var WQL_SOURCES = WQL_FIND_TARGETS;
97
97
  var WQL_ROLLUP_PERIODS = ["2w", "4w"];
98
98
  var WQL_DISPLAY_UNITS = ["kg", "lb"];
@@ -114,7 +114,7 @@ var WQL_KEYWORDS = [
114
114
  ];
115
115
 
116
116
  // src/capabilities.ts
117
- var CONTENT_GROUPING_DIMENSIONS = ["date", "day", "week", "month", "year", "discipline", "origin", "source", "notebook", "kind", "type", "tag"];
117
+ var CONTENT_GROUPING_DIMENSIONS = ["date", "day", "week", "month", "year", "discipline", "origin", "source", "notebook", "kind", "type", "tag", "feed"];
118
118
  var STRUCTURAL_TYPES = { time: true, groupby: true, rollup: true, unit: true, where: true, agg: true };
119
119
  var FACT_KEYS = WQL_TAG_KEYS.filter((key) => key !== "metric");
120
120
  var TABLE_KEYS = WQL_TAG_KEYS.filter((key) => key !== "tags");
@@ -132,9 +132,9 @@ var TARGET_TYPES = {
132
132
  // The notebook plane IS the note plane (its executor delegates), so both
133
133
  // advertise the same member-criteria keys — container criteria (tags:,
134
134
  // effort:, typed tags, text:) narrow notebook results, never ignored.
135
- notebook: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", ...WQL_TYPED_TAG_KEYS, "type", "page", "source", "note", "time", "groupby", "where"]),
136
- note: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", ...WQL_TYPED_TAG_KEYS, "type", "page", "source", "note", "time", "groupby", "where"]),
137
- block: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", "type", "source", "note", "time", "groupby", "where"]),
135
+ notebook: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", ...WQL_TYPED_TAG_KEYS, "type", "page", "source", "note", "time", "groupby", "where", "feed", "subscribed"]),
136
+ note: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", ...WQL_TYPED_TAG_KEYS, "type", "page", "source", "note", "time", "groupby", "where", "feed", "subscribed"]),
137
+ block: /* @__PURE__ */ new Set(["text", "notebook", "tag", "effort", "type", "source", "note", "time", "groupby", "where", "feed", "subscribed"]),
138
138
  effort: /* @__PURE__ */ new Set([...WQL_EFFORT_FILTER_KEYS, "groupby"]),
139
139
  session: /* @__PURE__ */ new Set(["result", "block", "note", "plane", "time", "groupby"]),
140
140
  segment: /* @__PURE__ */ new Set([...TABLE_KEYS, "time", "groupby", "unit"]),
@@ -179,9 +179,9 @@ function supportsWqlFilterKey(target, family, rawKey) {
179
179
  }
180
180
  var parser = lr.LRParser.deserialize({
181
181
  version: 14,
182
- states: "+^OVQPOOOOQO'#Cb'#CbObQPO'#C`OgQPO'#C`OlQPO'#ClOqQQO'#C_OOQO'#C_'#C_O!SQQO'#CnQOQPOOOOQO,58z,58zO!bQPO,58zOOQO,59W,59WO!gQPO'#CdOOQO,58y,58yOVQPO,58xO!rQPO'#CoO!wQPO'#CrOOQO,59Y,59YO!|QPO,59YO#UQQO'#CcOOQO1G.f1G.fOOQO'#Cg'#CgO#jQPO'#CeO#oQPO'#CeOOQO,59O,59OO#tQPO,59OO#|QPO'#C_O$XQPO1G.dO$aQPO,59ZO$iQQO,59^OOQO1G.t1G.tO$nQPO'#CuO$sQQO,58}O%XQPO,59PO%aQPO,59PO%fQPO'#CxO%nQPO1G.jOOQO1G.j1G.jOVQPO'#CyO%vQPO7+$OOOQO'#Cq'#CqOOQO1G.u1G.uO&OQPO1G.uO&WQPO1G.xOOQO,59a,59aOOQO-E6s-E6sO&]QPO'#CiO&qQPO'#CiO'PQPO'#ChOOQO1G.k1G.kO%XQPO1G.kOOQO,59d,59dOOQO-E6v-E6vOOQO7+$U7+$UO'[QPO'#CcOOQO,59e,59eOOQO-E6w-E6wO'jQPO'#CzO'oQPO7+$aOOQO7+$a7+$aO'wQPO7+$dO'|QPO'#CvO(RQPO,59TOOQO,59T,59TO%XQPO'#CwO(gQPO,59SOOQO7+$V7+$VO(rQPO,58}OOQO,59f,59fOOQO-E6x-E6xOOQO<<G{<<G{OOQO<<HO<<HOOOQO,59b,59bOOQO-E6t-E6tOOQO1G.o1G.oOOQO,59c,59cOOQO-E6u-E6uO)QQPO,58zO)VQPO'#C`",
183
- stateData: ")[~OqOS~OTPOaSOrQO~OTXO~OrYO~OTZO~Ot[OdRXgRXoRXuRX~Od_Og`Ou^OobX~OTcO~OTeOYgOwhO~OtlO~OxmO~Og`Ooba~OsoOdVXgVXoVXtVXuVX~OrqO~OTeO~OvsOwuO~Ot[OoRXuRX~OuvOoQi~OTxOwyO~Oh{O~OT|O~OsoOdVagVaoVatVauVa~OT!OO_!PO~Or!SO~OTeOYgO~OvsOw!VO~OuvOoQq~Ov!ZOw!]O~OT!^O~O^!aOr!_Os!_Ou]Xv]Xw]X~O^!aOu]Xv]Xw]X~Ou!bOv[Xw[X~OsoOoVXtVXuVX~OTxO~Ov!ZOw!hO~Oy!iO~OT!jO~O^!lOr!_Os!_Ou]av]aw]a~Ou!bOv[aw[a~OsoOoVatVauVa~OT!WO~Or!oO~O",
184
- goto: "$^oPPps|P!T![!`!dP!j!q!wPP#OPp#TP#W#^PP#d#n#t#z$Q$WRWOQVOQk^R!XvQTOTj^vQROT!p^vTdY!oT]TjQi[R!TsSf[sRrgQ!RqR!d!SS!Qq!SR!m!bVUO^vRbVQzlR!f!ZQaVRnbQpcS}p!eR!e!WQ!`!OR!k!`Q!c!QR!n!cQtiR!UtQwkR!YwQ![zR!g![",
182
+ states: "+dOVQPOOOOQO'#Cb'#CbObQPO'#C`OgQPO'#C`OlQPO'#ClOqQQO'#C_OOQO'#C_'#C_O!SQQO'#CnQOQPOOOOQO,58z,58zO!bQPO,58zOOQO,59W,59WO!gQPO'#CdOOQO,58y,58yOVQPO,58xO!rQPO'#CoO!wQPO'#CrOOQO,59Y,59YO!|QPO,59YO#UQQO'#CcOOQO1G.f1G.fOOQO'#Cg'#CgO#jQPO'#CeO#oQPO'#CeOOQO,59O,59OO#tQPO,59OO#|QPO'#C_O$XQPO1G.dO$aQPO,59ZO$iQQO,59^OOQO1G.t1G.tO$nQPO'#CuO$sQQO,58}O%XQPO,59PO%dQPO,59PO%iQPO'#CxO%qQPO1G.jOOQO1G.j1G.jOVQPO'#CyO%yQPO7+$OOOQO'#Cq'#CqOOQO1G.u1G.uO&RQPO1G.uO&ZQPO1G.xOOQO,59a,59aOOQO-E6s-E6sOOQO'#Ci'#CiO&`QPO'#CiO&tQPO'#CiO'SQPO'#ChOOQO1G.k1G.kO%XQPO1G.kOOQO,59d,59dOOQO-E6v-E6vOOQO7+$U7+$UO'_QPO'#CcOOQO,59e,59eOOQO-E6w-E6wO'mQPO'#CzO'rQPO7+$aOOQO7+$a7+$aO'zQPO7+$dO(PQPO'#CvO(UQPO,59TOOQO,59T,59TO%XQPO'#CwO(jQPO,59SOOQO7+$V7+$VO(uQPO,58}OOQO,59f,59fOOQO-E6x-E6xOOQO<<G{<<G{OOQO<<HO<<HOOOQO,59b,59bOOQO-E6t-E6tOOQO1G.o1G.oOOQO,59c,59cOOQO-E6u-E6uO)TQPO,58zO)YQPO'#C`",
183
+ stateData: ")_~OqOS~OTPOaSOrQO~OTXO~OrYO~OTZO~Ot[OdRXgRXoRXuRX~Od_Og`Ou^OobX~OTcO~OTeOYgOwhO~OtlO~OxmO~Og`Ooba~OsoOdVXgVXoVXtVXuVX~OrqO~OTeO~OvsOwuO~Ot[OoRXuRX~OuvOoQi~OTxOwyO~Oh{O~OT|O~OsoOdVagVaoVatVauVa~OT!PO^!OO_!QO~Or!TO~OTeOYgO~OvsOw!WO~OuvOoQq~Ov![Ow!^O~OT!_O~O^!bOr!`Os!`Ou]Xv]Xw]X~O^!bOu]Xv]Xw]X~Ou!cOv[Xw[X~OsoOoVXtVXuVX~OTxO~Ov![Ow!iO~Oy!jO~OT!kO~O^!mOr!`Os!`Ou]av]aw]a~Ou!cOv[aw[a~OsoOoVatVauVa~OT!XO~Or!pO~O",
184
+ goto: "$^oPPps|P!T![!`!dP!j!q!wPP#OPp#TP#W#^PP#d#n#t#z$Q$WRWOQVOQk^R!YvQTOTj^vQROT!q^vTdY!pT]TjQi[R!UsSf[sRrgQ!SqR!e!TS!Rq!TR!n!cVUO^vRbVQzlR!g![QaVRnbQpcS}p!fR!f!XQ!a!PR!l!aQ!d!RR!o!dQtiR!VtQwkR!ZwQ!]zR!h!]",
185
185
  nodeNames: "\u26A0 Query Pipeline Stage Head Word Aggregator Metric Filters Filter Negate TagKey TagValue Value Star Quoted DatasetReference At Single GroupBy By Dimension Rollup RollupDot Int",
186
186
  maxTerm: 41,
187
187
  skippedNodes: [0],
@@ -671,7 +671,7 @@ function validateSourceFilter(filters) {
671
671
  return `source:notebook is retired \u2014 :notebook{} is the notebook plane (every notebook); narrow it with the notebook: filter, e.g. :notebook{notebook:journal}.`;
672
672
  }
673
673
  if (val === "feed" || val === "feeds" || val.startsWith("feed:")) {
674
- return `source:${val} is retired \u2014 the feed corpus is the notebook plane; use source:notebooks or notebook:<slug>.`;
674
+ return `source:${val} is retired \u2014 the feed corpus is the notebook plane; use feed:<feedId> or source:notebooks.`;
675
675
  }
676
676
  if (val === "collection" || val === "collections" || val.startsWith("collection:")) {
677
677
  return `source:${val} is retired \u2014 collections are notebooks; use source:notebooks or notebook:<slug>.`;
@@ -684,6 +684,28 @@ function validateSourceFilter(filters) {
684
684
  }
685
685
  return void 0;
686
686
  }
687
+ function validateSubscribedFilter(filters) {
688
+ for (const f of filters) {
689
+ if (f.key !== "subscribed") continue;
690
+ for (const v of f.values) {
691
+ if (v.value !== "true" && v.value !== "false") {
692
+ return `Invalid subscribed: value '${v.value}' \u2014 expected true or false`;
693
+ }
694
+ }
695
+ }
696
+ return void 0;
697
+ }
698
+ function validateFeedFilter(filters) {
699
+ for (const f of filters) {
700
+ if (f.key !== "feed") continue;
701
+ for (const v of f.values) {
702
+ if (!v.value && !v.wildcard) {
703
+ return `Invalid feed: value \u2014 expected a non-empty feed identifier or wildcard`;
704
+ }
705
+ }
706
+ }
707
+ return void 0;
708
+ }
687
709
  function extractPipes(raw) {
688
710
  let pipeIndex = -1;
689
711
  let depth = 0;
@@ -755,7 +777,7 @@ function extractFilters(query, text) {
755
777
  let value = quoted ? raw.slice(1, -1) : raw;
756
778
  const wildcard = quoted ? false : value.endsWith("*");
757
779
  if (wildcard) value = value.slice(0, -1);
758
- if (!value) continue;
780
+ if (!value && !wildcard) continue;
759
781
  values.push({ value, wildcard });
760
782
  }
761
783
  if (values.length === 0) continue;
@@ -1000,6 +1022,16 @@ function parseFindQuery(raw, opts) {
1000
1022
  result.error = sourceError;
1001
1023
  return result;
1002
1024
  }
1025
+ const subscribedError = validateSubscribedFilter(result.filters);
1026
+ if (subscribedError) {
1027
+ result.error = subscribedError;
1028
+ return result;
1029
+ }
1030
+ const feedError = validateFeedFilter(result.filters);
1031
+ if (feedError) {
1032
+ result.error = feedError;
1033
+ return result;
1034
+ }
1003
1035
  const findGrainError = retiredGrainRollup(result.filters);
1004
1036
  if (findGrainError) {
1005
1037
  result.error = findGrainError;
@@ -2975,6 +3007,29 @@ function notebookOriginOfItem(item) {
2975
3007
  if (notebook === "notebook/journal" || notebook === "notebook/playground") return "default";
2976
3008
  return "feed";
2977
3009
  }
3010
+ function feedIdOfItem(item) {
3011
+ const origin = notebookOriginOfItem(item);
3012
+ if (origin === "user") return "local";
3013
+ if (item.feedSourceId) return item.feedSourceId;
3014
+ if (origin === "default") return "local";
3015
+ return "core";
3016
+ }
3017
+ function chunkIdOfItem(item) {
3018
+ if (item.seedChunkId) return item.seedChunkId;
3019
+ const nb = notebookOfItem(item);
3020
+ if (!nb) return void 0;
3021
+ const slug = nb.replace(/^notebook\//, "");
3022
+ return `notebook.${slug}`;
3023
+ }
3024
+ function isItemSubscribed(item, isNotebookSubscribedFn) {
3025
+ const origin = item.origin ?? notebookOriginOfItem(item);
3026
+ if (origin === "user" || origin === "default") return true;
3027
+ if (!isNotebookSubscribedFn) return true;
3028
+ const feedId = feedIdOfItem(item);
3029
+ const chunkId = chunkIdOfItem(item);
3030
+ if (!chunkId) return true;
3031
+ return isNotebookSubscribedFn(feedId, chunkId);
3032
+ }
2978
3033
  function isJournalRow(item) {
2979
3034
  const sourceId = item.sourceId;
2980
3035
  if (item.type === "playground" || item.id?.startsWith("playground/") || item.noteId?.startsWith("playground/")) return false;
@@ -3387,6 +3442,7 @@ var QueryService = class {
3387
3442
  pageStore;
3388
3443
  relationStore;
3389
3444
  datasetStore;
3445
+ isNotebookSubscribed;
3390
3446
  // Optional storage seam properties for block_efforts and typed tag resolution.
3391
3447
  // Injected by the app adapter (`services/queryService.ts`); tests can supply fakes.
3392
3448
  blockEffortsStore = {
@@ -3411,6 +3467,7 @@ var QueryService = class {
3411
3467
  if (stores.blockEffortsStore) this.blockEffortsStore = stores.blockEffortsStore;
3412
3468
  if (stores.tagsStore) this.tagsStore = stores.tagsStore;
3413
3469
  if (stores.noteTagsStore) this.noteTagsStore = stores.noteTagsStore;
3470
+ if (stores.isNotebookSubscribed) this.isNotebookSubscribed = stores.isNotebookSubscribed;
3414
3471
  } else {
3415
3472
  this.store = storesOrEventStore ?? defaultEventStore;
3416
3473
  this.noteStore = noteStore ?? defaultNoteStore;
@@ -3814,6 +3871,38 @@ var QueryService = class {
3814
3871
  }
3815
3872
  }
3816
3873
  notes = applyNotebookFilter(notes, parsed.filters);
3874
+ const isSubscribedFn = options2.isNotebookSubscribed ?? this.isNotebookSubscribed ?? (() => true);
3875
+ for (const filter of parsed.filters) {
3876
+ if (filter.key === "feed") {
3877
+ const wanted = new Set(filter.values.map((v) => v.value));
3878
+ const hasWildcard = filter.values.some((v) => v.wildcard);
3879
+ notes = notes.filter((n) => {
3880
+ const fid = feedIdOfItem(n);
3881
+ const hit = hasWildcard ? fid !== "local" : wanted.has(fid);
3882
+ return filter.negate ? !hit : hit;
3883
+ });
3884
+ }
3885
+ }
3886
+ const subscribedFilter = parsed.filters.find((f) => f.key === "subscribed");
3887
+ if (subscribedFilter) {
3888
+ const wantedValues = new Set(subscribedFilter.values.map((v) => v.value));
3889
+ const wantsTrue = wantedValues.has("true");
3890
+ const wantsFalse = wantedValues.has("false");
3891
+ notes = notes.filter((n) => {
3892
+ const isSub = isItemSubscribed(n, isSubscribedFn);
3893
+ let match = false;
3894
+ if (wantsTrue && wantsFalse) {
3895
+ match = true;
3896
+ } else if (wantsTrue) {
3897
+ match = isSub;
3898
+ } else if (wantsFalse) {
3899
+ match = !isSub;
3900
+ }
3901
+ return subscribedFilter.negate ? !match : match;
3902
+ });
3903
+ } else if (parsed.target === "notebook" || parsed.raw.startsWith(":notebook")) {
3904
+ notes = notes.filter((n) => isItemSubscribed(n, isSubscribedFn));
3905
+ }
3817
3906
  for (const filter of parsed.filters) {
3818
3907
  if (filter.key === "note") {
3819
3908
  const wanted = new Set(filter.values.map((v) => v.value));
@@ -3952,6 +4041,36 @@ var QueryService = class {
3952
4041
  }
3953
4042
  }
3954
4043
  blocks = applyNotebookFilter(blocks, parsed.filters);
4044
+ const isSubscribedFn = options2.isNotebookSubscribed ?? this.isNotebookSubscribed ?? (() => true);
4045
+ for (const filter of parsed.filters) {
4046
+ if (filter.key === "feed") {
4047
+ const wanted = new Set(filter.values.map((v) => v.value));
4048
+ const hasWildcard = filter.values.some((v) => v.wildcard);
4049
+ blocks = blocks.filter((b) => {
4050
+ const fid = feedIdOfItem(b);
4051
+ const hit = hasWildcard ? fid !== "local" : wanted.has(fid);
4052
+ return filter.negate ? !hit : hit;
4053
+ });
4054
+ }
4055
+ }
4056
+ const subscribedFilter = parsed.filters.find((f) => f.key === "subscribed");
4057
+ if (subscribedFilter) {
4058
+ const wantedValues = new Set(subscribedFilter.values.map((v) => v.value));
4059
+ const wantsTrue = wantedValues.has("true");
4060
+ const wantsFalse = wantedValues.has("false");
4061
+ blocks = blocks.filter((b) => {
4062
+ const isSub = isItemSubscribed(b, isSubscribedFn);
4063
+ let match = false;
4064
+ if (wantsTrue && wantsFalse) {
4065
+ match = true;
4066
+ } else if (wantsTrue) {
4067
+ match = isSub;
4068
+ } else if (wantsFalse) {
4069
+ match = !isSub;
4070
+ }
4071
+ return subscribedFilter.negate ? !match : match;
4072
+ });
4073
+ }
3955
4074
  for (const filter of parsed.filters) {
3956
4075
  if (isTagLabelKey(filter.key) && !filter.negate) {
3957
4076
  const matchingNoteIds = /* @__PURE__ */ new Set();
@@ -5053,7 +5172,39 @@ function parseMetaLines(lines) {
5053
5172
  items.push(itemMatch[1].trim());
5054
5173
  i++;
5055
5174
  }
5056
- meta[key] = items.length > 0 ? items : "";
5175
+ if (items.length > 0) {
5176
+ meta[key] = items;
5177
+ } else if (key === "metrics" || key === "summaries") {
5178
+ while (i + 1 < lines.length) {
5179
+ const childLine = lines[i + 1];
5180
+ if (/^\s*(?:#.*)?$/.test(childLine)) {
5181
+ i++;
5182
+ continue;
5183
+ }
5184
+ const childMatch = childLine.match(/^\s{2,}([A-Za-z][\w.-]*)\s*:(.*)$/);
5185
+ if (!childMatch) break;
5186
+ i++;
5187
+ const childKey = `${key}.${childMatch[1]}`;
5188
+ const childRaw = childMatch[2].trim();
5189
+ if (childRaw === "") {
5190
+ const childItems = [];
5191
+ while (i + 1 < lines.length) {
5192
+ const listMatch = lines[i + 1].match(/^\s{4,}-\s+(.+)$/);
5193
+ if (!listMatch) break;
5194
+ childItems.push(listMatch[1].trim());
5195
+ i++;
5196
+ }
5197
+ meta[childKey] = childItems.length > 0 ? childItems : "";
5198
+ } else {
5199
+ const wasQuoted = /^(['"])(.*)\1$/.test(childRaw);
5200
+ const value = unquote(childRaw);
5201
+ const num = Number(value);
5202
+ meta[childKey] = !wasQuoted && value !== "" && !isNaN(num) ? num : value;
5203
+ }
5204
+ }
5205
+ } else {
5206
+ meta[key] = "";
5207
+ }
5057
5208
  } else {
5058
5209
  const wasQuoted = /^(['"])(.*)\1$/.test(rawVal);
5059
5210
  const value = unquote(rawVal);
@@ -5478,13 +5629,13 @@ ${query}
5478
5629
  }
5479
5630
 
5480
5631
  // src/version.ts
5481
- var VERSION = "0.45.2167";
5482
- var GIT_SHA = "d9859fd";
5483
- var BUILD_TIME = "2026-10-26T20:26:47.975Z";
5632
+ var VERSION = "0.47.2169";
5633
+ var GIT_SHA = "388d659";
5634
+ var BUILD_TIME = "2026-10-26T23:06:14.030Z";
5484
5635
  var SEMVER = {
5485
- version: "0.45.2167",
5486
- gitSha: "d9859fd",
5487
- buildTime: "2026-10-26T20:26:47.975Z"
5636
+ version: "0.47.2169",
5637
+ gitSha: "388d659",
5638
+ buildTime: "2026-10-26T23:06:14.030Z"
5488
5639
  };
5489
5640
 
5490
5641
  Object.defineProperty(exports, "DEFAULT_NOTEBOOK_SLUGS", {
@@ -5579,6 +5730,7 @@ exports.buildDashboardDocument = buildDashboardDocument;
5579
5730
  exports.buildDashboardScaffold = buildDashboardScaffold;
5580
5731
  exports.buildDrillDownQuery = buildDrillDownQuery;
5581
5732
  exports.captureContext = captureContext;
5733
+ exports.chunkIdOfItem = chunkIdOfItem;
5582
5734
  exports.civilDateAdd = civilDateAdd;
5583
5735
  exports.civilDateDiff = civilDateDiff;
5584
5736
  exports.civilDateOf = civilDateOf;
@@ -5594,6 +5746,7 @@ exports.duplicateWidget = duplicateWidget;
5594
5746
  exports.eventsToStoredLogs = eventsToStoredLogs;
5595
5747
  exports.extractDashboardTokens = extractDashboardTokens;
5596
5748
  exports.extractFrontmatterTags = extractFrontmatterTags;
5749
+ exports.feedIdOfItem = feedIdOfItem;
5597
5750
  exports.feedOfItem = feedOfItem;
5598
5751
  exports.findTargetAdvisories = findTargetAdvisories;
5599
5752
  exports.getList = getList;
@@ -5606,6 +5759,7 @@ exports.isDashboardMeta = isDashboardMeta;
5606
5759
  exports.isDashboardWidgetType = isDashboardWidgetType;
5607
5760
  exports.isEffortDiscipline = isEffortDiscipline;
5608
5761
  exports.isFindQuery = isFindQuery;
5762
+ exports.isItemSubscribed = isItemSubscribed;
5609
5763
  exports.isPipelineQuery = isPipelineQuery;
5610
5764
  exports.isProposedMetric = isProposedMetric;
5611
5765
  exports.migrateLegacyChunkId = migrateLegacyChunkId;