@sudobility/sider_ui 0.0.3

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 (62) hide show
  1. package/README.md +8 -0
  2. package/dist/components/dashboard/DashboardSidebar.d.ts +2 -0
  3. package/dist/components/dashboard/DashboardSidebar.d.ts.map +1 -0
  4. package/dist/components/dashboard/DashboardSidebar.js +27 -0
  5. package/dist/components/dashboard/DashboardSidebar.js.map +1 -0
  6. package/dist/components/data/DataTable.d.ts +12 -0
  7. package/dist/components/data/DataTable.d.ts.map +1 -0
  8. package/dist/components/data/DataTable.js +5 -0
  9. package/dist/components/data/DataTable.js.map +1 -0
  10. package/dist/components/data/JsonViewer.d.ts +5 -0
  11. package/dist/components/data/JsonViewer.d.ts.map +1 -0
  12. package/dist/components/data/JsonViewer.js +9 -0
  13. package/dist/components/data/JsonViewer.js.map +1 -0
  14. package/dist/components/data/secretSegments.d.ts +5 -0
  15. package/dist/components/data/secretSegments.d.ts.map +1 -0
  16. package/dist/components/data/secretSegments.js +15 -0
  17. package/dist/components/data/secretSegments.js.map +1 -0
  18. package/dist/components/states/index.d.ts +14 -0
  19. package/dist/components/states/index.d.ts.map +1 -0
  20. package/dist/components/states/index.js +25 -0
  21. package/dist/components/states/index.js.map +1 -0
  22. package/dist/context/config.d.ts +29 -0
  23. package/dist/context/config.d.ts.map +1 -0
  24. package/dist/context/config.js +22 -0
  25. package/dist/context/config.js.map +1 -0
  26. package/dist/context/routing.d.ts +35 -0
  27. package/dist/context/routing.d.ts.map +1 -0
  28. package/dist/context/routing.js +27 -0
  29. package/dist/context/routing.js.map +1 -0
  30. package/dist/index.d.ts +15 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +15 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/pages/CaptureBatchDetailPage.d.ts +2 -0
  35. package/dist/pages/CaptureBatchDetailPage.d.ts.map +1 -0
  36. package/dist/pages/CaptureBatchDetailPage.js +24 -0
  37. package/dist/pages/CaptureBatchDetailPage.js.map +1 -0
  38. package/dist/pages/CaptureBatchesPage.d.ts +2 -0
  39. package/dist/pages/CaptureBatchesPage.d.ts.map +1 -0
  40. package/dist/pages/CaptureBatchesPage.js +26 -0
  41. package/dist/pages/CaptureBatchesPage.js.map +1 -0
  42. package/dist/pages/DashboardOverview.d.ts +2 -0
  43. package/dist/pages/DashboardOverview.d.ts.map +1 -0
  44. package/dist/pages/DashboardOverview.js +43 -0
  45. package/dist/pages/DashboardOverview.js.map +1 -0
  46. package/dist/pages/MyToolsPage.d.ts +2 -0
  47. package/dist/pages/MyToolsPage.d.ts.map +1 -0
  48. package/dist/pages/MyToolsPage.js +30 -0
  49. package/dist/pages/MyToolsPage.js.map +1 -0
  50. package/dist/pages/SiteDetailPage.d.ts +2 -0
  51. package/dist/pages/SiteDetailPage.d.ts.map +1 -0
  52. package/dist/pages/SiteDetailPage.js +54 -0
  53. package/dist/pages/SiteDetailPage.js.map +1 -0
  54. package/dist/pages/SitesPage.d.ts +2 -0
  55. package/dist/pages/SitesPage.d.ts.map +1 -0
  56. package/dist/pages/SitesPage.js +26 -0
  57. package/dist/pages/SitesPage.js.map +1 -0
  58. package/dist/pages/ToolDetailPage.d.ts +2 -0
  59. package/dist/pages/ToolDetailPage.d.ts.map +1 -0
  60. package/dist/pages/ToolDetailPage.js +20 -0
  61. package/dist/pages/ToolDetailPage.js.map +1 -0
  62. package/package.json +50 -0
package/README.md ADDED
@@ -0,0 +1,8 @@
1
+ # @sudobility/sider_ui
2
+
3
+ Shared Sider dashboard UI. Host apps must:
4
+
5
+ 1. Wrap pages in `<SiderUiProvider networkClient token apiUrl>` and a
6
+ `<RoutingProvider>` fed by their router (see sider_app / sider_extension).
7
+ 2. Add this package to Tailwind content globs:
8
+ `'./node_modules/@sudobility/sider_ui/dist/**/*.js'`
@@ -0,0 +1,2 @@
1
+ export declare function DashboardSidebar(): import("react").JSX.Element;
2
+ //# sourceMappingURL=DashboardSidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/dashboard/DashboardSidebar.tsx"],"names":[],"mappings":"AAOA,wBAAgB,gBAAgB,gCA8C/B"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRoutes, useSiderRouting } from '../../context/routing';
3
+ export function DashboardSidebar() {
4
+ const routes = useRoutes();
5
+ const { pathname, navigate } = useSiderRouting();
6
+ const sections = [
7
+ {
8
+ title: 'My data',
9
+ items: [
10
+ { label: 'Overview', path: routes.home() },
11
+ { label: 'Capture batches', path: routes.captureBatches() },
12
+ { label: 'My tools', path: routes.myTools() },
13
+ ],
14
+ },
15
+ {
16
+ title: 'Registry',
17
+ items: [{ label: 'Sites', path: routes.sites() }],
18
+ },
19
+ ];
20
+ return (_jsx("nav", { className: "flex h-full w-56 flex-col gap-4 border-r border-border bg-card p-3", children: sections.map(section => (_jsxs("div", { children: [_jsx("p", { className: "px-2 pb-1 text-xs font-semibold uppercase text-muted-foreground", children: section.title }), section.items.map(item => {
21
+ const active = pathname.endsWith(item.path);
22
+ return (_jsx("button", { onClick: () => navigate(item.path), className: `block w-full rounded-md px-2 py-1.5 text-left text-sm ${active
23
+ ? 'bg-primary text-primary-foreground'
24
+ : 'text-foreground hover:bg-muted'}`, children: item.label }, item.path));
25
+ })] }, section.title))) }));
26
+ }
27
+ //# sourceMappingURL=DashboardSidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardSidebar.js","sourceRoot":"","sources":["../../../src/components/dashboard/DashboardSidebar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAOnE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAA0C;QACtD;YACE,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE;gBACL,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE;gBAC1C,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,EAAE,EAAE;gBAC3D,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE;aAC9C;SACF;QACD;YACE,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;SAClD;KACF,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,oEAAoE,YAChF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CACvB,0BACE,YAAG,SAAS,EAAC,iEAAiE,YAC3E,OAAO,CAAC,KAAK,GACZ,EACH,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5C,OAAO,CACL,iBAEE,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAClC,SAAS,EAAE,yDACT,MAAM;4BACJ,CAAC,CAAC,oCAAoC;4BACtC,CAAC,CAAC,gCACN,EAAE,YAED,IAAI,CAAC,KAAK,IARN,IAAI,CAAC,IAAI,CASP,CACV,CAAC;gBACJ,CAAC,CAAC,KAnBM,OAAO,CAAC,KAAK,CAoBjB,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface Column<T> {
3
+ key: string;
4
+ header: string;
5
+ render?: (row: T) => ReactNode;
6
+ }
7
+ export declare function DataTable<T extends Record<string, unknown>>({ columns, rows, onRowClick, }: {
8
+ columns: Column<T>[];
9
+ rows: T[];
10
+ onRowClick?: (row: T) => void;
11
+ }): import("react").JSX.Element;
12
+ //# sourceMappingURL=DataTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,MAAM,CAAC,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CAChC;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC3D,OAAO,EACP,IAAI,EACJ,UAAU,GACX,EAAE;IACD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC;CAC/B,+BA+BA"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function DataTable({ columns, rows, onRowClick, }) {
3
+ return (_jsx("div", { className: "overflow-x-auto rounded-lg border border-border", children: _jsxs("table", { className: "w-full text-left text-sm", children: [_jsx("thead", { className: "bg-muted/50 text-xs uppercase text-muted-foreground", children: _jsx("tr", { children: columns.map(c => (_jsx("th", { className: "px-3 py-2 font-medium", children: c.header }, c.key))) }) }), _jsx("tbody", { children: rows.map((row, i) => (_jsx("tr", { onClick: onRowClick ? () => onRowClick(row) : undefined, className: `border-t border-border ${onRowClick ? 'cursor-pointer hover:bg-muted/40' : ''}`, children: columns.map(c => (_jsx("td", { className: "px-3 py-2 text-foreground", children: c.render ? c.render(row) : String(row[c.key] ?? '') }, c.key))) }, i))) })] }) }));
4
+ }
5
+ //# sourceMappingURL=DataTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTable.js","sourceRoot":"","sources":["../../../src/components/data/DataTable.tsx"],"names":[],"mappings":";AAQA,MAAM,UAAU,SAAS,CAAoC,EAC3D,OAAO,EACP,IAAI,EACJ,UAAU,GAKX;IACC,OAAO,CACL,cAAK,SAAS,EAAC,iDAAiD,YAC9D,iBAAO,SAAS,EAAC,0BAA0B,aACzC,gBAAO,SAAS,EAAC,qDAAqD,YACpE,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAChB,aAAgB,SAAS,EAAC,uBAAuB,YAC9C,CAAC,CAAC,MAAM,IADF,CAAC,CAAC,GAAG,CAET,CACN,CAAC,GACC,GACC,EACR,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,aAEE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EACvD,SAAS,EAAE,0BAA0B,UAAU,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,EAAE,YAE1F,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAChB,aAAgB,SAAS,EAAC,2BAA2B,YAClD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAD7C,CAAC,CAAC,GAAG,CAET,CACN,CAAC,IARG,CAAC,CASH,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** Pretty-prints JSON with {{secret:…}} placeholders highlighted. */
2
+ export declare function JsonViewer({ value }: {
3
+ value: unknown;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=JsonViewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonViewer.d.ts","sourceRoot":"","sources":["../../../src/components/data/JsonViewer.tsx"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,+BAgBvD"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { splitSecretSegments } from './secretSegments';
3
+ /** Pretty-prints JSON with {{secret:…}} placeholders highlighted. */
4
+ export function JsonViewer({ value }) {
5
+ const text = typeof value === 'string' ? value : JSON.stringify(value, null, 2);
6
+ const segments = splitSecretSegments(text ?? 'null');
7
+ return (_jsx("pre", { className: "max-h-96 overflow-auto rounded-lg border border-border bg-muted/30 p-3 text-xs leading-5 text-foreground", children: segments.map((s, i) => s.isSecret ? (_jsx("mark", { className: "rounded bg-warning/25 px-0.5 font-semibold text-warning", children: s.text }, i)) : (_jsx("span", { children: s.text }, i))) }));
8
+ }
9
+ //# sourceMappingURL=JsonViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonViewer.js","sourceRoot":"","sources":["../../../src/components/data/JsonViewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,qEAAqE;AACrE,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAsB;IACtD,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACrD,OAAO,CACL,cAAK,SAAS,EAAC,0GAA0G,YACtH,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACX,eAAc,SAAS,EAAC,yDAAyD,YAC9E,CAAC,CAAC,IAAI,IADE,CAAC,CAEL,CACR,CAAC,CAAC,CAAC,CACF,yBAAe,CAAC,CAAC,IAAI,IAAV,CAAC,CAAiB,CAC9B,CACF,GACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function splitSecretSegments(text: string): {
2
+ text: string;
3
+ isSecret: boolean;
4
+ }[];
5
+ //# sourceMappingURL=secretSegments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretSegments.d.ts","sourceRoot":"","sources":["../../../src/components/data/secretSegments.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,EAAE,CAUvF"}
@@ -0,0 +1,15 @@
1
+ const SECRET_RE = /\{\{secret:[^}]+\}\}/g;
2
+ export function splitSecretSegments(text) {
3
+ const out = [];
4
+ let last = 0;
5
+ for (const m of text.matchAll(SECRET_RE)) {
6
+ if (m.index > last)
7
+ out.push({ text: text.slice(last, m.index), isSecret: false });
8
+ out.push({ text: m[0], isSecret: true });
9
+ last = m.index + m[0].length;
10
+ }
11
+ if (last < text.length || out.length === 0)
12
+ out.push({ text: text.slice(last), isSecret: false });
13
+ return out;
14
+ }
15
+ //# sourceMappingURL=secretSegments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretSegments.js","sourceRoot":"","sources":["../../../src/components/data/secretSegments.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,uBAAuB,CAAC;AAE1C,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,GAAG,GAA0C,EAAE,CAAC;IACtD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,KAAM,GAAG,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function LoadingState({ label }: {
2
+ label?: string;
3
+ }): import("react").JSX.Element;
4
+ export declare function EmptyState({ title, hint }: {
5
+ title: string;
6
+ hint?: string;
7
+ }): import("react").JSX.Element;
8
+ export declare function ErrorState({ error }: {
9
+ error: unknown;
10
+ }): import("react").JSX.Element;
11
+ export declare function StatusBadge({ status }: {
12
+ status: string;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/states/index.tsx"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,EAAE,KAAkB,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,+BAEtE;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAO3E;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,+BAOvD;AAYD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAOzD"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function LoadingState({ label = 'Loading…' }) {
3
+ return _jsx("div", { className: "p-6 text-sm text-muted-foreground", children: label });
4
+ }
5
+ export function EmptyState({ title, hint }) {
6
+ return (_jsxs("div", { className: "rounded-lg border border-border bg-card p-8 text-center", children: [_jsx("p", { className: "text-sm font-medium text-foreground", children: title }), hint ? _jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: hint }) : null] }));
7
+ }
8
+ export function ErrorState({ error }) {
9
+ const msg = error instanceof Error ? error.message : String(error);
10
+ return (_jsx("div", { className: "rounded-lg border border-destructive/40 bg-destructive/10 p-4 text-sm text-destructive", children: msg }));
11
+ }
12
+ const STATUS_STYLES = {
13
+ trusted: 'bg-success/15 text-success',
14
+ provisional: 'bg-warning/15 text-warning',
15
+ flagged: 'bg-destructive/15 text-destructive',
16
+ uploaded: 'bg-info/15 text-info',
17
+ distilled: 'bg-success/15 text-success',
18
+ buffering: 'bg-muted text-muted-foreground',
19
+ discarded: 'bg-muted text-muted-foreground',
20
+ };
21
+ export function StatusBadge({ status }) {
22
+ const style = STATUS_STYLES[status] ?? 'bg-muted text-muted-foreground';
23
+ return (_jsx("span", { className: `inline-block rounded-full px-2 py-0.5 text-xs font-medium ${style}`, children: status }));
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/states/index.tsx"],"names":[],"mappings":";AAAA,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,GAAG,UAAU,EAAsB;IACrE,OAAO,cAAK,SAAS,EAAC,mCAAmC,YAAE,KAAK,GAAO,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAoC;IAC1E,OAAO,CACL,eAAK,SAAS,EAAC,yDAAyD,aACtE,YAAG,SAAS,EAAC,qCAAqC,YAAE,KAAK,GAAK,EAC7D,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,oCAAoC,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,IACvE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAsB;IACtD,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,CACL,cAAK,SAAS,EAAC,wFAAwF,YACpG,GAAG,GACA,CACP,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,OAAO,EAAE,4BAA4B;IACrC,WAAW,EAAE,4BAA4B;IACzC,OAAO,EAAE,oCAAoC;IAC7C,QAAQ,EAAE,sBAAsB;IAChC,SAAS,EAAE,4BAA4B;IACvC,SAAS,EAAE,gCAAgC;IAC3C,SAAS,EAAE,gCAAgC;CAC5C,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAsB;IACxD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,gCAAgC,CAAC;IACxE,OAAO,CACL,eAAM,SAAS,EAAE,6DAA6D,KAAK,EAAE,YAClF,MAAM,GACF,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type ComponentType, type ReactNode } from 'react';
2
+ import type { NetworkClient } from '@sudobility/types';
3
+ export interface SEOHeadProps {
4
+ title: string;
5
+ description: string;
6
+ keywords?: string[];
7
+ ogType?: 'website' | 'article';
8
+ noIndex?: boolean;
9
+ structuredData?: Record<string, unknown> | Record<string, unknown>[];
10
+ }
11
+ export interface SiderUiConfig {
12
+ networkClient: NetworkClient;
13
+ /** Firebase ID token; empty string when unauthenticated. */
14
+ token: string;
15
+ /** API base URL, e.g. `http://localhost:8090`. */
16
+ apiUrl: string;
17
+ SeoHead?: ComponentType<SEOHeadProps>;
18
+ }
19
+ export declare function SiderUiProvider({ children, networkClient, token, apiUrl, SeoHead, }: SiderUiConfig & {
20
+ children: ReactNode;
21
+ }): import("react").JSX.Element;
22
+ export declare function useSiderUiConfig(): SiderUiConfig;
23
+ export declare function useSiderApi(): {
24
+ networkClient: NetworkClient;
25
+ token: string;
26
+ baseUrl: string;
27
+ };
28
+ export declare function SEOHead(props: SEOHeadProps): import("react").JSX.Element | null;
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/context/config.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,aAAa,CAAC;IAC7B,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;CACvC;AAID,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAE,aAAa,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMzC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD;AAED,wBAAgB,WAAW,IAAI;IAAE,aAAa,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAG9F;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,sCAG1C"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useMemo } from 'react';
3
+ const SiderUiConfigContext = createContext(null);
4
+ export function SiderUiProvider({ children, networkClient, token, apiUrl, SeoHead, }) {
5
+ const value = useMemo(() => ({ networkClient, token, apiUrl, SeoHead }), [networkClient, token, apiUrl, SeoHead]);
6
+ return _jsx(SiderUiConfigContext.Provider, { value: value, children: children });
7
+ }
8
+ export function useSiderUiConfig() {
9
+ const ctx = useContext(SiderUiConfigContext);
10
+ if (!ctx)
11
+ throw new Error('Sider UI: components must be rendered inside <SiderUiProvider>');
12
+ return ctx;
13
+ }
14
+ export function useSiderApi() {
15
+ const { networkClient, token, apiUrl } = useSiderUiConfig();
16
+ return { networkClient, token, baseUrl: apiUrl };
17
+ }
18
+ export function SEOHead(props) {
19
+ const { SeoHead } = useSiderUiConfig();
20
+ return SeoHead ? _jsx(SeoHead, { ...props }) : null;
21
+ }
22
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/context/config.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAsC,MAAM,OAAO,CAAC;AAqB/F,MAAM,oBAAoB,GAAG,aAAa,CAAuB,IAAI,CAAC,CAAC;AAEvE,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,OAAO,GACiC;IACxC,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACjD,CAAC,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CACxC,CAAC;IACF,OAAO,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAiC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACvC,OAAO,OAAO,CAAC,CAAC,CAAC,KAAC,OAAO,OAAK,KAAK,GAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ export interface NavigateOptions {
3
+ replace?: boolean;
4
+ }
5
+ type Id = string | number;
6
+ /** Host-owned URL topology. All builders return app-relative paths. */
7
+ export interface SiderRoutes {
8
+ home(): string;
9
+ captureBatches(): string;
10
+ captureBatch(batchId: Id): string;
11
+ myTools(): string;
12
+ sites(): string;
13
+ site(siteId: Id): string;
14
+ tool(toolId: Id): string;
15
+ }
16
+ export interface SiderRouting {
17
+ params: Record<string, string | undefined>;
18
+ pathname: string;
19
+ navigate: (path: string, options?: NavigateOptions) => void;
20
+ currentLanguage: string;
21
+ switchLanguage?: (lang: string) => void;
22
+ routes: SiderRoutes;
23
+ }
24
+ export declare function RoutingProvider({ children, params, pathname, navigate, currentLanguage, switchLanguage, routes, }: SiderRouting & {
25
+ children: ReactNode;
26
+ }): import("react").JSX.Element;
27
+ export declare function useSiderRouting(): SiderRouting;
28
+ export declare function useRoutes(): SiderRoutes;
29
+ export declare function useRouteParams<T extends Record<string, string | undefined> = Record<string, string | undefined>>(): T;
30
+ export declare function Redirect({ to, replace }: {
31
+ to: string;
32
+ replace?: boolean;
33
+ }): null;
34
+ export {};
35
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/context/routing.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1B,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,MAAM,CAAC;IACf,cAAc,IAAI,MAAM,CAAC;IACzB,YAAY,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC;IAClC,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,MAAM,CAAC;IAChB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5D,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,WAAW,CAAC;CACrB;AAID,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,MAAM,GACP,EAAE,YAAY,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMxC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAI9C;AAED,wBAAgB,SAAS,IAAI,WAAW,CAEvC;AAED,wBAAgB,cAAc,CAC5B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,KAC9E,CAAC,CAEL;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAc,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,QAMjF"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo } from 'react';
3
+ const RoutingContext = createContext(null);
4
+ export function RoutingProvider({ children, params, pathname, navigate, currentLanguage, switchLanguage, routes, }) {
5
+ const value = useMemo(() => ({ params, pathname, navigate, currentLanguage, switchLanguage, routes }), [params, pathname, navigate, currentLanguage, switchLanguage, routes]);
6
+ return _jsx(RoutingContext.Provider, { value: value, children: children });
7
+ }
8
+ export function useSiderRouting() {
9
+ const ctx = useContext(RoutingContext);
10
+ if (!ctx)
11
+ throw new Error('Sider UI: components must be rendered inside <RoutingProvider>');
12
+ return ctx;
13
+ }
14
+ export function useRoutes() {
15
+ return useSiderRouting().routes;
16
+ }
17
+ export function useRouteParams() {
18
+ return useSiderRouting().params;
19
+ }
20
+ export function Redirect({ to, replace = true }) {
21
+ const { navigate } = useSiderRouting();
22
+ useEffect(() => {
23
+ navigate(to, { replace });
24
+ }, [to, replace, navigate]);
25
+ return null;
26
+ }
27
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/context/routing.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAC;AA4BtF,MAAM,cAAc,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,EAC9B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,cAAc,EACd,MAAM,GACiC;IACvC,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAC/E,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,CAAC,CACtE,CAAC;IACF,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,eAAe,EAAE,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc;IAG5B,OAAO,eAAe,EAAE,CAAC,MAAW,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,IAAI,EAAqC;IAChF,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,15 @@
1
+ export * from './context/config';
2
+ export * from './context/routing';
3
+ export * from './components/states';
4
+ export * from './components/data/DataTable';
5
+ export * from './components/data/JsonViewer';
6
+ export * from './components/data/secretSegments';
7
+ export * from './components/dashboard/DashboardSidebar';
8
+ export * from './pages/DashboardOverview';
9
+ export * from './pages/CaptureBatchesPage';
10
+ export * from './pages/CaptureBatchDetailPage';
11
+ export * from './pages/MyToolsPage';
12
+ export * from './pages/SitesPage';
13
+ export * from './pages/SiteDetailPage';
14
+ export * from './pages/ToolDetailPage';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export * from './context/config';
2
+ export * from './context/routing';
3
+ export * from './components/states';
4
+ export * from './components/data/DataTable';
5
+ export * from './components/data/JsonViewer';
6
+ export * from './components/data/secretSegments';
7
+ export * from './components/dashboard/DashboardSidebar';
8
+ export * from './pages/DashboardOverview';
9
+ export * from './pages/CaptureBatchesPage';
10
+ export * from './pages/CaptureBatchDetailPage';
11
+ export * from './pages/MyToolsPage';
12
+ export * from './pages/SitesPage';
13
+ export * from './pages/SiteDetailPage';
14
+ export * from './pages/ToolDetailPage';
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kCAAkC,CAAC;AACjD,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function CaptureBatchDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=CaptureBatchDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptureBatchDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/CaptureBatchDetailPage.tsx"],"names":[],"mappings":"AAgDA,wBAAgB,sBAAsB,gCA8BrC"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useMyCaptureBatch } from '@sudobility/sider_client';
4
+ import { useSiderApi } from '../context/config';
5
+ import { useRouteParams } from '../context/routing';
6
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
7
+ import { JsonViewer } from '../components/data/JsonViewer';
8
+ function ObservationRow({ obs }) {
9
+ const [open, setOpen] = useState(false);
10
+ return (_jsxs("div", { className: "rounded-lg border border-border bg-card", children: [_jsxs("button", { onClick: () => setOpen(o => !o), className: "flex w-full items-center gap-3 px-3 py-2 text-left text-sm", children: [_jsx("span", { className: "font-mono text-xs font-semibold text-primary", children: obs.method }), _jsx("span", { className: "flex-1 truncate font-mono text-xs text-foreground", children: obs.url }), _jsxs("span", { className: "text-xs text-muted-foreground", children: [obs.status, " \u00B7 ", obs.timingMs, "ms"] })] }), open ? (_jsxs("div", { className: "flex flex-col gap-2 border-t border-border p-3", children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Request headers" }), _jsx(JsonViewer, { value: obs.requestHeaders }), obs.requestBody !== undefined && obs.requestBody !== null ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Request body (tokenized)" }), _jsx(JsonViewer, { value: obs.requestBody })] })) : null, obs.responseBody !== undefined && obs.responseBody !== null ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Response body (tokenized)" }), _jsx(JsonViewer, { value: obs.responseBody })] })) : null, _jsx("p", { className: "text-xs font-semibold text-muted-foreground", children: "Context" }), _jsx(JsonViewer, { value: obs.context })] })) : null] }));
11
+ }
12
+ export function CaptureBatchDetailPage() {
13
+ const { networkClient, baseUrl, token } = useSiderApi();
14
+ const { batchId } = useRouteParams();
15
+ const { data, isLoading, error } = useMyCaptureBatch(networkClient, baseUrl, token, batchId ?? null);
16
+ if (isLoading)
17
+ return _jsx(LoadingState, {});
18
+ if (error)
19
+ return _jsx(ErrorState, { error: error });
20
+ if (!data)
21
+ return _jsx(EmptyState, { title: "Batch not found" });
22
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: data.batch.siteName }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [data.batch.siteOrigin, " \u00B7 ", data.batch.observationCount, " observations \u00B7", ' ', _jsx(StatusBadge, { status: data.batch.status })] })] }), _jsx("div", { className: "flex flex-col gap-2", children: data.observations.map(obs => (_jsx(ObservationRow, { obs: obs }, obs.id))) })] }));
23
+ }
24
+ //# sourceMappingURL=CaptureBatchDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptureBatchDetailPage.js","sourceRoot":"","sources":["../../src/pages/CaptureBatchDetailPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function CaptureBatchesPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=CaptureBatchesPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptureBatchesPage.d.ts","sourceRoot":"","sources":["../../src/pages/CaptureBatchesPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,gCAkCjC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMyCaptureBatches } from '@sudobility/sider_client';
3
+ import { useSiderApi } from '../context/config';
4
+ import { useRoutes, useSiderRouting } from '../context/routing';
5
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
6
+ import { DataTable } from '../components/data/DataTable';
7
+ export function CaptureBatchesPage() {
8
+ const { networkClient, baseUrl, token } = useSiderApi();
9
+ const routes = useRoutes();
10
+ const { navigate } = useSiderRouting();
11
+ const { data, isLoading, error } = useMyCaptureBatches(networkClient, baseUrl, token);
12
+ if (isLoading)
13
+ return _jsx(LoadingState, {});
14
+ if (error)
15
+ return _jsx(ErrorState, { error: error });
16
+ if (!data?.length)
17
+ return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No capture batches", hint: "Start learning mode on a site in the extension." }) }));
18
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Capture batches" }), _jsx(DataTable, { columns: [
19
+ { key: 'siteName', header: 'Site' },
20
+ { key: 'siteOrigin', header: 'Origin' },
21
+ { key: 'observationCount', header: 'Observations' },
22
+ { key: 'status', header: 'Status', render: r => _jsx(StatusBadge, { status: String(r.status) }) },
23
+ { key: 'createdAt', header: 'Uploaded' },
24
+ ], rows: data, onRowClick: r => navigate(routes.captureBatch(String(r.id))) })] }));
25
+ }
26
+ //# sourceMappingURL=CaptureBatchesPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptureBatchesPage.js","sourceRoot":"","sources":["../../src/pages/CaptureBatchesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,kBAAkB;IAChC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAEtF,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IACT,KAAK,EAAC,oBAAoB,EAC1B,IAAI,EAAC,iDAAiD,GACtD,GACE,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,gCAAqB,EAC1E,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;oBACnC,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACvC,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE;oBACnD,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE;oBAC3F,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE;iBACzC,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAC5D,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function DashboardOverview(): import("react").JSX.Element;
2
+ //# sourceMappingURL=DashboardOverview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardOverview.d.ts","sourceRoot":"","sources":["../../src/pages/DashboardOverview.tsx"],"names":[],"mappings":"AAeA,wBAAgB,iBAAiB,gCAiEhC"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMe, useMyCaptureBatches, useMyTools } from '@sudobility/sider_client';
3
+ import { useSiderApi } from '../context/config';
4
+ import { useRoutes, useSiderRouting } from '../context/routing';
5
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
6
+ import { DataTable } from '../components/data/DataTable';
7
+ function Stat({ label, value }) {
8
+ return (_jsxs("div", { className: "rounded-lg border border-border bg-card p-4", children: [_jsx("p", { className: "text-2xl font-semibold text-foreground", children: value }), _jsx("p", { className: "text-xs text-muted-foreground", children: label })] }));
9
+ }
10
+ export function DashboardOverview() {
11
+ const { networkClient, baseUrl, token } = useSiderApi();
12
+ const routes = useRoutes();
13
+ const { navigate } = useSiderRouting();
14
+ const me = useMe(networkClient, baseUrl, token);
15
+ const batches = useMyCaptureBatches(networkClient, baseUrl, token);
16
+ const myTools = useMyTools(networkClient, baseUrl, token);
17
+ if (me.isLoading)
18
+ return _jsx(LoadingState, {});
19
+ if (me.error)
20
+ return _jsx(ErrorState, { error: me.error });
21
+ if (!me.data)
22
+ return _jsx(EmptyState, { title: "No profile yet", hint: "Sign in and learn a site first." });
23
+ const recent = (batches.data ?? []).slice(0, 5);
24
+ return (_jsxs("div", { className: "flex flex-col gap-6 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Overview" }), _jsxs("div", { className: "grid grid-cols-2 gap-3 md:grid-cols-4", children: [_jsx(Stat, { label: "Capture batches", value: me.data.batchCount }), _jsx(Stat, { label: "Observations", value: me.data.observationCount }), _jsx(Stat, { label: "Tools contributed", value: me.data.toolsContributed }), _jsx(Stat, { label: "Trusted tools", value: me.data.trustedToolsContributed })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Recent batches" }), recent.length === 0 ? (_jsx(EmptyState, { title: "No captures yet", hint: "Use the extension's learning mode on a site." })) : (_jsx(DataTable, { columns: [
25
+ { key: 'siteName', header: 'Site' },
26
+ { key: 'observationCount', header: 'Observations' },
27
+ {
28
+ key: 'status',
29
+ header: 'Status',
30
+ render: r => _jsx(StatusBadge, { status: String(r.status) }),
31
+ },
32
+ { key: 'createdAt', header: 'When' },
33
+ ], rows: recent, onRowClick: r => navigate(routes.captureBatch(String(r.id))) }))] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "My tools" }), (myTools.data ?? []).length === 0 ? (_jsx(EmptyState, { title: "No tool contributions yet" })) : (_jsx(DataTable, { columns: [
34
+ { key: 'name', header: 'Tool' },
35
+ {
36
+ key: 'status',
37
+ header: 'Status',
38
+ render: r => _jsx(StatusBadge, { status: String(r.status) }),
39
+ },
40
+ { key: 'corroboratingUserCount', header: 'Corroborations' },
41
+ ], rows: (myTools.data ?? []), onRowClick: r => navigate(routes.tool(String(r.toolId))) }))] })] }));
42
+ }
43
+ //# sourceMappingURL=DashboardOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardOverview.js","sourceRoot":"","sources":["../../src/pages/DashboardOverview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function MyToolsPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=MyToolsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MyToolsPage.d.ts","sourceRoot":"","sources":["../../src/pages/MyToolsPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,WAAW,gCAoC1B"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMyTools } from '@sudobility/sider_client';
3
+ import { useSiderApi } from '../context/config';
4
+ import { useRoutes, useSiderRouting } from '../context/routing';
5
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
6
+ import { DataTable } from '../components/data/DataTable';
7
+ export function MyToolsPage() {
8
+ const { networkClient, baseUrl, token } = useSiderApi();
9
+ const routes = useRoutes();
10
+ const { navigate } = useSiderRouting();
11
+ const { data, isLoading, error } = useMyTools(networkClient, baseUrl, token);
12
+ if (isLoading)
13
+ return _jsx(LoadingState, {});
14
+ if (error)
15
+ return _jsx(ErrorState, { error: error });
16
+ if (!data?.length)
17
+ return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No tool contributions yet" }) }));
18
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "My tools" }), _jsx(DataTable, { columns: [
19
+ { key: 'name', header: 'Tool' },
20
+ { key: 'safetyClass', header: 'Safety' },
21
+ { key: 'status', header: 'Status', render: r => _jsx(StatusBadge, { status: String(r.status) }) },
22
+ { key: 'corroboratingUserCount', header: 'Corroborations' },
23
+ {
24
+ key: 'agreesWithCurrent',
25
+ header: 'My vote',
26
+ render: r => r.agreesWithCurrent ? 'matches stored recipe' : 'differs from stored recipe',
27
+ },
28
+ ], rows: data, onRowClick: r => navigate(routes.tool(String(r.toolId))) })] }));
29
+ }
30
+ //# sourceMappingURL=MyToolsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MyToolsPage.js","sourceRoot":"","sources":["../../src/pages/MyToolsPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE7E,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IAAC,KAAK,EAAC,2BAA2B,GAAG,GAC5C,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,yBAAc,EACnE,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;oBAC/B,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACxC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE;oBAC3F,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,gBAAgB,EAAE;oBAC3D;wBACE,GAAG,EAAE,mBAAmB;wBACxB,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,CAAC,CAAC,EAAE,CACV,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,4BAA4B;qBAC/E;iBACF,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACxD,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function SiteDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=SiteDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/SiteDetailPage.tsx"],"names":[],"mappings":"AAiBA,wBAAgB,cAAc,gCA6H7B"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { useSite, useSiteGraph, useSiteSlots, useSiteTemplates, useToolCatalog, } from '@sudobility/sider_client';
4
+ import { useSiderApi } from '../context/config';
5
+ import { useRouteParams, useRoutes, useSiderRouting } from '../context/routing';
6
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
7
+ import { DataTable } from '../components/data/DataTable';
8
+ import { JsonViewer } from '../components/data/JsonViewer';
9
+ const TABS = ['templates', 'tools', 'slots', 'graph', 'ux'];
10
+ export function SiteDetailPage() {
11
+ const { networkClient, baseUrl, token } = useSiderApi();
12
+ const { siteId } = useRouteParams();
13
+ const routes = useRoutes();
14
+ const { navigate } = useSiderRouting();
15
+ const [tab, setTab] = useState('templates');
16
+ const site = useSite(networkClient, baseUrl, token, siteId ?? null);
17
+ const templates = useSiteTemplates(networkClient, baseUrl, token, siteId ?? null);
18
+ const catalog = useToolCatalog(networkClient, baseUrl, token, siteId ?? null, {
19
+ includeProvisional: true,
20
+ includeFlagged: true,
21
+ });
22
+ const slots = useSiteSlots(networkClient, baseUrl, token, siteId ?? null);
23
+ const graph = useSiteGraph(networkClient, baseUrl, token, siteId ?? null);
24
+ if (site.isLoading)
25
+ return _jsx(LoadingState, {});
26
+ if (site.error)
27
+ return _jsx(ErrorState, { error: site.error });
28
+ if (!site.data)
29
+ return _jsx(EmptyState, { title: "Site not found" });
30
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: site.data.name }), _jsx("p", { className: "text-sm text-muted-foreground", children: site.data.origin })] }), _jsx("div", { className: "flex gap-1 border-b border-border", children: TABS.map(t => (_jsx("button", { onClick: () => setTab(t), className: `px-3 py-1.5 text-sm capitalize ${tab === t
31
+ ? 'border-b-2 border-primary font-medium text-foreground'
32
+ : 'text-muted-foreground hover:text-foreground'}`, children: t === 'ux' ? 'UX recipes' : t === 'slots' ? 'Secret slots' : t }, t))) }), tab === 'templates' &&
33
+ (templates.data?.length ? (_jsx("div", { className: "flex flex-col gap-2", children: templates.data.map(t => (_jsxs("details", { className: "rounded-lg border border-border bg-card p-3", children: [_jsxs("summary", { className: "cursor-pointer text-sm text-foreground", children: [_jsx("span", { className: "font-mono text-xs font-semibold text-primary", children: t.method }), ' ', _jsx("span", { className: "font-mono text-xs", children: t.pathTemplate })] }), _jsx(JsonViewer, { value: t })] }, t.id))) })) : (_jsx(EmptyState, { title: "No endpoint templates yet" }))), tab === 'tools' &&
34
+ (catalog.data?.tools?.length ? (_jsx(DataTable, { columns: [
35
+ { key: 'name', header: 'Tool' },
36
+ { key: 'safetyClass', header: 'Safety' },
37
+ {
38
+ key: 'status',
39
+ header: 'Status',
40
+ render: r => _jsx(StatusBadge, { status: String(r.status) }),
41
+ },
42
+ { key: 'corroboratingUserCount', header: 'Corroborations' },
43
+ ], rows: (catalog.data.tools ?? []), onRowClick: r => navigate(routes.tool(String(r.id))) })) : (_jsx(EmptyState, { title: "No tools yet" }))), tab === 'slots' &&
44
+ (slots.data?.length ? (_jsx("div", { className: "flex flex-col gap-2", children: slots.data.map(s => (_jsxs("details", { className: "rounded-lg border border-border bg-card p-3", children: [_jsxs("summary", { className: "cursor-pointer font-mono text-xs text-foreground", children: [s.id, " \u2014 ", s.kind, " / ", s.role] }), _jsx(JsonViewer, { value: s })] }, s.id))) })) : (_jsx(EmptyState, { title: "No secret slots", hint: "Definitions only \u2014 values never exist server-side." }))), tab === 'graph' &&
45
+ (graph.data?.length ? (_jsx(DataTable, { columns: [
46
+ { key: 'fromTemplateId', header: 'From template' },
47
+ { key: 'fromJsonPath', header: 'Output path' },
48
+ { key: 'toTemplateId', header: 'To template' },
49
+ { key: 'toParam', header: 'Input param' },
50
+ { key: 'confidence', header: 'Confidence' },
51
+ ], rows: graph.data })) : (_jsx(EmptyState, { title: "No graph edges", hint: "Graph building is not implemented server-side yet." }))), tab === 'ux' &&
52
+ (catalog.data?.uxRecipes?.length ? (_jsx(JsonViewer, { value: catalog.data.uxRecipes })) : (_jsx(EmptyState, { title: "No UX recipes" })))] }));
53
+ }
54
+ //# sourceMappingURL=SiteDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteDetailPage.js","sourceRoot":"","sources":["../../src/pages/SiteDetailPage.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function SitesPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=SitesPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SitesPage.d.ts","sourceRoot":"","sources":["../../src/pages/SitesPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,SAAS,gCA+BxB"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useSites } from '@sudobility/sider_client';
3
+ import { useSiderApi } from '../context/config';
4
+ import { useRoutes, useSiderRouting } from '../context/routing';
5
+ import { EmptyState, ErrorState, LoadingState } from '../components/states';
6
+ import { DataTable } from '../components/data/DataTable';
7
+ export function SitesPage() {
8
+ const { networkClient, baseUrl, token } = useSiderApi();
9
+ const routes = useRoutes();
10
+ const { navigate } = useSiderRouting();
11
+ const { data, isLoading, error } = useSites(networkClient, baseUrl, token);
12
+ if (isLoading)
13
+ return _jsx(LoadingState, {});
14
+ if (error)
15
+ return _jsx(ErrorState, { error: error });
16
+ if (!data?.length)
17
+ return (_jsx("div", { className: "p-6", children: _jsx(EmptyState, { title: "No sites learned yet" }) }));
18
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: "Registry \u2014 sites" }), _jsx(DataTable, { columns: [
19
+ { key: 'name', header: 'Site' },
20
+ { key: 'origin', header: 'Origin' },
21
+ { key: 'toolCount', header: 'Tools' },
22
+ { key: 'trustedToolCount', header: 'Trusted' },
23
+ { key: 'contributorCount', header: 'Contributors' },
24
+ ], rows: data, onRowClick: r => navigate(routes.site(String(r.id))) })] }));
25
+ }
26
+ //# sourceMappingURL=SitesPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SitesPage.js","sourceRoot":"","sources":["../../src/pages/SitesPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAEzD,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3E,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,MAAM;QACf,OAAO,CACL,cAAK,SAAS,EAAC,KAAK,YAClB,KAAC,UAAU,IAAC,KAAK,EAAC,sBAAsB,GAAG,GACvC,CACP,CAAC;IAEJ,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,aAAI,SAAS,EAAC,uCAAuC,sCAAsB,EAC3E,KAAC,SAAS,IACR,OAAO,EAAE;oBACP,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;oBAC/B,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE;oBACnC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE;oBACrC,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE;oBAC9C,EAAE,GAAG,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE;iBACpD,EACD,IAAI,EAAE,IAA4C,EAClD,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpD,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function ToolDetailPage(): import("react").JSX.Element;
2
+ //# sourceMappingURL=ToolDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/ToolDetailPage.tsx"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,gCAoC7B"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useToolDetail } from '@sudobility/sider_client';
3
+ import { useSiderApi } from '../context/config';
4
+ import { useRouteParams } from '../context/routing';
5
+ import { EmptyState, ErrorState, LoadingState, StatusBadge } from '../components/states';
6
+ import { JsonViewer } from '../components/data/JsonViewer';
7
+ export function ToolDetailPage() {
8
+ const { networkClient, baseUrl, token } = useSiderApi();
9
+ const { toolId } = useRouteParams();
10
+ const { data, isLoading, error } = useToolDetail(networkClient, baseUrl, token, toolId ?? null);
11
+ if (isLoading)
12
+ return _jsx(LoadingState, {});
13
+ if (error)
14
+ return _jsx(ErrorState, { error: error });
15
+ if (!data)
16
+ return _jsx(EmptyState, { title: "Tool not found" });
17
+ const { tool, corroboration } = data;
18
+ return (_jsxs("div", { className: "flex flex-col gap-4 p-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-lg font-semibold text-foreground", children: tool.name }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [tool.description, " \u00B7 ", _jsx(StatusBadge, { status: tool.status }), " \u00B7 ", tool.safetyClass, " \u00B7 v", tool.version] })] }), _jsxs("section", { children: [_jsxs("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: ["Corroboration (", corroboration.distinctUsers, " users, trust threshold", ' ', corroboration.trustThreshold, ")"] }), _jsx(JsonViewer, { value: corroboration.hashCounts })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Input schema" }), _jsx(JsonViewer, { value: tool.inputSchema })] }), _jsxs("section", { children: [_jsx("h2", { className: "pb-2 text-sm font-semibold text-foreground", children: "Invocation recipe" }), _jsx(JsonViewer, { value: tool.recipe })] })] }));
19
+ }
20
+ //# sourceMappingURL=ToolDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolDetailPage.js","sourceRoot":"","sources":["../../src/pages/ToolDetailPage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE,CAAC;IACxD,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,EAAuB,CAAC;IACzD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;IAEhG,IAAI,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAC,UAAU,IAAC,KAAK,EAAC,gBAAgB,GAAG,CAAC;IAExD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACrC,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,0BACE,aAAI,SAAS,EAAC,uCAAuC,YAAE,IAAI,CAAC,IAAI,GAAM,EACtE,aAAG,SAAS,EAAC,+BAA+B,aACzC,IAAI,CAAC,WAAW,cAAI,KAAC,WAAW,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAI,cAAI,IAAI,CAAC,WAAW,eAC5E,IAAI,CAAC,OAAO,IACX,IACA,EACN,8BACE,cAAI,SAAS,EAAC,4CAA4C,gCACxC,aAAa,CAAC,aAAa,6BAAyB,GAAG,EACtE,aAAa,CAAC,cAAc,SAC1B,EACL,KAAC,UAAU,IAAC,KAAK,EAAE,aAAa,CAAC,UAAU,GAAI,IACvC,EACV,8BACE,aAAI,SAAS,EAAC,4CAA4C,6BAAkB,EAC5E,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,WAAW,GAAI,IAC/B,EACV,8BACE,aAAI,SAAS,EAAC,4CAA4C,kCAAuB,EACjF,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAI,IAC1B,IACN,CACP,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@sudobility/sider_ui",
3
+ "version": "0.0.3",
4
+ "description": "Sider shared UI — dashboard pages and components for sider_app and sider_extension.",
5
+ "license": "BUSL-1.1",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist/**/*"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.build.json",
14
+ "build:watch": "tsc -p tsconfig.build.json --watch",
15
+ "clean": "rm -rf dist",
16
+ "prepublishOnly": "bun run clean && bun run build",
17
+ "typecheck": "tsc --noEmit",
18
+ "test": "vitest run --passWithNoTests",
19
+ "verify": "bun run typecheck && bun run test"
20
+ },
21
+ "publishConfig": {
22
+ "access": "restricted"
23
+ },
24
+ "peerDependencies": {
25
+ "@heroicons/react": ">=2",
26
+ "@sudobility/components": "^5.0.97",
27
+ "@sudobility/design": "^1.1.46",
28
+ "@sudobility/sider_client": "^0.1.2",
29
+ "@sudobility/sider_types": "^0.0.5",
30
+ "@sudobility/types": "^1.9.62",
31
+ "@tanstack/react-query": ">=5",
32
+ "react": ">=18",
33
+ "react-dom": ">=18"
34
+ },
35
+ "devDependencies": {
36
+ "@heroicons/react": "^2.2.0",
37
+ "@sudobility/components": "^5.0.97",
38
+ "@sudobility/design": "^1.1.46",
39
+ "@sudobility/sider_client": "^0.1.2",
40
+ "@sudobility/sider_types": "^0.0.5",
41
+ "@sudobility/types": "^1.9.62",
42
+ "@tanstack/react-query": "^5.90.5",
43
+ "@types/react": "^18.3.12",
44
+ "eslint": "^9.0.0",
45
+ "react": "^18.3.1",
46
+ "react-dom": "^18.3.1",
47
+ "typescript": "^5.9.3",
48
+ "vitest": "^4.0.0"
49
+ }
50
+ }