@assistant-ui/store 0.2.10 → 0.2.12

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 (94) hide show
  1. package/README.md +36 -65
  2. package/dist/AuiIf.d.ts +43 -8
  3. package/dist/AuiIf.d.ts.map +1 -1
  4. package/dist/AuiIf.js +28 -3
  5. package/dist/AuiIf.js.map +1 -1
  6. package/dist/Derived.d.ts +15 -13
  7. package/dist/Derived.d.ts.map +1 -1
  8. package/dist/Derived.js +24 -20
  9. package/dist/Derived.js.map +1 -1
  10. package/dist/RenderChildrenWithAccessor.d.ts +13 -6
  11. package/dist/RenderChildrenWithAccessor.d.ts.map +1 -1
  12. package/dist/RenderChildrenWithAccessor.js +42 -48
  13. package/dist/RenderChildrenWithAccessor.js.map +1 -1
  14. package/dist/attachTransformScopes.d.ts +11 -10
  15. package/dist/attachTransformScopes.d.ts.map +1 -1
  16. package/dist/attachTransformScopes.js +20 -23
  17. package/dist/attachTransformScopes.js.map +1 -1
  18. package/dist/index.d.ts +15 -16
  19. package/dist/index.js +14 -18
  20. package/dist/tapClientList.d.ts +26 -23
  21. package/dist/tapClientList.d.ts.map +1 -1
  22. package/dist/tapClientList.js +66 -63
  23. package/dist/tapClientList.js.map +1 -1
  24. package/dist/tapClientLookup.d.ts +14 -11
  25. package/dist/tapClientLookup.d.ts.map +1 -1
  26. package/dist/tapClientLookup.js +31 -37
  27. package/dist/tapClientLookup.js.map +1 -1
  28. package/dist/tapClientResource.d.ts +12 -9
  29. package/dist/tapClientResource.d.ts.map +1 -1
  30. package/dist/tapClientResource.js +92 -104
  31. package/dist/tapClientResource.js.map +1 -1
  32. package/dist/types/client.d.ts +50 -42
  33. package/dist/types/client.d.ts.map +1 -1
  34. package/dist/types/client.js +0 -2
  35. package/dist/types/events.d.ts +23 -24
  36. package/dist/types/events.d.ts.map +1 -1
  37. package/dist/types/events.js +13 -6
  38. package/dist/types/events.js.map +1 -1
  39. package/dist/useAui.d.ts +76 -15
  40. package/dist/useAui.d.ts.map +1 -1
  41. package/dist/useAui.js +178 -175
  42. package/dist/useAui.js.map +1 -1
  43. package/dist/useAuiEvent.d.ts +47 -2
  44. package/dist/useAuiEvent.d.ts.map +1 -1
  45. package/dist/useAuiEvent.js +60 -7
  46. package/dist/useAuiEvent.js.map +1 -1
  47. package/dist/useAuiState.d.ts +31 -10
  48. package/dist/useAuiState.d.ts.map +1 -1
  49. package/dist/useAuiState.js +44 -25
  50. package/dist/useAuiState.js.map +1 -1
  51. package/dist/utils/BaseProxyHandler.d.ts +19 -16
  52. package/dist/utils/BaseProxyHandler.d.ts.map +1 -1
  53. package/dist/utils/BaseProxyHandler.js +46 -43
  54. package/dist/utils/BaseProxyHandler.js.map +1 -1
  55. package/dist/utils/NotificationManager.d.ts +13 -9
  56. package/dist/utils/NotificationManager.d.ts.map +1 -1
  57. package/dist/utils/NotificationManager.js +69 -82
  58. package/dist/utils/NotificationManager.js.map +1 -1
  59. package/dist/utils/proxied-assistant-state.d.ts +8 -4
  60. package/dist/utils/proxied-assistant-state.d.ts.map +1 -1
  61. package/dist/utils/proxied-assistant-state.js +28 -26
  62. package/dist/utils/proxied-assistant-state.js.map +1 -1
  63. package/dist/utils/react-assistant-context.d.ts +31 -13
  64. package/dist/utils/react-assistant-context.d.ts.map +1 -1
  65. package/dist/utils/react-assistant-context.js +69 -56
  66. package/dist/utils/react-assistant-context.js.map +1 -1
  67. package/dist/utils/splitClients.d.ts +12 -8
  68. package/dist/utils/splitClients.d.ts.map +1 -1
  69. package/dist/utils/splitClients.js +39 -43
  70. package/dist/utils/splitClients.js.map +1 -1
  71. package/dist/utils/tap-assistant-context.d.ts +17 -14
  72. package/dist/utils/tap-assistant-context.d.ts.map +1 -1
  73. package/dist/utils/tap-assistant-context.js +18 -15
  74. package/dist/utils/tap-assistant-context.js.map +1 -1
  75. package/dist/utils/tap-client-stack-context.d.ts +10 -6
  76. package/dist/utils/tap-client-stack-context.d.ts.map +1 -1
  77. package/dist/utils/tap-client-stack-context.js +22 -19
  78. package/dist/utils/tap-client-stack-context.js.map +1 -1
  79. package/dist/wrapperResource.d.ts +6 -2
  80. package/dist/wrapperResource.d.ts.map +1 -1
  81. package/dist/wrapperResource.js +12 -9
  82. package/dist/wrapperResource.js.map +1 -1
  83. package/package.json +7 -7
  84. package/src/AuiIf.ts +35 -1
  85. package/src/Derived.ts +1 -1
  86. package/src/types/client.ts +1 -2
  87. package/src/useAui.ts +101 -32
  88. package/src/useAuiEvent.ts +41 -0
  89. package/src/useAuiState.ts +25 -8
  90. package/src/utils/react-assistant-context.tsx +18 -5
  91. package/src/utils/splitClients.ts +4 -2
  92. package/dist/index.d.ts.map +0 -1
  93. package/dist/index.js.map +0 -1
  94. package/dist/types/client.js.map +0 -1
@@ -1,114 +1,102 @@
1
- import { tapEffect, tapMemo, tapRef, tapResource, } from "@assistant-ui/tap";
2
- import { tapClientStack, tapWithClientStack, SYMBOL_CLIENT_INDEX, } from "./utils/tap-client-stack-context.js";
3
- import { BaseProxyHandler, handleIntrospectionProp, } from "./utils/BaseProxyHandler.js";
1
+ import { SYMBOL_CLIENT_INDEX, tapClientStack, tapWithClientStack } from "./utils/tap-client-stack-context.js";
2
+ import { BaseProxyHandler, handleIntrospectionProp } from "./utils/BaseProxyHandler.js";
4
3
  import { wrapperResource } from "./wrapperResource.js";
4
+ import { tapEffect, tapMemo, tapRef, tapResource } from "@assistant-ui/tap";
5
+ //#region src/tapClientResource.ts
5
6
  /**
6
- * Symbol used internally to get state from ClientProxy.
7
- * This allows getState() to be optional in the user-facing client.
8
- */
7
+ * Symbol used internally to get state from ClientProxy.
8
+ * This allows getState() to be optional in the user-facing client.
9
+ */
9
10
  const SYMBOL_GET_OUTPUT = Symbol("assistant-ui.store.getValue");
10
- export const getClientState = (client) => {
11
- const output = client[SYMBOL_GET_OUTPUT];
12
- if (!output) {
13
- throw new Error("Client scope contains a non-client resource. " +
14
- "Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.");
15
- }
16
- return output.getState?.();
11
+ const getClientState = (client) => {
12
+ const output = client[SYMBOL_GET_OUTPUT];
13
+ if (!output) throw new Error("Client scope contains a non-client resource. Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.");
14
+ return output.getState?.();
17
15
  };
18
- // Global cache for function templates by field name
19
- const fieldAccessFns = new Map();
16
+ const fieldAccessFns = /* @__PURE__ */ new Map();
20
17
  function getOrCreateProxyFn(prop) {
21
- let template = fieldAccessFns.get(prop);
22
- if (!template) {
23
- template = function (...args) {
24
- if (!this || typeof this !== "object") {
25
- throw new Error(`Method "${String(prop)}" called without proper context. ` +
26
- `This may indicate the function was called incorrectly.`);
27
- }
28
- const output = this[SYMBOL_GET_OUTPUT];
29
- if (!output) {
30
- throw new Error(`Method "${String(prop)}" called on invalid client proxy. ` +
31
- `Ensure you are calling this method on a valid client instance.`);
32
- }
33
- const method = output[prop];
34
- if (!method)
35
- throw new Error(`Method "${String(prop)}" is not implemented.`);
36
- if (typeof method !== "function")
37
- throw new Error(`"${String(prop)}" is not a function.`);
38
- return method(...args);
39
- };
40
- fieldAccessFns.set(prop, template);
41
- }
42
- return template;
43
- }
44
- class ClientProxyHandler extends BaseProxyHandler {
45
- outputRef;
46
- index;
47
- boundFns;
48
- cachedReceiver;
49
- constructor(outputRef, index) {
50
- super();
51
- this.outputRef = outputRef;
52
- this.index = index;
53
- }
54
- get(_, prop, receiver) {
55
- if (prop === SYMBOL_GET_OUTPUT)
56
- return this.outputRef.current;
57
- if (prop === SYMBOL_CLIENT_INDEX)
58
- return this.index;
59
- const introspection = handleIntrospectionProp(prop, "ClientProxy");
60
- if (introspection !== false)
61
- return introspection;
62
- const value = this.outputRef.current[prop];
63
- if (typeof value === "function") {
64
- if (this.cachedReceiver !== receiver) {
65
- this.boundFns = new Map();
66
- this.cachedReceiver = receiver;
67
- }
68
- let bound = this.boundFns.get(prop);
69
- if (!bound) {
70
- bound = getOrCreateProxyFn(prop).bind(receiver);
71
- this.boundFns.set(prop, bound);
72
- }
73
- return bound;
74
- }
75
- return value;
76
- }
77
- ownKeys() {
78
- return Object.keys(this.outputRef.current);
79
- }
80
- has(_, prop) {
81
- if (prop === SYMBOL_GET_OUTPUT)
82
- return true;
83
- if (prop === SYMBOL_CLIENT_INDEX)
84
- return true;
85
- return prop in this.outputRef.current;
86
- }
18
+ let template = fieldAccessFns.get(prop);
19
+ if (!template) {
20
+ template = function(...args) {
21
+ if (!this || typeof this !== "object") throw new Error(`Method "${String(prop)}" called without proper context. This may indicate the function was called incorrectly.`);
22
+ const output = this[SYMBOL_GET_OUTPUT];
23
+ if (!output) throw new Error(`Method "${String(prop)}" called on invalid client proxy. Ensure you are calling this method on a valid client instance.`);
24
+ const method = output[prop];
25
+ if (!method) throw new Error(`Method "${String(prop)}" is not implemented.`);
26
+ if (typeof method !== "function") throw new Error(`"${String(prop)}" is not a function.`);
27
+ return method(...args);
28
+ };
29
+ fieldAccessFns.set(prop, template);
30
+ }
31
+ return template;
87
32
  }
33
+ var ClientProxyHandler = class extends BaseProxyHandler {
34
+ outputRef;
35
+ index;
36
+ boundFns;
37
+ cachedReceiver;
38
+ constructor(outputRef, index) {
39
+ super();
40
+ this.outputRef = outputRef;
41
+ this.index = index;
42
+ }
43
+ get(_, prop, receiver) {
44
+ if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;
45
+ if (prop === SYMBOL_CLIENT_INDEX) return this.index;
46
+ const introspection = handleIntrospectionProp(prop, "ClientProxy");
47
+ if (introspection !== false) return introspection;
48
+ const value = this.outputRef.current[prop];
49
+ if (typeof value === "function") {
50
+ if (this.cachedReceiver !== receiver) {
51
+ this.boundFns = /* @__PURE__ */ new Map();
52
+ this.cachedReceiver = receiver;
53
+ }
54
+ let bound = this.boundFns.get(prop);
55
+ if (!bound) {
56
+ bound = getOrCreateProxyFn(prop).bind(receiver);
57
+ this.boundFns.set(prop, bound);
58
+ }
59
+ return bound;
60
+ }
61
+ return value;
62
+ }
63
+ ownKeys() {
64
+ return Object.keys(this.outputRef.current);
65
+ }
66
+ has(_, prop) {
67
+ if (prop === SYMBOL_GET_OUTPUT) return true;
68
+ if (prop === SYMBOL_CLIENT_INDEX) return true;
69
+ return prop in this.outputRef.current;
70
+ }
71
+ };
88
72
  /**
89
- * Resource that wraps a plain resource element to create a stable client proxy.
90
- *
91
- * Takes a ResourceElement that returns methods (with optional getState()) and
92
- * wraps it to produce a stable client proxy. This adds the client to the
93
- * client stack, enabling event scoping.
94
- *
95
- * @internal
96
- */
97
- export const ClientResource = wrapperResource((element) => {
98
- const valueRef = tapRef(null);
99
- const index = tapClientStack().length;
100
- const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]);
101
- const value = tapWithClientStack(methods, () => tapResource(element));
102
- if (!valueRef.current) {
103
- valueRef.current = value;
104
- }
105
- tapEffect(() => {
106
- valueRef.current = value;
107
- });
108
- const state = value.getState?.();
109
- return { methods, state, key: element.key };
73
+ * Resource that wraps a plain resource element to create a stable client proxy.
74
+ *
75
+ * Takes a ResourceElement that returns methods (with optional getState()) and
76
+ * wraps it to produce a stable client proxy. This adds the client to the
77
+ * client stack, enabling event scoping.
78
+ *
79
+ * @internal
80
+ */
81
+ const ClientResource = wrapperResource((element) => {
82
+ const valueRef = tapRef(null);
83
+ const index = tapClientStack().length;
84
+ const methods = tapMemo(() => new Proxy({}, new ClientProxyHandler(valueRef, index)), [index]);
85
+ const value = tapWithClientStack(methods, () => tapResource(element));
86
+ if (!valueRef.current) valueRef.current = value;
87
+ tapEffect(() => {
88
+ valueRef.current = value;
89
+ });
90
+ return {
91
+ methods,
92
+ state: value.getState?.(),
93
+ key: element.key
94
+ };
110
95
  });
111
- export const tapClientResource = (element) => {
112
- return tapResource(ClientResource(element));
96
+ const tapClientResource = (element) => {
97
+ return tapResource(ClientResource(element));
113
98
  };
99
+ //#endregion
100
+ export { ClientResource, getClientState, tapClientResource };
101
+
114
102
  //# sourceMappingURL=tapClientResource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientResource.js","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,MAAM,EAEN,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,4CAAyC;AAC1C,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,oCAAiC;AAClC,OAAO,EAAE,eAAe,EAAE,6BAA0B;AAEpD;;;GAGG;AACH,MAAM,iBAAiB,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;AAMhE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAqB,EAAE,EAAE;IACtD,MAAM,MAAM,GAAI,MAAoC,CAAC,iBAAiB,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC7C,oGAAoG,CACvG,CAAC;IACJ,CAAC;IACD,OAAQ,MAAc,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtC,CAAC,CAAC;AAEF,oDAAoD;AACpD,MAAM,cAAc,GAAG,IAAI,GAAG,EAG3B,CAAC;AAEJ,SAAS,kBAAkB,CAAC,IAAqB;IAC/C,IAAI,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,UAAyB,GAAG,IAAe;YACpD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,IAAI,CAAC,mCAAmC;oBACxD,wDAAwD,CAC3D,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAI,IAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,IAAI,CAAC,oCAAoC;oBACzD,gEAAgE,CACnE,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,MAAM;gBACT,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAClE,IAAI,OAAO,MAAM,KAAK,UAAU;gBAC9B,MAAM,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACzB,CAAC,CAAC;QACF,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,kBACJ,SAAQ,gBAAgB;IASL;IAGA;IATX,QAAQ,CAEF;IACN,cAAc,CAAU;IAEhC,YACmB,SAEhB,EACgB,KAAa;QAE9B,KAAK,EAAE,CAAC;QALS,cAAS,GAAT,SAAS,CAEzB;QACgB,UAAK,GAAL,KAAK,CAAQ;IAGhC,CAAC;IAED,GAAG,CAAC,CAAU,EAAE,IAAqB,EAAE,QAAiB;QACtD,IAAI,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;QAC9D,IAAI,IAAI,KAAK,mBAAmB;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpD,MAAM,aAAa,GAAG,uBAAuB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACnE,IAAI,aAAa,KAAK,KAAK;YAAE,OAAO,aAAa,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;YACjC,CAAC;YACD,IAAI,KAAK,GAAG,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,GAAG,CAAC,CAAU,EAAE,IAAqB;QACnC,IAAI,IAAI,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAC5C,IAAI,IAAI,KAAK,mBAAmB;YAAE,OAAO,IAAI,CAAC;QAC9C,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;IACxC,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAC3C,CACE,OAAkC,EAKlC,EAAE;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAA2B,CAAC,CAAC;IAErD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC,MAAM,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,IAAI,KAAK,CACP,EAAc,EACd,IAAI,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CACxC,EACH,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAI,KAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AAC9C,CAAC,CACF,CAAC;AAQF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAkC,EAKlC,EAAE;IACF,OAAO,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAIzC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"tapClientResource.js","names":[],"sources":["../src/tapClientResource.ts"],"sourcesContent":["import {\n tapEffect,\n tapMemo,\n tapRef,\n type ResourceElement,\n tapResource,\n} from \"@assistant-ui/tap\";\nimport type { ClientMethods } from \"./types/client\";\nimport {\n tapClientStack,\n tapWithClientStack,\n SYMBOL_CLIENT_INDEX,\n} from \"./utils/tap-client-stack-context\";\nimport {\n BaseProxyHandler,\n handleIntrospectionProp,\n} from \"./utils/BaseProxyHandler\";\nimport { wrapperResource } from \"./wrapperResource\";\n\n/**\n * Symbol used internally to get state from ClientProxy.\n * This allows getState() to be optional in the user-facing client.\n */\nconst SYMBOL_GET_OUTPUT = Symbol(\"assistant-ui.store.getValue\");\n\ntype ClientInternal = {\n [SYMBOL_GET_OUTPUT]: ClientMethods;\n};\n\nexport const getClientState = (client: ClientMethods) => {\n const output = (client as unknown as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n \"Client scope contains a non-client resource. \" +\n \"Ensure your Derived get() returns a client created with tapClientResource(), not a plain resource.\",\n );\n }\n return (output as any).getState?.();\n};\n\n// Global cache for function templates by field name\nconst fieldAccessFns = new Map<\n string | symbol,\n (this: unknown, ...args: unknown[]) => unknown\n>();\n\nfunction getOrCreateProxyFn(prop: string | symbol) {\n let template = fieldAccessFns.get(prop);\n if (!template) {\n template = function (this: unknown, ...args: unknown[]) {\n if (!this || typeof this !== \"object\") {\n throw new Error(\n `Method \"${String(prop)}\" called without proper context. ` +\n `This may indicate the function was called incorrectly.`,\n );\n }\n\n const output = (this as ClientInternal)[SYMBOL_GET_OUTPUT];\n if (!output) {\n throw new Error(\n `Method \"${String(prop)}\" called on invalid client proxy. ` +\n `Ensure you are calling this method on a valid client instance.`,\n );\n }\n\n const method = output[prop];\n if (!method)\n throw new Error(`Method \"${String(prop)}\" is not implemented.`);\n if (typeof method !== \"function\")\n throw new Error(`\"${String(prop)}\" is not a function.`);\n return method(...args);\n };\n fieldAccessFns.set(prop, template);\n }\n return template;\n}\n\nclass ClientProxyHandler\n extends BaseProxyHandler\n implements ProxyHandler<object>\n{\n private boundFns:\n | Map<string | symbol, (...args: never) => unknown>\n | undefined;\n private cachedReceiver: unknown;\n\n constructor(\n private readonly outputRef: {\n current: ClientMethods;\n },\n private readonly index: number,\n ) {\n super();\n }\n\n get(_: unknown, prop: string | symbol, receiver: unknown) {\n if (prop === SYMBOL_GET_OUTPUT) return this.outputRef.current;\n if (prop === SYMBOL_CLIENT_INDEX) return this.index;\n const introspection = handleIntrospectionProp(prop, \"ClientProxy\");\n if (introspection !== false) return introspection;\n const value = this.outputRef.current[prop];\n if (typeof value === \"function\") {\n if (this.cachedReceiver !== receiver) {\n this.boundFns = new Map();\n this.cachedReceiver = receiver;\n }\n let bound = this.boundFns!.get(prop);\n if (!bound) {\n bound = getOrCreateProxyFn(prop).bind(receiver);\n this.boundFns!.set(prop, bound);\n }\n return bound;\n }\n return value;\n }\n\n ownKeys(): ArrayLike<string | symbol> {\n return Object.keys(this.outputRef.current);\n }\n\n has(_: unknown, prop: string | symbol) {\n if (prop === SYMBOL_GET_OUTPUT) return true;\n if (prop === SYMBOL_CLIENT_INDEX) return true;\n return prop in this.outputRef.current;\n }\n}\n\n/**\n * Resource that wraps a plain resource element to create a stable client proxy.\n *\n * Takes a ResourceElement that returns methods (with optional getState()) and\n * wraps it to produce a stable client proxy. This adds the client to the\n * client stack, enabling event scoping.\n *\n * @internal\n */\nexport const ClientResource = wrapperResource(\n <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n ): {\n methods: TMethods;\n state: unknown;\n key: string | number | undefined;\n } => {\n const valueRef = tapRef(null as unknown as TMethods);\n\n const index = tapClientStack().length;\n const methods = tapMemo(\n () =>\n new Proxy<TMethods>(\n {} as TMethods,\n new ClientProxyHandler(valueRef, index),\n ),\n [index],\n );\n\n const value = tapWithClientStack(methods, () => tapResource(element));\n if (!valueRef.current) {\n valueRef.current = value;\n }\n\n tapEffect(() => {\n valueRef.current = value;\n });\n\n const state = (value as any).getState?.();\n return { methods, state, key: element.key };\n },\n);\n\ntype InferClientState<TMethods> = TMethods extends {\n getState: () => infer S;\n}\n ? S\n : undefined;\n\nexport const tapClientResource = <TMethods extends ClientMethods>(\n element: ResourceElement<TMethods>,\n): {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n} => {\n return tapResource(ClientResource(element)) as {\n state: InferClientState<TMethods>;\n methods: TMethods;\n key: string | number | undefined;\n };\n};\n"],"mappings":";;;;;;;;;AAuBA,MAAM,oBAAoB,OAAO,6BAA6B;AAM9D,MAAa,kBAAkB,WAA0B;CACvD,MAAM,SAAU,OAAqC;CACrD,IAAI,CAAC,QACH,MAAM,IAAI,MACR,iJAEF;CAEF,OAAQ,OAAe,WAAW;AACpC;AAGA,MAAM,iCAAiB,IAAI,IAGzB;AAEF,SAAS,mBAAmB,MAAuB;CACjD,IAAI,WAAW,eAAe,IAAI,IAAI;CACtC,IAAI,CAAC,UAAU;EACb,WAAW,SAAyB,GAAG,MAAiB;GACtD,IAAI,CAAC,QAAQ,OAAO,SAAS,UAC3B,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,wFAE1B;GAGF,MAAM,SAAU,KAAwB;GACxC,IAAI,CAAC,QACH,MAAM,IAAI,MACR,WAAW,OAAO,IAAI,EAAE,iGAE1B;GAGF,MAAM,SAAS,OAAO;GACtB,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,WAAW,OAAO,IAAI,EAAE,sBAAsB;GAChE,IAAI,OAAO,WAAW,YACpB,MAAM,IAAI,MAAM,IAAI,OAAO,IAAI,EAAE,qBAAqB;GACxD,OAAO,OAAO,GAAG,IAAI;EACvB;EACA,eAAe,IAAI,MAAM,QAAQ;CACnC;CACA,OAAO;AACT;AAEA,IAAM,qBAAN,cACU,iBAEV;CAOqB;CAGA;CATnB;CAGA;CAEA,YACE,WAGA,OACA;EACA,MAAM;EALW,KAAA,YAAA;EAGA,KAAA,QAAA;CAGnB;CAEA,IAAI,GAAY,MAAuB,UAAmB;EACxD,IAAI,SAAS,mBAAmB,OAAO,KAAK,UAAU;EACtD,IAAI,SAAS,qBAAqB,OAAO,KAAK;EAC9C,MAAM,gBAAgB,wBAAwB,MAAM,aAAa;EACjE,IAAI,kBAAkB,OAAO,OAAO;EACpC,MAAM,QAAQ,KAAK,UAAU,QAAQ;EACrC,IAAI,OAAO,UAAU,YAAY;GAC/B,IAAI,KAAK,mBAAmB,UAAU;IACpC,KAAK,2BAAW,IAAI,IAAI;IACxB,KAAK,iBAAiB;GACxB;GACA,IAAI,QAAQ,KAAK,SAAU,IAAI,IAAI;GACnC,IAAI,CAAC,OAAO;IACV,QAAQ,mBAAmB,IAAI,EAAE,KAAK,QAAQ;IAC9C,KAAK,SAAU,IAAI,MAAM,KAAK;GAChC;GACA,OAAO;EACT;EACA,OAAO;CACT;CAEA,UAAsC;EACpC,OAAO,OAAO,KAAK,KAAK,UAAU,OAAO;CAC3C;CAEA,IAAI,GAAY,MAAuB;EACrC,IAAI,SAAS,mBAAmB,OAAO;EACvC,IAAI,SAAS,qBAAqB,OAAO;EACzC,OAAO,QAAQ,KAAK,UAAU;CAChC;AACF;;;;;;;;;;AAWA,MAAa,iBAAiB,iBAE1B,YAKG;CACH,MAAM,WAAW,OAAO,IAA2B;CAEnD,MAAM,QAAQ,eAAe,EAAE;CAC/B,MAAM,UAAU,cAEZ,IAAI,MACF,CAAC,GACD,IAAI,mBAAmB,UAAU,KAAK,CACxC,GACF,CAAC,KAAK,CACR;CAEA,MAAM,QAAQ,mBAAmB,eAAe,YAAY,OAAO,CAAC;CACpE,IAAI,CAAC,SAAS,SACZ,SAAS,UAAU;CAGrB,gBAAgB;EACd,SAAS,UAAU;CACrB,CAAC;CAGD,OAAO;EAAE;EAAS,OADH,MAAc,WAAW;EACf,KAAK,QAAQ;CAAI;AAC5C,CACF;AAQA,MAAa,qBACX,YAKG;CACH,OAAO,YAAY,eAAe,OAAO,CAAC;AAK5C"}
@@ -1,14 +1,28 @@
1
- import type { ResourceElement } from "@assistant-ui/tap";
2
- import type { AssistantEventName, AssistantEventCallback, AssistantEventSelector } from "./events.js";
1
+ import { AssistantEventCallback, AssistantEventName, AssistantEventSelector } from "./events.js";
2
+ import { ResourceElement } from "@assistant-ui/tap";
3
+
4
+ //#region src/types/client.d.ts
3
5
  /**
4
6
  * Base type for methods that can be called on a client.
5
7
  */
6
- export interface ClientMethods {
7
- [key: string | symbol]: (...args: any[]) => any;
8
+ interface ClientMethods {
9
+ [key: string | symbol]: (...args: any[]) => any;
8
10
  }
9
11
  type ClientMetaType = {
10
- source: ClientNames;
11
- query: Record<string, unknown>;
12
+ source: ClientNames;
13
+ query: Record<string, unknown>;
14
+ };
15
+ /**
16
+ * Schema of a client in the assistant system.
17
+ * @template TState - The state type for this client
18
+ * @template TMethods - The methods available on this client
19
+ * @template TMeta - Source/query metadata (optional)
20
+ * @template TEvents - Events that this client can emit (optional)
21
+ */
22
+ type ClientSchema<TMethods extends ClientMethods = ClientMethods, TMeta extends ClientMetaType = never, TEvents extends Record<string, unknown> = never> = {
23
+ methods: TMethods;
24
+ meta?: TMeta;
25
+ events?: TEvents;
12
26
  };
13
27
  /**
14
28
  * Module augmentation interface for assistant-ui store type extensions.
@@ -39,25 +53,22 @@ type ClientMetaType = {
39
53
  * }
40
54
  * ```
41
55
  */
42
- export interface ScopeRegistry {
43
- }
56
+ interface ScopeRegistry {}
44
57
  type ClientEventsType<K extends ClientNames> = Record<`${K}.${string}`, unknown>;
45
58
  type ClientError<E extends string> = {
46
- methods: Record<E, () => E>;
47
- meta: {
48
- source: ClientNames;
49
- query: Record<E, E>;
50
- };
51
- events: Record<`${E}.`, E>;
59
+ methods: Record<E, () => E>;
60
+ meta: {
61
+ source: ClientNames;
62
+ query: Record<E, E>;
63
+ };
64
+ events: Record<`${E}.`, E>;
52
65
  };
53
66
  type ValidateClient<K extends keyof ScopeRegistry> = ScopeRegistry[K] extends {
54
- methods: ClientMethods;
67
+ methods: ClientMethods;
55
68
  } ? "meta" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["meta"] extends ClientMetaType ? "events" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["events"] extends ClientEventsType<K> ? ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid meta type`> : "events" extends keyof ScopeRegistry[K] ? ScopeRegistry[K]["events"] extends ClientEventsType<K> ? ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid events type`> : ScopeRegistry[K] : ClientError<`ERROR: ${K & string} has invalid methods type`>;
56
69
  type ClientSchemas = keyof ScopeRegistry extends never ? {
57
- "ERROR: No clients were defined": ClientError<"ERROR: No clients were defined">;
58
- } : {
59
- [K in keyof ScopeRegistry]: ValidateClient<K>;
60
- };
70
+ "ERROR: No clients were defined": ClientError<"ERROR: No clients were defined">;
71
+ } : { [K in keyof ScopeRegistry]: ValidateClient<K> };
61
72
  /**
62
73
  * Output type that client resources return (just methods).
63
74
  *
@@ -72,44 +83,41 @@ type ClientSchemas = keyof ScopeRegistry extends never ? {
72
83
  * });
73
84
  * ```
74
85
  */
75
- export type ClientOutput<K extends ClientNames> = ClientSchemas[K]["methods"] & ClientMethods;
76
- export type ClientNames = keyof ClientSchemas extends infer U ? U : never;
77
- export type ClientEvents<K extends ClientNames> = "events" extends keyof ClientSchemas[K] ? ClientSchemas[K]["events"] extends ClientEventsType<K> ? ClientSchemas[K]["events"] : never : never;
78
- export type ClientMeta<K extends ClientNames> = "meta" extends keyof ClientSchemas[K] ? Pick<ClientSchemas[K]["meta"] extends ClientMetaType ? ClientSchemas[K]["meta"] : never, "source" | "query"> : never;
79
- export type ClientElement<K extends ClientNames> = ResourceElement<ClientOutput<K>>;
86
+ type ClientOutput<K extends ClientNames> = ClientSchemas[K]["methods"] & ClientMethods;
87
+ type ClientNames = keyof ClientSchemas extends infer U ? U : never;
88
+ type ClientEvents<K extends ClientNames> = "events" extends keyof ClientSchemas[K] ? ClientSchemas[K]["events"] extends ClientEventsType<K> ? ClientSchemas[K]["events"] : never : never;
89
+ type ClientMeta<K extends ClientNames> = "meta" extends keyof ClientSchemas[K] ? Pick<ClientSchemas[K]["meta"] extends ClientMetaType ? ClientSchemas[K]["meta"] : never, "source" | "query"> : never;
90
+ type ClientElement<K extends ClientNames> = ResourceElement<ClientOutput<K>>;
80
91
  /**
81
92
  * Unsubscribe function type.
82
93
  */
83
- export type Unsubscribe = () => void;
94
+ type Unsubscribe = () => void;
84
95
  /**
85
96
  * State type extracted from all clients via their getState() methods.
86
97
  */
87
- export type AssistantState = {
88
- [K in ClientNames]: ClientSchemas[K]["methods"] extends {
89
- getState: () => infer S;
90
- } ? S : never;
91
- };
98
+ type AssistantState = { [K in ClientNames]: ClientSchemas[K]["methods"] extends {
99
+ getState: () => infer S;
100
+ } ? S : never };
92
101
  /**
93
102
  * Type for a client accessor - a function that returns the methods,
94
103
  * with source/query metadata attached (derived from meta).
95
104
  */
96
- export type AssistantClientAccessor<K extends ClientNames> = (() => ClientSchemas[K]["methods"]) & (ClientMeta<K> | {
97
- source: "root";
98
- query: Record<string, never>;
105
+ type AssistantClientAccessor<K extends ClientNames> = (() => ClientSchemas[K]["methods"]) & (ClientMeta<K> | {
106
+ source: "root";
107
+ query: Record<string, never>;
99
108
  } | {
100
- source: null;
101
- query: null;
109
+ source: null;
110
+ query: null;
102
111
  }) & {
103
- name: K;
112
+ name: K;
104
113
  };
105
114
  /**
106
115
  * The assistant client type with all registered clients.
107
116
  */
108
- export type AssistantClient = {
109
- [K in ClientNames]: AssistantClientAccessor<K>;
110
- } & {
111
- subscribe(listener: () => void): Unsubscribe;
112
- on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe;
117
+ type AssistantClient = { [K in ClientNames]: AssistantClientAccessor<K> } & {
118
+ subscribe(listener: () => void): Unsubscribe;
119
+ on<TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>, callback: AssistantEventCallback<TEvent>): Unsubscribe;
113
120
  };
114
- export {};
121
+ //#endregion
122
+ export { AssistantClient, AssistantClientAccessor, AssistantState, ClientElement, ClientEvents, ClientMeta, ClientMethods, ClientNames, ClientOutput, ClientSchema, ScopeRegistry, Unsubscribe };
115
123
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/types/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","names":[],"sources":["../../src/types/client.ts"],"mappings":";;;;;;AAUA;UAAiB,aAAA;EAAA,CACd,GAAA,wBAA2B,IAAI;AAAA;AAAA,KAG7B,cAAA;EAAmB,MAAA,EAAQ,WAAA;EAAa,KAAA,EAAO,MAAM;AAAA;;;;;;;AAAA;KAS9C,YAAA,kBACO,aAAA,GAAgB,aAAA,gBACnB,cAAA,0BACE,MAAA;EAEhB,OAAA,EAAS,QAAA;EACT,IAAA,GAAO,KAAA;EACP,MAAA,GAAS,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;AAAO;AAiClB;;;;AAA8B;AAAG;;UAAhB,aAAA;AAAA,KAEZ,gBAAA,WAA2B,WAAA,IAAe,MAAA,IAC1C,CAAA;AAAA,KAIA,WAAA;EACH,OAAA,EAAS,MAAA,CAAO,CAAA,QAAS,CAAA;EACzB,IAAA;IAAQ,MAAA,EAAQ,WAAA;IAAa,KAAA,EAAO,MAAA,CAAO,CAAA,EAAG,CAAA;EAAA;EAC9C,MAAA,EAAQ,MAAA,IAAU,CAAA,KAAM,CAAA;AAAA;AAAA,KAGrB,cAAA,iBAA+B,aAAA,IAAiB,aAAA,CAAc,CAAA;EACjE,OAAA,EAAS,aAAA;AAAA,yBAEc,aAAA,CAAc,CAAA,IACjC,aAAA,CAAc,CAAA,kBAAmB,cAAA,0BACR,aAAA,CAAc,CAAA,IACnC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA,IACd,WAAA,WAAsB,CAAA,uCACxB,aAAA,CAAc,CAAA,IAChB,WAAA,WAAsB,CAAA,4DACD,aAAA,CAAc,CAAA,IACnC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA,IACd,WAAA,WAAsB,CAAA,uCACxB,aAAA,CAAc,CAAA,IAClB,WAAA,WAAsB,CAAA;AAAA,KAErB,aAAA,SAAsB,aAAA;EAErB,gCAAA,EAAkC,WAAA;AAAA,kBAEtB,aAAA,GAAgB,cAAA,CAAe,CAAA;;;;;;;;;;;;;;;KAgBrC,YAAA,WAAuB,WAAA,IAAe,aAAA,CAAc,CAAA,eAC9D,aAAA;AAAA,KAEU,WAAA,SAAoB,aAAa,mBAAmB,CAAA;AAAA,KAEpD,YAAA,WAAuB,WAAA,2BACV,aAAA,CAAc,CAAA,IACjC,aAAA,CAAc,CAAA,oBAAqB,gBAAA,CAAiB,CAAA,IAClD,aAAA,CAAc,CAAA;AAAA,KAIV,UAAA,WAAqB,WAAA,yBACV,aAAA,CAAc,CAAA,IAC/B,IAAA,CACE,aAAA,CAAc,CAAA,kBAAmB,cAAA,GAC7B,aAAA,CAAc,CAAA;AAAA,KAMd,aAAA,WAAwB,WAAA,IAAe,eAAA,CACjD,YAAA,CAAa,CAAA;;;;KAMH,WAAA;;;AAtEe;KA2Ef,cAAA,WACJ,WAAA,GAAc,aAAA,CAAc,CAAA;EAChC,QAAA;AAAA,IAEE,CAAA;;;;;KAQM,uBAAA,WAAkC,WAAA,WACrC,aAAA,CAAc,CAAA,iBAEf,UAAA,CAAW,CAAA;EACT,MAAA;EAAgB,KAAA,EAAO,MAAA;AAAA;EACvB,MAAA;EAAc,KAAA;AAAA;EACd,IAAA,EAAM,CAAA;AAAA;;;;KAKJ,eAAA,WACJ,WAAA,GAAc,uBAAA,CAAwB,CAAA;EAE5C,SAAA,CAAU,QAAA,eAAuB,WAAA;EACjC,EAAA,gBAAkB,kBAAA,EAChB,QAAA,EAAU,sBAAA,CAAuB,MAAA,GACjC,QAAA,EAAU,sBAAA,CAAuB,MAAA,IAChC,WAAA;AAAA"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=client.js.map
@@ -1,33 +1,32 @@
1
- import type { AssistantClientAccessor, ClientEvents, ClientNames } from "./client.js";
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;
1
+ import { AssistantClientAccessor, ClientEvents, ClientNames } from "./client.js";
2
+
3
+ //#region src/types/events.d.ts
4
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends ((x: infer I) => void) ? I : never;
5
+ type ClientEventMap = UnionToIntersection<{ [K in ClientNames]: ClientEvents<K> }[ClientNames]>;
6
+ type WildcardPayload = { [K in keyof ClientEventMap]: {
7
+ event: K;
8
+ payload: ClientEventMap[K];
9
+ } }[keyof ClientEventMap];
10
+ type AssistantEventPayload = ClientEventMap & {
11
+ "*": WildcardPayload;
14
12
  };
15
- export type AssistantEventName = keyof AssistantEventPayload;
13
+ type AssistantEventName = keyof AssistantEventPayload;
16
14
  type EventSource<T extends AssistantEventName> = T extends `${infer Source}.${string}` ? Source : never;
17
15
  type ParentOf<K extends ClientNames> = AssistantClientAccessor<K> extends {
18
- source: infer S;
16
+ source: infer S;
19
17
  } ? S extends ClientNames ? S : never : never;
20
18
  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
19
  /** 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;
20
+ type AssistantEventScope<TEvent extends AssistantEventName> = "*" | EventSource<TEvent> | (EventSource<TEvent> extends ClientNames ? AncestorsOf<EventSource<TEvent>> : never);
21
+ type AssistantEventSelector<TEvent extends AssistantEventName> = TEvent | {
22
+ scope: AssistantEventScope<TEvent>;
23
+ event: TEvent;
26
24
  };
27
- export declare const normalizeEventSelector: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>) => {
28
- scope: AssistantEventScope<TEvent>;
29
- event: TEvent;
25
+ declare const normalizeEventSelector: <TEvent extends AssistantEventName>(selector: AssistantEventSelector<TEvent>) => {
26
+ scope: AssistantEventScope<TEvent>;
27
+ event: TEvent;
30
28
  };
31
- export type AssistantEventCallback<TEvent extends AssistantEventName> = (payload: AssistantEventPayload[TEvent]) => void;
32
- export {};
29
+ type AssistantEventCallback<TEvent extends AssistantEventName> = (payload: AssistantEventPayload[TEvent]) => void;
30
+ //#endregion
31
+ export { AssistantEventCallback, AssistantEventName, AssistantEventPayload, AssistantEventScope, AssistantEventSelector, normalizeEventSelector };
33
32
  //# sourceMappingURL=events.d.ts.map
@@ -1 +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,oBAAiB;AAGlB,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAC5B,CAAC,SAAS,OAAO,GACb,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GACd,KAAK,CACV,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAC1B,CAAC,GACD,KAAK,CAAC;AAEV,KAAK,cAAc,GAAG,mBAAmB,CACvC;KAAG,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;CAAE,CAAC,WAAW,CAAC,CACrD,CAAC;AAIF,KAAK,eAAe,GAAG;KACpB,CAAC,IAAI,MAAM,cAAc,GAAG;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;KAAE;CACtE,CAAC,MAAM,cAAc,CAAC,CAAC;AAExB,MAAM,MAAM,qBAAqB,GAAG,cAAc,GAAG;IAAE,GAAG,EAAE,eAAe,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC;AAE7D,KAAK,WAAW,CAAC,CAAC,SAAS,kBAAkB,IAC3C,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AAIzD,KAAK,QAAQ,CAAC,CAAC,SAAS,WAAW,IACjC,uBAAuB,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAClD,CAAC,SAAS,WAAW,GACnB,CAAC,GACD,KAAK,GACP,KAAK,CAAC;AAEZ,KAAK,WAAW,CACd,CAAC,SAAS,WAAW,EACrB,IAAI,SAAS,WAAW,GAAG,KAAK,IAC9B,CAAC,SAAS,IAAI,GACd,KAAK,GACL,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,GACvB,KAAK,GACL,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;AAEvD,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,kBAAkB,IAC7D,GAAG,GACH,WAAW,CAAC,MAAM,CAAC,GACnB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,WAAW,GACpC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAChC,KAAK,CAAC,CAAC;AAIf,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,kBAAkB,IAChE,MAAM,GACN;IAAE,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,eAAO,MAAM,sBAAsB,GAAI,MAAM,SAAS,kBAAkB,EACtE,UAAU,sBAAsB,CAAC,MAAM,CAAC;;;CAOzC,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,kBAAkB,IAAI,CACtE,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,KACnC,IAAI,CAAC"}
1
+ {"version":3,"file":"events.d.ts","names":[],"sources":["../../src/types/events.ts"],"mappings":";;;KAOK,mBAAA,OACH,CAAA,oBACK,CAAA,EAAG,CAAC,6BAEA,CAAA,sBACP,CAAA;AAAA,KAGC,cAAA,GAAiB,mBAAA,SACZ,WAAA,GAAc,YAAA,CAAa,CAAA,IAAK,WAAA;AAAA,KAKrC,eAAA,iBACS,cAAA;EAAmB,KAAA,EAAO,CAAA;EAAG,OAAA,EAAS,cAAA,CAAe,CAAA;AAAA,UAC3D,cAAA;AAAA,KAEI,qBAAA,GAAwB,cAAA;EAAmB,GAAA,EAAK,eAAe;AAAA;AAAA,KAE/D,kBAAA,SAA2B,qBAAqB;AAAA,KAEvD,WAAA,WAAsB,kBAAA,IACzB,CAAC,uCAAuC,MAAA;AAAA,KAIrC,QAAA,WAAmB,WAAA,IACtB,uBAAA,CAAwB,CAAA;EAAa,MAAA;AAAA,IACjC,CAAA,SAAU,WAAA,GACR,CAAA;AAAA,KAIH,WAAA,WACO,WAAA,eACG,WAAA,YACX,CAAA,SAAU,IAAA,WAEV,QAAA,CAAS,CAAA,0BAEP,QAAA,CAAS,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,CAAA,GAAI,IAAA,GAAO,CAAA;;KAGxC,mBAAA,gBAAmC,kBAAA,UAE3C,WAAA,CAAY,MAAA,KACX,WAAA,CAAY,MAAA,UAAgB,WAAA,GACzB,WAAA,CAAY,WAAA,CAAY,MAAA;AAAA,KAKpB,sBAAA,gBAAsC,kBAAA,IAC9C,MAAA;EACE,KAAA,EAAO,mBAAA,CAAoB,MAAA;EAAS,KAAA,EAAO,MAAA;AAAA;AAAA,cAEpC,sBAAA,kBAAyC,kBAAA,EACpD,QAAA,EAAU,sBAAA,CAAuB,MAAA;;;;KASvB,sBAAA,gBAAsC,kBAAA,KAChD,OAAA,EAAS,qBAAA,CAAsB,MAAA"}
@@ -1,8 +1,15 @@
1
- export const normalizeEventSelector = (selector) => {
2
- if (typeof selector === "string") {
3
- const source = selector.split(".")[0];
4
- return { scope: source, event: selector };
5
- }
6
- return { scope: selector.scope, event: selector.event };
1
+ //#region src/types/events.ts
2
+ const normalizeEventSelector = (selector) => {
3
+ if (typeof selector === "string") return {
4
+ scope: selector.split(".")[0],
5
+ event: selector
6
+ };
7
+ return {
8
+ scope: selector.scope,
9
+ event: selector.event
10
+ };
7
11
  };
12
+ //#endregion
13
+ export { normalizeEventSelector };
14
+
8
15
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAgEA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAwC,EACxC,EAAE;IACF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAgC,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AAC1D,CAAC,CAAC"}
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../src/types/events.ts"],"sourcesContent":["import type {\n AssistantClientAccessor,\n ClientEvents,\n ClientNames,\n} from \"./client\";\n\n// --- Event Map Construction ---\ntype UnionToIntersection<U> = (\n U extends unknown\n ? (x: U) => void\n : never\n) extends (x: infer I) => void\n ? I\n : never;\n\ntype ClientEventMap = UnionToIntersection<\n { [K in ClientNames]: ClientEvents<K> }[ClientNames]\n>;\n\n// --- Core Types ---\n\ntype WildcardPayload = {\n [K in keyof ClientEventMap]: { event: K; payload: ClientEventMap[K] };\n}[keyof ClientEventMap];\n\nexport type AssistantEventPayload = ClientEventMap & { \"*\": WildcardPayload };\n\nexport type AssistantEventName = keyof AssistantEventPayload;\n\ntype EventSource<T extends AssistantEventName> =\n T extends `${infer Source}.${string}` ? Source : never;\n\n// --- Scoping ---\n\ntype ParentOf<K extends ClientNames> =\n AssistantClientAccessor<K> extends { source: infer S }\n ? S extends ClientNames\n ? S\n : never\n : never;\n\ntype AncestorsOf<\n K extends ClientNames,\n Seen extends ClientNames = never,\n> = K extends Seen\n ? never\n : ParentOf<K> extends never\n ? never\n : ParentOf<K> | AncestorsOf<ParentOf<K>, Seen | K>;\n\n/** Valid scopes: `\"*\"` | event source | ancestors of event source */\nexport type AssistantEventScope<TEvent extends AssistantEventName> =\n | \"*\"\n | EventSource<TEvent>\n | (EventSource<TEvent> extends ClientNames\n ? AncestorsOf<EventSource<TEvent>>\n : never);\n\n// --- Selection & Callbacks ---\n\nexport type AssistantEventSelector<TEvent extends AssistantEventName> =\n | TEvent\n | { scope: AssistantEventScope<TEvent>; event: TEvent };\n\nexport const normalizeEventSelector = <TEvent extends AssistantEventName>(\n selector: AssistantEventSelector<TEvent>,\n) => {\n if (typeof selector === \"string\") {\n const source = selector.split(\".\")[0] as AssistantEventScope<TEvent>;\n return { scope: source, event: selector };\n }\n return { scope: selector.scope, event: selector.event };\n};\n\nexport type AssistantEventCallback<TEvent extends AssistantEventName> = (\n payload: AssistantEventPayload[TEvent],\n) => void;\n"],"mappings":";AAgEA,MAAa,0BACX,aACG;CACH,IAAI,OAAO,aAAa,UAEtB,OAAO;EAAE,OADM,SAAS,MAAM,GAAG,EAAE;EACX,OAAO;CAAS;CAE1C,OAAO;EAAE,OAAO,SAAS;EAAO,OAAO,SAAS;CAAM;AACxD"}
package/dist/useAui.d.ts CHANGED
@@ -1,23 +1,84 @@
1
- import type { AssistantClient, ClientNames, ClientElement } from "./types/client.js";
2
- import type { DerivedElement } from "./Derived.js";
1
+ import { AssistantClient, ClientElement, ClientNames } from "./types/client.js";
2
+ import { DerivedElement } from "./Derived.js";
3
+
4
+ //#region src/useAui.d.ts
3
5
  /**
4
6
  * Resource that creates an extended AssistantClient.
5
7
  */
6
- export declare const AssistantClientResource: (props: {
7
- parent: AssistantClient;
8
- clients: useAui.Props;
8
+ declare const AssistantClientResource: (props: {
9
+ parent: AssistantClient;
10
+ clients: useAui.Props;
9
11
  }) => import("@assistant-ui/tap").ResourceElement<AssistantClient, {
10
- parent: AssistantClient;
11
- clients: useAui.Props;
12
+ parent: AssistantClient;
13
+ clients: useAui.Props;
12
14
  }>;
13
- export declare namespace useAui {
14
- type Props = {
15
- [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;
16
- };
15
+ declare namespace useAui {
16
+ type Props = { [K in ClientNames]?: ClientElement<K> | DerivedElement<K> };
17
17
  }
18
- export declare function useAui(): AssistantClient;
19
- export declare function useAui(clients: useAui.Props): AssistantClient;
20
- export declare function useAui(clients: useAui.Props, config: {
21
- parent: null | AssistantClient;
18
+ /**
19
+ * Returns the current `AssistantClient` from context.
20
+ *
21
+ * Read the client supplied by the nearest {@link AuiProvider} or
22
+ * {@link AssistantRuntimeProvider}, then access a scope on it —
23
+ * `aui.thread()`, `aui.composer()`, `aui.message()`, and so on. Pair
24
+ * with {@link useAuiState} to read reactive state and {@link useAuiEvent}
25
+ * to subscribe to events. The returned client also exposes lower-level
26
+ * methods such as `aui.on(...)` and `aui.subscribe(...)`; prefer
27
+ * `useAuiEvent` for React event subscriptions.
28
+ *
29
+ * Rendered outside a provider, the returned client's scope accessors
30
+ * throw a descriptive error whenever they are called.
31
+ *
32
+ * @example
33
+ * ```tsx
34
+ * const aui = useAui();
35
+ *
36
+ * const onSend = () => aui.composer().send();
37
+ * const onCancel = () => aui.thread().cancelRun();
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * // Combine with useAuiState to drive disabled state.
43
+ * const aui = useAui();
44
+ * const isRunning = useAuiState((s) => s.thread.isRunning);
45
+ *
46
+ * return (
47
+ * <button disabled={isRunning} onClick={() => aui.composer().send()}>
48
+ * Send
49
+ * </button>
50
+ * );
51
+ * ```
52
+ */
53
+ declare function useAui(): AssistantClient;
54
+ /**
55
+ * Extends the parent `AssistantClient` with additional scopes.
56
+ *
57
+ * Advanced overload used when building primitives or providers — for example,
58
+ * when a custom provider needs to register a `message`, `part`, or other scope
59
+ * onto the client visible to its descendants. Application code rarely reaches
60
+ * for this; use {@link useAui} with no arguments to read the existing client.
61
+ *
62
+ * @example
63
+ * ```tsx
64
+ * const aui = useAui({
65
+ * message: Derived({
66
+ * source: "thread",
67
+ * query: { index: 0 },
68
+ * get: (aui) => aui.thread().message({ index: 0 }),
69
+ * }),
70
+ * });
71
+ *
72
+ * const role = useAuiState((s) => s.message.role);
73
+ * ```
74
+ */
75
+ declare function useAui(clients: useAui.Props): AssistantClient;
76
+ /**
77
+ * Extends an explicit parent `AssistantClient` with additional scopes.
78
+ */
79
+ declare function useAui(clients: useAui.Props, config: {
80
+ parent: null | AssistantClient;
22
81
  }): AssistantClient;
82
+ //#endregion
83
+ export { AssistantClientResource, useAui };
23
84
  //# sourceMappingURL=useAui.d.ts.map