@assistant-ui/store
Advanced tools
@@ -1,12 +0,13 @@ | ||
| import type { ResourceElement } from "@assistant-ui/tap"; | ||
| import type { AssistantClient, ClientElement, ClientNames } from "./types/client.js"; | ||
| import type { DerivedElement } from "./Derived.js"; | ||
| export type ScopesConfig = { | ||
| [K in ClientNames]?: ClientElement<K> | DerivedElement<K>; | ||
| }; | ||
| import { AssistantClient, ClientElement, ClientNames } from "./types/client.js"; | ||
| import { DerivedElement } from "./Derived.js"; | ||
| import { ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/attachTransformScopes.d.ts | ||
| type ScopesConfig = { [K in ClientNames]?: ClientElement<K> | DerivedElement<K> }; | ||
| type TransformScopesFn = (scopes: ScopesConfig, parent: AssistantClient) => void; | ||
| export declare function attachTransformScopes<T extends (...args: any[]) => ResourceElement<any>>(resource: T, transform: TransformScopesFn): void; | ||
| export declare function forwardTransformScopes<T extends (...args: any[]) => ResourceElement<any>, S extends (...args: any[]) => ResourceElement<any>>(target: T, source: S): void; | ||
| export declare function getTransformScopes<T extends (...args: any[]) => ResourceElement<any>>(resource: T): TransformScopesFn | undefined; | ||
| export {}; | ||
| declare function attachTransformScopes<T extends (...args: any[]) => ResourceElement<any>>(resource: T, transform: TransformScopesFn): void; | ||
| declare function forwardTransformScopes<T extends (...args: any[]) => ResourceElement<any>, S extends (...args: any[]) => ResourceElement<any>>(target: T, source: S): void; | ||
| declare function getTransformScopes<T extends (...args: any[]) => ResourceElement<any>>(resource: T): TransformScopesFn | undefined; | ||
| //#endregion | ||
| export { ScopesConfig, attachTransformScopes, forwardTransformScopes, getTransformScopes }; | ||
| //# sourceMappingURL=attachTransformScopes.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"attachTransformScopes.d.ts","sourceRoot":"","sources":["../src/attachTransformScopes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,0BAAuB;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAIhD,MAAM,MAAM,YAAY,GAAG;KACxB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF,KAAK,iBAAiB,GAAG,CACvB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,eAAe,KACpB,IAAI,CAAC;AAMV,wBAAgB,qBAAqB,CACnC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAMjD;AAED,wBAAgB,sBAAsB,CACpC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAc5B;AAED,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAE5C"} | ||
| {"version":3,"file":"attachTransformScopes.d.ts","names":[],"sources":["../src/attachTransformScopes.ts"],"mappings":";;;;;KAUY,YAAA,WACJ,WAAA,IAAe,aAAA,CAAc,CAAA,IAAK,cAAA,CAAe,CAAA;AAAA,KAGpD,iBAAA,IACH,MAAA,EAAQ,YAAA,EACR,MAAA,EAAQ,eAAe;AAAA,iBAOT,qBAAA,eACA,IAAA,YAAgB,eAAA,MAAA,CAC9B,QAAA,EAAU,CAAA,EAAG,SAAA,EAAW,iBAAA;AAAA,iBAQV,sBAAA,eACA,IAAA,YAAgB,eAAA,qBAChB,IAAA,YAAgB,eAAA,MAAA,CAC9B,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,iBAgBL,kBAAA,eACA,IAAA,YAAgB,eAAA,MAAA,CAC9B,QAAA,EAAU,CAAA,GAAI,iBAAA"} |
@@ -0,28 +1,25 @@ | ||
| //#region src/attachTransformScopes.ts | ||
| const TRANSFORM_SCOPES = Symbol("assistant-ui.transform-scopes"); | ||
| export function attachTransformScopes(resource, transform) { | ||
| const r = resource; | ||
| if (r[TRANSFORM_SCOPES]) { | ||
| throw new Error("transformScopes is already attached to this resource"); | ||
| } | ||
| r[TRANSFORM_SCOPES] = transform; | ||
| function attachTransformScopes(resource, transform) { | ||
| const r = resource; | ||
| if (r[TRANSFORM_SCOPES]) throw new Error("transformScopes is already attached to this resource"); | ||
| r[TRANSFORM_SCOPES] = transform; | ||
| } | ||
| export function forwardTransformScopes(target, source) { | ||
| const sourceTransform = getTransformScopes(source); | ||
| if (!sourceTransform) | ||
| return; | ||
| const r = target; | ||
| const existingTransform = r[TRANSFORM_SCOPES]; | ||
| if (existingTransform) { | ||
| r[TRANSFORM_SCOPES] = (scopes, parent) => { | ||
| sourceTransform(scopes, parent); | ||
| existingTransform(scopes, parent); | ||
| }; | ||
| } | ||
| else { | ||
| r[TRANSFORM_SCOPES] = sourceTransform; | ||
| } | ||
| function forwardTransformScopes(target, source) { | ||
| const sourceTransform = getTransformScopes(source); | ||
| if (!sourceTransform) return; | ||
| const r = target; | ||
| const existingTransform = r[TRANSFORM_SCOPES]; | ||
| if (existingTransform) r[TRANSFORM_SCOPES] = (scopes, parent) => { | ||
| sourceTransform(scopes, parent); | ||
| existingTransform(scopes, parent); | ||
| }; | ||
| else r[TRANSFORM_SCOPES] = sourceTransform; | ||
| } | ||
| export function getTransformScopes(resource) { | ||
| return resource[TRANSFORM_SCOPES]; | ||
| function getTransformScopes(resource) { | ||
| return resource[TRANSFORM_SCOPES]; | ||
| } | ||
| //#endregion | ||
| export { attachTransformScopes, forwardTransformScopes, getTransformScopes }; | ||
| //# sourceMappingURL=attachTransformScopes.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"attachTransformScopes.js","sourceRoot":"","sources":["../src/attachTransformScopes.ts"],"names":[],"mappings":"AAQA,MAAM,gBAAgB,GAAG,MAAM,CAAC,+BAA+B,CAAC,CAAC;AAejE,MAAM,UAAU,qBAAqB,CAEnC,QAAW,EAAE,SAA4B;IACzC,MAAM,CAAC,GAAG,QAA2C,CAAC;IACtD,IAAI,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,CAAC,CAAC,gBAAgB,CAAC,GAAG,SAAS,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAGpC,MAAS,EAAE,MAAS;IACpB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,eAAe;QAAE,OAAO;IAE7B,MAAM,CAAC,GAAG,MAAyC,CAAC;IACpD,MAAM,iBAAiB,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC9C,IAAI,iBAAiB,EAAE,CAAC;QACtB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YACvC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAChC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,CAAC,CAAC,gBAAgB,CAAC,GAAG,eAAe,CAAC;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAEhC,QAAW;IACX,OAAQ,QAA4C,CAAC,gBAAgB,CAAC,CAAC;AACzE,CAAC"} | ||
| {"version":3,"file":"attachTransformScopes.js","names":[],"sources":["../src/attachTransformScopes.ts"],"sourcesContent":["import type { ResourceElement } from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n ClientElement,\n ClientNames,\n} from \"./types/client\";\nimport type { DerivedElement } from \"./Derived\";\n\nconst TRANSFORM_SCOPES = Symbol(\"assistant-ui.transform-scopes\");\n\nexport type ScopesConfig = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n};\n\ntype TransformScopesFn = (\n scopes: ScopesConfig,\n parent: AssistantClient,\n) => void;\n\ntype ResourceWithTransformScopes = {\n [TRANSFORM_SCOPES]?: TransformScopesFn;\n};\n\nexport function attachTransformScopes<\n T extends (...args: any[]) => ResourceElement<any>,\n>(resource: T, transform: TransformScopesFn): void {\n const r = resource as T & ResourceWithTransformScopes;\n if (r[TRANSFORM_SCOPES]) {\n throw new Error(\"transformScopes is already attached to this resource\");\n }\n r[TRANSFORM_SCOPES] = transform;\n}\n\nexport function forwardTransformScopes<\n T extends (...args: any[]) => ResourceElement<any>,\n S extends (...args: any[]) => ResourceElement<any>,\n>(target: T, source: S): void {\n const sourceTransform = getTransformScopes(source);\n if (!sourceTransform) return;\n\n const r = target as T & ResourceWithTransformScopes;\n const existingTransform = r[TRANSFORM_SCOPES];\n if (existingTransform) {\n r[TRANSFORM_SCOPES] = (scopes, parent) => {\n sourceTransform(scopes, parent);\n existingTransform(scopes, parent);\n };\n } else {\n r[TRANSFORM_SCOPES] = sourceTransform;\n }\n}\n\nexport function getTransformScopes<\n T extends (...args: any[]) => ResourceElement<any>,\n>(resource: T): TransformScopesFn | undefined {\n return (resource as T & ResourceWithTransformScopes)[TRANSFORM_SCOPES];\n}\n"],"mappings":";AAQA,MAAM,mBAAmB,OAAO,+BAA+B;AAe/D,SAAgB,sBAEd,UAAa,WAAoC;CACjD,MAAM,IAAI;CACV,IAAI,EAAE,mBACJ,MAAM,IAAI,MAAM,sDAAsD;CAExE,EAAE,oBAAoB;AACxB;AAEA,SAAgB,uBAGd,QAAW,QAAiB;CAC5B,MAAM,kBAAkB,mBAAmB,MAAM;CACjD,IAAI,CAAC,iBAAiB;CAEtB,MAAM,IAAI;CACV,MAAM,oBAAoB,EAAE;CAC5B,IAAI,mBACF,EAAE,qBAAqB,QAAQ,WAAW;EACxC,gBAAgB,QAAQ,MAAM;EAC9B,kBAAkB,QAAQ,MAAM;CAClC;MAEA,EAAE,oBAAoB;AAE1B;AAEA,SAAgB,mBAEd,UAA4C;CAC5C,OAAQ,SAA6C;AACvD"} |
+19
-15
@@ -1,17 +0,19 @@ | ||
| import type { FC, PropsWithChildren } from "react"; | ||
| import type { AssistantState } from "./types/client.js"; | ||
| export declare namespace AuiIf { | ||
| /** Props for `AuiIf`. */ | ||
| type Props = PropsWithChildren<{ | ||
| /** | ||
| * Selector that decides whether to render `children`. Children render | ||
| * when this returns `true` and unmount when it returns `false`. | ||
| */ | ||
| condition: AuiIf.Condition; | ||
| }>; | ||
| import { AssistantState } from "./types/client.js"; | ||
| import { FC, PropsWithChildren } from "react"; | ||
| //#region src/AuiIf.d.ts | ||
| declare namespace AuiIf { | ||
| /** Props for `AuiIf`. */ | ||
| type Props = PropsWithChildren<{ | ||
| /** | ||
| * Selector passed to `AuiIf`. Receives the assistant state and must | ||
| * return a boolean. | ||
| * Selector that decides whether to render `children`. Children render | ||
| * when this returns `true` and unmount when it returns `false`. | ||
| */ | ||
| type Condition = (state: AssistantState) => boolean; | ||
| condition: AuiIf.Condition; | ||
| }>; | ||
| /** | ||
| * Selector passed to `AuiIf`. Receives the assistant state and must | ||
| * return a boolean. | ||
| */ | ||
| type Condition = (state: AssistantState) => boolean; | ||
| } | ||
@@ -40,3 +42,5 @@ /** | ||
| */ | ||
| export declare const AuiIf: FC<AuiIf.Props>; | ||
| declare const AuiIf: FC<AuiIf.Props>; | ||
| //#endregion | ||
| export { AuiIf }; | ||
| //# sourceMappingURL=AuiIf.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"AuiIf.d.ts","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAErD,yBAAiB,KAAK,CAAC;IACrB,yBAAyB;IACzB,KAAY,KAAK,GAAG,iBAAiB,CAAC;QACpC;;;WAGG;QACH,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC;KAC5B,CAAC,CAAC;IAEH;;;OAGG;IACH,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAGjC,CAAC"} | ||
| {"version":3,"file":"AuiIf.d.ts","names":[],"sources":["../src/AuiIf.ts"],"mappings":";;;;kBAMiB,KAAA;;OAEH,KAAA,GAAQ,iBAAA;IAFA;;;;IAOlB,SAAA,EAAW,KAAA,CAAM,SAAA;EAAA;EAO2B;;;;EAAA,KAAlC,SAAA,IAAa,KAAA,EAAO,cAAA;AAAA;;;;;AAAc;AAyBhD;;;;;;;;AAAkC;;;;;;;;;cAArB,KAAA,EAAO,EAAE,CAAC,KAAA,CAAM,KAAA"} |
+27
-24
| "use client"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| //#region src/AuiIf.ts | ||
| /** | ||
| * Conditionally renders children based on a slice of assistant state. | ||
| * | ||
| * A thin wrapper around {@link useAuiState} that renders its children | ||
| * when `condition` returns `true` and unmounts them when it returns | ||
| * `false`. Keeps render logic declarative without mounting unused | ||
| * subtrees. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.isRunning}> | ||
| * <CancelButton /> | ||
| * </AuiIf> | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.messages.length === 0}> | ||
| * <EmptyState /> | ||
| * </AuiIf> | ||
| * ``` | ||
| */ | ||
| export const AuiIf = ({ children, condition }) => { | ||
| const result = useAuiState(condition); | ||
| return result ? children : null; | ||
| * Conditionally renders children based on a slice of assistant state. | ||
| * | ||
| * A thin wrapper around {@link useAuiState} that renders its children | ||
| * when `condition` returns `true` and unmounts them when it returns | ||
| * `false`. Keeps render logic declarative without mounting unused | ||
| * subtrees. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.isRunning}> | ||
| * <CancelButton /> | ||
| * </AuiIf> | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <AuiIf condition={(s) => s.thread.messages.length === 0}> | ||
| * <EmptyState /> | ||
| * </AuiIf> | ||
| * ``` | ||
| */ | ||
| const AuiIf = ({ children, condition }) => { | ||
| return useAuiState(condition) ? children : null; | ||
| }; | ||
| AuiIf.displayName = "AuiIf"; | ||
| //#endregion | ||
| export { AuiIf }; | ||
| //# sourceMappingURL=AuiIf.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"AuiIf.js","sourceRoot":"","sources":["../src/AuiIf.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAoB5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,KAAK,GAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;IAChE,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC,CAAC;AAEF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC"} | ||
| {"version":3,"file":"AuiIf.js","names":[],"sources":["../src/AuiIf.ts"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useAuiState } from \"./useAuiState\";\nimport type { AssistantState } from \"./types/client\";\n\nexport namespace AuiIf {\n /** Props for `AuiIf`. */\n export type Props = PropsWithChildren<{\n /**\n * Selector that decides whether to render `children`. Children render\n * when this returns `true` and unmount when it returns `false`.\n */\n condition: AuiIf.Condition;\n }>;\n\n /**\n * Selector passed to `AuiIf`. Receives the assistant state and must\n * return a boolean.\n */\n export type Condition = (state: AssistantState) => boolean;\n}\n\n/**\n * Conditionally renders children based on a slice of assistant state.\n *\n * A thin wrapper around {@link useAuiState} that renders its children\n * when `condition` returns `true` and unmounts them when it returns\n * `false`. Keeps render logic declarative without mounting unused\n * subtrees.\n *\n * @example\n * ```tsx\n * <AuiIf condition={(s) => s.thread.isRunning}>\n * <CancelButton />\n * </AuiIf>\n * ```\n *\n * @example\n * ```tsx\n * <AuiIf condition={(s) => s.thread.messages.length === 0}>\n * <EmptyState />\n * </AuiIf>\n * ```\n */\nexport const AuiIf: FC<AuiIf.Props> = ({ children, condition }) => {\n const result = useAuiState(condition);\n return result ? children : null;\n};\n\nAuiIf.displayName = \"AuiIf\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAa,SAA0B,EAAE,UAAU,gBAAgB;CAEjE,OADe,YAAY,SACf,IAAI,WAAW;AAC7B;AAEA,MAAM,cAAc"} |
+15
-11
@@ -1,3 +0,5 @@ | ||
| import { type ResourceElement } from "@assistant-ui/tap"; | ||
| import type { AssistantClient, ClientNames, AssistantClientAccessor, ClientMeta } from "./types/client.js"; | ||
| import { AssistantClient, AssistantClientAccessor, ClientMeta, ClientNames } from "./types/client.js"; | ||
| import { ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/Derived.d.ts | ||
| /** | ||
@@ -22,12 +24,14 @@ * Creates a derived client field that references a client from a parent scope. | ||
| */ | ||
| export declare const Derived: <K extends ClientNames>(props: Derived.Props<K>) => ResourceElement<null, Derived.Props<K>>; | ||
| export type DerivedElement<K extends ClientNames> = ResourceElement<null, Derived.Props<K>>; | ||
| export declare namespace Derived { | ||
| /** | ||
| * Props passed to a derived client resource element. | ||
| */ | ||
| type Props<K extends ClientNames> = { | ||
| get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>; | ||
| } & ClientMeta<K>; | ||
| declare const Derived: <K extends ClientNames>(props: Derived.Props<K>) => ResourceElement<null, Derived.Props<K>>; | ||
| type DerivedElement<K extends ClientNames> = ResourceElement<null, Derived.Props<K>>; | ||
| declare namespace Derived { | ||
| /** | ||
| * Props passed to a derived client resource element. | ||
| */ | ||
| type Props<K extends ClientNames> = { | ||
| get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>; | ||
| } & ClientMeta<K>; | ||
| } | ||
| //#endregion | ||
| export { Derived, DerivedElement }; | ||
| //# sourceMappingURL=Derived.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Derived.d.ts","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,UAAU,EACX,0BAAuB;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GACjB,CAAC,SAAS,WAAW,qEAGvB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI,eAAe,CACjE,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC;AAEF,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI;QACzC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;CACnB"} | ||
| {"version":3,"file":"Derived.d.ts","names":[],"sources":["../src/Derived.ts"],"mappings":";;;;;;AA2BA;;;;;;;;;;;;;;;;;cAAa,OAAA,aACA,WAAA,EAAW,KAAA,EAAA,OAAA,CAAA,KAAA,CAAA,CAAA,MAAA,eAAA,OAAA,OAAA,CAAA,KAAA,CAAA,CAAA;AAAA,KAKZ,cAAA,WAAyB,WAAA,IAAe,eAAA,OAElD,OAAA,CAAQ,KAAA,CAAM,CAAA;AAAA,kBAGC,OAAA;EAVO;;AAAA;EAAA,KAcV,KAAA,WAAgB,WAAA;IAC1B,GAAA,GAAM,MAAA,EAAQ,eAAA,KAAoB,UAAA,CAAW,uBAAA,CAAwB,CAAA;EAAA,IACnE,UAAA,CAAW,CAAA;AAAA"} |
+24
-20
| import { resource } from "@assistant-ui/tap"; | ||
| //#region src/Derived.ts | ||
| /** | ||
| * Creates a derived client field that references a client from a parent scope. | ||
| * The get callback always calls the most recent version (useEffectEvent pattern). | ||
| * | ||
| * IMPORTANT: The `get` callback must return a client that was created via | ||
| * `tapClientResource` (or `tapClientLookup`/`tapClientList` which use it internally). | ||
| * This is required for event scoping to work correctly. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const aui = useAui({ | ||
| * message: Derived({ | ||
| * source: "thread", | ||
| * query: { index: 0 }, | ||
| * get: (aui) => aui.thread().message({ index: 0 }), | ||
| * }), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export const Derived = resource((_config) => { | ||
| return null; | ||
| * Creates a derived client field that references a client from a parent scope. | ||
| * The get callback always calls the most recent version (useEffectEvent pattern). | ||
| * | ||
| * IMPORTANT: The `get` callback must return a client that was created via | ||
| * `tapClientResource` (or `tapClientLookup`/`tapClientList` which use it internally). | ||
| * This is required for event scoping to work correctly. | ||
| * | ||
| * @example | ||
| * ```typescript | ||
| * const aui = useAui({ | ||
| * message: Derived({ | ||
| * source: "thread", | ||
| * query: { index: 0 }, | ||
| * get: (aui) => aui.thread().message({ index: 0 }), | ||
| * }), | ||
| * }); | ||
| * ``` | ||
| */ | ||
| const Derived = resource((_config) => { | ||
| return null; | ||
| }); | ||
| //#endregion | ||
| export { Derived }; | ||
| //# sourceMappingURL=Derived.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"Derived.js","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAwB,MAAM,mBAAmB,CAAC;AAQnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAC7B,CAAwB,OAAyB,EAAQ,EAAE;IACzD,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC"} | ||
| {"version":3,"file":"Derived.js","names":[],"sources":["../src/Derived.ts"],"sourcesContent":["import { resource, type ResourceElement } from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n ClientNames,\n AssistantClientAccessor,\n ClientMeta,\n} from \"./types/client\";\n\n/**\n * Creates a derived client field that references a client from a parent scope.\n * The get callback always calls the most recent version (useEffectEvent pattern).\n *\n * IMPORTANT: The `get` callback must return a client that was created via\n * `tapClientResource` (or `tapClientLookup`/`tapClientList` which use it internally).\n * This is required for event scoping to work correctly.\n *\n * @example\n * ```typescript\n * const aui = useAui({\n * message: Derived({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (aui) => aui.thread().message({ index: 0 }),\n * }),\n * });\n * ```\n */\nexport const Derived = resource(\n <K extends ClientNames>(_config: Derived.Props<K>): null => {\n return null;\n },\n);\n\nexport type DerivedElement<K extends ClientNames> = ResourceElement<\n null,\n Derived.Props<K>\n>;\n\nexport namespace Derived {\n /**\n * Props passed to a derived client resource element.\n */\n export type Props<K extends ClientNames> = {\n get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>;\n } & ClientMeta<K>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,UAAU,UACG,YAAoC;CAC1D,OAAO;AACT,CACF"} |
+15
-16
@@ -1,16 +0,15 @@ | ||
| export { useAui } from "./useAui.js"; | ||
| export { useAuiState } from "./useAuiState.js"; | ||
| export { useAuiEvent } from "./useAuiEvent.js"; | ||
| export { RenderChildrenWithAccessor } from "./RenderChildrenWithAccessor.js"; | ||
| export { AuiIf } from "./AuiIf.js"; | ||
| export { AuiProvider } from "./utils/react-assistant-context.js"; | ||
| export { Derived } from "./Derived.js"; | ||
| export { attachTransformScopes, forwardTransformScopes, } from "./attachTransformScopes.js"; | ||
| export type { ScopesConfig } from "./attachTransformScopes.js"; | ||
| export { tapAssistantClientRef, tapAssistantEmit, } from "./utils/tap-assistant-context.js"; | ||
| export { tapClientResource } from "./tapClientResource.js"; | ||
| export { tapClientLookup } from "./tapClientLookup.js"; | ||
| export { tapClientList } from "./tapClientList.js"; | ||
| export type { ScopeRegistry, ClientOutput, ClientMethods, ClientSchema, ClientNames, ClientEvents, ClientMeta, ClientElement, Unsubscribe, AssistantClientAccessor, AssistantClient, AssistantState, } from "./types/client.js"; | ||
| export { normalizeEventSelector, type AssistantEventName, type AssistantEventCallback, type AssistantEventPayload, type AssistantEventSelector, type AssistantEventScope, } from "./types/events.js"; | ||
| //# sourceMappingURL=index.d.ts.map | ||
| import { AssistantEventCallback, AssistantEventName, AssistantEventPayload, AssistantEventScope, AssistantEventSelector, normalizeEventSelector } from "./types/events.js"; | ||
| import { AssistantClient, AssistantClientAccessor, AssistantState, ClientElement, ClientEvents, ClientMeta, ClientMethods, ClientNames, ClientOutput, ClientSchema, ScopeRegistry, Unsubscribe } from "./types/client.js"; | ||
| import { AuiIf } from "./AuiIf.js"; | ||
| import { Derived } from "./Derived.js"; | ||
| import { RenderChildrenWithAccessor } from "./RenderChildrenWithAccessor.js"; | ||
| import { ScopesConfig, attachTransformScopes, forwardTransformScopes } from "./attachTransformScopes.js"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| import { useAuiEvent } from "./useAuiEvent.js"; | ||
| import { AuiProvider } from "./utils/react-assistant-context.js"; | ||
| import { tapAssistantClientRef, tapAssistantEmit } from "./utils/tap-assistant-context.js"; | ||
| import { tapClientResource } from "./tapClientResource.js"; | ||
| import { tapClientLookup } from "./tapClientLookup.js"; | ||
| import { tapClientList } from "./tapClientList.js"; | ||
| export { type AssistantClient, type AssistantClientAccessor, type AssistantEventCallback, type AssistantEventName, type AssistantEventPayload, type AssistantEventScope, type AssistantEventSelector, type AssistantState, AuiIf, AuiProvider, type ClientElement, type ClientEvents, type ClientMeta, type ClientMethods, type ClientNames, type ClientOutput, type ClientSchema, Derived, RenderChildrenWithAccessor, type ScopeRegistry, type ScopesConfig, type Unsubscribe, attachTransformScopes, forwardTransformScopes, normalizeEventSelector, tapAssistantClientRef, tapAssistantEmit, tapClientList, tapClientLookup, tapClientResource, useAui, useAuiEvent, useAuiState }; |
+14
-18
@@ -1,18 +0,14 @@ | ||
| // hooks | ||
| export { useAui } from "./useAui.js"; | ||
| export { useAuiState } from "./useAuiState.js"; | ||
| export { useAuiEvent } from "./useAuiEvent.js"; | ||
| export { RenderChildrenWithAccessor } from "./RenderChildrenWithAccessor.js"; | ||
| // components | ||
| export { AuiIf } from "./AuiIf.js"; | ||
| export { AuiProvider } from "./utils/react-assistant-context.js"; | ||
| // resources | ||
| export { Derived } from "./Derived.js"; | ||
| export { attachTransformScopes, forwardTransformScopes, } from "./attachTransformScopes.js"; | ||
| // tap hooks | ||
| export { tapAssistantClientRef, tapAssistantEmit, } from "./utils/tap-assistant-context.js"; | ||
| export { tapClientResource } from "./tapClientResource.js"; | ||
| export { tapClientLookup } from "./tapClientLookup.js"; | ||
| export { tapClientList } from "./tapClientList.js"; | ||
| export { normalizeEventSelector, } from "./types/events.js"; | ||
| //# sourceMappingURL=index.js.map | ||
| import { tapClientResource } from "./tapClientResource.js"; | ||
| import { AuiProvider } from "./utils/react-assistant-context.js"; | ||
| import { Derived } from "./Derived.js"; | ||
| import { attachTransformScopes, forwardTransformScopes } from "./attachTransformScopes.js"; | ||
| import { normalizeEventSelector } from "./types/events.js"; | ||
| import { tapAssistantClientRef, tapAssistantEmit } from "./utils/tap-assistant-context.js"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| import { AuiIf } from "./AuiIf.js"; | ||
| import { RenderChildrenWithAccessor } from "./RenderChildrenWithAccessor.js"; | ||
| import { useAuiEvent } from "./useAuiEvent.js"; | ||
| import { tapClientLookup } from "./tapClientLookup.js"; | ||
| import { tapClientList } from "./tapClientList.js"; | ||
| export { AuiIf, AuiProvider, Derived, RenderChildrenWithAccessor, attachTransformScopes, forwardTransformScopes, normalizeEventSelector, tapAssistantClientRef, tapAssistantEmit, tapClientList, tapClientLookup, tapClientResource, useAui, useAuiEvent, useAuiState }; |
@@ -1,4 +0,6 @@ | ||
| import { type ReactNode } from "react"; | ||
| import type { AssistantClient } from "./types/client.js"; | ||
| export declare const useGetItemAccessor: <T>(getItemState: (aui: AssistantClient) => T) => () => T; | ||
| import { AssistantClient } from "./types/client.js"; | ||
| import { ReactNode } from "react"; | ||
| //#region src/RenderChildrenWithAccessor.d.ts | ||
| declare const useGetItemAccessor: <T>(getItemState: (aui: AssistantClient) => T) => () => T; | ||
| /** | ||
@@ -19,6 +21,11 @@ * Component that sets up a lazy item accessor and memoizes propless children. | ||
| */ | ||
| export declare function RenderChildrenWithAccessor<T>({ getItemState, children, }: { | ||
| getItemState: (aui: AssistantClient) => T; | ||
| children: (getItem: () => T) => ReactNode; | ||
| declare function RenderChildrenWithAccessor<T>({ | ||
| getItemState, | ||
| children | ||
| }: { | ||
| getItemState: (aui: AssistantClient) => T; | ||
| children: (getItem: () => T) => ReactNode; | ||
| }): ReactNode; | ||
| //#endregion | ||
| export { RenderChildrenWithAccessor, useGetItemAccessor }; | ||
| //# sourceMappingURL=RenderChildrenWithAccessor.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"RenderChildrenWithAccessor.d.ts","sourceRoot":"","sources":["../src/RenderChildrenWithAccessor.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,OAAO,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,0BAAuB;AAItD,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,cAAc,CAAC,GAAG,EAAE,eAAe,KAAK,CAAC,YAoB1C,CAAC;AAIF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,EAC5C,YAAY,EACZ,QAAQ,GACT,EAAE;IACD,YAAY,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,CAAC,CAAC;IAC1C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,SAAS,CAAC;CAC3C,GAAG,SAAS,CAGZ"} | ||
| {"version":3,"file":"RenderChildrenWithAccessor.d.ts","names":[],"sources":["../src/RenderChildrenWithAccessor.tsx"],"mappings":";;;;cAOa,kBAAA,MACX,YAAA,GAAe,GAAA,EAAK,eAAA,KAAoB,CAAA,WAAC,CAAA;;AAD3C;;;;;;;;;;;;;;iBAwCgB,0BAAA,GAAA,CAAA;EACd,YAAA;EACA;AAAA;EAEA,YAAA,GAAe,GAAA,EAAK,eAAA,KAAoB,CAAA;EACxC,QAAA,GAAW,OAAA,QAAe,CAAA,KAAM,SAAA;AAAA,IAC9B,SAAA"} |
| "use client"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| import { useMemo, useRef } from "react"; | ||
| import { useAuiState } from "./useAuiState.js"; | ||
| import { useAui } from "./useAui.js"; | ||
| export const useGetItemAccessor = (getItemState) => { | ||
| const aui = useAui(); | ||
| // Track access with a dedicated flag: | ||
| // useSyncExternalStore may call getSnapshot() after commit (tearing checks), | ||
| // which would re-cache the current state and mask later real updates. | ||
| // Use the current state as the pre-access snapshot so the post-commit check | ||
| // matches getItemState(aui) and doesn't schedule an unnecessary re-render. | ||
| const accessedRef = useRef(false); | ||
| const currentValue = accessedRef.current ? null : getItemState(aui); | ||
| useAuiState(() => { | ||
| if (!accessedRef.current) | ||
| return currentValue; | ||
| return getItemState(aui); | ||
| }); | ||
| return () => { | ||
| accessedRef.current = true; | ||
| return getItemState(aui); | ||
| }; | ||
| //#region src/RenderChildrenWithAccessor.tsx | ||
| const useGetItemAccessor = (getItemState) => { | ||
| const aui = useAui(); | ||
| const accessedRef = useRef(false); | ||
| const currentValue = accessedRef.current ? null : getItemState(aui); | ||
| useAuiState(() => { | ||
| if (!accessedRef.current) return currentValue; | ||
| return getItemState(aui); | ||
| }); | ||
| return () => { | ||
| accessedRef.current = true; | ||
| return getItemState(aui); | ||
| }; | ||
| }; | ||
| const EMPTY_OBJECT = Object.freeze({}); | ||
| /** | ||
| * Component that sets up a lazy item accessor and memoizes propless children. | ||
| * | ||
| * For the common pattern where children returns a component without props | ||
| * (e.g. `<Foo />`), the output is memoized and not re-created on parent re-renders. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <RenderChildrenWithAccessor | ||
| * getItemState={(aui) => aui.fooList().foo({ index }).getState()} | ||
| * > | ||
| * {() => <Foo />} | ||
| * </RenderChildrenWithAccessor> | ||
| * ``` | ||
| */ | ||
| export function RenderChildrenWithAccessor({ getItemState, children, }) { | ||
| const getItem = useGetItemAccessor(getItemState); | ||
| return useMemoizedProplessComponent(children(getItem)); | ||
| * Component that sets up a lazy item accessor and memoizes propless children. | ||
| * | ||
| * For the common pattern where children returns a component without props | ||
| * (e.g. `<Foo />`), the output is memoized and not re-created on parent re-renders. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * <RenderChildrenWithAccessor | ||
| * getItemState={(aui) => aui.fooList().foo({ index }).getState()} | ||
| * > | ||
| * {() => <Foo />} | ||
| * </RenderChildrenWithAccessor> | ||
| * ``` | ||
| */ | ||
| function RenderChildrenWithAccessor({ getItemState, children }) { | ||
| return useMemoizedProplessComponent(children(useGetItemAccessor(getItemState))); | ||
| } | ||
| const useMemoizedProplessComponent = (node) => { | ||
| const el = typeof node === "object" && node != null && "type" in node ? node : null; | ||
| const resultType = el?.type; | ||
| const resultKey = el?.key; | ||
| const resultProps = typeof el?.props === "object" && | ||
| el.props != null && | ||
| Object.entries(el.props).length === 0 | ||
| ? EMPTY_OBJECT | ||
| : el?.props; | ||
| return ( | ||
| // biome-ignore lint/correctness/useExhaustiveDependencies: optimization | ||
| useMemo(() => el, [resultType, resultKey, resultProps]) ?? node); | ||
| const el = typeof node === "object" && node != null && "type" in node ? node : null; | ||
| const resultType = el?.type; | ||
| const resultKey = el?.key; | ||
| return useMemo(() => el, [ | ||
| resultType, | ||
| resultKey, | ||
| typeof el?.props === "object" && el.props != null && Object.entries(el.props).length === 0 ? EMPTY_OBJECT : el?.props | ||
| ]) ?? node; | ||
| }; | ||
| //#endregion | ||
| export { RenderChildrenWithAccessor, useGetItemAccessor }; | ||
| //# sourceMappingURL=RenderChildrenWithAccessor.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"RenderChildrenWithAccessor.js","sourceRoot":"","sources":["../src/RenderChildrenWithAccessor.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAkB,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAElC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,YAAyC,EACzC,EAAE;IACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IAErB,sCAAsC;IACtC,6EAA6E;IAC7E,sEAAsE;IACtE,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACpE,WAAW,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,WAAW,CAAC,OAAO;YAAE,OAAO,YAAY,CAAC;QAC9C,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,EAAE;QACV,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC3B,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CAAI,EAC5C,YAAY,EACZ,QAAQ,GAIT;IACC,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACjD,OAAO,4BAA4B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,4BAA4B,GAAG,CAAC,IAAe,EAAE,EAAE;IACvD,MAAM,EAAE,GACN,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,MAAM,UAAU,GAAG,EAAE,EAAE,IAAI,CAAC;IAC5B,MAAM,SAAS,GAAG,EAAE,EAAE,GAAG,CAAC;IAC1B,MAAM,WAAW,GACf,OAAO,EAAE,EAAE,KAAK,KAAK,QAAQ;QAC7B,EAAE,CAAC,KAAK,IAAI,IAAI;QAChB,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QACnC,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC;IAEhB,OAAO;IACL,wEAAwE;IACxE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,IAAI,CAChE,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"RenderChildrenWithAccessor.js","names":[],"sources":["../src/RenderChildrenWithAccessor.tsx"],"sourcesContent":["\"use client\";\n\nimport { type ReactNode, useMemo, useRef } from \"react\";\nimport type { AssistantClient } from \"./types/client\";\nimport { useAuiState } from \"./useAuiState\";\nimport { useAui } from \"./useAui\";\n\nexport const useGetItemAccessor = <T,>(\n getItemState: (aui: AssistantClient) => T,\n) => {\n const aui = useAui();\n\n // Track access with a dedicated flag:\n // useSyncExternalStore may call getSnapshot() after commit (tearing checks),\n // which would re-cache the current state and mask later real updates.\n // Use the current state as the pre-access snapshot so the post-commit check\n // matches getItemState(aui) and doesn't schedule an unnecessary re-render.\n const accessedRef = useRef(false);\n const currentValue = accessedRef.current ? null : getItemState(aui);\n useAuiState(() => {\n if (!accessedRef.current) return currentValue;\n return getItemState(aui);\n });\n\n return () => {\n accessedRef.current = true;\n return getItemState(aui);\n };\n};\n\nconst EMPTY_OBJECT = Object.freeze({});\n\n/**\n * Component that sets up a lazy item accessor and memoizes propless children.\n *\n * For the common pattern where children returns a component without props\n * (e.g. `<Foo />`), the output is memoized and not re-created on parent re-renders.\n *\n * @example\n * ```tsx\n * <RenderChildrenWithAccessor\n * getItemState={(aui) => aui.fooList().foo({ index }).getState()}\n * >\n * {() => <Foo />}\n * </RenderChildrenWithAccessor>\n * ```\n */\nexport function RenderChildrenWithAccessor<T>({\n getItemState,\n children,\n}: {\n getItemState: (aui: AssistantClient) => T;\n children: (getItem: () => T) => ReactNode;\n}): ReactNode {\n const getItem = useGetItemAccessor(getItemState);\n return useMemoizedProplessComponent(children(getItem));\n}\n\nconst useMemoizedProplessComponent = (node: ReactNode) => {\n const el =\n typeof node === \"object\" && node != null && \"type\" in node ? node : null;\n const resultType = el?.type;\n const resultKey = el?.key;\n const resultProps =\n typeof el?.props === \"object\" &&\n el.props != null &&\n Object.entries(el.props).length === 0\n ? EMPTY_OBJECT\n : el?.props;\n\n return (\n // biome-ignore lint/correctness/useExhaustiveDependencies: optimization\n useMemo(() => el, [resultType, resultKey, resultProps]) ?? node\n );\n};\n"],"mappings":";;;;;AAOA,MAAa,sBACX,iBACG;CACH,MAAM,MAAM,OAAO;CAOnB,MAAM,cAAc,OAAO,KAAK;CAChC,MAAM,eAAe,YAAY,UAAU,OAAO,aAAa,GAAG;CAClE,kBAAkB;EAChB,IAAI,CAAC,YAAY,SAAS,OAAO;EACjC,OAAO,aAAa,GAAG;CACzB,CAAC;CAED,aAAa;EACX,YAAY,UAAU;EACtB,OAAO,aAAa,GAAG;CACzB;AACF;AAEA,MAAM,eAAe,OAAO,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;AAiBrC,SAAgB,2BAA8B,EAC5C,cACA,YAIY;CAEZ,OAAO,6BAA6B,SADpB,mBAAmB,YACgB,CAAC,CAAC;AACvD;AAEA,MAAM,gCAAgC,SAAoB;CACxD,MAAM,KACJ,OAAO,SAAS,YAAY,QAAQ,QAAQ,UAAU,OAAO,OAAO;CACtE,MAAM,aAAa,IAAI;CACvB,MAAM,YAAY,IAAI;CAQtB,OAEE,cAAc,IAAI;EAAC;EAAY;EAR/B,OAAO,IAAI,UAAU,YACrB,GAAG,SAAS,QACZ,OAAO,QAAQ,GAAG,KAAK,EAAE,WAAW,IAChC,eACA,IAAI;CAI6C,CAAC,KAAK;AAE/D"} |
+26
-23
@@ -1,28 +0,31 @@ | ||
| import type { ContravariantResource } from "@assistant-ui/tap"; | ||
| import type { ClientMethods } from "./types/client.js"; | ||
| import { ClientMethods } from "./types/client.js"; | ||
| import { ContravariantResource } from "@assistant-ui/tap"; | ||
| //#region src/tapClientList.d.ts | ||
| type InferClientState<TMethods> = TMethods extends { | ||
| getState: () => infer S; | ||
| getState: () => infer S; | ||
| } ? S : unknown; | ||
| export declare const tapClientList: <TData, TMethods extends ClientMethods>(props: tapClientList.Props<TData, TMethods>) => { | ||
| state: InferClientState<TMethods>[]; | ||
| get: (lookup: { | ||
| index: number; | ||
| } | { | ||
| key: string; | ||
| }) => TMethods; | ||
| add: (initialData: TData) => void; | ||
| declare const tapClientList: <TData, TMethods extends ClientMethods>(props: tapClientList.Props<TData, TMethods>) => { | ||
| state: InferClientState<TMethods>[]; | ||
| get: (lookup: { | ||
| index: number; | ||
| } | { | ||
| key: string; | ||
| }) => TMethods; | ||
| add: (initialData: TData) => void; | ||
| }; | ||
| export declare namespace tapClientList { | ||
| type ResourceProps<TData> = { | ||
| key: string; | ||
| getInitialData: () => TData; | ||
| remove: () => void; | ||
| }; | ||
| type Props<TData, TMethods extends ClientMethods> = { | ||
| initialValues: TData[]; | ||
| getKey: (data: TData) => string; | ||
| resource: ContravariantResource<TMethods, ResourceProps<TData>>; | ||
| }; | ||
| declare namespace tapClientList { | ||
| type ResourceProps<TData> = { | ||
| key: string; | ||
| getInitialData: () => TData; | ||
| remove: () => void; | ||
| }; | ||
| type Props<TData, TMethods extends ClientMethods> = { | ||
| initialValues: TData[]; | ||
| getKey: (data: TData) => string; | ||
| resource: ContravariantResource<TMethods, ResourceProps<TData>>; | ||
| }; | ||
| } | ||
| export {}; | ||
| //#endregion | ||
| export { tapClientList }; | ||
| //# sourceMappingURL=tapClientList.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientList.d.ts","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAEpD,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,OAAO,CAAC;AAuBZ,eAAO,MAAM,aAAa,GAAI,KAAK,EAAE,QAAQ,SAAS,aAAa,EACjE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,KAC1C;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;IAC/D,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC;CAqEnC,CAAC;AAEF,yBAAiB,aAAa,CAAC;IAC7B,KAAY,aAAa,CAAC,KAAK,IAAI;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IAEF,KAAY,KAAK,CAAC,KAAK,EAAE,QAAQ,SAAS,aAAa,IAAI;QACzD,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;QAChC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;KACjE,CAAC;CACH"} | ||
| {"version":3,"file":"tapClientList.d.ts","names":[],"sources":["../src/tapClientList.ts"],"mappings":";;;;KAKK,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,cAwBS,aAAA,2BAAyC,aAAA,EACpD,KAAA,EAAO,aAAA,CAAc,KAAA,CAAM,KAAA,EAAO,QAAA;EAElC,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,GAAA,GAAM,MAAA;IAAU,KAAA;EAAA;IAAoB,GAAA;EAAA,MAAkB,QAAA;EACtD,GAAA,GAAM,WAAA,EAAa,KAAA;AAAA;AAAA,kBAuEJ,aAAA;EAAA,KACH,aAAA;IACV,GAAA;IACA,cAAA,QAAsB,KAAA;IACtB,MAAA;EAAA;EAAA,KAGU,KAAA,yBAA8B,aAAA;IACxC,aAAA,EAAe,KAAA;IACf,MAAA,GAAS,IAAA,EAAM,KAAA;IACf,QAAA,EAAU,qBAAA,CAAsB,QAAA,EAAU,aAAA,CAAc,KAAA;EAAA;AAAA"} |
+66
-63
@@ -0,68 +1,71 @@ | ||
| import { tapClientLookup } from "./tapClientLookup.js"; | ||
| import { tapConst, tapState, withKey } from "@assistant-ui/tap"; | ||
| import { tapClientLookup } from "./tapClientLookup.js"; | ||
| //#region src/tapClientList.ts | ||
| const createProps = (key, data, remove) => { | ||
| return { | ||
| key, | ||
| getInitialData: () => { | ||
| if (!data.hasData) { | ||
| throw new Error("getInitialData may only be called during initial render"); | ||
| } | ||
| return data.data; | ||
| }, | ||
| remove, | ||
| }; | ||
| return { | ||
| key, | ||
| getInitialData: () => { | ||
| if (!data.hasData) throw new Error("getInitialData may only be called during initial render"); | ||
| return data.data; | ||
| }, | ||
| remove | ||
| }; | ||
| }; | ||
| export const tapClientList = (props) => { | ||
| const { initialValues, getKey, resource: Resource } = props; | ||
| const initialDataHandles = tapConst(() => [], []); | ||
| const [items, setItems] = tapState(() => { | ||
| const entries = []; | ||
| for (const data of initialValues) { | ||
| const key = getKey(data); | ||
| const handle = { data, hasData: true }; | ||
| entries.push([ | ||
| key, | ||
| createProps(key, handle, () => { | ||
| setItems((items) => { | ||
| const newItems = { ...items }; | ||
| delete newItems[key]; | ||
| return newItems; | ||
| }); | ||
| }), | ||
| ]); | ||
| initialDataHandles.push(handle); | ||
| } | ||
| return Object.fromEntries(entries); | ||
| }); | ||
| const lookup = tapClientLookup(() => Object.values(items).map((props) => withKey(props.key, Resource(props))), [items, Resource]); | ||
| initialDataHandles.forEach((handle) => { | ||
| handle.data = undefined; | ||
| handle.hasData = false; | ||
| }); | ||
| const add = (data) => { | ||
| const key = getKey(data); | ||
| setItems((items) => { | ||
| if (key in items) { | ||
| throw new Error(`Tried to add item with a key ${key} that already exists`); | ||
| } | ||
| const handle = { data, hasData: true }; | ||
| initialDataHandles.push(handle); | ||
| return { | ||
| ...items, | ||
| [key]: createProps(key, handle, () => { | ||
| setItems((items) => { | ||
| const newItems = { ...items }; | ||
| delete newItems[key]; | ||
| return newItems; | ||
| }); | ||
| }), | ||
| }; | ||
| }); | ||
| }; | ||
| return { | ||
| state: lookup.state, | ||
| get: lookup.get, | ||
| add, | ||
| }; | ||
| const tapClientList = (props) => { | ||
| const { initialValues, getKey, resource: Resource } = props; | ||
| const initialDataHandles = tapConst(() => [], []); | ||
| const [items, setItems] = tapState(() => { | ||
| const entries = []; | ||
| for (const data of initialValues) { | ||
| const key = getKey(data); | ||
| const handle = { | ||
| data, | ||
| hasData: true | ||
| }; | ||
| entries.push([key, createProps(key, handle, () => { | ||
| setItems((items) => { | ||
| const newItems = { ...items }; | ||
| delete newItems[key]; | ||
| return newItems; | ||
| }); | ||
| })]); | ||
| initialDataHandles.push(handle); | ||
| } | ||
| return Object.fromEntries(entries); | ||
| }); | ||
| const lookup = tapClientLookup(() => Object.values(items).map((props) => withKey(props.key, Resource(props))), [items, Resource]); | ||
| initialDataHandles.forEach((handle) => { | ||
| handle.data = void 0; | ||
| handle.hasData = false; | ||
| }); | ||
| const add = (data) => { | ||
| const key = getKey(data); | ||
| setItems((items) => { | ||
| if (key in items) throw new Error(`Tried to add item with a key ${key} that already exists`); | ||
| const handle = { | ||
| data, | ||
| hasData: true | ||
| }; | ||
| initialDataHandles.push(handle); | ||
| return { | ||
| ...items, | ||
| [key]: createProps(key, handle, () => { | ||
| setItems((items) => { | ||
| const newItems = { ...items }; | ||
| delete newItems[key]; | ||
| return newItems; | ||
| }); | ||
| }) | ||
| }; | ||
| }); | ||
| }; | ||
| return { | ||
| state: lookup.state, | ||
| get: lookup.get, | ||
| add | ||
| }; | ||
| }; | ||
| //#endregion | ||
| export { tapClientList }; | ||
| //# sourceMappingURL=tapClientList.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientList.js","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,6BAA0B;AAWpD,MAAM,WAAW,GAAG,CAClB,GAAW,EACX,IAAuB,EACvB,MAAkB,EACkB,EAAE;IACtC,OAAO;QACL,GAAG;QACH,cAAc,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CACb,yDAAyD,CAC1D,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,IAAK,CAAC;QACpB,CAAC;QACD,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAA2C,EAK3C,EAAE;IACF,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAI5D,MAAM,kBAAkB,GAAwB,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAEvE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,GAAG,EAAE;QAC7D,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;oBAC5B,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjB,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;wBAC9B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;wBACrB,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;aACH,CAAC,CAAC;YACH,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,eAAe,CAC5B,GAAG,EAAE,CACH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAC1E,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB,CAAC;IAEF,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QACxB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,IAAW,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,sBAAsB,CAC1D,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhC,OAAO;gBACL,GAAG,KAAK;gBACR,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;oBACnC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjB,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;wBAC9B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;wBACrB,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;aACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG;KACJ,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"tapClientList.js","names":[],"sources":["../src/tapClientList.ts"],"sourcesContent":["import { tapConst, tapState, withKey } from \"@assistant-ui/tap\";\nimport type { ContravariantResource } from \"@assistant-ui/tap\";\nimport { tapClientLookup } from \"./tapClientLookup\";\nimport type { ClientMethods } from \"./types/client\";\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : unknown;\n\ntype DataHandle<TData> = { data: TData | undefined; hasData: boolean };\n\nconst createProps = <TData>(\n key: string,\n data: DataHandle<TData>,\n remove: () => void,\n): tapClientList.ResourceProps<TData> => {\n return {\n key,\n getInitialData: () => {\n if (!data.hasData) {\n throw new Error(\n \"getInitialData may only be called during initial render\",\n );\n }\n return data.data!;\n },\n remove,\n };\n};\n\nexport const tapClientList = <TData, TMethods extends ClientMethods>(\n props: tapClientList.Props<TData, TMethods>,\n): {\n state: InferClientState<TMethods>[];\n get: (lookup: { index: number } | { key: string }) => TMethods;\n add: (initialData: TData) => void;\n} => {\n const { initialValues, getKey, resource: Resource } = props;\n\n type Props = tapClientList.ResourceProps<TData>;\n\n const initialDataHandles: DataHandle<TData>[] = tapConst(() => [], []);\n\n const [items, setItems] = tapState<Record<string, Props>>(() => {\n const entries: [string, Props][] = [];\n for (const data of initialValues) {\n const key = getKey(data);\n const handle = { data, hasData: true };\n entries.push([\n key,\n createProps(key, handle, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n ]);\n initialDataHandles.push(handle);\n }\n return Object.fromEntries(entries);\n });\n\n const lookup = tapClientLookup<TMethods>(\n () =>\n Object.values(items).map((props) => withKey(props.key, Resource(props))),\n [items, Resource],\n );\n\n initialDataHandles.forEach((handle) => {\n handle.data = undefined;\n handle.hasData = false;\n });\n\n const add = (data: TData) => {\n const key = getKey(data);\n setItems((items) => {\n if (key in items) {\n throw new Error(\n `Tried to add item with a key ${key} that already exists`,\n );\n }\n\n const handle = { data, hasData: true };\n initialDataHandles.push(handle);\n\n return {\n ...items,\n [key]: createProps(key, handle, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n };\n });\n };\n\n return {\n state: lookup.state,\n get: lookup.get,\n add,\n };\n};\n\nexport namespace tapClientList {\n export type ResourceProps<TData> = {\n key: string;\n getInitialData: () => TData;\n remove: () => void;\n };\n\n export type Props<TData, TMethods extends ClientMethods> = {\n initialValues: TData[];\n getKey: (data: TData) => string;\n resource: ContravariantResource<TMethods, ResourceProps<TData>>;\n };\n}\n"],"mappings":";;;AAaA,MAAM,eACJ,KACA,MACA,WACuC;CACvC,OAAO;EACL;EACA,sBAAsB;GACpB,IAAI,CAAC,KAAK,SACR,MAAM,IAAI,MACR,yDACF;GAEF,OAAO,KAAK;EACd;EACA;CACF;AACF;AAEA,MAAa,iBACX,UAKG;CACH,MAAM,EAAE,eAAe,QAAQ,UAAU,aAAa;CAItD,MAAM,qBAA0C,eAAe,CAAC,GAAG,CAAC,CAAC;CAErE,MAAM,CAAC,OAAO,YAAY,eAAsC;EAC9D,MAAM,UAA6B,CAAC;EACpC,KAAK,MAAM,QAAQ,eAAe;GAChC,MAAM,MAAM,OAAO,IAAI;GACvB,MAAM,SAAS;IAAE;IAAM,SAAS;GAAK;GACrC,QAAQ,KAAK,CACX,KACA,YAAY,KAAK,cAAc;IAC7B,UAAU,UAAU;KAClB,MAAM,WAAW,EAAE,GAAG,MAAM;KAC5B,OAAO,SAAS;KAChB,OAAO;IACT,CAAC;GACH,CAAC,CACH,CAAC;GACD,mBAAmB,KAAK,MAAM;EAChC;EACA,OAAO,OAAO,YAAY,OAAO;CACnC,CAAC;CAED,MAAM,SAAS,sBAEX,OAAO,OAAO,KAAK,EAAE,KAAK,UAAU,QAAQ,MAAM,KAAK,SAAS,KAAK,CAAC,CAAC,GACzE,CAAC,OAAO,QAAQ,CAClB;CAEA,mBAAmB,SAAS,WAAW;EACrC,OAAO,OAAO,KAAA;EACd,OAAO,UAAU;CACnB,CAAC;CAED,MAAM,OAAO,SAAgB;EAC3B,MAAM,MAAM,OAAO,IAAI;EACvB,UAAU,UAAU;GAClB,IAAI,OAAO,OACT,MAAM,IAAI,MACR,gCAAgC,IAAI,qBACtC;GAGF,MAAM,SAAS;IAAE;IAAM,SAAS;GAAK;GACrC,mBAAmB,KAAK,MAAM;GAE9B,OAAO;IACL,GAAG;KACF,MAAM,YAAY,KAAK,cAAc;KACpC,UAAU,UAAU;MAClB,MAAM,WAAW,EAAE,GAAG,MAAM;MAC5B,OAAO,SAAS;MAChB,OAAO;KACT,CAAC;IACH,CAAC;GACH;EACF,CAAC;CACH;CAEA,OAAO;EACL,OAAO,OAAO;EACd,KAAK,OAAO;EACZ;CACF;AACF"} |
@@ -1,15 +0,18 @@ | ||
| import { type ResourceElement } from "@assistant-ui/tap"; | ||
| import type { ClientMethods } from "./types/client.js"; | ||
| import { ClientMethods } from "./types/client.js"; | ||
| import { ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/tapClientLookup.d.ts | ||
| type InferClientState<TMethods> = TMethods extends { | ||
| getState: () => infer S; | ||
| getState: () => infer S; | ||
| } ? S : unknown; | ||
| export declare function tapClientLookup<TMethods extends ClientMethods>(getElements: () => readonly ResourceElement<TMethods>[], getElementsDeps: readonly unknown[]): { | ||
| state: InferClientState<TMethods>[]; | ||
| get: (lookup: { | ||
| index: number; | ||
| } | { | ||
| key: string; | ||
| }) => TMethods; | ||
| declare function tapClientLookup<TMethods extends ClientMethods>(getElements: () => readonly ResourceElement<TMethods>[], getElementsDeps: readonly unknown[]): { | ||
| state: InferClientState<TMethods>[]; | ||
| get: (lookup: { | ||
| index: number; | ||
| } | { | ||
| key: string; | ||
| }) => TMethods; | ||
| }; | ||
| export {}; | ||
| //#endregion | ||
| export { tapClientLookup }; | ||
| //# sourceMappingURL=tapClientLookup.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientLookup.d.ts","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAIpD,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,OAAO,CAAC;AAeZ,wBAAgB,eAAe,CAAC,QAAQ,SAAS,aAAa,EAC5D,WAAW,EAAE,MAAM,SAAS,eAAe,CAAC,QAAQ,CAAC,EAAE,EACvD,eAAe,EAAE,SAAS,OAAO,EAAE,GAClC;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACpC,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;CAChE,CA2CA"} | ||
| {"version":3,"file":"tapClientLookup.d.ts","names":[],"sources":["../src/tapClientLookup.ts"],"mappings":";;;;KAUK,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,iBAgBY,eAAA,kBAAiC,aAAA,CAAA,CAC/C,WAAA,iBAA4B,eAAA,CAAgB,QAAA,KAC5C,eAAA;EAEA,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,GAAA,GAAM,MAAA;IAAU,KAAA;EAAA;IAAoB,GAAA;EAAA,MAAkB,QAAA;AAAA"} |
+31
-37
@@ -1,42 +0,36 @@ | ||
| import { tapMemo, tapResource, tapResources, } from "@assistant-ui/tap"; | ||
| import { wrapperResource } from "./wrapperResource.js"; | ||
| import { ClientResource } from "./tapClientResource.js"; | ||
| import { wrapperResource } from "./wrapperResource.js"; | ||
| import { tapMemo, tapResource, tapResources } from "@assistant-ui/tap"; | ||
| //#region src/tapClientLookup.ts | ||
| const ClientResourceWithKey = wrapperResource((el) => { | ||
| if (el.key === undefined) { | ||
| throw new Error("tapClientResource: Element has no key"); | ||
| } | ||
| return tapResource(ClientResource(el)); | ||
| if (el.key === void 0) throw new Error("tapClientResource: Element has no key"); | ||
| return tapResource(ClientResource(el)); | ||
| }); | ||
| export function tapClientLookup(getElements, getElementsDeps) { | ||
| const resources = tapResources(() => getElements().map((el) => ClientResourceWithKey(el)), | ||
| // biome-ignore lint/correctness/useExhaustiveDependencies: getElementsDeps is passed through from caller | ||
| getElementsDeps); | ||
| const keys = tapMemo(() => Object.keys(resources), [resources]); | ||
| // For arrays, track element key -> index mapping | ||
| const keyToIndex = tapMemo(() => { | ||
| return resources.reduce((acc, resource, index) => { | ||
| acc[resource.key] = index; | ||
| return acc; | ||
| }, {}); | ||
| }, [resources]); | ||
| const state = tapMemo(() => { | ||
| return resources.map((r) => r.state); | ||
| }, [resources]); | ||
| return { | ||
| state, | ||
| get: (lookup) => { | ||
| if ("index" in lookup) { | ||
| if (lookup.index < 0 || lookup.index >= keys.length) { | ||
| throw new Error(`tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`); | ||
| } | ||
| return resources[lookup.index].methods; | ||
| } | ||
| const index = keyToIndex[lookup.key]; | ||
| if (index === undefined) { | ||
| throw new Error(`tapClientLookup: Key "${lookup.key}" not found`); | ||
| } | ||
| return resources[index].methods; | ||
| }, | ||
| }; | ||
| function tapClientLookup(getElements, getElementsDeps) { | ||
| const resources = tapResources(() => getElements().map((el) => ClientResourceWithKey(el)), getElementsDeps); | ||
| const keys = tapMemo(() => Object.keys(resources), [resources]); | ||
| const keyToIndex = tapMemo(() => { | ||
| return resources.reduce((acc, resource, index) => { | ||
| acc[resource.key] = index; | ||
| return acc; | ||
| }, {}); | ||
| }, [resources]); | ||
| return { | ||
| state: tapMemo(() => { | ||
| return resources.map((r) => r.state); | ||
| }, [resources]), | ||
| get: (lookup) => { | ||
| if ("index" in lookup) { | ||
| if (lookup.index < 0 || lookup.index >= keys.length) throw new Error(`tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`); | ||
| return resources[lookup.index].methods; | ||
| } | ||
| const index = keyToIndex[lookup.key]; | ||
| if (index === void 0) throw new Error(`tapClientLookup: Key "${lookup.key}" not found`); | ||
| return resources[index].methods; | ||
| } | ||
| }; | ||
| } | ||
| //#endregion | ||
| export { tapClientLookup }; | ||
| //# sourceMappingURL=tapClientLookup.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientLookup.js","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,EACX,YAAY,GAEb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,+BAA4B;AACrD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AAQpD,MAAM,qBAAqB,GAAG,eAAe,CAC3C,CAAiC,EAA6B,EAAE,EAAE;IAChE,IAAI,EAAE,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAIpC,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,WAAuD,EACvD,eAAmC;IAKnC,MAAM,SAAS,GAAG,YAAY,CAC5B,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1D,yGAAyG;IACzG,eAAe,CAChB,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhE,iDAAiD;IACjD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9B,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;YACvB,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CAC7B,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,OAAO;QACL,KAAK;QACL,GAAG,EAAE,CAAC,MAA2C,EAAE,EAAE;YACnD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpD,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,KAAK,2BAA2B,IAAI,CAAC,MAAM,GAAG,CAChF,CAAC;gBACJ,CAAC;gBACD,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC;YAC1C,CAAC;YAED,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC;YACpE,CAAC;YACD,OAAO,SAAS,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"} | ||
| {"version":3,"file":"tapClientLookup.js","names":[],"sources":["../src/tapClientLookup.ts"],"sourcesContent":["import {\n tapMemo,\n tapResource,\n tapResources,\n type ResourceElement,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport { ClientResource } from \"./tapClientResource\";\nimport { wrapperResource } from \"./wrapperResource\";\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : unknown;\n\nconst ClientResourceWithKey = wrapperResource(\n <TMethods extends ClientMethods>(el: ResourceElement<TMethods>) => {\n if (el.key === undefined) {\n throw new Error(\"tapClientResource: Element has no key\");\n }\n return tapResource(ClientResource(el)) as {\n methods: TMethods;\n state: InferClientState<TMethods>;\n key: string | number;\n };\n },\n);\n\nexport function tapClientLookup<TMethods extends ClientMethods>(\n getElements: () => readonly ResourceElement<TMethods>[],\n getElementsDeps: readonly unknown[],\n): {\n state: InferClientState<TMethods>[];\n get: (lookup: { index: number } | { key: string }) => TMethods;\n} {\n const resources = tapResources(\n () => getElements().map((el) => ClientResourceWithKey(el)),\n // biome-ignore lint/correctness/useExhaustiveDependencies: getElementsDeps is passed through from caller\n getElementsDeps,\n );\n\n const keys = tapMemo(() => Object.keys(resources), [resources]);\n\n // For arrays, track element key -> index mapping\n const keyToIndex = tapMemo(() => {\n return resources.reduce(\n (acc, resource, index) => {\n acc[resource.key] = index;\n return acc;\n },\n {} as Record<string, number>,\n );\n }, [resources]);\n\n const state = tapMemo(() => {\n return resources.map((r) => r.state);\n }, [resources]);\n\n return {\n state,\n get: (lookup: { index: number } | { key: string }) => {\n if (\"index\" in lookup) {\n if (lookup.index < 0 || lookup.index >= keys.length) {\n throw new Error(\n `tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`,\n );\n }\n return resources[lookup.index]!.methods;\n }\n\n const index = keyToIndex[lookup.key];\n if (index === undefined) {\n throw new Error(`tapClientLookup: Key \"${lookup.key}\" not found`);\n }\n return resources[index]!.methods;\n },\n };\n}\n"],"mappings":";;;;AAgBA,MAAM,wBAAwB,iBACK,OAAkC;CACjE,IAAI,GAAG,QAAQ,KAAA,GACb,MAAM,IAAI,MAAM,uCAAuC;CAEzD,OAAO,YAAY,eAAe,EAAE,CAAC;AAKvC,CACF;AAEA,SAAgB,gBACd,aACA,iBAIA;CACA,MAAM,YAAY,mBACV,YAAY,EAAE,KAAK,OAAO,sBAAsB,EAAE,CAAC,GAEzD,eACF;CAEA,MAAM,OAAO,cAAc,OAAO,KAAK,SAAS,GAAG,CAAC,SAAS,CAAC;CAG9D,MAAM,aAAa,cAAc;EAC/B,OAAO,UAAU,QACd,KAAK,UAAU,UAAU;GACxB,IAAI,SAAS,OAAO;GACpB,OAAO;EACT,GACA,CAAC,CACH;CACF,GAAG,CAAC,SAAS,CAAC;CAMd,OAAO;EACL,OALY,cAAc;GAC1B,OAAO,UAAU,KAAK,MAAM,EAAE,KAAK;EACrC,GAAG,CAAC,SAAS,CAGP;EACJ,MAAM,WAAgD;GACpD,IAAI,WAAW,QAAQ;IACrB,IAAI,OAAO,QAAQ,KAAK,OAAO,SAAS,KAAK,QAC3C,MAAM,IAAI,MACR,0BAA0B,OAAO,MAAM,0BAA0B,KAAK,OAAO,EAC/E;IAEF,OAAO,UAAU,OAAO,OAAQ;GAClC;GAEA,MAAM,QAAQ,WAAW,OAAO;GAChC,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,yBAAyB,OAAO,IAAI,YAAY;GAElE,OAAO,UAAU,OAAQ;EAC3B;CACF;AACF"} |
@@ -1,13 +0,16 @@ | ||
| import { type ResourceElement } from "@assistant-ui/tap"; | ||
| import type { ClientMethods } from "./types/client.js"; | ||
| export declare const getClientState: (client: ClientMethods) => any; | ||
| import { ClientMethods } from "./types/client.js"; | ||
| import { ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/tapClientResource.d.ts | ||
| declare const getClientState: (client: ClientMethods) => any; | ||
| type InferClientState<TMethods> = TMethods extends { | ||
| getState: () => infer S; | ||
| getState: () => infer S; | ||
| } ? S : undefined; | ||
| export declare const tapClientResource: <TMethods extends ClientMethods>(element: ResourceElement<TMethods>) => { | ||
| state: InferClientState<TMethods>; | ||
| methods: TMethods; | ||
| key: string | number | undefined; | ||
| declare const tapClientResource: <TMethods extends ClientMethods>(element: ResourceElement<TMethods>) => { | ||
| state: InferClientState<TMethods>; | ||
| methods: TMethods; | ||
| key: string | number | undefined; | ||
| }; | ||
| export {}; | ||
| //#endregion | ||
| export { getClientState, tapClientResource }; | ||
| //# sourceMappingURL=tapClientResource.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientResource.d.ts","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,0BAAuB;AAsBpD,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,QASnD,CAAC;AAoIF,KAAK,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,SAAS;IACjD,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;CACzB,GACG,CAAC,GACD,SAAS,CAAC;AAEd,eAAO,MAAM,iBAAiB,GAAI,QAAQ,SAAS,aAAa,EAC9D,SAAS,eAAe,CAAC,QAAQ,CAAC,KACjC;IACD,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,QAAQ,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAOlC,CAAC"} | ||
| {"version":3,"file":"tapClientResource.d.ts","names":[],"sources":["../src/tapClientResource.ts"],"mappings":";;;;cA6Ba,cAAA,GAAkB,MAAqB,EAAb,aAAa;AAAA,KA6I/C,gBAAA,aAA6B,QAAQ;EACxC,QAAA;AAAA,IAEE,CAAA;AAAA,cAGS,iBAAA,oBAAsC,aAAA,EACjD,OAAA,EAAS,eAAA,CAAgB,QAAA;EAEzB,KAAA,EAAO,gBAAA,CAAiB,QAAA;EACxB,OAAA,EAAS,QAAA;EACT,GAAA;AAAA"} |
+92
-104
@@ -1,114 +0,102 @@ | ||
| import { tapEffect, tapMemo, tapRef, tapResource, } from "@assistant-ui/tap"; | ||
| import { tapClientStack, tapWithClientStack, SYMBOL_CLIENT_INDEX, } from "./utils/tap-client-stack-context.js"; | ||
| import { BaseProxyHandler, handleIntrospectionProp, } from "./utils/BaseProxyHandler.js"; | ||
| import { SYMBOL_CLIENT_INDEX, tapClientStack, tapWithClientStack } from "./utils/tap-client-stack-context.js"; | ||
| import { BaseProxyHandler, handleIntrospectionProp } from "./utils/BaseProxyHandler.js"; | ||
| import { wrapperResource } from "./wrapperResource.js"; | ||
| import { tapEffect, tapMemo, tapRef, tapResource } from "@assistant-ui/tap"; | ||
| //#region src/tapClientResource.ts | ||
| /** | ||
| * Symbol used internally to get state from ClientProxy. | ||
| * This allows getState() to be optional in the user-facing client. | ||
| */ | ||
| * Symbol used internally to get state from ClientProxy. | ||
| * This allows getState() to be optional in the user-facing client. | ||
| */ | ||
| const SYMBOL_GET_OUTPUT = Symbol("assistant-ui.store.getValue"); | ||
| export const getClientState = (client) => { | ||
| const output = client[SYMBOL_GET_OUTPUT]; | ||
| if (!output) { | ||
| throw new Error("Client scope contains a non-client resource. " + | ||
| "Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource."); | ||
| } | ||
| return output.getState?.(); | ||
| const getClientState = (client) => { | ||
| const output = client[SYMBOL_GET_OUTPUT]; | ||
| if (!output) throw new Error("Client scope contains a non-client resource. Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource."); | ||
| return output.getState?.(); | ||
| }; | ||
| // Global cache for function templates by field name | ||
| const fieldAccessFns = new Map(); | ||
| const fieldAccessFns = /* @__PURE__ */ new Map(); | ||
| function getOrCreateProxyFn(prop) { | ||
| let template = fieldAccessFns.get(prop); | ||
| if (!template) { | ||
| template = function (...args) { | ||
| if (!this || typeof this !== "object") { | ||
| throw new Error(`Method "${String(prop)}" called without proper context. ` + | ||
| `This may indicate the function was called incorrectly.`); | ||
| } | ||
| const output = this[SYMBOL_GET_OUTPUT]; | ||
| if (!output) { | ||
| throw new Error(`Method "${String(prop)}" called on invalid client proxy. ` + | ||
| `Ensure you are calling this method on a valid client instance.`); | ||
| } | ||
| const method = output[prop]; | ||
| if (!method) | ||
| throw new Error(`Method "${String(prop)}" is not implemented.`); | ||
| if (typeof method !== "function") | ||
| throw new Error(`"${String(prop)}" is not a function.`); | ||
| return method(...args); | ||
| }; | ||
| fieldAccessFns.set(prop, template); | ||
| } | ||
| return template; | ||
| let template = fieldAccessFns.get(prop); | ||
| if (!template) { | ||
| template = function(...args) { | ||
| if (!this || typeof this !== "object") throw new Error(`Method "${String(prop)}" called without proper context. This may indicate the function was called incorrectly.`); | ||
| const output = this[SYMBOL_GET_OUTPUT]; | ||
| if (!output) throw new Error(`Method "${String(prop)}" called on invalid client proxy. Ensure you are calling this method on a valid client instance.`); | ||
| const method = output[prop]; | ||
| if (!method) throw new Error(`Method "${String(prop)}" is not implemented.`); | ||
| if (typeof method !== "function") throw new Error(`"${String(prop)}" is not a function.`); | ||
| return method(...args); | ||
| }; | ||
| fieldAccessFns.set(prop, template); | ||
| } | ||
| return template; | ||
| } | ||
| class ClientProxyHandler extends BaseProxyHandler { | ||
| outputRef; | ||
| index; | ||
| boundFns; | ||
| cachedReceiver; | ||
| constructor(outputRef, index) { | ||
| super(); | ||
| this.outputRef = outputRef; | ||
| this.index = index; | ||
| } | ||
| get(_, prop, receiver) { | ||
| if (prop === SYMBOL_GET_OUTPUT) | ||
| return this.outputRef.current; | ||
| if (prop === SYMBOL_CLIENT_INDEX) | ||
| return this.index; | ||
| const introspection = handleIntrospectionProp(prop, "ClientProxy"); | ||
| if (introspection !== false) | ||
| return introspection; | ||
| const value = this.outputRef.current[prop]; | ||
| if (typeof value === "function") { | ||
| if (this.cachedReceiver !== receiver) { | ||
| this.boundFns = new Map(); | ||
| this.cachedReceiver = receiver; | ||
| } | ||
| let bound = this.boundFns.get(prop); | ||
| if (!bound) { | ||
| bound = getOrCreateProxyFn(prop).bind(receiver); | ||
| this.boundFns.set(prop, bound); | ||
| } | ||
| return bound; | ||
| } | ||
| return value; | ||
| } | ||
| ownKeys() { | ||
| return Object.keys(this.outputRef.current); | ||
| } | ||
| has(_, prop) { | ||
| if (prop === SYMBOL_GET_OUTPUT) | ||
| return true; | ||
| if (prop === SYMBOL_CLIENT_INDEX) | ||
| return true; | ||
| return prop in this.outputRef.current; | ||
| } | ||
| } | ||
| var ClientProxyHandler = class extends BaseProxyHandler { | ||
| outputRef; | ||
| index; | ||
| boundFns; | ||
| cachedReceiver; | ||
| constructor(outputRef, index) { | ||
| super(); | ||
| this.outputRef = outputRef; | ||
| this.index = index; | ||
| } | ||
| get(_, prop, receiver) { | ||
| if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current; | ||
| if (prop === SYMBOL_CLIENT_INDEX) return this.index; | ||
| const introspection = handleIntrospectionProp(prop, "ClientProxy"); | ||
| if (introspection !== false) return introspection; | ||
| const value = this.outputRef.current[prop]; | ||
| if (typeof value === "function") { | ||
| if (this.cachedReceiver !== receiver) { | ||
| this.boundFns = /* @__PURE__ */ new Map(); | ||
| this.cachedReceiver = receiver; | ||
| } | ||
| let bound = this.boundFns.get(prop); | ||
| if (!bound) { | ||
| bound = getOrCreateProxyFn(prop).bind(receiver); | ||
| this.boundFns.set(prop, bound); | ||
| } | ||
| return bound; | ||
| } | ||
| return value; | ||
| } | ||
| ownKeys() { | ||
| return Object.keys(this.outputRef.current); | ||
| } | ||
| has(_, prop) { | ||
| if (prop === SYMBOL_GET_OUTPUT) return true; | ||
| if (prop === SYMBOL_CLIENT_INDEX) return true; | ||
| return prop in this.outputRef.current; | ||
| } | ||
| }; | ||
| /** | ||
| * Resource that wraps a plain resource element to create a stable client proxy. | ||
| * | ||
| * Takes a ResourceElement that returns methods (with optional getState()) and | ||
| * wraps it to produce a stable client proxy. This adds the client to the | ||
| * client stack, enabling event scoping. | ||
| * | ||
| * @internal | ||
| */ | ||
| export const ClientResource = wrapperResource((element) => { | ||
| const valueRef = tapRef(null); | ||
| const index = tapClientStack().length; | ||
| const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]); | ||
| const value = tapWithClientStack(methods, () => tapResource(element)); | ||
| if (!valueRef.current) { | ||
| valueRef.current = value; | ||
| } | ||
| tapEffect(() => { | ||
| valueRef.current = value; | ||
| }); | ||
| const state = value.getState?.(); | ||
| return { methods, state, key: element.key }; | ||
| * Resource that wraps a plain resource element to create a stable client proxy. | ||
| * | ||
| * Takes a ResourceElement that returns methods (with optional getState()) and | ||
| * wraps it to produce a stable client proxy. This adds the client to the | ||
| * client stack, enabling event scoping. | ||
| * | ||
| * @internal | ||
| */ | ||
| const ClientResource = wrapperResource((element) => { | ||
| const valueRef = tapRef(null); | ||
| const index = tapClientStack().length; | ||
| const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]); | ||
| const value = tapWithClientStack(methods, () => tapResource(element)); | ||
| if (!valueRef.current) valueRef.current = value; | ||
| tapEffect(() => { | ||
| valueRef.current = value; | ||
| }); | ||
| return { | ||
| methods, | ||
| state: value.getState?.(), | ||
| key: element.key | ||
| }; | ||
| }); | ||
| export const tapClientResource = (element) => { | ||
| return tapResource(ClientResource(element)); | ||
| const tapClientResource = (element) => { | ||
| return tapResource(ClientResource(element)); | ||
| }; | ||
| //#endregion | ||
| export { ClientResource, getClientState, tapClientResource }; | ||
| //# sourceMappingURL=tapClientResource.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tapClientResource.js","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"tapClientResource.js","names":[],"sources":["../src/tapClientResource.ts"],"sourcesContent":["import {\n tapEffect,\n tapMemo,\n tapRef,\n type ResourceElement,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport {\n tapClientStack,\n tapWithClientStack,\n SYMBOL_CLIENT_INDEX,\n} from \"./utils/tap-client-stack-context\";\nimport {\n BaseProxyHandler,\n handleIntrospectionProp,\n} from \"./utils/BaseProxyHandler\";\nimport { wrapperResource } from \"./wrapperResource\";\n\n/**\n * Symbol used internally to get state from ClientProxy.\n * This allows getState() to be optional in the user-facing client.\n */\nconst SYMBOL_GET_OUTPUT = Symbol(\"assistant-ui.store.getValue\");\n\ntype ClientInternal = {\n [SYMBOL_GET_OUTPUT]: ClientMethods;\n};\n\nexport const getClientState = (client: ClientMethods) => {\n const output = (client as unknown as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n \"Client scope contains a non-client resource. \" +\n \"Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.\",\n );\n }\n return (output as any).getState?.();\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: unknown, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: unknown, ...args: unknown[]) {\n if (!this || typeof this !== \"object\") {\n throw new Error(\n `Method \"${String(prop)}\" called without proper context. ` +\n `This may indicate the function was called incorrectly.`,\n );\n }\n\n const output = (this as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n `Method \"${String(prop)}\" called on invalid client proxy. ` +\n `Ensure you are calling this method on a valid client instance.`,\n );\n }\n\n const method = output[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\n if (typeof method !== \"function\")\n throw new Error(`\"${String(prop)}\" is not a function.`);\n return method(...args);\n };\n fieldAccessFns.set(prop, template);\n }\n return template;\n}\n\nclass ClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<object>\n{\n private boundFns:\n | Map<string | symbol, (...args: never) => unknown>\n | undefined;\n private cachedReceiver: unknown;\n\n constructor(\n private readonly outputRef: {\n current: ClientMethods;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol, receiver: unknown) {\n if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;\n if (prop === SYMBOL_CLIENT_INDEX) return this.index;\n const introspection = handleIntrospectionProp(prop, \"ClientProxy\");\n if (introspection !== false) return introspection;\n const value = this.outputRef.current[prop];\n if (typeof value === \"function\") {\n if (this.cachedReceiver !== receiver) {\n this.boundFns = new Map();\n this.cachedReceiver = receiver;\n }\n let bound = this.boundFns!.get(prop);\n if (!bound) {\n bound = getOrCreateProxyFn(prop).bind(receiver);\n this.boundFns!.set(prop, bound);\n }\n return bound;\n }\n return value;\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current);\n }\n\n has(_: unknown, prop: string | symbol) {\n if (prop === SYMBOL_GET_OUTPUT) return true;\n if (prop === SYMBOL_CLIENT_INDEX) return true;\n return prop in this.outputRef.current;\n }\n}\n\n/**\n * Resource that wraps a plain resource element to create a stable client proxy.\n *\n * Takes a ResourceElement that returns methods (with optional getState()) and\n * wraps it to produce a stable client proxy. This adds the client to the\n * client stack, enabling event scoping.\n *\n * @internal\n */\nexport const ClientResource = wrapperResource(\n <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n ): {\n methods: TMethods;\n state: unknown;\n key: string | number | undefined;\n } => {\n const valueRef = tapRef(null as unknown as TMethods);\n\n const index = tapClientStack().length;\n const methods = tapMemo(\n () =>\n new Proxy<TMethods>(\n {} as TMethods,\n new ClientProxyHandler(valueRef, index),\n ),\n [index],\n );\n\n const value = tapWithClientStack(methods, () => tapResource(element));\n if (!valueRef.current) {\n valueRef.current = value;\n }\n\n tapEffect(() => {\n valueRef.current = value;\n });\n\n const state = (value as any).getState?.();\n return { methods, state, key: element.key };\n },\n);\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : undefined;\n\nexport const tapClientResource = <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n): {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n} => {\n return tapResource(ClientResource(element)) as {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n };\n};\n"],"mappings":";;;;;;;;;AAuBA,MAAM,oBAAoB,OAAO,6BAA6B;AAM9D,MAAa,kBAAkB,WAA0B;CACvD,MAAM,SAAU,OAAqC;CACrD,IAAI,CAAC,QACH,MAAM,IAAI,MACR,iJAEF;CAEF,OAAQ,OAAe,WAAW;AACpC;AAGA,MAAM,iCAAiB,IAAI,IAGzB;AAEF,SAAS,mBAAmB,MAAuB;CACjD,IAAI,WAAW,eAAe,IAAI,IAAI;CACtC,IAAI,CAAC,UAAU;EACb,WAAW,SAAyB,GAAG,MAAiB;GACtD,IAAI,CAAC,QAAQ,OAAO,SAAS,UAC3B,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,wFAE1B;GAGF,MAAM,SAAU,KAAwB;GACxC,IAAI,CAAC,QACH,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,iGAE1B;GAGF,MAAM,SAAS,OAAO;GACtB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,OAAO,IAAI,EAAE,sBAAsB;GAChE,IAAI,OAAO,WAAW,YACpB,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE,qBAAqB;GACxD,OAAO,OAAO,GAAG,IAAI;EACvB;EACA,eAAe,IAAI,MAAM,QAAQ;CACnC;CACA,OAAO;AACT;AAEA,IAAM,qBAAN,cACU,iBAEV;CAOqB;CAGA;CATnB;CAGA;CAEA,YACE,WAGA,OACA;EACA,MAAM;EALW,KAAA,YAAA;EAGA,KAAA,QAAA;CAGnB;CAEA,IAAI,GAAY,MAAuB,UAAmB;EACxD,IAAI,SAAS,mBAAmB,OAAO,KAAK,UAAU;EACtD,IAAI,SAAS,qBAAqB,OAAO,KAAK;EAC9C,MAAM,gBAAgB,wBAAwB,MAAM,aAAa;EACjE,IAAI,kBAAkB,OAAO,OAAO;EACpC,MAAM,QAAQ,KAAK,UAAU,QAAQ;EACrC,IAAI,OAAO,UAAU,YAAY;GAC/B,IAAI,KAAK,mBAAmB,UAAU;IACpC,KAAK,2BAAW,IAAI,IAAI;IACxB,KAAK,iBAAiB;GACxB;GACA,IAAI,QAAQ,KAAK,SAAU,IAAI,IAAI;GACnC,IAAI,CAAC,OAAO;IACV,QAAQ,mBAAmB,IAAI,EAAE,KAAK,QAAQ;IAC9C,KAAK,SAAU,IAAI,MAAM,KAAK;GAChC;GACA,OAAO;EACT;EACA,OAAO;CACT;CAEA,UAAsC;EACpC,OAAO,OAAO,KAAK,KAAK,UAAU,OAAO;CAC3C;CAEA,IAAI,GAAY,MAAuB;EACrC,IAAI,SAAS,mBAAmB,OAAO;EACvC,IAAI,SAAS,qBAAqB,OAAO;EACzC,OAAO,QAAQ,KAAK,UAAU;CAChC;AACF;;;;;;;;;;AAWA,MAAa,iBAAiB,iBAE1B,YAKG;CACH,MAAM,WAAW,OAAO,IAA2B;CAEnD,MAAM,QAAQ,eAAe,EAAE;CAC/B,MAAM,UAAU,cAEZ,IAAI,MACF,CAAC,GACD,IAAI,mBAAmB,UAAU,KAAK,CACxC,GACF,CAAC,KAAK,CACR;CAEA,MAAM,QAAQ,mBAAmB,eAAe,YAAY,OAAO,CAAC;CACpE,IAAI,CAAC,SAAS,SACZ,SAAS,UAAU;CAGrB,gBAAgB;EACd,SAAS,UAAU;CACrB,CAAC;CAGD,OAAO;EAAE;EAAS,OADH,MAAc,WAAW;EACf,KAAK,QAAQ;CAAI;AAC5C,CACF;AAQA,MAAa,qBACX,YAKG;CACH,OAAO,YAAY,eAAe,OAAO,CAAC;AAK5C"} |
+50
-42
@@ -1,14 +0,28 @@ | ||
| import type { ResourceElement } from "@assistant-ui/tap"; | ||
| import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./events.js"; | ||
| import { AssistantEventCallback, AssistantEventName, AssistantEventSelector } from "./events.js"; | ||
| import { ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/types/client.d.ts | ||
| /** | ||
| * Base type for methods that can be called on a client. | ||
| */ | ||
| export interface ClientMethods { | ||
| [key: string | symbol]: (...args: any[]) => any; | ||
| interface ClientMethods { | ||
| [key: string | symbol]: (...args: any[]) => any; | ||
| } | ||
| type ClientMetaType = { | ||
| source: ClientNames; | ||
| query: Record<string, unknown>; | ||
| source: ClientNames; | ||
| query: Record<string, unknown>; | ||
| }; | ||
| /** | ||
| * Schema of a client in the assistant system. | ||
| * @template TState - The state type for this client | ||
| * @template TMethods - The methods available on this client | ||
| * @template TMeta - Source/query metadata (optional) | ||
| * @template TEvents - Events that this client can emit (optional) | ||
| */ | ||
| type ClientSchema<TMethods extends ClientMethods = ClientMethods, TMeta extends ClientMetaType = never, TEvents extends Record<string, unknown> = never> = { | ||
| methods: TMethods; | ||
| meta?: TMeta; | ||
| events?: TEvents; | ||
| }; | ||
| /** | ||
| * Module augmentation interface for assistant-ui store type extensions. | ||
@@ -42,21 +56,18 @@ * | ||
| */ | ||
| export interface ScopeRegistry { | ||
| } | ||
| interface ScopeRegistry {} | ||
| type ClientEventsType<K extends ClientNames> = Record<`${K}.${string}`, unknown>; | ||
| type ClientError<E extends string> = { | ||
| methods: Record<E, () => E>; | ||
| meta: { | ||
| source: ClientNames; | ||
| query: Record<E, E>; | ||
| }; | ||
| events: Record<`${E}.`, E>; | ||
| methods: Record<E, () => E>; | ||
| meta: { | ||
| source: ClientNames; | ||
| query: Record<E, E>; | ||
| }; | ||
| events: Record<`${E}.`, E>; | ||
| }; | ||
| type ValidateClient<K extends keyof ScopeRegistry> = ScopeRegistry[K] extends { | ||
| methods: ClientMethods; | ||
| methods: ClientMethods; | ||
| } ? "meta" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["meta"] extends ClientMetaType ? "events" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["events"] extends ClientEventsType<K> ? ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid meta type`> : "events" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["events"] extends ClientEventsType<K> ? ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid methods type`>; | ||
| type ClientSchemas = keyof ScopeRegistry extends never ? { | ||
| "ERROR: No clients were defined": ClientError<"ERROR: No clients were defined">; | ||
| } : { | ||
| [K in keyof ScopeRegistry]: ValidateClient<K>; | ||
| }; | ||
| "ERROR: No clients were defined": ClientError<"ERROR: No clients were defined">; | ||
| } : { [K in keyof ScopeRegistry]: ValidateClient<K> }; | ||
| /** | ||
@@ -76,19 +87,17 @@ * Output type that client resources return (just methods). | ||
| */ | ||
| export type ClientOutput<K extends ClientNames> = ClientSchemas[K]["methods"] & ClientMethods; | ||
| export type ClientNames = keyof ClientSchemas extends infer U ? U : never; | ||
| export type ClientEvents<K extends ClientNames> = "events" extends keyof ClientSchemas[K] ? ClientSchemas[K]["events"] extends ClientEventsType<K> ? ClientSchemas[K]["events"] : never : never; | ||
| export type ClientMeta<K extends ClientNames> = "meta" extends keyof ClientSchemas[K] ? Pick<ClientSchemas[K]["meta"] extends ClientMetaType ? ClientSchemas[K]["meta"] : never, "source" | "query"> : never; | ||
| export type ClientElement<K extends ClientNames> = ResourceElement<ClientOutput<K>>; | ||
| type ClientOutput<K extends ClientNames> = ClientSchemas[K]["methods"] & ClientMethods; | ||
| type ClientNames = keyof ClientSchemas extends infer U ? U : never; | ||
| type ClientEvents<K extends ClientNames> = "events" extends keyof ClientSchemas[K] ? ClientSchemas[K]["events"] extends ClientEventsType<K> ? ClientSchemas[K]["events"] : never : never; | ||
| type ClientMeta<K extends ClientNames> = "meta" extends keyof ClientSchemas[K] ? Pick<ClientSchemas[K]["meta"] extends ClientMetaType ? ClientSchemas[K]["meta"] : never, "source" | "query"> : never; | ||
| type ClientElement<K extends ClientNames> = ResourceElement<ClientOutput<K>>; | ||
| /** | ||
| * Unsubscribe function type. | ||
| */ | ||
| export type Unsubscribe = () => void; | ||
| type Unsubscribe = () => void; | ||
| /** | ||
| * State type extracted from all clients via their getState() methods. | ||
| */ | ||
| export type AssistantState = { | ||
| [K in ClientNames]: ClientSchemas[K]["methods"] extends { | ||
| getState: () => infer S; | ||
| } ? S : never; | ||
| }; | ||
| type AssistantState = { [K in ClientNames]: ClientSchemas[K]["methods"] extends { | ||
| getState: () => infer S; | ||
| } ? S : never }; | ||
| /** | ||
@@ -98,10 +107,10 @@ * Type for a client accessor - a function that returns the methods, | ||
| */ | ||
| export type AssistantClientAccessor<K extends ClientNames> = (() => ClientSchemas[K]["methods"]) & (ClientMeta<K> | { | ||
| source: "root"; | ||
| query: Record<string, never>; | ||
| type AssistantClientAccessor<K extends ClientNames> = (() => ClientSchemas[K]["methods"]) & (ClientMeta<K> | { | ||
| source: "root"; | ||
| query: Record<string, never>; | ||
| } | { | ||
| source: null; | ||
| query: null; | ||
| source: null; | ||
| query: null; | ||
| }) & { | ||
| name: K; | ||
| name: K; | ||
| }; | ||
@@ -111,9 +120,8 @@ /** | ||
| */ | ||
| export type AssistantClient = { | ||
| [K in ClientNames]: AssistantClientAccessor<K>; | ||
| } & { | ||
| subscribe(listener: () => void): Unsubscribe; | ||
| on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe; | ||
| type AssistantClient = { [K in ClientNames]: AssistantClientAccessor<K> } & { | ||
| subscribe(listener: () => void): Unsubscribe; | ||
| on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe; | ||
| }; | ||
| export {}; | ||
| //#endregion | ||
| export { AssistantClient, AssistantClientAccessor, AssistantState, ClientElement, ClientEvents, ClientMeta, ClientMethods, ClientNames, ClientOutput, ClientSchema, ScopeRegistry, Unsubscribe }; | ||
| //# sourceMappingURL=client.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/types/client.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/types/client.ts"],"mappings":";;;;;;AAUA;UAAiB,aAAA;EAAA,CACd,GAAA,wBAA2B,IAAI;AAAA;AAAA,KAG7B,cAAA;EAAmB,MAAA,EAAQ,WAAA;EAAa,KAAA,EAAO,MAAM;AAAA;;;;;;;AAAA;KAS9C,YAAA,kBACO,aAAA,GAAgB,aAAA,gBACnB,cAAA,0BACE,MAAA;EAEhB,OAAA,EAAS,QAAA;EACT,IAAA,GAAO,KAAA;EACP,MAAA,GAAS,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;AAAO;AAiClB;;;;AAA8B;AAAG;;UAAhB,aAAA;AAAA,KAEZ,gBAAA,WAA2B,WAAA,IAAe,MAAA,IAC1C,CAAA;AAAA,KAIA,WAAA;EACH,OAAA,EAAS,MAAA,CAAO,CAAA,QAAS,CAAA;EACzB,IAAA;IAAQ,MAAA,EAAQ,WAAA;IAAa,KAAA,EAAO,MAAA,CAAO,CAAA,EAAG,CAAA;EAAA;EAC9C,MAAA,EAAQ,MAAA,IAAU,CAAA,KAAM,CAAA;AAAA;AAAA,KAGrB,cAAA,iBAA+B,aAAA,IAAiB,aAAA,CAAc,CAAA;EACjE,OAAA,EAAS,aAAA;AAAA,yBAEc,aAAA,CAAc,CAAA,IACjC,aAAA,CAAc,CAAA,kBAAmB,cAAA,0BACR,aAAA,CAAc,CAAA,IACnC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA,IACd,WAAA,WAAsB,CAAA,uCACxB,aAAA,CAAc,CAAA,IAChB,WAAA,WAAsB,CAAA,4DACD,aAAA,CAAc,CAAA,IACnC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA,IACd,WAAA,WAAsB,CAAA,uCACxB,aAAA,CAAc,CAAA,IAClB,WAAA,WAAsB,CAAA;AAAA,KAErB,aAAA,SAAsB,aAAA;EAErB,gCAAA,EAAkC,WAAA;AAAA,kBAEtB,aAAA,GAAgB,cAAA,CAAe,CAAA;;;;;;;;;;;;;;;KAgBrC,YAAA,WAAuB,WAAA,IAAe,aAAA,CAAc,CAAA,eAC9D,aAAA;AAAA,KAEU,WAAA,SAAoB,aAAa,mBAAmB,CAAA;AAAA,KAEpD,YAAA,WAAuB,WAAA,2BACV,aAAA,CAAc,CAAA,IACjC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA;AAAA,KAIV,UAAA,WAAqB,WAAA,yBACV,aAAA,CAAc,CAAA,IAC/B,IAAA,CACE,aAAA,CAAc,CAAA,kBAAmB,cAAA,GAC7B,aAAA,CAAc,CAAA;AAAA,KAMd,aAAA,WAAwB,WAAA,IAAe,eAAA,CACjD,YAAA,CAAa,CAAA;;;;KAMH,WAAA;;;AAtEe;KA2Ef,cAAA,WACJ,WAAA,GAAc,aAAA,CAAc,CAAA;EAChC,QAAA;AAAA,IAEE,CAAA;;;;;KAQM,uBAAA,WAAkC,WAAA,WACrC,aAAA,CAAc,CAAA,iBAEf,UAAA,CAAW,CAAA;EACT,MAAA;EAAgB,KAAA,EAAO,MAAA;AAAA;EACvB,MAAA;EAAc,KAAA;AAAA;EACd,IAAA,EAAM,CAAA;AAAA;;;;KAKJ,eAAA,WACJ,WAAA,GAAc,uBAAA,CAAwB,CAAA;EAE5C,SAAA,CAAU,QAAA,eAAuB,WAAA;EACjC,EAAA,gBAAkB,kBAAA,EAChB,QAAA,EAAU,sBAAA,CAAuB,MAAA,GACjC,QAAA,EAAU,sBAAA,CAAuB,MAAA,IAChC,WAAA;AAAA"} |
+23
-24
@@ -1,33 +0,32 @@ | ||
| import type { AssistantClientAccessor, ClientEvents, ClientNames } from "./client.js"; | ||
| type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never; | ||
| type ClientEventMap = UnionToIntersection<{ | ||
| [K in ClientNames]: ClientEvents<K>; | ||
| }[ClientNames]>; | ||
| type WildcardPayload = { | ||
| [K in keyof ClientEventMap]: { | ||
| event: K; | ||
| payload: ClientEventMap[K]; | ||
| }; | ||
| }[keyof ClientEventMap]; | ||
| export type AssistantEventPayload = ClientEventMap & { | ||
| "*": WildcardPayload; | ||
| import { AssistantClientAccessor, ClientEvents, ClientNames } from "./client.js"; | ||
| //#region src/types/events.d.ts | ||
| type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never; | ||
| type ClientEventMap = UnionToIntersection<{ [K in ClientNames]: ClientEvents<K> }[ClientNames]>; | ||
| type WildcardPayload = { [K in keyof ClientEventMap]: { | ||
| event: K; | ||
| payload: ClientEventMap[K]; | ||
| } }[keyof ClientEventMap]; | ||
| type AssistantEventPayload = ClientEventMap & { | ||
| "*": WildcardPayload; | ||
| }; | ||
| export type AssistantEventName = keyof AssistantEventPayload; | ||
| type AssistantEventName = keyof AssistantEventPayload; | ||
| type EventSource<T extends AssistantEventName> = T extends `${infer Source}.${string}` ? Source : never; | ||
| type ParentOf<K extends ClientNames> = AssistantClientAccessor<K> extends { | ||
| source: infer S; | ||
| source: infer S; | ||
| } ? S extends ClientNames ? S : never : never; | ||
| type AncestorsOf<K extends ClientNames, Seen extends ClientNames = never> = K extends Seen ? never : ParentOf<K> extends never ? never : ParentOf<K> | AncestorsOf<ParentOf<K>, Seen | K>; | ||
| /** Valid scopes: `"*"` | event source | ancestors of event source */ | ||
| export type AssistantEventScope<TEvent extends AssistantEventName> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends ClientNames ? AncestorsOf<EventSource<TEvent>> : never); | ||
| export type AssistantEventSelector<TEvent extends AssistantEventName> = TEvent | { | ||
| scope: AssistantEventScope<TEvent>; | ||
| event: TEvent; | ||
| type AssistantEventScope<TEvent extends AssistantEventName> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends ClientNames ? AncestorsOf<EventSource<TEvent>> : never); | ||
| type AssistantEventSelector<TEvent extends AssistantEventName> = TEvent | { | ||
| scope: AssistantEventScope<TEvent>; | ||
| event: TEvent; | ||
| }; | ||
| export declare const normalizeEventSelector: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>) => { | ||
| scope: AssistantEventScope<TEvent>; | ||
| event: TEvent; | ||
| declare const normalizeEventSelector: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>) => { | ||
| scope: AssistantEventScope<TEvent>; | ||
| event: TEvent; | ||
| }; | ||
| export type AssistantEventCallback<TEvent extends AssistantEventName> = (payload: AssistantEventPayload[TEvent]) => void; | ||
| export {}; | ||
| type AssistantEventCallback<TEvent extends AssistantEventName> = (payload: AssistantEventPayload[TEvent]) => void; | ||
| //#endregion | ||
| export { AssistantEventCallback, AssistantEventName, AssistantEventPayload, AssistantEventScope, AssistantEventSelector, normalizeEventSelector }; | ||
| //# sourceMappingURL=events.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACZ,oBAAiB;AAGlB,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAC5B,CAAC,SAAS,OAAO,GACb,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GACd,KAAK,CACV,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAC1B,CAAC,GACD,KAAK,CAAC;AAEV,KAAK,cAAc,GAAG,mBAAmB,CACvC;KAAG,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;CAAE,CAAC,WAAW,CAAC,CACrD,CAAC;AAIF,KAAK,eAAe,GAAG;KACpB,CAAC,IAAI,MAAM,cAAc,GAAG;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;KAAE;CACtE,CAAC,MAAM,cAAc,CAAC,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IAAE,GAAG,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC;AAE7D,KAAK,WAAW,CAAC,CAAC,SAAS,kBAAkB,IAC3C,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAIzD,KAAK,QAAQ,CAAC,CAAC,SAAS,WAAW,IACjC,uBAAuB,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClD,CAAC,SAAS,WAAW,GACnB,CAAC,GACD,KAAK,GACP,KAAK,CAAC;AAEZ,KAAK,WAAW,CACd,CAAC,SAAS,WAAW,EACrB,IAAI,SAAS,WAAW,GAAG,KAAK,IAC9B,CAAC,SAAS,IAAI,GACd,KAAK,GACL,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,GACvB,KAAK,GACL,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAEvD,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,IAC7D,GAAG,GACH,WAAW,CAAC,MAAM,CAAC,GACnB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,WAAW,GACpC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAChC,KAAK,CAAC,CAAC;AAIf,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,kBAAkB,IAChE,MAAM,GACN;IAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,kBAAkB,EACtE,UAAU,sBAAsB,CAAC,MAAM,CAAC;;;CAOzC,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,kBAAkB,IAAI,CACtE,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,KACnC,IAAI,CAAC"} | ||
| {"version":3,"file":"events.d.ts","names":[],"sources":["../../src/types/events.ts"],"mappings":";;;KAOK,mBAAA,OACH,CAAA,oBACK,CAAA,EAAG,CAAC,6BAEA,CAAA,sBACP,CAAA;AAAA,KAGC,cAAA,GAAiB,mBAAA,SACZ,WAAA,GAAc,YAAA,CAAa,CAAA,IAAK,WAAA;AAAA,KAKrC,eAAA,iBACS,cAAA;EAAmB,KAAA,EAAO,CAAA;EAAG,OAAA,EAAS,cAAA,CAAe,CAAA;AAAA,UAC3D,cAAA;AAAA,KAEI,qBAAA,GAAwB,cAAA;EAAmB,GAAA,EAAK,eAAe;AAAA;AAAA,KAE/D,kBAAA,SAA2B,qBAAqB;AAAA,KAEvD,WAAA,WAAsB,kBAAA,IACzB,CAAC,uCAAuC,MAAA;AAAA,KAIrC,QAAA,WAAmB,WAAA,IACtB,uBAAA,CAAwB,CAAA;EAAa,MAAA;AAAA,IACjC,CAAA,SAAU,WAAA,GACR,CAAA;AAAA,KAIH,WAAA,WACO,WAAA,eACG,WAAA,YACX,CAAA,SAAU,IAAA,WAEV,QAAA,CAAS,CAAA,0BAEP,QAAA,CAAS,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,CAAA,GAAI,IAAA,GAAO,CAAA;;KAGxC,mBAAA,gBAAmC,kBAAA,UAE3C,WAAA,CAAY,MAAA,KACX,WAAA,CAAY,MAAA,UAAgB,WAAA,GACzB,WAAA,CAAY,WAAA,CAAY,MAAA;AAAA,KAKpB,sBAAA,gBAAsC,kBAAA,IAC9C,MAAA;EACE,KAAA,EAAO,mBAAA,CAAoB,MAAA;EAAS,KAAA,EAAO,MAAA;AAAA;AAAA,cAEpC,sBAAA,kBAAyC,kBAAA,EACpD,QAAA,EAAU,sBAAA,CAAuB,MAAA;;;;KASvB,sBAAA,gBAAsC,kBAAA,KAChD,OAAA,EAAS,qBAAA,CAAsB,MAAA"} |
+13
-6
@@ -1,8 +0,15 @@ | ||
| export const normalizeEventSelector = (selector) => { | ||
| if (typeof selector === "string") { | ||
| const source = selector.split(".")[0]; | ||
| return { scope: source, event: selector }; | ||
| } | ||
| return { scope: selector.scope, event: selector.event }; | ||
| //#region src/types/events.ts | ||
| const normalizeEventSelector = (selector) => { | ||
| if (typeof selector === "string") return { | ||
| scope: selector.split(".")[0], | ||
| event: selector | ||
| }; | ||
| return { | ||
| scope: selector.scope, | ||
| event: selector.event | ||
| }; | ||
| }; | ||
| //#endregion | ||
| export { normalizeEventSelector }; | ||
| //# sourceMappingURL=events.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAgEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAwC,EACxC,EAAE;IACF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgC,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC,CAAC"} | ||
| {"version":3,"file":"events.js","names":[],"sources":["../../src/types/events.ts"],"sourcesContent":["import type {\n AssistantClientAccessor,\n ClientEvents,\n ClientNames,\n} from \"./client\";\n\n// --- Event Map Construction ---\ntype UnionToIntersection<U> = (\n U extends unknown\n ? (x: U) => void\n : never\n) extends (x: infer I) => void\n ? I\n : never;\n\ntype ClientEventMap = UnionToIntersection<\n { [K in ClientNames]: ClientEvents<K> }[ClientNames]\n>;\n\n// --- Core Types ---\n\ntype WildcardPayload = {\n [K in keyof ClientEventMap]: { event: K; payload: ClientEventMap[K] };\n}[keyof ClientEventMap];\n\nexport type AssistantEventPayload = ClientEventMap & { \"*\": WildcardPayload };\n\nexport type AssistantEventName = keyof AssistantEventPayload;\n\ntype EventSource<T extends AssistantEventName> =\n T extends `${infer Source}.${string}` ? Source : never;\n\n// --- Scoping ---\n\ntype ParentOf<K extends ClientNames> =\n AssistantClientAccessor<K> extends { source: infer S }\n ? S extends ClientNames\n ? S\n : never\n : never;\n\ntype AncestorsOf<\n K extends ClientNames,\n Seen extends ClientNames = never,\n> = K extends Seen\n ? never\n : ParentOf<K> extends never\n ? never\n : ParentOf<K> | AncestorsOf<ParentOf<K>, Seen | K>;\n\n/** Valid scopes: `\"*\"` | event source | ancestors of event source */\nexport type AssistantEventScope<TEvent extends AssistantEventName> =\n | \"*\"\n | EventSource<TEvent>\n | (EventSource<TEvent> extends ClientNames\n ? AncestorsOf<EventSource<TEvent>>\n : never);\n\n// --- Selection & Callbacks ---\n\nexport type AssistantEventSelector<TEvent extends AssistantEventName> =\n | TEvent\n | { scope: AssistantEventScope<TEvent>; event: TEvent };\n\nexport const normalizeEventSelector = <TEvent extends AssistantEventName>(\n selector: AssistantEventSelector<TEvent>,\n) => {\n if (typeof selector === \"string\") {\n const source = selector.split(\".\")[0] as AssistantEventScope<TEvent>;\n return { scope: source, event: selector };\n }\n return { scope: selector.scope, event: selector.event };\n};\n\nexport type AssistantEventCallback<TEvent extends AssistantEventName> = (\n payload: AssistantEventPayload[TEvent],\n) => void;\n"],"mappings":";AAgEA,MAAa,0BACX,aACG;CACH,IAAI,OAAO,aAAa,UAEtB,OAAO;EAAE,OADM,SAAS,MAAM,GAAG,EAAE;EACX,OAAO;CAAS;CAE1C,OAAO;EAAE,OAAO,SAAS;EAAO,OAAO,SAAS;CAAM;AACxD"} |
+17
-15
@@ -1,17 +0,17 @@ | ||
| import type { AssistantClient, ClientNames, ClientElement } from "./types/client.js"; | ||
| import type { DerivedElement } from "./Derived.js"; | ||
| import { AssistantClient, ClientElement, ClientNames } from "./types/client.js"; | ||
| import { DerivedElement } from "./Derived.js"; | ||
| //#region src/useAui.d.ts | ||
| /** | ||
| * Resource that creates an extended AssistantClient. | ||
| */ | ||
| export declare const AssistantClientResource: (props: { | ||
| parent: AssistantClient; | ||
| clients: useAui.Props; | ||
| declare const AssistantClientResource: (props: { | ||
| parent: AssistantClient; | ||
| clients: useAui.Props; | ||
| }) => import("@assistant-ui/tap").ResourceElement<AssistantClient, { | ||
| parent: AssistantClient; | ||
| clients: useAui.Props; | ||
| parent: AssistantClient; | ||
| clients: useAui.Props; | ||
| }>; | ||
| export declare namespace useAui { | ||
| type Props = { | ||
| [K in ClientNames]?: ClientElement<K> | DerivedElement<K>; | ||
| }; | ||
| declare namespace useAui { | ||
| type Props = { [K in ClientNames]?: ClientElement<K> | DerivedElement<K> }; | ||
| } | ||
@@ -53,3 +53,3 @@ /** | ||
| */ | ||
| export declare function useAui(): AssistantClient; | ||
| declare function useAui(): AssistantClient; | ||
| /** | ||
@@ -76,9 +76,11 @@ * Extends the parent `AssistantClient` with additional scopes. | ||
| */ | ||
| export declare function useAui(clients: useAui.Props): AssistantClient; | ||
| declare function useAui(clients: useAui.Props): AssistantClient; | ||
| /** | ||
| * Extends an explicit parent `AssistantClient` with additional scopes. | ||
| */ | ||
| export declare function useAui(clients: useAui.Props, config: { | ||
| parent: null | AssistantClient; | ||
| declare function useAui(clients: useAui.Props, config: { | ||
| parent: null | AssistantClient; | ||
| }): AssistantClient; | ||
| //#endregion | ||
| export { AssistantClientResource, useAui }; | ||
| //# sourceMappingURL=useAui.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAui.d.ts","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,eAAe,EAEf,WAAW,EACX,aAAa,EAEd,0BAAuB;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAsRhD;;GAEG;AACH,eAAO,MAAM,uBAAuB;YAKxB,eAAe;aACd,MAAM,CAAC,KAAK;;YADb,eAAe;aACd,MAAM,CAAC,KAAK;EAwDxB,CAAC;AAEF,yBAAiB,MAAM,CAAC;IACtB,KAAY,KAAK,GAAG;SACjB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;KAC1D,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,MAAM,IAAI,eAAe,CAAC;AAC1C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC;AAC/D;;GAEG;AACH,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,CAAC,KAAK,EACrB,MAAM,EAAE;IAAE,MAAM,EAAE,IAAI,GAAG,eAAe,CAAA;CAAE,GACzC,eAAe,CAAC"} | ||
| {"version":3,"file":"useAui.d.ts","names":[],"sources":["../src/useAui.ts"],"mappings":";;;;;;AA6SA;cAAa,uBAAA,GAAuB,KAAA;UAKxB,eAAA;WACC,MAAA,CAAO,KAAA;AAAA;UADR,eAAA;WACC,MAAA,CAAO,KAAA;AAAA;AAAA,kBA0DH,MAAA;EAAA,KACH,KAAA,WACJ,WAAA,IAAe,aAAA,CAAc,CAAA,IAAK,cAAA,CAAe,CAAA;AAAA;;;;;;;;;;;;AA5DlC;AA0DzB;;;;;;;;;;;;;;;;;;AAE4D;AAuC5D;;;;iBAAgB,MAAA,CAAA,GAAU,eAAe;AAsBzC;;;;;;;;;AAA8D;AAI9D;;;;;;;;;;;AAJA,iBAAgB,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,KAAA,GAAQ,eAAe;;;;iBAI9C,MAAA,CACd,OAAA,EAAS,MAAA,CAAO,KAAA,EAChB,MAAA;EAAU,MAAA,SAAe,eAAA;AAAA,IACxB,eAAA"} |
+176
-191
| "use client"; | ||
| import { useResource } from "@assistant-ui/tap/react"; | ||
| import { resource, tapMemo, tapResources, tapEffect, tapRef, tapResource, withKey, tapResourceRoot, } from "@assistant-ui/tap"; | ||
| import { useAssistantContextValue, DefaultAssistantClient, createRootAssistantClient, } from "./utils/react-assistant-context.js"; | ||
| import { tapSplitClients, } from "./utils/splitClients.js"; | ||
| import { normalizeEventSelector, } from "./types/events.js"; | ||
| import { getClientIndex } from "./utils/tap-client-stack-context.js"; | ||
| import { tapClientResource } from "./tapClientResource.js"; | ||
| import { PROXIED_ASSISTANT_STATE_SYMBOL, createProxiedAssistantState } from "./utils/proxied-assistant-state.js"; | ||
| import { DefaultAssistantClient, createRootAssistantClient, useAssistantContextValue } from "./utils/react-assistant-context.js"; | ||
| import { tapSplitClients } from "./utils/splitClients.js"; | ||
| import { normalizeEventSelector } from "./types/events.js"; | ||
| import { NotificationManager } from "./utils/NotificationManager.js"; | ||
| import { withAssistantTapContextProvider } from "./utils/tap-assistant-context.js"; | ||
| import { tapClientResource } from "./tapClientResource.js"; | ||
| import { getClientIndex } from "./utils/tap-client-stack-context.js"; | ||
| import { PROXIED_ASSISTANT_STATE_SYMBOL, createProxiedAssistantState, } from "./utils/proxied-assistant-state.js"; | ||
| import { useResource } from "@assistant-ui/tap/react"; | ||
| import { resource, tapEffect, tapMemo, tapRef, tapResource, tapResourceRoot, tapResources, withKey } from "@assistant-ui/tap"; | ||
| //#region src/useAui.ts | ||
| const tapShallowMemoArray = (array) => { | ||
| // biome-ignore lint/correctness/useExhaustiveDependencies: shallow memo | ||
| return tapMemo(() => array, array); | ||
| return tapMemo(() => array, array); | ||
| }; | ||
| const RootClientResource = resource(({ element, emit, clientRef, }) => { | ||
| const { methods, state } = withAssistantTapContextProvider({ clientRef, emit }, () => tapClientResource(element)); | ||
| return tapMemo(() => ({ state, methods }), [methods, state]); | ||
| const RootClientResource = resource(({ element, emit, clientRef }) => { | ||
| const { methods, state } = withAssistantTapContextProvider({ | ||
| clientRef, | ||
| emit | ||
| }, () => tapClientResource(element)); | ||
| return tapMemo(() => ({ | ||
| state, | ||
| methods | ||
| }), [methods, state]); | ||
| }); | ||
| const RootClientAccessorResource = resource(({ element, notifications, clientRef, name, }) => { | ||
| const store = tapResourceRoot(RootClientResource({ element, emit: notifications.emit, clientRef })); | ||
| tapEffect(() => { | ||
| return store.subscribe(notifications.notifySubscribers); | ||
| }, [store, notifications]); | ||
| return tapMemo(() => { | ||
| const clientFunction = () => store.getValue().methods; | ||
| Object.defineProperties(clientFunction, { | ||
| source: { | ||
| value: "root", | ||
| writable: false, | ||
| }, | ||
| query: { | ||
| value: {}, | ||
| writable: false, | ||
| }, | ||
| name: { | ||
| value: name, | ||
| configurable: true, | ||
| }, | ||
| }); | ||
| return clientFunction; | ||
| }, [store, name]); | ||
| const RootClientAccessorResource = resource(({ element, notifications, clientRef, name }) => { | ||
| const store = tapResourceRoot(RootClientResource({ | ||
| element, | ||
| emit: notifications.emit, | ||
| clientRef | ||
| })); | ||
| tapEffect(() => { | ||
| return store.subscribe(notifications.notifySubscribers); | ||
| }, [store, notifications]); | ||
| return tapMemo(() => { | ||
| const clientFunction = () => store.getValue().methods; | ||
| Object.defineProperties(clientFunction, { | ||
| source: { | ||
| value: "root", | ||
| writable: false | ||
| }, | ||
| query: { | ||
| value: {}, | ||
| writable: false | ||
| }, | ||
| name: { | ||
| value: name, | ||
| configurable: true | ||
| } | ||
| }); | ||
| return clientFunction; | ||
| }, [store, name]); | ||
| }); | ||
| const NoOpRootClientsAccessorsResource = resource(() => { | ||
| return tapMemo(() => ({ | ||
| clients: [], | ||
| subscribe: undefined, | ||
| on: undefined, | ||
| }), []); | ||
| return tapMemo(() => ({ | ||
| clients: [], | ||
| subscribe: void 0, | ||
| on: void 0 | ||
| }), []); | ||
| }); | ||
| const RootClientsAccessorsResource = resource(({ clients: inputClients, clientRef, }) => { | ||
| const notifications = tapResource(NotificationManager()); | ||
| tapEffect(() => clientRef.parent.subscribe(notifications.notifySubscribers), [clientRef, notifications]); | ||
| const results = tapShallowMemoArray(tapResources(() => Object.keys(inputClients).map((key) => withKey(key, RootClientAccessorResource({ | ||
| element: inputClients[key], | ||
| notifications, | ||
| clientRef, | ||
| name: key, | ||
| }))), [inputClients, notifications, clientRef])); | ||
| return tapMemo(() => { | ||
| return { | ||
| clients: results, | ||
| subscribe: notifications.subscribe, | ||
| on: function (selector, callback) { | ||
| if (!this) { | ||
| throw new Error("const { on } = useAui() is not supported. Use aui.on() instead."); | ||
| } | ||
| const { scope, event } = normalizeEventSelector(selector); | ||
| if (scope !== "*") { | ||
| const source = this[scope].source; | ||
| if (source === null) { | ||
| throw new Error(`Scope "${scope}" is not available. Use { scope: "*", event: "${event}" } to listen globally.`); | ||
| } | ||
| } | ||
| const localUnsub = notifications.on(event, (payload, clientStack) => { | ||
| if (scope === "*") { | ||
| callback(payload); | ||
| return; | ||
| } | ||
| const scopeClient = this[scope](); | ||
| const index = getClientIndex(scopeClient); | ||
| if (scopeClient === clientStack[index]) { | ||
| callback(payload); | ||
| } | ||
| }); | ||
| if (scope !== "*" && | ||
| clientRef.parent[scope].source === null) | ||
| return localUnsub; | ||
| const parentUnsub = clientRef.parent.on(selector, callback); | ||
| return () => { | ||
| localUnsub(); | ||
| parentUnsub(); | ||
| }; | ||
| }, | ||
| }; | ||
| }, [results, notifications, clientRef]); | ||
| const RootClientsAccessorsResource = resource(({ clients: inputClients, clientRef }) => { | ||
| const notifications = tapResource(NotificationManager()); | ||
| tapEffect(() => clientRef.parent.subscribe(notifications.notifySubscribers), [clientRef, notifications]); | ||
| const results = tapShallowMemoArray(tapResources(() => Object.keys(inputClients).map((key) => withKey(key, RootClientAccessorResource({ | ||
| element: inputClients[key], | ||
| notifications, | ||
| clientRef, | ||
| name: key | ||
| }))), [ | ||
| inputClients, | ||
| notifications, | ||
| clientRef | ||
| ])); | ||
| return tapMemo(() => { | ||
| return { | ||
| clients: results, | ||
| subscribe: notifications.subscribe, | ||
| on: function(selector, callback) { | ||
| if (!this) throw new Error("const { on } = useAui() is not supported. Use aui.on() instead."); | ||
| const { scope, event } = normalizeEventSelector(selector); | ||
| if (scope !== "*") { | ||
| if (this[scope].source === null) throw new Error(`Scope "${scope}" is not available. Use { scope: "*", event: "${event}" } to listen globally.`); | ||
| } | ||
| const localUnsub = notifications.on(event, (payload, clientStack) => { | ||
| if (scope === "*") { | ||
| callback(payload); | ||
| return; | ||
| } | ||
| const scopeClient = this[scope](); | ||
| if (scopeClient === clientStack[getClientIndex(scopeClient)]) callback(payload); | ||
| }); | ||
| if (scope !== "*" && clientRef.parent[scope].source === null) return localUnsub; | ||
| const parentUnsub = clientRef.parent.on(selector, callback); | ||
| return () => { | ||
| localUnsub(); | ||
| parentUnsub(); | ||
| }; | ||
| } | ||
| }; | ||
| }, [ | ||
| results, | ||
| notifications, | ||
| clientRef | ||
| ]); | ||
| }); | ||
| const DerivedClientAccessorResource = resource(({ element, clientRef, name, }) => { | ||
| // Track the latest props on a ref updated in render. The fiber is | ||
| // keyed on the scope's meta by DerivedClientsAccessorsResource, so | ||
| // source/query are stable for this fiber's lifetime and the only | ||
| // value that can change between renders for the same fiber is the | ||
| // identity of the `get` closure. Routing reads through the ref | ||
| // avoids the one-commit lag that the previous `tapEffectEvent` | ||
| // path imposed. | ||
| const propsRef = tapRef(element.props); | ||
| propsRef.current = element.props; | ||
| return tapMemo(() => { | ||
| const clientFunction = () => propsRef.current.get(clientRef.current); | ||
| Object.defineProperties(clientFunction, { | ||
| source: { | ||
| value: propsRef.current.source, | ||
| }, | ||
| query: { | ||
| value: propsRef.current.query, | ||
| }, | ||
| name: { | ||
| value: name, | ||
| configurable: true, | ||
| }, | ||
| }); | ||
| return clientFunction; | ||
| }, [clientRef, name]); | ||
| const DerivedClientAccessorResource = resource(({ element, clientRef, name }) => { | ||
| const propsRef = tapRef(element.props); | ||
| propsRef.current = element.props; | ||
| return tapMemo(() => { | ||
| const clientFunction = () => propsRef.current.get(clientRef.current); | ||
| Object.defineProperties(clientFunction, { | ||
| source: { value: propsRef.current.source }, | ||
| query: { value: propsRef.current.query }, | ||
| name: { | ||
| value: name, | ||
| configurable: true | ||
| } | ||
| }); | ||
| return clientFunction; | ||
| }, [clientRef, name]); | ||
| }); | ||
| const serializeMeta = (name, meta) => { | ||
| // Sort top-level keys so {a, b} and {b, a} hash to the same fiber | ||
| // identity, and guard JSON.stringify against unusual values (BigInt, | ||
| // circular refs) so render never throws here. | ||
| let queryKey; | ||
| try { | ||
| const sorted = {}; | ||
| for (const k of Object.keys(meta.query).sort()) { | ||
| sorted[k] = meta.query[k]; | ||
| } | ||
| queryKey = JSON.stringify(sorted); | ||
| } | ||
| catch { | ||
| queryKey = String(meta.query); | ||
| } | ||
| return `${name}::${meta.source}::${queryKey}`; | ||
| let queryKey; | ||
| try { | ||
| const sorted = {}; | ||
| for (const k of Object.keys(meta.query).sort()) sorted[k] = meta.query[k]; | ||
| queryKey = JSON.stringify(sorted); | ||
| } catch { | ||
| queryKey = String(meta.query); | ||
| } | ||
| return `${name}::${meta.source}::${queryKey}`; | ||
| }; | ||
| const DerivedClientsAccessorsResource = resource(({ clients, clientRef, }) => { | ||
| return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => { | ||
| const name = key; | ||
| const element = clients[name]; | ||
| return withKey(serializeMeta(name, element.props), DerivedClientAccessorResource({ | ||
| element, | ||
| clientRef, | ||
| name, | ||
| })); | ||
| }), [clients, clientRef])); | ||
| const DerivedClientsAccessorsResource = resource(({ clients, clientRef }) => { | ||
| return tapShallowMemoArray(tapResources(() => Object.keys(clients).map((key) => { | ||
| const name = key; | ||
| const element = clients[name]; | ||
| return withKey(serializeMeta(name, element.props), DerivedClientAccessorResource({ | ||
| element, | ||
| clientRef, | ||
| name | ||
| })); | ||
| }), [clients, clientRef])); | ||
| }); | ||
| /** | ||
| * Resource that creates an extended AssistantClient. | ||
| */ | ||
| export const AssistantClientResource = resource(({ parent, clients, }) => { | ||
| const { rootClients, derivedClients } = tapSplitClients(clients, parent); | ||
| const clientRef = tapRef({ | ||
| parent: parent, | ||
| current: null, | ||
| }).current; | ||
| tapEffect(() => { | ||
| // if (clientRef.current && clientRef.current !== client) | ||
| // throw new Error("clientRef.current !== client"); | ||
| clientRef.current = client; | ||
| }); | ||
| const rootFields = tapResource(Object.keys(rootClients).length > 0 | ||
| ? RootClientsAccessorsResource({ clients: rootClients, clientRef }) | ||
| : NoOpRootClientsAccessorsResource()); | ||
| const derivedFields = tapResource(DerivedClientsAccessorsResource({ clients: derivedClients, clientRef })); | ||
| const client = tapMemo(() => { | ||
| // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message | ||
| const proto = parent === DefaultAssistantClient | ||
| ? createRootAssistantClient() | ||
| : parent; | ||
| const client = Object.create(proto); | ||
| Object.assign(client, { | ||
| subscribe: rootFields.subscribe ?? parent.subscribe, | ||
| on: rootFields.on ?? parent.on, | ||
| [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client), | ||
| }); | ||
| for (const field of rootFields.clients) { | ||
| client[field.name] = field; | ||
| } | ||
| for (const field of derivedFields) { | ||
| client[field.name] = field; | ||
| } | ||
| return client; | ||
| }, [parent, rootFields, derivedFields]); | ||
| if (clientRef.current === null) { | ||
| clientRef.current = client; | ||
| } | ||
| return client; | ||
| * Resource that creates an extended AssistantClient. | ||
| */ | ||
| const AssistantClientResource = resource(({ parent, clients }) => { | ||
| const { rootClients, derivedClients } = tapSplitClients(clients, parent); | ||
| const clientRef = tapRef({ | ||
| parent, | ||
| current: null | ||
| }).current; | ||
| tapEffect(() => { | ||
| clientRef.current = client; | ||
| }); | ||
| const rootFields = tapResource(Object.keys(rootClients).length > 0 ? RootClientsAccessorsResource({ | ||
| clients: rootClients, | ||
| clientRef | ||
| }) : NoOpRootClientsAccessorsResource()); | ||
| const derivedFields = tapResource(DerivedClientsAccessorsResource({ | ||
| clients: derivedClients, | ||
| clientRef | ||
| })); | ||
| const client = tapMemo(() => { | ||
| const proto = parent === DefaultAssistantClient ? createRootAssistantClient() : parent; | ||
| const client = Object.create(proto); | ||
| Object.assign(client, { | ||
| subscribe: rootFields.subscribe ?? parent.subscribe, | ||
| on: rootFields.on ?? parent.on, | ||
| [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client) | ||
| }); | ||
| for (const field of rootFields.clients) client[field.name] = field; | ||
| for (const field of derivedFields) client[field.name] = field; | ||
| return client; | ||
| }, [ | ||
| parent, | ||
| rootFields, | ||
| derivedFields | ||
| ]); | ||
| if (clientRef.current === null) clientRef.current = client; | ||
| return client; | ||
| }); | ||
| /** @deprecated This API is highly experimental and may be changed in a minor release */ | ||
| export function useAui(clients, { parent } = { | ||
| parent: useAssistantContextValue(), | ||
| }) { | ||
| if (clients) { | ||
| // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage | ||
| return useResource(AssistantClientResource({ | ||
| parent: parent ?? DefaultAssistantClient, | ||
| clients, | ||
| })); | ||
| } | ||
| if (parent === null) | ||
| throw new Error("received null parent, this usage is not allowed"); | ||
| return parent; | ||
| function useAui(clients, { parent } = { parent: useAssistantContextValue() }) { | ||
| if (clients) return useResource(AssistantClientResource({ | ||
| parent: parent ?? DefaultAssistantClient, | ||
| clients | ||
| })); | ||
| if (parent === null) throw new Error("received null parent, this usage is not allowed"); | ||
| return parent; | ||
| } | ||
| //#endregion | ||
| export { AssistantClientResource, useAui }; | ||
| //# sourceMappingURL=useAui.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAui.js","sourceRoot":"","sources":["../src/useAui.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"useAui.js","names":[],"sources":["../src/useAui.ts"],"sourcesContent":["\"use client\";\n\nimport { useResource } from \"@assistant-ui/tap/react\";\nimport {\n resource,\n tapMemo,\n tapResources,\n tapEffect,\n tapRef,\n tapResource,\n withKey,\n tapResourceRoot,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n AssistantClientAccessor,\n ClientNames,\n ClientElement,\n ClientMeta,\n} from \"./types/client\";\nimport type { DerivedElement } from \"./Derived\";\nimport {\n useAssistantContextValue,\n DefaultAssistantClient,\n createRootAssistantClient,\n} from \"./utils/react-assistant-context\";\nimport {\n type DerivedClients,\n type RootClients,\n tapSplitClients,\n} from \"./utils/splitClients\";\nimport {\n normalizeEventSelector,\n type AssistantEventName,\n type AssistantEventCallback,\n type AssistantEventSelector,\n} from \"./types/events\";\nimport { NotificationManager } from \"./utils/NotificationManager\";\nimport { withAssistantTapContextProvider } from \"./utils/tap-assistant-context\";\nimport { tapClientResource } from \"./tapClientResource\";\nimport { getClientIndex } from \"./utils/tap-client-stack-context\";\nimport {\n PROXIED_ASSISTANT_STATE_SYMBOL,\n createProxiedAssistantState,\n} from \"./utils/proxied-assistant-state\";\n\nconst tapShallowMemoArray = <T>(array: readonly T[]) => {\n // biome-ignore lint/correctness/useExhaustiveDependencies: shallow memo\n return tapMemo(() => array, array);\n};\n\nconst RootClientResource = resource(\n <K extends ClientNames>({\n element,\n emit,\n clientRef,\n }: {\n element: ClientElement<K>;\n emit: NotificationManager[\"emit\"];\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const { methods, state } = withAssistantTapContextProvider(\n { clientRef, emit },\n () => tapClientResource(element),\n );\n return tapMemo(() => ({ state, methods }), [methods, state]);\n },\n);\n\nconst RootClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n notifications,\n clientRef,\n name,\n }: {\n element: ClientElement<K>;\n notifications: NotificationManager;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n }): AssistantClientAccessor<K> => {\n const store = tapResourceRoot(\n RootClientResource({ element, emit: notifications.emit, clientRef }),\n );\n\n tapEffect(() => {\n return store.subscribe(notifications.notifySubscribers);\n }, [store, notifications]);\n\n return tapMemo(() => {\n const clientFunction = () => store.getValue().methods;\n Object.defineProperties(clientFunction, {\n source: {\n value: \"root\" as const,\n writable: false,\n },\n query: {\n value: {} as Record<string, never>,\n writable: false,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [store, name]);\n },\n);\n\nconst NoOpRootClientsAccessorsResource = resource(() => {\n return tapMemo(\n () => ({\n clients: [] as AssistantClientAccessor<ClientNames>[],\n subscribe: undefined,\n on: undefined,\n }),\n [],\n );\n});\n\nconst RootClientsAccessorsResource = resource(\n ({\n clients: inputClients,\n clientRef,\n }: {\n clients: RootClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n const notifications = tapResource(NotificationManager());\n\n tapEffect(\n () => clientRef.parent.subscribe(notifications.notifySubscribers),\n [clientRef, notifications],\n );\n\n const results = tapShallowMemoArray(\n tapResources(\n () =>\n Object.keys(inputClients).map((key) =>\n withKey(\n key,\n RootClientAccessorResource({\n element: inputClients[key as keyof typeof inputClients]!,\n notifications,\n clientRef,\n name: key as keyof typeof inputClients,\n }),\n ),\n ),\n [inputClients, notifications, clientRef],\n ),\n );\n\n return tapMemo(() => {\n return {\n clients: results,\n subscribe: notifications.subscribe,\n on: function <TEvent extends AssistantEventName>(\n this: AssistantClient,\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n ) {\n if (!this) {\n throw new Error(\n \"const { on } = useAui() is not supported. Use aui.on() instead.\",\n );\n }\n\n const { scope, event } = normalizeEventSelector(selector);\n\n if (scope !== \"*\") {\n const source = this[scope as ClientNames].source;\n if (source === null) {\n throw new Error(\n `Scope \"${scope}\" is not available. Use { scope: \"*\", event: \"${event}\" } to listen globally.`,\n );\n }\n }\n\n const localUnsub = notifications.on(event, (payload, clientStack) => {\n if (scope === \"*\") {\n callback(payload);\n return;\n }\n\n const scopeClient = this[scope as ClientNames]();\n const index = getClientIndex(scopeClient);\n if (scopeClient === clientStack[index]) {\n callback(payload);\n }\n });\n if (\n scope !== \"*\" &&\n clientRef.parent[scope as ClientNames].source === null\n )\n return localUnsub;\n\n const parentUnsub = clientRef.parent.on(selector, callback);\n\n return () => {\n localUnsub();\n parentUnsub();\n };\n },\n };\n }, [results, notifications, clientRef]);\n },\n);\n\nconst DerivedClientAccessorResource = resource(\n <K extends ClientNames>({\n element,\n clientRef,\n name,\n }: {\n element: DerivedElement<K>;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n name: K;\n }) => {\n // Track the latest props on a ref updated in render. The fiber is\n // keyed on the scope's meta by DerivedClientsAccessorsResource, so\n // source/query are stable for this fiber's lifetime and the only\n // value that can change between renders for the same fiber is the\n // identity of the `get` closure. Routing reads through the ref\n // avoids the one-commit lag that the previous `tapEffectEvent`\n // path imposed.\n const propsRef = tapRef(element.props);\n propsRef.current = element.props;\n\n return tapMemo(() => {\n const clientFunction = () => propsRef.current.get(clientRef.current!);\n Object.defineProperties(clientFunction, {\n source: {\n value: propsRef.current.source,\n },\n query: {\n value: propsRef.current.query,\n },\n name: {\n value: name,\n configurable: true,\n },\n });\n return clientFunction as AssistantClientAccessor<K>;\n }, [clientRef, name]);\n },\n);\n\nconst serializeMeta = <K extends ClientNames>(\n name: K,\n meta: ClientMeta<K>,\n): string => {\n // Sort top-level keys so {a, b} and {b, a} hash to the same fiber\n // identity, and guard JSON.stringify against unusual values (BigInt,\n // circular refs) so render never throws here.\n let queryKey: string;\n try {\n const sorted: Record<string, unknown> = {};\n for (const k of Object.keys(meta.query as object).sort()) {\n sorted[k] = (meta.query as Record<string, unknown>)[k];\n }\n queryKey = JSON.stringify(sorted);\n } catch {\n queryKey = String(meta.query);\n }\n return `${name}::${meta.source}::${queryKey}`;\n};\n\nconst DerivedClientsAccessorsResource = resource(\n ({\n clients,\n clientRef,\n }: {\n clients: DerivedClients;\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n }) => {\n return tapShallowMemoArray(\n tapResources(\n () =>\n Object.keys(clients).map((key) => {\n const name = key as keyof typeof clients;\n const element = clients[name]!;\n return withKey(\n serializeMeta(name, element.props),\n DerivedClientAccessorResource({\n element,\n clientRef,\n name,\n }),\n );\n }),\n [clients, clientRef],\n ),\n );\n },\n);\n\n/**\n * Resource that creates an extended AssistantClient.\n */\nexport const AssistantClientResource = resource(\n ({\n parent,\n clients,\n }: {\n parent: AssistantClient;\n clients: useAui.Props;\n }): AssistantClient => {\n const { rootClients, derivedClients } = tapSplitClients(clients, parent);\n\n const clientRef = tapRef({\n parent: parent,\n current: null as AssistantClient | null,\n }).current;\n\n tapEffect(() => {\n // if (clientRef.current && clientRef.current !== client)\n // throw new Error(\"clientRef.current !== client\");\n\n clientRef.current = client;\n });\n\n const rootFields = tapResource(\n Object.keys(rootClients).length > 0\n ? RootClientsAccessorsResource({ clients: rootClients, clientRef })\n : NoOpRootClientsAccessorsResource(),\n );\n\n const derivedFields = tapResource(\n DerivedClientsAccessorsResource({ clients: derivedClients, clientRef }),\n );\n\n const client = tapMemo(() => {\n // Swap DefaultAssistantClient -> createRootAssistantClient at root to change error message\n const proto =\n parent === DefaultAssistantClient\n ? createRootAssistantClient()\n : parent;\n\n const client = Object.create(proto) as AssistantClient;\n Object.assign(client, {\n subscribe: rootFields.subscribe ?? parent.subscribe,\n on: rootFields.on ?? parent.on,\n [PROXIED_ASSISTANT_STATE_SYMBOL]: createProxiedAssistantState(client),\n });\n\n for (const field of rootFields.clients) {\n (client as any)[field.name] = field;\n }\n for (const field of derivedFields) {\n (client as any)[field.name] = field;\n }\n\n return client;\n }, [parent, rootFields, derivedFields]);\n\n if (clientRef.current === null) {\n clientRef.current = client;\n }\n\n return client;\n },\n);\n\nexport namespace useAui {\n export type Props = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n };\n}\n\n/**\n * Returns the current `AssistantClient` from context.\n *\n * Read the client supplied by the nearest {@link AuiProvider} or\n * {@link AssistantRuntimeProvider}, then access a scope on it —\n * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair\n * with {@link useAuiState} to read reactive state and {@link useAuiEvent}\n * to subscribe to events. The returned client also exposes lower-level\n * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer\n * `useAuiEvent` for React event subscriptions.\n *\n * Rendered outside a provider, the returned client's scope accessors\n * throw a descriptive error whenever they are called.\n *\n * @example\n * ```tsx\n * const aui = useAui();\n *\n * const onSend = () => aui.composer().send();\n * const onCancel = () => aui.thread().cancelRun();\n * ```\n *\n * @example\n * ```tsx\n * // Combine with useAuiState to drive disabled state.\n * const aui = useAui();\n * const isRunning = useAuiState((s) => s.thread.isRunning);\n *\n * return (\n * <button disabled={isRunning} onClick={() => aui.composer().send()}>\n * Send\n * </button>\n * );\n * ```\n */\nexport function useAui(): AssistantClient;\n/**\n * Extends the parent `AssistantClient` with additional scopes.\n *\n * Advanced overload used when building primitives or providers — for example,\n * when a custom provider needs to register a `message`, `part`, or other scope\n * onto the client visible to its descendants. Application code rarely reaches\n * for this; use {@link useAui} with no arguments to read the existing client.\n *\n * @example\n * ```tsx\n * const aui = useAui({\n * message: Derived({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (aui) => aui.thread().message({ index: 0 }),\n * }),\n * });\n *\n * const role = useAuiState((s) => s.message.role);\n * ```\n */\nexport function useAui(clients: useAui.Props): AssistantClient;\n/**\n * Extends an explicit parent `AssistantClient` with additional scopes.\n */\nexport function useAui(\n clients: useAui.Props,\n config: { parent: null | AssistantClient },\n): AssistantClient;\n/** @deprecated This API is highly experimental and may be changed in a minor release */\nexport function useAui(\n clients?: useAui.Props,\n { parent }: { parent: null | AssistantClient } = {\n parent: useAssistantContextValue(),\n },\n): AssistantClient {\n if (clients) {\n // biome-ignore lint/correctness/useHookAtTopLevel: intentional conditional/nested hook usage\n return useResource(\n AssistantClientResource({\n parent: parent ?? DefaultAssistantClient,\n clients,\n }),\n );\n }\n if (parent === null)\n throw new Error(\"received null parent, this usage is not allowed\");\n return parent;\n}\n"],"mappings":"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"} |
@@ -1,2 +0,4 @@ | ||
| import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./types/events.js"; | ||
| import { AssistantEventCallback, AssistantEventName, AssistantEventSelector } from "./types/events.js"; | ||
| //#region src/useAuiEvent.d.ts | ||
| /** | ||
@@ -43,3 +45,5 @@ * Subscribes to an assistant event for the lifetime of the component. | ||
| */ | ||
| export declare const useAuiEvent: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void; | ||
| declare const useAuiEvent: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => void; | ||
| //#endregion | ||
| export { useAuiEvent }; | ||
| //# sourceMappingURL=useAuiEvent.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiEvent.d.ts","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACvB,0BAAuB;AAGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,SAAS,kBAAkB,EAC3D,UAAU,sBAAsB,CAAC,MAAM,CAAC,EACxC,UAAU,sBAAsB,CAAC,MAAM,CAAC,SAUzC,CAAC"} | ||
| {"version":3,"file":"useAuiEvent.d.ts","names":[],"sources":["../src/useAuiEvent.ts"],"mappings":";;;;;AAmDA;;;;;;;;;;;;;;;;;;;AAE0C;;;;;;;;;;;;;;;;;;;;cAF7B,WAAA,kBAA8B,kBAAA,EACzC,QAAA,EAAU,sBAAA,CAAuB,MAAA,GACjC,QAAA,EAAU,sBAAA,CAAuB,MAAA"} |
+59
-47
@@ -0,52 +1,64 @@ | ||
| import { normalizeEventSelector } from "./types/events.js"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { useEffect } from "react"; | ||
| import { useEffectEvent } from "use-effect-event"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { normalizeEventSelector } from "./types/events.js"; | ||
| //#region src/useAuiEvent.ts | ||
| /** | ||
| * Subscribes to an assistant event for the lifetime of the component. | ||
| * | ||
| * The subscription is established on mount and re-established whenever the | ||
| * scope or event name changes. The `callback` is wrapped in an effect-event | ||
| * shim, so the latest closure is invoked on each emission — you do not | ||
| * need to memoize it. | ||
| * | ||
| * @param selector - Either a dotted event name like | ||
| * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use | ||
| * `scope: "*"` to subscribe at the root client and receive emissions | ||
| * from any descendant scope, regardless of which one is in React | ||
| * context. | ||
| * @param callback - Invoked with the event payload. The most recent | ||
| * reference is always called. Return values are ignored, async callbacks | ||
| * are not awaited, and the callback cannot be called during render. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to transient model-context changes. | ||
| * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => { | ||
| * analytics.track("model_context_update", { threadId }); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to thread switches. | ||
| * useAuiEvent("threadListItem.switchedTo", () => { | ||
| * resetLocalState(); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Listen from the root client rather than the current React context. | ||
| * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => { | ||
| * analytics.track("model_context_update", payload); | ||
| * }); | ||
| * ``` | ||
| */ | ||
| export const useAuiEvent = (selector, callback) => { | ||
| const aui = useAui(); | ||
| const callbackRef = useEffectEvent(callback); | ||
| const { scope, event } = normalizeEventSelector(selector); | ||
| useEffect(() => aui.on({ scope, event }, callbackRef), [aui, scope, event, callbackRef]); | ||
| * Subscribes to an assistant event for the lifetime of the component. | ||
| * | ||
| * The subscription is established on mount and re-established whenever the | ||
| * scope or event name changes. The `callback` is wrapped in an effect-event | ||
| * shim, so the latest closure is invoked on each emission — you do not | ||
| * need to memoize it. | ||
| * | ||
| * @param selector - Either a dotted event name like | ||
| * `"thread.modelContextUpdate"` or an object `{ scope, event }`. Use | ||
| * `scope: "*"` to subscribe at the root client and receive emissions | ||
| * from any descendant scope, regardless of which one is in React | ||
| * context. | ||
| * @param callback - Invoked with the event payload. The most recent | ||
| * reference is always called. Return values are ignored, async callbacks | ||
| * are not awaited, and the callback cannot be called during render. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to transient model-context changes. | ||
| * useAuiEvent("thread.modelContextUpdate", ({ threadId }) => { | ||
| * analytics.track("model_context_update", { threadId }); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // React to thread switches. | ||
| * useAuiEvent("threadListItem.switchedTo", () => { | ||
| * resetLocalState(); | ||
| * }); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Listen from the root client rather than the current React context. | ||
| * useAuiEvent({ scope: "*", event: "thread.modelContextUpdate" }, (payload) => { | ||
| * analytics.track("model_context_update", payload); | ||
| * }); | ||
| * ``` | ||
| */ | ||
| const useAuiEvent = (selector, callback) => { | ||
| const aui = useAui(); | ||
| const callbackRef = useEffectEvent(callback); | ||
| const { scope, event } = normalizeEventSelector(selector); | ||
| useEffect(() => aui.on({ | ||
| scope, | ||
| event | ||
| }, callbackRef), [ | ||
| aui, | ||
| scope, | ||
| event, | ||
| callbackRef | ||
| ]); | ||
| }; | ||
| //#endregion | ||
| export { useAuiEvent }; | ||
| //# sourceMappingURL=useAuiEvent.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiEvent.js","sourceRoot":"","sources":["../src/useAuiEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAMlC,OAAO,EAAE,sBAAsB,EAAE,0BAAuB;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,QAAwC,EACxC,QAAwC,EACxC,EAAE;IACF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAC1D,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,WAAW,CAAC,EAC3C,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CACjC,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"useAuiEvent.js","names":[],"sources":["../src/useAuiEvent.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useEffectEvent } from \"use-effect-event\";\nimport { useAui } from \"./useAui\";\nimport type {\n AssistantEventName,\n AssistantEventCallback,\n AssistantEventSelector,\n} from \"./types/events\";\nimport { normalizeEventSelector } from \"./types/events\";\n\n/**\n * Subscribes to an assistant event for the lifetime of the component.\n *\n * The subscription is established on mount and re-established whenever the\n * scope or event name changes. The `callback` is wrapped in an effect-event\n * shim, so the latest closure is invoked on each emission — you do not\n * need to memoize it.\n *\n * @param selector - Either a dotted event name like\n * `\"thread.modelContextUpdate\"` or an object `{ scope, event }`. Use\n * `scope: \"*\"` to subscribe at the root client and receive emissions\n * from any descendant scope, regardless of which one is in React\n * context.\n * @param callback - Invoked with the event payload. The most recent\n * reference is always called. Return values are ignored, async callbacks\n * are not awaited, and the callback cannot be called during render.\n *\n * @example\n * ```tsx\n * // React to transient model-context changes.\n * useAuiEvent(\"thread.modelContextUpdate\", ({ threadId }) => {\n * analytics.track(\"model_context_update\", { threadId });\n * });\n * ```\n *\n * @example\n * ```tsx\n * // React to thread switches.\n * useAuiEvent(\"threadListItem.switchedTo\", () => {\n * resetLocalState();\n * });\n * ```\n *\n * @example\n * ```tsx\n * // Listen from the root client rather than the current React context.\n * useAuiEvent({ scope: \"*\", event: \"thread.modelContextUpdate\" }, (payload) => {\n * analytics.track(\"model_context_update\", payload);\n * });\n * ```\n */\nexport const useAuiEvent = <TEvent extends AssistantEventName>(\n selector: AssistantEventSelector<TEvent>,\n callback: AssistantEventCallback<TEvent>,\n) => {\n const aui = useAui();\n const callbackRef = useEffectEvent(callback);\n\n const { scope, event } = normalizeEventSelector(selector);\n useEffect(\n () => aui.on({ scope, event }, callbackRef),\n [aui, scope, event, callbackRef],\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,MAAa,eACX,UACA,aACG;CACH,MAAM,MAAM,OAAO;CACnB,MAAM,cAAc,eAAe,QAAQ;CAE3C,MAAM,EAAE,OAAO,UAAU,uBAAuB,QAAQ;CACxD,gBACQ,IAAI,GAAG;EAAE;EAAO;CAAM,GAAG,WAAW,GAC1C;EAAC;EAAK;EAAO;EAAO;CAAW,CACjC;AACF"} |
@@ -1,2 +0,4 @@ | ||
| import type { AssistantState } from "./types/client.js"; | ||
| import { AssistantState } from "./types/client.js"; | ||
| //#region src/useAuiState.d.ts | ||
| /** | ||
@@ -34,3 +36,5 @@ * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| */ | ||
| export declare const useAuiState: <T>(selector: (state: AssistantState) => T) => T; | ||
| declare const useAuiState: <T>(selector: (state: AssistantState) => T) => T; | ||
| //#endregion | ||
| export { useAuiState }; | ||
| //# sourceMappingURL=useAuiState.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiState.d.ts","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,cAAc,KAAK,CAAC,KAAG,CAmBvE,CAAC"} | ||
| {"version":3,"file":"useAuiState.d.ts","names":[],"sources":["../src/useAuiState.ts"],"mappings":";;;;;AAqCA;;;;;;;;;;;;;;;AAmBC;;;;;;;;;;;;;;;cAnBY,WAAA,MAAkB,QAAA,GAAW,KAAA,EAAO,cAAA,KAAmB,CAAA,KAAI,CAAA"} |
+44
-42
@@ -1,46 +0,48 @@ | ||
| import { useSyncExternalStore, useDebugValue } from "react"; | ||
| import { getProxiedAssistantState } from "./utils/proxied-assistant-state.js"; | ||
| import { useAui } from "./useAui.js"; | ||
| import { getProxiedAssistantState } from "./utils/proxied-assistant-state.js"; | ||
| import { useDebugValue, useSyncExternalStore } from "react"; | ||
| //#region src/useAuiState.ts | ||
| /** | ||
| * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| * component whenever that slice changes. | ||
| * | ||
| * The `selector` is called on every store update; its return value is | ||
| * compared by `Object.is`, and the component re-renders only when the | ||
| * selected slice changes. Returning the entire state object is not | ||
| * supported and throws at runtime — select a specific field instead, or | ||
| * compose multiple `useAuiState` calls. Returning a new object or array | ||
| * literal, including spreading `s.thread` into a new object, causes a | ||
| * re-render on every store update; either select primitives or return a | ||
| * memoized reference. | ||
| * | ||
| * @param selector - Pure function that derives a value from the current | ||
| * assistant state. Should be cheap and referentially stable for equal | ||
| * inputs (plain field reads, primitives, or memoized values). | ||
| * @returns The currently selected slice. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Disable a button while a run is in flight. | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Prefer multiple selectors over an inline object literal, which would | ||
| * // create a new reference on every render. | ||
| * const text = useAuiState((s) => s.composer.text); | ||
| * const canSend = useAuiState((s) => s.composer.canSend); | ||
| * ``` | ||
| */ | ||
| export const useAuiState = (selector) => { | ||
| const aui = useAui(); | ||
| const proxiedState = getProxiedAssistantState(aui); | ||
| const slice = useSyncExternalStore(aui.subscribe, () => selector(proxiedState), () => selector(proxiedState)); | ||
| if (slice === proxiedState) { | ||
| throw new Error("You tried to return the entire AssistantState. This is not supported due to technical limitations."); | ||
| } | ||
| useDebugValue(slice); | ||
| return slice; | ||
| * Subscribes to a slice of {@link AssistantState} and re-renders the | ||
| * component whenever that slice changes. | ||
| * | ||
| * The `selector` is called on every store update; its return value is | ||
| * compared by `Object.is`, and the component re-renders only when the | ||
| * selected slice changes. Returning the entire state object is not | ||
| * supported and throws at runtime — select a specific field instead, or | ||
| * compose multiple `useAuiState` calls. Returning a new object or array | ||
| * literal, including spreading `s.thread` into a new object, causes a | ||
| * re-render on every store update; either select primitives or return a | ||
| * memoized reference. | ||
| * | ||
| * @param selector - Pure function that derives a value from the current | ||
| * assistant state. Should be cheap and referentially stable for equal | ||
| * inputs (plain field reads, primitives, or memoized values). | ||
| * @returns The currently selected slice. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Disable a button while a run is in flight. | ||
| * const isRunning = useAuiState((s) => s.thread.isRunning); | ||
| * ``` | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * // Prefer multiple selectors over an inline object literal, which would | ||
| * // create a new reference on every render. | ||
| * const text = useAuiState((s) => s.composer.text); | ||
| * const canSend = useAuiState((s) => s.composer.canSend); | ||
| * ``` | ||
| */ | ||
| const useAuiState = (selector) => { | ||
| const aui = useAui(); | ||
| const proxiedState = getProxiedAssistantState(aui); | ||
| const slice = useSyncExternalStore(aui.subscribe, () => selector(proxiedState), () => selector(proxiedState)); | ||
| if (slice === proxiedState) throw new Error("You tried to return the entire AssistantState. This is not supported due to technical limitations."); | ||
| useDebugValue(slice); | ||
| return slice; | ||
| }; | ||
| //#endregion | ||
| export { useAuiState }; | ||
| //# sourceMappingURL=useAuiState.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useAuiState.js","sourceRoot":"","sources":["../src/useAuiState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,wBAAwB,EAAE,2CAAwC;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAsC,EAAK,EAAE;IAC1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,YAAY,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,oBAAoB,CAChC,GAAG,CAAC,SAAS,EACb,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC5B,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAC7B,CAAC;IAEF,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"} | ||
| {"version":3,"file":"useAuiState.js","names":[],"sources":["../src/useAuiState.ts"],"sourcesContent":["import { useSyncExternalStore, useDebugValue } from \"react\";\nimport type { AssistantState } from \"./types/client\";\nimport { useAui } from \"./useAui\";\nimport { getProxiedAssistantState } from \"./utils/proxied-assistant-state\";\n\n/**\n * Subscribes to a slice of {@link AssistantState} and re-renders the\n * component whenever that slice changes.\n *\n * The `selector` is called on every store update; its return value is\n * compared by `Object.is`, and the component re-renders only when the\n * selected slice changes. Returning the entire state object is not\n * supported and throws at runtime — select a specific field instead, or\n * compose multiple `useAuiState` calls. Returning a new object or array\n * literal, including spreading `s.thread` into a new object, causes a\n * re-render on every store update; either select primitives or return a\n * memoized reference.\n *\n * @param selector - Pure function that derives a value from the current\n * assistant state. Should be cheap and referentially stable for equal\n * inputs (plain field reads, primitives, or memoized values).\n * @returns The currently selected slice.\n *\n * @example\n * ```tsx\n * // Disable a button while a run is in flight.\n * const isRunning = useAuiState((s) => s.thread.isRunning);\n * ```\n *\n * @example\n * ```tsx\n * // Prefer multiple selectors over an inline object literal, which would\n * // create a new reference on every render.\n * const text = useAuiState((s) => s.composer.text);\n * const canSend = useAuiState((s) => s.composer.canSend);\n * ```\n */\nexport const useAuiState = <T>(selector: (state: AssistantState) => T): T => {\n const aui = useAui();\n const proxiedState = getProxiedAssistantState(aui);\n\n const slice = useSyncExternalStore(\n aui.subscribe,\n () => selector(proxiedState),\n () => selector(proxiedState),\n );\n\n if (slice === proxiedState) {\n throw new Error(\n \"You tried to return the entire AssistantState. This is not supported due to technical limitations.\",\n );\n }\n\n useDebugValue(slice);\n\n return slice;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAa,eAAkB,aAA8C;CAC3E,MAAM,MAAM,OAAO;CACnB,MAAM,eAAe,yBAAyB,GAAG;CAEjD,MAAM,QAAQ,qBACZ,IAAI,iBACE,SAAS,YAAY,SACrB,SAAS,YAAY,CAC7B;CAEA,IAAI,UAAU,cACZ,MAAM,IAAI,MACR,oGACF;CAGF,cAAc,KAAK;CAEnB,OAAO;AACT"} |
@@ -0,1 +1,2 @@ | ||
| //#region src/utils/BaseProxyHandler.d.ts | ||
| /** | ||
@@ -6,19 +7,21 @@ * Handles common proxy introspection properties. | ||
| */ | ||
| export declare const handleIntrospectionProp: (prop: string | symbol, name: string) => unknown | false; | ||
| export declare abstract class BaseProxyHandler implements ProxyHandler<object> { | ||
| abstract get(_: unknown, prop: string | symbol, receiver?: unknown): unknown; | ||
| abstract ownKeys(): ArrayLike<string | symbol>; | ||
| abstract has(_: unknown, prop: string | symbol): boolean; | ||
| getOwnPropertyDescriptor(_: unknown, prop: string | symbol): { | ||
| value: {} | null; | ||
| writable: boolean; | ||
| enumerable: boolean; | ||
| configurable: boolean; | ||
| } | undefined; | ||
| set(): boolean; | ||
| setPrototypeOf(): boolean; | ||
| defineProperty(): boolean; | ||
| deleteProperty(): boolean; | ||
| preventExtensions(): boolean; | ||
| declare const handleIntrospectionProp: (prop: string | symbol, name: string) => unknown | false; | ||
| declare abstract class BaseProxyHandler implements ProxyHandler<object> { | ||
| abstract get(_: unknown, prop: string | symbol, receiver?: unknown): unknown; | ||
| abstract ownKeys(): ArrayLike<string | symbol>; | ||
| abstract has(_: unknown, prop: string | symbol): boolean; | ||
| getOwnPropertyDescriptor(_: unknown, prop: string | symbol): { | ||
| value: {} | null; | ||
| writable: boolean; | ||
| enumerable: boolean; | ||
| configurable: boolean; | ||
| } | undefined; | ||
| set(): boolean; | ||
| setPrototypeOf(): boolean; | ||
| defineProperty(): boolean; | ||
| deleteProperty(): boolean; | ||
| preventExtensions(): boolean; | ||
| } | ||
| //#endregion | ||
| export { BaseProxyHandler, handleIntrospectionProp }; | ||
| //# sourceMappingURL=BaseProxyHandler.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"BaseProxyHandler.d.ts","sourceRoot":"","sources":["../../src/utils/BaseProxyHandler.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,MAAM,GAAG,MAAM,EACrB,MAAM,MAAM,KACX,OAAO,GAAG,KAMZ,CAAC;AAEF,8BAAsB,gBAAiB,YAAW,YAAY,CAAC,MAAM,CAAC;IACpE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO;IAC5E,QAAQ,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAExD,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;;;;;;IAW1D,GAAG;IAGH,cAAc;IAGd,cAAc;IAGd,cAAc;IAGd,iBAAiB,IAAI,OAAO;CAG7B"} | ||
| {"version":3,"file":"BaseProxyHandler.d.ts","names":[],"sources":["../../src/utils/BaseProxyHandler.ts"],"mappings":";;AAOA;;;;cAAa,uBAAA,GACX,IAAA,mBACA,IAAY;AAAA,uBASQ,gBAAA,YAA4B,YAAY;EAAA,SACnD,GAAA,CAAI,CAAA,WAAY,IAAA,mBAAuB,QAAA;EAAA,SACvC,OAAA,CAAA,GAAW,SAAA;EAAA,SACX,GAAA,CAAI,CAAA,WAAY,IAAA;EAEzB,wBAAA,CAAyB,CAAA,WAAY,IAAA;;;;;;EAWrC,GAAA,CAAA;EAGA,cAAA,CAAA;EAGA,cAAA,CAAA;EAGA,cAAA,CAAA;EAGA,iBAAA,CAAA;AAAA"} |
@@ -1,46 +0,49 @@ | ||
| const INTROSPECTION_PROPS = new Set(["$$typeof", "nodeType", "then"]); | ||
| //#region src/utils/BaseProxyHandler.ts | ||
| const INTROSPECTION_PROPS = new Set([ | ||
| "$$typeof", | ||
| "nodeType", | ||
| "then" | ||
| ]); | ||
| /** | ||
| * Handles common proxy introspection properties. | ||
| * Returns the appropriate value for toStringTag, toJSON, and props that should return undefined. | ||
| * Returns `false` if the prop should be handled by the subclass. | ||
| */ | ||
| export const handleIntrospectionProp = (prop, name) => { | ||
| if (prop === Symbol.toStringTag) | ||
| return name; | ||
| if (typeof prop === "symbol") | ||
| return undefined; | ||
| if (prop === "toJSON") | ||
| return () => name; | ||
| if (INTROSPECTION_PROPS.has(prop)) | ||
| return undefined; | ||
| return false; | ||
| * Handles common proxy introspection properties. | ||
| * Returns the appropriate value for toStringTag, toJSON, and props that should return undefined. | ||
| * Returns `false` if the prop should be handled by the subclass. | ||
| */ | ||
| const handleIntrospectionProp = (prop, name) => { | ||
| if (prop === Symbol.toStringTag) return name; | ||
| if (typeof prop === "symbol") return void 0; | ||
| if (prop === "toJSON") return () => name; | ||
| if (INTROSPECTION_PROPS.has(prop)) return void 0; | ||
| return false; | ||
| }; | ||
| export class BaseProxyHandler { | ||
| getOwnPropertyDescriptor(_, prop) { | ||
| const value = this.get(_, prop); | ||
| if (value === undefined) | ||
| return undefined; | ||
| return { | ||
| value, | ||
| writable: false, | ||
| enumerable: true, | ||
| configurable: false, | ||
| }; | ||
| } | ||
| set() { | ||
| return false; | ||
| } | ||
| setPrototypeOf() { | ||
| return false; | ||
| } | ||
| defineProperty() { | ||
| return false; | ||
| } | ||
| deleteProperty() { | ||
| return false; | ||
| } | ||
| preventExtensions() { | ||
| return false; | ||
| } | ||
| } | ||
| var BaseProxyHandler = class { | ||
| getOwnPropertyDescriptor(_, prop) { | ||
| const value = this.get(_, prop); | ||
| if (value === void 0) return void 0; | ||
| return { | ||
| value, | ||
| writable: false, | ||
| enumerable: true, | ||
| configurable: false | ||
| }; | ||
| } | ||
| set() { | ||
| return false; | ||
| } | ||
| setPrototypeOf() { | ||
| return false; | ||
| } | ||
| defineProperty() { | ||
| return false; | ||
| } | ||
| deleteProperty() { | ||
| return false; | ||
| } | ||
| preventExtensions() { | ||
| return false; | ||
| } | ||
| }; | ||
| //#endregion | ||
| export { BaseProxyHandler, handleIntrospectionProp }; | ||
| //# sourceMappingURL=BaseProxyHandler.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"BaseProxyHandler.js","sourceRoot":"","sources":["../../src/utils/BaseProxyHandler.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,IAAqB,EACrB,IAAY,EACK,EAAE;IACnB,IAAI,IAAI,KAAK,MAAM,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IACzC,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,OAAgB,gBAAgB;IAKpC,wBAAwB,CAAC,CAAU,EAAE,IAAqB;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,OAAO;YACL,KAAK;YACL,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,GAAG;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,cAAc;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,cAAc;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,cAAc;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,iBAAiB;QACf,OAAO,KAAK,CAAC;IACf,CAAC;CACF"} | ||
| {"version":3,"file":"BaseProxyHandler.js","names":[],"sources":["../../src/utils/BaseProxyHandler.ts"],"sourcesContent":["const INTROSPECTION_PROPS = new Set([\"$$typeof\", \"nodeType\", \"then\"]);\n\n/**\n * Handles common proxy introspection properties.\n * Returns the appropriate value for toStringTag, toJSON, and props that should return undefined.\n * Returns `false` if the prop should be handled by the subclass.\n */\nexport const handleIntrospectionProp = (\n prop: string | symbol,\n name: string,\n): unknown | false => {\n if (prop === Symbol.toStringTag) return name;\n if (typeof prop === \"symbol\") return undefined;\n if (prop === \"toJSON\") return () => name;\n if (INTROSPECTION_PROPS.has(prop)) return undefined;\n return false;\n};\n\nexport abstract class BaseProxyHandler implements ProxyHandler<object> {\n abstract get(_: unknown, prop: string | symbol, receiver?: unknown): unknown;\n abstract ownKeys(): ArrayLike<string | symbol>;\n abstract has(_: unknown, prop: string | symbol): boolean;\n\n getOwnPropertyDescriptor(_: unknown, prop: string | symbol) {\n const value = this.get(_, prop);\n if (value === undefined) return undefined;\n return {\n value,\n writable: false,\n enumerable: true,\n configurable: false,\n };\n }\n\n set() {\n return false;\n }\n setPrototypeOf() {\n return false;\n }\n defineProperty() {\n return false;\n }\n deleteProperty() {\n return false;\n }\n preventExtensions(): boolean {\n return false;\n }\n}\n"],"mappings":";AAAA,MAAM,sBAAsB,IAAI,IAAI;CAAC;CAAY;CAAY;AAAM,CAAC;;;;;;AAOpE,MAAa,2BACX,MACA,SACoB;CACpB,IAAI,SAAS,OAAO,aAAa,OAAO;CACxC,IAAI,OAAO,SAAS,UAAU,OAAO,KAAA;CACrC,IAAI,SAAS,UAAU,aAAa;CACpC,IAAI,oBAAoB,IAAI,IAAI,GAAG,OAAO,KAAA;CAC1C,OAAO;AACT;AAEA,IAAsB,mBAAtB,MAAuE;CAKrE,yBAAyB,GAAY,MAAuB;EAC1D,MAAM,QAAQ,KAAK,IAAI,GAAG,IAAI;EAC9B,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;EAChC,OAAO;GACL;GACA,UAAU;GACV,YAAY;GACZ,cAAc;EAChB;CACF;CAEA,MAAM;EACJ,OAAO;CACT;CACA,iBAAiB;EACf,OAAO;CACT;CACA,iBAAiB;EACf,OAAO;CACT;CACA,iBAAiB;EACf,OAAO;CACT;CACA,oBAA6B;EAC3B,OAAO;CACT;AACF"} |
@@ -1,11 +0,15 @@ | ||
| import type { ClientStack } from "./tap-client-stack-context.js"; | ||
| import type { AssistantEventName, AssistantEventPayload } from "../types/events.js"; | ||
| import type { Unsubscribe } from "../types/client.js"; | ||
| export type NotificationManager = { | ||
| on<TEvent extends AssistantEventName>(event: TEvent, callback: (payload: AssistantEventPayload[TEvent], clientStack: ClientStack) => void): Unsubscribe; | ||
| emit<TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent], clientStack: ClientStack): void; | ||
| subscribe(callback: () => void): Unsubscribe; | ||
| notifySubscribers(): void; | ||
| import { AssistantEventName, AssistantEventPayload } from "../types/events.js"; | ||
| import { Unsubscribe } from "../types/client.js"; | ||
| import { ClientStack } from "./tap-client-stack-context.js"; | ||
| //#region src/utils/NotificationManager.d.ts | ||
| type NotificationManager = { | ||
| on<TEvent extends AssistantEventName>(event: TEvent, callback: (payload: AssistantEventPayload[TEvent], clientStack: ClientStack) => void): Unsubscribe; | ||
| emit<TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent], clientStack: ClientStack): void; | ||
| subscribe(callback: () => void): Unsubscribe; | ||
| notifySubscribers(): void; | ||
| }; | ||
| export declare const NotificationManager: () => import("@assistant-ui/tap").ResourceElement<NotificationManager, undefined>; | ||
| declare const NotificationManager: () => import("@assistant-ui/tap").ResourceElement<NotificationManager, undefined>; | ||
| //#endregion | ||
| export { NotificationManager }; | ||
| //# sourceMappingURL=NotificationManager.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"NotificationManager.d.ts","sourceRoot":"","sources":["../../src/utils/NotificationManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,sCAAmC;AAC9D,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACtB,2BAAwB;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,2BAAwB;AAKnD,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,CAAC,MAAM,SAAS,kBAAkB,EAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CACR,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,WAAW,KACrB,IAAI,GACR,WAAW,CAAC;IACf,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAClD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,IAAI,CAAC;IACR,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC7C,iBAAiB,IAAI,IAAI,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,mBAAmB,mFAqF9B,CAAC"} | ||
| {"version":3,"file":"NotificationManager.d.ts","names":[],"sources":["../../src/utils/NotificationManager.ts"],"mappings":";;;;;KAWY,mBAAA;EACV,EAAA,gBAAkB,kBAAA,EAChB,KAAA,EAAO,MAAA,EACP,QAAA,GACE,OAAA,EAAS,qBAAA,CAAsB,MAAA,GAC/B,WAAA,EAAa,WAAA,YAEd,WAAA;EACH,IAAA,gBAAoB,OAAA,CAAQ,kBAAA,QAC1B,KAAA,EAAO,MAAA,EACP,OAAA,EAAS,qBAAA,CAAsB,MAAA,GAC/B,WAAA,EAAa,WAAA;EAEf,SAAA,CAAU,QAAA,eAAuB,WAAA;EACjC,iBAAA;AAAA;AAAA,cAGW,mBAAA,oCAAmB,eAAA,CAAA,mBAAA"} |
@@ -1,84 +0,71 @@ | ||
| import { resource } from "@assistant-ui/tap"; | ||
| import { tapConst } from "@assistant-ui/tap"; | ||
| export const NotificationManager = resource(() => { | ||
| return tapConst(() => { | ||
| const listeners = new Map(); | ||
| const wildcardListeners = new Set(); | ||
| const subscribers = new Set(); | ||
| return { | ||
| on(event, callback) { | ||
| const cb = callback; | ||
| if (event === "*") { | ||
| wildcardListeners.add(cb); | ||
| return () => wildcardListeners.delete(cb); | ||
| } | ||
| let set = listeners.get(event); | ||
| if (!set) { | ||
| set = new Set(); | ||
| listeners.set(event, set); | ||
| } | ||
| set.add(cb); | ||
| return () => { | ||
| set.delete(cb); | ||
| if (set.size === 0) | ||
| listeners.delete(event); | ||
| }; | ||
| }, | ||
| emit(event, payload, clientStack) { | ||
| const eventListeners = listeners.get(event); | ||
| if (!eventListeners && wildcardListeners.size === 0) | ||
| return; | ||
| queueMicrotask(() => { | ||
| const errors = []; | ||
| if (eventListeners) { | ||
| for (const cb of eventListeners) { | ||
| try { | ||
| cb(payload, clientStack); | ||
| } | ||
| catch (e) { | ||
| errors.push(e); | ||
| } | ||
| } | ||
| } | ||
| if (wildcardListeners.size > 0) { | ||
| const wrapped = { event, payload }; | ||
| for (const cb of wildcardListeners) { | ||
| try { | ||
| cb(wrapped, clientStack); | ||
| } | ||
| catch (e) { | ||
| errors.push(e); | ||
| } | ||
| } | ||
| } | ||
| if (errors.length > 0) { | ||
| if (errors.length === 1) { | ||
| throw errors[0]; | ||
| } | ||
| else { | ||
| for (const error of errors) { | ||
| console.error(error); | ||
| } | ||
| throw new AggregateError(errors, "Errors occurred during event emission"); | ||
| } | ||
| } | ||
| }); | ||
| }, | ||
| subscribe(callback) { | ||
| subscribers.add(callback); | ||
| return () => subscribers.delete(callback); | ||
| }, | ||
| notifySubscribers() { | ||
| for (const cb of subscribers) { | ||
| try { | ||
| cb(); | ||
| } | ||
| catch (e) { | ||
| console.error("NotificationManager: subscriber callback error", e); | ||
| } | ||
| } | ||
| }, | ||
| }; | ||
| }, []); | ||
| import { resource, tapConst } from "@assistant-ui/tap"; | ||
| //#region src/utils/NotificationManager.ts | ||
| const NotificationManager = resource(() => { | ||
| return tapConst(() => { | ||
| const listeners = /* @__PURE__ */ new Map(); | ||
| const wildcardListeners = /* @__PURE__ */ new Set(); | ||
| const subscribers = /* @__PURE__ */ new Set(); | ||
| return { | ||
| on(event, callback) { | ||
| const cb = callback; | ||
| if (event === "*") { | ||
| wildcardListeners.add(cb); | ||
| return () => wildcardListeners.delete(cb); | ||
| } | ||
| let set = listeners.get(event); | ||
| if (!set) { | ||
| set = /* @__PURE__ */ new Set(); | ||
| listeners.set(event, set); | ||
| } | ||
| set.add(cb); | ||
| return () => { | ||
| set.delete(cb); | ||
| if (set.size === 0) listeners.delete(event); | ||
| }; | ||
| }, | ||
| emit(event, payload, clientStack) { | ||
| const eventListeners = listeners.get(event); | ||
| if (!eventListeners && wildcardListeners.size === 0) return; | ||
| queueMicrotask(() => { | ||
| const errors = []; | ||
| if (eventListeners) for (const cb of eventListeners) try { | ||
| cb(payload, clientStack); | ||
| } catch (e) { | ||
| errors.push(e); | ||
| } | ||
| if (wildcardListeners.size > 0) { | ||
| const wrapped = { | ||
| event, | ||
| payload | ||
| }; | ||
| for (const cb of wildcardListeners) try { | ||
| cb(wrapped, clientStack); | ||
| } catch (e) { | ||
| errors.push(e); | ||
| } | ||
| } | ||
| if (errors.length > 0) if (errors.length === 1) throw errors[0]; | ||
| else { | ||
| for (const error of errors) console.error(error); | ||
| throw new AggregateError(errors, "Errors occurred during event emission"); | ||
| } | ||
| }); | ||
| }, | ||
| subscribe(callback) { | ||
| subscribers.add(callback); | ||
| return () => subscribers.delete(callback); | ||
| }, | ||
| notifySubscribers() { | ||
| for (const cb of subscribers) try { | ||
| cb(); | ||
| } catch (e) { | ||
| console.error("NotificationManager: subscriber callback error", e); | ||
| } | ||
| } | ||
| }; | ||
| }, []); | ||
| }); | ||
| //#endregion | ||
| export { NotificationManager }; | ||
| //# sourceMappingURL=NotificationManager.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"NotificationManager.js","sourceRoot":"","sources":["../../src/utils/NotificationManager.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"NotificationManager.js","names":[],"sources":["../../src/utils/NotificationManager.ts"],"sourcesContent":["import { resource } from \"@assistant-ui/tap\";\nimport type { ClientStack } from \"./tap-client-stack-context\";\nimport type {\n AssistantEventName,\n AssistantEventPayload,\n} from \"../types/events\";\nimport type { Unsubscribe } from \"../types/client\";\nimport { tapConst } from \"@assistant-ui/tap\";\n\ntype InternalCallback = (payload: unknown, clientStack: ClientStack) => void;\n\nexport type NotificationManager = {\n on<TEvent extends AssistantEventName>(\n event: TEvent,\n callback: (\n payload: AssistantEventPayload[TEvent],\n clientStack: ClientStack,\n ) => void,\n ): Unsubscribe;\n emit<TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n clientStack: ClientStack,\n ): void;\n subscribe(callback: () => void): Unsubscribe;\n notifySubscribers(): void;\n};\n\nexport const NotificationManager = resource((): NotificationManager => {\n return tapConst(() => {\n const listeners = new Map<string, Set<InternalCallback>>();\n const wildcardListeners = new Set<InternalCallback>();\n const subscribers = new Set<() => void>();\n\n return {\n on(event, callback) {\n const cb = callback as InternalCallback;\n if (event === \"*\") {\n wildcardListeners.add(cb);\n return () => wildcardListeners.delete(cb);\n }\n\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n set.add(cb);\n\n return () => {\n set!.delete(cb);\n if (set!.size === 0) listeners.delete(event);\n };\n },\n\n emit(event, payload, clientStack) {\n const eventListeners = listeners.get(event);\n if (!eventListeners && wildcardListeners.size === 0) return;\n\n queueMicrotask(() => {\n const errors = [];\n if (eventListeners) {\n for (const cb of eventListeners) {\n try {\n cb(payload, clientStack);\n } catch (e) {\n errors.push(e);\n }\n }\n }\n if (wildcardListeners.size > 0) {\n const wrapped = { event, payload };\n for (const cb of wildcardListeners) {\n try {\n cb(wrapped, clientStack);\n } catch (e) {\n errors.push(e);\n }\n }\n }\n\n if (errors.length > 0) {\n if (errors.length === 1) {\n throw errors[0];\n } else {\n for (const error of errors) {\n console.error(error);\n }\n throw new AggregateError(\n errors,\n \"Errors occurred during event emission\",\n );\n }\n }\n });\n },\n\n subscribe(callback) {\n subscribers.add(callback);\n return () => subscribers.delete(callback);\n },\n\n notifySubscribers() {\n for (const cb of subscribers) {\n try {\n cb();\n } catch (e) {\n console.error(\"NotificationManager: subscriber callback error\", e);\n }\n }\n },\n };\n }, []);\n});\n"],"mappings":";;AA4BA,MAAa,sBAAsB,eAAoC;CACrE,OAAO,eAAe;EACpB,MAAM,4BAAY,IAAI,IAAmC;EACzD,MAAM,oCAAoB,IAAI,IAAsB;EACpD,MAAM,8BAAc,IAAI,IAAgB;EAExC,OAAO;GACL,GAAG,OAAO,UAAU;IAClB,MAAM,KAAK;IACX,IAAI,UAAU,KAAK;KACjB,kBAAkB,IAAI,EAAE;KACxB,aAAa,kBAAkB,OAAO,EAAE;IAC1C;IAEA,IAAI,MAAM,UAAU,IAAI,KAAK;IAC7B,IAAI,CAAC,KAAK;KACR,sBAAM,IAAI,IAAI;KACd,UAAU,IAAI,OAAO,GAAG;IAC1B;IACA,IAAI,IAAI,EAAE;IAEV,aAAa;KACX,IAAK,OAAO,EAAE;KACd,IAAI,IAAK,SAAS,GAAG,UAAU,OAAO,KAAK;IAC7C;GACF;GAEA,KAAK,OAAO,SAAS,aAAa;IAChC,MAAM,iBAAiB,UAAU,IAAI,KAAK;IAC1C,IAAI,CAAC,kBAAkB,kBAAkB,SAAS,GAAG;IAErD,qBAAqB;KACnB,MAAM,SAAS,CAAC;KAChB,IAAI,gBACF,KAAK,MAAM,MAAM,gBACf,IAAI;MACF,GAAG,SAAS,WAAW;KACzB,SAAS,GAAG;MACV,OAAO,KAAK,CAAC;KACf;KAGJ,IAAI,kBAAkB,OAAO,GAAG;MAC9B,MAAM,UAAU;OAAE;OAAO;MAAQ;MACjC,KAAK,MAAM,MAAM,mBACf,IAAI;OACF,GAAG,SAAS,WAAW;MACzB,SAAS,GAAG;OACV,OAAO,KAAK,CAAC;MACf;KAEJ;KAEA,IAAI,OAAO,SAAS,GAClB,IAAI,OAAO,WAAW,GACpB,MAAM,OAAO;UACR;MACL,KAAK,MAAM,SAAS,QAClB,QAAQ,MAAM,KAAK;MAErB,MAAM,IAAI,eACR,QACA,uCACF;KACF;IAEJ,CAAC;GACH;GAEA,UAAU,UAAU;IAClB,YAAY,IAAI,QAAQ;IACxB,aAAa,YAAY,OAAO,QAAQ;GAC1C;GAEA,oBAAoB;IAClB,KAAK,MAAM,MAAM,aACf,IAAI;KACF,GAAG;IACL,SAAS,GAAG;KACV,QAAQ,MAAM,kDAAkD,CAAC;IACnE;GAEJ;EACF;CACF,GAAG,CAAC,CAAC;AACP,CAAC"} |
@@ -1,8 +0,12 @@ | ||
| import type { AssistantClient, AssistantState } from "../types/client.js"; | ||
| export declare const PROXIED_ASSISTANT_STATE_SYMBOL: unique symbol; | ||
| import { AssistantClient, AssistantState } from "../types/client.js"; | ||
| //#region src/utils/proxied-assistant-state.d.ts | ||
| declare const PROXIED_ASSISTANT_STATE_SYMBOL: unique symbol; | ||
| /** | ||
| * Proxied state that lazily accesses scope states | ||
| */ | ||
| export declare const createProxiedAssistantState: (client: AssistantClient) => AssistantState; | ||
| export declare const getProxiedAssistantState: (client: AssistantClient) => AssistantState; | ||
| declare const createProxiedAssistantState: (client: AssistantClient) => AssistantState; | ||
| declare const getProxiedAssistantState: (client: AssistantClient) => AssistantState; | ||
| //#endregion | ||
| export { PROXIED_ASSISTANT_STATE_SYMBOL, createProxiedAssistantState, getProxiedAssistantState }; | ||
| //# sourceMappingURL=proxied-assistant-state.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxied-assistant-state.d.ts","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,2BAAwB;AAGvE,eAAO,MAAM,8BAA8B,eAE1C,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,KACtB,cA0BF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,eAAe,KACtB,cAIF,CAAC"} | ||
| {"version":3,"file":"proxied-assistant-state.d.ts","names":[],"sources":["../../src/utils/proxied-assistant-state.ts"],"mappings":";;;cAKa,8BAAA;;AAAb;;cAWa,2BAAA,GACX,MAAA,EAAQ,eAAA,KACP,cA0BF;AAAA,cAEY,wBAAA,GACX,MAAA,EAAQ,eAAA,KACP,cAIF"} |
| "use client"; | ||
| import { BaseProxyHandler, handleIntrospectionProp } from "./BaseProxyHandler.js"; | ||
| import { getClientState } from "../tapClientResource.js"; | ||
| import { BaseProxyHandler, handleIntrospectionProp } from "./BaseProxyHandler.js"; | ||
| export const PROXIED_ASSISTANT_STATE_SYMBOL = Symbol("assistant-ui.store.proxiedAssistantState"); | ||
| //#region src/utils/proxied-assistant-state.ts | ||
| const PROXIED_ASSISTANT_STATE_SYMBOL = Symbol("assistant-ui.store.proxiedAssistantState"); | ||
| const isIgnoredKey = (key) => { | ||
| return key === "on" || key === "subscribe" || typeof key === "symbol"; | ||
| return key === "on" || key === "subscribe" || typeof key === "symbol"; | ||
| }; | ||
| /** | ||
| * Proxied state that lazily accesses scope states | ||
| */ | ||
| export const createProxiedAssistantState = (client) => { | ||
| class ProxiedAssistantStateProxyHandler extends BaseProxyHandler { | ||
| get(_, prop) { | ||
| const introspection = handleIntrospectionProp(prop, "AssistantState"); | ||
| if (introspection !== false) | ||
| return introspection; | ||
| const scope = prop; | ||
| if (isIgnoredKey(scope)) | ||
| return undefined; | ||
| return getClientState(client[scope]()); | ||
| } | ||
| ownKeys() { | ||
| return Object.keys(client).filter((key) => !isIgnoredKey(key)); | ||
| } | ||
| has(_, prop) { | ||
| return !isIgnoredKey(prop) && prop in client; | ||
| } | ||
| } | ||
| return new Proxy({}, new ProxiedAssistantStateProxyHandler()); | ||
| * Proxied state that lazily accesses scope states | ||
| */ | ||
| const createProxiedAssistantState = (client) => { | ||
| class ProxiedAssistantStateProxyHandler extends BaseProxyHandler { | ||
| get(_, prop) { | ||
| const introspection = handleIntrospectionProp(prop, "AssistantState"); | ||
| if (introspection !== false) return introspection; | ||
| const scope = prop; | ||
| if (isIgnoredKey(scope)) return void 0; | ||
| return getClientState(client[scope]()); | ||
| } | ||
| ownKeys() { | ||
| return Object.keys(client).filter((key) => !isIgnoredKey(key)); | ||
| } | ||
| has(_, prop) { | ||
| return !isIgnoredKey(prop) && prop in client; | ||
| } | ||
| } | ||
| return new Proxy({}, new ProxiedAssistantStateProxyHandler()); | ||
| }; | ||
| export const getProxiedAssistantState = (client) => { | ||
| return client[PROXIED_ASSISTANT_STATE_SYMBOL]; | ||
| const getProxiedAssistantState = (client) => { | ||
| return client[PROXIED_ASSISTANT_STATE_SYMBOL]; | ||
| }; | ||
| //#endregion | ||
| export { PROXIED_ASSISTANT_STATE_SYMBOL, createProxiedAssistantState, getProxiedAssistantState }; | ||
| //# sourceMappingURL=proxied-assistant-state.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"proxied-assistant-state.js","sourceRoot":"","sources":["../../src/utils/proxied-assistant-state.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AACb,OAAO,EAAE,cAAc,EAAE,gCAA6B;AAEtD,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,8BAA2B;AAE/E,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAClD,0CAA0C,CAC3C,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,GAAoB,EAA6B,EAAE;IACvE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC;AACxE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,MAAuB,EACP,EAAE;IAClB,MAAM,iCACJ,SAAQ,gBAAgB;QAGxB,GAAG,CAAC,CAAU,EAAE,IAAqB;YACnC,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACtE,IAAI,aAAa,KAAK,KAAK;gBAAE,OAAO,aAAa,CAAC;YAClD,MAAM,KAAK,GAAG,IAA6B,CAAC;YAC5C,IAAI,YAAY,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC1C,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO;YACL,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;QAED,GAAG,CAAC,CAAU,EAAE,IAAqB;YACnC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC;QAC/C,CAAC;KACF;IAED,OAAO,IAAI,KAAK,CACd,EAAoB,EACpB,IAAI,iCAAiC,EAAE,CACxC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAAuB,EACP,EAAE;IAClB,OACE,MACD,CAAC,8BAA8B,CAAC,CAAC;AACpC,CAAC,CAAC"} | ||
| {"version":3,"file":"proxied-assistant-state.js","names":[],"sources":["../../src/utils/proxied-assistant-state.ts"],"sourcesContent":["\"use client\";\nimport { getClientState } from \"../tapClientResource\";\nimport type { AssistantClient, AssistantState } from \"../types/client\";\nimport { BaseProxyHandler, handleIntrospectionProp } from \"./BaseProxyHandler\";\n\nexport const PROXIED_ASSISTANT_STATE_SYMBOL = Symbol(\n \"assistant-ui.store.proxiedAssistantState\",\n);\n\nconst isIgnoredKey = (key: string | symbol): key is \"on\" | \"subscribe\" => {\n return key === \"on\" || key === \"subscribe\" || typeof key === \"symbol\";\n};\n\n/**\n * Proxied state that lazily accesses scope states\n */\nexport const createProxiedAssistantState = (\n client: AssistantClient,\n): AssistantState => {\n class ProxiedAssistantStateProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<AssistantState>\n {\n get(_: unknown, prop: string | symbol) {\n const introspection = handleIntrospectionProp(prop, \"AssistantState\");\n if (introspection !== false) return introspection;\n const scope = prop as keyof AssistantClient;\n if (isIgnoredKey(scope)) return undefined;\n return getClientState(client[scope]());\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(client).filter((key) => !isIgnoredKey(key));\n }\n\n has(_: unknown, prop: string | symbol): boolean {\n return !isIgnoredKey(prop) && prop in client;\n }\n }\n\n return new Proxy<AssistantState>(\n {} as AssistantState,\n new ProxiedAssistantStateProxyHandler(),\n );\n};\n\nexport const getProxiedAssistantState = (\n client: AssistantClient,\n): AssistantState => {\n return (\n client as unknown as { [PROXIED_ASSISTANT_STATE_SYMBOL]: AssistantState }\n )[PROXIED_ASSISTANT_STATE_SYMBOL];\n};\n"],"mappings":";;;;AAKA,MAAa,iCAAiC,OAC5C,0CACF;AAEA,MAAM,gBAAgB,QAAoD;CACxE,OAAO,QAAQ,QAAQ,QAAQ,eAAe,OAAO,QAAQ;AAC/D;;;;AAKA,MAAa,+BACX,WACmB;CACnB,MAAM,0CACI,iBAEV;EACE,IAAI,GAAY,MAAuB;GACrC,MAAM,gBAAgB,wBAAwB,MAAM,gBAAgB;GACpE,IAAI,kBAAkB,OAAO,OAAO;GACpC,MAAM,QAAQ;GACd,IAAI,aAAa,KAAK,GAAG,OAAO,KAAA;GAChC,OAAO,eAAe,OAAO,OAAO,CAAC;EACvC;EAEA,UAAsC;GACpC,OAAO,OAAO,KAAK,MAAM,EAAE,QAAQ,QAAQ,CAAC,aAAa,GAAG,CAAC;EAC/D;EAEA,IAAI,GAAY,MAAgC;GAC9C,OAAO,CAAC,aAAa,IAAI,KAAK,QAAQ;EACxC;CACF;CAEA,OAAO,IAAI,MACT,CAAC,GACD,IAAI,kCAAkC,CACxC;AACF;AAEA,MAAa,4BACX,WACmB;CACnB,OACE,OACA;AACJ"} |
@@ -1,8 +0,10 @@ | ||
| import type React from "react"; | ||
| import type { AssistantClient } from "../types/client.js"; | ||
| import { AssistantClient } from "../types/client.js"; | ||
| import React from "react"; | ||
| //#region src/utils/react-assistant-context.d.ts | ||
| /** Default context value - throws "wrap in AuiProvider" error */ | ||
| export declare const DefaultAssistantClient: AssistantClient; | ||
| declare const DefaultAssistantClient: AssistantClient; | ||
| /** Root prototype for created clients - throws "scope not defined" error */ | ||
| export declare const createRootAssistantClient: () => AssistantClient; | ||
| export declare const useAssistantContextValue: () => AssistantClient; | ||
| declare const createRootAssistantClient: () => AssistantClient; | ||
| declare const useAssistantContextValue: () => AssistantClient; | ||
| /** | ||
@@ -29,8 +31,11 @@ * Supplies an `AssistantClient` to the React tree. | ||
| */ | ||
| export declare const AuiProvider: ({ value, children, }: { | ||
| /** Assistant client to expose to descendants. */ | ||
| value: AssistantClient; | ||
| /** Subtree that may read from the client. */ | ||
| children: React.ReactNode; | ||
| declare const AuiProvider: ({ | ||
| value, | ||
| children | ||
| }: { | ||
| /** Assistant client to expose to descendants. */value: AssistantClient; /** Subtree that may read from the client. */ | ||
| children: React.ReactNode; | ||
| }) => React.ReactElement; | ||
| //#endregion | ||
| export { AuiProvider, DefaultAssistantClient, createRootAssistantClient, useAssistantContextValue }; | ||
| //# sourceMappingURL=react-assistant-context.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"react-assistant-context.d.ts","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAA2B,2BAAwB;AAmDhF,iEAAiE;AACjE,eAAO,MAAM,sBAAsB,EAAE,eAIlC,CAAC;AAMJ,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,QAAO,eAUzC,CAAC;AAOL,eAAO,MAAM,wBAAwB,QAAO,eAE3C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,WAAW,GAAI,sBAGzB;IACD,iDAAiD;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,KAAG,KAAK,CAAC,YAMT,CAAC"} | ||
| {"version":3,"file":"react-assistant-context.d.ts","names":[],"sources":["../../src/utils/react-assistant-context.tsx"],"mappings":";;;;;cAsDa,sBAAA,EAAwB,eAIlC;AAJH;AAAA,cAWa,yBAAA,QAAgC,eAUzC;AAAA,cAOS,wBAAA,QAA+B,eAE3C;;AA1BE;AAOH;;;;AAUI;AAOJ;;;;AAEC;AAuBD;;;;;;;;;cAAa,WAAA;EAAe,KAAA;EAAA;AAAA;EAAA,iDAK1B,KAAA,EAAO,eAAA,EALmB;EAO1B,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,MACd,KAAA,CAAM,YAAA"} |
@@ -1,79 +0,81 @@ | ||
| import { jsx as _jsx } from "react/jsx-runtime"; | ||
| import { BaseProxyHandler, handleIntrospectionProp } from "./BaseProxyHandler.js"; | ||
| import { PROXIED_ASSISTANT_STATE_SYMBOL, createProxiedAssistantState } from "./proxied-assistant-state.js"; | ||
| import { createContext, useContext } from "react"; | ||
| import { createProxiedAssistantState, PROXIED_ASSISTANT_STATE_SYMBOL, } from "./proxied-assistant-state.js"; | ||
| import { BaseProxyHandler, handleIntrospectionProp } from "./BaseProxyHandler.js"; | ||
| const NO_OP_SUBSCRIBE = () => () => { }; | ||
| import { jsx } from "react/jsx-runtime"; | ||
| //#region src/utils/react-assistant-context.tsx | ||
| const NO_OP_SUBSCRIBE = () => () => {}; | ||
| const createErrorClientField = (message) => { | ||
| const fn = (() => { | ||
| throw new Error(message); | ||
| }); | ||
| fn.source = null; | ||
| fn.query = null; | ||
| return fn; | ||
| const fn = (() => { | ||
| throw new Error(message); | ||
| }); | ||
| fn.source = null; | ||
| fn.query = null; | ||
| return fn; | ||
| }; | ||
| class DefaultAssistantClientProxyHandler extends BaseProxyHandler { | ||
| get(_, prop) { | ||
| if (prop === "subscribe") | ||
| return NO_OP_SUBSCRIBE; | ||
| if (prop === "on") | ||
| return NO_OP_SUBSCRIBE; | ||
| if (prop === PROXIED_ASSISTANT_STATE_SYMBOL) | ||
| return DefaultAssistantClientProxiedAssistantState; | ||
| const introspection = handleIntrospectionProp(prop, "DefaultAssistantClient"); | ||
| if (introspection !== false) | ||
| return introspection; | ||
| return createErrorClientField("You are using a component or hook that requires an AuiProvider. Wrap your component in an <AuiProvider> component."); | ||
| } | ||
| ownKeys() { | ||
| return ["subscribe", "on", PROXIED_ASSISTANT_STATE_SYMBOL]; | ||
| } | ||
| has(_, prop) { | ||
| return (prop === "subscribe" || | ||
| prop === "on" || | ||
| prop === PROXIED_ASSISTANT_STATE_SYMBOL); | ||
| } | ||
| } | ||
| var DefaultAssistantClientProxyHandler = class extends BaseProxyHandler { | ||
| get(_, prop) { | ||
| if (prop === "subscribe") return NO_OP_SUBSCRIBE; | ||
| if (prop === "on") return NO_OP_SUBSCRIBE; | ||
| if (prop === PROXIED_ASSISTANT_STATE_SYMBOL) return DefaultAssistantClientProxiedAssistantState; | ||
| const introspection = handleIntrospectionProp(prop, "DefaultAssistantClient"); | ||
| if (introspection !== false) return introspection; | ||
| return createErrorClientField("You are using a component or hook that requires an AuiProvider. Wrap your component in an <AuiProvider> component."); | ||
| } | ||
| ownKeys() { | ||
| return [ | ||
| "subscribe", | ||
| "on", | ||
| PROXIED_ASSISTANT_STATE_SYMBOL | ||
| ]; | ||
| } | ||
| has(_, prop) { | ||
| return prop === "subscribe" || prop === "on" || prop === PROXIED_ASSISTANT_STATE_SYMBOL; | ||
| } | ||
| }; | ||
| /** Default context value - throws "wrap in AuiProvider" error */ | ||
| export const DefaultAssistantClient = new Proxy({}, new DefaultAssistantClientProxyHandler()); | ||
| const DefaultAssistantClient = new Proxy({}, new DefaultAssistantClientProxyHandler()); | ||
| const DefaultAssistantClientProxiedAssistantState = createProxiedAssistantState(DefaultAssistantClient); | ||
| /** Root prototype for created clients - throws "scope not defined" error */ | ||
| export const createRootAssistantClient = () => new Proxy({}, { | ||
| get(_, prop) { | ||
| const introspection = handleIntrospectionProp(prop, "AssistantClient"); | ||
| if (introspection !== false) | ||
| return introspection; | ||
| return createErrorClientField(`The current scope does not have a "${String(prop)}" property.`); | ||
| }, | ||
| }); | ||
| const createRootAssistantClient = () => new Proxy({}, { get(_, prop) { | ||
| const introspection = handleIntrospectionProp(prop, "AssistantClient"); | ||
| if (introspection !== false) return introspection; | ||
| return createErrorClientField(`The current scope does not have a "${String(prop)}" property.`); | ||
| } }); | ||
| /** | ||
| * React Context for the AssistantClient | ||
| */ | ||
| * React Context for the AssistantClient | ||
| */ | ||
| const AssistantContext = createContext(DefaultAssistantClient); | ||
| export const useAssistantContextValue = () => { | ||
| return useContext(AssistantContext); | ||
| const useAssistantContextValue = () => { | ||
| return useContext(AssistantContext); | ||
| }; | ||
| /** | ||
| * Supplies an `AssistantClient` to the React tree. | ||
| * | ||
| * Place near the root of any subtree that uses {@link useAui} or the | ||
| * primitives built on it. Components rendered outside an `AuiProvider` | ||
| * receive a default client whose scope accessors throw on use, so | ||
| * missing-provider mistakes surface at the point of use. | ||
| * | ||
| * When mounting a runtime built with one of the runtime hooks, use | ||
| * {@link AssistantRuntimeProvider} — it installs an `AuiProvider` | ||
| * internally — rather than wiring `AuiProvider` yourself. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * function ScopedAssistant({ children, scopes }) { | ||
| * const aui = useAui(scopes); | ||
| * | ||
| * return <AuiProvider value={aui}>{children}</AuiProvider>; | ||
| * } | ||
| * ``` | ||
| */ | ||
| export const AuiProvider = ({ value, children, }) => { | ||
| return (_jsx(AssistantContext.Provider, { value: value, children: children })); | ||
| * Supplies an `AssistantClient` to the React tree. | ||
| * | ||
| * Place near the root of any subtree that uses {@link useAui} or the | ||
| * primitives built on it. Components rendered outside an `AuiProvider` | ||
| * receive a default client whose scope accessors throw on use, so | ||
| * missing-provider mistakes surface at the point of use. | ||
| * | ||
| * When mounting a runtime built with one of the runtime hooks, use | ||
| * {@link AssistantRuntimeProvider} — it installs an `AuiProvider` | ||
| * internally — rather than wiring `AuiProvider` yourself. | ||
| * | ||
| * @example | ||
| * ```tsx | ||
| * function ScopedAssistant({ children, scopes }) { | ||
| * const aui = useAui(scopes); | ||
| * | ||
| * return <AuiProvider value={aui}>{children}</AuiProvider>; | ||
| * } | ||
| * ``` | ||
| */ | ||
| const AuiProvider = ({ value, children }) => { | ||
| return /* @__PURE__ */ jsx(AssistantContext.Provider, { | ||
| value, | ||
| children | ||
| }); | ||
| }; | ||
| //#endregion | ||
| export { AuiProvider, DefaultAssistantClient, createRootAssistantClient, useAssistantContextValue }; | ||
| //# sourceMappingURL=react-assistant-context.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"react-assistant-context.js","sourceRoot":"","sources":["../../src/utils/react-assistant-context.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,GAC/B,qCAAkC;AACnC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,8BAA2B;AAE/E,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;AAEvC,MAAM,sBAAsB,GAAG,CAC7B,OAAe,EACiB,EAAE;IAClC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;QACf,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CAAmC,CAAC;IACrC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;IACjB,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,kCACJ,SAAQ,gBAAgB;IAGxB,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,IAAI,IAAI,KAAK,WAAW;YAAE,OAAO,eAAe,CAAC;QACjD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,eAAe,CAAC;QAC1C,IAAI,IAAI,KAAK,8BAA8B;YACzC,OAAO,2CAA2C,CAAC;QACrD,MAAM,aAAa,GAAG,uBAAuB,CAC3C,IAAI,EACJ,wBAAwB,CACzB,CAAC;QACF,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAClD,OAAO,sBAAsB,CAC3B,oHAAoH,CACrH,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IAED,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,OAAO,CACL,IAAI,KAAK,WAAW;YACpB,IAAI,KAAK,IAAI;YACb,IAAI,KAAK,8BAA8B,CACxC,CAAC;IACJ,CAAC;CACF;AACD,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GACjC,IAAI,KAAK,CACP,EAAqB,EACrB,IAAI,kCAAkC,EAAE,CACzC,CAAC;AAEJ,MAAM,2CAA2C,GAAG,2BAA2B,CAC7E,sBAAsB,CACvB,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAoB,EAAE,CAC7D,IAAI,KAAK,CAAkB,EAAqB,EAAE;IAChD,GAAG,CAAC,CAAkB,EAAE,IAAqB;QAC3C,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACvE,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAElD,OAAO,sBAAsB,CAC3B,sCAAsC,MAAM,CAAC,IAAI,CAAC,aAAa,CAChE,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEL;;GAEG;AACH,MAAM,gBAAgB,GAAG,aAAa,CAAkB,sBAAsB,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAoB,EAAE;IAC5D,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,KAAK,EACL,QAAQ,GAMT,EAAsB,EAAE;IACvB,OAAO,CACL,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YACpC,QAAQ,GACiB,CAC7B,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"react-assistant-context.js","names":[],"sources":["../../src/utils/react-assistant-context.tsx"],"sourcesContent":["import type React from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { AssistantClient, AssistantClientAccessor } from \"../types/client\";\nimport {\n createProxiedAssistantState,\n PROXIED_ASSISTANT_STATE_SYMBOL,\n} from \"./proxied-assistant-state\";\nimport { BaseProxyHandler, handleIntrospectionProp } from \"./BaseProxyHandler\";\n\nconst NO_OP_SUBSCRIBE = () => () => {};\n\nconst createErrorClientField = (\n message: string,\n): AssistantClientAccessor<never> => {\n const fn = (() => {\n throw new Error(message);\n }) as AssistantClientAccessor<never>;\n fn.source = null;\n fn.query = null;\n return fn;\n};\n\nclass DefaultAssistantClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<AssistantClient>\n{\n get(_: unknown, prop: string | symbol) {\n if (prop === \"subscribe\") return NO_OP_SUBSCRIBE;\n if (prop === \"on\") return NO_OP_SUBSCRIBE;\n if (prop === PROXIED_ASSISTANT_STATE_SYMBOL)\n return DefaultAssistantClientProxiedAssistantState;\n const introspection = handleIntrospectionProp(\n prop,\n \"DefaultAssistantClient\",\n );\n if (introspection !== false) return introspection;\n return createErrorClientField(\n \"You are using a component or hook that requires an AuiProvider. Wrap your component in an <AuiProvider> component.\",\n );\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return [\"subscribe\", \"on\", PROXIED_ASSISTANT_STATE_SYMBOL];\n }\n\n has(_: unknown, prop: string | symbol): boolean {\n return (\n prop === \"subscribe\" ||\n prop === \"on\" ||\n prop === PROXIED_ASSISTANT_STATE_SYMBOL\n );\n }\n}\n/** Default context value - throws \"wrap in AuiProvider\" error */\nexport const DefaultAssistantClient: AssistantClient =\n new Proxy<AssistantClient>(\n {} as AssistantClient,\n new DefaultAssistantClientProxyHandler(),\n );\n\nconst DefaultAssistantClientProxiedAssistantState = createProxiedAssistantState(\n DefaultAssistantClient,\n);\n\n/** Root prototype for created clients - throws \"scope not defined\" error */\nexport const createRootAssistantClient = (): AssistantClient =>\n new Proxy<AssistantClient>({} as AssistantClient, {\n get(_: AssistantClient, prop: string | symbol) {\n const introspection = handleIntrospectionProp(prop, \"AssistantClient\");\n if (introspection !== false) return introspection;\n\n return createErrorClientField(\n `The current scope does not have a \"${String(prop)}\" property.`,\n );\n },\n });\n\n/**\n * React Context for the AssistantClient\n */\nconst AssistantContext = createContext<AssistantClient>(DefaultAssistantClient);\n\nexport const useAssistantContextValue = (): AssistantClient => {\n return useContext(AssistantContext);\n};\n\n/**\n * Supplies an `AssistantClient` to the React tree.\n *\n * Place near the root of any subtree that uses {@link useAui} or the\n * primitives built on it. Components rendered outside an `AuiProvider`\n * receive a default client whose scope accessors throw on use, so\n * missing-provider mistakes surface at the point of use.\n *\n * When mounting a runtime built with one of the runtime hooks, use\n * {@link AssistantRuntimeProvider} — it installs an `AuiProvider`\n * internally — rather than wiring `AuiProvider` yourself.\n *\n * @example\n * ```tsx\n * function ScopedAssistant({ children, scopes }) {\n * const aui = useAui(scopes);\n *\n * return <AuiProvider value={aui}>{children}</AuiProvider>;\n * }\n * ```\n */\nexport const AuiProvider = ({\n value,\n children,\n}: {\n /** Assistant client to expose to descendants. */\n value: AssistantClient;\n /** Subtree that may read from the client. */\n children: React.ReactNode;\n}): React.ReactElement => {\n return (\n <AssistantContext.Provider value={value}>\n {children}\n </AssistantContext.Provider>\n );\n};\n"],"mappings":";;;;;AASA,MAAM,8BAA8B,CAAC;AAErC,MAAM,0BACJ,YACmC;CACnC,MAAM,YAAY;EAChB,MAAM,IAAI,MAAM,OAAO;CACzB;CACA,GAAG,SAAS;CACZ,GAAG,QAAQ;CACX,OAAO;AACT;AAEA,IAAM,qCAAN,cACU,iBAEV;CACE,IAAI,GAAY,MAAuB;EACrC,IAAI,SAAS,aAAa,OAAO;EACjC,IAAI,SAAS,MAAM,OAAO;EAC1B,IAAI,SAAS,gCACX,OAAO;EACT,MAAM,gBAAgB,wBACpB,MACA,wBACF;EACA,IAAI,kBAAkB,OAAO,OAAO;EACpC,OAAO,uBACL,oHACF;CACF;CAEA,UAAsC;EACpC,OAAO;GAAC;GAAa;GAAM;EAA8B;CAC3D;CAEA,IAAI,GAAY,MAAgC;EAC9C,OACE,SAAS,eACT,SAAS,QACT,SAAS;CAEb;AACF;;AAEA,MAAa,yBACX,IAAI,MACF,CAAC,GACD,IAAI,mCAAmC,CACzC;AAEF,MAAM,8CAA8C,4BAClD,sBACF;;AAGA,MAAa,kCACX,IAAI,MAAuB,CAAC,GAAsB,EAChD,IAAI,GAAoB,MAAuB;CAC7C,MAAM,gBAAgB,wBAAwB,MAAM,iBAAiB;CACrE,IAAI,kBAAkB,OAAO,OAAO;CAEpC,OAAO,uBACL,sCAAsC,OAAO,IAAI,EAAE,YACrD;AACF,EACF,CAAC;;;;AAKH,MAAM,mBAAmB,cAA+B,sBAAsB;AAE9E,MAAa,iCAAkD;CAC7D,OAAO,WAAW,gBAAgB;AACpC;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,eAAe,EAC1B,OACA,eAMwB;CACxB,OACE,oBAAC,iBAAiB,UAAlB;EAAkC;EAC/B;CACwB,CAAA;AAE/B"} |
@@ -1,10 +0,14 @@ | ||
| import { type DerivedElement } from "../Derived.js"; | ||
| import type { AssistantClient, ClientElement, ClientNames } from "../types/client.js"; | ||
| import type { useAui } from "../useAui.js"; | ||
| export type RootClients = Partial<Record<ClientNames, ClientElement<ClientNames>>>; | ||
| export type DerivedClients = Partial<Record<ClientNames, DerivedElement<ClientNames>>>; | ||
| export declare const tapSplitClients: (clients: useAui.Props, baseClient: AssistantClient) => { | ||
| rootClients: Partial<Record<"ERROR: No clients were defined", ClientElement<"ERROR: No clients were defined">>>; | ||
| derivedClients: Partial<Record<"ERROR: No clients were defined", DerivedElement<"ERROR: No clients were defined">>>; | ||
| import { AssistantClient, ClientElement, ClientNames } from "../types/client.js"; | ||
| import { DerivedElement } from "../Derived.js"; | ||
| import { useAui } from "../useAui.js"; | ||
| //#region src/utils/splitClients.d.ts | ||
| type RootClients = Partial<Record<ClientNames, ClientElement<ClientNames>>>; | ||
| type DerivedClients = Partial<Record<ClientNames, DerivedElement<ClientNames>>>; | ||
| declare const tapSplitClients: (clients: useAui.Props, baseClient: AssistantClient) => { | ||
| rootClients: Partial<Record<"ERROR: No clients were defined", ClientElement<"ERROR: No clients were defined">>>; | ||
| derivedClients: Partial<Record<"ERROR: No clients were defined", DerivedElement<"ERROR: No clients were defined">>>; | ||
| }; | ||
| //#endregion | ||
| export { DerivedClients, RootClients, tapSplitClients }; | ||
| //# sourceMappingURL=splitClients.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"splitClients.d.ts","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,cAAc,EAAE,sBAAmB;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACZ,2BAAwB;AAEzB,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAkB;AAGxC,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAChD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CACjD,CAAC;AAwDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,KAAK,EACrB,YAAY,eAAe;;;CAQ5B,CAAC"} | ||
| {"version":3,"file":"splitClients.d.ts","names":[],"sources":["../../src/utils/splitClients.ts"],"mappings":";;;;;KAUY,WAAA,GAAc,OAAA,CACxB,MAAA,CAAO,WAAA,EAAa,aAAA,CAAc,WAAA;AAAA,KAExB,cAAA,GAAiB,OAAA,CAC3B,MAAA,CAAO,WAAA,EAAa,cAAA,CAAe,WAAA;AAAA,cAyDxB,eAAA,GACX,OAAA,EAAS,MAAA,CAAO,KAAA,EAChB,UAAA,EAAY,eAAA"} |
| import { Derived } from "../Derived.js"; | ||
| import { getTransformScopes } from "../attachTransformScopes.js"; | ||
| import { tapMemo } from "@assistant-ui/tap"; | ||
| //#region src/utils/splitClients.ts | ||
| /** | ||
| * Splits a clients object into root clients and derived clients, | ||
| * applying transformScopes from root client elements. | ||
| */ | ||
| * Splits a clients object into root clients and derived clients, | ||
| * applying transformScopes from root client elements. | ||
| */ | ||
| function splitClients(clients, baseClient) { | ||
| // 1. Collect transforms from root elements and run them iteratively | ||
| const scopes = { ...clients }; | ||
| const visited = new Set(); | ||
| let changed = true; | ||
| while (changed) { | ||
| changed = false; | ||
| for (const clientElement of Object.values(scopes)) { | ||
| if (clientElement.type === Derived) | ||
| continue; | ||
| if (visited.has(clientElement.type)) | ||
| continue; | ||
| visited.add(clientElement.type); | ||
| const transform = getTransformScopes(clientElement.type); | ||
| if (transform) { | ||
| transform(scopes, baseClient); | ||
| changed = true; | ||
| break; // restart iteration since scopes may have new root elements | ||
| } | ||
| } | ||
| } | ||
| // 2. Split result into root/derived | ||
| const rootClients = {}; | ||
| const derivedClients = {}; | ||
| for (const [key, clientElement] of Object.entries(scopes)) { | ||
| if (clientElement.type === Derived) { | ||
| derivedClients[key] = clientElement; | ||
| } | ||
| else { | ||
| rootClients[key] = clientElement; | ||
| } | ||
| } | ||
| return { rootClients, derivedClients }; | ||
| const scopes = { ...clients }; | ||
| const visited = /* @__PURE__ */ new Set(); | ||
| let changed = true; | ||
| while (changed) { | ||
| changed = false; | ||
| for (const clientElement of Object.values(scopes)) { | ||
| if (clientElement.type === Derived) continue; | ||
| if (visited.has(clientElement.type)) continue; | ||
| visited.add(clientElement.type); | ||
| const transform = getTransformScopes(clientElement.type); | ||
| if (transform) { | ||
| transform(scopes, baseClient); | ||
| changed = true; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| const rootClients = {}; | ||
| const derivedClients = {}; | ||
| for (const [key, clientElement] of Object.entries(scopes)) if (clientElement.type === Derived) derivedClients[key] = clientElement; | ||
| else rootClients[key] = clientElement; | ||
| return { | ||
| rootClients, | ||
| derivedClients | ||
| }; | ||
| } | ||
| const tapShallowMemoObject = (object) => { | ||
| // biome-ignore lint/correctness/useExhaustiveDependencies: shallow memo | ||
| return tapMemo(() => object, [...Object.entries(object).flat()]); | ||
| return tapMemo(() => object, [...Object.entries(object).flat()]); | ||
| }; | ||
| export const tapSplitClients = (clients, baseClient) => { | ||
| const { rootClients, derivedClients } = splitClients(clients, baseClient); | ||
| return { | ||
| rootClients: tapShallowMemoObject(rootClients), | ||
| derivedClients: tapShallowMemoObject(derivedClients), | ||
| }; | ||
| const tapSplitClients = (clients, baseClient) => { | ||
| const { rootClients, derivedClients } = splitClients(clients, baseClient); | ||
| return { | ||
| rootClients: tapShallowMemoObject(rootClients), | ||
| derivedClients: tapShallowMemoObject(derivedClients) | ||
| }; | ||
| }; | ||
| //#endregion | ||
| export { tapSplitClients }; | ||
| //# sourceMappingURL=splitClients.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"splitClients.js","sourceRoot":"","sources":["../../src/utils/splitClients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAuB,sBAAmB;AAM1D,OAAO,EAAE,kBAAkB,EAAE,oCAAiC;AAE9D,OAAO,EAAE,OAAO,EAAwB,MAAM,mBAAmB,CAAC;AASlE;;;GAGG;AACH,SAAS,YAAY,CAAC,OAAqB,EAAE,UAA2B;IACtE,oEAAoE;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAG1B,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEnD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,OAAO,OAAO,EAAE,CAAC;QACf,OAAO,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB;gBAAE,SAAS;YAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAEhC,MAAM,SAAS,GAAG,kBAAkB,CAClC,aAAa,CAAC,IAA4C,CAC3D,CAAC;YACF,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC9B,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,4DAA4D;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,MAAM,WAAW,GAAgB,EAAE,CAAC;IACpC,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAGrD,EAAE,CAAC;QACJ,IAAI,aAAa,CAAC,IAAI,KAAM,OAAmB,EAAE,CAAC;YAChD,cAAc,CAAC,GAAG,CAAC,GAAG,aAA4C,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,GAAG,aAA2C,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,oBAAoB,GAAG,CAAmB,MAAS,EAAE,EAAE;IAC3D,wEAAwE;IACxE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAqB,EACrB,UAA2B,EAC3B,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAE1E,OAAO;QACL,WAAW,EAAE,oBAAoB,CAAC,WAAW,CAAC;QAC9C,cAAc,EAAE,oBAAoB,CAAC,cAAc,CAAC;KACrD,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"splitClients.js","names":[],"sources":["../../src/utils/splitClients.ts"],"sourcesContent":["import { Derived, type DerivedElement } from \"../Derived\";\nimport type {\n AssistantClient,\n ClientElement,\n ClientNames,\n} from \"../types/client\";\nimport { getTransformScopes } from \"../attachTransformScopes\";\nimport type { useAui } from \"../useAui\";\nimport { tapMemo, type ResourceElement } from \"@assistant-ui/tap\";\n\nexport type RootClients = Partial<\n Record<ClientNames, ClientElement<ClientNames>>\n>;\nexport type DerivedClients = Partial<\n Record<ClientNames, DerivedElement<ClientNames>>\n>;\n\n/**\n * Splits a clients object into root clients and derived clients,\n * applying transformScopes from root client elements.\n */\nfunction splitClients(clients: useAui.Props, baseClient: AssistantClient) {\n // 1. Collect transforms from root elements and run them iteratively\n const scopes = { ...clients } as Record<\n string,\n ClientElement<ClientNames> | DerivedElement<ClientNames>\n >;\n const visited = new Set<(...args: any[]) => any>();\n\n let changed = true;\n while (changed) {\n changed = false;\n for (const clientElement of Object.values(scopes)) {\n if (clientElement.type === (Derived as unknown)) continue;\n if (visited.has(clientElement.type)) continue;\n visited.add(clientElement.type);\n\n const transform = getTransformScopes(\n clientElement.type as (props: any) => ResourceElement<any>,\n );\n if (transform) {\n transform(scopes, baseClient);\n changed = true;\n break; // restart iteration since scopes may have new root elements\n }\n }\n }\n\n // 2. Split result into root/derived\n const rootClients: RootClients = {};\n const derivedClients: DerivedClients = {};\n\n for (const [key, clientElement] of Object.entries(scopes) as [\n ClientNames,\n ClientElement<ClientNames> | DerivedElement<ClientNames>,\n ][]) {\n if (clientElement.type === (Derived as unknown)) {\n derivedClients[key] = clientElement as DerivedElement<ClientNames>;\n } else {\n rootClients[key] = clientElement as ClientElement<ClientNames>;\n }\n }\n\n return { rootClients, derivedClients };\n}\n\nconst tapShallowMemoObject = <T extends object>(object: T) => {\n // biome-ignore lint/correctness/useExhaustiveDependencies: shallow memo\n return tapMemo(() => object, [...Object.entries(object).flat()]);\n};\n\nexport const tapSplitClients = (\n clients: useAui.Props,\n baseClient: AssistantClient,\n) => {\n const { rootClients, derivedClients } = splitClients(clients, baseClient);\n\n return {\n rootClients: tapShallowMemoObject(rootClients),\n derivedClients: tapShallowMemoObject(derivedClients),\n };\n};\n"],"mappings":";;;;;;;;AAqBA,SAAS,aAAa,SAAuB,YAA6B;CAExE,MAAM,SAAS,EAAE,GAAG,QAAQ;CAI5B,MAAM,0BAAU,IAAI,IAA6B;CAEjD,IAAI,UAAU;CACd,OAAO,SAAS;EACd,UAAU;EACV,KAAK,MAAM,iBAAiB,OAAO,OAAO,MAAM,GAAG;GACjD,IAAI,cAAc,SAAU,SAAqB;GACjD,IAAI,QAAQ,IAAI,cAAc,IAAI,GAAG;GACrC,QAAQ,IAAI,cAAc,IAAI;GAE9B,MAAM,YAAY,mBAChB,cAAc,IAChB;GACA,IAAI,WAAW;IACb,UAAU,QAAQ,UAAU;IAC5B,UAAU;IACV;GACF;EACF;CACF;CAGA,MAAM,cAA2B,CAAC;CAClC,MAAM,iBAAiC,CAAC;CAExC,KAAK,MAAM,CAAC,KAAK,kBAAkB,OAAO,QAAQ,MAAM,GAItD,IAAI,cAAc,SAAU,SAC1B,eAAe,OAAO;MAEtB,YAAY,OAAO;CAIvB,OAAO;EAAE;EAAa;CAAe;AACvC;AAEA,MAAM,wBAA0C,WAAc;CAE5D,OAAO,cAAc,QAAQ,CAAC,GAAG,OAAO,QAAQ,MAAM,EAAE,KAAK,CAAC,CAAC;AACjE;AAEA,MAAa,mBACX,SACA,eACG;CACH,MAAM,EAAE,aAAa,mBAAmB,aAAa,SAAS,UAAU;CAExE,OAAO;EACL,aAAa,qBAAqB,WAAW;EAC7C,gBAAgB,qBAAqB,cAAc;CACrD;AACF"} |
@@ -1,19 +0,22 @@ | ||
| import type { AssistantEventName, AssistantEventPayload } from "../types/events.js"; | ||
| import type { AssistantClient } from "../types/client.js"; | ||
| import { type ClientStack } from "./tap-client-stack-context.js"; | ||
| import { AssistantEventName, AssistantEventPayload } from "../types/events.js"; | ||
| import { AssistantClient } from "../types/client.js"; | ||
| import { ClientStack } from "./tap-client-stack-context.js"; | ||
| //#region src/utils/tap-assistant-context.d.ts | ||
| type EmitFn = <TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent], clientStack: ClientStack) => void; | ||
| export type AssistantTapContextValue = { | ||
| clientRef: { | ||
| parent: AssistantClient; | ||
| current: AssistantClient | null; | ||
| }; | ||
| emit: EmitFn; | ||
| }; | ||
| export declare const withAssistantTapContextProvider: <TResult>(value: AssistantTapContextValue, fn: () => TResult) => TResult; | ||
| export declare const tapAssistantClientRef: () => { | ||
| type AssistantTapContextValue = { | ||
| clientRef: { | ||
| parent: AssistantClient; | ||
| current: AssistantClient | null; | ||
| }; | ||
| emit: EmitFn; | ||
| }; | ||
| export declare const tapAssistantEmit: () => <TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent]) => void; | ||
| export {}; | ||
| declare const withAssistantTapContextProvider: <TResult>(value: AssistantTapContextValue, fn: () => TResult) => TResult; | ||
| declare const tapAssistantClientRef: () => { | ||
| parent: AssistantClient; | ||
| current: AssistantClient | null; | ||
| }; | ||
| declare const tapAssistantEmit: () => <TEvent extends Exclude<AssistantEventName, "*">>(event: TEvent, payload: AssistantEventPayload[TEvent]) => void; | ||
| //#endregion | ||
| export { AssistantTapContextValue, tapAssistantClientRef, tapAssistantEmit, withAssistantTapContextProvider }; | ||
| //# sourceMappingURL=tap-assistant-context.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tap-assistant-context.d.ts","sourceRoot":"","sources":["../../src/utils/tap-assistant-context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACtB,2BAAwB;AACzB,OAAO,KAAK,EAAE,eAAe,EAAE,2BAAwB;AACvD,OAAO,EAAkB,KAAK,WAAW,EAAE,sCAAmC;AAE9E,KAAK,MAAM,GAAG,CAAC,MAAM,SAAS,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAC5D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,WAAW,KACrB,IAAI,CAAC;AAEV,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE;QAAE,MAAM,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;KAAE,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAKF,eAAO,MAAM,+BAA+B,GAAI,OAAO,EACrD,OAAO,wBAAwB,EAC/B,IAAI,MAAM,OAAO,YAGlB,CAAC;AASF,eAAO,MAAM,qBAAqB;YArBX,eAAe;aAAW,eAAe,GAAG,IAAI;CAuBtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,SAKxB,MAAM,SAAS,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,SACvC,MAAM,WACJ,qBAAqB,CAAC,MAAM,CAAC,SAK3C,CAAC"} | ||
| {"version":3,"file":"tap-assistant-context.d.ts","names":[],"sources":["../../src/utils/tap-assistant-context.ts"],"mappings":";;;;;KAaK,MAAA,mBAAyB,OAAA,CAAQ,kBAAA,QACpC,KAAA,EAAO,MAAA,EACP,OAAA,EAAS,qBAAA,CAAsB,MAAA,GAC/B,WAAA,EAAa,WAAA;AAAA,KAGH,wBAAA;EACV,SAAA;IAAa,MAAA,EAAQ,eAAA;IAAiB,OAAA,EAAS,eAAA;EAAA;EAC/C,IAAA,EAAM,MAAA;AAAA;AAAA,cAMK,+BAAA,YACX,KAAA,EAAO,wBAAA,EACP,EAAA,QAAU,OAAA,KAAO,OAAA;AAAA,cAYN,qBAAA;UArBU,eAAA;WAA0B,eAAe;AAAA;AAAA,cAyBnD,gBAAA,wBAKO,OAAA,CAAQ,kBAAA,QAAwB,KAAA,EACvC,MAAA,EAAM,OAAA,EACJ,qBAAA,CAAsB,MAAA"} |
@@ -1,23 +0,26 @@ | ||
| import { createResourceContext, tap, withContextProvider, tapEffectEvent, } from "@assistant-ui/tap"; | ||
| import { tapClientStack } from "./tap-client-stack-context.js"; | ||
| import { createResourceContext, tap, tapEffectEvent, withContextProvider } from "@assistant-ui/tap"; | ||
| //#region src/utils/tap-assistant-context.ts | ||
| const AssistantTapContext = createResourceContext(null); | ||
| export const withAssistantTapContextProvider = (value, fn) => { | ||
| return withContextProvider(AssistantTapContext, value, fn); | ||
| const withAssistantTapContextProvider = (value, fn) => { | ||
| return withContextProvider(AssistantTapContext, value, fn); | ||
| }; | ||
| const tapAssistantTapContext = () => { | ||
| const ctx = tap(AssistantTapContext); | ||
| if (!ctx) | ||
| throw new Error("AssistantTapContext is not available"); | ||
| return ctx; | ||
| const ctx = tap(AssistantTapContext); | ||
| if (!ctx) throw new Error("AssistantTapContext is not available"); | ||
| return ctx; | ||
| }; | ||
| export const tapAssistantClientRef = () => { | ||
| return tapAssistantTapContext().clientRef; | ||
| const tapAssistantClientRef = () => { | ||
| return tapAssistantTapContext().clientRef; | ||
| }; | ||
| export const tapAssistantEmit = () => { | ||
| const { emit } = tapAssistantTapContext(); | ||
| const clientStack = tapClientStack(); | ||
| return tapEffectEvent((event, payload) => { | ||
| emit(event, payload, clientStack); | ||
| }); | ||
| const tapAssistantEmit = () => { | ||
| const { emit } = tapAssistantTapContext(); | ||
| const clientStack = tapClientStack(); | ||
| return tapEffectEvent((event, payload) => { | ||
| emit(event, payload, clientStack); | ||
| }); | ||
| }; | ||
| //#endregion | ||
| export { tapAssistantClientRef, tapAssistantEmit, withAssistantTapContextProvider }; | ||
| //# sourceMappingURL=tap-assistant-context.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tap-assistant-context.js","sourceRoot":"","sources":["../../src/utils/tap-assistant-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,GAAG,EACH,mBAAmB,EACnB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,cAAc,EAAoB,sCAAmC;AAa9E,MAAM,mBAAmB,GACvB,qBAAqB,CAAkC,IAAI,CAAC,CAAC;AAE/D,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAC7C,KAA+B,EAC/B,EAAiB,EACjB,EAAE;IACF,OAAO,mBAAmB,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,GAAG,EAAE;IAClC,MAAM,GAAG,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAElE,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACxC,OAAO,sBAAsB,EAAE,CAAC,SAAS,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,MAAM,EAAE,IAAI,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAC1C,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,OAAO,cAAc,CACnB,CACE,KAAa,EACb,OAAsC,EACtC,EAAE;QACF,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"tap-assistant-context.js","names":[],"sources":["../../src/utils/tap-assistant-context.ts"],"sourcesContent":["import {\n createResourceContext,\n tap,\n withContextProvider,\n tapEffectEvent,\n} from \"@assistant-ui/tap\";\nimport type {\n AssistantEventName,\n AssistantEventPayload,\n} from \"../types/events\";\nimport type { AssistantClient } from \"../types/client\";\nimport { tapClientStack, type ClientStack } from \"./tap-client-stack-context\";\n\ntype EmitFn = <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n clientStack: ClientStack,\n) => void;\n\nexport type AssistantTapContextValue = {\n clientRef: { parent: AssistantClient; current: AssistantClient | null };\n emit: EmitFn;\n};\n\nconst AssistantTapContext =\n createResourceContext<AssistantTapContextValue | null>(null);\n\nexport const withAssistantTapContextProvider = <TResult>(\n value: AssistantTapContextValue,\n fn: () => TResult,\n) => {\n return withContextProvider(AssistantTapContext, value, fn);\n};\n\nconst tapAssistantTapContext = () => {\n const ctx = tap(AssistantTapContext);\n if (!ctx) throw new Error(\"AssistantTapContext is not available\");\n\n return ctx;\n};\n\nexport const tapAssistantClientRef = () => {\n return tapAssistantTapContext().clientRef;\n};\n\nexport const tapAssistantEmit = () => {\n const { emit } = tapAssistantTapContext();\n const clientStack = tapClientStack();\n\n return tapEffectEvent(\n <TEvent extends Exclude<AssistantEventName, \"*\">>(\n event: TEvent,\n payload: AssistantEventPayload[TEvent],\n ) => {\n emit(event, payload, clientStack);\n },\n );\n};\n"],"mappings":";;;AAwBA,MAAM,sBACJ,sBAAuD,IAAI;AAE7D,MAAa,mCACX,OACA,OACG;CACH,OAAO,oBAAoB,qBAAqB,OAAO,EAAE;AAC3D;AAEA,MAAM,+BAA+B;CACnC,MAAM,MAAM,IAAI,mBAAmB;CACnC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,sCAAsC;CAEhE,OAAO;AACT;AAEA,MAAa,8BAA8B;CACzC,OAAO,uBAAuB,EAAE;AAClC;AAEA,MAAa,yBAAyB;CACpC,MAAM,EAAE,SAAS,uBAAuB;CACxC,MAAM,cAAc,eAAe;CAEnC,OAAO,gBAEH,OACA,YACG;EACH,KAAK,OAAO,SAAS,WAAW;CAClC,CACF;AACF"} |
@@ -1,18 +0,20 @@ | ||
| import type { ClientMethods } from "../types/client.js"; | ||
| import { ClientMethods } from "../types/client.js"; | ||
| //#region src/utils/tap-client-stack-context.d.ts | ||
| /** | ||
| * Symbol used to get the client index from a ClientProxy. | ||
| */ | ||
| export declare const SYMBOL_CLIENT_INDEX: unique symbol; | ||
| declare const SYMBOL_CLIENT_INDEX: unique symbol; | ||
| /** | ||
| * Get the index of a client (its position in the client stack when created). | ||
| */ | ||
| export declare const getClientIndex: (client: ClientMethods) => number; | ||
| declare const getClientIndex: (client: ClientMethods) => number; | ||
| /** | ||
| * The client stack - an array of clients representing the current hierarchy. | ||
| */ | ||
| export type ClientStack = readonly ClientMethods[]; | ||
| type ClientStack = readonly ClientMethods[]; | ||
| /** | ||
| * Get the current client stack inside a tap resource. | ||
| */ | ||
| export declare const tapClientStack: () => ClientStack; | ||
| declare const tapClientStack: () => ClientStack; | ||
| /** | ||
@@ -22,3 +24,5 @@ * Execute a callback with a client pushed onto the stack. | ||
| */ | ||
| export declare const tapWithClientStack: <T>(client: ClientMethods, callback: () => T) => T; | ||
| declare const tapWithClientStack: <T>(client: ClientMethods, callback: () => T) => T; | ||
| //#endregion | ||
| export { ClientStack, SYMBOL_CLIENT_INDEX, getClientIndex, tapClientStack, tapWithClientStack }; | ||
| //# sourceMappingURL=tap-client-stack-context.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tap-client-stack-context.d.ts","sourceRoot":"","sources":["../../src/utils/tap-client-stack-context.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,2BAAwB;AAErD;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAA2C,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,KAAG,MAItD,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,SAAS,aAAa,EAAE,CAAC;AAInD;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,WAEjC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,EAClC,QAAQ,aAAa,EACrB,UAAU,MAAM,CAAC,KAChB,CAOF,CAAC"} | ||
| {"version":3,"file":"tap-client-stack-context.d.ts","names":[],"sources":["../../src/utils/tap-client-stack-context.ts"],"mappings":";;;;;AAWA;cAAa,mBAAA;;;AAA8D;cAK9D,cAAA,GAAkB,MAAqB,EAAb,aAAa;;;;KASxC,WAAA,YAAuB,aAAa;AAAhD;;;AAAA,cAOa,cAAA,QAAqB,WAEjC;AAT+C;AAOhD;;;AAPgD,cAenC,kBAAA,MACX,MAAA,EAAQ,aAAA,EACR,QAAA,QAAgB,CAAA,KACf,CAAA"} |
@@ -1,28 +0,31 @@ | ||
| import { createResourceContext, tap, withContextProvider, tapMemo, } from "@assistant-ui/tap"; | ||
| import { createResourceContext, tap, tapMemo, withContextProvider } from "@assistant-ui/tap"; | ||
| //#region src/utils/tap-client-stack-context.ts | ||
| /** | ||
| * Symbol used to get the client index from a ClientProxy. | ||
| */ | ||
| export const SYMBOL_CLIENT_INDEX = Symbol("assistant-ui.store.clientIndex"); | ||
| * Symbol used to get the client index from a ClientProxy. | ||
| */ | ||
| const SYMBOL_CLIENT_INDEX = Symbol("assistant-ui.store.clientIndex"); | ||
| /** | ||
| * Get the index of a client (its position in the client stack when created). | ||
| */ | ||
| export const getClientIndex = (client) => { | ||
| return client[SYMBOL_CLIENT_INDEX]; | ||
| * Get the index of a client (its position in the client stack when created). | ||
| */ | ||
| const getClientIndex = (client) => { | ||
| return client[SYMBOL_CLIENT_INDEX]; | ||
| }; | ||
| const ClientStackContext = createResourceContext([]); | ||
| /** | ||
| * Get the current client stack inside a tap resource. | ||
| */ | ||
| export const tapClientStack = () => { | ||
| return tap(ClientStackContext); | ||
| * Get the current client stack inside a tap resource. | ||
| */ | ||
| const tapClientStack = () => { | ||
| return tap(ClientStackContext); | ||
| }; | ||
| /** | ||
| * Execute a callback with a client pushed onto the stack. | ||
| * The stack is duplicated, not mutated. | ||
| */ | ||
| export const tapWithClientStack = (client, callback) => { | ||
| const currentStack = tapClientStack(); | ||
| const newStack = tapMemo(() => [...currentStack, client], [currentStack, client]); | ||
| return withContextProvider(ClientStackContext, newStack, callback); | ||
| * Execute a callback with a client pushed onto the stack. | ||
| * The stack is duplicated, not mutated. | ||
| */ | ||
| const tapWithClientStack = (client, callback) => { | ||
| const currentStack = tapClientStack(); | ||
| return withContextProvider(ClientStackContext, tapMemo(() => [...currentStack, client], [currentStack, client]), callback); | ||
| }; | ||
| //#endregion | ||
| export { SYMBOL_CLIENT_INDEX, getClientIndex, tapClientStack, tapWithClientStack }; | ||
| //# sourceMappingURL=tap-client-stack-context.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"tap-client-stack-context.js","sourceRoot":"","sources":["../../src/utils/tap-client-stack-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,GAAG,EACH,mBAAmB,EACnB,OAAO,GACR,MAAM,mBAAmB,CAAC;AAG3B;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAqB,EAAU,EAAE;IAC9D,OAAQ,MAAuD,CAC7D,mBAAmB,CACpB,CAAC;AACJ,CAAC,CAAC;AAOF,MAAM,kBAAkB,GAAG,qBAAqB,CAAc,EAAE,CAAC,CAAC;AAElE;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAgB,EAAE;IAC9C,OAAO,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,MAAqB,EACrB,QAAiB,EACd,EAAE;IACL,MAAM,YAAY,GAAG,cAAc,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,CAAC,GAAG,YAAY,EAAE,MAAM,CAAC,EAC/B,CAAC,YAAY,EAAE,MAAM,CAAC,CACvB,CAAC;IACF,OAAO,mBAAmB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACrE,CAAC,CAAC"} | ||
| {"version":3,"file":"tap-client-stack-context.js","names":[],"sources":["../../src/utils/tap-client-stack-context.ts"],"sourcesContent":["import {\n createResourceContext,\n tap,\n withContextProvider,\n tapMemo,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"../types/client\";\n\n/**\n * Symbol used to get the client index from a ClientProxy.\n */\nexport const SYMBOL_CLIENT_INDEX = Symbol(\"assistant-ui.store.clientIndex\");\n\n/**\n * Get the index of a client (its position in the client stack when created).\n */\nexport const getClientIndex = (client: ClientMethods): number => {\n return (client as unknown as { [SYMBOL_CLIENT_INDEX]: number })[\n SYMBOL_CLIENT_INDEX\n ];\n};\n\n/**\n * The client stack - an array of clients representing the current hierarchy.\n */\nexport type ClientStack = readonly ClientMethods[];\n\nconst ClientStackContext = createResourceContext<ClientStack>([]);\n\n/**\n * Get the current client stack inside a tap resource.\n */\nexport const tapClientStack = (): ClientStack => {\n return tap(ClientStackContext);\n};\n\n/**\n * Execute a callback with a client pushed onto the stack.\n * The stack is duplicated, not mutated.\n */\nexport const tapWithClientStack = <T>(\n client: ClientMethods,\n callback: () => T,\n): T => {\n const currentStack = tapClientStack();\n const newStack = tapMemo(\n () => [...currentStack, client],\n [currentStack, client],\n );\n return withContextProvider(ClientStackContext, newStack, callback);\n};\n"],"mappings":";;;;;AAWA,MAAa,sBAAsB,OAAO,gCAAgC;;;;AAK1E,MAAa,kBAAkB,WAAkC;CAC/D,OAAQ,OACN;AAEJ;AAOA,MAAM,qBAAqB,sBAAmC,CAAC,CAAC;;;;AAKhE,MAAa,uBAAoC;CAC/C,OAAO,IAAI,kBAAkB;AAC/B;;;;;AAMA,MAAa,sBACX,QACA,aACM;CACN,MAAM,eAAe,eAAe;CAKpC,OAAO,oBAAoB,oBAJV,cACT,CAAC,GAAG,cAAc,MAAM,GAC9B,CAAC,cAAc,MAAM,CAE+B,GAAG,QAAQ;AACnE"} |
@@ -1,3 +0,7 @@ | ||
| import { type ResourceElement, type Resource } from "@assistant-ui/tap"; | ||
| export declare const wrapperResource: <R, P>(fn: (props: ResourceElement<P>) => R) => Resource<R, ResourceElement<P>>; | ||
| import { Resource, ResourceElement } from "@assistant-ui/tap"; | ||
| //#region src/wrapperResource.d.ts | ||
| declare const wrapperResource: <R, P>(fn: (props: ResourceElement<P>) => R) => Resource<R, ResourceElement<P>>; | ||
| //#endregion | ||
| export { wrapperResource }; | ||
| //# sourceMappingURL=wrapperResource.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"wrapperResource.d.ts","sourceRoot":"","sources":["../src/wrapperResource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,QAAQ,EAGd,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,CAAC,EAClC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,KACnC,QAAQ,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAOhC,CAAC"} | ||
| {"version":3,"file":"wrapperResource.d.ts","names":[],"sources":["../src/wrapperResource.ts"],"mappings":";;;cAOa,eAAA,SACX,EAAA,GAAK,KAAA,EAAO,eAAA,CAAgB,CAAA,MAAO,CAAA,KAClC,QAAA,CAAS,CAAA,EAAG,eAAA,CAAgB,CAAA"} |
@@ -1,11 +0,14 @@ | ||
| import { resource, withKey, } from "@assistant-ui/tap"; | ||
| export const wrapperResource = (fn) => { | ||
| const res = resource(fn); | ||
| return (props) => { | ||
| const el = res(props); | ||
| if (props.key === undefined) | ||
| return el; | ||
| return withKey(props.key, el); | ||
| }; | ||
| import { resource, withKey } from "@assistant-ui/tap"; | ||
| //#region src/wrapperResource.ts | ||
| const wrapperResource = (fn) => { | ||
| const res = resource(fn); | ||
| return (props) => { | ||
| const el = res(props); | ||
| if (props.key === void 0) return el; | ||
| return withKey(props.key, el); | ||
| }; | ||
| }; | ||
| //#endregion | ||
| export { wrapperResource }; | ||
| //# sourceMappingURL=wrapperResource.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"wrapperResource.js","sourceRoot":"","sources":["../src/wrapperResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,OAAO,GACR,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,EAAoC,EACH,EAAE;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,CAAC,KAAyB,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC,CAAC"} | ||
| {"version":3,"file":"wrapperResource.js","names":[],"sources":["../src/wrapperResource.ts"],"sourcesContent":["import {\n type ResourceElement,\n type Resource,\n resource,\n withKey,\n} from \"@assistant-ui/tap\";\n\nexport const wrapperResource = <R, P>(\n fn: (props: ResourceElement<P>) => R,\n): Resource<R, ResourceElement<P>> => {\n const res = resource(fn);\n return (props: ResourceElement<P>) => {\n const el = res(props);\n if (props.key === undefined) return el;\n return withKey(props.key, el);\n };\n};\n"],"mappings":";;AAOA,MAAa,mBACX,OACoC;CACpC,MAAM,MAAM,SAAS,EAAE;CACvB,QAAQ,UAA8B;EACpC,MAAM,KAAK,IAAI,KAAK;EACpB,IAAI,MAAM,QAAQ,KAAA,GAAW,OAAO;EACpC,OAAO,QAAQ,MAAM,KAAK,EAAE;CAC9B;AACF"} |
+7
-7
| { | ||
| "name": "@assistant-ui/store", | ||
| "version": "0.2.11", | ||
| "version": "0.2.12", | ||
| "description": "Tap-based state management for @assistant-ui", | ||
@@ -33,3 +33,3 @@ "keywords": [ | ||
| "peerDependencies": { | ||
| "@assistant-ui/tap": "^0.5.11", | ||
| "@assistant-ui/tap": "^0.5.12", | ||
| "@types/react": "*", | ||
@@ -45,9 +45,9 @@ "react": "^18 || ^19" | ||
| "@testing-library/react": "^16.3.2", | ||
| "@types/react": "^19.2.14", | ||
| "@types/react": "^19.2.15", | ||
| "@types/react-dom": "^19.2.3", | ||
| "jsdom": "^29.1.1", | ||
| "react": "^19.2.5", | ||
| "vitest": "^4.1.5", | ||
| "@assistant-ui/tap": "0.5.11", | ||
| "@assistant-ui/x-buildutils": "0.0.8" | ||
| "react": "^19.2.6", | ||
| "vitest": "^4.1.7", | ||
| "@assistant-ui/tap": "0.5.12", | ||
| "@assistant-ui/x-buildutils": "0.0.9" | ||
| }, | ||
@@ -54,0 +54,0 @@ "publishConfig": { |
@@ -18,3 +18,3 @@ import type { ResourceElement } from "@assistant-ui/tap"; | ||
| /** | ||
| * Schema of a client in the assistant system (internal type). | ||
| * Schema of a client in the assistant system. | ||
| * @template TState - The state type for this client | ||
@@ -24,3 +24,2 @@ * @template TMethods - The methods available on this client | ||
| * @template TEvents - Events that this client can emit (optional) | ||
| * @internal | ||
| */ | ||
@@ -27,0 +26,0 @@ export type ClientSchema< |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,0BAA0B,EAAE,wCAAqC;AAG1E,OAAO,EAAE,KAAK,EAAE,mBAAgB;AAChC,OAAO,EAAE,WAAW,EAAE,2CAAwC;AAG9D,OAAO,EAAE,OAAO,EAAE,qBAAkB;AACpC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,mCAAgC;AACjC,YAAY,EAAE,YAAY,EAAE,mCAAgC;AAG5D,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,yCAAsC;AACvC,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AACpD,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAGhD,YAAY,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,uBAAuB,EACvB,eAAe,EACf,cAAc,GACf,0BAAuB;AACxB,OAAO,EACL,sBAAsB,EACtB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,0BAAuB"} |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,MAAM,EAAE,oBAAiB;AAClC,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,0BAA0B,EAAE,wCAAqC;AAE1E,aAAa;AACb,OAAO,EAAE,KAAK,EAAE,mBAAgB;AAChC,OAAO,EAAE,WAAW,EAAE,2CAAwC;AAE9D,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,qBAAkB;AACpC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,mCAAgC;AAGjC,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,yCAAsC;AACvC,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AACpD,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAiBhD,OAAO,EACL,sBAAsB,GAMvB,0BAAuB"} |
| {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/types/client.ts"],"names":[],"mappings":""} |
214902
15.3%3722
0.46%107
-2.73%