@burdenoff/microfe-subscriberbot 2026.706.3 → 2026.713.1

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.
Files changed (115) hide show
  1. package/dist/generated/global-operations.d.ts +2 -0
  2. package/dist/generated/global-operations.d.ts.map +1 -0
  3. package/dist/generated/global-types.d.ts +23527 -0
  4. package/dist/generated/global-types.d.ts.map +1 -0
  5. package/dist/generated/wspace-operations.d.ts +2 -0
  6. package/dist/generated/wspace-operations.d.ts.map +1 -0
  7. package/dist/generated/wspace-types.d.ts +57851 -0
  8. package/dist/generated/wspace-types.d.ts.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +2 -1
  12. package/dist/subscriberbot/SubscriberBotRoot.d.ts +5 -0
  13. package/dist/subscriberbot/SubscriberBotRoot.d.ts.map +1 -0
  14. package/dist/subscriberbot/SubscriberBotRoot.js +56 -40
  15. package/dist/subscriberbot/SubscriberBotRoot.js.map +1 -1
  16. package/dist/subscriberbot/SubscriberBotRoutes.d.ts +4 -0
  17. package/dist/subscriberbot/SubscriberBotRoutes.d.ts.map +1 -0
  18. package/dist/subscriberbot/SubscriberBotRoutes.js.map +1 -1
  19. package/dist/subscriberbot/components/EmptyState.d.ts +18 -0
  20. package/dist/subscriberbot/components/EmptyState.d.ts.map +1 -0
  21. package/dist/subscriberbot/components/MetricsCard.d.ts +16 -0
  22. package/dist/subscriberbot/components/MetricsCard.d.ts.map +1 -0
  23. package/dist/subscriberbot/components/Modal.d.ts +13 -0
  24. package/dist/subscriberbot/components/Modal.d.ts.map +1 -0
  25. package/dist/subscriberbot/components/PageLayout.d.ts +23 -0
  26. package/dist/subscriberbot/components/PageLayout.d.ts.map +1 -0
  27. package/dist/subscriberbot/components/StateViews.d.ts +24 -0
  28. package/dist/subscriberbot/components/StateViews.d.ts.map +1 -0
  29. package/dist/subscriberbot/components/StatusBadge.d.ts +9 -0
  30. package/dist/subscriberbot/components/StatusBadge.d.ts.map +1 -0
  31. package/dist/subscriberbot/components/index.d.ts +13 -0
  32. package/dist/subscriberbot/components/index.d.ts.map +1 -0
  33. package/dist/subscriberbot/components/viz.d.ts +58 -0
  34. package/dist/subscriberbot/components/viz.d.ts.map +1 -0
  35. package/dist/subscriberbot/components/viz.js.map +1 -1
  36. package/dist/subscriberbot/config/assistantUsecases.d.ts +13 -0
  37. package/dist/subscriberbot/config/assistantUsecases.d.ts.map +1 -0
  38. package/dist/subscriberbot/context/SubscriberBotContext.d.ts +16 -0
  39. package/dist/subscriberbot/context/SubscriberBotContext.d.ts.map +1 -0
  40. package/dist/subscriberbot/context/index.d.ts +6 -0
  41. package/dist/subscriberbot/context/index.d.ts.map +1 -0
  42. package/dist/subscriberbot/hooks/index.d.ts +7 -0
  43. package/dist/subscriberbot/hooks/index.d.ts.map +1 -0
  44. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts +105 -0
  45. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts.map +1 -0
  46. package/dist/subscriberbot/index.d.ts +12 -0
  47. package/dist/subscriberbot/index.d.ts.map +1 -0
  48. package/dist/subscriberbot/index.js +1 -0
  49. package/dist/subscriberbot/pages/AssetVaultPage.d.ts +4 -0
  50. package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -0
  51. package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -1
  52. package/dist/subscriberbot/pages/DashboardPage.d.ts +12 -0
  53. package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -0
  54. package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
  55. package/dist/subscriberbot/pages/InboxPage.d.ts +12 -0
  56. package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -0
  57. package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
  58. package/dist/subscriberbot/pages/InsightsPage.d.ts +4 -0
  59. package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -0
  60. package/dist/subscriberbot/pages/InsightsPage.js.map +1 -1
  61. package/dist/subscriberbot/pages/InvoicesPage.d.ts +13 -0
  62. package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -0
  63. package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
  64. package/dist/subscriberbot/pages/WorkflowsPage.d.ts +15 -0
  65. package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -0
  66. package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
  67. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts +11 -0
  68. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -0
  69. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts +8 -0
  70. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -0
  71. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts +11 -0
  72. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -0
  73. package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
  74. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts +10 -0
  75. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -0
  76. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
  77. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts +10 -0
  78. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -0
  79. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts +12 -0
  80. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -0
  81. package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
  82. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts +13 -0
  83. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -0
  84. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
  85. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts +10 -0
  86. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -0
  87. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
  88. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts +10 -0
  89. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -0
  90. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
  91. package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts +24 -0
  92. package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts.map +1 -0
  93. package/dist/subscriberbot/services/createSandboxAssistantTransport.js +14 -0
  94. package/dist/subscriberbot/services/createSandboxAssistantTransport.js.map +1 -0
  95. package/dist/subscriberbot/store/index.d.ts +6 -0
  96. package/dist/subscriberbot/store/index.d.ts.map +1 -0
  97. package/dist/subscriberbot/store/subscriberbotStore.d.ts +60 -0
  98. package/dist/subscriberbot/store/subscriberbotStore.d.ts.map +1 -0
  99. package/dist/subscriberbot/types/assistant.d.ts +57 -0
  100. package/dist/subscriberbot/types/assistant.d.ts.map +1 -0
  101. package/dist/subscriberbot/types/index.d.ts +465 -0
  102. package/dist/subscriberbot/types/index.d.ts.map +1 -0
  103. package/dist/subscriberbot/utils/cn.d.ts +4 -0
  104. package/dist/subscriberbot/utils/cn.d.ts.map +1 -0
  105. package/dist/subscriberbot/utils/formatters.d.ts +53 -0
  106. package/dist/subscriberbot/utils/formatters.d.ts.map +1 -0
  107. package/dist/subscriberbot/utils/index.d.ts +8 -0
  108. package/dist/subscriberbot/utils/index.d.ts.map +1 -0
  109. package/dist/subscriberbot/utils/navigation.d.ts +20 -0
  110. package/dist/subscriberbot/utils/navigation.d.ts.map +1 -0
  111. package/dist/subscriberbot/utils/pageContext.d.ts +21 -0
  112. package/dist/subscriberbot/utils/pageContext.d.ts.map +1 -0
  113. package/dist/subscriberbot/utils/pageContext.js +47 -0
  114. package/dist/subscriberbot/utils/pageContext.js.map +1 -0
  115. package/package.json +7 -3
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SubscriberBot Microfrontend - Main Entry Point
3
+ * @module @burdenoff/microfe-subscriberbot
4
+ */
5
+ export * from './subscriberbot';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,iBAAiB,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,6 @@ import { cn as n } from "./subscriberbot/utils/cn.js";
3
3
  import { formatCurrency as r, formatDate as i, formatDateTime as a, formatEnumLabel as o, formatIntervalSuffix as s, formatNumber as c, formatRelativeTime as l } from "./subscriberbot/utils/formatters.js";
4
4
  import { SubscriberBotRoot as u } from "./subscriberbot/SubscriberBotRoot.js";
5
5
  import { useSubscriberBotStore as d } from "./subscriberbot/store/subscriberbotStore.js";
6
+ import { useSandboxAssistantTransport as f } from "./subscriberbot/services/createSandboxAssistantTransport.js";
6
7
  import "./subscriberbot/index.js";
7
- export { e as SubscriberBotProvider, u as SubscriberBotRoot, n as cn, r as formatCurrency, i as formatDate, a as formatDateTime, o as formatEnumLabel, s as formatIntervalSuffix, c as formatNumber, l as formatRelativeTime, t as useSubscriberBot, d as useSubscriberBotStore };
8
+ export { e as SubscriberBotProvider, u as SubscriberBotRoot, n as cn, r as formatCurrency, i as formatDate, a as formatDateTime, o as formatEnumLabel, s as formatIntervalSuffix, c as formatNumber, l as formatRelativeTime, f as useSandboxAssistantTransport, t as useSubscriberBot, d as useSubscriberBotStore };
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { SubscriberBotRootProps } from './types';
3
+
4
+ export declare const SubscriberBotRoot: FC<SubscriberBotRootProps>;
5
+ //# sourceMappingURL=SubscriberBotRoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriberBotRoot.d.ts","sourceRoot":"","sources":["../../src/subscriberbot/SubscriberBotRoot.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAkBhC,OAAO,KAAK,EAAE,sBAAsB,EAAW,MAAM,SAAS,CAAC;AAY/D,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAgIxD,CAAC"}
@@ -3,103 +3,119 @@ import { SubscriberBotRoutes as t } from "./SubscriberBotRoutes.js";
3
3
  import { useCallback as n, useEffect as r } from "react";
4
4
  import { QueryClient as i, QueryClientProvider as a } from "@tanstack/react-query";
5
5
  import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
- import { Bot as s, Building2 as c, Inbox as l, LayoutDashboard as u, Receipt as d, Repeat2 as f, Workflow as p } from "lucide-react";
7
- import { jsx as m } from "react/jsx-runtime";
8
- import { FeatureFlagProvider as h } from "@burdenoff/fe-libs/shared/feature-flags";
6
+ import { BarChart2 as s, Bot as c, Building2 as l, Inbox as u, LayoutDashboard as d, Receipt as f, Repeat2 as p, Vault as m, Workflow as h } from "lucide-react";
7
+ import { jsx as g } from "react/jsx-runtime";
8
+ import { FeatureFlagProvider as _ } from "@burdenoff/fe-libs/shared/feature-flags";
9
9
  //#region src/subscriberbot/SubscriberBotRoot.tsx
10
- var g = new i({ defaultOptions: { queries: {
10
+ var v = new i({ defaultOptions: { queries: {
11
11
  staleTime: 300 * 1e3,
12
12
  retry: 1
13
- } } }), _ = (i) => {
14
- let { registerNavItems: _, registerFooterItems: v, basePath: y = "/" } = i, { t: b } = o(), x = n((e, t) => {
15
- let n = b(e);
13
+ } } }), y = (i) => {
14
+ let { registerNavItems: y, registerFooterItems: b, basePath: x = "/" } = i, { t: S } = o(), C = n((e, t) => {
15
+ let n = S(e);
16
16
  return n === e ? t : n;
17
- }, [b]), S = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
17
+ }, [S]), w = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
18
18
  return r(() => {
19
- if (_) return _([
19
+ if (y) return y([
20
20
  {
21
21
  id: "subscriberbot-overview",
22
- label: x("subscriberbot.nav.overview", "Overview"),
23
- path: S(y, ""),
24
- icon: /* @__PURE__ */ m(u, { size: 20 }),
22
+ label: C("subscriberbot.nav.overview", "Overview"),
23
+ path: w(x, ""),
24
+ icon: /* @__PURE__ */ g(d, { size: 20 }),
25
25
  order: 1,
26
26
  group: "subscriberbot"
27
27
  },
28
28
  {
29
29
  id: "subscriberbot-relationships",
30
- label: x("subscriberbot.nav.relationships", "Relationships"),
31
- path: S(y, "relationships"),
32
- icon: /* @__PURE__ */ m(f, { size: 20 }),
30
+ label: C("subscriberbot.nav.relationships", "Relationships"),
31
+ path: w(x, "relationships"),
32
+ icon: /* @__PURE__ */ g(p, { size: 20 }),
33
33
  order: 2,
34
34
  group: "subscriberbot"
35
35
  },
36
36
  {
37
37
  id: "subscriberbot-providers",
38
- label: x("subscriberbot.nav.providers", "Providers"),
39
- path: S(y, "providers"),
40
- icon: /* @__PURE__ */ m(c, { size: 20 }),
38
+ label: C("subscriberbot.nav.providers", "Providers"),
39
+ path: w(x, "providers"),
40
+ icon: /* @__PURE__ */ g(l, { size: 20 }),
41
41
  order: 3,
42
42
  group: "subscriberbot"
43
43
  },
44
44
  {
45
45
  id: "subscriberbot-inbox",
46
- label: x("subscriberbot.nav.inbox", "Universal Inbox"),
47
- path: S(y, "inbox"),
48
- icon: /* @__PURE__ */ m(l, { size: 20 }),
46
+ label: C("subscriberbot.nav.inbox", "Universal Inbox"),
47
+ path: w(x, "inbox"),
48
+ icon: /* @__PURE__ */ g(u, { size: 20 }),
49
49
  order: 4,
50
50
  group: "subscriberbot"
51
51
  },
52
52
  {
53
53
  id: "subscriberbot-invoices",
54
- label: x("subscriberbot.nav.invoices", "Invoices"),
55
- path: S(y, "invoices"),
56
- icon: /* @__PURE__ */ m(d, { size: 20 }),
54
+ label: C("subscriberbot.nav.invoices", "Invoices"),
55
+ path: w(x, "invoices"),
56
+ icon: /* @__PURE__ */ g(f, { size: 20 }),
57
57
  order: 5,
58
58
  group: "subscriberbot"
59
59
  },
60
60
  {
61
61
  id: "subscriberbot-agents",
62
- label: x("subscriberbot.nav.agents", "AI Agents"),
63
- path: S(y, "agents"),
64
- icon: /* @__PURE__ */ m(s, { size: 20 }),
62
+ label: C("subscriberbot.nav.agents", "AI Agents"),
63
+ path: w(x, "agents"),
64
+ icon: /* @__PURE__ */ g(c, { size: 20 }),
65
65
  order: 6,
66
66
  group: "subscriberbot"
67
67
  },
68
68
  {
69
69
  id: "subscriberbot-workflows",
70
- label: x("subscriberbot.nav.workflows", "Workflows"),
71
- path: S(y, "workflows"),
72
- icon: /* @__PURE__ */ m(p, { size: 20 }),
70
+ label: C("subscriberbot.nav.workflows", "Workflows"),
71
+ path: w(x, "workflows"),
72
+ icon: /* @__PURE__ */ g(h, { size: 20 }),
73
73
  order: 7,
74
74
  group: "subscriberbot"
75
+ },
76
+ {
77
+ id: "subscriberbot-insights",
78
+ label: C("subscriberbot.nav.insights", "Insights"),
79
+ path: w(x, "insights"),
80
+ icon: /* @__PURE__ */ g(s, { size: 20 }),
81
+ order: 8,
82
+ group: "subscriberbot"
83
+ },
84
+ {
85
+ id: "subscriberbot-vault",
86
+ label: C("subscriberbot.nav.vault", "Asset Vault"),
87
+ path: w(x, "vault"),
88
+ icon: /* @__PURE__ */ g(m, { size: 20 }),
89
+ order: 9,
90
+ group: "subscriberbot"
75
91
  }
76
92
  ]);
77
93
  }, [
78
- _,
79
94
  y,
80
- x
95
+ x,
96
+ C
81
97
  ]), r(() => {
82
- if (v) return v([{
98
+ if (b) return b([{
83
99
  id: "subscriberbot-status",
84
- label: x("subscriberbot.footer.ready", "SubscriberBot Ready"),
100
+ label: C("subscriberbot.footer.ready", "SubscriberBot Ready"),
85
101
  type: "status",
86
102
  order: 10,
87
103
  section: "left"
88
104
  }]);
89
- }, [v, x]), /* @__PURE__ */ m(a, {
90
- client: g,
91
- children: /* @__PURE__ */ m(h, {
105
+ }, [b, C]), /* @__PURE__ */ g(a, {
106
+ client: v,
107
+ children: /* @__PURE__ */ g(_, {
92
108
  workspaceId: null,
93
109
  gateway: "global",
94
110
  defaultEnabled: !0,
95
- children: /* @__PURE__ */ m(e, {
111
+ children: /* @__PURE__ */ g(e, {
96
112
  ...i,
97
- children: /* @__PURE__ */ m(t, {})
113
+ children: /* @__PURE__ */ g(t, {})
98
114
  })
99
115
  })
100
116
  });
101
117
  };
102
118
  //#endregion
103
- export { _ as SubscriberBotRoot };
119
+ export { y as SubscriberBotRoot };
104
120
 
105
121
  //# sourceMappingURL=SubscriberBotRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriberBotRoot.js","names":[],"sources":["../../src/subscriberbot/SubscriberBotRoot.tsx"],"sourcesContent":["/**\n * SubscriberBot Root Component\n * @module subscriberbot\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { LayoutDashboard, Repeat2, Building2, Inbox, Receipt, Bot, Workflow } from 'lucide-react';\nimport { SubscriberBotProvider } from './context/SubscriberBotContext';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { SubscriberBotRoutes } from './SubscriberBotRoutes';\nimport type { SubscriberBotRootProps, NavItem } from './types';\n\n// Create a query client for this microfrontend\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport const SubscriberBotRoot: FC<SubscriberBotRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'subscriberbot-overview',\n label: t('subscriberbot.nav.overview', 'Overview'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 1,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-relationships',\n label: t('subscriberbot.nav.relationships', 'Relationships'),\n path: joinPath(basePath, 'relationships'),\n icon: <Repeat2 size={20} />,\n order: 2,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-providers',\n label: t('subscriberbot.nav.providers', 'Providers'),\n path: joinPath(basePath, 'providers'),\n icon: <Building2 size={20} />,\n order: 3,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-inbox',\n label: t('subscriberbot.nav.inbox', 'Universal Inbox'),\n path: joinPath(basePath, 'inbox'),\n icon: <Inbox size={20} />,\n order: 4,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-invoices',\n label: t('subscriberbot.nav.invoices', 'Invoices'),\n path: joinPath(basePath, 'invoices'),\n icon: <Receipt size={20} />,\n order: 5,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-agents',\n label: t('subscriberbot.nav.agents', 'AI Agents'),\n path: joinPath(basePath, 'agents'),\n icon: <Bot size={20} />,\n order: 6,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-workflows',\n label: t('subscriberbot.nav.workflows', 'Workflows'),\n path: joinPath(basePath, 'workflows'),\n icon: <Workflow size={20} />,\n order: 7,\n group: 'subscriberbot',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'subscriberbot-status',\n label: t('subscriberbot.footer.ready', 'SubscriberBot Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <SubscriberBotProvider {...props}>\n <SubscriberBotRoutes />\n </SubscriberBotProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":";;;;;;;;;AAgBA,IAAM,IAAc,IAAI,EAAY,EAClC,gBAAgB,EACd,SAAS;CACP,WAAW,MAAS;CACpB,OAAO;CACR,EACF,EACF,CAAC,EAEW,KAAiD,MAAU;CACtE,IAAM,EAAE,qBAAkB,wBAAqB,cAAW,QAAQ,GAC5D,EAAE,GAAG,MAAc,GAAS,EAC5B,IAAI,GACP,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAU,EAAI;AAC5B,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAU,CACZ,EAGK,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAyFtD,QApFA,QAAgB;AACT,QA8DL,QADgB,EA3DY;GAC1B;IACE,IAAI;IACJ,OAAO,EAAE,8BAA8B,WAAW;IAClD,MAAM,EAAS,GAAU,GAAG;IAC5B,MAAM,kBAAC,GAAD,EAAiB,MAAM,IAAM,CAAA;IACnC,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,mCAAmC,gBAAgB;IAC5D,MAAM,EAAS,GAAU,gBAAgB;IACzC,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;IAC3B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,+BAA+B,YAAY;IACpD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAC7B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,2BAA2B,kBAAkB;IACtD,MAAM,EAAS,GAAU,QAAQ;IACjC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;IACzB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,8BAA8B,WAAW;IAClD,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;IAC3B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,4BAA4B,YAAY;IACjD,MAAM,EAAS,GAAU,SAAS;IAClC,MAAM,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;IACvB,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO,EAAE,+BAA+B,YAAY;IACpD,MAAM,EAAS,GAAU,YAAY;IACrC,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR;GACF,CAEyC;IAEzC;EAAC;EAAkB;EAAU;EAAE,CAAC,EAGnC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO,EAAE,8BAA8B,sBAAsB;GAC7D,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,GAAqB,EAAE,CAAC,EAG1B,kBAAC,GAAD;EAAqB,QAAQ;YAC3B,kBAAC,GAAD;GAAqB,aAAa;GAAM,SAAQ;GAAS,gBAAgB;aACvE,kBAAC,GAAD;IAAuB,GAAI;cACzB,kBAAC,GAAD,EAAuB,CAAA;IACD,CAAA;GACJ,CAAA;EACF,CAAA"}
1
+ {"version":3,"file":"SubscriberBotRoot.js","names":[],"sources":["../../src/subscriberbot/SubscriberBotRoot.tsx"],"sourcesContent":["/**\n * SubscriberBot Root Component\n * @module subscriberbot\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useEffect } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n LayoutDashboard,\n Repeat2,\n Building2,\n Inbox,\n Receipt,\n Bot,\n Workflow,\n BarChart2,\n Vault,\n} from 'lucide-react';\nimport { SubscriberBotProvider } from './context/SubscriberBotContext';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { SubscriberBotRoutes } from './SubscriberBotRoutes';\nimport type { SubscriberBotRootProps, NavItem } from './types';\n\n// Create a query client for this microfrontend\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n retry: 1,\n },\n },\n});\n\nexport const SubscriberBotRoot: FC<SubscriberBotRootProps> = (props) => {\n const { registerNavItems, registerFooterItems, basePath = '/' } = props;\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n // Helper to join paths correctly\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith('/') ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with shell on mount\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: 'subscriberbot-overview',\n label: t('subscriberbot.nav.overview', 'Overview'),\n path: joinPath(basePath, ''),\n icon: <LayoutDashboard size={20} />,\n order: 1,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-relationships',\n label: t('subscriberbot.nav.relationships', 'Relationships'),\n path: joinPath(basePath, 'relationships'),\n icon: <Repeat2 size={20} />,\n order: 2,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-providers',\n label: t('subscriberbot.nav.providers', 'Providers'),\n path: joinPath(basePath, 'providers'),\n icon: <Building2 size={20} />,\n order: 3,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-inbox',\n label: t('subscriberbot.nav.inbox', 'Universal Inbox'),\n path: joinPath(basePath, 'inbox'),\n icon: <Inbox size={20} />,\n order: 4,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-invoices',\n label: t('subscriberbot.nav.invoices', 'Invoices'),\n path: joinPath(basePath, 'invoices'),\n icon: <Receipt size={20} />,\n order: 5,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-agents',\n label: t('subscriberbot.nav.agents', 'AI Agents'),\n path: joinPath(basePath, 'agents'),\n icon: <Bot size={20} />,\n order: 6,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-workflows',\n label: t('subscriberbot.nav.workflows', 'Workflows'),\n path: joinPath(basePath, 'workflows'),\n icon: <Workflow size={20} />,\n order: 7,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-insights',\n label: t('subscriberbot.nav.insights', 'Insights'),\n path: joinPath(basePath, 'insights'),\n icon: <BarChart2 size={20} />,\n order: 8,\n group: 'subscriberbot',\n },\n {\n id: 'subscriberbot-vault',\n label: t('subscriberbot.nav.vault', 'Asset Vault'),\n path: joinPath(basePath, 'vault'),\n icon: <Vault size={20} />,\n order: 9,\n group: 'subscriberbot',\n },\n ];\n\n const cleanup = registerNavItems(navItems);\n return cleanup;\n }, [registerNavItems, basePath, t]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: 'subscriberbot-status',\n label: t('subscriberbot.footer.ready', 'SubscriberBot Ready'),\n type: 'status' as const,\n order: 10,\n section: 'left' as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, t]);\n\n return (\n <QueryClientProvider client={queryClient}>\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <SubscriberBotProvider {...props}>\n <SubscriberBotRoutes />\n </SubscriberBotProvider>\n </FeatureFlagProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { FC } from 'react';
2
+
3
+ export declare const SubscriberBotRoutes: FC;
4
+ //# sourceMappingURL=SubscriberBotRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriberBotRoutes.d.ts","sourceRoot":"","sources":["../../src/subscriberbot/SubscriberBotRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAkB,MAAM,OAAO,CAAC;AAsEhD,eAAO,MAAM,mBAAmB,EAAE,EA4DjC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SubscriberBotRoutes.js","names":[],"sources":["../../src/subscriberbot/SubscriberBotRoutes.tsx"],"sourcesContent":["/**\n * SubscriberBot Routes\n * @module subscriberbot\n *\n * Domain routes for the Subscriber Bot product. The dashboard is eager-loaded\n * (primary landing); all other pages are lazy-loaded.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useSubscriberBot } from './context/SubscriberBotContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Relationships\nconst RelationshipsListPage = lazy(() =>\n import('./pages/relationships/RelationshipsListPage').then((m) => ({\n default: m.RelationshipsListPage,\n }))\n);\nconst RelationshipNewPage = lazy(() =>\n import('./pages/relationships/RelationshipNewPage').then((m) => ({\n default: m.RelationshipNewPage,\n }))\n);\nconst RelationshipDetailPage = lazy(() =>\n import('./pages/relationships/RelationshipDetailPage').then((m) => ({\n default: m.RelationshipDetailPage,\n }))\n);\n\n// Providers\nconst ProvidersListPage = lazy(() =>\n import('./pages/providers/ProvidersListPage').then((m) => ({ default: m.ProvidersListPage }))\n);\nconst ProviderNewPage = lazy(() =>\n import('./pages/providers/ProviderNewPage').then((m) => ({ default: m.ProviderNewPage }))\n);\nconst ProviderDetailPage = lazy(() =>\n import('./pages/providers/ProviderDetailPage').then((m) => ({ default: m.ProviderDetailPage }))\n);\n\n// Inbox / Invoices / Workflows\nconst InboxPage = lazy(() => import('./pages/InboxPage').then((m) => ({ default: m.InboxPage })));\nconst InvoicesPage = lazy(() =>\n import('./pages/InvoicesPage').then((m) => ({ default: m.InvoicesPage }))\n);\nconst WorkflowsPage = lazy(() =>\n import('./pages/WorkflowsPage').then((m) => ({ default: m.WorkflowsPage }))\n);\n\n// Agents\nconst AgentsListPage = lazy(() =>\n import('./pages/agents/AgentsListPage').then((m) => ({ default: m.AgentsListPage }))\n);\nconst AgentNewPage = lazy(() =>\n import('./pages/agents/AgentNewPage').then((m) => ({ default: m.AgentNewPage }))\n);\nconst AgentDetailPage = lazy(() =>\n import('./pages/agents/AgentDetailPage').then((m) => ({ default: m.AgentDetailPage }))\n);\n\n// Insights + Asset Vault (aggregated real data)\nconst InsightsPage = lazy(() => import('./pages/InsightsPage').then((m) => ({ default: m.InsightsPage })));\nconst AssetVaultPage = lazy(() =>\n import('./pages/AssetVaultPage').then((m) => ({ default: m.AssetVaultPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const SubscriberBotRoutes: FC = () => {\n const { basePath, isStandalone } = useSubscriberBot();\n const location = useLocation();\n\n // Normalize base path\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview / dashboard */}\n <Route index element={<DashboardPage />} />\n\n {/* Relationships (the core domain) */}\n <Route path=\"relationships\" element={<RelationshipsListPage />} />\n <Route path=\"relationships/new\" element={<RelationshipNewPage />} />\n <Route path=\"relationships/:id\" element={<RelationshipDetailPage />} />\n\n {/* Providers (registry) */}\n <Route path=\"providers\" element={<ProvidersListPage />} />\n <Route path=\"providers/new\" element={<ProviderNewPage />} />\n <Route path=\"providers/:id\" element={<ProviderDetailPage />} />\n\n {/* Universal Inbox */}\n <Route path=\"inbox\" element={<InboxPage />} />\n\n {/* Invoices */}\n <Route path=\"invoices\" element={<InvoicesPage />} />\n\n {/* Insights (spend analytics + renewal forecast) */}\n <Route path=\"insights\" element={<InsightsPage />} />\n\n {/* Digital Asset Vault */}\n <Route path=\"vault\" element={<AssetVaultPage />} />\n\n {/* AI Agents */}\n <Route path=\"agents\" element={<AgentsListPage />} />\n <Route path=\"agents/new\" element={<AgentNewPage />} />\n <Route path=\"agents/:id\" element={<AgentDetailPage />} />\n\n {/* Workflows */}\n <Route path=\"workflows\" element={<WorkflowsPage />} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAiBA,IAAM,IAAwB,QAC5B,OAAO,kDAA+C,MAAM,OAAO,EACjE,SAAS,EAAE,uBACZ,EAAE,CACJ,EACK,IAAsB,QAC1B,OAAO,gDAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,qBACZ,EAAE,CACJ,EACK,IAAyB,QAC7B,OAAO,mDAAgD,MAAM,OAAO,EAClE,SAAS,EAAE,wBACZ,EAAE,CACJ,EAGK,IAAoB,QACxB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAC9F,EACK,IAAkB,QACtB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC1F,EACK,IAAqB,QACzB,OAAO,2CAAwC,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAChG,EAGK,IAAY,QAAW,OAAO,wBAAqB,MAAM,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAC3F,IAAe,QACnB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAC1E,EACK,IAAgB,QACpB,OAAO,4BAAyB,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAC5E,EAGK,IAAiB,QACrB,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CACrF,EACK,IAAe,QACnB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CACjF,EACK,IAAkB,QACtB,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CACvF,EAGK,IAAe,QAAW,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,EACpG,IAAiB,QACrB,OAAO,6BAA0B,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAC9E,EAEK,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,GAAD,EAAS,MAAK,MAAO,CAAA;CACjB,CAAA,EAGK,UAAgC;CAC3C,IAAM,EAAE,aAAU,oBAAiB,GAAkB,EAC/C,IAAW,GAAa,EAGxB,IAAqB,MAAa,MAAM,MAAM,KAAY,IAAI,QAAQ,OAAO,GAAG;AAYtF,QATI,KAAsB,CAAC,KAIrB,EAFF,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,IAAI,IAE/C,OAKT,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;aAChC,kBAAC,GAAD,EAAA,UAAA;IAEE,kBAAC,GAAD;KAAO,OAAA;KAAM,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAG3C,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAyB,CAAA;KAAI,CAAA;IAClE,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAAuB,CAAA;KAAI,CAAA;IACpE,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAA0B,CAAA;KAAI,CAAA;IAGvE,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,EAAqB,CAAA;KAAI,CAAA;IAC1D,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAC5D,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAsB,CAAA;KAAI,CAAA;IAG/D,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,EAAa,CAAA;KAAI,CAAA;IAG9C,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IAGpD,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IAGpD,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,EAAkB,CAAA;KAAI,CAAA;IAGnD,kBAAC,GAAD;KAAO,MAAK;KAAS,SAAS,kBAAC,GAAD,EAAkB,CAAA;KAAI,CAAA;IACpD,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IACtD,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAGzD,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAGtD,kBAAC,GAAD;KAAO,MAAK;KAAI,SAAS,kBAAC,GAAD;MAAU,IAAG;MAAG,SAAA;MAAU,CAAA;KAAI,CAAA;IAChD,EAAA,CAAA;GACA,CAAA;EACP,CAAA"}
1
+ {"version":3,"file":"SubscriberBotRoutes.js","names":[],"sources":["../../src/subscriberbot/SubscriberBotRoutes.tsx"],"sourcesContent":["/**\n * SubscriberBot Routes\n * @module subscriberbot\n *\n * Domain routes for the Subscriber Bot product. The dashboard is eager-loaded\n * (primary landing); all other pages are lazy-loaded.\n */\n\nimport { type FC, lazy, Suspense } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router-dom';\nimport { Spinner } from '@burdenoff/fe-libs/ui';\nimport { useSubscriberBot } from './context/SubscriberBotContext';\n\n// Eager — primary landing\nimport { DashboardPage } from './pages/DashboardPage';\n\n// Relationships\nconst RelationshipsListPage = lazy(() =>\n import('./pages/relationships/RelationshipsListPage').then((m) => ({\n default: m.RelationshipsListPage,\n }))\n);\nconst RelationshipNewPage = lazy(() =>\n import('./pages/relationships/RelationshipNewPage').then((m) => ({\n default: m.RelationshipNewPage,\n }))\n);\nconst RelationshipDetailPage = lazy(() =>\n import('./pages/relationships/RelationshipDetailPage').then((m) => ({\n default: m.RelationshipDetailPage,\n }))\n);\n\n// Providers\nconst ProvidersListPage = lazy(() =>\n import('./pages/providers/ProvidersListPage').then((m) => ({ default: m.ProvidersListPage }))\n);\nconst ProviderNewPage = lazy(() =>\n import('./pages/providers/ProviderNewPage').then((m) => ({ default: m.ProviderNewPage }))\n);\nconst ProviderDetailPage = lazy(() =>\n import('./pages/providers/ProviderDetailPage').then((m) => ({ default: m.ProviderDetailPage }))\n);\n\n// Inbox / Invoices / Workflows\nconst InboxPage = lazy(() => import('./pages/InboxPage').then((m) => ({ default: m.InboxPage })));\nconst InvoicesPage = lazy(() =>\n import('./pages/InvoicesPage').then((m) => ({ default: m.InvoicesPage }))\n);\nconst WorkflowsPage = lazy(() =>\n import('./pages/WorkflowsPage').then((m) => ({ default: m.WorkflowsPage }))\n);\n\n// Agents\nconst AgentsListPage = lazy(() =>\n import('./pages/agents/AgentsListPage').then((m) => ({ default: m.AgentsListPage }))\n);\nconst AgentNewPage = lazy(() =>\n import('./pages/agents/AgentNewPage').then((m) => ({ default: m.AgentNewPage }))\n);\nconst AgentDetailPage = lazy(() =>\n import('./pages/agents/AgentDetailPage').then((m) => ({ default: m.AgentDetailPage }))\n);\n\n// Insights + Asset Vault (aggregated real data)\nconst InsightsPage = lazy(() =>\n import('./pages/InsightsPage').then((m) => ({ default: m.InsightsPage }))\n);\nconst AssetVaultPage = lazy(() =>\n import('./pages/AssetVaultPage').then((m) => ({ default: m.AssetVaultPage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n);\n\nexport const SubscriberBotRoutes: FC = () => {\n const { basePath, isStandalone } = useSubscriberBot();\n const location = useLocation();\n\n // Normalize base path\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n // Guard: only render if the current path matches basePath (integrated mode).\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview / dashboard */}\n <Route index element={<DashboardPage />} />\n\n {/* Relationships (the core domain) */}\n <Route path=\"relationships\" element={<RelationshipsListPage />} />\n <Route path=\"relationships/new\" element={<RelationshipNewPage />} />\n <Route path=\"relationships/:id\" element={<RelationshipDetailPage />} />\n\n {/* Providers (registry) */}\n <Route path=\"providers\" element={<ProvidersListPage />} />\n <Route path=\"providers/new\" element={<ProviderNewPage />} />\n <Route path=\"providers/:id\" element={<ProviderDetailPage />} />\n\n {/* Universal Inbox */}\n <Route path=\"inbox\" element={<InboxPage />} />\n\n {/* Invoices */}\n <Route path=\"invoices\" element={<InvoicesPage />} />\n\n {/* Insights (spend analytics + renewal forecast) */}\n <Route path=\"insights\" element={<InsightsPage />} />\n\n {/* Digital Asset Vault */}\n <Route path=\"vault\" element={<AssetVaultPage />} />\n\n {/* AI Agents */}\n <Route path=\"agents\" element={<AgentsListPage />} />\n <Route path=\"agents/new\" element={<AgentNewPage />} />\n <Route path=\"agents/:id\" element={<AgentDetailPage />} />\n\n {/* Workflows */}\n <Route path=\"workflows\" element={<WorkflowsPage />} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":";;;;;;;AAiBA,IAAM,IAAwB,QAC5B,OAAO,kDAA+C,MAAM,OAAO,EACjE,SAAS,EAAE,uBACZ,EAAE,CACJ,EACK,IAAsB,QAC1B,OAAO,gDAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,qBACZ,EAAE,CACJ,EACK,IAAyB,QAC7B,OAAO,mDAAgD,MAAM,OAAO,EAClE,SAAS,EAAE,wBACZ,EAAE,CACJ,EAGK,IAAoB,QACxB,OAAO,0CAAuC,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAC9F,EACK,IAAkB,QACtB,OAAO,wCAAqC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAC1F,EACK,IAAqB,QACzB,OAAO,2CAAwC,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAChG,EAGK,IAAY,QAAW,OAAO,wBAAqB,MAAM,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAC3F,IAAe,QACnB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAC1E,EACK,IAAgB,QACpB,OAAO,4BAAyB,MAAM,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAC5E,EAGK,IAAiB,QACrB,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CACrF,EACK,IAAe,QACnB,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CACjF,EACK,IAAkB,QACtB,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CACvF,EAGK,IAAe,QACnB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAC1E,EACK,IAAiB,QACrB,OAAO,6BAA0B,MAAM,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAC9E,EAEK,UACJ,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,GAAD,EAAS,MAAK,MAAO,CAAA;CACjB,CAAA,EAGK,UAAgC;CAC3C,IAAM,EAAE,aAAU,oBAAiB,GAAkB,EAC/C,IAAW,GAAa,EAGxB,IAAqB,MAAa,MAAM,MAAM,KAAY,IAAI,QAAQ,OAAO,GAAG;AAYtF,QATI,KAAsB,CAAC,KAIrB,EAFF,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,IAAI,IAE/C,OAKT,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GAAU,UAAU,kBAAC,GAAD,EAAc,CAAA;aAChC,kBAAC,GAAD,EAAA,UAAA;IAEE,kBAAC,GAAD;KAAO,OAAA;KAAM,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAG3C,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAyB,CAAA;KAAI,CAAA;IAClE,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAAuB,CAAA;KAAI,CAAA;IACpE,kBAAC,GAAD;KAAO,MAAK;KAAoB,SAAS,kBAAC,GAAD,EAA0B,CAAA;KAAI,CAAA;IAGvE,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,EAAqB,CAAA;KAAI,CAAA;IAC1D,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAC5D,kBAAC,GAAD;KAAO,MAAK;KAAgB,SAAS,kBAAC,GAAD,EAAsB,CAAA;KAAI,CAAA;IAG/D,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,EAAa,CAAA;KAAI,CAAA;IAG9C,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IAGpD,kBAAC,GAAD;KAAO,MAAK;KAAW,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IAGpD,kBAAC,GAAD;KAAO,MAAK;KAAQ,SAAS,kBAAC,GAAD,EAAkB,CAAA;KAAI,CAAA;IAGnD,kBAAC,GAAD;KAAO,MAAK;KAAS,SAAS,kBAAC,GAAD,EAAkB,CAAA;KAAI,CAAA;IACpD,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,EAAgB,CAAA;KAAI,CAAA;IACtD,kBAAC,GAAD;KAAO,MAAK;KAAa,SAAS,kBAAC,GAAD,EAAmB,CAAA;KAAI,CAAA;IAGzD,kBAAC,GAAD;KAAO,MAAK;KAAY,SAAS,kBAAC,GAAD,EAAiB,CAAA;KAAI,CAAA;IAGtD,kBAAC,GAAD;KAAO,MAAK;KAAI,SAAS,kBAAC,GAAD;MAAU,IAAG;MAAG,SAAA;MAAU,CAAA;KAAI,CAAA;IAChD,EAAA,CAAA;GACA,CAAA;EACP,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ interface EmptyStateProps {
4
+ icon?: ReactNode;
5
+ /**
6
+ * On-brand illustration name → `/illustrations/<name>.webp`. Standard names:
7
+ * empty-data, empty-search, empty-files, empty-people, empty-notifications,
8
+ * onboarding, empty-generic.
9
+ */
10
+ illustration?: string;
11
+ title: string;
12
+ description?: string;
13
+ action?: ReactNode;
14
+ className?: string;
15
+ }
16
+ export declare const EmptyState: FC<EmptyStateProps>;
17
+ export {};
18
+ //# sourceMappingURL=EmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/EmptyState.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,eAAe;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA8B1C,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { TrendDirection } from '../types';
3
+
4
+ interface MetricsCardProps {
5
+ icon: ReactNode;
6
+ value: string | number;
7
+ label: string;
8
+ trend?: TrendDirection;
9
+ trendValue?: string;
10
+ className?: string;
11
+ /** Render as the page's hero metric (glass treatment + accent glow). */
12
+ featured?: boolean;
13
+ }
14
+ export declare const MetricsCard: FC<MetricsCardProps>;
15
+ export {};
16
+ //# sourceMappingURL=MetricsCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsCard.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/MetricsCard.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,UAAU,gBAAgB;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAQD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAiC5C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ interface ModalProps {
4
+ title: string;
5
+ description?: string;
6
+ onClose: () => void;
7
+ children: ReactNode;
8
+ /** Constrain width. Defaults to a comfortable single-column form width. */
9
+ maxWidthClassName?: string;
10
+ }
11
+ export declare const Modal: FC<ModalProps>;
12
+ export {};
13
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/Modal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAA4B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1E,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,UAAU,CAgEhC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ interface PageLayoutProps {
4
+ title: ReactNode;
5
+ description?: string;
6
+ actions?: ReactNode;
7
+ children: ReactNode;
8
+ className?: string;
9
+ /**
10
+ * Render the title as a gradient hero heading (Boff UI 2.0). Reserve for the
11
+ * ONE primary page of the MFE so it stays a hero accent, never body copy.
12
+ */
13
+ titleGradient?: boolean;
14
+ /**
15
+ * Drop a subtle living-glass {@link AuroraBackground} behind the header.
16
+ * Use on the MFE's primary page only (one aurora per MFE). Sits at -z-10 and
17
+ * never moves content; auto-static under reduced motion.
18
+ */
19
+ aurora?: boolean;
20
+ }
21
+ export declare const PageLayout: FC<PageLayoutProps>;
22
+ export {};
23
+ //# sourceMappingURL=PageLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/PageLayout.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,eAAe;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAqC1C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ interface LoadingViewProps {
4
+ label?: string;
5
+ className?: string;
6
+ }
7
+ export declare const LoadingView: FC<LoadingViewProps>;
8
+ interface ErrorViewProps {
9
+ title?: string;
10
+ message?: string;
11
+ onRetry?: () => void;
12
+ className?: string;
13
+ }
14
+ export declare const ErrorView: FC<ErrorViewProps>;
15
+ interface SectionProps {
16
+ title: string;
17
+ description?: string;
18
+ action?: ReactNode;
19
+ children: ReactNode;
20
+ className?: string;
21
+ }
22
+ export declare const Section: FC<SectionProps>;
23
+ export {};
24
+ //# sourceMappingURL=StateViews.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateViews.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/StateViews.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,gBAAgB;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAK5C,CAAC;AAEF,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CA2BxC,CAAC;AAEF,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAWpC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+
3
+ interface StatusBadgeProps {
4
+ status: string;
5
+ className?: string;
6
+ }
7
+ export declare const StatusBadge: FC<StatusBadgeProps>;
8
+ export {};
9
+ //# sourceMappingURL=StatusBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAIhC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuDD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAsB5C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Components Index
3
+ * @module subscriberbot/components
4
+ */
5
+ export { PageLayout } from './PageLayout';
6
+ export { MetricsCard } from './MetricsCard';
7
+ export { StatusBadge } from './StatusBadge';
8
+ export { EmptyState } from './EmptyState';
9
+ export { Modal } from './Modal';
10
+ export { LoadingView, ErrorView, Section } from './StateViews';
11
+ export { Donut, Legend, BarList, Sparkline, Gauge, Timeline, MiniProgress, CHART_COLORS, } from './viz';
12
+ export type { Segment, TimelineItem } from './viz';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EACL,KAAK,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ /** Categorical palette — fe-libs chart tokens. */
4
+ export declare const CHART_COLORS: readonly ["var(--color-chart-1)", "var(--color-chart-2)", "var(--color-chart-3)", "var(--color-chart-4)", "var(--color-chart-5)", "var(--color-chart-6)", "var(--color-chart-7)", "var(--color-chart-8)"];
5
+ export interface Segment {
6
+ label: string;
7
+ value: number;
8
+ color?: string;
9
+ }
10
+ export declare const Donut: FC<{
11
+ data: Segment[];
12
+ size?: number;
13
+ thickness?: number;
14
+ centerLabel?: string;
15
+ centerSub?: string;
16
+ className?: string;
17
+ }>;
18
+ export declare const Legend: FC<{
19
+ data: Segment[];
20
+ valueFormat?: (n: number) => string;
21
+ className?: string;
22
+ }>;
23
+ export declare const BarList: FC<{
24
+ data: Segment[];
25
+ valueFormat?: (n: number) => string;
26
+ className?: string;
27
+ }>;
28
+ export declare const Sparkline: FC<{
29
+ points: number[];
30
+ width?: number;
31
+ height?: number;
32
+ positive?: boolean;
33
+ className?: string;
34
+ }>;
35
+ export declare const Gauge: FC<{
36
+ value: number;
37
+ max?: number;
38
+ size?: number;
39
+ label?: string;
40
+ className?: string;
41
+ }>;
42
+ export interface TimelineItem {
43
+ title: string;
44
+ sub?: string;
45
+ meta?: ReactNode;
46
+ tone?: 'default' | 'positive' | 'warning' | 'muted';
47
+ }
48
+ export declare const Timeline: FC<{
49
+ items: TimelineItem[];
50
+ className?: string;
51
+ }>;
52
+ export declare const MiniProgress: FC<{
53
+ value: number;
54
+ max?: number;
55
+ tone?: 'accent' | 'positive' | 'warning' | 'negative';
56
+ className?: string;
57
+ }>;
58
+ //# sourceMappingURL=viz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viz.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/components/viz.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAG3C,kDAAkD;AAClD,eAAO,MAAM,YAAY,2MASf,CAAC;AAQX,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CA8DA,CAAC;AAKF,eAAO,MAAM,MAAM,EAAE,EAAE,CAAC;IACtB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAgBA,CAAC;AAKF,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC;IACvB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAyBA,CAAC;AAKF,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAiCA,CAAC;AAKF,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAwCA,CAAC;AAKF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;CACrD;AAOD,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAqBtE,CAAC;AAKF,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAyBA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"viz.js","names":[],"sources":["../../../src/subscriberbot/components/viz.tsx"],"sourcesContent":["/**\n * Tokenized, responsive SVG visualization primitives.\n * @module subscriberbot/components/viz\n *\n * Every color is a fe-libs semantic CSS variable (never a raw hex), so charts\n * theme automatically in light/dark and per-product themes. All charts scale to\n * their container (SVG viewBox) and carry an accessible role/label.\n */\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/** Categorical palette — fe-libs chart tokens. */\nexport const CHART_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n 'var(--color-chart-6)',\n 'var(--color-chart-7)',\n 'var(--color-chart-8)',\n] as const;\n\nconst POSITIVE = 'var(--color-chart-positive)';\nconst NEGATIVE = 'var(--color-chart-negative)';\nconst GRID = 'var(--color-chart-grid)';\nconst WARN = 'var(--color-status-warning-text)';\nconst SUCCESS = 'var(--color-status-success-text)';\n\nexport interface Segment {\n label: string;\n value: number;\n color?: string;\n}\n\nconst colorAt = (i: number, override?: string) => override ?? CHART_COLORS[i % CHART_COLORS.length];\n\n// ---------------------------------------------------------------------------\n// Donut — proportional ring with an optional center label.\n// ---------------------------------------------------------------------------\nexport const Donut: FC<{\n data: Segment[];\n size?: number;\n thickness?: number;\n centerLabel?: string;\n centerSub?: string;\n className?: string;\n}> = ({ data, size = 160, thickness = 18, centerLabel, centerSub, className }) => {\n const total = data.reduce((s, d) => s + Math.max(0, d.value), 0);\n const r = (size - thickness) / 2;\n const c = 2 * Math.PI * r;\n const cx = size / 2;\n let offset = 0;\n const label = data.map((d) => `${d.label}: ${d.value}`).join(', ');\n\n return (\n <div className={cn('relative inline-flex items-center justify-center', className)}>\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"img\"\n aria-label={`Donut chart. ${label}`}\n className=\"max-w-full\"\n >\n <circle cx={cx} cy={cx} r={r} fill=\"none\" stroke={GRID} strokeWidth={thickness} opacity={0.4} />\n {total > 0 &&\n data.map((d, i) => {\n const frac = Math.max(0, d.value) / total;\n const len = frac * c;\n const seg = (\n <circle\n key={i}\n cx={cx}\n cy={cx}\n r={r}\n fill=\"none\"\n stroke={colorAt(i, d.color)}\n strokeWidth={thickness}\n strokeDasharray={`${len} ${c - len}`}\n strokeDashoffset={-offset}\n strokeLinecap=\"butt\"\n transform={`rotate(-90 ${cx} ${cx})`}\n />\n );\n offset += len;\n return seg;\n })}\n </svg>\n {(centerLabel || centerSub) && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\n {centerLabel && (\n <span className=\"text-xl font-bold text-text-primary tabular-nums leading-none\">{centerLabel}</span>\n )}\n {centerSub && <span className=\"mt-1 text-xs text-text-secondary\">{centerSub}</span>}\n </div>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Legend — pairs with Donut / charts.\n// ---------------------------------------------------------------------------\nexport const Legend: FC<{ data: Segment[]; valueFormat?: (n: number) => string; className?: string }> = ({\n data,\n valueFormat,\n className,\n}) => (\n <ul className={cn('space-y-2', className)}>\n {data.map((d, i) => (\n <li key={i} className=\"flex items-center gap-2 text-sm\">\n <span\n className=\"h-2.5 w-2.5 shrink-0 rounded-full\"\n style={{ backgroundColor: colorAt(i, d.color) }}\n aria-hidden\n />\n <span className=\"flex-1 truncate text-text-secondary\">{d.label}</span>\n <span className=\"font-medium text-text-primary tabular-nums\">\n {valueFormat ? valueFormat(d.value) : d.value}\n </span>\n </li>\n ))}\n </ul>\n);\n\n// ---------------------------------------------------------------------------\n// BarList — horizontal labelled bars (e.g. spend by category).\n// ---------------------------------------------------------------------------\nexport const BarList: FC<{\n data: Segment[];\n valueFormat?: (n: number) => string;\n className?: string;\n}> = ({ data, valueFormat, className }) => {\n const max = Math.max(1, ...data.map((d) => d.value));\n return (\n <ul className={cn('space-y-3', className)} role=\"img\" aria-label=\"Bar chart\">\n {data.map((d, i) => (\n <li key={i}>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"truncate text-text-secondary\">{d.label}</span>\n <span className=\"font-medium text-text-primary tabular-nums\">\n {valueFormat ? valueFormat(d.value) : d.value}\n </span>\n </div>\n <div className=\"mt-1.5 h-2 w-full overflow-hidden rounded-full\" style={{ backgroundColor: GRID }}>\n <div\n className=\"h-full rounded-full transition-all\"\n style={{ width: `${(d.value / max) * 100}%`, backgroundColor: colorAt(i, d.color) }}\n />\n </div>\n </li>\n ))}\n </ul>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Sparkline / area — small trend line.\n// ---------------------------------------------------------------------------\nexport const Sparkline: FC<{\n points: number[];\n width?: number;\n height?: number;\n positive?: boolean;\n className?: string;\n}> = ({ points, width = 220, height = 56, positive = true, className }) => {\n if (points.length < 2) return null;\n const max = Math.max(...points);\n const min = Math.min(...points);\n const span = max - min || 1;\n const stroke = positive ? POSITIVE : NEGATIVE;\n const step = width / (points.length - 1);\n const coords = points.map((p, i) => [i * step, height - ((p - min) / span) * (height - 8) - 4]);\n const line = coords.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ');\n const area = `${line} L${width},${height} L0,${height} Z`;\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label=\"Trend sparkline\"\n className={cn('max-w-full', className)}\n preserveAspectRatio=\"none\"\n >\n <path d={area} fill={stroke} opacity={0.12} />\n <path d={line} fill=\"none\" stroke={stroke} strokeWidth={2} strokeLinejoin=\"round\" strokeLinecap=\"round\" />\n </svg>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Gauge — 0..max semicircle (e.g. health score).\n// ---------------------------------------------------------------------------\nexport const Gauge: FC<{\n value: number;\n max?: number;\n size?: number;\n label?: string;\n className?: string;\n}> = ({ value, max = 100, size = 120, label, className }) => {\n const pct = Math.max(0, Math.min(1, value / max));\n const r = size / 2 - 10;\n const cy = size / 2;\n const circ = Math.PI * r; // half circle\n const tone = pct >= 0.66 ? SUCCESS : pct >= 0.33 ? WARN : NEGATIVE;\n return (\n <div className={cn('inline-flex flex-col items-center', className)}>\n <svg\n width={size}\n height={size / 2 + 8}\n viewBox={`0 0 ${size} ${size / 2 + 8}`}\n role=\"img\"\n aria-label={`Gauge: ${Math.round(pct * 100)} percent`}\n className=\"max-w-full\"\n >\n <path\n d={`M10 ${cy} A ${r} ${r} 0 0 1 ${size - 10} ${cy}`}\n fill=\"none\"\n stroke={GRID}\n strokeWidth={10}\n strokeLinecap=\"round\"\n />\n <path\n d={`M10 ${cy} A ${r} ${r} 0 0 1 ${size - 10} ${cy}`}\n fill=\"none\"\n stroke={tone}\n strokeWidth={10}\n strokeLinecap=\"round\"\n strokeDasharray={`${pct * circ} ${circ}`}\n />\n </svg>\n <div className=\"-mt-4 text-center\">\n <span className=\"text-lg font-bold text-text-primary tabular-nums\">{Math.round(value)}</span>\n {label && <p className=\"text-xs text-text-secondary\">{label}</p>}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Timeline — vertical events with a connector rail (e.g. renewals).\n// ---------------------------------------------------------------------------\nexport interface TimelineItem {\n title: string;\n sub?: string;\n meta?: ReactNode;\n tone?: 'default' | 'positive' | 'warning' | 'muted';\n}\nconst dotTone: Record<NonNullable<TimelineItem['tone']>, string> = {\n default: 'var(--color-accent-indigo)',\n positive: SUCCESS,\n warning: WARN,\n muted: 'var(--color-text-secondary)',\n};\nexport const Timeline: FC<{ items: TimelineItem[]; className?: string }> = ({ items, className }) => (\n <ol className={cn('relative space-y-5 pl-6', className)}>\n <span className=\"absolute left-[7px] top-1 bottom-1 w-px bg-border-subtle\" aria-hidden />\n {items.map((it, i) => (\n <li key={i} className=\"relative\">\n <span\n className=\"absolute -left-[22px] top-1 h-3 w-3 rounded-full ring-4 ring-bg-surface\"\n style={{ backgroundColor: dotTone[it.tone ?? 'default'] }}\n aria-hidden\n />\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">{it.title}</p>\n {it.meta && <span className=\"text-sm tabular-nums text-text-primary\">{it.meta}</span>}\n </div>\n {it.sub && <p className=\"text-xs text-text-secondary\">{it.sub}</p>}\n </li>\n ))}\n </ol>\n);\n\n// ---------------------------------------------------------------------------\n// MiniProgress — inline utilization bar (e.g. seats used).\n// ---------------------------------------------------------------------------\nexport const MiniProgress: FC<{\n value: number;\n max?: number;\n tone?: 'accent' | 'positive' | 'warning' | 'negative';\n className?: string;\n}> = ({ value, max = 100, tone = 'accent', className }) => {\n const pct = Math.max(0, Math.min(1, max ? value / max : 0));\n const color =\n tone === 'positive' ? SUCCESS : tone === 'warning' ? WARN : tone === 'negative' ? NEGATIVE : 'var(--color-accent-indigo)';\n return (\n <div\n className={cn('h-2 w-full overflow-hidden rounded-full', className)}\n style={{ backgroundColor: GRID }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div className=\"h-full rounded-full transition-all\" style={{ width: `${pct * 100}%`, backgroundColor: color }} />\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"viz.js","names":[],"sources":["../../../src/subscriberbot/components/viz.tsx"],"sourcesContent":["/**\n * Tokenized, responsive SVG visualization primitives.\n * @module subscriberbot/components/viz\n *\n * Every color is a fe-libs semantic CSS variable (never a raw hex), so charts\n * theme automatically in light/dark and per-product themes. All charts scale to\n * their container (SVG viewBox) and carry an accessible role/label.\n */\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\n/** Categorical palette — fe-libs chart tokens. */\nexport const CHART_COLORS = [\n 'var(--color-chart-1)',\n 'var(--color-chart-2)',\n 'var(--color-chart-3)',\n 'var(--color-chart-4)',\n 'var(--color-chart-5)',\n 'var(--color-chart-6)',\n 'var(--color-chart-7)',\n 'var(--color-chart-8)',\n] as const;\n\nconst POSITIVE = 'var(--color-chart-positive)';\nconst NEGATIVE = 'var(--color-chart-negative)';\nconst GRID = 'var(--color-chart-grid)';\nconst WARN = 'var(--color-status-warning-text)';\nconst SUCCESS = 'var(--color-status-success-text)';\n\nexport interface Segment {\n label: string;\n value: number;\n color?: string;\n}\n\nconst colorAt = (i: number, override?: string) => override ?? CHART_COLORS[i % CHART_COLORS.length];\n\n// ---------------------------------------------------------------------------\n// Donut — proportional ring with an optional center label.\n// ---------------------------------------------------------------------------\nexport const Donut: FC<{\n data: Segment[];\n size?: number;\n thickness?: number;\n centerLabel?: string;\n centerSub?: string;\n className?: string;\n}> = ({ data, size = 160, thickness = 18, centerLabel, centerSub, className }) => {\n const total = data.reduce((s, d) => s + Math.max(0, d.value), 0);\n const r = (size - thickness) / 2;\n const c = 2 * Math.PI * r;\n const cx = size / 2;\n let offset = 0;\n const label = data.map((d) => `${d.label}: ${d.value}`).join(', ');\n\n return (\n <div className={cn('relative inline-flex items-center justify-center', className)}>\n <svg\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n role=\"img\"\n aria-label={`Donut chart. ${label}`}\n className=\"max-w-full\"\n >\n <circle\n cx={cx}\n cy={cx}\n r={r}\n fill=\"none\"\n stroke={GRID}\n strokeWidth={thickness}\n opacity={0.4}\n />\n {total > 0 &&\n data.map((d, i) => {\n const frac = Math.max(0, d.value) / total;\n const len = frac * c;\n const seg = (\n <circle\n key={i}\n cx={cx}\n cy={cx}\n r={r}\n fill=\"none\"\n stroke={colorAt(i, d.color)}\n strokeWidth={thickness}\n strokeDasharray={`${len} ${c - len}`}\n strokeDashoffset={-offset}\n strokeLinecap=\"butt\"\n transform={`rotate(-90 ${cx} ${cx})`}\n />\n );\n offset += len;\n return seg;\n })}\n </svg>\n {(centerLabel || centerSub) && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center text-center\">\n {centerLabel && (\n <span className=\"text-xl font-bold text-text-primary tabular-nums leading-none\">\n {centerLabel}\n </span>\n )}\n {centerSub && <span className=\"mt-1 text-xs text-text-secondary\">{centerSub}</span>}\n </div>\n )}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Legend — pairs with Donut / charts.\n// ---------------------------------------------------------------------------\nexport const Legend: FC<{\n data: Segment[];\n valueFormat?: (n: number) => string;\n className?: string;\n}> = ({ data, valueFormat, className }) => (\n <ul className={cn('space-y-2', className)}>\n {data.map((d, i) => (\n <li key={i} className=\"flex items-center gap-2 text-sm\">\n <span\n className=\"h-2.5 w-2.5 shrink-0 rounded-full\"\n style={{ backgroundColor: colorAt(i, d.color) }}\n aria-hidden\n />\n <span className=\"flex-1 truncate text-text-secondary\">{d.label}</span>\n <span className=\"font-medium text-text-primary tabular-nums\">\n {valueFormat ? valueFormat(d.value) : d.value}\n </span>\n </li>\n ))}\n </ul>\n);\n\n// ---------------------------------------------------------------------------\n// BarList — horizontal labelled bars (e.g. spend by category).\n// ---------------------------------------------------------------------------\nexport const BarList: FC<{\n data: Segment[];\n valueFormat?: (n: number) => string;\n className?: string;\n}> = ({ data, valueFormat, className }) => {\n const max = Math.max(1, ...data.map((d) => d.value));\n return (\n <ul className={cn('space-y-3', className)} role=\"img\" aria-label=\"Bar chart\">\n {data.map((d, i) => (\n <li key={i}>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"truncate text-text-secondary\">{d.label}</span>\n <span className=\"font-medium text-text-primary tabular-nums\">\n {valueFormat ? valueFormat(d.value) : d.value}\n </span>\n </div>\n <div\n className=\"mt-1.5 h-2 w-full overflow-hidden rounded-full\"\n style={{ backgroundColor: GRID }}\n >\n <div\n className=\"h-full rounded-full transition-all\"\n style={{ width: `${(d.value / max) * 100}%`, backgroundColor: colorAt(i, d.color) }}\n />\n </div>\n </li>\n ))}\n </ul>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Sparkline / area — small trend line.\n// ---------------------------------------------------------------------------\nexport const Sparkline: FC<{\n points: number[];\n width?: number;\n height?: number;\n positive?: boolean;\n className?: string;\n}> = ({ points, width = 220, height = 56, positive = true, className }) => {\n if (points.length < 2) return null;\n const max = Math.max(...points);\n const min = Math.min(...points);\n const span = max - min || 1;\n const stroke = positive ? POSITIVE : NEGATIVE;\n const step = width / (points.length - 1);\n const coords = points.map((p, i) => [i * step, height - ((p - min) / span) * (height - 8) - 4]);\n const line = coords\n .map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`)\n .join(' ');\n const area = `${line} L${width},${height} L0,${height} Z`;\n return (\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role=\"img\"\n aria-label=\"Trend sparkline\"\n className={cn('max-w-full', className)}\n preserveAspectRatio=\"none\"\n >\n <path d={area} fill={stroke} opacity={0.12} />\n <path\n d={line}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Gauge — 0..max semicircle (e.g. health score).\n// ---------------------------------------------------------------------------\nexport const Gauge: FC<{\n value: number;\n max?: number;\n size?: number;\n label?: string;\n className?: string;\n}> = ({ value, max = 100, size = 120, label, className }) => {\n const pct = Math.max(0, Math.min(1, value / max));\n const r = size / 2 - 10;\n const cy = size / 2;\n const circ = Math.PI * r; // half circle\n const tone = pct >= 0.66 ? SUCCESS : pct >= 0.33 ? WARN : NEGATIVE;\n return (\n <div className={cn('inline-flex flex-col items-center', className)}>\n <svg\n width={size}\n height={size / 2 + 8}\n viewBox={`0 0 ${size} ${size / 2 + 8}`}\n role=\"img\"\n aria-label={`Gauge: ${Math.round(pct * 100)} percent`}\n className=\"max-w-full\"\n >\n <path\n d={`M10 ${cy} A ${r} ${r} 0 0 1 ${size - 10} ${cy}`}\n fill=\"none\"\n stroke={GRID}\n strokeWidth={10}\n strokeLinecap=\"round\"\n />\n <path\n d={`M10 ${cy} A ${r} ${r} 0 0 1 ${size - 10} ${cy}`}\n fill=\"none\"\n stroke={tone}\n strokeWidth={10}\n strokeLinecap=\"round\"\n strokeDasharray={`${pct * circ} ${circ}`}\n />\n </svg>\n <div className=\"-mt-4 text-center\">\n <span className=\"text-lg font-bold text-text-primary tabular-nums\">\n {Math.round(value)}\n </span>\n {label && <p className=\"text-xs text-text-secondary\">{label}</p>}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Timeline — vertical events with a connector rail (e.g. renewals).\n// ---------------------------------------------------------------------------\nexport interface TimelineItem {\n title: string;\n sub?: string;\n meta?: ReactNode;\n tone?: 'default' | 'positive' | 'warning' | 'muted';\n}\nconst dotTone: Record<NonNullable<TimelineItem['tone']>, string> = {\n default: 'var(--color-accent-indigo)',\n positive: SUCCESS,\n warning: WARN,\n muted: 'var(--color-text-secondary)',\n};\nexport const Timeline: FC<{ items: TimelineItem[]; className?: string }> = ({\n items,\n className,\n}) => (\n <ol className={cn('relative space-y-5 pl-6', className)}>\n <span className=\"absolute left-[7px] top-1 bottom-1 w-px bg-border-subtle\" aria-hidden />\n {items.map((it, i) => (\n <li key={i} className=\"relative\">\n <span\n className=\"absolute -left-[22px] top-1 h-3 w-3 rounded-full ring-4 ring-bg-surface\"\n style={{ backgroundColor: dotTone[it.tone ?? 'default'] }}\n aria-hidden\n />\n <div className=\"flex items-baseline justify-between gap-2\">\n <p className=\"text-sm font-medium text-text-primary\">{it.title}</p>\n {it.meta && <span className=\"text-sm tabular-nums text-text-primary\">{it.meta}</span>}\n </div>\n {it.sub && <p className=\"text-xs text-text-secondary\">{it.sub}</p>}\n </li>\n ))}\n </ol>\n);\n\n// ---------------------------------------------------------------------------\n// MiniProgress — inline utilization bar (e.g. seats used).\n// ---------------------------------------------------------------------------\nexport const MiniProgress: FC<{\n value: number;\n max?: number;\n tone?: 'accent' | 'positive' | 'warning' | 'negative';\n className?: string;\n}> = ({ value, max = 100, tone = 'accent', className }) => {\n const pct = Math.max(0, Math.min(1, max ? value / max : 0));\n const color =\n tone === 'positive'\n ? SUCCESS\n : tone === 'warning'\n ? WARN\n : tone === 'negative'\n ? NEGATIVE\n : 'var(--color-accent-indigo)';\n return (\n <div\n className={cn('h-2 w-full overflow-hidden rounded-full', className)}\n style={{ backgroundColor: GRID }}\n role=\"progressbar\"\n aria-valuenow={Math.round(pct * 100)}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full transition-all\"\n style={{ width: `${pct * 100}%`, backgroundColor: color }}\n />\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const ASSISTANT_USECASE_CONFIG: readonly [{
2
+ readonly id: "assistant";
3
+ readonly label: "Assistant";
4
+ readonly description: "Ask questions and run operations on the current Subscriber Bot screen — answers from the docs and makes API calls for you";
5
+ readonly suggestions: readonly ["What can I do on this screen?", "Create a new subscription relationship", "List my recent invoices", "How do providers work?"];
6
+ }, {
7
+ readonly id: "api-calls";
8
+ readonly label: "API Calls";
9
+ readonly description: "Make workspace API calls in context with your credentials";
10
+ readonly suggestions: readonly ["Show me all subscription relationships", "How do I create a provider via the API?", "List invoices using the GraphQL API", "What headers are needed for authentication?"];
11
+ }];
12
+ export type AssistantUsecaseId = (typeof ASSISTANT_USECASE_CONFIG)[number]['id'];
13
+ //# sourceMappingURL=assistantUsecases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantUsecases.d.ts","sourceRoot":"","sources":["../../../src/subscriberbot/config/assistantUsecases.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;;;;;;;;;EAwB3B,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC"}