@assistant-ui/store 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +59 -262
  2. package/dist/AssistantIf.d.ts +4 -6
  3. package/dist/AssistantIf.d.ts.map +1 -1
  4. package/dist/AssistantIf.js +1 -4
  5. package/dist/AssistantIf.js.map +1 -1
  6. package/dist/Derived.d.ts +34 -0
  7. package/dist/Derived.d.ts.map +1 -0
  8. package/dist/Derived.js +11 -0
  9. package/dist/Derived.js.map +1 -0
  10. package/dist/attachDefaultPeers.d.ts +56 -0
  11. package/dist/attachDefaultPeers.d.ts.map +1 -0
  12. package/dist/attachDefaultPeers.js +22 -0
  13. package/dist/attachDefaultPeers.js.map +1 -0
  14. package/dist/index.d.ts +10 -9
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +17 -13
  17. package/dist/index.js.map +1 -1
  18. package/dist/tapClientList.d.ts +24 -0
  19. package/dist/tapClientList.d.ts.map +1 -0
  20. package/dist/tapClientList.js +72 -0
  21. package/dist/tapClientList.js.map +1 -0
  22. package/dist/tapClientLookup.d.ts +11 -0
  23. package/dist/tapClientLookup.d.ts.map +1 -0
  24. package/dist/tapClientLookup.js +42 -0
  25. package/dist/tapClientLookup.js.map +1 -0
  26. package/dist/tapClientResource.d.ts +24 -0
  27. package/dist/tapClientResource.d.ts.map +1 -0
  28. package/dist/tapClientResource.js +100 -0
  29. package/dist/tapClientResource.js.map +1 -0
  30. package/dist/types/client.d.ts +117 -0
  31. package/dist/types/client.d.ts.map +1 -0
  32. package/dist/types/client.js +1 -0
  33. package/dist/types/events.d.ts +33 -0
  34. package/dist/types/events.d.ts.map +1 -0
  35. package/dist/types/events.js +12 -0
  36. package/dist/types/events.js.map +1 -0
  37. package/dist/useAssistantClient.d.ts +13 -46
  38. package/dist/useAssistantClient.d.ts.map +1 -1
  39. package/dist/useAssistantClient.js +177 -137
  40. package/dist/useAssistantClient.js.map +1 -1
  41. package/dist/useAssistantEvent.d.ts +2 -2
  42. package/dist/useAssistantEvent.d.ts.map +1 -1
  43. package/dist/useAssistantEvent.js +3 -6
  44. package/dist/useAssistantEvent.js.map +1 -1
  45. package/dist/useAssistantState.d.ts +2 -2
  46. package/dist/useAssistantState.d.ts.map +1 -1
  47. package/dist/useAssistantState.js +7 -36
  48. package/dist/useAssistantState.js.map +1 -1
  49. package/dist/utils/BaseProxyHandler.d.ts +23 -0
  50. package/dist/utils/BaseProxyHandler.d.ts.map +1 -0
  51. package/dist/utils/BaseProxyHandler.js +41 -0
  52. package/dist/utils/BaseProxyHandler.js.map +1 -0
  53. package/dist/utils/NotificationManager.d.ts +11 -0
  54. package/dist/utils/NotificationManager.d.ts.map +1 -0
  55. package/dist/utils/NotificationManager.js +81 -0
  56. package/dist/utils/NotificationManager.js.map +1 -0
  57. package/dist/utils/StoreResource.d.ts +14 -0
  58. package/dist/utils/StoreResource.d.ts.map +1 -0
  59. package/dist/utils/StoreResource.js +23 -0
  60. package/dist/utils/StoreResource.js.map +1 -0
  61. package/dist/utils/proxied-assistant-state.d.ts +8 -0
  62. package/dist/utils/proxied-assistant-state.d.ts.map +1 -0
  63. package/dist/utils/proxied-assistant-state.js +41 -0
  64. package/dist/utils/proxied-assistant-state.js.map +1 -0
  65. package/dist/{AssistantContext.d.ts → utils/react-assistant-context.d.ts} +6 -6
  66. package/dist/utils/react-assistant-context.d.ts.map +1 -0
  67. package/dist/utils/react-assistant-context.js +73 -0
  68. package/dist/utils/react-assistant-context.js.map +1 -0
  69. package/dist/utils/splitClients.d.ts +28 -0
  70. package/dist/utils/splitClients.d.ts.map +1 -0
  71. package/dist/utils/splitClients.js +37 -0
  72. package/dist/utils/splitClients.js.map +1 -0
  73. package/dist/utils/tap-assistant-context.d.ts +19 -0
  74. package/dist/utils/tap-assistant-context.d.ts.map +1 -0
  75. package/dist/utils/tap-assistant-context.js +37 -0
  76. package/dist/utils/tap-assistant-context.js.map +1 -0
  77. package/dist/utils/tap-client-stack-context.d.ts +23 -0
  78. package/dist/utils/tap-client-stack-context.d.ts.map +1 -0
  79. package/dist/utils/tap-client-stack-context.js +30 -0
  80. package/dist/utils/tap-client-stack-context.js.map +1 -0
  81. package/package.json +3 -3
  82. package/src/AssistantIf.tsx +3 -11
  83. package/src/Derived.ts +46 -0
  84. package/src/attachDefaultPeers.ts +78 -0
  85. package/src/index.ts +19 -22
  86. package/src/tapClientList.ts +105 -0
  87. package/src/tapClientLookup.ts +56 -0
  88. package/src/tapClientResource.ts +152 -0
  89. package/src/types/client.ts +186 -0
  90. package/src/types/events.ts +77 -0
  91. package/src/useAssistantClient.tsx +252 -234
  92. package/src/useAssistantEvent.ts +6 -9
  93. package/src/useAssistantState.tsx +10 -48
  94. package/src/utils/BaseProxyHandler.ts +50 -0
  95. package/src/utils/NotificationManager.ts +110 -0
  96. package/src/utils/StoreResource.ts +36 -0
  97. package/src/utils/proxied-assistant-state.tsx +53 -0
  98. package/src/utils/react-assistant-context.tsx +107 -0
  99. package/src/utils/splitClients.ts +85 -0
  100. package/src/utils/tap-assistant-context.ts +59 -0
  101. package/src/utils/tap-client-stack-context.ts +51 -0
  102. package/dist/AssistantContext.d.ts.map +0 -1
  103. package/dist/AssistantContext.js +0 -45
  104. package/dist/AssistantContext.js.map +0 -1
  105. package/dist/DerivedScope.d.ts +0 -20
  106. package/dist/DerivedScope.d.ts.map +0 -1
  107. package/dist/DerivedScope.js +0 -11
  108. package/dist/DerivedScope.js.map +0 -1
  109. package/dist/EventContext.d.ts +0 -61
  110. package/dist/EventContext.d.ts.map +0 -1
  111. package/dist/EventContext.js +0 -62
  112. package/dist/EventContext.js.map +0 -1
  113. package/dist/ScopeRegistry.d.ts +0 -41
  114. package/dist/ScopeRegistry.d.ts.map +0 -1
  115. package/dist/ScopeRegistry.js +0 -17
  116. package/dist/ScopeRegistry.js.map +0 -1
  117. package/dist/StoreContext.d.ts +0 -9
  118. package/dist/StoreContext.d.ts.map +0 -1
  119. package/dist/StoreContext.js +0 -20
  120. package/dist/StoreContext.js.map +0 -1
  121. package/dist/asStore.d.ts +0 -20
  122. package/dist/asStore.d.ts.map +0 -1
  123. package/dist/asStore.js +0 -23
  124. package/dist/asStore.js.map +0 -1
  125. package/dist/tapApi.d.ts +0 -36
  126. package/dist/tapApi.d.ts.map +0 -1
  127. package/dist/tapApi.js +0 -52
  128. package/dist/tapApi.js.map +0 -1
  129. package/dist/tapLookupResources.d.ts +0 -44
  130. package/dist/tapLookupResources.d.ts.map +0 -1
  131. package/dist/tapLookupResources.js +0 -21
  132. package/dist/tapLookupResources.js.map +0 -1
  133. package/dist/tapStoreList.d.ts +0 -76
  134. package/dist/tapStoreList.d.ts.map +0 -1
  135. package/dist/tapStoreList.js +0 -46
  136. package/dist/tapStoreList.js.map +0 -1
  137. package/dist/types.d.ts +0 -84
  138. package/dist/types.d.ts.map +0 -1
  139. package/dist/types.js +0 -1
  140. package/dist/utils/splitScopes.d.ts +0 -24
  141. package/dist/utils/splitScopes.d.ts.map +0 -1
  142. package/dist/utils/splitScopes.js +0 -18
  143. package/dist/utils/splitScopes.js.map +0 -1
  144. package/src/AssistantContext.tsx +0 -64
  145. package/src/DerivedScope.ts +0 -23
  146. package/src/EventContext.ts +0 -187
  147. package/src/ScopeRegistry.ts +0 -58
  148. package/src/StoreContext.ts +0 -28
  149. package/src/asStore.ts +0 -40
  150. package/src/tapApi.ts +0 -91
  151. package/src/tapLookupResources.ts +0 -62
  152. package/src/tapStoreList.ts +0 -133
  153. package/src/types.ts +0 -119
  154. package/src/utils/splitScopes.ts +0 -38
  155. /package/dist/{types.js.map → types/client.js.map} +0 -0
@@ -0,0 +1,24 @@
1
+ import type { ContravariantResource } from "@assistant-ui/tap";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client";
3
+ export declare const tapClientList: <TData, TState, TMethods extends ClientMethods>(props: tapClientList.Props<TData, TState, TMethods>) => {
4
+ state: TState[];
5
+ get: (lookup: {
6
+ index: number;
7
+ } | {
8
+ key: string;
9
+ }) => TMethods;
10
+ add: (initialData: TData) => void;
11
+ };
12
+ export declare namespace tapClientList {
13
+ type ResourceProps<TData> = {
14
+ key: string;
15
+ getInitialData: () => TData;
16
+ remove: () => void;
17
+ };
18
+ type Props<TData, TState, TMethods extends ClientMethods> = {
19
+ initialValues: TData[];
20
+ getKey: (data: TData) => string;
21
+ resource: ContravariantResource<ClientOutputOf<TState, TMethods>, ResourceProps<TData>>;
22
+ };
23
+ }
24
+ //# sourceMappingURL=tapClientList.d.ts.map
@@ -0,0 +1 @@
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,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAsBpE,eAAO,MAAM,aAAa,GAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,aAAa,EACzE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAClD;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,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;CAyDnC,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,MAAM,EAAE,QAAQ,SAAS,aAAa,IAAI;QACjE,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;QAChC,QAAQ,EAAE,qBAAqB,CAC7B,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;KACH,CAAC;CACH"}
@@ -0,0 +1,72 @@
1
+ // src/tapClientList.ts
2
+ import { tapState } from "@assistant-ui/tap";
3
+ import { tapClientLookup } from "./tapClientLookup.js";
4
+ var createProps = (key, data, remove) => {
5
+ let initialData = { data };
6
+ return {
7
+ key,
8
+ getInitialData: () => {
9
+ if (!initialData) {
10
+ throw new Error("getInitialData may only be called once");
11
+ }
12
+ const data2 = initialData.data;
13
+ initialData = void 0;
14
+ return data2;
15
+ },
16
+ remove
17
+ };
18
+ };
19
+ var tapClientList = (props) => {
20
+ const { initialValues, getKey, resource: Resource } = props;
21
+ const [items, setItems] = tapState(() => {
22
+ const entries = [];
23
+ for (const data of initialValues) {
24
+ const key = getKey(data);
25
+ entries.push([
26
+ key,
27
+ createProps(key, data, () => {
28
+ setItems((items2) => {
29
+ const newItems = { ...items2 };
30
+ delete newItems[key];
31
+ return newItems;
32
+ });
33
+ })
34
+ ]);
35
+ }
36
+ return Object.fromEntries(entries);
37
+ });
38
+ const lookup = tapClientLookup(
39
+ items,
40
+ Resource,
41
+ [Resource]
42
+ );
43
+ const add = (data) => {
44
+ const key = getKey(data);
45
+ setItems((items2) => {
46
+ if (key in items2) {
47
+ throw new Error(
48
+ `Tried to add item with a key ${key} that already exists`
49
+ );
50
+ }
51
+ return {
52
+ ...items2,
53
+ [key]: createProps(key, data, () => {
54
+ setItems((items3) => {
55
+ const newItems = { ...items3 };
56
+ delete newItems[key];
57
+ return newItems;
58
+ });
59
+ })
60
+ };
61
+ });
62
+ };
63
+ return {
64
+ state: lookup.state,
65
+ get: lookup.get,
66
+ add
67
+ };
68
+ };
69
+ export {
70
+ tapClientList
71
+ };
72
+ //# sourceMappingURL=tapClientList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tapClientList.ts"],"sourcesContent":["import { tapState } from \"@assistant-ui/tap\";\nimport type { ContravariantResource } from \"@assistant-ui/tap\";\nimport { tapClientLookup } from \"./tapClientLookup\";\nimport type { ClientMethods, ClientOutputOf } from \"./types/client\";\n\nconst createProps = <TData>(\n key: string,\n data: TData,\n remove: () => void,\n): tapClientList.ResourceProps<TData> => {\n let initialData: { data: TData } | undefined = { data };\n return {\n key,\n getInitialData: () => {\n if (!initialData) {\n throw new Error(\"getInitialData may only be called once\");\n }\n const data = initialData.data;\n initialData = undefined;\n return data;\n },\n remove,\n };\n};\n\nexport const tapClientList = <TData, TState, TMethods extends ClientMethods>(\n props: tapClientList.Props<TData, TState, TMethods>,\n): {\n state: TState[];\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 [items, setItems] = tapState<Record<string, Props>>(() => {\n const entries: [string, Props][] = [];\n for (const data of initialValues) {\n const key = getKey(data);\n entries.push([\n key,\n createProps(key, data, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n ]);\n }\n return Object.fromEntries(entries);\n });\n\n const lookup = tapClientLookup<TState, TMethods, Record<string, Props>>(\n items,\n Resource,\n [Resource],\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 return {\n ...items,\n [key]: createProps(key, data, () => {\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, TState, TMethods extends ClientMethods> = {\n initialValues: TData[];\n getKey: (data: TData) => string;\n resource: ContravariantResource<\n ClientOutputOf<TState, TMethods>,\n ResourceProps<TData>\n >;\n };\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAGhC,IAAM,cAAc,CAClB,KACA,MACA,WACuC;AACvC,MAAI,cAA2C,EAAE,KAAK;AACtD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,MAAM;AACpB,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AACA,YAAMA,QAAO,YAAY;AACzB,oBAAc;AACd,aAAOA;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,CAC3B,UAKG;AACH,QAAM,EAAE,eAAe,QAAQ,UAAU,SAAS,IAAI;AAItD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,MAAM;AAC9D,UAAM,UAA6B,CAAC;AACpC,eAAW,QAAQ,eAAe;AAChC,YAAM,MAAM,OAAO,IAAI;AACvB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,YAAY,KAAK,MAAM,MAAM;AAC3B,mBAAS,CAACC,WAAU;AAClB,kBAAM,WAAW,EAAE,GAAGA,OAAM;AAC5B,mBAAO,SAAS,GAAG;AACnB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC,CAAC;AAED,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,MAAM,CAAC,SAAgB;AAC3B,UAAM,MAAM,OAAO,IAAI;AACvB,aAAS,CAACA,WAAU;AAClB,UAAI,OAAOA,QAAO;AAChB,cAAM,IAAI;AAAA,UACR,gCAAgC,GAAG;AAAA,QACrC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,CAAC,GAAG,GAAG,YAAY,KAAK,MAAM,MAAM;AAClC,mBAAS,CAACA,WAAU;AAClB,kBAAM,WAAW,EAAE,GAAGA,OAAM;AAC5B,mBAAO,SAAS,GAAG;AACnB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,KAAK,OAAO;AAAA,IACZ;AAAA,EACF;AACF;","names":["data","items"]}
@@ -0,0 +1,11 @@
1
+ import { ResourceElement } from "@assistant-ui/tap";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client";
3
+ export declare const tapClientLookup: <TState, TMethods extends ClientMethods, M extends Record<string | number | symbol, any>>(map: M, getElement: (t: M[keyof M], key: keyof M) => ResourceElement<ClientOutputOf<TState, TMethods>>, getElementDeps: any[]) => {
4
+ state: TState[];
5
+ get: (lookup: {
6
+ index: number;
7
+ } | {
8
+ key: keyof M;
9
+ }) => TMethods;
10
+ };
11
+ //# sourceMappingURL=tapClientLookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tapClientLookup.d.ts","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGpE,eAAO,MAAM,eAAe,GAC1B,MAAM,EACN,QAAQ,SAAS,aAAa,EAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAE/C,KAAK,CAAC,EACN,YAAY,CACV,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACb,GAAG,EAAE,MAAM,CAAC,KACT,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EACtD,gBAAgB,GAAG,EAAE,KACpB;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,QAAQ,CAAC;CAsCjE,CAAC"}
@@ -0,0 +1,42 @@
1
+ // src/tapClientLookup.ts
2
+ import { tapMemo, tapResources } from "@assistant-ui/tap";
3
+ import { ClientResource } from "./tapClientResource.js";
4
+ var tapClientLookup = (map, getElement, getElementDeps) => {
5
+ const resources = tapResources(
6
+ map,
7
+ (t, key) => ClientResource(getElement(t, key)),
8
+ getElementDeps
9
+ );
10
+ const keys = tapMemo(() => Object.keys(map), [map]);
11
+ const state = tapMemo(() => {
12
+ const result = new Array(keys.length);
13
+ for (let i = 0; i < keys.length; i++) {
14
+ result[i] = resources[keys[i]].state;
15
+ }
16
+ return result;
17
+ }, [keys, resources]);
18
+ return {
19
+ state,
20
+ get: (lookup) => {
21
+ if ("index" in lookup) {
22
+ if (lookup.index < 0 || lookup.index >= keys.length) {
23
+ throw new Error(
24
+ `tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`
25
+ );
26
+ }
27
+ return resources[keys[lookup.index]].methods;
28
+ }
29
+ const value = resources[lookup.key];
30
+ if (!value) {
31
+ throw new Error(
32
+ `tapClientLookup: Key "${String(lookup.key)}" not found`
33
+ );
34
+ }
35
+ return value.methods;
36
+ }
37
+ };
38
+ };
39
+ export {
40
+ tapClientLookup
41
+ };
42
+ //# sourceMappingURL=tapClientLookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tapClientLookup.ts"],"sourcesContent":["import { ResourceElement, tapMemo, tapResources } from \"@assistant-ui/tap\";\nimport type { ClientMethods, ClientOutputOf } from \"./types/client\";\nimport { ClientResource } from \"./tapClientResource\";\n\nexport const tapClientLookup = <\n TState,\n TMethods extends ClientMethods,\n M extends Record<string | number | symbol, any>,\n>(\n map: M,\n getElement: (\n t: M[keyof M],\n key: keyof M,\n ) => ResourceElement<ClientOutputOf<TState, TMethods>>,\n getElementDeps: any[],\n): {\n state: TState[];\n get: (lookup: { index: number } | { key: keyof M }) => TMethods;\n} => {\n const resources = tapResources(\n map,\n (t, key) => ClientResource(getElement(t, key)),\n getElementDeps,\n );\n const keys = tapMemo(() => Object.keys(map) as (keyof M)[], [map]);\n\n const state = tapMemo(() => {\n const result = new Array(keys.length);\n for (let i = 0; i < keys.length; i++) {\n result[i] = resources[keys[i]!].state;\n }\n return result;\n }, [keys, resources]);\n\n return {\n state,\n get: (lookup: { index: number } | { key: keyof M }) => {\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[keys[lookup.index]!]!.methods;\n }\n\n const value = resources[lookup.key];\n if (!value) {\n throw new Error(\n `tapClientLookup: Key \"${String(lookup.key)}\" not found`,\n );\n }\n return value.methods;\n },\n };\n};\n"],"mappings":";AAAA,SAA0B,SAAS,oBAAoB;AAEvD,SAAS,sBAAsB;AAExB,IAAM,kBAAkB,CAK7B,KACA,YAIA,mBAIG;AACH,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,CAAC,GAAG,QAAQ,eAAe,WAAW,GAAG,GAAG,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,MAAM,OAAO,KAAK,GAAG,GAAkB,CAAC,GAAG,CAAC;AAEjE,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,SAAS,IAAI,MAAM,KAAK,MAAM;AACpC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,aAAO,CAAC,IAAI,UAAU,KAAK,CAAC,CAAE,EAAE;AAAA,IAClC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,SAAO;AAAA,IACL;AAAA,IACA,KAAK,CAAC,WAAiD;AACrD,UAAI,WAAW,QAAQ;AACrB,YAAI,OAAO,QAAQ,KAAK,OAAO,SAAS,KAAK,QAAQ;AACnD,gBAAM,IAAI;AAAA,YACR,0BAA0B,OAAO,KAAK,2BAA2B,KAAK,MAAM;AAAA,UAC9E;AAAA,QACF;AACA,eAAO,UAAU,KAAK,OAAO,KAAK,CAAE,EAAG;AAAA,MACzC;AAEA,YAAM,QAAQ,UAAU,OAAO,GAAG;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,yBAAyB,OAAO,OAAO,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF;AACA,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,24 @@
1
+ import { type ResourceElement } from "@assistant-ui/tap";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client";
3
+ export declare const getClientState: (client: ClientMethods) => unknown;
4
+ /**
5
+ * Resource that wraps a plain resource element to create a stable client proxy.
6
+ *
7
+ * Takes a ResourceElement that returns { state, methods } and
8
+ * wraps it to produce a stable client proxy. This adds the client to the
9
+ * client stack, enabling event scoping.
10
+ *
11
+ * Use this for 1:1 client mappings where you want event scoping to work correctly.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const MessageResource = resource(({ messageId }: { messageId: string }) => {
16
+ * return tapInlineResource(
17
+ * tapClientResource(InnerMessageResource({ messageId }))
18
+ * );
19
+ * });
20
+ * ```
21
+ */
22
+ export declare const ClientResource: <TState, TMethods extends ClientMethods>(props: ResourceElement<ClientOutputOf<TState, TMethods>>) => ResourceElement<ClientOutputOf<TState, TMethods>, ResourceElement<ClientOutputOf<TState, TMethods>>>;
23
+ export declare const tapClientResource: <TState, TMethods extends ClientMethods>(element: ResourceElement<ClientOutputOf<TState, TMethods>>) => ClientOutputOf<TState, TMethods>;
24
+ //# sourceMappingURL=tapClientResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tapClientResource.d.ts","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqBpE,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,YASnD,CAAC;AA2DF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GACxB,MAAM,EAAE,QAAQ,SAAS,aAAa,mKA4BxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,EAAE,QAAQ,SAAS,aAAa,EACtE,SAAS,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,qCAG3D,CAAC"}
@@ -0,0 +1,100 @@
1
+ // src/tapClientResource.ts
2
+ import {
3
+ tapEffect,
4
+ tapMemo,
5
+ tapRef,
6
+ tapResource,
7
+ resource,
8
+ tapInlineResource
9
+ } from "@assistant-ui/tap";
10
+ import {
11
+ tapClientStack,
12
+ tapWithClientStack,
13
+ SYMBOL_CLIENT_INDEX
14
+ } from "./utils/tap-client-stack-context.js";
15
+ import {
16
+ BaseProxyHandler,
17
+ handleIntrospectionProp
18
+ } from "./utils/BaseProxyHandler.js";
19
+ var SYMBOL_GET_OUTPUT = /* @__PURE__ */ Symbol("assistant-ui.store.getValue");
20
+ var getClientState = (client) => {
21
+ const output = client[SYMBOL_GET_OUTPUT];
22
+ if (!output) {
23
+ throw new Error(
24
+ "Client scope contains a non-client resource. Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource."
25
+ );
26
+ }
27
+ return output.state;
28
+ };
29
+ var fieldAccessFns = /* @__PURE__ */ new Map();
30
+ function getOrCreateProxyFn(prop) {
31
+ let template = fieldAccessFns.get(prop);
32
+ if (!template) {
33
+ template = function(...args) {
34
+ if (!this)
35
+ throw new Error(
36
+ `Destructuring the client method "${String(prop)}" is not supported.`
37
+ );
38
+ const method = this[SYMBOL_GET_OUTPUT].methods[prop];
39
+ if (!method)
40
+ throw new Error(`Method "${String(prop)}" is not implemented.`);
41
+ return method(...args);
42
+ };
43
+ fieldAccessFns.set(prop, template);
44
+ }
45
+ return template;
46
+ }
47
+ var ClientProxyHandler = class extends BaseProxyHandler {
48
+ constructor(outputRef, index) {
49
+ super();
50
+ this.outputRef = outputRef;
51
+ this.index = index;
52
+ }
53
+ get(_, prop) {
54
+ if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;
55
+ if (prop === SYMBOL_CLIENT_INDEX) return this.index;
56
+ const introspection = handleIntrospectionProp(prop, "ClientProxy");
57
+ if (introspection !== false) return introspection;
58
+ return getOrCreateProxyFn(prop);
59
+ }
60
+ ownKeys() {
61
+ return Object.keys(this.outputRef.current.methods);
62
+ }
63
+ has(_, prop) {
64
+ if (prop === SYMBOL_GET_OUTPUT) return true;
65
+ if (prop === SYMBOL_CLIENT_INDEX) return true;
66
+ return prop in this.outputRef.current.methods;
67
+ }
68
+ };
69
+ var ClientResource = resource(
70
+ (element) => {
71
+ const valueRef = tapRef(
72
+ null
73
+ );
74
+ const index = tapClientStack().length;
75
+ const methods = tapMemo(
76
+ () => new Proxy(
77
+ {},
78
+ new ClientProxyHandler(valueRef, index)
79
+ ),
80
+ []
81
+ );
82
+ const value = tapWithClientStack(methods, () => tapResource(element));
83
+ if (!valueRef.current) {
84
+ valueRef.current = value;
85
+ }
86
+ tapEffect(() => {
87
+ valueRef.current = value;
88
+ });
89
+ return { methods, state: value.state };
90
+ }
91
+ );
92
+ var tapClientResource = (element) => {
93
+ return tapInlineResource(ClientResource(element));
94
+ };
95
+ export {
96
+ ClientResource,
97
+ getClientState,
98
+ tapClientResource
99
+ };
100
+ //# sourceMappingURL=tapClientResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tapClientResource.ts"],"sourcesContent":["import {\n tapEffect,\n tapMemo,\n tapRef,\n type ResourceElement,\n tapResource,\n resource,\n tapInlineResource,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods, ClientOutputOf } 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\";\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]: ClientOutputOf<unknown, 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.state;\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: ClientInternal, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: ClientInternal | undefined, ...args: unknown[]) {\n if (!this)\n throw new Error(\n `Destructuring the client method \"${String(prop)}\" is not supported.`,\n );\n\n const method = this[SYMBOL_GET_OUTPUT].methods[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\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 constructor(\n private readonly outputRef: {\n current: ClientOutputOf<unknown, ClientMethods>;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol) {\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 return getOrCreateProxyFn(prop);\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current.methods);\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.methods;\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 { state, methods } and\n * wraps it to produce a stable client proxy. This adds the client to the\n * client stack, enabling event scoping.\n *\n * Use this for 1:1 client mappings where you want event scoping to work correctly.\n *\n * @example\n * ```typescript\n * const MessageResource = resource(({ messageId }: { messageId: string }) => {\n * return tapInlineResource(\n * tapClientResource(InnerMessageResource({ messageId }))\n * );\n * });\n * ```\n */\nexport const ClientResource = resource(\n <TState, TMethods extends ClientMethods>(\n element: ResourceElement<ClientOutputOf<TState, TMethods>>,\n ): ClientOutputOf<TState, TMethods> => {\n const valueRef = tapRef(\n null as unknown as ClientOutputOf<TState, TMethods>,\n );\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 [],\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 return { methods, state: value.state };\n },\n);\n\nexport const tapClientResource = <TState, TMethods extends ClientMethods>(\n element: ResourceElement<ClientOutputOf<TState, TMethods>>,\n) => {\n return tapInlineResource(ClientResource(element));\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAMP,IAAM,oBAAoB,uBAAO,6BAA6B;AAMvD,IAAM,iBAAiB,CAAC,WAA0B;AACvD,QAAM,SAAU,OAAqC,iBAAiB;AACtE,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,OAAO;AAChB;AAGA,IAAM,iBAAiB,oBAAI,IAGzB;AAEF,SAAS,mBAAmB,MAAuB;AACjD,MAAI,WAAW,eAAe,IAAI,IAAI;AACtC,MAAI,CAAC,UAAU;AACb,eAAW,YAA+C,MAAiB;AACzE,UAAI,CAAC;AACH,cAAM,IAAI;AAAA,UACR,oCAAoC,OAAO,IAAI,CAAC;AAAA,QAClD;AAEF,YAAM,SAAS,KAAK,iBAAiB,EAAE,QAAQ,IAAI;AACnD,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,WAAW,OAAO,IAAI,CAAC,uBAAuB;AAChE,aAAO,OAAO,GAAG,IAAI;AAAA,IACvB;AACA,mBAAe,IAAI,MAAM,QAAQ;AAAA,EACnC;AACA,SAAO;AACT;AAEA,IAAM,qBAAN,cACU,iBAEV;AAAA,EACE,YACmB,WAGA,OACjB;AACA,UAAM;AALW;AAGA;AAAA,EAGnB;AAAA,EAEA,IAAI,GAAY,MAAuB;AACrC,QAAI,SAAS,kBAAmB,QAAO,KAAK,UAAU;AACtD,QAAI,SAAS,oBAAqB,QAAO,KAAK;AAC9C,UAAM,gBAAgB,wBAAwB,MAAM,aAAa;AACjE,QAAI,kBAAkB,MAAO,QAAO;AACpC,WAAO,mBAAmB,IAAI;AAAA,EAChC;AAAA,EAEA,UAAsC;AACpC,WAAO,OAAO,KAAK,KAAK,UAAU,QAAQ,OAAO;AAAA,EACnD;AAAA,EAEA,IAAI,GAAY,MAAuB;AACrC,QAAI,SAAS,kBAAmB,QAAO;AACvC,QAAI,SAAS,oBAAqB,QAAO;AACzC,WAAO,QAAQ,KAAK,UAAU,QAAQ;AAAA,EACxC;AACF;AAoBO,IAAM,iBAAiB;AAAA,EAC5B,CACE,YACqC;AACrC,UAAM,WAAW;AAAA,MACf;AAAA,IACF;AAEA,UAAM,QAAQ,eAAe,EAAE;AAC/B,UAAM,UAAU;AAAA,MACd,MACE,IAAI;AAAA,QACF,CAAC;AAAA,QACD,IAAI,mBAAmB,UAAU,KAAK;AAAA,MACxC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,QAAQ,mBAAmB,SAAS,MAAM,YAAY,OAAO,CAAC;AACpE,QAAI,CAAC,SAAS,SAAS;AACrB,eAAS,UAAU;AAAA,IACrB;AAEA,cAAU,MAAM;AACd,eAAS,UAAU;AAAA,IACrB,CAAC;AAED,WAAO,EAAE,SAAS,OAAO,MAAM,MAAM;AAAA,EACvC;AACF;AAEO,IAAM,oBAAoB,CAC/B,YACG;AACH,SAAO,kBAAkB,eAAe,OAAO,CAAC;AAClD;","names":[]}
@@ -0,0 +1,117 @@
1
+ import type { ResourceElement } from "@assistant-ui/tap";
2
+ import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./events";
3
+ /**
4
+ * Base type for methods that can be called on a client.
5
+ */
6
+ export interface ClientMethods {
7
+ [key: string | symbol]: (...args: any[]) => any;
8
+ }
9
+ type ClientMetaType = {
10
+ source: ClientNames;
11
+ query: Record<string, unknown>;
12
+ };
13
+ /**
14
+ * Module augmentation interface for assistant-ui store type extensions.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * declare module "@assistant-ui/store" {
19
+ * interface ClientRegistry {
20
+ * // Simple client (meta and events are optional)
21
+ * foo: {
22
+ * state: { bar: string };
23
+ * methods: { updateBar: (bar: string) => void };
24
+ * };
25
+ * // Full client with meta and events
26
+ * bar: {
27
+ * state: { id: string };
28
+ * methods: { update: () => void };
29
+ * meta: { source: "fooList"; query: { index: number } };
30
+ * events: {
31
+ * "bar.updated": { id: string };
32
+ * };
33
+ * };
34
+ * }
35
+ * }
36
+ * ```
37
+ */
38
+ export interface ClientRegistry {
39
+ }
40
+ type ClientEventsType<K extends ClientNames> = Record<`${K}.${string}`, unknown>;
41
+ type ClientError<E extends string> = {
42
+ state: E;
43
+ methods: Record<E, () => E>;
44
+ meta: {
45
+ source: ClientNames;
46
+ query: Record<E, E>;
47
+ };
48
+ events: Record<`${E}.`, E>;
49
+ };
50
+ type ValidateClient<K extends keyof ClientRegistry> = ClientRegistry[K] extends {
51
+ methods: ClientMethods;
52
+ } ? "meta" extends keyof ClientRegistry[K] ? ClientRegistry[K]["meta"] extends ClientMetaType ? "events" extends keyof ClientRegistry[K] ? ClientRegistry[K]["events"] extends ClientEventsType<K> ? ClientRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ClientRegistry[K] : ClientError<`ERROR: ${K & string} has invalid meta type`> : "events" extends keyof ClientRegistry[K] ? ClientRegistry[K]["events"] extends ClientEventsType<K> ? ClientRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ClientRegistry[K] : ClientError<`ERROR: ${K & string} has invalid methods type`>;
53
+ type ClientSchemas = keyof ClientRegistry extends never ? {
54
+ "ERROR: No clients were defined": ClientError<"ERROR: No clients were defined">;
55
+ } : {
56
+ [K in keyof ClientRegistry]: ValidateClient<K>;
57
+ };
58
+ /**
59
+ * Output type that client resources return with state and methods.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const FooResource = resource((): ClientResourceOutput<"foo"> => {
64
+ * const [state, setState] = tapState({ bar: "hello" });
65
+ * return {
66
+ * state,
67
+ * methods: {
68
+ * updateBar: (b) => setState({ bar: b })
69
+ * }
70
+ * };
71
+ * });
72
+ * ```
73
+ */
74
+ export type ClientOutput<K extends ClientNames> = ClientOutputOf<ClientSchemas[K]["state"], ClientSchemas[K]["methods"] & ClientMethods>;
75
+ /**
76
+ * Generic version of ClientResourceOutput for library code.
77
+ */
78
+ export type ClientOutputOf<TState, TMethods extends ClientMethods> = {
79
+ state: TState;
80
+ methods: TMethods;
81
+ };
82
+ export type ClientNames = keyof ClientSchemas extends infer U ? U : never;
83
+ export type ClientEvents<K extends ClientNames> = "events" extends keyof ClientSchemas[K] ? ClientSchemas[K]["events"] extends ClientEventsType<K> ? ClientSchemas[K]["events"] : never : never;
84
+ export type ClientMeta<K extends ClientNames> = "meta" extends keyof ClientSchemas[K] ? Pick<ClientSchemas[K]["meta"] extends ClientMetaType ? ClientSchemas[K]["meta"] : never, "source" | "query"> : never;
85
+ export type ClientElement<K extends ClientNames> = ResourceElement<ClientOutput<K>>;
86
+ /**
87
+ * Unsubscribe function type.
88
+ */
89
+ export type Unsubscribe = () => void;
90
+ /**
91
+ * State type extracted from all clients.
92
+ */
93
+ export type AssistantState = {
94
+ [K in ClientNames]: ClientSchemas[K]["state"];
95
+ };
96
+ /**
97
+ * Type for a client accessor - a function that returns the methods,
98
+ * with source/query metadata attached (derived from meta).
99
+ */
100
+ export type AssistantClientAccessor<K extends ClientNames> = (() => ClientSchemas[K]["methods"]) & (ClientMeta<K> | {
101
+ source: "root";
102
+ query: Record<string, never>;
103
+ } | {
104
+ source: null;
105
+ query: null;
106
+ });
107
+ /**
108
+ * The assistant client type with all registered clients.
109
+ */
110
+ export type AssistantClient = {
111
+ [K in ClientNames]: AssistantClientAccessor<K>;
112
+ } & {
113
+ subscribe(listener: () => void): Unsubscribe;
114
+ on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe;
115
+ };
116
+ export {};
117
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/types/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1,33 @@
1
+ import type { AssistantClientAccessor, ClientEvents, ClientNames } from "./client";
2
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
3
+ type ClientEventMap = UnionToIntersection<{
4
+ [K in ClientNames]: ClientEvents<K>;
5
+ }[ClientNames]>;
6
+ type WildcardPayload = {
7
+ [K in keyof ClientEventMap]: {
8
+ event: K;
9
+ payload: ClientEventMap[K];
10
+ };
11
+ }[keyof ClientEventMap];
12
+ export type AssistantEventPayload = ClientEventMap & {
13
+ "*": WildcardPayload;
14
+ };
15
+ export type AssistantEventName = keyof AssistantEventPayload;
16
+ type EventSource<T extends AssistantEventName> = T extends `${infer Source}.${string}` ? Source : never;
17
+ type ParentOf<K extends ClientNames> = AssistantClientAccessor<K> extends {
18
+ source: infer S;
19
+ } ? S extends ClientNames ? S : never : never;
20
+ 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>;
21
+ /** Valid scopes: `"*"` | event source | ancestors of event source */
22
+ export type AssistantEventScope<TEvent extends AssistantEventName> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends ClientNames ? AncestorsOf<EventSource<TEvent>> : never);
23
+ export type AssistantEventSelector<TEvent extends AssistantEventName> = TEvent | {
24
+ scope: AssistantEventScope<TEvent>;
25
+ event: TEvent;
26
+ };
27
+ export declare const normalizeEventSelector: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>) => {
28
+ scope: AssistantEventScope<TEvent>;
29
+ event: TEvent;
30
+ };
31
+ export type AssistantEventCallback<TEvent extends AssistantEventName> = (payload: AssistantEventPayload[TEvent]) => void;
32
+ export {};
33
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
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,MAAM,UAAU,CAAC;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"}
@@ -0,0 +1,12 @@
1
+ // src/types/events.ts
2
+ var normalizeEventSelector = (selector) => {
3
+ if (typeof selector === "string") {
4
+ const source = selector.split(".")[0];
5
+ return { scope: source, event: selector };
6
+ }
7
+ return { scope: selector.scope, event: selector.event };
8
+ };
9
+ export {
10
+ normalizeEventSelector
11
+ };
12
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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":";AAgEO,IAAM,yBAAyB,CACpC,aACG;AACH,MAAI,OAAO,aAAa,UAAU;AAChC,UAAM,SAAS,SAAS,MAAM,GAAG,EAAE,CAAC;AACpC,WAAO,EAAE,OAAO,QAAQ,OAAO,SAAS;AAAA,EAC1C;AACA,SAAO,EAAE,OAAO,SAAS,OAAO,OAAO,SAAS,MAAM;AACxD;","names":[]}
@@ -1,50 +1,17 @@
1
- import type { AssistantClient, AssistantScopes, ScopesInput, ScopeField } from "./types";
2
- import { type AssistantEvent, type AssistantEventCallback, type AssistantEventSelector } from "./EventContext";
1
+ import type { AssistantClient, ClientNames, ClientElement } from "./types/client";
2
+ import { DerivedElement } from "./Derived";
3
3
  /**
4
- * Hook to mount and access root scopes
5
- */
6
- export declare const useRootScopes: (rootScopes: ScopesInput, parent: AssistantClient) => {
7
- scopes: {};
8
- on: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => () => void;
9
- subscribe?: never;
10
- flushSync?: never;
11
- } | {
12
- scopes: { [K in "ERROR: No scopes were defined"]: ScopeField<AssistantScopes[K]>; };
13
- subscribe: (callback: () => void) => () => void;
14
- flushSync: () => void;
15
- on: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>) => () => void;
16
- };
17
- /**
18
- * Hook to mount and access derived scopes
19
- */
20
- export declare const useDerivedScopes: (derivedScopes: ScopesInput, parentClient: AssistantClient) => {
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>>>;
27
- };
28
- /**
29
- * Hook to access or extend the AssistantClient
30
- *
31
- * @example Without config - returns the client from context:
32
- * ```typescript
33
- * const client = useAssistantClient();
34
- * const fooState = client.foo.getState();
35
- * ```
36
- *
37
- * @example With config - creates a new client with additional scopes:
38
- * ```typescript
39
- * const client = useAssistantClient({
40
- * message: DerivedScope({
41
- * source: "thread",
42
- * query: { type: "index", index: 0 },
43
- * get: () => messageApi,
44
- * }),
45
- * });
46
- * ```
4
+ * Resource that creates an extended AssistantClient.
47
5
  */
6
+ export declare const AssistantClientResource: import("@assistant-ui/tap").Resource<AssistantClient, {
7
+ baseClient: AssistantClient;
8
+ clients: useAssistantClient.Props;
9
+ }>;
10
+ export declare namespace useAssistantClient {
11
+ type Props = {
12
+ [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;
13
+ };
14
+ }
48
15
  export declare function useAssistantClient(): AssistantClient;
49
- export declare function useAssistantClient(scopes: ScopesInput): AssistantClient;
16
+ export declare function useAssistantClient(clients: useAssistantClient.Props): AssistantClient;
50
17
  //# sourceMappingURL=useAssistantClient.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"useAssistantClient.d.ts","sourceRoot":"","sources":["../src/useAssistantClient.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,eAAe,EAEf,WAAW,EACX,aAAa,EAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAW,cAAc,EAAE,MAAM,WAAW,CAAC;AAmOpD;;GAEG;AACH,eAAO,MAAM,uBAAuB;gBAKpB,eAAe;aAClB,kBAAkB,CAAC,KAAK;EA4CpC,CAAC;AAEF,yBAAiB,kBAAkB,CAAC;IAClC,KAAY,KAAK,GAAG;SACjB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;KAC1D,CAAC;CACH;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAAC;AACtD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,kBAAkB,CAAC,KAAK,GAChC,eAAe,CAAC"}