@assistant-ui/store 0.0.1 → 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 +10 -0
  3. package/dist/AssistantIf.d.ts.map +1 -0
  4. package/dist/AssistantIf.js +13 -0
  5. package/dist/AssistantIf.js.map +1 -0
  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 +11 -14
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +19 -16
  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 -41
  38. package/dist/useAssistantClient.d.ts.map +1 -1
  39. package/dist/useAssistantClient.js +185 -130
  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 +5 -6
  82. package/src/AssistantIf.tsx +17 -0
  83. package/src/Derived.ts +46 -0
  84. package/src/attachDefaultPeers.ts +78 -0
  85. package/src/index.ts +31 -25
  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 +259 -217
  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 -18
  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 -65
  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 -88
  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 -21
  146. package/src/EventContext.ts +0 -184
  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 -129
  154. package/src/utils/splitScopes.ts +0 -38
  155. /package/dist/{types.js.map → types/client.js.map} +0 -0
@@ -1,18 +0,0 @@
1
- import type { ScopeDefinition, ScopeValue, DerivedScopeProps } from "./types";
2
- /**
3
- * Creates a derived scope field that memoizes based on source and query.
4
- * The get callback always calls the most recent version (useEffectEvent pattern).
5
- *
6
- * @example
7
- * ```typescript
8
- * const MessageScope = DerivedScope<MessageScopeDefinition>({
9
- * source: "thread",
10
- * query: { type: "index", index: 0 },
11
- * get: () => messageApi,
12
- * });
13
- * ```
14
- */
15
- export declare const DerivedScope: <T extends ScopeDefinition>(props: DerivedScopeProps<T>, options?: {
16
- key?: string | number;
17
- } | undefined) => import("@assistant-ui/tap").ResourceElement<ScopeValue<T>, DerivedScopeProps<T>>;
18
- //# sourceMappingURL=DerivedScope.d.ts.map
@@ -1 +0,0 @@
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,11 +0,0 @@
1
- // src/DerivedScope.ts
2
- import { resource } from "@assistant-ui/tap";
3
- var DerivedScope = resource(
4
- (config) => {
5
- return config;
6
- }
7
- );
8
- export {
9
- DerivedScope
10
- };
11
- //# sourceMappingURL=DerivedScope.js.map
@@ -1 +0,0 @@
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,65 +0,0 @@
1
- import type { Unsubscribe } from "./types";
2
- /**
3
- * Module augmentation interface for custom events.
4
- *
5
- * @example
6
- * ```typescript
7
- * declare module "@assistant-ui/store" {
8
- * interface AssistantEventRegistry {
9
- * "thread.run-start": { threadId: string };
10
- * "custom.my-event": { data: string };
11
- * }
12
- * }
13
- * ```
14
- */
15
- export interface AssistantEventRegistry {
16
- }
17
- /**
18
- * Module augmentation interface for event scope configuration.
19
- * Maps event sources to their parent scopes.
20
- *
21
- * @example
22
- * ```typescript
23
- * declare module "@assistant-ui/store" {
24
- * interface AssistantEventScopeConfig {
25
- * composer: "thread" | "message";
26
- * thread: never;
27
- * }
28
- * }
29
- * ```
30
- */
31
- export interface AssistantEventScopeConfig {
32
- }
33
- export type AssistantEventMap = AssistantEventRegistry & {
34
- "*": {
35
- [K in Exclude<keyof AssistantEventRegistry, "*">]: {
36
- event: K;
37
- payload: AssistantEventRegistry[K];
38
- };
39
- }[Exclude<keyof AssistantEventRegistry, "*">];
40
- };
41
- export type AssistantEvent = keyof AssistantEventMap;
42
- export type EventSource<T extends AssistantEvent = AssistantEvent> = T extends `${infer Source}.${string}` ? Source : never;
43
- export type SourceByScope<TScope extends AssistantEventScope<AssistantEvent>> = (TScope extends "*" ? EventSource : never) | (TScope extends keyof AssistantEventScopeConfig ? TScope : never) | {
44
- [K in keyof AssistantEventScopeConfig]: TScope extends AssistantEventScopeConfig[K] ? K : never;
45
- }[keyof AssistantEventScopeConfig];
46
- export type AssistantEventScope<TEvent extends AssistantEvent> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends keyof AssistantEventScopeConfig ? AssistantEventScopeConfig[EventSource<TEvent>] : never);
47
- export type AssistantEventSelector<TEvent extends AssistantEvent> = TEvent | {
48
- scope: AssistantEventScope<TEvent>;
49
- event: TEvent;
50
- };
51
- export declare const normalizeEventSelector: <TEvent extends AssistantEvent>(selector: AssistantEventSelector<TEvent>) => {
52
- scope: AssistantEventScope<TEvent>;
53
- event: TEvent;
54
- };
55
- 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}`>;
56
- export type AssistantEventCallback<TEvent extends AssistantEvent> = (payload: AssistantEventMap[TEvent]) => void;
57
- export type EventManager = {
58
- on<TEvent extends AssistantEvent>(event: TEvent, callback: AssistantEventCallback<TEvent>): Unsubscribe;
59
- emit<TEvent extends Exclude<AssistantEvent, "*">>(event: TEvent, payload: AssistantEventMap[TEvent]): void;
60
- };
61
- export declare const EventManager: () => import("@assistant-ui/tap").ResourceElement<{
62
- on: <TEvent extends AssistantEvent>(event: TEvent, callback: AssistantEventCallback<TEvent>) => () => void;
63
- emit: <TEvent extends Exclude<AssistantEvent, "*">>(event: TEvent, payload: AssistantEventMap[TEvent]) => void;
64
- }, undefined>;
65
- //# sourceMappingURL=EventContext.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventContext.d.ts","sourceRoot":"","sources":["../src/EventContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,sBAAsB;CAAG;AAE1C;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,yBAAyB;CAAG;AAE7C,MAAM,MAAM,iBAAiB,GAAG,sBAAsB,GAAG;IAEvD,GAAG,EAAE;SACF,CAAC,IAAI,OAAO,CAAC,MAAM,sBAAsB,EAAE,GAAG,CAAC,GAAG;YACjD,KAAK,EAAE,CAAC,CAAC;YACT,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAC;SACpC;KACF,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,GAAG,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC;AAErD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAC/D,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzD,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,mBAAmB,CAAC,cAAc,CAAC,IACxE,CAAC,MAAM,SAAS,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,GAC1C,CAAC,MAAM,SAAS,MAAM,yBAAyB,GAAG,MAAM,GAAG,KAAK,CAAC,GACjE;KACG,CAAC,IAAI,MAAM,yBAAyB,GAAG,MAAM,SAAS,yBAAyB,CAAC,CAAC,CAAC,GAC/E,CAAC,GACD,KAAK;CACV,CAAC,MAAM,yBAAyB,CAAC,CAAC;AAEvC,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,cAAc,IACzD,GAAG,GACH,WAAW,CAAC,MAAM,CAAC,GACnB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,MAAM,yBAAyB,GACxD,yBAAyB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAC9C,KAAK,CAAC,CAAC;AAEf,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,cAAc,IAC5D,MAAM,GACN;IACE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEN,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,cAAc,EAClE,UAAU,sBAAsB,CAAC,MAAM,CAAC;;;CAczC,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,SAAS,cAAc,EAC7B,cAAc,SAAS,mBAAmB,CAAC,cAAc,CAAC,EAE1D,eAAe,cAAc,EAC7B,OAAO,mBAAmB,CAAC,MAAM,CAAC,EAClC,QAAQ,MAAM,KACb,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,cAAc,CAAC,IAAI,MAAM,EAAE,CAExE,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,cAAc,IAAI,CAClE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAC/B,IAAI,CAAC;AAEV,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,CAAC,MAAM,SAAS,cAAc,EAC9B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,sBAAsB,CAAC,MAAM,CAAC,GACvC,WAAW,CAAC;IACf,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,EAC9C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,GACjC,IAAI,CAAC;CACT,CAAC;AAeF,eAAO,MAAM,YAAY;SAvBpB,MAAM,SAAS,cAAc;WAI3B,MAAM,SAAS,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;aAwEhD,CAAC"}
@@ -1,62 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/EventContext.ts"],"sourcesContent":["import { resource, tapMemo } from \"@assistant-ui/tap\";\nimport type { Unsubscribe } from \"./types\";\n\n/**\n * Module augmentation interface for custom events.\n *\n * @example\n * ```typescript\n * declare module \"@assistant-ui/store\" {\n * interface AssistantEventRegistry {\n * \"thread.run-start\": { threadId: string };\n * \"custom.my-event\": { data: string };\n * }\n * }\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AssistantEventRegistry {}\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 */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface AssistantEventScopeConfig {}\n\nexport type AssistantEventMap = AssistantEventRegistry & {\n // Catch-all\n \"*\": {\n [K in Exclude<keyof AssistantEventRegistry, \"*\">]: {\n event: K;\n payload: AssistantEventRegistry[K];\n };\n }[Exclude<keyof AssistantEventRegistry, \"*\">];\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 (\n callback as (payload: {\n event: typeof event;\n payload: typeof payload;\n }) => void\n )({ event, payload });\n }\n }\n });\n },\n } satisfies EventManager;\n }, []);\n\n return events;\n});\n"],"mappings":";AAAA,SAAS,UAAU,eAAe;AA0E3B,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,cACE,SAIA,EAAE,OAAO,QAAQ,CAAC;AAAA,YACtB;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT,CAAC;","names":[]}
@@ -1,41 +0,0 @@
1
- import type { AssistantScopes } from "./types";
2
- import type { ResourceElement } from "@assistant-ui/tap";
3
- type ScopeRegistryEntry<K extends keyof AssistantScopes> = {
4
- name: K;
5
- defaultInitialize: ResourceElement<AssistantScopes[K]["value"]> | {
6
- error: string;
7
- };
8
- };
9
- /**
10
- * Register a default scope implementation.
11
- * This allows scopes to have default values when not explicitly provided.
12
- *
13
- * @example With a resource:
14
- * ```typescript
15
- * registerAssistantScope({
16
- * name: "myScope",
17
- * defaultInitialize: MyResource(),
18
- * });
19
- * ```
20
- *
21
- * @example With an error:
22
- * ```typescript
23
- * registerAssistantScope({
24
- * name: "myScope",
25
- * defaultInitialize: { error: "MyScope is not configured" },
26
- * });
27
- * ```
28
- */
29
- export declare function registerAssistantScope<K extends keyof AssistantScopes>(config: ScopeRegistryEntry<K>): void;
30
- /**
31
- * Get the default initializer for a scope, if registered.
32
- */
33
- export declare function getDefaultScopeInitializer<K extends keyof AssistantScopes>(name: K): (ResourceElement<AssistantScopes[K]["value"]> | {
34
- error: string;
35
- }) | undefined;
36
- /**
37
- * Get all registered scope names.
38
- */
39
- export declare function hasRegisteredScope(name: keyof AssistantScopes): boolean;
40
- export {};
41
- //# sourceMappingURL=ScopeRegistry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScopeRegistry.d.ts","sourceRoot":"","sources":["../src/ScopeRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,KAAK,kBAAkB,CAAC,CAAC,SAAS,MAAM,eAAe,IAAI;IACzD,IAAI,EAAE,CAAC,CAAC;IACR,iBAAiB,EACb,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAC5C;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvB,CAAC;AAOF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,eAAe,EACpE,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,MAAM,eAAe,EACxE,IAAI,EAAE,CAAC,GAEL,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,SAAS,CAEZ;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,eAAe,GAAG,OAAO,CAEvE"}
@@ -1,17 +0,0 @@
1
- // src/ScopeRegistry.ts
2
- var scopeRegistry = /* @__PURE__ */ new Map();
3
- function registerAssistantScope(config) {
4
- scopeRegistry.set(config.name, config.defaultInitialize);
5
- }
6
- function getDefaultScopeInitializer(name) {
7
- return scopeRegistry.get(name);
8
- }
9
- function hasRegisteredScope(name) {
10
- return scopeRegistry.has(name);
11
- }
12
- export {
13
- getDefaultScopeInitializer,
14
- hasRegisteredScope,
15
- registerAssistantScope
16
- };
17
- //# sourceMappingURL=ScopeRegistry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/ScopeRegistry.ts"],"sourcesContent":["import type { AssistantScopes } from \"./types\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\n\ntype ScopeRegistryEntry<K extends keyof AssistantScopes> = {\n name: K;\n defaultInitialize:\n | ResourceElement<AssistantScopes[K][\"value\"]>\n | { error: string };\n};\n\nconst scopeRegistry = new Map<\n keyof AssistantScopes,\n ResourceElement<any> | { error: string }\n>();\n\n/**\n * Register a default scope implementation.\n * This allows scopes to have default values when not explicitly provided.\n *\n * @example With a resource:\n * ```typescript\n * registerAssistantScope({\n * name: \"myScope\",\n * defaultInitialize: MyResource(),\n * });\n * ```\n *\n * @example With an error:\n * ```typescript\n * registerAssistantScope({\n * name: \"myScope\",\n * defaultInitialize: { error: \"MyScope is not configured\" },\n * });\n * ```\n */\nexport function registerAssistantScope<K extends keyof AssistantScopes>(\n config: ScopeRegistryEntry<K>,\n): void {\n scopeRegistry.set(config.name, config.defaultInitialize);\n}\n\n/**\n * Get the default initializer for a scope, if registered.\n */\nexport function getDefaultScopeInitializer<K extends keyof AssistantScopes>(\n name: K,\n):\n | (ResourceElement<AssistantScopes[K][\"value\"]> | { error: string })\n | undefined {\n return scopeRegistry.get(name);\n}\n\n/**\n * Get all registered scope names.\n */\nexport function hasRegisteredScope(name: keyof AssistantScopes): boolean {\n return scopeRegistry.has(name);\n}\n"],"mappings":";AAUA,IAAM,gBAAgB,oBAAI,IAGxB;AAsBK,SAAS,uBACd,QACM;AACN,gBAAc,IAAI,OAAO,MAAM,OAAO,iBAAiB;AACzD;AAKO,SAAS,2BACd,MAGY;AACZ,SAAO,cAAc,IAAI,IAAI;AAC/B;AAKO,SAAS,mBAAmB,MAAsC;AACvE,SAAO,cAAc,IAAI,IAAI;AAC/B;","names":[]}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,20 +0,0 @@
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
@@ -1 +0,0 @@
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/asStore.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import { ResourceElement } from "@assistant-ui/tap";
2
- import { Unsubscribe } from "./types";
3
- export interface Store<TState> {
4
- /**
5
- * Get the current state of the store.
6
- */
7
- getState(): TState;
8
- /**
9
- * Subscribe to the store.
10
- */
11
- subscribe(listener: () => void): Unsubscribe;
12
- /**
13
- * Synchronously flush all the updates to the store.
14
- */
15
- flushSync(): void;
16
- }
17
- export declare const asStore: <TState, TProps>(props: ResourceElement<TState, TProps>, options?: {
18
- key?: string | number;
19
- } | undefined) => ResourceElement<Store<TState>, ResourceElement<TState, TProps>>;
20
- //# sourceMappingURL=asStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"asStore.d.ts","sourceRoot":"","sources":["../src/asStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EAGhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,WAAW,KAAK,CAAC,MAAM;IAC3B;;OAEG;IACH,QAAQ,IAAI,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAE7C;;OAEG;IACH,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GACjB,MAAM,EAAE,MAAM;;iFAYhB,CAAC"}
package/dist/asStore.js DELETED
@@ -1,23 +0,0 @@
1
- // src/asStore.ts
2
- import {
3
- tapMemo,
4
- tapEffect,
5
- resource,
6
- createResource
7
- } from "@assistant-ui/tap";
8
- var asStore = resource(
9
- (element) => {
10
- const resource2 = tapMemo(
11
- () => createResource(element, true),
12
- [element.type]
13
- );
14
- tapEffect(() => {
15
- resource2.updateInput(element.props);
16
- });
17
- return resource2;
18
- }
19
- );
20
- export {
21
- asStore
22
- };
23
- //# sourceMappingURL=asStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/asStore.ts"],"sourcesContent":["import {\n tapMemo,\n tapEffect,\n ResourceElement,\n resource,\n createResource,\n} from \"@assistant-ui/tap\";\nimport { Unsubscribe } from \"./types\";\n\nexport interface Store<TState> {\n /**\n * Get the current state of the store.\n */\n getState(): TState;\n\n /**\n * Subscribe to the store.\n */\n subscribe(listener: () => void): Unsubscribe;\n\n /**\n * Synchronously flush all the updates to the store.\n */\n flushSync(): void;\n}\n\nexport const asStore = resource(\n <TState, TProps>(element: ResourceElement<TState, TProps>): Store<TState> => {\n const resource = tapMemo(\n () => createResource(element, true),\n [element.type],\n );\n\n tapEffect(() => {\n resource.updateInput(element.props);\n });\n\n return resource;\n },\n);\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AAoBA,IAAM,UAAU;AAAA,EACrB,CAAiB,YAA4D;AAC3E,UAAMA,YAAW;AAAA,MACf,MAAM,eAAe,SAAS,IAAI;AAAA,MAClC,CAAC,QAAQ,IAAI;AAAA,IACf;AAEA,cAAU,MAAM;AACd,MAAAA,UAAS,YAAY,QAAQ,KAAK;AAAA,IACpC,CAAC;AAED,WAAOA;AAAA,EACT;AACF;","names":["resource"]}
package/dist/tapApi.d.ts DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * API object type
3
- */
4
- export interface ApiObject {
5
- [key: string]: ((...args: any[]) => any) | ApiObject;
6
- }
7
- /**
8
- * Wraps an API object to make it stable across renders while keeping getState reactive.
9
- * This is the recommended pattern for scope resources.
10
- *
11
- * @example
12
- * ```typescript
13
- * export const FooResource = resource(() => {
14
- * const [state, setState] = tapState({ bar: "Hello" });
15
- *
16
- * const updateBar = (newBar: string) => {
17
- * setState({ bar: newBar });
18
- * };
19
- *
20
- * return tapApi({
21
- * getState: () => state,
22
- * updateBar,
23
- * });
24
- * });
25
- * ```
26
- */
27
- export declare const tapApi: <TApi extends ApiObject & {
28
- getState: () => any;
29
- }>(api: TApi, options?: {
30
- key?: string | undefined;
31
- }) => {
32
- key: string | undefined;
33
- state: any;
34
- api: TApi;
35
- };
36
- //# sourceMappingURL=tapApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tapApi.d.ts","sourceRoot":"","sources":["../src/tapApi.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,GAAG,SAAS,CAAC;CACtD;AAmCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,MAAM,GAAI,IAAI,SAAS,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,CAAA;CAAE,EACrE,KAAK,IAAI,EACT,UAAU;IACR,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;;;;CAwBF,CAAC"}
package/dist/tapApi.js DELETED
@@ -1,52 +0,0 @@
1
- // src/tapApi.ts
2
- import { tapEffect, tapMemo, tapRef } from "@assistant-ui/tap";
3
- var ReadonlyApiHandler = class {
4
- constructor(getApi) {
5
- this.getApi = getApi;
6
- }
7
- get(_, prop) {
8
- return this.getApi()[prop];
9
- }
10
- ownKeys() {
11
- return Object.keys(this.getApi());
12
- }
13
- has(_, prop) {
14
- return prop in this.getApi();
15
- }
16
- getOwnPropertyDescriptor(_, prop) {
17
- return Object.getOwnPropertyDescriptor(this.getApi(), prop);
18
- }
19
- set() {
20
- return false;
21
- }
22
- defineProperty() {
23
- return false;
24
- }
25
- deleteProperty() {
26
- return false;
27
- }
28
- };
29
- var tapApi = (api, options) => {
30
- const ref = tapRef(api);
31
- tapEffect(() => {
32
- ref.current = api;
33
- });
34
- const apiProxy = tapMemo(
35
- () => new Proxy({}, new ReadonlyApiHandler(() => ref.current)),
36
- []
37
- );
38
- const key = options?.key;
39
- const state = api.getState();
40
- return tapMemo(
41
- () => ({
42
- key,
43
- state,
44
- api: apiProxy
45
- }),
46
- [state, key]
47
- );
48
- };
49
- export {
50
- tapApi
51
- };
52
- //# sourceMappingURL=tapApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tapApi.ts"],"sourcesContent":["import { tapEffect, tapMemo, tapRef } from \"@assistant-ui/tap\";\n\n/**\n * API object type\n */\nexport interface ApiObject {\n [key: string]: ((...args: any[]) => any) | ApiObject;\n}\n\n/**\n * Readonly API handler for creating stable proxies\n */\nclass ReadonlyApiHandler<TApi extends ApiObject> implements ProxyHandler<TApi> {\n constructor(private readonly getApi: () => TApi) {}\n\n get(_: unknown, prop: string | symbol) {\n return this.getApi()[prop as keyof TApi];\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.getApi() as object);\n }\n\n has(_: unknown, prop: string | symbol) {\n return prop in (this.getApi() as object);\n }\n\n getOwnPropertyDescriptor(_: unknown, prop: string | symbol) {\n return Object.getOwnPropertyDescriptor(this.getApi(), prop);\n }\n\n set() {\n return false;\n }\n defineProperty() {\n return false;\n }\n deleteProperty() {\n return false;\n }\n}\n\n/**\n * Wraps an API object to make it stable across renders while keeping getState reactive.\n * This is the recommended pattern for scope resources.\n *\n * @example\n * ```typescript\n * export const FooResource = resource(() => {\n * const [state, setState] = tapState({ bar: \"Hello\" });\n *\n * const updateBar = (newBar: string) => {\n * setState({ bar: newBar });\n * };\n *\n * return tapApi({\n * getState: () => state,\n * updateBar,\n * });\n * });\n * ```\n */\nexport const tapApi = <TApi extends ApiObject & { getState: () => any }>(\n api: TApi,\n options?: {\n key?: string | undefined;\n },\n) => {\n const ref = tapRef(api);\n tapEffect(() => {\n ref.current = api;\n });\n\n const apiProxy = tapMemo(\n () =>\n new Proxy<TApi>({} as TApi, new ReadonlyApiHandler(() => ref.current)),\n [],\n );\n\n const key = options?.key;\n const state = api.getState();\n\n return tapMemo(\n () => ({\n key,\n state,\n api: apiProxy,\n }),\n [state, key],\n );\n};\n"],"mappings":";AAAA,SAAS,WAAW,SAAS,cAAc;AAY3C,IAAM,qBAAN,MAA+E;AAAA,EAC7E,YAA6B,QAAoB;AAApB;AAAA,EAAqB;AAAA,EAElD,IAAI,GAAY,MAAuB;AACrC,WAAO,KAAK,OAAO,EAAE,IAAkB;AAAA,EACzC;AAAA,EAEA,UAAsC;AACpC,WAAO,OAAO,KAAK,KAAK,OAAO,CAAW;AAAA,EAC5C;AAAA,EAEA,IAAI,GAAY,MAAuB;AACrC,WAAO,QAAS,KAAK,OAAO;AAAA,EAC9B;AAAA,EAEA,yBAAyB,GAAY,MAAuB;AAC1D,WAAO,OAAO,yBAAyB,KAAK,OAAO,GAAG,IAAI;AAAA,EAC5D;AAAA,EAEA,MAAM;AACJ,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AACF;AAsBO,IAAM,SAAS,CACpB,KACA,YAGG;AACH,QAAM,MAAM,OAAO,GAAG;AACtB,YAAU,MAAM;AACd,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,QAAM,WAAW;AAAA,IACf,MACE,IAAI,MAAY,CAAC,GAAW,IAAI,mBAAmB,MAAM,IAAI,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,SAAS;AACrB,QAAM,QAAQ,IAAI,SAAS;AAE3B,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,IACA,CAAC,OAAO,GAAG;AAAA,EACb;AACF;","names":[]}
@@ -1,44 +0,0 @@
1
- import { ResourceElement } from "@assistant-ui/tap";
2
- import { ApiObject } from "./tapApi";
3
- /**
4
- * Creates a lookup-based resource collection for managing lists of items.
5
- * Returns both the combined state array and an API function to lookup specific items.
6
- *
7
- * @param elements - Array of resource elements, each returning { key, state, api }
8
- * @returns Object with { state: TState[], api: (lookup) => TApi }
9
- *
10
- * The api function accepts { index: number } or { key: string } for lookups.
11
- * Consumers can wrap it to rename the key field (e.g., to "id" or "toolCallId").
12
- *
13
- * @example
14
- * ```typescript
15
- * const foos = tapLookupResources(
16
- * items.map((item) => FooItem({ id: item.id }, { key: item.id }))
17
- * );
18
- *
19
- * // Access state array
20
- * const allStates = foos.state;
21
- *
22
- * // Wrap to rename key field to "id"
23
- * const wrappedApi = (lookup: { index: number } | { id: string }) => {
24
- * if ("id" in lookup) {
25
- * return foos.api({ key: lookup.id });
26
- * } else {
27
- * return foos.api(lookup);
28
- * }
29
- * };
30
- * ```
31
- */
32
- export declare const tapLookupResources: <TState, TApi extends ApiObject>(elements: ResourceElement<{
33
- key: string | undefined;
34
- state: TState;
35
- api: TApi;
36
- }>[]) => {
37
- state: TState[];
38
- api: (lookup: {
39
- index: number;
40
- } | {
41
- key: string;
42
- }) => TApi;
43
- };
44
- //# sourceMappingURL=tapLookupResources.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tapLookupResources.d.ts","sourceRoot":"","sources":["../src/tapLookupResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,EAAE,IAAI,SAAS,SAAS,EAC/D,UAAU,eAAe,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,IAAI,CAAC;CACX,CAAC,EAAE,KACH;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,IAAI,CAAC;CAqB5D,CAAC"}
@@ -1,21 +0,0 @@
1
- // src/tapLookupResources.ts
2
- import { tapResources } from "@assistant-ui/tap";
3
- var tapLookupResources = (elements) => {
4
- const resources = tapResources(elements);
5
- return {
6
- state: resources.map((r) => r.state),
7
- api: (lookup) => {
8
- const value = "index" in lookup ? resources[lookup.index]?.api : resources.find((r) => r.key === lookup.key)?.api;
9
- if (!value) {
10
- throw new Error(
11
- `tapLookupResources: Resource not found for lookup: ${JSON.stringify(lookup)}`
12
- );
13
- }
14
- return value;
15
- }
16
- };
17
- };
18
- export {
19
- tapLookupResources
20
- };
21
- //# sourceMappingURL=tapLookupResources.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tapLookupResources.ts"],"sourcesContent":["import { ResourceElement, tapResources } from \"@assistant-ui/tap\";\nimport { ApiObject } from \"./tapApi\";\n\n/**\n * Creates a lookup-based resource collection for managing lists of items.\n * Returns both the combined state array and an API function to lookup specific items.\n *\n * @param elements - Array of resource elements, each returning { key, state, api }\n * @returns Object with { state: TState[], api: (lookup) => TApi }\n *\n * The api function accepts { index: number } or { key: string } for lookups.\n * Consumers can wrap it to rename the key field (e.g., to \"id\" or \"toolCallId\").\n *\n * @example\n * ```typescript\n * const foos = tapLookupResources(\n * items.map((item) => FooItem({ id: item.id }, { key: item.id }))\n * );\n *\n * // Access state array\n * const allStates = foos.state;\n *\n * // Wrap to rename key field to \"id\"\n * const wrappedApi = (lookup: { index: number } | { id: string }) => {\n * if (\"id\" in lookup) {\n * return foos.api({ key: lookup.id });\n * } else {\n * return foos.api(lookup);\n * }\n * };\n * ```\n */\nexport const tapLookupResources = <TState, TApi extends ApiObject>(\n elements: ResourceElement<{\n key: string | undefined;\n state: TState;\n api: TApi;\n }>[],\n): {\n state: TState[];\n api: (lookup: { index: number } | { key: string }) => TApi;\n} => {\n const resources = tapResources(elements);\n\n return {\n state: resources.map((r) => r.state),\n api: (lookup: { index: number } | { key: string }) => {\n const value =\n \"index\" in lookup\n ? resources[lookup.index]?.api\n : resources.find((r) => r.key === lookup.key)?.api;\n\n if (!value) {\n throw new Error(\n `tapLookupResources: Resource not found for lookup: ${JSON.stringify(lookup)}`,\n );\n }\n\n return value;\n },\n };\n};\n"],"mappings":";AAAA,SAA0B,oBAAoB;AAgCvC,IAAM,qBAAqB,CAChC,aAQG;AACH,QAAM,YAAY,aAAa,QAAQ;AAEvC,SAAO;AAAA,IACL,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IACnC,KAAK,CAAC,WAAgD;AACpD,YAAM,QACJ,WAAW,SACP,UAAU,OAAO,KAAK,GAAG,MACzB,UAAU,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,GAAG;AAEnD,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,sDAAsD,KAAK,UAAU,MAAM,CAAC;AAAA,QAC9E;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -1,76 +0,0 @@
1
- import type { ContravariantResource } from "@assistant-ui/tap";
2
- import { ApiObject } from "./tapApi";
3
- /**
4
- * Resource props that will be passed to each item resource
5
- */
6
- export type TapStoreListResourceProps<TProps> = {
7
- initialValue: TProps;
8
- remove: () => void;
9
- };
10
- /**
11
- * Configuration for tapStoreList hook
12
- */
13
- export type TapStoreListConfig<TProps, TState, TApi extends ApiObject> = {
14
- /**
15
- * Initial values for the list items
16
- */
17
- initialValues: TProps[];
18
- /**
19
- * Resource function that creates an element for each item
20
- * Should return a ResourceElement with { key, state, api }
21
- *
22
- * The resource will receive { initialValue, remove } as props.
23
- */
24
- resource: ContravariantResource<{
25
- key: string | undefined;
26
- state: TState;
27
- api: TApi;
28
- }, TapStoreListResourceProps<TProps>>;
29
- /**
30
- * Optional ID generator function for new items
31
- * If not provided, items must include an ID when added
32
- */
33
- idGenerator?: () => string;
34
- };
35
- /**
36
- * Creates a stateful list with add functionality, rendering each item via the provided resource.
37
- * Returns state array, api lookup function, and add method.
38
- *
39
- * @param config - Configuration object with initialValues, resource, and optional idGenerator
40
- * @returns Object with { state: TState[], api: (lookup) => TApi, add: (id?) => void }
41
- *
42
- * @example
43
- * ```typescript
44
- * const todoList = tapStoreList({
45
- * initialValues: [
46
- * { id: "1", text: "First todo" },
47
- * { id: "2", text: "Second todo" }
48
- * ],
49
- * resource: (props) => TodoItemResource(props, { key: props.id }),
50
- * idGenerator: () => `todo-${Date.now()}`
51
- * });
52
- *
53
- * // Access state array
54
- * const allTodos = todoList.state;
55
- *
56
- * // Lookup specific item
57
- * const firstTodo = todoList.api({ index: 0 });
58
- * const specificTodo = todoList.api({ key: "1" });
59
- *
60
- * // Add new item
61
- * todoList.add(); // Uses idGenerator
62
- * todoList.add("custom-id"); // Uses provided id
63
- * ```
64
- */
65
- export declare const tapStoreList: <TProps extends {
66
- id: string;
67
- }, TState, TApi extends ApiObject>(config: TapStoreListConfig<TProps, TState, TApi>) => {
68
- state: TState[];
69
- api: (lookup: {
70
- index: number;
71
- } | {
72
- id: string;
73
- }) => TApi;
74
- add: (id?: string) => void;
75
- };
76
- //# sourceMappingURL=tapStoreList.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tapStoreList.d.ts","sourceRoot":"","sources":["../src/tapStoreList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;GAEG;AACH,MAAM,MAAM,yBAAyB,CAAC,MAAM,IAAI;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAS,SAAS,IAAI;IACvE;;OAEG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IAMxB;;;;;OAKG;IACH,QAAQ,EAAE,qBAAqB,CAC7B;QACE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,IAAI,CAAC;KACX,EACD,yBAAyB,CAAC,MAAM,CAAC,CAClC,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAC7B,MAAM,EACN,IAAI,SAAS,SAAS,EAEtB,QAAQ,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,KAC/C;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1D,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CA8C5B,CAAC"}