@assistant-ui/store 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/AssistantContext.js +1 -0
  2. package/dist/AssistantContext.js.map +1 -1
  3. package/dist/AssistantIf.d.ts +12 -0
  4. package/dist/AssistantIf.d.ts.map +1 -0
  5. package/dist/AssistantIf.js +16 -0
  6. package/dist/AssistantIf.js.map +1 -0
  7. package/dist/DerivedScope.d.ts +8 -6
  8. package/dist/DerivedScope.d.ts.map +1 -1
  9. package/dist/DerivedScope.js +2 -2
  10. package/dist/DerivedScope.js.map +1 -1
  11. package/dist/EventContext.d.ts +61 -0
  12. package/dist/EventContext.d.ts.map +1 -0
  13. package/dist/EventContext.js +62 -0
  14. package/dist/EventContext.js.map +1 -0
  15. package/dist/StoreContext.d.ts +9 -0
  16. package/dist/StoreContext.d.ts.map +1 -0
  17. package/dist/StoreContext.js +20 -0
  18. package/dist/StoreContext.js.map +1 -0
  19. package/dist/index.d.ts +7 -6
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +6 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/types.d.ts +21 -23
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/useAssistantClient.d.ts +10 -2
  26. package/dist/useAssistantClient.d.ts.map +1 -1
  27. package/dist/useAssistantClient.js +82 -48
  28. package/dist/useAssistantClient.js.map +1 -1
  29. package/dist/useAssistantEvent.d.ts +3 -0
  30. package/dist/useAssistantEvent.d.ts.map +1 -0
  31. package/dist/useAssistantEvent.js +17 -0
  32. package/dist/useAssistantEvent.js.map +1 -0
  33. package/package.json +5 -6
  34. package/src/AssistantContext.tsx +1 -1
  35. package/src/AssistantIf.tsx +25 -0
  36. package/src/DerivedScope.ts +9 -7
  37. package/src/EventContext.ts +187 -0
  38. package/src/StoreContext.ts +28 -0
  39. package/src/index.ts +33 -6
  40. package/src/types.ts +41 -42
  41. package/src/useAssistantClient.tsx +106 -53
  42. package/src/useAssistantEvent.ts +22 -0
@@ -20,6 +20,7 @@ var AssistantContext = createContext(
20
20
  new Proxy({}, {
21
21
  get(_, prop) {
22
22
  if (prop === "subscribe") return NO_OP_SUBSCRIBE;
23
+ if (prop === "on") return NO_OP_SUBSCRIBE;
23
24
  if (prop === "flushSync") return NO_OP_FLUSH_SYNC;
24
25
  if (hasRegisteredScope(prop))
25
26
  return NO_OP_SCOPE_FIELD;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AssistantContext.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport type { AssistantClient, AssistantScopes, ScopeField } from \"./types\";\nimport { hasRegisteredScope } from \"./ScopeRegistry\";\n\nconst NO_OP_SUBSCRIBE = () => () => {};\nconst NO_OP_FLUSH_SYNC = () => {};\nconst NO_OP_SCOPE_FIELD = (() => {\n const fn = (() => {\n throw new Error(\n \"You need to wrap this component/hook in <AssistantProvider>\",\n );\n }) as ScopeField<never>;\n fn.source = null;\n fn.query = null;\n return fn;\n})();\n\n/**\n * React Context for the AssistantClient\n */\nexport const AssistantContext = createContext<AssistantClient>(\n new Proxy({} as AssistantClient, {\n get(_, prop: string) {\n // Allow access to subscribe and flushSync without error\n if (prop === \"subscribe\") return NO_OP_SUBSCRIBE;\n\n if (prop === \"flushSync\") return NO_OP_FLUSH_SYNC;\n\n // If this is a registered scope, return a function that errors when called or accessed\n if (hasRegisteredScope(prop as keyof AssistantScopes))\n return NO_OP_SCOPE_FIELD;\n\n return null;\n },\n }),\n);\n\nexport const useAssistantContextValue = (): AssistantClient => {\n return useContext(AssistantContext);\n};\n\n/**\n * Provider component for AssistantClient\n *\n * @example\n * ```typescript\n * <AssistantProvider client={client}>\n * <YourApp />\n * </AssistantProvider>\n * ```\n */\nexport const AssistantProvider = ({\n client,\n children,\n}: {\n client: AssistantClient;\n children: React.ReactNode;\n}): React.ReactElement => {\n return (\n <AssistantContext.Provider value={client}>\n {children}\n </AssistantContext.Provider>\n );\n};\n"],"mappings":";AAAA,SAAgB,eAAe,kBAAkB;AAEjD,SAAS,0BAA0B;AAyD/B;AAvDJ,IAAM,kBAAkB,MAAM,MAAM;AAAC;AACrC,IAAM,mBAAmB,MAAM;AAAC;AAChC,IAAM,qBAAqB,MAAM;AAC/B,QAAM,MAAM,MAAM;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,KAAG,SAAS;AACZ,KAAG,QAAQ;AACX,SAAO;AACT,GAAG;AAKI,IAAM,mBAAmB;AAAA,EAC9B,IAAI,MAAM,CAAC,GAAsB;AAAA,IAC/B,IAAI,GAAG,MAAc;AAEnB,UAAI,SAAS,YAAa,QAAO;AAEjC,UAAI,SAAS,YAAa,QAAO;AAGjC,UAAI,mBAAmB,IAA6B;AAClD,eAAO;AAET,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEO,IAAM,2BAA2B,MAAuB;AAC7D,SAAO,WAAW,gBAAgB;AACpC;AAYO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAG0B;AACxB,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,QAC/B,UACH;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/AssistantContext.tsx"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport type { AssistantClient, AssistantScopes, ScopeField } from \"./types\";\nimport { hasRegisteredScope } from \"./ScopeRegistry\";\n\nconst NO_OP_SUBSCRIBE = () => () => {};\nconst NO_OP_FLUSH_SYNC = () => {};\nconst NO_OP_SCOPE_FIELD = (() => {\n const fn = (() => {\n throw new Error(\n \"You need to wrap this component/hook in <AssistantProvider>\",\n );\n }) as ScopeField<never>;\n fn.source = null;\n fn.query = null;\n return fn;\n})();\n\n/**\n * React Context for the AssistantClient\n */\nexport const AssistantContext = createContext<AssistantClient>(\n new Proxy({} as AssistantClient, {\n get(_, prop: string) {\n // Allow access to subscribe and flushSync without error\n if (prop === \"subscribe\") return NO_OP_SUBSCRIBE;\n if (prop === \"on\") return NO_OP_SUBSCRIBE;\n if (prop === \"flushSync\") return NO_OP_FLUSH_SYNC;\n\n // If this is a registered scope, return a function that errors when called or accessed\n if (hasRegisteredScope(prop as keyof AssistantScopes))\n return NO_OP_SCOPE_FIELD;\n\n return null;\n },\n }),\n);\n\nexport const useAssistantContextValue = (): AssistantClient => {\n return useContext(AssistantContext);\n};\n\n/**\n * Provider component for AssistantClient\n *\n * @example\n * ```typescript\n * <AssistantProvider client={client}>\n * <YourApp />\n * </AssistantProvider>\n * ```\n */\nexport const AssistantProvider = ({\n client,\n children,\n}: {\n client: AssistantClient;\n children: React.ReactNode;\n}): React.ReactElement => {\n return (\n <AssistantContext.Provider value={client}>\n {children}\n </AssistantContext.Provider>\n );\n};\n"],"mappings":";AAAA,SAAgB,eAAe,kBAAkB;AAEjD,SAAS,0BAA0B;AAyD/B;AAvDJ,IAAM,kBAAkB,MAAM,MAAM;AAAC;AACrC,IAAM,mBAAmB,MAAM;AAAC;AAChC,IAAM,qBAAqB,MAAM;AAC/B,QAAM,MAAM,MAAM;AAChB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,KAAG,SAAS;AACZ,KAAG,QAAQ;AACX,SAAO;AACT,GAAG;AAKI,IAAM,mBAAmB;AAAA,EAC9B,IAAI,MAAM,CAAC,GAAsB;AAAA,IAC/B,IAAI,GAAG,MAAc;AAEnB,UAAI,SAAS,YAAa,QAAO;AACjC,UAAI,SAAS,KAAM,QAAO;AAC1B,UAAI,SAAS,YAAa,QAAO;AAGjC,UAAI,mBAAmB,IAA6B;AAClD,eAAO;AAET,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEO,IAAM,2BAA2B,MAAuB;AAC7D,SAAO,WAAW,gBAAgB;AACpC;AAYO,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AACF,MAG0B;AACxB,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,QAC/B,UACH;AAEJ;","names":[]}
@@ -0,0 +1,12 @@
1
+ import type { FC, PropsWithChildren } from "react";
2
+ import type { AssistantState } from "./types";
3
+ type UseAssistantIfProps = {
4
+ condition: AssistantIf.Condition;
5
+ };
6
+ export declare namespace AssistantIf {
7
+ type Props = PropsWithChildren<UseAssistantIfProps>;
8
+ type Condition = (state: AssistantState) => boolean;
9
+ }
10
+ export declare const AssistantIf: FC<AssistantIf.Props>;
11
+ export {};
12
+ //# sourceMappingURL=AssistantIf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantIf.d.ts","sourceRoot":"","sources":["../src/AssistantIf.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,KAAK,mBAAmB,GAAG;IACzB,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC;CAClC,CAAC;AAMF,yBAAiB,WAAW,CAAC;IAC3B,KAAY,KAAK,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;IAC3D,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAG7C,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+
3
+ // src/AssistantIf.tsx
4
+ import { useAssistantState } from "./useAssistantState.js";
5
+ var useAssistantIf = (props) => {
6
+ return useAssistantState(props.condition);
7
+ };
8
+ var AssistantIf = ({ children, condition }) => {
9
+ const result = useAssistantIf({ condition });
10
+ return result ? children : null;
11
+ };
12
+ AssistantIf.displayName = "AssistantIf";
13
+ export {
14
+ AssistantIf
15
+ };
16
+ //# sourceMappingURL=AssistantIf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/AssistantIf.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useAssistantState } from \"./useAssistantState\";\nimport type { AssistantState } from \"./types\";\n\ntype UseAssistantIfProps = {\n condition: AssistantIf.Condition;\n};\n\nconst useAssistantIf = (props: UseAssistantIfProps) => {\n return useAssistantState(props.condition);\n};\n\nexport namespace AssistantIf {\n export type Props = PropsWithChildren<UseAssistantIfProps>;\n export type Condition = (state: AssistantState) => boolean;\n}\n\nexport const AssistantIf: FC<AssistantIf.Props> = ({ children, condition }) => {\n const result = useAssistantIf({ condition });\n return result ? children : null;\n};\n\nAssistantIf.displayName = \"AssistantIf\";\n"],"mappings":";;;AAGA,SAAS,yBAAyB;AAOlC,IAAM,iBAAiB,CAAC,UAA+B;AACrD,SAAO,kBAAkB,MAAM,SAAS;AAC1C;AAOO,IAAM,cAAqC,CAAC,EAAE,UAAU,UAAU,MAAM;AAC7E,QAAM,SAAS,eAAe,EAAE,UAAU,CAAC;AAC3C,SAAO,SAAS,WAAW;AAC7B;AAEA,YAAY,cAAc;","names":[]}
@@ -1,18 +1,20 @@
1
- import type { ScopeDefinition, ScopeValue, DerivedScopeProps } from "./types";
1
+ import type { ScopeDefinition, DerivedScopeProps } from "./types";
2
2
  /**
3
3
  * Creates a derived scope field that memoizes based on source and query.
4
4
  * The get callback always calls the most recent version (useEffectEvent pattern).
5
5
  *
6
6
  * @example
7
7
  * ```typescript
8
- * const MessageScope = DerivedScope<MessageScopeDefinition>({
9
- * source: "thread",
10
- * query: { type: "index", index: 0 },
11
- * get: () => messageApi,
8
+ * const client = useAssistantClient({
9
+ * message: DerivedScope({
10
+ * source: "thread",
11
+ * query: { index: 0 },
12
+ * get: (client) => client.thread().message({ index: 0 }),
13
+ * }),
12
14
  * });
13
15
  * ```
14
16
  */
15
17
  export declare const DerivedScope: <T extends ScopeDefinition>(props: DerivedScopeProps<T>, options?: {
16
18
  key?: string | number;
17
- } | undefined) => import("@assistant-ui/tap").ResourceElement<ScopeValue<T>, DerivedScopeProps<T>>;
19
+ } | undefined) => import("@assistant-ui/tap").ResourceElement<null, DerivedScopeProps<T>>;
18
20
  //# sourceMappingURL=DerivedScope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DerivedScope.d.ts","sourceRoot":"","sources":["../src/DerivedScope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE9E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,YAAY,GACtB,CAAC,SAAS,eAAe;;kGAG3B,CAAC"}
1
+ {"version":3,"file":"DerivedScope.d.ts","sourceRoot":"","sources":["../src/DerivedScope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAElE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,YAAY,GACtB,CAAC,SAAS,eAAe;;yFAG3B,CAAC"}
@@ -1,8 +1,8 @@
1
1
  // src/DerivedScope.ts
2
2
  import { resource } from "@assistant-ui/tap";
3
3
  var DerivedScope = resource(
4
- (config) => {
5
- return config;
4
+ (_config) => {
5
+ return null;
6
6
  }
7
7
  );
8
8
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DerivedScope.ts"],"sourcesContent":["import { resource } from \"@assistant-ui/tap\";\nimport type { ScopeDefinition, ScopeValue, DerivedScopeProps } from \"./types\";\n\n/**\n * Creates a derived scope field that memoizes based on source and query.\n * The get callback always calls the most recent version (useEffectEvent pattern).\n *\n * @example\n * ```typescript\n * const MessageScope = DerivedScope<MessageScopeDefinition>({\n * source: \"thread\",\n * query: { type: \"index\", index: 0 },\n * get: () => messageApi,\n * });\n * ```\n */\nexport const DerivedScope = resource(\n <T extends ScopeDefinition>(config: DerivedScopeProps<T>): ScopeValue<T> => {\n return config;\n },\n);\n"],"mappings":";AAAA,SAAS,gBAAgB;AAgBlB,IAAM,eAAe;AAAA,EAC1B,CAA4B,WAAgD;AAC1E,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/DerivedScope.ts"],"sourcesContent":["import { resource } from \"@assistant-ui/tap\";\nimport type { ScopeDefinition, DerivedScopeProps } from \"./types\";\n\n/**\n * Creates a derived scope field that memoizes based on source and query.\n * The get callback always calls the most recent version (useEffectEvent pattern).\n *\n * @example\n * ```typescript\n * const client = useAssistantClient({\n * message: DerivedScope({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (client) => client.thread().message({ index: 0 }),\n * }),\n * });\n * ```\n */\nexport const DerivedScope = resource(\n <T extends ScopeDefinition>(_config: DerivedScopeProps<T>): null => {\n return null;\n },\n);\n"],"mappings":";AAAA,SAAS,gBAAgB;AAkBlB,IAAM,eAAe;AAAA,EAC1B,CAA4B,YAAwC;AAClE,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,61 @@
1
+ import type { AssistantScopes, Unsubscribe } from "./types";
2
+ /**
3
+ * Module augmentation interface for event scope configuration.
4
+ * Maps event sources to their parent scopes.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * declare module "@assistant-ui/store" {
9
+ * interface AssistantEventScopeConfig {
10
+ * composer: "thread" | "message";
11
+ * thread: never;
12
+ * }
13
+ * }
14
+ * ```
15
+ */
16
+ export interface AssistantEventScopeConfig {
17
+ }
18
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
19
+ /**
20
+ * Event map derived from scope event definitions
21
+ */
22
+ export type ScopeEventMap = UnionToIntersection<{
23
+ [K in keyof AssistantScopes]: AssistantScopes[K] extends {
24
+ events: infer E;
25
+ } ? E extends Record<string, unknown> ? E : never : never;
26
+ }[keyof AssistantScopes]>;
27
+ type WildcardPayload = {
28
+ [K in keyof ScopeEventMap]: {
29
+ event: K;
30
+ payload: ScopeEventMap[K];
31
+ };
32
+ }[keyof ScopeEventMap];
33
+ export type AssistantEventMap = ScopeEventMap & {
34
+ "*": WildcardPayload;
35
+ };
36
+ export type AssistantEvent = keyof AssistantEventMap;
37
+ export type EventSource<T extends AssistantEvent = AssistantEvent> = T extends `${infer Source}.${string}` ? Source : never;
38
+ export type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> = (TScope extends "*" ? EventSource : never) | (TScope extends keyof AssistantEventScopeConfig ? TScope : never) | {
39
+ [K in keyof AssistantEventScopeConfig]: TScope extends AssistantEventScopeConfig[K] ? K : never;
40
+ }[keyof AssistantEventScopeConfig];
41
+ export type AssistantEventScope<TEvent extends AssistantEvent> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends keyof AssistantEventScopeConfig ? AssistantEventScopeConfig[EventSource<TEvent>] : never);
42
+ export type AssistantEventSelector<TEvent extends AssistantEvent> = TEvent | {
43
+ scope: AssistantEventScope<TEvent>;
44
+ event: TEvent;
45
+ };
46
+ export declare const normalizeEventSelector: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>) => {
47
+ scope: AssistantEventScope<TEvent>;
48
+ event: TEvent;
49
+ };
50
+ export declare const checkEventScope: <TEvent extends AssistantEvent, TExpectedScope extends AssistantEventScope<AssistantEvent>>(expectedScope: TExpectedScope, scope: AssistantEventScope<TEvent>, _event: TEvent) => _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`>;
51
+ export type AssistantEventCallback<TEvent extends AssistantEvent> = (payload: AssistantEventMap[TEvent]) => void;
52
+ export type EventManager = {
53
+ on<TEvent extends AssistantEvent>(event: TEvent, callback: AssistantEventCallback<TEvent>): Unsubscribe;
54
+ emit<TEvent extends Exclude<AssistantEvent, "*">>(event: TEvent, payload: AssistantEventMap[TEvent]): void;
55
+ };
56
+ export declare const EventManager: () => import("@assistant-ui/tap").ResourceElement<{
57
+ on: <TEvent extends AssistantEvent>(event: TEvent, callback: AssistantEventCallback<TEvent>) => () => void;
58
+ emit: <TEvent extends Exclude<AssistantEvent, "*">>(event: TEvent, payload: AssistantEventMap[TEvent]) => void;
59
+ }, undefined>;
60
+ export {};
61
+ //# sourceMappingURL=EventContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventContext.d.ts","sourceRoot":"","sources":["../src/EventContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ // src/EventContext.ts
2
+ import { resource, tapMemo } from "@assistant-ui/tap";
3
+ var normalizeEventSelector = (selector) => {
4
+ if (typeof selector === "string") {
5
+ const source = selector.split(".")[0];
6
+ return {
7
+ scope: source,
8
+ event: selector
9
+ };
10
+ }
11
+ return {
12
+ scope: selector.scope,
13
+ event: selector.event
14
+ };
15
+ };
16
+ var checkEventScope = (expectedScope, scope, _event) => {
17
+ return scope === expectedScope;
18
+ };
19
+ var EventManager = resource(() => {
20
+ const events = tapMemo(() => {
21
+ const listeners = /* @__PURE__ */ new Map();
22
+ return {
23
+ on: (event, callback) => {
24
+ if (!listeners.has(event)) {
25
+ listeners.set(event, /* @__PURE__ */ new Set());
26
+ }
27
+ const eventListeners = listeners.get(event);
28
+ eventListeners.add(callback);
29
+ return () => {
30
+ eventListeners.delete(callback);
31
+ if (eventListeners.size === 0) {
32
+ listeners.delete(event);
33
+ }
34
+ };
35
+ },
36
+ emit: (event, payload) => {
37
+ const eventListeners = listeners.get(event);
38
+ const wildcardListeners = listeners.get("*");
39
+ if (!eventListeners && !wildcardListeners) return;
40
+ queueMicrotask(() => {
41
+ if (eventListeners) {
42
+ for (const callback of eventListeners) {
43
+ callback(payload);
44
+ }
45
+ }
46
+ if (wildcardListeners) {
47
+ for (const callback of wildcardListeners) {
48
+ callback({ event, payload });
49
+ }
50
+ }
51
+ });
52
+ }
53
+ };
54
+ }, []);
55
+ return events;
56
+ });
57
+ export {
58
+ EventManager,
59
+ checkEventScope,
60
+ normalizeEventSelector
61
+ };
62
+ //# sourceMappingURL=EventContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/EventContext.ts"],"sourcesContent":["import { resource, tapMemo } from \"@assistant-ui/tap\";\nimport type { AssistantScopes, Unsubscribe } from \"./types\";\n\n/**\n * Module augmentation interface for event scope configuration.\n * Maps event sources to their parent scopes.\n *\n * @example\n * ```typescript\n * declare module \"@assistant-ui/store\" {\n * interface AssistantEventScopeConfig {\n * composer: \"thread\" | \"message\";\n * thread: never;\n * }\n * }\n * ```\n */\nexport interface AssistantEventScopeConfig {}\n\ntype UnionToIntersection<U> = (\n U extends unknown\n ? (x: U) => void\n : never\n) extends (x: infer I) => void\n ? I\n : never;\n\n/**\n * Event map derived from scope event definitions\n */\nexport type ScopeEventMap = UnionToIntersection<\n {\n [K in keyof AssistantScopes]: AssistantScopes[K] extends {\n events: infer E;\n }\n ? E extends Record<string, unknown>\n ? E\n : never\n : never;\n }[keyof AssistantScopes]\n>;\n\ntype WildcardPayload = {\n [K in keyof ScopeEventMap]: {\n event: K;\n payload: ScopeEventMap[K];\n };\n}[keyof ScopeEventMap];\n\nexport type AssistantEventMap = ScopeEventMap & {\n // Catch-all\n \"*\": WildcardPayload;\n};\n\nexport type AssistantEvent = keyof AssistantEventMap;\n\nexport type EventSource<T extends AssistantEvent = AssistantEvent> =\n T extends `${infer Source}.${string}` ? Source : never;\n\nexport type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> =\n | (TScope extends \"*\" ? EventSource : never)\n | (TScope extends keyof AssistantEventScopeConfig ? TScope : never)\n | {\n [K in keyof AssistantEventScopeConfig]: TScope extends AssistantEventScopeConfig[K]\n ? K\n : never;\n }[keyof AssistantEventScopeConfig];\n\nexport type AssistantEventScope<TEvent extends AssistantEvent> =\n | \"*\"\n | EventSource<TEvent>\n | (EventSource<TEvent> extends keyof AssistantEventScopeConfig\n ? AssistantEventScopeConfig[EventSource<TEvent>]\n : never);\n\nexport type AssistantEventSelector<TEvent extends AssistantEvent> =\n | TEvent\n | {\n scope: AssistantEventScope<TEvent>;\n event: TEvent;\n };\n\nexport const normalizeEventSelector = <TEvent extends AssistantEvent>(\n selector: AssistantEventSelector<TEvent>,\n) => {\n if (typeof selector === \"string\") {\n const source = selector.split(\".\")[0] as AssistantEventScope<TEvent>;\n return {\n scope: source,\n event: selector,\n };\n }\n\n return {\n scope: selector.scope,\n event: selector.event,\n };\n};\n\nexport const checkEventScope = <\n TEvent extends AssistantEvent,\n TExpectedScope extends AssistantEventScope<AssistantEvent>,\n>(\n expectedScope: TExpectedScope,\n scope: AssistantEventScope<TEvent>,\n _event: TEvent,\n): _event is Extract<TEvent, `${SourceByScope<TExpectedScope>}.${string}`> => {\n return scope === expectedScope;\n};\n\nexport type AssistantEventCallback<TEvent extends AssistantEvent> = (\n payload: AssistantEventMap[TEvent],\n) => void;\n\nexport type EventManager = {\n on<TEvent extends AssistantEvent>(\n event: TEvent,\n callback: AssistantEventCallback<TEvent>,\n ): Unsubscribe;\n emit<TEvent extends Exclude<AssistantEvent, \"*\">>(\n event: TEvent,\n payload: AssistantEventMap[TEvent],\n ): void;\n};\n\ntype ListenerMap = Omit<\n Map<AssistantEvent, Set<AssistantEventCallback<AssistantEvent>>>,\n \"get\" | \"set\"\n> & {\n get<TEvent extends AssistantEvent>(\n event: TEvent,\n ): Set<AssistantEventCallback<TEvent>> | undefined;\n set<TEvent extends AssistantEvent>(\n event: TEvent,\n value: Set<AssistantEventCallback<TEvent>>,\n ): void;\n};\n\nexport const EventManager = resource(() => {\n const events = tapMemo(() => {\n const listeners: ListenerMap = new Map();\n\n return {\n on: (event, callback) => {\n if (!listeners.has(event)) {\n listeners.set(event, new Set());\n }\n\n const eventListeners = listeners.get(event)!;\n eventListeners.add(callback);\n\n return () => {\n eventListeners.delete(callback);\n if (eventListeners.size === 0) {\n listeners.delete(event);\n }\n };\n },\n\n emit: (event, payload) => {\n const eventListeners = listeners.get(event);\n const wildcardListeners = listeners.get(\"*\");\n\n if (!eventListeners && !wildcardListeners) return;\n\n // make sure state updates flush\n queueMicrotask(() => {\n // Emit to specific event listeners\n if (eventListeners) {\n for (const callback of eventListeners) {\n callback(payload);\n }\n }\n\n // Emit to wildcard listeners\n if (wildcardListeners) {\n for (const callback of wildcardListeners) {\n callback({ event, payload } as any);\n }\n }\n });\n },\n } satisfies EventManager;\n }, []);\n\n return events;\n});\n"],"mappings":";AAAA,SAAS,UAAU,eAAe;AAkF3B,IAAM,yBAAyB,CACpC,aACG;AACH,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACpC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,SAAS;AAAA,IAChB,OAAO,SAAS;AAAA,EAClB;AACF;AAEO,IAAM,kBAAkB,CAI7B,eACA,OACA,WAC4E;AAC5E,SAAO,UAAU;AACnB;AA8BO,IAAM,eAAe,SAAS,MAAM;AACzC,QAAM,SAAS,QAAQ,MAAM;AAC3B,UAAM,YAAyB,oBAAI,IAAI;AAEvC,WAAO;AAAA,MACL,IAAI,CAAC,OAAO,aAAa;AACvB,YAAI,CAAC,UAAU,IAAI,KAAK,GAAG;AACzB,oBAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,QAChC;AAEA,cAAM,iBAAiB,UAAU,IAAI,KAAK;AAC1C,uBAAe,IAAI,QAAQ;AAE3B,eAAO,MAAM;AACX,yBAAe,OAAO,QAAQ;AAC9B,cAAI,eAAe,SAAS,GAAG;AAC7B,sBAAU,OAAO,KAAK;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,CAAC,OAAO,YAAY;AACxB,cAAM,iBAAiB,UAAU,IAAI,KAAK;AAC1C,cAAM,oBAAoB,UAAU,IAAI,GAAG;AAE3C,YAAI,CAAC,kBAAkB,CAAC,kBAAmB;AAG3C,uBAAe,MAAM;AAEnB,cAAI,gBAAgB;AAClB,uBAAW,YAAY,gBAAgB;AACrC,uBAAS,OAAO;AAAA,YAClB;AAAA,UACF;AAGA,cAAI,mBAAmB;AACrB,uBAAW,YAAY,mBAAmB;AACxC,uBAAS,EAAE,OAAO,QAAQ,CAAQ;AAAA,YACpC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT,CAAC;","names":[]}
@@ -0,0 +1,9 @@
1
+ import type { EventManager } from "./EventContext";
2
+ import type { AssistantClient } from "./types";
3
+ export type StoreContextValue = {
4
+ events: EventManager;
5
+ parent: AssistantClient;
6
+ };
7
+ export declare const withStoreContextProvider: <TResult>(value: StoreContextValue, fn: () => TResult) => TResult;
8
+ export declare const tapStoreContext: () => StoreContextValue;
9
+ //# sourceMappingURL=StoreContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreContext.d.ts","sourceRoot":"","sources":["../src/StoreContext.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAIF,eAAO,MAAM,wBAAwB,GAAI,OAAO,EAC9C,OAAO,iBAAiB,EACxB,IAAI,MAAM,OAAO,YAGlB,CAAC;AAEF,eAAO,MAAM,eAAe,yBAK3B,CAAC"}
@@ -0,0 +1,20 @@
1
+ // src/StoreContext.ts
2
+ import {
3
+ createContext,
4
+ tapContext,
5
+ withContextProvider
6
+ } from "@assistant-ui/tap";
7
+ var StoreContext = createContext(null);
8
+ var withStoreContextProvider = (value, fn) => {
9
+ return withContextProvider(StoreContext, value, fn);
10
+ };
11
+ var tapStoreContext = () => {
12
+ const ctx = tapContext(StoreContext);
13
+ if (!ctx) throw new Error("Store context is not available");
14
+ return ctx;
15
+ };
16
+ export {
17
+ tapStoreContext,
18
+ withStoreContextProvider
19
+ };
20
+ //# sourceMappingURL=StoreContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/StoreContext.ts"],"sourcesContent":["import {\n createContext,\n tapContext,\n withContextProvider,\n} from \"@assistant-ui/tap\";\nimport type { EventManager } from \"./EventContext\";\nimport type { AssistantClient } from \"./types\";\n\nexport type StoreContextValue = {\n events: EventManager;\n parent: AssistantClient;\n};\n\nconst StoreContext = createContext<StoreContextValue | null>(null);\n\nexport const withStoreContextProvider = <TResult>(\n value: StoreContextValue,\n fn: () => TResult,\n) => {\n return withContextProvider(StoreContext, value, fn);\n};\n\nexport const tapStoreContext = () => {\n const ctx = tapContext(StoreContext);\n if (!ctx) throw new Error(\"Store context is not available\");\n\n return ctx;\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,IAAM,eAAe,cAAwC,IAAI;AAE1D,IAAM,2BAA2B,CACtC,OACA,OACG;AACH,SAAO,oBAAoB,cAAc,OAAO,EAAE;AACpD;AAEO,IAAM,kBAAkB,MAAM;AACnC,QAAM,MAAM,WAAW,YAAY;AACnC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,gCAAgC;AAE1D,SAAO;AACT;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  export { useAssistantClient } from "./useAssistantClient";
2
2
  export { useAssistantState } from "./useAssistantState";
3
+ export { useAssistantEvent } from "./useAssistantEvent";
4
+ export { AssistantIf } from "./AssistantIf";
3
5
  export { AssistantProvider } from "./AssistantContext";
4
- export type { AssistantScopes, AssistantClient, AssistantState } from "./types";
5
6
  export { DerivedScope } from "./DerivedScope";
6
- export type { ApiObject } from "./tapApi";
7
- export { tapApi } from "./tapApi";
7
+ export { tapApi, type ApiObject } from "./tapApi";
8
+ export { tapStoreContext, type StoreContextValue } from "./StoreContext";
8
9
  export { tapLookupResources } from "./tapLookupResources";
9
- export { tapStoreList } from "./tapStoreList";
10
- export type { TapStoreListConfig } from "./tapStoreList";
10
+ export { tapStoreList, type TapStoreListConfig } from "./tapStoreList";
11
11
  export { registerAssistantScope } from "./ScopeRegistry";
12
- export type { AssistantScopeRegistry } from "./types";
12
+ export type { AssistantScopes, AssistantScopeRegistry, AssistantClient, AssistantState, } from "./types";
13
+ export type { AssistantEvent, AssistantEventScopeConfig, AssistantEventMap, AssistantEventScope, AssistantEventSelector, AssistantEventCallback, EventSource, SourceByScope, EventManager, } from "./EventContext";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,YAAY,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,cAAc,EACd,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,20 +1,26 @@
1
1
  // src/index.ts
2
2
  import { useAssistantClient } from "./useAssistantClient.js";
3
3
  import { useAssistantState } from "./useAssistantState.js";
4
+ import { useAssistantEvent } from "./useAssistantEvent.js";
5
+ import { AssistantIf } from "./AssistantIf.js";
4
6
  import { AssistantProvider } from "./AssistantContext.js";
5
7
  import { DerivedScope } from "./DerivedScope.js";
6
8
  import { tapApi } from "./tapApi.js";
9
+ import { tapStoreContext } from "./StoreContext.js";
7
10
  import { tapLookupResources } from "./tapLookupResources.js";
8
11
  import { tapStoreList } from "./tapStoreList.js";
9
12
  import { registerAssistantScope } from "./ScopeRegistry.js";
10
13
  export {
14
+ AssistantIf,
11
15
  AssistantProvider,
12
16
  DerivedScope,
13
17
  registerAssistantScope,
14
18
  tapApi,
15
19
  tapLookupResources,
20
+ tapStoreContext,
16
21
  tapStoreList,
17
22
  useAssistantClient,
23
+ useAssistantEvent,
18
24
  useAssistantState
19
25
  };
20
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { useAssistantClient } from \"./useAssistantClient\";\nexport { useAssistantState } from \"./useAssistantState\";\nexport { AssistantProvider } from \"./AssistantContext\";\nexport type { AssistantScopes, AssistantClient, AssistantState } from \"./types\";\nexport { DerivedScope } from \"./DerivedScope\";\nexport type { ApiObject } from \"./tapApi\";\nexport { tapApi } from \"./tapApi\";\nexport { tapLookupResources } from \"./tapLookupResources\";\nexport { tapStoreList } from \"./tapStoreList\";\nexport type { TapStoreListConfig } from \"./tapStoreList\";\nexport { registerAssistantScope } from \"./ScopeRegistry\";\n\nexport type { AssistantScopeRegistry } from \"./types\";\n"],"mappings":";AAAA,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAElC,SAAS,oBAAoB;AAE7B,SAAS,cAAc;AACvB,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAE7B,SAAS,8BAA8B;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// hooks\nexport { useAssistantClient } from \"./useAssistantClient\";\nexport { useAssistantState } from \"./useAssistantState\";\nexport { useAssistantEvent } from \"./useAssistantEvent\";\n\n// components\nexport { AssistantIf } from \"./AssistantIf\";\nexport { AssistantProvider } from \"./AssistantContext\";\n\n// resources\nexport { DerivedScope } from \"./DerivedScope\";\n\n// tap hooks\nexport { tapApi, type ApiObject } from \"./tapApi\";\nexport { tapStoreContext, type StoreContextValue } from \"./StoreContext\";\nexport { tapLookupResources } from \"./tapLookupResources\";\nexport { tapStoreList, type TapStoreListConfig } from \"./tapStoreList\";\n\n// registration\nexport { registerAssistantScope } from \"./ScopeRegistry\";\n\n// types\nexport type {\n AssistantScopes,\n AssistantScopeRegistry,\n AssistantClient,\n AssistantState,\n} from \"./types\";\n\nexport type {\n AssistantEvent,\n AssistantEventScopeConfig,\n AssistantEventMap,\n AssistantEventScope,\n AssistantEventSelector,\n AssistantEventCallback,\n EventSource,\n SourceByScope,\n EventManager,\n} from \"./EventContext\";\n"],"mappings":";AACA,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAGlC,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAGlC,SAAS,oBAAoB;AAG7B,SAAS,cAA8B;AACvC,SAAS,uBAA+C;AACxD,SAAS,0BAA0B;AACnC,SAAS,oBAA6C;AAGtD,SAAS,8BAA8B;","names":[]}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { ResourceElement } from "@assistant-ui/tap";
2
+ import type { AssistantEvent, AssistantEventCallback, AssistantEventSelector } from "./EventContext";
2
3
  /**
3
4
  * Module augmentation interface for assistant-ui store type extensions.
4
5
  *
@@ -8,8 +9,19 @@ import type { ResourceElement } from "@assistant-ui/tap";
8
9
  * interface AssistantScopeRegistry {
9
10
  * foo: {
10
11
  * value: { getState: () => { bar: string }; updateBar: (bar: string) => void };
11
- * source: "root";
12
- * query: Record<string, never>;
12
+ * meta: { source: "root"; query: Record<string, never> };
13
+ * events: {
14
+ * "foo.updated": { id: string; newValue: string };
15
+ * "foo.deleted": { id: string };
16
+ * };
17
+ * };
18
+ * // Example with multiple sources (discriminated union):
19
+ * bar: {
20
+ * value: { getState: () => { id: string } };
21
+ * meta:
22
+ * | { source: "fooList"; query: { index: number } }
23
+ * | { source: "barList"; query: { id: string } };
24
+ * events: Record<string, never>;
13
25
  * };
14
26
  * }
15
27
  * }
@@ -20,26 +32,11 @@ export interface AssistantScopeRegistry {
20
32
  export type AssistantScopes = keyof AssistantScopeRegistry extends never ? Record<"ERROR: No scopes were defined", ScopeDefinition> : {
21
33
  [K in keyof AssistantScopeRegistry]: AssistantScopeRegistry[K];
22
34
  };
23
- /**
24
- * Helper type to extract the value type from a scope definition
25
- */
26
- export type ScopeValue<T extends ScopeDefinition> = T["value"];
27
- /**
28
- * Helper type to extract the source type from a scope definition
29
- */
30
- export type ScopeSource<T extends ScopeDefinition> = T["source"];
31
- /**
32
- * Helper type to extract the query type from a scope definition
33
- */
34
- export type ScopeQuery<T extends ScopeDefinition> = T["query"];
35
35
  /**
36
36
  * Type for a scope field - a function that returns the current API value,
37
- * with source and query metadata attached
37
+ * with source/query metadata attached (derived from meta)
38
38
  */
39
- export type ScopeField<T extends ScopeDefinition> = (() => ScopeValue<T>) & ({
40
- source: ScopeSource<T>;
41
- query: ScopeQuery<T>;
42
- } | {
39
+ export type ScopeField<T extends ScopeDefinition> = (() => T["value"]) & (T["meta"] | {
43
40
  source: null;
44
41
  query: null;
45
42
  });
@@ -47,16 +44,16 @@ export type ScopeField<T extends ScopeDefinition> = (() => ScopeValue<T>) & ({
47
44
  * Props passed to a derived scope resource element
48
45
  */
49
46
  export type DerivedScopeProps<T extends ScopeDefinition> = {
50
- get: (parent: AssistantClient) => ScopeValue<T>;
51
- source: ScopeSource<T>;
52
- query: ScopeQuery<T>;
47
+ get: (parent: AssistantClient) => T["value"];
48
+ source: T["meta"]["source"];
49
+ query: T["meta"]["query"];
53
50
  };
54
51
  /**
55
52
  * Input type for scope definitions - ResourceElement that returns the API value
56
53
  * Can optionally include source/query metadata via DerivedScope
57
54
  */
58
55
  export type ScopeInput<T extends ScopeDefinition> = ResourceElement<{
59
- api: ScopeValue<T>;
56
+ api: T["value"];
60
57
  }>;
61
58
  /**
62
59
  * Map of scope names to their input definitions
@@ -82,5 +79,6 @@ export type AssistantClient = {
82
79
  } & {
83
80
  subscribe(listener: () => void): Unsubscribe;
84
81
  flushSync(): void;
82
+ on<TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe;
85
83
  };
86
84
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAmBzD;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,sBAAsB;CAAG;AAE1C,MAAM,MAAM,eAAe,GAAG,MAAM,sBAAsB,SAAS,KAAK,GACpE,MAAM,CAAC,+BAA+B,EAAE,eAAe,CAAC,GACxD;KAAG,CAAC,IAAI,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,CAAC,CAAC;CAAE,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,GACvE,CACI;IACE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB,GACD;IACE,MAAM,EAAE,IAAI,CAAC;IACb,KAAK,EAAE,IAAI,CAAC;CACb,CACJ,CAAC;AAEJ;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,eAAe,IAAI;IACzD,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,eAAe,CAAC;IAClE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACpB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;KACvB,CAAC,IAAI,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,MAAM,eAAe,GAAG,UAAU,CACtC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CACxC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;KAC3B,CAAC,IAAI,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAC7D,GAAG;IACF,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC7C,SAAS,IAAI,IAAI,CAAC;CACnB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AAwBxB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,sBAAsB;CAAG;AAE1C,MAAM,MAAM,eAAe,GAAG,MAAM,sBAAsB,SAAS,KAAK,GACpE,MAAM,CAAC,+BAA+B,EAAE,eAAe,CAAC,GACxD;KAAG,CAAC,IAAI,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,CAAC,CAAC;CAAE,CAAC;AACvE;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,GACpE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,eAAe,IAAI;IACzD,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,eAAe,CAAC;IAClE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;CACjB,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;KACvB,CAAC,IAAI,MAAM,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,MAAM,eAAe,GAAG,UAAU,CACtC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CACxC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;KAC3B,CAAC,IAAI,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAC7D,GAAG;IACF,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC7C,SAAS,IAAI,IAAI,CAAC;IAClB,EAAE,CAAC,MAAM,SAAS,cAAc,EAC9B,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,EACxC,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,GACvC,WAAW,CAAC;CAChB,CAAC"}
@@ -1,21 +1,29 @@
1
1
  import type { AssistantClient, AssistantScopes, ScopesInput, ScopeField } from "./types";
2
+ import { type AssistantEvent, type AssistantEventCallback, type AssistantEventSelector } from "./EventContext";
2
3
  /**
3
4
  * Hook to mount and access root scopes
4
5
  */
5
- export declare const useRootScopes: (rootScopes: ScopesInput) => {
6
+ export declare const useRootScopes: (rootScopes: ScopesInput, parent: AssistantClient) => {
6
7
  scopes: {};
8
+ on: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => () => void;
7
9
  subscribe?: never;
8
10
  flushSync?: never;
9
11
  } | {
10
12
  scopes: { [K in "ERROR: No scopes were defined"]: ScopeField<AssistantScopes[K]>; };
11
13
  subscribe: (callback: () => void) => () => void;
12
14
  flushSync: () => void;
15
+ on: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => () => void;
13
16
  };
14
17
  /**
15
18
  * Hook to mount and access derived scopes
16
19
  */
17
20
  export declare const useDerivedScopes: (derivedScopes: ScopesInput, parentClient: AssistantClient) => {
18
- "ERROR: No scopes were defined"?: ScopeField<import("./types").ScopeDefinition<any, any, any>>;
21
+ "ERROR: No scopes were defined"?: ScopeField<import("./types").ScopeDefinition<Record<string, unknown> & {
22
+ getState: () => Record<string, unknown>;
23
+ }, {
24
+ source: string;
25
+ query: Record<string, unknown>;
26
+ }, Record<string, unknown>>>;
19
27
  };
20
28
  /**
21
29
  * Hook to access or extend the AssistantClient
@@ -1 +1 @@
1
- {"version":3,"file":"useAssistantClient.d.ts","sourceRoot":"","sources":["../src/useAssistantClient.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,WAAW,EACX,UAAU,EAGX,MAAM,SAAS,CAAC;AA6FjB;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,WAAW;;;;;YA1B1C,GACF,CAAC,mCAAuB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAC3D;0BACqB,MAAM,IAAI;;CAyBrC,CAAC;AAqEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,eAAe,WAAW,EAC1B,cAAc,eAAe;;CAK9B,CAAC;AAyBF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAAC;AACtD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC"}
1
+ {"version":3,"file":"useAssistantClient.d.ts","sourceRoot":"","sources":["../src/useAssistantClient.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,WAAW,EACX,UAAU,EAGX,MAAM,SAAS,CAAC;AAIjB,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAqIxB;;GAEG;AACH,eAAO,MAAM,aAAa,GACxB,YAAY,WAAW,EACvB,QAAQ,eAAe;;SApDT,MAAM,SAAS,cAAc,YAC7B,sBAAsB,CAAC,MAAM,CAAC,YAC9B,sBAAsB,CAAC,MAAM,CAAC;;;;YAoBjC,GACF,CAAC,mCAAuB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAC3D;0BACqB,MAAM,IAAI;;SAzBxB,MAAM,SAAS,cAAc,YAC7B,sBAAsB,CAAC,MAAM,CAAC,YAC9B,sBAAsB,CAAC,MAAM,CAAC;CAqD7C,CAAC;AAqEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,eAAe,WAAW,EAC1B,cAAc,eAAe;;;;;;;CAK9B,CAAC;AA0BF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,kBAAkB,IAAI,eAAe,CAAC;AACtD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CAAC"}