@assistant-ui/store 0.0.4 → 0.0.5

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 (79) hide show
  1. package/dist/AssistantIf.d.ts +1 -1
  2. package/dist/AssistantIf.d.ts.map +1 -1
  3. package/dist/AssistantIf.js +3 -8
  4. package/dist/AssistantIf.js.map +1 -1
  5. package/dist/Derived.d.ts +1 -1
  6. package/dist/Derived.d.ts.map +1 -1
  7. package/dist/Derived.js +21 -8
  8. package/dist/Derived.js.map +1 -1
  9. package/dist/attachDefaultPeers.d.ts +2 -2
  10. package/dist/attachDefaultPeers.d.ts.map +1 -1
  11. package/dist/attachDefaultPeers.js +47 -18
  12. package/dist/attachDefaultPeers.js.map +1 -1
  13. package/dist/index.d.ts +14 -14
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +15 -29
  16. package/dist/index.js.map +1 -1
  17. package/dist/tapClientList.d.ts +1 -1
  18. package/dist/tapClientList.d.ts.map +1 -1
  19. package/dist/tapClientList.js +56 -66
  20. package/dist/tapClientList.js.map +1 -1
  21. package/dist/tapClientLookup.d.ts +1 -1
  22. package/dist/tapClientLookup.d.ts.map +1 -1
  23. package/dist/tapClientLookup.js +25 -37
  24. package/dist/tapClientLookup.js.map +1 -1
  25. package/dist/tapClientResource.d.ts +1 -1
  26. package/dist/tapClientResource.d.ts.map +1 -1
  27. package/dist/tapClientResource.js +85 -88
  28. package/dist/tapClientResource.js.map +1 -1
  29. package/dist/types/client.d.ts +1 -1
  30. package/dist/types/client.d.ts.map +1 -1
  31. package/dist/types/client.js +1 -0
  32. package/dist/types/client.js.map +1 -1
  33. package/dist/types/events.d.ts +1 -1
  34. package/dist/types/events.d.ts.map +1 -1
  35. package/dist/types/events.js +6 -10
  36. package/dist/types/events.js.map +1 -1
  37. package/dist/useAssistantClient.d.ts +2 -2
  38. package/dist/useAssistantClient.d.ts.map +1 -1
  39. package/dist/useAssistantClient.js +118 -194
  40. package/dist/useAssistantClient.js.map +1 -1
  41. package/dist/useAssistantEvent.d.ts +1 -1
  42. package/dist/useAssistantEvent.d.ts.map +1 -1
  43. package/dist/useAssistantEvent.js +5 -9
  44. package/dist/useAssistantEvent.js.map +1 -1
  45. package/dist/useAssistantState.d.ts +1 -1
  46. package/dist/useAssistantState.d.ts.map +1 -1
  47. package/dist/useAssistantState.js +24 -19
  48. package/dist/useAssistantState.js.map +1 -1
  49. package/dist/utils/BaseProxyHandler.js +43 -38
  50. package/dist/utils/BaseProxyHandler.js.map +1 -1
  51. package/dist/utils/NotificationManager.d.ts +3 -3
  52. package/dist/utils/NotificationManager.d.ts.map +1 -1
  53. package/dist/utils/NotificationManager.js +76 -77
  54. package/dist/utils/NotificationManager.js.map +1 -1
  55. package/dist/utils/StoreResource.d.ts +1 -1
  56. package/dist/utils/StoreResource.d.ts.map +1 -1
  57. package/dist/utils/StoreResource.js +5 -16
  58. package/dist/utils/StoreResource.js.map +1 -1
  59. package/dist/utils/proxied-assistant-state.d.ts +1 -1
  60. package/dist/utils/proxied-assistant-state.d.ts.map +1 -1
  61. package/dist/utils/proxied-assistant-state.js +26 -33
  62. package/dist/utils/proxied-assistant-state.js.map +1 -1
  63. package/dist/utils/react-assistant-context.d.ts +1 -1
  64. package/dist/utils/react-assistant-context.d.ts.map +1 -1
  65. package/dist/utils/react-assistant-context.js +61 -66
  66. package/dist/utils/react-assistant-context.js.map +1 -1
  67. package/dist/utils/splitClients.d.ts +3 -3
  68. package/dist/utils/splitClients.d.ts.map +1 -1
  69. package/dist/utils/splitClients.js +48 -31
  70. package/dist/utils/splitClients.js.map +1 -1
  71. package/dist/utils/tap-assistant-context.d.ts +3 -3
  72. package/dist/utils/tap-assistant-context.d.ts.map +1 -1
  73. package/dist/utils/tap-assistant-context.js +17 -31
  74. package/dist/utils/tap-assistant-context.js.map +1 -1
  75. package/dist/utils/tap-client-stack-context.d.ts +1 -1
  76. package/dist/utils/tap-client-stack-context.d.ts.map +1 -1
  77. package/dist/utils/tap-client-stack-context.js +24 -26
  78. package/dist/utils/tap-client-stack-context.js.map +1 -1
  79. package/package.json +23 -9
@@ -1,5 +1,5 @@
1
1
  import type { FC, PropsWithChildren } from "react";
2
- import type { AssistantState } from "./types/client";
2
+ import type { AssistantState } from "./types/client.js";
3
3
  export declare namespace AssistantIf {
4
4
  type Props = PropsWithChildren<{
5
5
  condition: AssistantIf.Condition;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantIf.d.ts","sourceRoot":"","sources":["../src/AssistantIf.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,yBAAiB,WAAW,CAAC;IAC3B,KAAY,KAAK,GAAG,iBAAiB,CAAC;QAAE,SAAS,EAAE,WAAW,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAC5E,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAG7C,CAAC"}
1
+ {"version":3,"file":"AssistantIf.d.ts","sourceRoot":"","sources":["../src/AssistantIf.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,0BAAuB;AAErD,yBAAiB,WAAW,CAAC;IAC3B,KAAY,KAAK,GAAG,iBAAiB,CAAC;QAAE,SAAS,EAAE,WAAW,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;IAC5E,KAAY,SAAS,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC;CAC5D;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAG7C,CAAC"}
@@ -1,13 +1,8 @@
1
1
  "use client";
2
-
3
- // src/AssistantIf.tsx
4
2
  import { useAssistantState } from "./useAssistantState.js";
5
- var AssistantIf = ({ children, condition }) => {
6
- const result = useAssistantState(condition);
7
- return result ? children : null;
3
+ export const AssistantIf = ({ children, condition }) => {
4
+ const result = useAssistantState(condition);
5
+ return result ? children : null;
8
6
  };
9
7
  AssistantIf.displayName = "AssistantIf";
10
- export {
11
- AssistantIf
12
- };
13
8
  //# sourceMappingURL=AssistantIf.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AssistantIf.tsx"],"sourcesContent":["\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useAssistantState } from \"./useAssistantState\";\nimport type { AssistantState } from \"./types/client\";\n\nexport namespace AssistantIf {\n export type Props = PropsWithChildren<{ condition: AssistantIf.Condition }>;\n export type Condition = (state: AssistantState) => boolean;\n}\n\nexport const AssistantIf: FC<AssistantIf.Props> = ({ children, condition }) => {\n const result = useAssistantState(condition);\n return result ? children : null;\n};\n\nAssistantIf.displayName = \"AssistantIf\";\n"],"mappings":";;;AAGA,SAAS,yBAAyB;AAQ3B,IAAM,cAAqC,CAAC,EAAE,UAAU,UAAU,MAAM;AAC7E,QAAM,SAAS,kBAAkB,SAAS;AAC1C,SAAO,SAAS,WAAW;AAC7B;AAEA,YAAY,cAAc;","names":[]}
1
+ {"version":3,"file":"AssistantIf.js","sourceRoot":"","sources":["../src/AssistantIf.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAQxD,MAAM,CAAC,MAAM,WAAW,GAA0B,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC,CAAC;AAEF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC"}
package/dist/Derived.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { ResourceElement } from "@assistant-ui/tap";
2
- import type { AssistantClient, ClientNames, AssistantClientAccessor, ClientMeta } from "./types/client";
2
+ import type { AssistantClient, ClientNames, AssistantClientAccessor, ClientMeta } from "./types/client.js";
3
3
  /**
4
4
  * Creates a derived client field that references a client from a parent scope.
5
5
  * The get callback always calls the most recent version (useEffectEvent pattern).
@@ -1 +1 @@
1
- {"version":3,"file":"Derived.d.ts","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GACjB,CAAC,SAAS,WAAW,kJAGvB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI,eAAe,CACjE,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC;AAEF,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI;QACzC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CAC/E"}
1
+ {"version":3,"file":"Derived.d.ts","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,uBAAuB,EACvB,UAAU,EACX,0BAAuB;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO,GACjB,CAAC,SAAS,WAAW,kJAGvB,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,WAAW,IAAI,eAAe,CACjE,IAAI,EACJ,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACjB,CAAC;AAEF,yBAAiB,OAAO,CAAC;IACvB;;OAEG;IACH,KAAY,KAAK,CAAC,CAAC,SAAS,WAAW,IAAI;QACzC,GAAG,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1E,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,UAAU,CAAC,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CAC/E"}
package/dist/Derived.js CHANGED
@@ -1,11 +1,24 @@
1
- // src/Derived.ts
2
1
  import { resource } from "@assistant-ui/tap";
3
- var Derived = resource(
4
- (_config) => {
2
+ /**
3
+ * Creates a derived client field that references a client from a parent scope.
4
+ * The get callback always calls the most recent version (useEffectEvent pattern).
5
+ *
6
+ * IMPORTANT: The `get` callback must return a client that was created via
7
+ * `tapClientResource` (or `tapClientLookup`/`tapClientList` which use it internally).
8
+ * This is required for event scoping to work correctly.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const aui = useAssistantClient({
13
+ * message: Derived({
14
+ * source: "thread",
15
+ * query: { index: 0 },
16
+ * get: (aui) => aui.thread().message({ index: 0 }),
17
+ * }),
18
+ * });
19
+ * ```
20
+ */
21
+ export const Derived = resource((_config) => {
5
22
  return null;
6
- }
7
- );
8
- export {
9
- Derived
10
- };
23
+ });
11
24
  //# sourceMappingURL=Derived.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Derived.ts"],"sourcesContent":["import { resource, ResourceElement } from \"@assistant-ui/tap\";\nimport type {\n AssistantClient,\n ClientNames,\n AssistantClientAccessor,\n ClientMeta,\n} from \"./types/client\";\n\n/**\n * Creates a derived client field that references a client from a parent scope.\n * The get callback always calls the most recent version (useEffectEvent pattern).\n *\n * IMPORTANT: The `get` callback must return a client that was created via\n * `tapClientResource` (or `tapClientLookup`/`tapClientList` which use it internally).\n * This is required for event scoping to work correctly.\n *\n * @example\n * ```typescript\n * const aui = useAssistantClient({\n * message: Derived({\n * source: \"thread\",\n * query: { index: 0 },\n * get: (aui) => aui.thread().message({ index: 0 }),\n * }),\n * });\n * ```\n */\nexport const Derived = resource(\n <K extends ClientNames>(_config: Derived.Props<K>): null => {\n return null;\n },\n);\n\nexport type DerivedElement<K extends ClientNames> = ResourceElement<\n null,\n Derived.Props<K>\n>;\n\nexport namespace Derived {\n /**\n * Props passed to a derived client resource element.\n */\n export type Props<K extends ClientNames> = {\n get: (client: AssistantClient) => ReturnType<AssistantClientAccessor<K>>;\n } & (ClientMeta<K> | { getMeta: (client: AssistantClient) => ClientMeta<K> });\n}\n"],"mappings":";AAAA,SAAS,gBAAiC;AA2BnC,IAAM,UAAU;AAAA,EACrB,CAAwB,YAAoC;AAC1D,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"file":"Derived.js","sourceRoot":"","sources":["../src/Derived.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAQ9D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAC7B,CAAwB,OAAyB,EAAQ,EAAE;IACzD,OAAO,IAAI,CAAC;AACd,CAAC,CACF,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ResourceElement } from "@assistant-ui/tap";
2
- import type { ClientElement, ClientNames } from "./types/client";
3
- import type { DerivedElement } from "./Derived";
2
+ import type { ClientElement, ClientNames } from "./types/client.js";
3
+ import type { DerivedElement } from "./Derived.js";
4
4
  /**
5
5
  * Symbol used to store default peer clients on a resource.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"attachDefaultPeers.d.ts","sourceRoot":"","sources":["../src/attachDefaultPeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,QAAA,MAAM,aAAa,eAAuC,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;KACxB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAaxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,GAAG,YAAY,GAAG,SAAS,CAEvC"}
1
+ {"version":3,"file":"attachDefaultPeers.d.ts","sourceRoot":"","sources":["../src/attachDefaultPeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,0BAAuB;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAkB;AAEhD;;GAEG;AACH,QAAA,MAAM,aAAa,eAAuC,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;KACxB,CAAC,IAAI,WAAW,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAaxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,CAAC,EAClD,QAAQ,EAAE,CAAC,GAAG,YAAY,GAAG,SAAS,CAEvC"}
@@ -1,22 +1,51 @@
1
- // src/attachDefaultPeers.ts
2
- var DEFAULT_PEERS = /* @__PURE__ */ Symbol("assistant-ui.default-peers");
3
- function attachDefaultPeers(resource, peers) {
4
- const resourceWithPeers = resource;
5
- const existing = resourceWithPeers[DEFAULT_PEERS] ?? {};
6
- for (const key of Object.keys(peers)) {
7
- if (key in existing) {
8
- throw new Error(
9
- `Default peer "${key}" is already attached to this resource`
10
- );
1
+ /**
2
+ * Symbol used to store default peer clients on a resource.
3
+ */
4
+ const DEFAULT_PEERS = Symbol("assistant-ui.default-peers");
5
+ /**
6
+ * Attaches default peer clients to a resource.
7
+ *
8
+ * Default peers are only applied if the scope doesn't exist:
9
+ * - Not defined in parent context
10
+ * - Not provided by user
11
+ * - Not already defined by a previous resource's default peers
12
+ *
13
+ * First definition wins - no overriding is permitted.
14
+ *
15
+ * @param resource - The resource to attach default peers to
16
+ * @param peers - The default peer clients to attach
17
+ * @throws Error if a peer key already exists in the resource's default peers
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const ThreadListClient = resource(({ ... }) => { ... });
22
+ *
23
+ * attachDefaultPeers(ThreadListClient, {
24
+ * // Derived default peers
25
+ * thread: Derived({ source: "threads", query: { type: "main" }, get: ... }),
26
+ * threadListItem: Derived({ ... }),
27
+ * composer: Derived({ getMeta: ..., get: ... }),
28
+ *
29
+ * // Root default peers
30
+ * tools: Tools({}),
31
+ * modelContext: ModelContext({}),
32
+ * });
33
+ * ```
34
+ */
35
+ export function attachDefaultPeers(resource, peers) {
36
+ const resourceWithPeers = resource;
37
+ const existing = resourceWithPeers[DEFAULT_PEERS] ?? {};
38
+ for (const key of Object.keys(peers)) {
39
+ if (key in existing) {
40
+ throw new Error(`Default peer "${key}" is already attached to this resource`);
41
+ }
11
42
  }
12
- }
13
- resourceWithPeers[DEFAULT_PEERS] = { ...existing, ...peers };
43
+ resourceWithPeers[DEFAULT_PEERS] = { ...existing, ...peers };
14
44
  }
15
- function getDefaultPeers(resource) {
16
- return resource[DEFAULT_PEERS];
45
+ /**
46
+ * Gets the default peers attached to a resource, if any.
47
+ */
48
+ export function getDefaultPeers(resource) {
49
+ return resource[DEFAULT_PEERS];
17
50
  }
18
- export {
19
- attachDefaultPeers,
20
- getDefaultPeers
21
- };
22
51
  //# sourceMappingURL=attachDefaultPeers.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/attachDefaultPeers.ts"],"sourcesContent":["import type { ResourceElement } from \"@assistant-ui/tap\";\nimport type { ClientElement, ClientNames } from \"./types/client\";\nimport type { DerivedElement } from \"./Derived\";\n\n/**\n * Symbol used to store default peer clients on a resource.\n */\nconst DEFAULT_PEERS = Symbol(\"assistant-ui.default-peers\");\n\n/**\n * Type for resources that have default peers attached.\n */\nexport type ResourceWithDefaultPeers = {\n [DEFAULT_PEERS]?: DefaultPeers;\n};\n\n/**\n * Default peers configuration - can be either root clients or derived clients.\n */\nexport type DefaultPeers = {\n [K in ClientNames]?: ClientElement<K> | DerivedElement<K>;\n};\n\n/**\n * Attaches default peer clients to a resource.\n *\n * Default peers are only applied if the scope doesn't exist:\n * - Not defined in parent context\n * - Not provided by user\n * - Not already defined by a previous resource's default peers\n *\n * First definition wins - no overriding is permitted.\n *\n * @param resource - The resource to attach default peers to\n * @param peers - The default peer clients to attach\n * @throws Error if a peer key already exists in the resource's default peers\n *\n * @example\n * ```typescript\n * const ThreadListClient = resource(({ ... }) => { ... });\n *\n * attachDefaultPeers(ThreadListClient, {\n * // Derived default peers\n * thread: Derived({ source: \"threads\", query: { type: \"main\" }, get: ... }),\n * threadListItem: Derived({ ... }),\n * composer: Derived({ getMeta: ..., get: ... }),\n *\n * // Root default peers\n * tools: Tools({}),\n * modelContext: ModelContext({}),\n * });\n * ```\n */\nexport function attachDefaultPeers<\n T extends (...args: any[]) => ResourceElement<any>,\n>(resource: T, peers: DefaultPeers): void {\n const resourceWithPeers = resource as T & ResourceWithDefaultPeers;\n const existing = resourceWithPeers[DEFAULT_PEERS] ?? {};\n\n for (const key of Object.keys(peers)) {\n if (key in existing) {\n throw new Error(\n `Default peer \"${key}\" is already attached to this resource`,\n );\n }\n }\n\n resourceWithPeers[DEFAULT_PEERS] = { ...existing, ...peers };\n}\n\n/**\n * Gets the default peers attached to a resource, if any.\n */\nexport function getDefaultPeers<\n T extends (...args: any[]) => ResourceElement<any>,\n>(resource: T): DefaultPeers | undefined {\n return (resource as T & ResourceWithDefaultPeers)[DEFAULT_PEERS];\n}\n"],"mappings":";AAOA,IAAM,gBAAgB,uBAAO,4BAA4B;AA8ClD,SAAS,mBAEd,UAAa,OAA2B;AACxC,QAAM,oBAAoB;AAC1B,QAAM,WAAW,kBAAkB,aAAa,KAAK,CAAC;AAEtD,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,OAAO,UAAU;AACnB,YAAM,IAAI;AAAA,QACR,iBAAiB,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,oBAAkB,aAAa,IAAI,EAAE,GAAG,UAAU,GAAG,MAAM;AAC7D;AAKO,SAAS,gBAEd,UAAuC;AACvC,SAAQ,SAA0C,aAAa;AACjE;","names":[]}
1
+ {"version":3,"file":"attachDefaultPeers.js","sourceRoot":"","sources":["../src/attachDefaultPeers.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,aAAa,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAgB3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,kBAAkB,CAEhC,QAAW,EAAE,KAAmB;IAChC,MAAM,iBAAiB,GAAG,QAAwC,CAAC;IACnE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAExD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,iBAAiB,GAAG,wCAAwC,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAE7B,QAAW;IACX,OAAQ,QAAyC,CAAC,aAAa,CAAC,CAAC;AACnE,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,15 @@
1
- export { useAssistantClient } from "./useAssistantClient";
2
- export { useAssistantState } from "./useAssistantState";
3
- export { useAssistantEvent } from "./useAssistantEvent";
4
- export { AssistantIf } from "./AssistantIf";
5
- export { AssistantProvider } from "./utils/react-assistant-context";
6
- export { Derived } from "./Derived";
7
- export { attachDefaultPeers } from "./attachDefaultPeers";
8
- export { tapAssistantClientRef, tapAssistantEmit, } from "./utils/tap-assistant-context";
9
- export { tapClientResource } from "./tapClientResource";
10
- export { tapClientLookup } from "./tapClientLookup";
11
- export { tapClientList } from "./tapClientList";
12
- export type { ClientRegistry, ClientOutput, AssistantClient, AssistantState, } from "./types/client";
13
- export type { AssistantEventName, AssistantEventCallback, AssistantEventPayload, AssistantEventSelector, AssistantEventScope, } from "./types/events";
14
- export type { DefaultPeers } from "./attachDefaultPeers";
1
+ export { useAssistantClient } from "./useAssistantClient.js";
2
+ export { useAssistantState } from "./useAssistantState.js";
3
+ export { useAssistantEvent } from "./useAssistantEvent.js";
4
+ export { AssistantIf } from "./AssistantIf.js";
5
+ export { AssistantProvider } from "./utils/react-assistant-context.js";
6
+ export { Derived } from "./Derived.js";
7
+ export { attachDefaultPeers } from "./attachDefaultPeers.js";
8
+ export { tapAssistantClientRef, tapAssistantEmit, } from "./utils/tap-assistant-context.js";
9
+ export { tapClientResource } from "./tapClientResource.js";
10
+ export { tapClientLookup } from "./tapClientLookup.js";
11
+ export { tapClientList } from "./tapClientList.js";
12
+ export type { ClientRegistry, ClientOutput, AssistantClient, AssistantState, } from "./types/client.js";
13
+ export type { AssistantEventName, AssistantEventCallback, AssistantEventPayload, AssistantEventSelector, AssistantEventScope, } from "./types/events.js";
14
+ export type { DefaultPeers } from "./attachDefaultPeers.js";
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAGxD,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,iBAAiB,EAAE,2CAAwC;AAGpE,OAAO,EAAE,OAAO,EAAE,qBAAkB;AACpC,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAG1D,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,yCAAsC;AACvC,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AACpD,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAGhD,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,cAAc,GACf,0BAAuB;AACxB,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,0BAAuB;AACxB,YAAY,EAAE,YAAY,EAAE,gCAA6B"}
package/dist/index.js CHANGED
@@ -1,30 +1,16 @@
1
- // src/index.ts
2
- import { useAssistantClient } from "./useAssistantClient.js";
3
- import { useAssistantState } from "./useAssistantState.js";
4
- import { useAssistantEvent } from "./useAssistantEvent.js";
5
- import { AssistantIf } from "./AssistantIf.js";
6
- import { AssistantProvider } from "./utils/react-assistant-context.js";
7
- import { Derived } from "./Derived.js";
8
- import { attachDefaultPeers } from "./attachDefaultPeers.js";
9
- import {
10
- tapAssistantClientRef,
11
- tapAssistantEmit
12
- } from "./utils/tap-assistant-context.js";
13
- import { tapClientResource } from "./tapClientResource.js";
14
- import { tapClientLookup } from "./tapClientLookup.js";
15
- import { tapClientList } from "./tapClientList.js";
16
- export {
17
- AssistantIf,
18
- AssistantProvider,
19
- Derived,
20
- attachDefaultPeers,
21
- tapAssistantClientRef,
22
- tapAssistantEmit,
23
- tapClientList,
24
- tapClientLookup,
25
- tapClientResource,
26
- useAssistantClient,
27
- useAssistantEvent,
28
- useAssistantState
29
- };
1
+ // hooks
2
+ export { useAssistantClient } from "./useAssistantClient.js";
3
+ export { useAssistantState } from "./useAssistantState.js";
4
+ export { useAssistantEvent } from "./useAssistantEvent.js";
5
+ // components
6
+ export { AssistantIf } from "./AssistantIf.js";
7
+ export { AssistantProvider } from "./utils/react-assistant-context.js";
8
+ // resources
9
+ export { Derived } from "./Derived.js";
10
+ export { attachDefaultPeers } from "./attachDefaultPeers.js";
11
+ // tap hooks
12
+ export { tapAssistantClientRef, tapAssistantEmit, } from "./utils/tap-assistant-context.js";
13
+ export { tapClientResource } from "./tapClientResource.js";
14
+ export { tapClientLookup } from "./tapClientLookup.js";
15
+ export { tapClientList } from "./tapClientList.js";
30
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// hooks\nexport { useAssistantClient } from \"./useAssistantClient\";\nexport { useAssistantState } from \"./useAssistantState\";\nexport { useAssistantEvent } from \"./useAssistantEvent\";\n\n// components\nexport { AssistantIf } from \"./AssistantIf\";\nexport { AssistantProvider } from \"./utils/react-assistant-context\";\n\n// resources\nexport { Derived } from \"./Derived\";\nexport { attachDefaultPeers } from \"./attachDefaultPeers\";\n\n// tap hooks\nexport {\n tapAssistantClientRef,\n tapAssistantEmit,\n} from \"./utils/tap-assistant-context\";\nexport { tapClientResource } from \"./tapClientResource\";\nexport { tapClientLookup } from \"./tapClientLookup\";\nexport { tapClientList } from \"./tapClientList\";\n\n// types\nexport type {\n ClientRegistry,\n ClientOutput,\n AssistantClient,\n AssistantState,\n} from \"./types/client\";\nexport type {\n AssistantEventName,\n AssistantEventCallback,\n AssistantEventPayload,\n AssistantEventSelector,\n AssistantEventScope,\n} from \"./types/events\";\nexport type { DefaultPeers } from \"./attachDefaultPeers\";\n"],"mappings":";AACA,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAGlC,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAGlC,SAAS,eAAe;AACxB,SAAS,0BAA0B;AAGnC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;","names":[]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAC1D,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AAExD,aAAa;AACb,OAAO,EAAE,WAAW,EAAE,yBAAsB;AAC5C,OAAO,EAAE,iBAAiB,EAAE,2CAAwC;AAEpE,YAAY;AACZ,OAAO,EAAE,OAAO,EAAE,qBAAkB;AACpC,OAAO,EAAE,kBAAkB,EAAE,gCAA6B;AAE1D,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,gBAAgB,GACjB,yCAAsC;AACvC,OAAO,EAAE,iBAAiB,EAAE,+BAA4B;AACxD,OAAO,EAAE,eAAe,EAAE,6BAA0B;AACpD,OAAO,EAAE,aAAa,EAAE,2BAAwB"}
@@ -1,5 +1,5 @@
1
1
  import type { ContravariantResource } from "@assistant-ui/tap";
2
- import type { ClientMethods, ClientOutputOf } from "./types/client";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client.js";
3
3
  export declare const tapClientList: <TData, TState, TMethods extends ClientMethods>(props: tapClientList.Props<TData, TState, TMethods>) => {
4
4
  state: TState[];
5
5
  get: (lookup: {
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientList.d.ts","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAsBpE,eAAO,MAAM,aAAa,GAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,aAAa,EACzE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAClD;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;IAC/D,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC;CAyDnC,CAAC;AAEF,yBAAiB,aAAa,CAAC;IAC7B,KAAY,aAAa,CAAC,KAAK,IAAI;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IAEF,KAAY,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,aAAa,IAAI;QACjE,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;QAChC,QAAQ,EAAE,qBAAqB,CAC7B,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;KACH,CAAC;CACH"}
1
+ {"version":3,"file":"tapClientList.d.ts","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,0BAAuB;AAsBpE,eAAO,MAAM,aAAa,GAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,aAAa,EACzE,OAAO,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,KAClD;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,QAAQ,CAAC;IAC/D,GAAG,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC;CAyDnC,CAAC;AAEF,yBAAiB,aAAa,CAAC;IAC7B,KAAY,aAAa,CAAC,KAAK,IAAI;QACjC,GAAG,EAAE,MAAM,CAAC;QACZ,cAAc,EAAE,MAAM,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,CAAC;IAEF,KAAY,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAS,aAAa,IAAI;QACjE,aAAa,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC;QAChC,QAAQ,EAAE,qBAAqB,CAC7B,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;KACH,CAAC;CACH"}
@@ -1,72 +1,62 @@
1
- // src/tapClientList.ts
2
1
  import { tapState } from "@assistant-ui/tap";
3
2
  import { tapClientLookup } from "./tapClientLookup.js";
4
- var createProps = (key, data, remove) => {
5
- let initialData = { data };
6
- return {
7
- key,
8
- getInitialData: () => {
9
- if (!initialData) {
10
- throw new Error("getInitialData may only be called once");
11
- }
12
- const data2 = initialData.data;
13
- initialData = void 0;
14
- return data2;
15
- },
16
- remove
17
- };
18
- };
19
- var tapClientList = (props) => {
20
- const { initialValues, getKey, resource: Resource } = props;
21
- const [items, setItems] = tapState(() => {
22
- const entries = [];
23
- for (const data of initialValues) {
24
- const key = getKey(data);
25
- entries.push([
3
+ const createProps = (key, data, remove) => {
4
+ let initialData = { data };
5
+ return {
26
6
  key,
27
- createProps(key, data, () => {
28
- setItems((items2) => {
29
- const newItems = { ...items2 };
30
- delete newItems[key];
31
- return newItems;
32
- });
33
- })
34
- ]);
35
- }
36
- return Object.fromEntries(entries);
37
- });
38
- const lookup = tapClientLookup(
39
- items,
40
- Resource,
41
- [Resource]
42
- );
43
- const add = (data) => {
44
- const key = getKey(data);
45
- setItems((items2) => {
46
- if (key in items2) {
47
- throw new Error(
48
- `Tried to add item with a key ${key} that already exists`
49
- );
50
- }
51
- return {
52
- ...items2,
53
- [key]: createProps(key, data, () => {
54
- setItems((items3) => {
55
- const newItems = { ...items3 };
56
- delete newItems[key];
57
- return newItems;
58
- });
59
- })
60
- };
61
- });
62
- };
63
- return {
64
- state: lookup.state,
65
- get: lookup.get,
66
- add
67
- };
7
+ getInitialData: () => {
8
+ if (!initialData) {
9
+ throw new Error("getInitialData may only be called once");
10
+ }
11
+ const data = initialData.data;
12
+ initialData = undefined;
13
+ return data;
14
+ },
15
+ remove,
16
+ };
68
17
  };
69
- export {
70
- tapClientList
18
+ export const tapClientList = (props) => {
19
+ const { initialValues, getKey, resource: Resource } = props;
20
+ const [items, setItems] = tapState(() => {
21
+ const entries = [];
22
+ for (const data of initialValues) {
23
+ const key = getKey(data);
24
+ entries.push([
25
+ key,
26
+ createProps(key, data, () => {
27
+ setItems((items) => {
28
+ const newItems = { ...items };
29
+ delete newItems[key];
30
+ return newItems;
31
+ });
32
+ }),
33
+ ]);
34
+ }
35
+ return Object.fromEntries(entries);
36
+ });
37
+ const lookup = tapClientLookup(items, Resource, [Resource]);
38
+ const add = (data) => {
39
+ const key = getKey(data);
40
+ setItems((items) => {
41
+ if (key in items) {
42
+ throw new Error(`Tried to add item with a key ${key} that already exists`);
43
+ }
44
+ return {
45
+ ...items,
46
+ [key]: createProps(key, data, () => {
47
+ setItems((items) => {
48
+ const newItems = { ...items };
49
+ delete newItems[key];
50
+ return newItems;
51
+ });
52
+ }),
53
+ };
54
+ });
55
+ };
56
+ return {
57
+ state: lookup.state,
58
+ get: lookup.get,
59
+ add,
60
+ };
71
61
  };
72
62
  //# sourceMappingURL=tapClientList.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tapClientList.ts"],"sourcesContent":["import { tapState } from \"@assistant-ui/tap\";\nimport type { ContravariantResource } from \"@assistant-ui/tap\";\nimport { tapClientLookup } from \"./tapClientLookup\";\nimport type { ClientMethods, ClientOutputOf } from \"./types/client\";\n\nconst createProps = <TData>(\n key: string,\n data: TData,\n remove: () => void,\n): tapClientList.ResourceProps<TData> => {\n let initialData: { data: TData } | undefined = { data };\n return {\n key,\n getInitialData: () => {\n if (!initialData) {\n throw new Error(\"getInitialData may only be called once\");\n }\n const data = initialData.data;\n initialData = undefined;\n return data;\n },\n remove,\n };\n};\n\nexport const tapClientList = <TData, TState, TMethods extends ClientMethods>(\n props: tapClientList.Props<TData, TState, TMethods>,\n): {\n state: TState[];\n get: (lookup: { index: number } | { key: string }) => TMethods;\n add: (initialData: TData) => void;\n} => {\n const { initialValues, getKey, resource: Resource } = props;\n\n type Props = tapClientList.ResourceProps<TData>;\n\n const [items, setItems] = tapState<Record<string, Props>>(() => {\n const entries: [string, Props][] = [];\n for (const data of initialValues) {\n const key = getKey(data);\n entries.push([\n key,\n createProps(key, data, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n ]);\n }\n return Object.fromEntries(entries);\n });\n\n const lookup = tapClientLookup<TState, TMethods, Record<string, Props>>(\n items,\n Resource,\n [Resource],\n );\n\n const add = (data: TData) => {\n const key = getKey(data);\n setItems((items) => {\n if (key in items) {\n throw new Error(\n `Tried to add item with a key ${key} that already exists`,\n );\n }\n\n return {\n ...items,\n [key]: createProps(key, data, () => {\n setItems((items) => {\n const newItems = { ...items };\n delete newItems[key];\n return newItems;\n });\n }),\n };\n });\n };\n\n return {\n state: lookup.state,\n get: lookup.get,\n add,\n };\n};\n\nexport namespace tapClientList {\n export type ResourceProps<TData> = {\n key: string;\n getInitialData: () => TData;\n remove: () => void;\n };\n\n export type Props<TData, TState, TMethods extends ClientMethods> = {\n initialValues: TData[];\n getKey: (data: TData) => string;\n resource: ContravariantResource<\n ClientOutputOf<TState, TMethods>,\n ResourceProps<TData>\n >;\n };\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAGhC,IAAM,cAAc,CAClB,KACA,MACA,WACuC;AACvC,MAAI,cAA2C,EAAE,KAAK;AACtD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,MAAM;AACpB,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AACA,YAAMA,QAAO,YAAY;AACzB,oBAAc;AACd,aAAOA;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,gBAAgB,CAC3B,UAKG;AACH,QAAM,EAAE,eAAe,QAAQ,UAAU,SAAS,IAAI;AAItD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgC,MAAM;AAC9D,UAAM,UAA6B,CAAC;AACpC,eAAW,QAAQ,eAAe;AAChC,YAAM,MAAM,OAAO,IAAI;AACvB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,YAAY,KAAK,MAAM,MAAM;AAC3B,mBAAS,CAACC,WAAU;AAClB,kBAAM,WAAW,EAAE,GAAGA,OAAM;AAC5B,mBAAO,SAAS,GAAG;AACnB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AACA,WAAO,OAAO,YAAY,OAAO;AAAA,EACnC,CAAC;AAED,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,MAAM,CAAC,SAAgB;AAC3B,UAAM,MAAM,OAAO,IAAI;AACvB,aAAS,CAACA,WAAU;AAClB,UAAI,OAAOA,QAAO;AAChB,cAAM,IAAI;AAAA,UACR,gCAAgC,GAAG;AAAA,QACrC;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAGA;AAAA,QACH,CAAC,GAAG,GAAG,YAAY,KAAK,MAAM,MAAM;AAClC,mBAAS,CAACA,WAAU;AAClB,kBAAM,WAAW,EAAE,GAAGA,OAAM;AAC5B,mBAAO,SAAS,GAAG;AACnB,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,OAAO,OAAO;AAAA,IACd,KAAK,OAAO;AAAA,IACZ;AAAA,EACF;AACF;","names":["data","items"]}
1
+ {"version":3,"file":"tapClientList.js","sourceRoot":"","sources":["../src/tapClientList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,6BAA0B;AAGpD,MAAM,WAAW,GAAG,CAClB,GAAW,EACX,IAAW,EACX,MAAkB,EACkB,EAAE;IACtC,IAAI,WAAW,GAAgC,EAAE,IAAI,EAAE,CAAC;IACxD,OAAO;QACL,GAAG;QACH,cAAc,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAC9B,WAAW,GAAG,SAAS,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAmD,EAKnD,EAAE;IACF,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAI5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,GAAG,EAAE;QAC7D,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;gBACX,GAAG;gBACH,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;oBAC1B,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjB,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;wBAC9B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;wBACrB,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,eAAe,CAC5B,KAAK,EACL,QAAQ,EACR,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,GAAG,GAAG,CAAC,IAAW,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,sBAAsB,CAC1D,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;oBACjC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;wBACjB,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;wBAC9B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;wBACrB,OAAO,QAAQ,CAAC;oBAClB,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;aACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG;KACJ,CAAC;AACJ,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { ResourceElement } from "@assistant-ui/tap";
2
- import type { ClientMethods, ClientOutputOf } from "./types/client";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client.js";
3
3
  export declare const tapClientLookup: <TState, TMethods extends ClientMethods, M extends Record<string | number | symbol, any>>(map: M, getElement: (t: M[keyof M], key: keyof M) => ResourceElement<ClientOutputOf<TState, TMethods>>, getElementDeps: any[]) => {
4
4
  state: TState[];
5
5
  get: (lookup: {
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientLookup.d.ts","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGpE,eAAO,MAAM,eAAe,GAC1B,MAAM,EACN,QAAQ,SAAS,aAAa,EAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAE/C,KAAK,CAAC,EACN,YAAY,CACV,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACb,GAAG,EAAE,MAAM,CAAC,KACT,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EACtD,gBAAgB,GAAG,EAAE,KACpB;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,QAAQ,CAAC;CAsCjE,CAAC"}
1
+ {"version":3,"file":"tapClientLookup.d.ts","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,0BAAuB;AAGpE,eAAO,MAAM,eAAe,GAC1B,MAAM,EACN,QAAQ,SAAS,aAAa,EAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,EAE/C,KAAK,CAAC,EACN,YAAY,CACV,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACb,GAAG,EAAE,MAAM,CAAC,KACT,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EACtD,gBAAgB,GAAG,EAAE,KACpB;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,CAAA;KAAE,KAAK,QAAQ,CAAC;CAsCjE,CAAC"}
@@ -1,42 +1,30 @@
1
- // src/tapClientLookup.ts
2
1
  import { tapMemo, tapResources } from "@assistant-ui/tap";
3
2
  import { ClientResource } from "./tapClientResource.js";
4
- var tapClientLookup = (map, getElement, getElementDeps) => {
5
- const resources = tapResources(
6
- map,
7
- (t, key) => ClientResource(getElement(t, key)),
8
- getElementDeps
9
- );
10
- const keys = tapMemo(() => Object.keys(map), [map]);
11
- const state = tapMemo(() => {
12
- const result = new Array(keys.length);
13
- for (let i = 0; i < keys.length; i++) {
14
- result[i] = resources[keys[i]].state;
15
- }
16
- return result;
17
- }, [keys, resources]);
18
- return {
19
- state,
20
- get: (lookup) => {
21
- if ("index" in lookup) {
22
- if (lookup.index < 0 || lookup.index >= keys.length) {
23
- throw new Error(
24
- `tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`
25
- );
3
+ export const tapClientLookup = (map, getElement, getElementDeps) => {
4
+ const resources = tapResources(map, (t, key) => ClientResource(getElement(t, key)), getElementDeps);
5
+ const keys = tapMemo(() => Object.keys(map), [map]);
6
+ const state = tapMemo(() => {
7
+ const result = new Array(keys.length);
8
+ for (let i = 0; i < keys.length; i++) {
9
+ result[i] = resources[keys[i]].state;
26
10
  }
27
- return resources[keys[lookup.index]].methods;
28
- }
29
- const value = resources[lookup.key];
30
- if (!value) {
31
- throw new Error(
32
- `tapClientLookup: Key "${String(lookup.key)}" not found`
33
- );
34
- }
35
- return value.methods;
36
- }
37
- };
38
- };
39
- export {
40
- tapClientLookup
11
+ return result;
12
+ }, [keys, resources]);
13
+ return {
14
+ state,
15
+ get: (lookup) => {
16
+ if ("index" in lookup) {
17
+ if (lookup.index < 0 || lookup.index >= keys.length) {
18
+ throw new Error(`tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`);
19
+ }
20
+ return resources[keys[lookup.index]].methods;
21
+ }
22
+ const value = resources[lookup.key];
23
+ if (!value) {
24
+ throw new Error(`tapClientLookup: Key "${String(lookup.key)}" not found`);
25
+ }
26
+ return value.methods;
27
+ },
28
+ };
41
29
  };
42
30
  //# sourceMappingURL=tapClientLookup.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tapClientLookup.ts"],"sourcesContent":["import { ResourceElement, tapMemo, tapResources } from \"@assistant-ui/tap\";\nimport type { ClientMethods, ClientOutputOf } from \"./types/client\";\nimport { ClientResource } from \"./tapClientResource\";\n\nexport const tapClientLookup = <\n TState,\n TMethods extends ClientMethods,\n M extends Record<string | number | symbol, any>,\n>(\n map: M,\n getElement: (\n t: M[keyof M],\n key: keyof M,\n ) => ResourceElement<ClientOutputOf<TState, TMethods>>,\n getElementDeps: any[],\n): {\n state: TState[];\n get: (lookup: { index: number } | { key: keyof M }) => TMethods;\n} => {\n const resources = tapResources(\n map,\n (t, key) => ClientResource(getElement(t, key)),\n getElementDeps,\n );\n const keys = tapMemo(() => Object.keys(map) as (keyof M)[], [map]);\n\n const state = tapMemo(() => {\n const result = new Array(keys.length);\n for (let i = 0; i < keys.length; i++) {\n result[i] = resources[keys[i]!].state;\n }\n return result;\n }, [keys, resources]);\n\n return {\n state,\n get: (lookup: { index: number } | { key: keyof M }) => {\n if (\"index\" in lookup) {\n if (lookup.index < 0 || lookup.index >= keys.length) {\n throw new Error(\n `tapClientLookup: Index ${lookup.index} out of bounds (length: ${keys.length})`,\n );\n }\n return resources[keys[lookup.index]!]!.methods;\n }\n\n const value = resources[lookup.key];\n if (!value) {\n throw new Error(\n `tapClientLookup: Key \"${String(lookup.key)}\" not found`,\n );\n }\n return value.methods;\n },\n };\n};\n"],"mappings":";AAAA,SAA0B,SAAS,oBAAoB;AAEvD,SAAS,sBAAsB;AAExB,IAAM,kBAAkB,CAK7B,KACA,YAIA,mBAIG;AACH,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,CAAC,GAAG,QAAQ,eAAe,WAAW,GAAG,GAAG,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,MAAM,OAAO,KAAK,GAAG,GAAkB,CAAC,GAAG,CAAC;AAEjE,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,SAAS,IAAI,MAAM,KAAK,MAAM;AACpC,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,aAAO,CAAC,IAAI,UAAU,KAAK,CAAC,CAAE,EAAE;AAAA,IAClC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,SAAO;AAAA,IACL;AAAA,IACA,KAAK,CAAC,WAAiD;AACrD,UAAI,WAAW,QAAQ;AACrB,YAAI,OAAO,QAAQ,KAAK,OAAO,SAAS,KAAK,QAAQ;AACnD,gBAAM,IAAI;AAAA,YACR,0BAA0B,OAAO,KAAK,2BAA2B,KAAK,MAAM;AAAA,UAC9E;AAAA,QACF;AACA,eAAO,UAAU,KAAK,OAAO,KAAK,CAAE,EAAG;AAAA,MACzC;AAEA,YAAM,QAAQ,UAAU,OAAO,GAAG;AAClC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,yBAAyB,OAAO,OAAO,GAAG,CAAC;AAAA,QAC7C;AAAA,MACF;AACA,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"file":"tapClientLookup.js","sourceRoot":"","sources":["../src/tapClientLookup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,+BAA4B;AAErD,MAAM,CAAC,MAAM,eAAe,GAAG,CAK7B,GAAM,EACN,UAGsD,EACtD,cAAqB,EAIrB,EAAE;IACF,MAAM,SAAS,GAAG,YAAY,CAC5B,GAAG,EACH,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAC9C,cAAc,CACf,CAAC;IACF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,KAAK,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtB,OAAO;QACL,KAAK;QACL,GAAG,EAAE,CAAC,MAA4C,EAAE,EAAE;YACpD,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBACtB,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpD,MAAM,IAAI,KAAK,CACb,0BAA0B,MAAM,CAAC,KAAK,2BAA2B,IAAI,CAAC,MAAM,GAAG,CAChF,CAAC;gBACJ,CAAC;gBACD,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAE,CAAE,CAAC,OAAO,CAAC;YACjD,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CACzD,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type ResourceElement } from "@assistant-ui/tap";
2
- import type { ClientMethods, ClientOutputOf } from "./types/client";
2
+ import type { ClientMethods, ClientOutputOf } from "./types/client.js";
3
3
  export declare const getClientState: (client: ClientMethods) => unknown;
4
4
  /**
5
5
  * Resource that wraps a plain resource element to create a stable client proxy.
@@ -1 +1 @@
1
- {"version":3,"file":"tapClientResource.d.ts","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAqBpE,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,YASnD,CAAC;AA2DF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GACxB,MAAM,EAAE,QAAQ,SAAS,aAAa,mKA4BxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,EAAE,QAAQ,SAAS,aAAa,EACtE,SAAS,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,qCAG3D,CAAC"}
1
+ {"version":3,"file":"tapClientResource.d.ts","sourceRoot":"","sources":["../src/tapClientResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,0BAAuB;AAqBpE,eAAO,MAAM,cAAc,GAAI,QAAQ,aAAa,YASnD,CAAC;AA2DF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc,GACxB,MAAM,EAAE,QAAQ,SAAS,aAAa,mKA4BxC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,EAAE,QAAQ,SAAS,aAAa,EACtE,SAAS,eAAe,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,qCAG3D,CAAC"}