@burdenoff/microfe-ecoimpacthub 2026.801.1 → 2026.801.2

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,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
@@ -1,12 +1,14 @@
1
- import { useSandboxAssistantTransport as e } from "@burdenoff/fe-libs/shared/assistant";
1
+ import { gatherPageContext as e } from "../utils/pageContext.js";
2
+ import { useSandboxAssistantTransport as t } from "@burdenoff/fe-libs/shared/assistant";
2
3
  //#region src/ecoimpacthub/services/createSandboxAssistantTransport.ts
3
- function t() {
4
- return e({
4
+ function n() {
5
+ return t({
5
6
  product: "ecoimpacthub",
6
- enableCredits: !0
7
+ enableCredits: !0,
8
+ gatherPageContext: e
7
9
  });
8
10
  }
9
11
  //#endregion
10
- export { t as useSandboxAssistantTransport };
12
+ export { n as useSandboxAssistantTransport };
11
13
 
12
14
  //# sourceMappingURL=createSandboxAssistantTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * ecoimpacthub adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'ecoimpacthub',\n\n enableCredits: true,\n });\n}\n"],"mappings":";;AAwBA,SAAgB,IAAmD;CACjE,OAAO,EAAmB;EACxB,SAAS;EAET,eAAe;CACjB,CAAC;AACH"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../../src/ecoimpacthub/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * ecoimpacthub adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\nimport { gatherPageContext } from '../utils/pageContext.js';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'ecoimpacthub',\n enableCredits: true,\n gatherPageContext,\n });\n}\n"],"mappings":";;;AAyBA,SAAgB,IAAmD;CACjE,OAAO,EAAmB;EACxB,SAAS;EACT,eAAe;EACf;CACF,CAAC;AACH"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Page context gathering for the EcoImpactHub assistant.
3
+ *
4
+ * Captures the user's current browser context to be sent alongside every
5
+ * assistant prompt so the assistant can resolve "this site / this report /
6
+ * this entry" without a follow-up question.
7
+ *
8
+ * Key set is intentionally narrow: only keys in the agent's ALLOWED_CONTEXT_KEYS
9
+ * contract are emitted. Anything else is silently dropped by the sandbox proxy,
10
+ * so we don't waste bytes or leak disallowed fields.
11
+ *
12
+ * Allowed keys (wspace/sandbox/ai-assistant/src/context-loader.ts):
13
+ * currentUrl, currentPage, entityType, entityId, entityName, pageTitle,
14
+ * pageType, activeTab, activeTool, selectedText, workspaceId, workspaceName,
15
+ * projectId, projectName
16
+ *
17
+ * We deliberately do NOT emit platform, version, viewportSize, userAgent, or
18
+ * timestamp — those are not on the allow-list.
19
+ */
20
+ export interface EcoImpactHubPageContext {
21
+ currentUrl: string;
22
+ currentPage: string;
23
+ entityType?: string;
24
+ entityId?: string;
25
+ entityName?: string;
26
+ pageTitle?: string;
27
+ pageType?: string;
28
+ activeTab?: string;
29
+ workspaceId?: string;
30
+ workspaceName?: string;
31
+ }
32
+ interface ConversationContextShape {
33
+ entityType?: string;
34
+ entityId?: string;
35
+ activeTab?: string;
36
+ }
37
+ export declare function resolveEcoImpactHubEntityContext(pathname: string): ConversationContextShape;
38
+ export declare function gatherPageContext(): EcoImpactHubPageContext;
39
+ export {};
40
+ //# sourceMappingURL=pageContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageContext.d.ts","sourceRoot":"","sources":["../../../src/ecoimpacthub/utils/pageContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoDD,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,GAAG,wBAAwB,CAoB3F;AAED,wBAAgB,iBAAiB,IAAI,uBAAuB,CAuB3D"}
@@ -0,0 +1,70 @@
1
+ //#region src/ecoimpacthub/utils/pageContext.ts
2
+ function e() {
3
+ try {
4
+ let e = localStorage.getItem("burdenoff-active-context-workspace");
5
+ if (e) return e;
6
+ let t = sessionStorage.getItem("bf-active-profile");
7
+ if (!t) return "";
8
+ let n = localStorage.getItem(`bf-p-${t}-context`);
9
+ return n ? JSON.parse(n).workspaceId ?? "" : "";
10
+ } catch {
11
+ return "";
12
+ }
13
+ }
14
+ function t() {
15
+ try {
16
+ let e = sessionStorage.getItem("bf-active-profile");
17
+ if (!e) return "";
18
+ let t = localStorage.getItem(`bf-p-${e}-context`);
19
+ return t ? JSON.parse(t).workspaceName ?? "" : "";
20
+ } catch {
21
+ return "";
22
+ }
23
+ }
24
+ function n(e, t) {
25
+ return t.match(e);
26
+ }
27
+ var r = [
28
+ [/^\/ecoimpacthub\/sites\/([^/]+)$/, "ECOIMPACTHUB_SITE"],
29
+ [/^\/ecoimpacthub\/species\/([^/]+)$/, "ECOIMPACTHUB_SPECIES"],
30
+ [/^\/ecoimpacthub\/habitat\/([^/]+)$/, "ECOIMPACTHUB_HABITAT_PROJECT"],
31
+ [/^\/ecoimpacthub\/reports\/([^/]+)$/, "ECOIMPACTHUB_REPORT"]
32
+ ], i = [
33
+ [/^\/ecoimpacthub\/?$/, "ECOIMPACTHUB_DASHBOARD"],
34
+ [/^\/ecoimpacthub\/sites\/?$/, "ECOIMPACTHUB_SITES"],
35
+ [/^\/ecoimpacthub\/monitoring\/?$/, "ECOIMPACTHUB_MONITORING"],
36
+ [/^\/ecoimpacthub\/species\/?$/, "ECOIMPACTHUB_SPECIES"],
37
+ [/^\/ecoimpacthub\/observations\/?$/, "ECOIMPACTHUB_OBSERVATIONS"],
38
+ [/^\/ecoimpacthub\/habitat\/?$/, "ECOIMPACTHUB_HABITAT"],
39
+ [/^\/ecoimpacthub\/carbon\/?$/, "ECOIMPACTHUB_CARBON"],
40
+ [/^\/ecoimpacthub\/reports\/?$/, "ECOIMPACTHUB_REPORTS"]
41
+ ];
42
+ function a(e) {
43
+ for (let [t, i] of r) {
44
+ let r = n(t, e);
45
+ if (r) return {
46
+ entityType: i,
47
+ entityId: r[1]
48
+ };
49
+ }
50
+ for (let [t, n] of i) if (t.test(e)) return { entityType: n };
51
+ let t = e.split("/").filter(Boolean);
52
+ return t.length >= 3 && t[0] === "ecoimpacthub" ? { activeTab: t[t.length - 1] } : {};
53
+ }
54
+ function o() {
55
+ let n = window.location.href, r = window.location.pathname, i = r.split("/").filter(Boolean).slice(0, 3).join("/") || "ecoimpacthub/dashboard", o = a(r), s = {
56
+ currentUrl: n,
57
+ currentPage: i,
58
+ entityType: o.entityType,
59
+ entityId: o.entityId,
60
+ pageType: o.entityType,
61
+ activeTab: o.activeTab
62
+ }, c = e();
63
+ c && (s.workspaceId = c);
64
+ let l = t();
65
+ return l && (s.workspaceName = l), s;
66
+ }
67
+ //#endregion
68
+ export { o as gatherPageContext };
69
+
70
+ //# sourceMappingURL=pageContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageContext.js","names":[],"sources":["../../../src/ecoimpacthub/utils/pageContext.ts"],"sourcesContent":["/**\n * Page context gathering for the EcoImpactHub assistant.\n *\n * Captures the user's current browser context to be sent alongside every\n * assistant prompt so the assistant can resolve \"this site / this report /\n * this entry\" without a follow-up question.\n *\n * Key set is intentionally narrow: only keys in the agent's ALLOWED_CONTEXT_KEYS\n * contract are emitted. Anything else is silently dropped by the sandbox proxy,\n * so we don't waste bytes or leak disallowed fields.\n *\n * Allowed keys (wspace/sandbox/ai-assistant/src/context-loader.ts):\n * currentUrl, currentPage, entityType, entityId, entityName, pageTitle,\n * pageType, activeTab, activeTool, selectedText, workspaceId, workspaceName,\n * projectId, projectName\n *\n * We deliberately do NOT emit platform, version, viewportSize, userAgent, or\n * timestamp — those are not on the allow-list.\n */\n\nexport interface EcoImpactHubPageContext {\n currentUrl: string;\n currentPage: string;\n entityType?: string;\n entityId?: string;\n entityName?: string;\n pageTitle?: string;\n pageType?: string;\n activeTab?: string;\n workspaceId?: string;\n workspaceName?: string;\n}\n\ninterface ConversationContextShape {\n entityType?: string;\n entityId?: string;\n activeTab?: string;\n}\n\nfunction readWorkspaceId(): string {\n try {\n const active = localStorage.getItem('burdenoff-active-context-workspace');\n if (active) return active;\n const activeProfileId = sessionStorage.getItem('bf-active-profile');\n if (!activeProfileId) return '';\n const raw = localStorage.getItem(`bf-p-${activeProfileId}-context`);\n if (!raw) return '';\n const ctx = JSON.parse(raw) as { workspaceId?: string; workspaceName?: string };\n return ctx.workspaceId ?? '';\n } catch {\n return '';\n }\n}\n\nfunction readWorkspaceName(): string {\n try {\n const activeProfileId = sessionStorage.getItem('bf-active-profile');\n if (!activeProfileId) return '';\n const raw = localStorage.getItem(`bf-p-${activeProfileId}-context`);\n if (!raw) return '';\n const ctx = JSON.parse(raw) as { workspaceName?: string };\n return ctx.workspaceName ?? '';\n } catch {\n return '';\n }\n}\n\nfunction matchPath(pattern: RegExp, pathname: string): RegExpMatchArray | null {\n return pathname.match(pattern);\n}\n\nconst DETAIL_ROUTE_MATCHES: Array<[RegExp, string]> = [\n [/^\\/ecoimpacthub\\/sites\\/([^/]+)$/, 'ECOIMPACTHUB_SITE'],\n [/^\\/ecoimpacthub\\/species\\/([^/]+)$/, 'ECOIMPACTHUB_SPECIES'],\n [/^\\/ecoimpacthub\\/habitat\\/([^/]+)$/, 'ECOIMPACTHUB_HABITAT_PROJECT'],\n [/^\\/ecoimpacthub\\/reports\\/([^/]+)$/, 'ECOIMPACTHUB_REPORT'],\n];\n\nconst LIST_ROUTE_MATCHES: Array<[RegExp, string]> = [\n [/^\\/ecoimpacthub\\/?$/, 'ECOIMPACTHUB_DASHBOARD'],\n [/^\\/ecoimpacthub\\/sites\\/?$/, 'ECOIMPACTHUB_SITES'],\n [/^\\/ecoimpacthub\\/monitoring\\/?$/, 'ECOIMPACTHUB_MONITORING'],\n [/^\\/ecoimpacthub\\/species\\/?$/, 'ECOIMPACTHUB_SPECIES'],\n [/^\\/ecoimpacthub\\/observations\\/?$/, 'ECOIMPACTHUB_OBSERVATIONS'],\n [/^\\/ecoimpacthub\\/habitat\\/?$/, 'ECOIMPACTHUB_HABITAT'],\n [/^\\/ecoimpacthub\\/carbon\\/?$/, 'ECOIMPACTHUB_CARBON'],\n [/^\\/ecoimpacthub\\/reports\\/?$/, 'ECOIMPACTHUB_REPORTS'],\n];\n\nexport function resolveEcoImpactHubEntityContext(pathname: string): ConversationContextShape {\n for (const [pattern, entityType] of DETAIL_ROUTE_MATCHES) {\n const match = matchPath(pattern, pathname);\n if (match) {\n return { entityType, entityId: match[1] };\n }\n }\n\n for (const [pattern, entityType] of LIST_ROUTE_MATCHES) {\n if (pattern.test(pathname)) {\n return { entityType };\n }\n }\n\n const segments = pathname.split('/').filter(Boolean);\n if (segments.length >= 3 && segments[0] === 'ecoimpacthub') {\n return { activeTab: segments[segments.length - 1] };\n }\n\n return {};\n}\n\nexport function gatherPageContext(): EcoImpactHubPageContext {\n const url = window.location.href;\n const pathname = window.location.pathname;\n const segments = pathname.split('/').filter(Boolean);\n const currentPage = segments.slice(0, 3).join('/') || 'ecoimpacthub/dashboard';\n const entity = resolveEcoImpactHubEntityContext(pathname);\n\n const ctx: EcoImpactHubPageContext = {\n currentUrl: url,\n currentPage,\n entityType: entity.entityType,\n entityId: entity.entityId,\n pageType: entity.entityType,\n activeTab: entity.activeTab,\n };\n\n const workspaceId = readWorkspaceId();\n if (workspaceId) ctx.workspaceId = workspaceId;\n\n const workspaceName = readWorkspaceName();\n if (workspaceName) ctx.workspaceName = workspaceName;\n\n return ctx;\n}\n"],"mappings":";AAuCA,SAAS,IAA0B;CACjC,IAAI;EACF,IAAM,IAAS,aAAa,QAAQ,oCAAoC;EACxE,IAAI,GAAQ,OAAO;EACnB,IAAM,IAAkB,eAAe,QAAQ,mBAAmB;EAClE,IAAI,CAAC,GAAiB,OAAO;EAC7B,IAAM,IAAM,aAAa,QAAQ,QAAQ,EAAgB,SAAS;EAGlE,OAFK,IACO,KAAK,MAAM,CAChB,EAAI,eAAe,KAFT;CAGnB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,IAA4B;CACnC,IAAI;EACF,IAAM,IAAkB,eAAe,QAAQ,mBAAmB;EAClE,IAAI,CAAC,GAAiB,OAAO;EAC7B,IAAM,IAAM,aAAa,QAAQ,QAAQ,EAAgB,SAAS;EAGlE,OAFK,IACO,KAAK,MAAM,CAChB,EAAI,iBAAiB,KAFX;CAGnB,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,EAAU,GAAiB,GAA2C;CAC7E,OAAO,EAAS,MAAM,CAAO;AAC/B;AAEA,IAAM,IAAgD;CACpD,CAAC,oCAAoC,mBAAmB;CACxD,CAAC,sCAAsC,sBAAsB;CAC7D,CAAC,sCAAsC,8BAA8B;CACrE,CAAC,sCAAsC,qBAAqB;AAC9D,GAEM,IAA8C;CAClD,CAAC,uBAAuB,wBAAwB;CAChD,CAAC,8BAA8B,oBAAoB;CACnD,CAAC,mCAAmC,yBAAyB;CAC7D,CAAC,gCAAgC,sBAAsB;CACvD,CAAC,qCAAqC,2BAA2B;CACjE,CAAC,gCAAgC,sBAAsB;CACvD,CAAC,+BAA+B,qBAAqB;CACrD,CAAC,gCAAgC,sBAAsB;AACzD;AAEA,SAAgB,EAAiC,GAA4C;CAC3F,KAAK,IAAM,CAAC,GAAS,MAAe,GAAsB;EACxD,IAAM,IAAQ,EAAU,GAAS,CAAQ;EACzC,IAAI,GACF,OAAO;GAAE;GAAY,UAAU,EAAM;EAAG;CAE5C;CAEA,KAAK,IAAM,CAAC,GAAS,MAAe,GAClC,IAAI,EAAQ,KAAK,CAAQ,GACvB,OAAO,EAAE,cAAW;CAIxB,IAAM,IAAW,EAAS,MAAM,GAAG,EAAE,OAAO,OAAO;CAKnD,OAJI,EAAS,UAAU,KAAK,EAAS,OAAO,iBACnC,EAAE,WAAW,EAAS,EAAS,SAAS,GAAG,IAG7C,CAAC;AACV;AAEA,SAAgB,IAA6C;CAC3D,IAAM,IAAM,OAAO,SAAS,MACtB,IAAW,OAAO,SAAS,UAE3B,IADW,EAAS,MAAM,GAAG,EAAE,OAAO,OACxB,EAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,0BAChD,IAAS,EAAiC,CAAQ,GAElD,IAA+B;EACnC,YAAY;EACZ;EACA,YAAY,EAAO;EACnB,UAAU,EAAO;EACjB,UAAU,EAAO;EACjB,WAAW,EAAO;CACpB,GAEM,IAAc,EAAgB;CACpC,AAAI,MAAa,EAAI,cAAc;CAEnC,IAAM,IAAgB,EAAkB;CAGxC,OAFI,MAAe,EAAI,gBAAgB,IAEhC;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-ecoimpacthub",
3
- "version": "2026.801.1",
3
+ "version": "2026.801.2",
4
4
  "description": "Burdenoff EcoImpactHub Microfrontend",
5
5
  "type": "module",
6
6
  "files": [
@@ -30,7 +30,7 @@
30
30
  "lint": "eslint .",
31
31
  "format": "prettier --write \"src/**/*.{ts,tsx}\"",
32
32
  "type:check": "bash scripts/build-limits.sh tsc --noEmit",
33
- "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run lint && bun run format && bun run type:check && bun run build'",
33
+ "sanity": "bash scripts/build-limits.sh --gate bash -c 'bun run codegen && bun run lint && bun run format && bun run type:check && bun run test && bun run build'",
34
34
  "schema:pull": "graphql-codegen --project schema-wspace && graphql-codegen --project schema-global",
35
35
  "codegen": "graphql-codegen --project wspace && graphql-codegen --project global",
36
36
  "codegen:all": "bun run schema:pull && bun run codegen",
@@ -40,6 +40,9 @@
40
40
  "switch:check": "bun scripts/deps-mode.ts check",
41
41
  "prepare": "lefthook install || true",
42
42
  "format:check": "prettier --check \"src/**/*.{ts,tsx}\"",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "test:coverage": "vitest run --coverage",
43
46
  "storybook": "storybook dev -p 6006",
44
47
  "build-storybook": "storybook build",
45
48
  "test:storybook": "test-storybook"
@@ -91,7 +94,8 @@
91
94
  "typescript": "^5.9.0",
92
95
  "typescript-eslint": "^8.54.0",
93
96
  "vite": "8.0.16",
94
- "vite-plugin-dts": "3.9.1"
97
+ "vite-plugin-dts": "3.9.1",
98
+ "vitest": "3.2.7"
95
99
  },
96
100
  "peerDependencies": {
97
101
  "@apollo/client": "^4.0.11",