@assistant-ui/react-o11y 0.0.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.
- package/dist/context/SpanByIndexProvider.d.ts +5 -0
- package/dist/context/SpanByIndexProvider.d.ts.map +1 -0
- package/dist/context/SpanByIndexProvider.js +14 -0
- package/dist/context/SpanByIndexProvider.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/o11y-scope.d.ts +44 -0
- package/dist/o11y-scope.d.ts.map +1 -0
- package/dist/o11y-scope.js +2 -0
- package/dist/o11y-scope.js.map +1 -0
- package/dist/primitives/span/SpanChildren.d.ts +17 -0
- package/dist/primitives/span/SpanChildren.d.ts.map +1 -0
- package/dist/primitives/span/SpanChildren.js +21 -0
- package/dist/primitives/span/SpanChildren.js.map +1 -0
- package/dist/primitives/span/SpanCollapseToggle.d.ts +10 -0
- package/dist/primitives/span/SpanCollapseToggle.d.ts.map +1 -0
- package/dist/primitives/span/SpanCollapseToggle.js +18 -0
- package/dist/primitives/span/SpanCollapseToggle.js.map +1 -0
- package/dist/primitives/span/SpanIndent.d.ts +16 -0
- package/dist/primitives/span/SpanIndent.d.ts.map +1 -0
- package/dist/primitives/span/SpanIndent.js +14 -0
- package/dist/primitives/span/SpanIndent.js.map +1 -0
- package/dist/primitives/span/SpanName.d.ts +10 -0
- package/dist/primitives/span/SpanName.d.ts.map +1 -0
- package/dist/primitives/span/SpanName.js +10 -0
- package/dist/primitives/span/SpanName.js.map +1 -0
- package/dist/primitives/span/SpanRoot.d.ts +10 -0
- package/dist/primitives/span/SpanRoot.d.ts.map +1 -0
- package/dist/primitives/span/SpanRoot.js +14 -0
- package/dist/primitives/span/SpanRoot.js.map +1 -0
- package/dist/primitives/span/SpanStatusIndicator.d.ts +10 -0
- package/dist/primitives/span/SpanStatusIndicator.d.ts.map +1 -0
- package/dist/primitives/span/SpanStatusIndicator.js +10 -0
- package/dist/primitives/span/SpanStatusIndicator.js.map +1 -0
- package/dist/primitives/span/SpanTypeBadge.d.ts +10 -0
- package/dist/primitives/span/SpanTypeBadge.d.ts.map +1 -0
- package/dist/primitives/span/SpanTypeBadge.js +10 -0
- package/dist/primitives/span/SpanTypeBadge.js.map +1 -0
- package/dist/primitives/span/index.d.ts +8 -0
- package/dist/primitives/span/index.d.ts.map +1 -0
- package/dist/primitives/span/index.js +8 -0
- package/dist/primitives/span/index.js.map +1 -0
- package/dist/resources/SpanResource.d.ts +18 -0
- package/dist/resources/SpanResource.d.ts.map +1 -0
- package/dist/resources/SpanResource.js +139 -0
- package/dist/resources/SpanResource.js.map +1 -0
- package/package.json +66 -0
- package/src/context/SpanByIndexProvider.tsx +19 -0
- package/src/index.ts +7 -0
- package/src/o11y-scope.ts +40 -0
- package/src/primitives/span/SpanChildren.tsx +60 -0
- package/src/primitives/span/SpanCollapseToggle.tsx +39 -0
- package/src/primitives/span/SpanIndent.tsx +42 -0
- package/src/primitives/span/SpanName.tsx +27 -0
- package/src/primitives/span/SpanRoot.tsx +37 -0
- package/src/primitives/span/SpanStatusIndicator.tsx +23 -0
- package/src/primitives/span/SpanTypeBadge.tsx +27 -0
- package/src/primitives/span/index.ts +7 -0
- package/src/resources/SpanResource.tsx +203 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanByIndexProvider.d.ts","sourceRoot":"","sources":["../../src/context/SpanByIndexProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGnD,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAexE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
|
|
3
|
+
export const SpanByIndexProvider = ({ index, children, }) => {
|
|
4
|
+
const parentAui = useAui();
|
|
5
|
+
const aui = useAui({
|
|
6
|
+
span: Derived({
|
|
7
|
+
source: "span",
|
|
8
|
+
query: { index },
|
|
9
|
+
get: () => parentAui.span().child({ index }),
|
|
10
|
+
}),
|
|
11
|
+
});
|
|
12
|
+
return _jsx(AuiProvider, { value: aui, children: children });
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=SpanByIndexProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanByIndexProvider.js","sourceRoot":"","sources":["../../src/context/SpanByIndexProvider.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAA6C,CAAC,EAC5E,KAAK,EACL,QAAQ,GACT,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC;IAE3B,MAAM,GAAG,GAAG,MAAM,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC;YACZ,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,EAAE,KAAK,EAAE;YAChB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;SAC7C,CAAC;KACH,CAAC,CAAC;IAEH,OAAO,KAAC,WAAW,IAAC,KAAK,EAAE,GAAG,YAAG,QAAQ,GAAe,CAAC;AAC3D,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * as SpanPrimitive from "./primitives/span/index.js";
|
|
2
|
+
export { SpanResource } from "./resources/SpanResource.js";
|
|
3
|
+
export type { SpanData } from "./resources/SpanResource.js";
|
|
4
|
+
export type { SpanItemState, SpanState } from "./o11y-scope.js";
|
|
5
|
+
export { SpanByIndexProvider } from "./context/SpanByIndexProvider.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,mCAA0B;AAEnD,OAAO,EAAE,YAAY,EAAE,oCAAiC;AACxD,YAAY,EAAE,QAAQ,EAAE,oCAAiC;AACzD,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,wBAAqB;AAE7D,OAAO,EAAE,mBAAmB,EAAE,yCAAsC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,mCAA0B;AAEnD,OAAO,EAAE,YAAY,EAAE,oCAAiC;AAIxD,OAAO,EAAE,mBAAmB,EAAE,yCAAsC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import "@assistant-ui/store";
|
|
2
|
+
export type SpanItemState = {
|
|
3
|
+
id: string;
|
|
4
|
+
parentSpanId: string | null;
|
|
5
|
+
name: string;
|
|
6
|
+
type: string;
|
|
7
|
+
status: "running" | "completed" | "failed" | "skipped";
|
|
8
|
+
startedAt: number;
|
|
9
|
+
endedAt: number | null;
|
|
10
|
+
latencyMs: number | null;
|
|
11
|
+
depth: number;
|
|
12
|
+
hasChildren: boolean;
|
|
13
|
+
isCollapsed: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type SpanState = SpanItemState & {
|
|
16
|
+
children: SpanItemState[];
|
|
17
|
+
timeRange: {
|
|
18
|
+
min: number;
|
|
19
|
+
max: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
type SpanMethods = {
|
|
23
|
+
getState: () => SpanState;
|
|
24
|
+
child: (lookup: SpanMeta["query"]) => SpanMethods;
|
|
25
|
+
toggleCollapse: () => void;
|
|
26
|
+
};
|
|
27
|
+
type SpanMeta = {
|
|
28
|
+
source: "span";
|
|
29
|
+
query: {
|
|
30
|
+
index: number;
|
|
31
|
+
} | {
|
|
32
|
+
key: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
declare module "@assistant-ui/store" {
|
|
36
|
+
interface ScopeRegistry {
|
|
37
|
+
span: {
|
|
38
|
+
methods: SpanMethods;
|
|
39
|
+
meta: SpanMeta;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=o11y-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o11y-scope.d.ts","sourceRoot":"","sources":["../src/o11y-scope.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG;IACtC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,MAAM,SAAS,CAAC;IAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,WAAW,CAAC;IAClD,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC;AAEF,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,aAAa;QACrB,IAAI,EAAE;YACJ,OAAO,EAAE,WAAW,CAAC;YACrB,IAAI,EAAE,QAAQ,CAAC;SAChB,CAAC;KACH;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"o11y-scope.js","sourceRoot":"","sources":["../src/o11y-scope.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ComponentType, type FC } from "react";
|
|
2
|
+
export declare namespace SpanPrimitiveChildren {
|
|
3
|
+
type Props = {
|
|
4
|
+
components: {
|
|
5
|
+
Span: ComponentType;
|
|
6
|
+
};
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare namespace SpanPrimitiveChildByIndex {
|
|
10
|
+
type Props = {
|
|
11
|
+
index: number;
|
|
12
|
+
components: SpanPrimitiveChildren.Props["components"];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare const SpanPrimitiveChildByIndex: FC<SpanPrimitiveChildByIndex.Props>;
|
|
16
|
+
export declare const SpanPrimitiveChildren: FC<SpanPrimitiveChildren.Props>;
|
|
17
|
+
//# sourceMappingURL=SpanChildren.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanChildren.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanChildren.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,EAAE,EAAiB,MAAM,OAAO,CAAC;AAInE,yBAAiB,qBAAqB,CAAC;IACrC,KAAY,KAAK,GAAG;QAClB,UAAU,EAAE;YACV,IAAI,EAAE,aAAa,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED,yBAAiB,yBAAyB,CAAC;IACzC,KAAY,KAAK,GAAG;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;KACvD,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,yBAAyB,CAAC,KAAK,CAYvE,CAAC;AAuBJ,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,CAGjE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useMemo } from "react";
|
|
3
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
4
|
+
import { SpanByIndexProvider } from "../../context/SpanByIndexProvider.js";
|
|
5
|
+
export const SpanPrimitiveChildByIndex = memo(({ index, components }) => {
|
|
6
|
+
return (_jsx(SpanByIndexProvider, { index: index, children: _jsx(components.Span, {}) }));
|
|
7
|
+
}, (prev, next) => prev.index === next.index &&
|
|
8
|
+
prev.components.Span === next.components.Span);
|
|
9
|
+
SpanPrimitiveChildByIndex.displayName = "SpanPrimitive.ChildByIndex";
|
|
10
|
+
const SpanPrimitiveChildrenImpl = ({ components, }) => {
|
|
11
|
+
const childrenLength = useAuiState((s) => s.span.children.length);
|
|
12
|
+
const childElements = useMemo(() => {
|
|
13
|
+
if (childrenLength === 0)
|
|
14
|
+
return null;
|
|
15
|
+
return Array.from({ length: childrenLength }, (_, index) => (_jsx(SpanPrimitiveChildByIndex, { index: index, components: components }, index)));
|
|
16
|
+
}, [childrenLength, components]);
|
|
17
|
+
return childElements;
|
|
18
|
+
};
|
|
19
|
+
export const SpanPrimitiveChildren = memo(SpanPrimitiveChildrenImpl, (prev, next) => prev.components.Span === next.components.Span);
|
|
20
|
+
SpanPrimitiveChildren.displayName = "SpanPrimitive.Children";
|
|
21
|
+
//# sourceMappingURL=SpanChildren.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanChildren.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanChildren.tsx"],"names":[],"mappings":";AAAA,OAAO,EAA+B,IAAI,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,6CAA0C;AAiBxE,MAAM,CAAC,MAAM,yBAAyB,GACpC,IAAI,CACF,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;IACxB,OAAO,CACL,KAAC,mBAAmB,IAAC,KAAK,EAAE,KAAK,YAC/B,KAAC,UAAU,CAAC,IAAI,KAAG,GACC,CACvB,CAAC;AACJ,CAAC,EACD,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;IACzB,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAChD,CAAC;AAEJ,yBAAyB,CAAC,WAAW,GAAG,4BAA4B,CAAC;AAErE,MAAM,yBAAyB,GAAoC,CAAC,EAClE,UAAU,GACX,EAAE,EAAE;IACH,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAElE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE;QACjC,IAAI,cAAc,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1D,KAAC,yBAAyB,IAExB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,IAFjB,KAAK,CAGV,CACH,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjC,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoC,IAAI,CACxE,yBAAyB,EACzB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAC9D,CAAC;AAEF,qBAAqB,CAAC,WAAW,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveCollapseToggle {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.button>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.button>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SpanPrimitiveCollapseToggle: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
10
|
+
//# sourceMappingURL=SpanCollapseToggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanCollapseToggle.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanCollapseToggle.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;CACvE;AAED,eAAO,MAAM,2BAA2B;;6DAuBtC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveCollapseToggle = forwardRef((props, ref) => {
|
|
6
|
+
const hasChildren = useAuiState((s) => s.span.hasChildren);
|
|
7
|
+
const isCollapsed = useAuiState((s) => s.span.isCollapsed);
|
|
8
|
+
const aui = useAui();
|
|
9
|
+
if (!hasChildren)
|
|
10
|
+
return null;
|
|
11
|
+
return (_jsx(Primitive.button, { type: "button", ...props, ref: ref, "data-collapsed": isCollapsed, onClick: (e) => {
|
|
12
|
+
e.stopPropagation();
|
|
13
|
+
aui.span().toggleCollapse();
|
|
14
|
+
props.onClick?.(e);
|
|
15
|
+
} }));
|
|
16
|
+
});
|
|
17
|
+
SpanPrimitiveCollapseToggle.displayName = "SpanPrimitive.CollapseToggle";
|
|
18
|
+
//# sourceMappingURL=SpanCollapseToggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanCollapseToggle.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanCollapseToggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAO1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,UAAU,CAGnD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,OAAO,CACL,KAAC,SAAS,CAAC,MAAM,IACf,IAAI,EAAC,QAAQ,KACT,KAAK,EACT,GAAG,EAAE,GAAG,oBACQ,WAAW,EAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC;YAC5B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,GACD,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,2BAA2B,CAAC,WAAW,GAAG,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveIndent {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.div>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {
|
|
6
|
+
baseIndent?: number;
|
|
7
|
+
indentPerLevel?: number;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare const SpanPrimitiveIndent: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
}, "ref"> & {
|
|
13
|
+
baseIndent?: number;
|
|
14
|
+
indentPerLevel?: number;
|
|
15
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
16
|
+
//# sourceMappingURL=SpanIndent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanIndent.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanIndent.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAGlB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,mBAAmB,CAAC;IACnC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG;QACnE,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,eAAO,MAAM,mBAAmB;;;iBALf,MAAM;qBACF,MAAM;kDA0BzB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useMemo, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveIndent = forwardRef(({ baseIndent = 8, indentPerLevel = 12, style, ...props }, ref) => {
|
|
6
|
+
const depth = useAuiState((s) => s.span.depth);
|
|
7
|
+
const mergedStyle = useMemo(() => ({
|
|
8
|
+
...style,
|
|
9
|
+
paddingLeft: baseIndent + depth * indentPerLevel,
|
|
10
|
+
}), [style, baseIndent, depth, indentPerLevel]);
|
|
11
|
+
return (_jsx(Primitive.div, { ...props, ref: ref, style: mergedStyle, "data-span-depth": depth }));
|
|
12
|
+
});
|
|
13
|
+
SpanPrimitiveIndent.displayName = "SpanPrimitive.Indent";
|
|
14
|
+
//# sourceMappingURL=SpanIndent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanIndent.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanIndent.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,EACV,OAAO,GACR,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUlD,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAG3C,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,cAAc,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,CAAC;QACL,GAAG,KAAK;QACR,WAAW,EAAE,UAAU,GAAG,KAAK,GAAG,cAAc;KACjD,CAAC,EACF,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,CAC3C,CAAC;IAEF,OAAO,CACL,KAAC,SAAS,CAAC,GAAG,OACR,KAAK,EACT,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,WAAW,qBACD,KAAK,GACtB,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,mBAAmB,CAAC,WAAW,GAAG,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveName {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.span>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SpanPrimitiveName: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
10
|
+
//# sourceMappingURL=SpanName.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanName.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanName.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,iBAAiB,CAAC;IACjC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,eAAO,MAAM,iBAAiB;;2DAW5B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveName = forwardRef((props, ref) => {
|
|
6
|
+
const name = useAuiState((s) => s.span.name);
|
|
7
|
+
return (_jsx(Primitive.span, { ...props, ref: ref, children: props.children ?? name }));
|
|
8
|
+
});
|
|
9
|
+
SpanPrimitiveName.displayName = "SpanPrimitive.Name";
|
|
10
|
+
//# sourceMappingURL=SpanName.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanName.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanName.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAGzC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CACL,KAAC,SAAS,CAAC,IAAI,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,YAChC,KAAK,CAAC,QAAQ,IAAI,IAAI,GACR,CAClB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iBAAiB,CAAC,WAAW,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveRoot {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.div>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.div>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SpanPrimitiveRoot: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
10
|
+
//# sourceMappingURL=SpanRoot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanRoot.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,iBAAiB,CAAC;IACjC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACzD,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;CACpE;AAED,eAAO,MAAM,iBAAiB;;0DAqB5B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveRoot = forwardRef((props, ref) => {
|
|
6
|
+
const spanId = useAuiState((s) => s.span.id);
|
|
7
|
+
const status = useAuiState((s) => s.span.status);
|
|
8
|
+
const type = useAuiState((s) => s.span.type);
|
|
9
|
+
const depth = useAuiState((s) => s.span.depth);
|
|
10
|
+
const isCollapsed = useAuiState((s) => s.span.isCollapsed);
|
|
11
|
+
return (_jsx(Primitive.div, { ...props, ref: ref, "data-span-id": spanId, "data-span-status": status, "data-span-type": type, "data-span-depth": depth, "data-collapsed": isCollapsed }));
|
|
12
|
+
});
|
|
13
|
+
SpanPrimitiveRoot.displayName = "SpanPrimitive.Root";
|
|
14
|
+
//# sourceMappingURL=SpanRoot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanRoot.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanRoot.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAGzC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,SAAS,CAAC,GAAG,OACR,KAAK,EACT,GAAG,EAAE,GAAG,kBACM,MAAM,sBACF,MAAM,oBACR,IAAI,qBACH,KAAK,oBACN,WAAW,GAC3B,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iBAAiB,CAAC,WAAW,GAAG,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveStatusIndicator {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.span>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SpanPrimitiveStatusIndicator: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
10
|
+
//# sourceMappingURL=SpanStatusIndicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanStatusIndicator.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanStatusIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,4BAA4B,CAAC;IAC5C,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,eAAO,MAAM,4BAA4B;;2DAOvC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveStatusIndicator = forwardRef((props, ref) => {
|
|
6
|
+
const status = useAuiState((s) => s.span.status);
|
|
7
|
+
return _jsx(Primitive.span, { ...props, ref: ref, "data-span-status": status });
|
|
8
|
+
});
|
|
9
|
+
SpanPrimitiveStatusIndicator.displayName = "SpanPrimitive.StatusIndicator";
|
|
10
|
+
//# sourceMappingURL=SpanStatusIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanStatusIndicator.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanStatusIndicator.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAGpD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjD,OAAO,KAAC,SAAS,CAAC,IAAI,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,sBAAoB,MAAM,GAAI,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,4BAA4B,CAAC,WAAW,GAAG,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ComponentRef } from "react";
|
|
2
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
3
|
+
export declare namespace SpanPrimitiveTypeBadge {
|
|
4
|
+
type Element = ComponentRef<typeof Primitive.span>;
|
|
5
|
+
type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
6
|
+
}
|
|
7
|
+
export declare const SpanPrimitiveTypeBadge: import("react").ForwardRefExoticComponent<Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}, "ref"> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
10
|
+
//# sourceMappingURL=SpanTypeBadge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanTypeBadge.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/SpanTypeBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EAElB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,yBAAiB,sBAAsB,CAAC;IACtC,KAAY,OAAO,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAY,KAAK,GAAG,wBAAwB,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,eAAO,MAAM,sBAAsB;;2DAWjC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, } from "react";
|
|
3
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
4
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
5
|
+
export const SpanPrimitiveTypeBadge = forwardRef((props, ref) => {
|
|
6
|
+
const type = useAuiState((s) => s.span.type);
|
|
7
|
+
return (_jsx(Primitive.span, { ...props, ref: ref, "data-span-type": type, children: props.children ?? type }));
|
|
8
|
+
});
|
|
9
|
+
SpanPrimitiveTypeBadge.displayName = "SpanPrimitive.TypeBadge";
|
|
10
|
+
//# sourceMappingURL=SpanTypeBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanTypeBadge.js","sourceRoot":"","sources":["../../../src/primitives/span/SpanTypeBadge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOlD,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAG9C,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACf,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7C,OAAO,CACL,KAAC,SAAS,CAAC,IAAI,OAAK,KAAK,EAAE,GAAG,EAAE,GAAG,oBAAkB,IAAI,YACtD,KAAK,CAAC,QAAQ,IAAI,IAAI,GACR,CAClB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,sBAAsB,CAAC,WAAW,GAAG,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { SpanPrimitiveRoot as Root } from "./SpanRoot.js";
|
|
2
|
+
export { SpanPrimitiveName as Name } from "./SpanName.js";
|
|
3
|
+
export { SpanPrimitiveTypeBadge as TypeBadge } from "./SpanTypeBadge.js";
|
|
4
|
+
export { SpanPrimitiveStatusIndicator as StatusIndicator } from "./SpanStatusIndicator.js";
|
|
5
|
+
export { SpanPrimitiveCollapseToggle as CollapseToggle } from "./SpanCollapseToggle.js";
|
|
6
|
+
export { SpanPrimitiveIndent as Indent } from "./SpanIndent.js";
|
|
7
|
+
export { SpanPrimitiveChildren as Children } from "./SpanChildren.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/span/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,IAAI,EAAE,sBAAmB;AACvD,OAAO,EAAE,iBAAiB,IAAI,IAAI,EAAE,sBAAmB;AACvD,OAAO,EAAE,sBAAsB,IAAI,SAAS,EAAE,2BAAwB;AACtE,OAAO,EAAE,4BAA4B,IAAI,eAAe,EAAE,iCAA8B;AACxF,OAAO,EAAE,2BAA2B,IAAI,cAAc,EAAE,gCAA6B;AACrF,OAAO,EAAE,mBAAmB,IAAI,MAAM,EAAE,wBAAqB;AAC7D,OAAO,EAAE,qBAAqB,IAAI,QAAQ,EAAE,0BAAuB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { SpanPrimitiveRoot as Root } from "./SpanRoot.js";
|
|
2
|
+
export { SpanPrimitiveName as Name } from "./SpanName.js";
|
|
3
|
+
export { SpanPrimitiveTypeBadge as TypeBadge } from "./SpanTypeBadge.js";
|
|
4
|
+
export { SpanPrimitiveStatusIndicator as StatusIndicator } from "./SpanStatusIndicator.js";
|
|
5
|
+
export { SpanPrimitiveCollapseToggle as CollapseToggle } from "./SpanCollapseToggle.js";
|
|
6
|
+
export { SpanPrimitiveIndent as Indent } from "./SpanIndent.js";
|
|
7
|
+
export { SpanPrimitiveChildren as Children } from "./SpanChildren.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/span/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,IAAI,IAAI,EAAE,sBAAmB;AACvD,OAAO,EAAE,iBAAiB,IAAI,IAAI,EAAE,sBAAmB;AACvD,OAAO,EAAE,sBAAsB,IAAI,SAAS,EAAE,2BAAwB;AACtE,OAAO,EAAE,4BAA4B,IAAI,eAAe,EAAE,iCAA8B;AACxF,OAAO,EAAE,2BAA2B,IAAI,cAAc,EAAE,gCAA6B;AACrF,OAAO,EAAE,mBAAmB,IAAI,MAAM,EAAE,wBAAqB;AAC7D,OAAO,EAAE,qBAAqB,IAAI,QAAQ,EAAE,0BAAuB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "../o11y-scope.js";
|
|
2
|
+
import { type ClientOutput } from "@assistant-ui/store";
|
|
3
|
+
export type SpanData = {
|
|
4
|
+
id: string;
|
|
5
|
+
parentSpanId: string | null;
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
status: "running" | "completed" | "failed" | "skipped";
|
|
9
|
+
startedAt: number;
|
|
10
|
+
endedAt: number | null;
|
|
11
|
+
latencyMs: number | null;
|
|
12
|
+
};
|
|
13
|
+
export declare const SpanResource: (props: {
|
|
14
|
+
spans: SpanData[];
|
|
15
|
+
}) => import("@assistant-ui/tap").ResourceElement<ClientOutput<"span">, {
|
|
16
|
+
spans: SpanData[];
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=SpanResource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanResource.d.ts","sourceRoot":"","sources":["../../src/resources/SpanResource.tsx"],"names":[],"mappings":"AAAA,0BAAuB;AAGvB,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGzE,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AA2HF,eAAO,MAAM,YAAY;WACF,QAAQ,EAAE;;WAAV,QAAQ,EAAE;EA+DhC,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import "../o11y-scope.js";
|
|
2
|
+
import { resource, tapMemo, tapState, withKey } from "@assistant-ui/tap";
|
|
3
|
+
import { tapClientLookup } from "@assistant-ui/store";
|
|
4
|
+
function calculateDepth(spanId, spanMap, cache) {
|
|
5
|
+
const cached = cache.get(spanId);
|
|
6
|
+
if (cached !== undefined)
|
|
7
|
+
return cached;
|
|
8
|
+
const span = spanMap.get(spanId);
|
|
9
|
+
if (!span || !span.parentSpanId) {
|
|
10
|
+
cache.set(spanId, 0);
|
|
11
|
+
return 0;
|
|
12
|
+
}
|
|
13
|
+
const depth = calculateDepth(span.parentSpanId, spanMap, cache) + 1;
|
|
14
|
+
cache.set(spanId, depth);
|
|
15
|
+
return depth;
|
|
16
|
+
}
|
|
17
|
+
function enrichSpans(rawSpans) {
|
|
18
|
+
const spanMap = new Map();
|
|
19
|
+
for (const span of rawSpans) {
|
|
20
|
+
spanMap.set(span.id, span);
|
|
21
|
+
}
|
|
22
|
+
const depthCache = new Map();
|
|
23
|
+
const childrenCount = new Map();
|
|
24
|
+
for (const span of rawSpans) {
|
|
25
|
+
if (span.parentSpanId) {
|
|
26
|
+
childrenCount.set(span.parentSpanId, (childrenCount.get(span.parentSpanId) ?? 0) + 1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const allSpans = new Map();
|
|
30
|
+
let min = Infinity;
|
|
31
|
+
let max = -Infinity;
|
|
32
|
+
for (const span of rawSpans) {
|
|
33
|
+
const depth = calculateDepth(span.id, spanMap, depthCache);
|
|
34
|
+
const hasChildren = (childrenCount.get(span.id) ?? 0) > 0;
|
|
35
|
+
allSpans.set(span.id, { ...span, depth, hasChildren, isCollapsed: false });
|
|
36
|
+
if (span.startedAt < min)
|
|
37
|
+
min = span.startedAt;
|
|
38
|
+
const end = span.endedAt ?? Date.now();
|
|
39
|
+
if (end > max)
|
|
40
|
+
max = end;
|
|
41
|
+
}
|
|
42
|
+
if (min === Infinity)
|
|
43
|
+
min = Date.now();
|
|
44
|
+
if (max === -Infinity)
|
|
45
|
+
max = Date.now();
|
|
46
|
+
if (max === min)
|
|
47
|
+
max = min + 100;
|
|
48
|
+
return { allSpans, timeRange: { min, max } };
|
|
49
|
+
}
|
|
50
|
+
function buildFlatList(allSpans, collapsedIds) {
|
|
51
|
+
const children = new Map();
|
|
52
|
+
for (const span of allSpans.values()) {
|
|
53
|
+
const parent = span.parentSpanId ?? null;
|
|
54
|
+
let group = children.get(parent);
|
|
55
|
+
if (!group) {
|
|
56
|
+
group = [];
|
|
57
|
+
children.set(parent, group);
|
|
58
|
+
}
|
|
59
|
+
group.push(span);
|
|
60
|
+
}
|
|
61
|
+
for (const group of children.values()) {
|
|
62
|
+
group.sort((a, b) => a.startedAt - b.startedAt);
|
|
63
|
+
}
|
|
64
|
+
const result = [];
|
|
65
|
+
function dfs(parentId) {
|
|
66
|
+
const kids = children.get(parentId);
|
|
67
|
+
if (!kids)
|
|
68
|
+
return;
|
|
69
|
+
for (const span of kids) {
|
|
70
|
+
result.push({ ...span, isCollapsed: collapsedIds.has(span.id) });
|
|
71
|
+
if (!collapsedIds.has(span.id)) {
|
|
72
|
+
dfs(span.id);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
dfs(null);
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
const SpanChildResource = resource(({ span, timeRange, onToggleCollapse, }) => {
|
|
80
|
+
const state = {
|
|
81
|
+
...span,
|
|
82
|
+
children: [],
|
|
83
|
+
timeRange,
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
getState: () => state,
|
|
87
|
+
child: () => {
|
|
88
|
+
throw new Error("child spans do not have children in flat mode");
|
|
89
|
+
},
|
|
90
|
+
toggleCollapse: () => {
|
|
91
|
+
onToggleCollapse(span.id);
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
export const SpanResource = resource(({ spans }) => {
|
|
96
|
+
const { allSpans, timeRange } = tapMemo(() => enrichSpans(spans), [spans]);
|
|
97
|
+
const [collapsedIds, setCollapsedIds] = tapState(() => new Set());
|
|
98
|
+
const visibleSpans = tapMemo(() => buildFlatList(allSpans, collapsedIds), [allSpans, collapsedIds]);
|
|
99
|
+
const toggleCollapse = (spanId) => {
|
|
100
|
+
setCollapsedIds((prev) => {
|
|
101
|
+
const next = new Set(prev);
|
|
102
|
+
if (next.has(spanId)) {
|
|
103
|
+
next.delete(spanId);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
next.add(spanId);
|
|
107
|
+
}
|
|
108
|
+
return next;
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const lookup = tapClientLookup(() => visibleSpans.map((span) => withKey(span.id, SpanChildResource({
|
|
112
|
+
span,
|
|
113
|
+
timeRange,
|
|
114
|
+
onToggleCollapse: toggleCollapse,
|
|
115
|
+
}))), [visibleSpans, timeRange, toggleCollapse]);
|
|
116
|
+
const rootState = {
|
|
117
|
+
id: "__root__",
|
|
118
|
+
parentSpanId: null,
|
|
119
|
+
name: "",
|
|
120
|
+
type: "root",
|
|
121
|
+
status: "completed",
|
|
122
|
+
startedAt: timeRange.min,
|
|
123
|
+
endedAt: timeRange.max,
|
|
124
|
+
latencyMs: timeRange.max - timeRange.min,
|
|
125
|
+
depth: -1,
|
|
126
|
+
hasChildren: lookup.state.length > 0,
|
|
127
|
+
isCollapsed: false,
|
|
128
|
+
children: lookup.state,
|
|
129
|
+
timeRange,
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
getState: () => rootState,
|
|
133
|
+
child: lookup.get,
|
|
134
|
+
toggleCollapse: () => {
|
|
135
|
+
// Root span collapse is a no-op
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=SpanResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpanResource.js","sourceRoot":"","sources":["../../src/resources/SpanResource.tsx"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@assistant-ui/react-o11y",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Observability primitives for @assistant-ui",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"observability",
|
|
7
|
+
"tracing",
|
|
8
|
+
"spans",
|
|
9
|
+
"waterfall",
|
|
10
|
+
"assistant-ui",
|
|
11
|
+
"react"
|
|
12
|
+
],
|
|
13
|
+
"author": "AgentbaseAI Inc.",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"aui-source": "./src/index.ts",
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"main": "./dist/index.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"src",
|
|
28
|
+
"README.md"
|
|
29
|
+
],
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "aui-build"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@assistant-ui/store": "workspace:*",
|
|
36
|
+
"@assistant-ui/tap": "workspace:*",
|
|
37
|
+
"@radix-ui/react-primitive": "^2.1.4"
|
|
38
|
+
},
|
|
39
|
+
"peerDependencies": {
|
|
40
|
+
"@types/react": "*",
|
|
41
|
+
"react": "^18 || ^19"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"@types/react": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@assistant-ui/x-buildutils": "workspace:*",
|
|
50
|
+
"@types/react": "^19.2.13",
|
|
51
|
+
"react": "^19.2.4"
|
|
52
|
+
},
|
|
53
|
+
"publishConfig": {
|
|
54
|
+
"access": "public",
|
|
55
|
+
"provenance": false
|
|
56
|
+
},
|
|
57
|
+
"homepage": "https://www.assistant-ui.com/",
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "git+https://github.com/assistant-ui/assistant-ui.git",
|
|
61
|
+
"directory": "packages/react-o11y"
|
|
62
|
+
},
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://github.com/assistant-ui/assistant-ui/issues"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FC, PropsWithChildren } from "react";
|
|
2
|
+
import { useAui, AuiProvider, Derived } from "@assistant-ui/store";
|
|
3
|
+
|
|
4
|
+
export const SpanByIndexProvider: FC<PropsWithChildren<{ index: number }>> = ({
|
|
5
|
+
index,
|
|
6
|
+
children,
|
|
7
|
+
}) => {
|
|
8
|
+
const parentAui = useAui();
|
|
9
|
+
|
|
10
|
+
const aui = useAui({
|
|
11
|
+
span: Derived({
|
|
12
|
+
source: "span",
|
|
13
|
+
query: { index },
|
|
14
|
+
get: () => parentAui.span().child({ index }),
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return <AuiProvider value={aui}>{children}</AuiProvider>;
|
|
19
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * as SpanPrimitive from "./primitives/span";
|
|
2
|
+
|
|
3
|
+
export { SpanResource } from "./resources/SpanResource";
|
|
4
|
+
export type { SpanData } from "./resources/SpanResource";
|
|
5
|
+
export type { SpanItemState, SpanState } from "./o11y-scope";
|
|
6
|
+
|
|
7
|
+
export { SpanByIndexProvider } from "./context/SpanByIndexProvider";
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import "@assistant-ui/store";
|
|
2
|
+
|
|
3
|
+
export type SpanItemState = {
|
|
4
|
+
id: string;
|
|
5
|
+
parentSpanId: string | null;
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
status: "running" | "completed" | "failed" | "skipped";
|
|
9
|
+
startedAt: number;
|
|
10
|
+
endedAt: number | null;
|
|
11
|
+
latencyMs: number | null;
|
|
12
|
+
depth: number;
|
|
13
|
+
hasChildren: boolean;
|
|
14
|
+
isCollapsed: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export type SpanState = SpanItemState & {
|
|
18
|
+
children: SpanItemState[];
|
|
19
|
+
timeRange: { min: number; max: number };
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type SpanMethods = {
|
|
23
|
+
getState: () => SpanState;
|
|
24
|
+
child: (lookup: SpanMeta["query"]) => SpanMethods;
|
|
25
|
+
toggleCollapse: () => void;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
type SpanMeta = {
|
|
29
|
+
source: "span";
|
|
30
|
+
query: { index: number } | { key: string };
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
declare module "@assistant-ui/store" {
|
|
34
|
+
interface ScopeRegistry {
|
|
35
|
+
span: {
|
|
36
|
+
methods: SpanMethods;
|
|
37
|
+
meta: SpanMeta;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type ComponentType, type FC, memo, useMemo } from "react";
|
|
2
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
+
import { SpanByIndexProvider } from "../../context/SpanByIndexProvider";
|
|
4
|
+
|
|
5
|
+
export namespace SpanPrimitiveChildren {
|
|
6
|
+
export type Props = {
|
|
7
|
+
components: {
|
|
8
|
+
Span: ComponentType;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export namespace SpanPrimitiveChildByIndex {
|
|
14
|
+
export type Props = {
|
|
15
|
+
index: number;
|
|
16
|
+
components: SpanPrimitiveChildren.Props["components"];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const SpanPrimitiveChildByIndex: FC<SpanPrimitiveChildByIndex.Props> =
|
|
21
|
+
memo(
|
|
22
|
+
({ index, components }) => {
|
|
23
|
+
return (
|
|
24
|
+
<SpanByIndexProvider index={index}>
|
|
25
|
+
<components.Span />
|
|
26
|
+
</SpanByIndexProvider>
|
|
27
|
+
);
|
|
28
|
+
},
|
|
29
|
+
(prev, next) =>
|
|
30
|
+
prev.index === next.index &&
|
|
31
|
+
prev.components.Span === next.components.Span,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
SpanPrimitiveChildByIndex.displayName = "SpanPrimitive.ChildByIndex";
|
|
35
|
+
|
|
36
|
+
const SpanPrimitiveChildrenImpl: FC<SpanPrimitiveChildren.Props> = ({
|
|
37
|
+
components,
|
|
38
|
+
}) => {
|
|
39
|
+
const childrenLength = useAuiState((s) => s.span.children.length);
|
|
40
|
+
|
|
41
|
+
const childElements = useMemo(() => {
|
|
42
|
+
if (childrenLength === 0) return null;
|
|
43
|
+
return Array.from({ length: childrenLength }, (_, index) => (
|
|
44
|
+
<SpanPrimitiveChildByIndex
|
|
45
|
+
key={index}
|
|
46
|
+
index={index}
|
|
47
|
+
components={components}
|
|
48
|
+
/>
|
|
49
|
+
));
|
|
50
|
+
}, [childrenLength, components]);
|
|
51
|
+
|
|
52
|
+
return childElements;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export const SpanPrimitiveChildren: FC<SpanPrimitiveChildren.Props> = memo(
|
|
56
|
+
SpanPrimitiveChildrenImpl,
|
|
57
|
+
(prev, next) => prev.components.Span === next.components.Span,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
SpanPrimitiveChildren.displayName = "SpanPrimitive.Children";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
} from "react";
|
|
6
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
7
|
+
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
8
|
+
|
|
9
|
+
export namespace SpanPrimitiveCollapseToggle {
|
|
10
|
+
export type Element = ComponentRef<typeof Primitive.button>;
|
|
11
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.button>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SpanPrimitiveCollapseToggle = forwardRef<
|
|
15
|
+
SpanPrimitiveCollapseToggle.Element,
|
|
16
|
+
SpanPrimitiveCollapseToggle.Props
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const hasChildren = useAuiState((s) => s.span.hasChildren);
|
|
19
|
+
const isCollapsed = useAuiState((s) => s.span.isCollapsed);
|
|
20
|
+
const aui = useAui();
|
|
21
|
+
|
|
22
|
+
if (!hasChildren) return null;
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Primitive.button
|
|
26
|
+
type="button"
|
|
27
|
+
{...props}
|
|
28
|
+
ref={ref}
|
|
29
|
+
data-collapsed={isCollapsed}
|
|
30
|
+
onClick={(e) => {
|
|
31
|
+
e.stopPropagation();
|
|
32
|
+
aui.span().toggleCollapse();
|
|
33
|
+
props.onClick?.(e);
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
SpanPrimitiveCollapseToggle.displayName = "SpanPrimitive.CollapseToggle";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
useMemo,
|
|
6
|
+
} from "react";
|
|
7
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
8
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
9
|
+
|
|
10
|
+
export namespace SpanPrimitiveIndent {
|
|
11
|
+
export type Element = ComponentRef<typeof Primitive.div>;
|
|
12
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {
|
|
13
|
+
baseIndent?: number;
|
|
14
|
+
indentPerLevel?: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const SpanPrimitiveIndent = forwardRef<
|
|
19
|
+
SpanPrimitiveIndent.Element,
|
|
20
|
+
SpanPrimitiveIndent.Props
|
|
21
|
+
>(({ baseIndent = 8, indentPerLevel = 12, style, ...props }, ref) => {
|
|
22
|
+
const depth = useAuiState((s) => s.span.depth);
|
|
23
|
+
|
|
24
|
+
const mergedStyle = useMemo(
|
|
25
|
+
() => ({
|
|
26
|
+
...style,
|
|
27
|
+
paddingLeft: baseIndent + depth * indentPerLevel,
|
|
28
|
+
}),
|
|
29
|
+
[style, baseIndent, depth, indentPerLevel],
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<Primitive.div
|
|
34
|
+
{...props}
|
|
35
|
+
ref={ref}
|
|
36
|
+
style={mergedStyle}
|
|
37
|
+
data-span-depth={depth}
|
|
38
|
+
/>
|
|
39
|
+
);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
SpanPrimitiveIndent.displayName = "SpanPrimitive.Indent";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
} from "react";
|
|
6
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
7
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
8
|
+
|
|
9
|
+
export namespace SpanPrimitiveName {
|
|
10
|
+
export type Element = ComponentRef<typeof Primitive.span>;
|
|
11
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SpanPrimitiveName = forwardRef<
|
|
15
|
+
SpanPrimitiveName.Element,
|
|
16
|
+
SpanPrimitiveName.Props
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const name = useAuiState((s) => s.span.name);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Primitive.span {...props} ref={ref}>
|
|
22
|
+
{props.children ?? name}
|
|
23
|
+
</Primitive.span>
|
|
24
|
+
);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
SpanPrimitiveName.displayName = "SpanPrimitive.Name";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
} from "react";
|
|
6
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
7
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
8
|
+
|
|
9
|
+
export namespace SpanPrimitiveRoot {
|
|
10
|
+
export type Element = ComponentRef<typeof Primitive.div>;
|
|
11
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.div>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SpanPrimitiveRoot = forwardRef<
|
|
15
|
+
SpanPrimitiveRoot.Element,
|
|
16
|
+
SpanPrimitiveRoot.Props
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const spanId = useAuiState((s) => s.span.id);
|
|
19
|
+
const status = useAuiState((s) => s.span.status);
|
|
20
|
+
const type = useAuiState((s) => s.span.type);
|
|
21
|
+
const depth = useAuiState((s) => s.span.depth);
|
|
22
|
+
const isCollapsed = useAuiState((s) => s.span.isCollapsed);
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Primitive.div
|
|
26
|
+
{...props}
|
|
27
|
+
ref={ref}
|
|
28
|
+
data-span-id={spanId}
|
|
29
|
+
data-span-status={status}
|
|
30
|
+
data-span-type={type}
|
|
31
|
+
data-span-depth={depth}
|
|
32
|
+
data-collapsed={isCollapsed}
|
|
33
|
+
/>
|
|
34
|
+
);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
SpanPrimitiveRoot.displayName = "SpanPrimitive.Root";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
} from "react";
|
|
6
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
7
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
8
|
+
|
|
9
|
+
export namespace SpanPrimitiveStatusIndicator {
|
|
10
|
+
export type Element = ComponentRef<typeof Primitive.span>;
|
|
11
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SpanPrimitiveStatusIndicator = forwardRef<
|
|
15
|
+
SpanPrimitiveStatusIndicator.Element,
|
|
16
|
+
SpanPrimitiveStatusIndicator.Props
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const status = useAuiState((s) => s.span.status);
|
|
19
|
+
|
|
20
|
+
return <Primitive.span {...props} ref={ref} data-span-status={status} />;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
SpanPrimitiveStatusIndicator.displayName = "SpanPrimitive.StatusIndicator";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ComponentPropsWithoutRef,
|
|
3
|
+
type ComponentRef,
|
|
4
|
+
forwardRef,
|
|
5
|
+
} from "react";
|
|
6
|
+
import { Primitive } from "@radix-ui/react-primitive";
|
|
7
|
+
import { useAuiState } from "@assistant-ui/store";
|
|
8
|
+
|
|
9
|
+
export namespace SpanPrimitiveTypeBadge {
|
|
10
|
+
export type Element = ComponentRef<typeof Primitive.span>;
|
|
11
|
+
export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const SpanPrimitiveTypeBadge = forwardRef<
|
|
15
|
+
SpanPrimitiveTypeBadge.Element,
|
|
16
|
+
SpanPrimitiveTypeBadge.Props
|
|
17
|
+
>((props, ref) => {
|
|
18
|
+
const type = useAuiState((s) => s.span.type);
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Primitive.span {...props} ref={ref} data-span-type={type}>
|
|
22
|
+
{props.children ?? type}
|
|
23
|
+
</Primitive.span>
|
|
24
|
+
);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
SpanPrimitiveTypeBadge.displayName = "SpanPrimitive.TypeBadge";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { SpanPrimitiveRoot as Root } from "./SpanRoot";
|
|
2
|
+
export { SpanPrimitiveName as Name } from "./SpanName";
|
|
3
|
+
export { SpanPrimitiveTypeBadge as TypeBadge } from "./SpanTypeBadge";
|
|
4
|
+
export { SpanPrimitiveStatusIndicator as StatusIndicator } from "./SpanStatusIndicator";
|
|
5
|
+
export { SpanPrimitiveCollapseToggle as CollapseToggle } from "./SpanCollapseToggle";
|
|
6
|
+
export { SpanPrimitiveIndent as Indent } from "./SpanIndent";
|
|
7
|
+
export { SpanPrimitiveChildren as Children } from "./SpanChildren";
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import "../o11y-scope";
|
|
2
|
+
|
|
3
|
+
import { resource, tapMemo, tapState, withKey } from "@assistant-ui/tap";
|
|
4
|
+
import { tapClientLookup, type ClientOutput } from "@assistant-ui/store";
|
|
5
|
+
import type { SpanItemState, SpanState } from "../o11y-scope";
|
|
6
|
+
|
|
7
|
+
export type SpanData = {
|
|
8
|
+
id: string;
|
|
9
|
+
parentSpanId: string | null;
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
status: "running" | "completed" | "failed" | "skipped";
|
|
13
|
+
startedAt: number;
|
|
14
|
+
endedAt: number | null;
|
|
15
|
+
latencyMs: number | null;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function calculateDepth(
|
|
19
|
+
spanId: string,
|
|
20
|
+
spanMap: Map<string, SpanData>,
|
|
21
|
+
cache: Map<string, number>,
|
|
22
|
+
): number {
|
|
23
|
+
const cached = cache.get(spanId);
|
|
24
|
+
if (cached !== undefined) return cached;
|
|
25
|
+
|
|
26
|
+
const span = spanMap.get(spanId);
|
|
27
|
+
if (!span || !span.parentSpanId) {
|
|
28
|
+
cache.set(spanId, 0);
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const depth = calculateDepth(span.parentSpanId, spanMap, cache) + 1;
|
|
33
|
+
cache.set(spanId, depth);
|
|
34
|
+
return depth;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function enrichSpans(rawSpans: SpanData[]): {
|
|
38
|
+
allSpans: Map<string, SpanItemState>;
|
|
39
|
+
timeRange: { min: number; max: number };
|
|
40
|
+
} {
|
|
41
|
+
const spanMap = new Map<string, SpanData>();
|
|
42
|
+
for (const span of rawSpans) {
|
|
43
|
+
spanMap.set(span.id, span);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const depthCache = new Map<string, number>();
|
|
47
|
+
const childrenCount = new Map<string, number>();
|
|
48
|
+
for (const span of rawSpans) {
|
|
49
|
+
if (span.parentSpanId) {
|
|
50
|
+
childrenCount.set(
|
|
51
|
+
span.parentSpanId,
|
|
52
|
+
(childrenCount.get(span.parentSpanId) ?? 0) + 1,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const allSpans = new Map<string, SpanItemState>();
|
|
58
|
+
let min = Infinity;
|
|
59
|
+
let max = -Infinity;
|
|
60
|
+
|
|
61
|
+
for (const span of rawSpans) {
|
|
62
|
+
const depth = calculateDepth(span.id, spanMap, depthCache);
|
|
63
|
+
const hasChildren = (childrenCount.get(span.id) ?? 0) > 0;
|
|
64
|
+
allSpans.set(span.id, { ...span, depth, hasChildren, isCollapsed: false });
|
|
65
|
+
|
|
66
|
+
if (span.startedAt < min) min = span.startedAt;
|
|
67
|
+
const end = span.endedAt ?? Date.now();
|
|
68
|
+
if (end > max) max = end;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (min === Infinity) min = Date.now();
|
|
72
|
+
if (max === -Infinity) max = Date.now();
|
|
73
|
+
if (max === min) max = min + 100;
|
|
74
|
+
|
|
75
|
+
return { allSpans, timeRange: { min, max } };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildFlatList(
|
|
79
|
+
allSpans: Map<string, SpanItemState>,
|
|
80
|
+
collapsedIds: Set<string>,
|
|
81
|
+
): SpanItemState[] {
|
|
82
|
+
const children = new Map<string | null, SpanItemState[]>();
|
|
83
|
+
for (const span of allSpans.values()) {
|
|
84
|
+
const parent = span.parentSpanId ?? null;
|
|
85
|
+
let group = children.get(parent);
|
|
86
|
+
if (!group) {
|
|
87
|
+
group = [];
|
|
88
|
+
children.set(parent, group);
|
|
89
|
+
}
|
|
90
|
+
group.push(span);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
for (const group of children.values()) {
|
|
94
|
+
group.sort((a, b) => a.startedAt - b.startedAt);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const result: SpanItemState[] = [];
|
|
98
|
+
function dfs(parentId: string | null) {
|
|
99
|
+
const kids = children.get(parentId);
|
|
100
|
+
if (!kids) return;
|
|
101
|
+
for (const span of kids) {
|
|
102
|
+
result.push({ ...span, isCollapsed: collapsedIds.has(span.id) });
|
|
103
|
+
if (!collapsedIds.has(span.id)) {
|
|
104
|
+
dfs(span.id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
dfs(null);
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const SpanChildResource = resource(
|
|
113
|
+
({
|
|
114
|
+
span,
|
|
115
|
+
timeRange,
|
|
116
|
+
onToggleCollapse,
|
|
117
|
+
}: {
|
|
118
|
+
span: SpanItemState;
|
|
119
|
+
timeRange: { min: number; max: number };
|
|
120
|
+
onToggleCollapse: (spanId: string) => void;
|
|
121
|
+
}): ClientOutput<"span"> => {
|
|
122
|
+
const state: SpanState = {
|
|
123
|
+
...span,
|
|
124
|
+
children: [],
|
|
125
|
+
timeRange,
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
getState: () => state,
|
|
129
|
+
child: () => {
|
|
130
|
+
throw new Error("child spans do not have children in flat mode");
|
|
131
|
+
},
|
|
132
|
+
toggleCollapse: () => {
|
|
133
|
+
onToggleCollapse(span.id);
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
},
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
export const SpanResource = resource(
|
|
140
|
+
({ spans }: { spans: SpanData[] }): ClientOutput<"span"> => {
|
|
141
|
+
const { allSpans, timeRange } = tapMemo(() => enrichSpans(spans), [spans]);
|
|
142
|
+
|
|
143
|
+
const [collapsedIds, setCollapsedIds] = tapState<Set<string>>(
|
|
144
|
+
() => new Set(),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
const visibleSpans = tapMemo(
|
|
148
|
+
() => buildFlatList(allSpans, collapsedIds),
|
|
149
|
+
[allSpans, collapsedIds],
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const toggleCollapse = (spanId: string) => {
|
|
153
|
+
setCollapsedIds((prev) => {
|
|
154
|
+
const next = new Set(prev);
|
|
155
|
+
if (next.has(spanId)) {
|
|
156
|
+
next.delete(spanId);
|
|
157
|
+
} else {
|
|
158
|
+
next.add(spanId);
|
|
159
|
+
}
|
|
160
|
+
return next;
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const lookup = tapClientLookup(
|
|
165
|
+
() =>
|
|
166
|
+
visibleSpans.map((span) =>
|
|
167
|
+
withKey(
|
|
168
|
+
span.id,
|
|
169
|
+
SpanChildResource({
|
|
170
|
+
span,
|
|
171
|
+
timeRange,
|
|
172
|
+
onToggleCollapse: toggleCollapse,
|
|
173
|
+
}),
|
|
174
|
+
),
|
|
175
|
+
),
|
|
176
|
+
[visibleSpans, timeRange, toggleCollapse],
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
const rootState: SpanState = {
|
|
180
|
+
id: "__root__",
|
|
181
|
+
parentSpanId: null,
|
|
182
|
+
name: "",
|
|
183
|
+
type: "root",
|
|
184
|
+
status: "completed",
|
|
185
|
+
startedAt: timeRange.min,
|
|
186
|
+
endedAt: timeRange.max,
|
|
187
|
+
latencyMs: timeRange.max - timeRange.min,
|
|
188
|
+
depth: -1,
|
|
189
|
+
hasChildren: lookup.state.length > 0,
|
|
190
|
+
isCollapsed: false,
|
|
191
|
+
children: lookup.state,
|
|
192
|
+
timeRange,
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
getState: () => rootState,
|
|
197
|
+
child: lookup.get,
|
|
198
|
+
toggleCollapse: () => {
|
|
199
|
+
// Root span collapse is a no-op
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
},
|
|
203
|
+
);
|