@assistant-ui/react 0.15.15 → 0.15.16

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 (67) hide show
  1. package/dist/devtools/DevToolsHooks.d.ts +0 -2
  2. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  3. package/dist/devtools/DevToolsHooks.js +10 -12
  4. package/dist/devtools/DevToolsHooks.js.map +1 -1
  5. package/dist/mcp-apps/McpAppRenderer.js +1 -1
  6. package/dist/mcp-apps/bridge.d.ts.map +1 -1
  7. package/dist/mcp-apps/bridge.js +2 -8
  8. package/dist/mcp-apps/bridge.js.map +1 -1
  9. package/dist/primitives/actionBar/ActionBarExportMarkdown.d.ts.map +1 -1
  10. package/dist/primitives/actionBar/ActionBarExportMarkdown.js +4 -1
  11. package/dist/primitives/actionBar/ActionBarExportMarkdown.js.map +1 -1
  12. package/dist/primitives/branchPicker/BranchPickerRoot.d.ts.map +1 -1
  13. package/dist/primitives/branchPicker/BranchPickerRoot.js +20 -15
  14. package/dist/primitives/branchPicker/BranchPickerRoot.js.map +1 -1
  15. package/dist/primitives/composer/ComposerDictationTranscript.d.ts +2 -2
  16. package/dist/primitives/composer/ComposerDictationTranscript.js +2 -2
  17. package/dist/primitives/composer/ComposerDictationTranscript.js.map +1 -1
  18. package/dist/primitives/composer/trigger/triggerSelectionResource.d.ts.map +1 -1
  19. package/dist/primitives/composer/trigger/triggerSelectionResource.js +24 -20
  20. package/dist/primitives/composer/trigger/triggerSelectionResource.js.map +1 -1
  21. package/dist/primitives/message.js +1 -1
  22. package/dist/primitives/thread/ThreadRoot.d.ts +3 -0
  23. package/dist/primitives/thread/ThreadRoot.d.ts.map +1 -1
  24. package/dist/primitives/thread/ThreadRoot.js +3 -0
  25. package/dist/primitives/thread/ThreadRoot.js.map +1 -1
  26. package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
  27. package/dist/sandbox-host/SandboxHost.js +4 -1
  28. package/dist/sandbox-host/SandboxHost.js.map +1 -1
  29. package/dist/unstable/useComposerInputHistory.js +1 -1
  30. package/dist/utils/invokeCallbackSafely.d.ts +5 -0
  31. package/dist/utils/invokeCallbackSafely.d.ts.map +1 -0
  32. package/dist/utils/invokeCallbackSafely.js +15 -0
  33. package/dist/utils/invokeCallbackSafely.js.map +1 -0
  34. package/dist/utils/smooth/SmoothContext.d.ts +6 -6
  35. package/dist/utils/smooth/useSmooth.d.ts +3 -0
  36. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  37. package/dist/utils/smooth/useSmooth.js +16 -1
  38. package/dist/utils/smooth/useSmooth.js.map +1 -1
  39. package/package.json +5 -5
  40. package/src/devtools/DevToolsHooks.test.ts +40 -0
  41. package/src/devtools/DevToolsHooks.ts +10 -15
  42. package/src/mcp-apps/bridge.test.ts +21 -0
  43. package/src/mcp-apps/bridge.ts +2 -14
  44. package/src/model-context/frame/SPEC_AssistantFrame.md +1 -1
  45. package/src/primitives/actionBar/ActionBarExportMarkdown.test.tsx +67 -0
  46. package/src/primitives/actionBar/ActionBarExportMarkdown.tsx +3 -1
  47. package/src/primitives/branchPicker/BranchPickerRoot.tsx +5 -3
  48. package/src/primitives/composer/ComposerDictationTranscript.tsx +2 -2
  49. package/src/primitives/composer/trigger/triggerSelectionResource.test.ts +135 -0
  50. package/src/primitives/composer/trigger/triggerSelectionResource.ts +2 -0
  51. package/src/primitives/thread/ThreadRoot.tsx +3 -0
  52. package/src/sandbox-host/SandboxHost.test.tsx +61 -0
  53. package/src/sandbox-host/SandboxHost.tsx +6 -2
  54. package/src/unstable/useLiveCompletionAdapter.test.tsx +57 -0
  55. package/src/utils/invokeCallbackSafely.ts +11 -0
  56. package/src/utils/smooth/useSmooth.test.tsx +110 -0
  57. package/src/utils/smooth/useSmooth.ts +20 -6
  58. package/dist/context/react/utils/ensureBinding.d.ts +0 -5
  59. package/dist/context/react/utils/ensureBinding.d.ts.map +0 -1
  60. package/dist/context/react/utils/ensureBinding.js +0 -24
  61. package/dist/context/react/utils/ensureBinding.js.map +0 -1
  62. package/dist/context/react/utils/useRuntimeState.d.ts +0 -13
  63. package/dist/context/react/utils/useRuntimeState.d.ts.map +0 -1
  64. package/dist/context/react/utils/useRuntimeState.js +0 -33
  65. package/dist/context/react/utils/useRuntimeState.js.map +0 -1
  66. package/src/context/react/utils/ensureBinding.ts +0 -46
  67. package/src/context/react/utils/useRuntimeState.ts +0 -46
@@ -24,12 +24,10 @@ declare class DevToolsHooks {
24
24
  static subscribe(listener: () => void): Unsubscribe;
25
25
  static clearEventLogs(apiId: number): void;
26
26
  static getApis(): Map<number, DevToolsApiEntry>;
27
- private static notifyListeners;
28
27
  }
29
28
  declare class DevToolsProviderApi {
30
29
  private static readonly MAX_EVENT_LOGS_PER_API;
31
30
  static register(aui: Partial<AssistantClient>): Unsubscribe;
32
- private static notifyListeners;
33
31
  }
34
32
  //#endregion
35
33
  export { DevToolsHooks, DevToolsProviderApi, EventLog };
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsHooks.d.ts","names":[],"sources":["../../src/devtools/DevToolsHooks.ts"],"mappings":";;;UAGiB;EACf,MAAM;EACN;EACA;;UAGQ;EACR,KAAK,QAAQ;EACb,MAAM;;UAGE;EACR,MAAM,YAAY;EAClB;EACA,WAAW,KAAK;;QAGV;YACI;IACR,iCAAiC;;;cAkCxB;SACJ,UAAU,uBAAuB;SAQjC,eAAe;SASf,WAAW,YAAY;iBAIf;;cAMJ;0BACa;SAEjB,SAAS,KAAK,QAAQ,mBAAmB;iBAuDjC"}
1
+ {"version":3,"file":"DevToolsHooks.d.ts","names":[],"sources":["../../src/devtools/DevToolsHooks.ts"],"mappings":";;;UAIiB;EACf,MAAM;EACN;EACA;;UAGQ;EACR,KAAK,QAAQ;EACb,MAAM;;UAGE;EACR,MAAM,YAAY;EAClB;EACA,WAAW,KAAK;;QAGV;YACI;IACR,iCAAiC;;;cAsCxB;SACJ,UAAU,uBAAuB;SAQjC,eAAe;SASf,WAAW,YAAY;;cAKnB;0BACa;SAEjB,SAAS,KAAK,QAAQ,mBAAmB"}
@@ -1,3 +1,4 @@
1
+ import { notifyEventListeners } from "@assistant-ui/core/internal";
1
2
  //#region src/devtools/DevToolsHooks.ts
2
3
  let cachedHook;
3
4
  const getHook = () => {
@@ -21,7 +22,10 @@ const getHook = () => {
21
22
  cachedHook = newHook;
22
23
  return newHook;
23
24
  };
24
- var DevToolsHooks = class DevToolsHooks {
25
+ const notifyListeners = (apiId) => {
26
+ notifyEventListeners(getHook().listeners, apiId, "DevTools");
27
+ };
28
+ var DevToolsHooks = class {
25
29
  static subscribe(listener) {
26
30
  const hook = getHook();
27
31
  hook.listeners.add(listener);
@@ -33,14 +37,11 @@ var DevToolsHooks = class DevToolsHooks {
33
37
  const entry = getHook().apis.get(apiId);
34
38
  if (!entry) return;
35
39
  entry.logs = [];
36
- DevToolsHooks.notifyListeners(apiId);
40
+ notifyListeners(apiId);
37
41
  }
38
42
  static getApis() {
39
43
  return getHook().apis;
40
44
  }
41
- static notifyListeners(apiId) {
42
- getHook().listeners.forEach((listener) => listener(apiId));
43
- }
44
45
  };
45
46
  var DevToolsProviderApi = class DevToolsProviderApi {
46
47
  static MAX_EVENT_LOGS_PER_API = 200;
@@ -61,25 +62,22 @@ var DevToolsProviderApi = class DevToolsProviderApi {
61
62
  data: e.payload
62
63
  });
63
64
  if (entry.logs.length > DevToolsProviderApi.MAX_EVENT_LOGS_PER_API) entry.logs = entry.logs.slice(-DevToolsProviderApi.MAX_EVENT_LOGS_PER_API);
64
- DevToolsProviderApi.notifyListeners(apiId);
65
+ notifyListeners(apiId);
65
66
  });
66
67
  const stateUnsubscribe = aui.subscribe?.(() => {
67
- DevToolsProviderApi.notifyListeners(apiId);
68
+ notifyListeners(apiId);
68
69
  });
69
70
  hook.apis.set(apiId, entry);
70
- DevToolsProviderApi.notifyListeners(apiId);
71
+ notifyListeners(apiId);
71
72
  return () => {
72
73
  const hook = getHook();
73
74
  if (!hook.apis.get(apiId)) return;
74
75
  eventUnsubscribe?.();
75
76
  stateUnsubscribe?.();
76
77
  hook.apis.delete(apiId);
77
- DevToolsProviderApi.notifyListeners(apiId);
78
+ notifyListeners(apiId);
78
79
  };
79
80
  }
80
- static notifyListeners(apiId) {
81
- getHook().listeners.forEach((listener) => listener(apiId));
82
- }
83
81
  };
84
82
  //#endregion
85
83
  export { DevToolsHooks, DevToolsProviderApi };
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsHooks.js","names":["Unsubscribe","AssistantClient","EventLog","time","Date","event","data","DevToolsApiEntry","api","Partial","logs","DevToolsHook","apis","Map","nextId","listeners","Set","apiId","global","Window","__ASSISTANT_UI_DEVTOOLS_HOOK__","cachedHook","getHook","createHook","window","existingHook","newHook","DevToolsHooks","subscribe","listener","hook","add","delete","clearEventLogs","entry","get","notifyListeners","getApis","forEach","DevToolsProviderApi","MAX_EVENT_LOGS_PER_API","register","aui","values","eventUnsubscribe","on","e","push","payload","length","slice","stateUnsubscribe","set"],"sources":["../../src/devtools/DevToolsHooks.ts"],"sourcesContent":["import type { Unsubscribe } from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\n\nexport interface EventLog {\n time: Date;\n event: string;\n data: unknown;\n}\n\ninterface DevToolsApiEntry {\n api: Partial<AssistantClient>;\n logs: EventLog[];\n}\n\ninterface DevToolsHook {\n apis: Map<number, DevToolsApiEntry>;\n nextId: number;\n listeners: Set<(apiId: number) => void>;\n}\n\ndeclare global {\n interface Window {\n __ASSISTANT_UI_DEVTOOLS_HOOK__?: DevToolsHook;\n }\n}\n\nlet cachedHook: DevToolsHook | undefined;\n\nconst getHook = (): DevToolsHook => {\n if (cachedHook) {\n return cachedHook;\n }\n\n const createHook = (): DevToolsHook => ({\n apis: new Map(),\n nextId: 0,\n listeners: new Set(),\n });\n\n if (typeof window === \"undefined\") {\n cachedHook = createHook();\n return cachedHook;\n }\n\n const existingHook = window.__ASSISTANT_UI_DEVTOOLS_HOOK__;\n if (existingHook) {\n cachedHook = existingHook;\n return existingHook;\n }\n\n const newHook = createHook();\n window.__ASSISTANT_UI_DEVTOOLS_HOOK__ = newHook;\n cachedHook = newHook;\n return newHook;\n};\n\nexport class DevToolsHooks {\n static subscribe(listener: () => void): Unsubscribe {\n const hook = getHook();\n hook.listeners.add(listener);\n return () => {\n hook.listeners.delete(listener);\n };\n }\n\n static clearEventLogs(apiId: number): void {\n const hook = getHook();\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n entry.logs = [];\n DevToolsHooks.notifyListeners(apiId);\n }\n\n static getApis(): Map<number, DevToolsApiEntry> {\n return getHook().apis;\n }\n\n private static notifyListeners(apiId: number): void {\n const hook = getHook();\n hook.listeners.forEach((listener) => listener(apiId));\n }\n}\n\nexport class DevToolsProviderApi {\n private static readonly MAX_EVENT_LOGS_PER_API = 200;\n\n static register(aui: Partial<AssistantClient>): Unsubscribe {\n const hook = getHook();\n\n for (const entry of hook.apis.values()) {\n if (entry.api === aui) {\n return () => {};\n }\n }\n\n const apiId = hook.nextId++;\n const entry: DevToolsApiEntry = {\n api: aui,\n logs: [],\n };\n\n const eventUnsubscribe = aui.on?.(\"*\", (e) => {\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n entry.logs.push({\n time: new Date(),\n event: e.event,\n data: e.payload,\n });\n\n if (entry.logs.length > DevToolsProviderApi.MAX_EVENT_LOGS_PER_API) {\n entry.logs = entry.logs.slice(\n -DevToolsProviderApi.MAX_EVENT_LOGS_PER_API,\n );\n }\n\n DevToolsProviderApi.notifyListeners(apiId);\n });\n\n const stateUnsubscribe = aui.subscribe?.(() => {\n DevToolsProviderApi.notifyListeners(apiId);\n });\n\n hook.apis.set(apiId, entry);\n DevToolsProviderApi.notifyListeners(apiId);\n\n return () => {\n const hook = getHook();\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n eventUnsubscribe?.();\n stateUnsubscribe?.();\n\n hook.apis.delete(apiId);\n\n DevToolsProviderApi.notifyListeners(apiId);\n };\n }\n\n private static notifyListeners(apiId: number): void {\n const hook = getHook();\n hook.listeners.forEach((listener) => listener(apiId));\n }\n}\n"],"mappings":";AA0BA,IAAIqB;AAEJ,MAAMC,gBAA8B;CAClC,IAAID,YACF,OAAOA;CAGT,MAAME,oBAAkC;EACtCX,sBAAM,IAAIC,IAAI;EACdC,QAAQ;EACRC,2BAAW,IAAIC,IAAI;CACrB;CAEA,IAAI,OAAOQ,WAAW,aAAa;EACjCH,aAAaE,WAAW;EACxB,OAAOF;CACT;CAEA,MAAMI,eAAeD,OAAOJ;CAC5B,IAAIK,cAAc;EAChBJ,aAAaI;EACb,OAAOA;CACT;CAEA,MAAMC,UAAUH,WAAW;CAC3BC,OAAOJ,iCAAiCM;CACxCL,aAAaK;CACb,OAAOA;AACT;AAEA,IAAaC,gBAAb,MAAaA,cAAc;CACzB,OAAOC,UAAUC,UAAmC;EAClD,MAAMC,OAAOR,QAAQ;EACrBQ,KAAKf,UAAUgB,IAAIF,QAAQ;EAC3B,aAAa;GACXC,KAAKf,UAAUiB,OAAOH,QAAQ;EAChC;CACF;CAEA,OAAOI,eAAehB,OAAqB;EAEzC,MAAMiB,QADOZ,QACCQ,CAAI,CAAClB,KAAKuB,IAAIlB,KAAK;EACjC,IAAI,CAACiB,OAAO;EAEZA,MAAMxB,OAAO,CAAA;EACbiB,cAAcS,gBAAgBnB,KAAK;CACrC;CAEA,OAAOoB,UAAyC;EAC9C,OAAOf,QAAQ,CAAC,CAACV;CACnB;CAEA,OAAewB,gBAAgBnB,OAAqB;EAElDa,QAAAA,CAAI,CAACf,UAAUuB,SAAST,aAAaA,SAASZ,KAAK,CAAC;CACtD;AACF;AAEA,IAAasB,sBAAb,MAAaA,oBAAoB;CAC/B,OAAwBC,yBAAyB;CAEjD,OAAOC,SAASC,KAA4C;EAC1D,MAAMZ,OAAOR,QAAQ;EAErB,KAAK,MAAMY,SAASJ,KAAKlB,KAAK+B,OAAO,GACnC,IAAIT,MAAM1B,QAAQkC,KAChB,aAAa,CAAC;EAIlB,MAAMzB,QAAQa,KAAKhB;EACnB,MAAMoB,QAA0B;GAC9B1B,KAAKkC;GACLhC,MAAM,CAAA;EACR;EAEA,MAAMkC,mBAAmBF,IAAIG,KAAK,MAAMC,MAAM;GAC5C,MAAMZ,QAAQJ,KAAKlB,KAAKuB,IAAIlB,KAAK;GACjC,IAAI,CAACiB,OAAO;GAEZA,MAAMxB,KAAKqC,KAAK;IACd5C,sBAAM,IAAIC,KAAK;IACfC,OAAOyC,EAAEzC;IACTC,MAAMwC,EAAEE;GACV,CAAC;GAED,IAAId,MAAMxB,KAAKuC,SAASV,oBAAoBC,wBAC1CN,MAAMxB,OAAOwB,MAAMxB,KAAKwC,MACtB,CAACX,oBAAoBC,sBACvB;GAGFD,oBAAoBH,gBAAgBnB,KAAK;EAC3C,CAAC;EAED,MAAMkC,mBAAmBT,IAAId,kBAAkB;GAC7CW,oBAAoBH,gBAAgBnB,KAAK;EAC3C,CAAC;EAEDa,KAAKlB,KAAKwC,IAAInC,OAAOiB,KAAK;EAC1BK,oBAAoBH,gBAAgBnB,KAAK;EAEzC,aAAa;GACX,MAAMa,OAAOR,QAAQ;GAErB,IAAI,CADUQ,KAAKlB,KAAKuB,IAAIlB,KACvBiB,GAAO;GAEZU,mBAAmB;GACnBO,mBAAmB;GAEnBrB,KAAKlB,KAAKoB,OAAOf,KAAK;GAEtBsB,oBAAoBH,gBAAgBnB,KAAK;EAC3C;CACF;CAEA,OAAemB,gBAAgBnB,OAAqB;EAElDa,QAAAA,CAAI,CAACf,UAAUuB,SAAST,aAAaA,SAASZ,KAAK,CAAC;CACtD;AACF"}
1
+ {"version":3,"file":"DevToolsHooks.js","names":["Unsubscribe","notifyEventListeners","AssistantClient","EventLog","time","Date","event","data","DevToolsApiEntry","api","Partial","logs","DevToolsHook","apis","Map","nextId","listeners","Set","apiId","global","Window","__ASSISTANT_UI_DEVTOOLS_HOOK__","cachedHook","getHook","createHook","window","existingHook","newHook","notifyListeners","DevToolsHooks","subscribe","listener","hook","add","delete","clearEventLogs","entry","get","getApis","DevToolsProviderApi","MAX_EVENT_LOGS_PER_API","register","aui","values","eventUnsubscribe","on","e","push","payload","length","slice","stateUnsubscribe","set"],"sources":["../../src/devtools/DevToolsHooks.ts"],"sourcesContent":["import type { Unsubscribe } from \"@assistant-ui/core\";\nimport { notifyEventListeners } from \"@assistant-ui/core/internal\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\n\nexport interface EventLog {\n time: Date;\n event: string;\n data: unknown;\n}\n\ninterface DevToolsApiEntry {\n api: Partial<AssistantClient>;\n logs: EventLog[];\n}\n\ninterface DevToolsHook {\n apis: Map<number, DevToolsApiEntry>;\n nextId: number;\n listeners: Set<(apiId: number) => void>;\n}\n\ndeclare global {\n interface Window {\n __ASSISTANT_UI_DEVTOOLS_HOOK__?: DevToolsHook;\n }\n}\n\nlet cachedHook: DevToolsHook | undefined;\n\nconst getHook = (): DevToolsHook => {\n if (cachedHook) {\n return cachedHook;\n }\n\n const createHook = (): DevToolsHook => ({\n apis: new Map(),\n nextId: 0,\n listeners: new Set(),\n });\n\n if (typeof window === \"undefined\") {\n cachedHook = createHook();\n return cachedHook;\n }\n\n const existingHook = window.__ASSISTANT_UI_DEVTOOLS_HOOK__;\n if (existingHook) {\n cachedHook = existingHook;\n return existingHook;\n }\n\n const newHook = createHook();\n window.__ASSISTANT_UI_DEVTOOLS_HOOK__ = newHook;\n cachedHook = newHook;\n return newHook;\n};\n\nconst notifyListeners = (apiId: number): void => {\n notifyEventListeners(getHook().listeners, apiId, \"DevTools\");\n};\n\nexport class DevToolsHooks {\n static subscribe(listener: () => void): Unsubscribe {\n const hook = getHook();\n hook.listeners.add(listener);\n return () => {\n hook.listeners.delete(listener);\n };\n }\n\n static clearEventLogs(apiId: number): void {\n const hook = getHook();\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n entry.logs = [];\n notifyListeners(apiId);\n }\n\n static getApis(): Map<number, DevToolsApiEntry> {\n return getHook().apis;\n }\n}\n\nexport class DevToolsProviderApi {\n private static readonly MAX_EVENT_LOGS_PER_API = 200;\n\n static register(aui: Partial<AssistantClient>): Unsubscribe {\n const hook = getHook();\n\n for (const entry of hook.apis.values()) {\n if (entry.api === aui) {\n return () => {};\n }\n }\n\n const apiId = hook.nextId++;\n const entry: DevToolsApiEntry = {\n api: aui,\n logs: [],\n };\n\n const eventUnsubscribe = aui.on?.(\"*\", (e) => {\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n entry.logs.push({\n time: new Date(),\n event: e.event,\n data: e.payload,\n });\n\n if (entry.logs.length > DevToolsProviderApi.MAX_EVENT_LOGS_PER_API) {\n entry.logs = entry.logs.slice(\n -DevToolsProviderApi.MAX_EVENT_LOGS_PER_API,\n );\n }\n\n notifyListeners(apiId);\n });\n\n const stateUnsubscribe = aui.subscribe?.(() => {\n notifyListeners(apiId);\n });\n\n hook.apis.set(apiId, entry);\n notifyListeners(apiId);\n\n return () => {\n const hook = getHook();\n const entry = hook.apis.get(apiId);\n if (!entry) return;\n\n eventUnsubscribe?.();\n stateUnsubscribe?.();\n\n hook.apis.delete(apiId);\n\n notifyListeners(apiId);\n };\n }\n}\n"],"mappings":";;AA2BA,IAAIsB;AAEJ,MAAMC,gBAA8B;CAClC,IAAID,YACF,OAAOA;CAGT,MAAME,oBAAkC;EACtCX,sBAAM,IAAIC,IAAI;EACdC,QAAQ;EACRC,2BAAW,IAAIC,IAAI;CACrB;CAEA,IAAI,OAAOQ,WAAW,aAAa;EACjCH,aAAaE,WAAW;EACxB,OAAOF;CACT;CAEA,MAAMI,eAAeD,OAAOJ;CAC5B,IAAIK,cAAc;EAChBJ,aAAaI;EACb,OAAOA;CACT;CAEA,MAAMC,UAAUH,WAAW;CAC3BC,OAAOJ,iCAAiCM;CACxCL,aAAaK;CACb,OAAOA;AACT;AAEA,MAAMC,mBAAmBV,UAAwB;CAC/CjB,qBAAqBsB,QAAQ,CAAC,CAACP,WAAWE,OAAO,UAAU;AAC7D;AAEA,IAAaW,gBAAb,MAA2B;CACzB,OAAOC,UAAUC,UAAmC;EAClD,MAAMC,OAAOT,QAAQ;EACrBS,KAAKhB,UAAUiB,IAAIF,QAAQ;EAC3B,aAAa;GACXC,KAAKhB,UAAUkB,OAAOH,QAAQ;EAChC;CACF;CAEA,OAAOI,eAAejB,OAAqB;EAEzC,MAAMkB,QADOb,QACCS,CAAI,CAACnB,KAAKwB,IAAInB,KAAK;EACjC,IAAI,CAACkB,OAAO;EAEZA,MAAMzB,OAAO,CAAA;EACbiB,gBAAgBV,KAAK;CACvB;CAEA,OAAOoB,UAAyC;EAC9C,OAAOf,QAAQ,CAAC,CAACV;CACnB;AACF;AAEA,IAAa0B,sBAAb,MAAaA,oBAAoB;CAC/B,OAAwBC,yBAAyB;CAEjD,OAAOC,SAASC,KAA4C;EAC1D,MAAMV,OAAOT,QAAQ;EAErB,KAAK,MAAMa,SAASJ,KAAKnB,KAAK8B,OAAO,GACnC,IAAIP,MAAM3B,QAAQiC,KAChB,aAAa,CAAC;EAIlB,MAAMxB,QAAQc,KAAKjB;EACnB,MAAMqB,QAA0B;GAC9B3B,KAAKiC;GACL/B,MAAM,CAAA;EACR;EAEA,MAAMiC,mBAAmBF,IAAIG,KAAK,MAAMC,MAAM;GAC5C,MAAMV,QAAQJ,KAAKnB,KAAKwB,IAAInB,KAAK;GACjC,IAAI,CAACkB,OAAO;GAEZA,MAAMzB,KAAKoC,KAAK;IACd3C,sBAAM,IAAIC,KAAK;IACfC,OAAOwC,EAAExC;IACTC,MAAMuC,EAAEE;GACV,CAAC;GAED,IAAIZ,MAAMzB,KAAKsC,SAASV,oBAAoBC,wBAC1CJ,MAAMzB,OAAOyB,MAAMzB,KAAKuC,MACtB,CAACX,oBAAoBC,sBACvB;GAGFZ,gBAAgBV,KAAK;EACvB,CAAC;EAED,MAAMiC,mBAAmBT,IAAIZ,kBAAkB;GAC7CF,gBAAgBV,KAAK;EACvB,CAAC;EAEDc,KAAKnB,KAAKuC,IAAIlC,OAAOkB,KAAK;EAC1BR,gBAAgBV,KAAK;EAErB,aAAa;GACX,MAAMc,OAAOT,QAAQ;GAErB,IAAI,CADUS,KAAKnB,KAAKwB,IAAInB,KACvBkB,GAAO;GAEZQ,mBAAmB;GACnBO,mBAAmB;GAEnBnB,KAAKnB,KAAKqB,OAAOhB,KAAK;GAEtBU,gBAAgBV,KAAK;EACvB;CACF;AACF"}
@@ -5,8 +5,8 @@ import { useAui } from "@assistant-ui/store";
5
5
  import { useEffect, useMemo, useRef, useState } from "@assistant-ui/tap/react-shim";
6
6
  import { create } from "zustand";
7
7
  import { Fragment, jsx } from "react/jsx-runtime";
8
- import { resource, useResource } from "@assistant-ui/tap";
9
8
  import { isRecord } from "@assistant-ui/core/internal";
9
+ import { resource, useResource } from "@assistant-ui/tap";
10
10
  //#region src/mcp-apps/McpAppRenderer.tsx
11
11
  function getInput(part) {
12
12
  if (part.status.type === "running" && (part.argsText === "" || part.argsText === "{}")) return;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","names":[],"sources":["../../src/mcp-apps/bridge.ts"],"mappings":";;;KAoBY,oBAAoB;KAEpB;EACV,OAAO;EACP,WAAW;EACX,WAAW;EACX,cAAc;;KAGJ;EACV,YAAY,OAAO;EACnB;EACA,kBAAkB;EAClB,mBAAmB;EACnB,2BAA2B,aAAa;;iBAgD1B,mBACd,MAAM,4BACL"}
1
+ {"version":3,"file":"bridge.d.ts","names":[],"sources":["../../src/mcp-apps/bridge.ts"],"mappings":";;;KAqBY,oBAAoB;KAEpB;EACV,OAAO;EACP,WAAW;EACX,WAAW;EACX,cAAc;;KAGJ;EACV,YAAY,OAAO;EACnB;EACA,kBAAkB;EAClB,mBAAmB;EACnB,2BAA2B,aAAa;;iBAgD1B,mBACd,MAAM,4BACL"}
@@ -1,3 +1,4 @@
1
+ import { invokeCallbackSafely } from "../utils/invokeCallbackSafely.js";
1
2
  import "./types.js";
2
3
  import { isRecord } from "@assistant-ui/core/internal";
3
4
  //#region src/mcp-apps/bridge.ts
@@ -58,15 +59,8 @@ function createMcpAppBridge(opts) {
58
59
  ...data !== void 0 ? { data } : {}
59
60
  } });
60
61
  };
61
- const reportErrorCallbackFailure = (error) => {
62
- console.error("[assistant-ui] MCP App onError callback threw an error", error);
63
- };
64
62
  const reportError = (error) => {
65
- try {
66
- Promise.resolve(handlers.onError?.(error)).catch(reportErrorCallbackFailure);
67
- } catch (callbackError) {
68
- reportErrorCallbackFailure(callbackError);
69
- }
63
+ invokeCallbackSafely(() => handlers.onError?.(error), "MCP App onError");
70
64
  };
71
65
  const handleRequest = async (req) => {
72
66
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","names":["SandboxHostFrame","MCP_APP_PROTOCOL_VERSION","McpAppBridgeHandlers","McpAppDisplayMode","McpAppHostContext","McpAppHostInfo","McpAppJsonRpcMessage","McpAppJsonRpcNotification","McpAppJsonRpcRequest","McpAppJsonRpcResponse","isRecord","VALID_DISPLAY_MODES","const","McpAppBridgeFrame","CreateMcpAppBridgeOptions","frame","handlers","hostInfo","hostContext","McpAppBridge","onMessage","event","MessageEvent","dispose","notifyToolInput","input","notifyToolResult","result","notifyHostContextChanged","DEFAULT_HOST_INFO","name","version","METHOD_ALIASES","Record","normalizeMethod","method","JSONRPC_ERROR","parseError","invalidRequest","methodNotFound","invalidParams","internalError","isJsonRpcMessage","value","v","jsonrpc","isRequest","msg","isNotification","createMcpAppBridge","opts","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","undefined","reportErrorCallbackFailure","console","reportError","Error","Promise","resolve","onError","catch","callbackError","handleRequest","req","params","requestedProtocolVersion","protocolVersion","host","capabilities","tools","callTool","resources","readResource","listResources","ui","openLink","requestDisplayMode","updateModelContext","hostCapabilities","openLinks","serverTools","serverResources","text","onLog","logging","callParams","arguments","allowedTools","includes","callArgs","Array","isArray","readParams","uri","linkParams","url","linkProtocol","URL","protocol","modeParams","mode","err","String","handleNotification","note","onInitialized","p","width","height","onSizeChange","onRequestTeardown","content","type","ctx"],"sources":["../../src/mcp-apps/bridge.ts"],"sourcesContent":["import type { SandboxHostFrame } from \"../sandbox-host/SandboxHost\";\nimport {\n MCP_APP_PROTOCOL_VERSION,\n type McpAppBridgeHandlers,\n type McpAppDisplayMode,\n type McpAppHostContext,\n type McpAppHostInfo,\n type McpAppJsonRpcMessage,\n type McpAppJsonRpcNotification,\n type McpAppJsonRpcRequest,\n type McpAppJsonRpcResponse,\n} from \"./types\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\nconst VALID_DISPLAY_MODES = [\n \"inline\",\n \"fullscreen\",\n \"pip\",\n] as const satisfies readonly McpAppDisplayMode[];\n\nexport type McpAppBridgeFrame = SandboxHostFrame;\n\nexport type CreateMcpAppBridgeOptions = {\n frame: McpAppBridgeFrame;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n};\n\nexport type McpAppBridge = {\n onMessage: (event: MessageEvent) => void;\n dispose: () => void;\n notifyToolInput: (input: unknown) => void;\n notifyToolResult: (result: unknown) => void;\n notifyHostContextChanged: (hostContext: McpAppHostContext) => void;\n};\n\nconst DEFAULT_HOST_INFO: McpAppHostInfo = {\n name: \"assistant-ui\",\n version: \"0.1\",\n};\n\n// Accept both the legacy method names and the MCP-UI 2026-01-26 names that\n// `ui/*` capable widgets (e.g. xmcp's host-bridge) emit. Normalize on input\n// so downstream switch statements only need to know the legacy names.\nconst METHOD_ALIASES: Record<string, string> = {\n \"ui/notifications/initialized\": \"notifications/initialized\",\n \"ui/notifications/size-changed\": \"notifications/size_changed\",\n \"ui/request-display-mode\": \"requestDisplayMode\",\n \"ui/open-link\": \"openLink\",\n \"ui/update-model-context\": \"updateModelContext\",\n \"ui/message\": \"sendMessage\",\n \"notifications/message\": \"notifications/log\",\n};\n\nconst normalizeMethod = (method: string): string =>\n METHOD_ALIASES[method] ?? method;\n\nconst JSONRPC_ERROR = {\n parseError: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n internalError: -32603,\n} as const;\n\nfunction isJsonRpcMessage(value: unknown): value is McpAppJsonRpcMessage {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return v.jsonrpc === \"2.0\" && typeof v.method === \"string\";\n}\n\nfunction isRequest(msg: McpAppJsonRpcMessage): msg is McpAppJsonRpcRequest {\n return \"id\" in msg;\n}\n\nfunction isNotification(\n msg: McpAppJsonRpcMessage,\n): msg is McpAppJsonRpcNotification {\n return !(\"id\" in msg);\n}\n\nexport function createMcpAppBridge(\n opts: CreateMcpAppBridgeOptions,\n): McpAppBridge {\n const {\n frame,\n handlers = {},\n hostInfo = DEFAULT_HOST_INFO,\n hostContext = {},\n } = opts;\n\n const post = (msg: McpAppJsonRpcMessage) => {\n frame.sendMessage(msg);\n };\n\n const respond = (\n id: McpAppJsonRpcRequest[\"id\"],\n payload:\n | { result: unknown }\n | { error: { code: number; message: string; data?: unknown } },\n ) => {\n const res: McpAppJsonRpcResponse = {\n jsonrpc: \"2.0\",\n id,\n ...payload,\n };\n post(res);\n };\n\n const errorResponse = (\n id: McpAppJsonRpcRequest[\"id\"],\n code: number,\n message: string,\n data?: unknown,\n ) => {\n respond(id, {\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n });\n };\n\n const reportErrorCallbackFailure = (error: unknown) => {\n console.error(\n \"[assistant-ui] MCP App onError callback threw an error\",\n error,\n );\n };\n\n const reportError = (error: Error) => {\n try {\n void Promise.resolve(handlers.onError?.(error)).catch(\n reportErrorCallbackFailure,\n );\n } catch (callbackError) {\n reportErrorCallbackFailure(callbackError);\n }\n };\n\n const handleRequest = async (req: McpAppJsonRpcRequest) => {\n try {\n const params = req.params;\n\n switch (normalizeMethod(req.method)) {\n case \"ui/initialize\": {\n const requestedProtocolVersion =\n isRecord(params) && typeof params.protocolVersion === \"string\"\n ? params.protocolVersion\n : MCP_APP_PROTOCOL_VERSION;\n respond(req.id, {\n result: {\n protocolVersion: requestedProtocolVersion,\n host: hostInfo,\n hostInfo,\n hostContext,\n capabilities: {\n tools: handlers.callTool ? {} : undefined,\n resources:\n handlers.readResource || handlers.listResources\n ? {}\n : undefined,\n ui: {\n sendMessage: !!handlers.sendMessage,\n openLink: !!handlers.openLink,\n requestDisplayMode: !!handlers.requestDisplayMode,\n updateModelContext: !!handlers.updateModelContext,\n },\n },\n hostCapabilities: {\n ...(handlers.openLink ? { openLinks: {} } : {}),\n ...(handlers.callTool ? { serverTools: {} } : {}),\n ...(handlers.readResource || handlers.listResources\n ? { serverResources: {} }\n : {}),\n ...(handlers.updateModelContext\n ? { updateModelContext: { text: {} } }\n : {}),\n ...(handlers.sendMessage ? { message: { text: {} } } : {}),\n ...(handlers.onLog ? { logging: {} } : {}),\n },\n },\n });\n return;\n }\n\n case \"tools/call\": {\n if (!handlers.callTool) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"tools/call is not supported by this host\",\n );\n return;\n }\n const callParams = (params ?? {}) as {\n name?: unknown;\n arguments?: unknown;\n };\n if (typeof callParams.name !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call requires a string 'name'\",\n );\n return;\n }\n if (\n handlers.allowedTools &&\n !handlers.allowedTools.includes(callParams.name)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n `tool '${callParams.name}' is not allowed for this app`,\n );\n return;\n }\n let callArgs: Record<string, unknown> | undefined;\n if (callParams.arguments !== undefined) {\n if (\n callParams.arguments === null ||\n typeof callParams.arguments !== \"object\" ||\n Array.isArray(callParams.arguments)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call 'arguments' must be an object\",\n );\n return;\n }\n callArgs = callParams.arguments as Record<string, unknown>;\n }\n const result = await handlers.callTool({\n name: callParams.name,\n ...(callArgs !== undefined ? { arguments: callArgs } : {}),\n });\n respond(req.id, { result });\n return;\n }\n\n case \"resources/read\": {\n if (!handlers.readResource) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/read is not supported by this host\",\n );\n return;\n }\n const readParams = (params ?? {}) as { uri?: unknown };\n if (typeof readParams.uri !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"resources/read requires a string 'uri'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.readResource({ uri: readParams.uri }),\n });\n return;\n }\n\n case \"resources/list\": {\n if (!handlers.listResources) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/list is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.listResources(params)) ?? null,\n });\n return;\n }\n\n case \"openLink\": {\n if (!handlers.openLink) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"openLink is not supported by this host\",\n );\n return;\n }\n const linkParams = (params ?? {}) as { url?: unknown };\n if (typeof linkParams.url !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a string 'url'\",\n );\n return;\n }\n let linkProtocol: string;\n try {\n linkProtocol = new URL(linkParams.url).protocol;\n } catch {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a valid URL\",\n );\n return;\n }\n if (linkProtocol !== \"https:\" && linkProtocol !== \"http:\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink only accepts http(s) URLs\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.openLink({ url: linkParams.url }),\n });\n return;\n }\n\n case \"sendMessage\": {\n if (!handlers.sendMessage) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"sendMessage is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.sendMessage(params)) ?? null,\n });\n return;\n }\n\n case \"updateModelContext\": {\n if (!handlers.updateModelContext) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"updateModelContext is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.updateModelContext(params)) ?? null,\n });\n return;\n }\n\n case \"requestDisplayMode\": {\n if (!handlers.requestDisplayMode) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"requestDisplayMode is not supported by this host\",\n );\n return;\n }\n const modeParams = (params ?? {}) as { mode?: unknown };\n if (\n typeof modeParams.mode !== \"string\" ||\n !VALID_DISPLAY_MODES.includes(modeParams.mode as McpAppDisplayMode)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"requestDisplayMode requires a valid 'mode'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.requestDisplayMode({\n mode: modeParams.mode as McpAppDisplayMode,\n }),\n });\n return;\n }\n\n default: {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n `Unknown method: ${req.method}`,\n );\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n errorResponse(req.id, JSONRPC_ERROR.internalError, error.message);\n }\n };\n\n const handleNotification = (note: McpAppJsonRpcNotification) => {\n try {\n switch (normalizeMethod(note.method)) {\n case \"notifications/initialized\": {\n handlers.onInitialized?.();\n return;\n }\n case \"notifications/size_changed\": {\n const p = (note.params ?? {}) as { width?: number; height?: number };\n handlers.onSizeChange?.({\n ...(typeof p.width === \"number\" ? { width: p.width } : {}),\n ...(typeof p.height === \"number\" ? { height: p.height } : {}),\n });\n return;\n }\n case \"notifications/log\": {\n handlers.onLog?.(note.params);\n return;\n }\n case \"notifications/request_teardown\": {\n handlers.onRequestTeardown?.(note.params);\n return;\n }\n case \"notifications/error\": {\n const p = (note.params ?? {}) as { message?: string };\n reportError(\n new Error(\n typeof p.message === \"string\" ? p.message : \"Widget error\",\n ),\n );\n return;\n }\n default:\n return;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n }\n };\n\n // The host applies the cross-origin guard before delegating; this only\n // validates the JSON-RPC envelope.\n const onMessage = (event: MessageEvent) => {\n if (!isJsonRpcMessage(event.data)) return;\n\n const msg = event.data;\n if (isRequest(msg)) {\n void handleRequest(msg);\n } else if (isNotification(msg)) {\n handleNotification(msg);\n }\n };\n\n return {\n onMessage,\n dispose: () => {},\n notifyToolInput: (input: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/input\",\n params: { input },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-input\",\n params: isRecord(input) ? { arguments: input } : {},\n });\n },\n notifyToolResult: (result: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/result\",\n params: { result },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-result\",\n params: isRecord(result)\n ? result\n : { content: [{ type: \"text\", text: String(result) }] },\n });\n },\n notifyHostContextChanged: (ctx: McpAppHostContext) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/host_context/changed\",\n params: ctx,\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/host-context-changed\",\n params: ctx,\n });\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","names":["SandboxHostFrame","invokeCallbackSafely","MCP_APP_PROTOCOL_VERSION","McpAppBridgeHandlers","McpAppDisplayMode","McpAppHostContext","McpAppHostInfo","McpAppJsonRpcMessage","McpAppJsonRpcNotification","McpAppJsonRpcRequest","McpAppJsonRpcResponse","isRecord","VALID_DISPLAY_MODES","const","McpAppBridgeFrame","CreateMcpAppBridgeOptions","frame","handlers","hostInfo","hostContext","McpAppBridge","onMessage","event","MessageEvent","dispose","notifyToolInput","input","notifyToolResult","result","notifyHostContextChanged","DEFAULT_HOST_INFO","name","version","METHOD_ALIASES","Record","normalizeMethod","method","JSONRPC_ERROR","parseError","invalidRequest","methodNotFound","invalidParams","internalError","isJsonRpcMessage","value","v","jsonrpc","isRequest","msg","isNotification","createMcpAppBridge","opts","post","sendMessage","respond","id","payload","error","code","message","data","res","errorResponse","undefined","reportError","Error","onError","handleRequest","req","params","requestedProtocolVersion","protocolVersion","host","capabilities","tools","callTool","resources","readResource","listResources","ui","openLink","requestDisplayMode","updateModelContext","hostCapabilities","openLinks","serverTools","serverResources","text","onLog","logging","callParams","arguments","allowedTools","includes","callArgs","Array","isArray","readParams","uri","linkParams","url","linkProtocol","URL","protocol","modeParams","mode","err","String","handleNotification","note","onInitialized","p","width","height","onSizeChange","onRequestTeardown","content","type","ctx"],"sources":["../../src/mcp-apps/bridge.ts"],"sourcesContent":["import type { SandboxHostFrame } from \"../sandbox-host/SandboxHost\";\nimport { invokeCallbackSafely } from \"../utils/invokeCallbackSafely\";\nimport {\n MCP_APP_PROTOCOL_VERSION,\n type McpAppBridgeHandlers,\n type McpAppDisplayMode,\n type McpAppHostContext,\n type McpAppHostInfo,\n type McpAppJsonRpcMessage,\n type McpAppJsonRpcNotification,\n type McpAppJsonRpcRequest,\n type McpAppJsonRpcResponse,\n} from \"./types\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\nconst VALID_DISPLAY_MODES = [\n \"inline\",\n \"fullscreen\",\n \"pip\",\n] as const satisfies readonly McpAppDisplayMode[];\n\nexport type McpAppBridgeFrame = SandboxHostFrame;\n\nexport type CreateMcpAppBridgeOptions = {\n frame: McpAppBridgeFrame;\n handlers?: McpAppBridgeHandlers | undefined;\n hostInfo?: McpAppHostInfo | undefined;\n hostContext?: McpAppHostContext | undefined;\n};\n\nexport type McpAppBridge = {\n onMessage: (event: MessageEvent) => void;\n dispose: () => void;\n notifyToolInput: (input: unknown) => void;\n notifyToolResult: (result: unknown) => void;\n notifyHostContextChanged: (hostContext: McpAppHostContext) => void;\n};\n\nconst DEFAULT_HOST_INFO: McpAppHostInfo = {\n name: \"assistant-ui\",\n version: \"0.1\",\n};\n\n// Accept both the legacy method names and the MCP-UI 2026-01-26 names that\n// `ui/*` capable widgets (e.g. xmcp's host-bridge) emit. Normalize on input\n// so downstream switch statements only need to know the legacy names.\nconst METHOD_ALIASES: Record<string, string> = {\n \"ui/notifications/initialized\": \"notifications/initialized\",\n \"ui/notifications/size-changed\": \"notifications/size_changed\",\n \"ui/request-display-mode\": \"requestDisplayMode\",\n \"ui/open-link\": \"openLink\",\n \"ui/update-model-context\": \"updateModelContext\",\n \"ui/message\": \"sendMessage\",\n \"notifications/message\": \"notifications/log\",\n};\n\nconst normalizeMethod = (method: string): string =>\n METHOD_ALIASES[method] ?? method;\n\nconst JSONRPC_ERROR = {\n parseError: -32700,\n invalidRequest: -32600,\n methodNotFound: -32601,\n invalidParams: -32602,\n internalError: -32603,\n} as const;\n\nfunction isJsonRpcMessage(value: unknown): value is McpAppJsonRpcMessage {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n return v.jsonrpc === \"2.0\" && typeof v.method === \"string\";\n}\n\nfunction isRequest(msg: McpAppJsonRpcMessage): msg is McpAppJsonRpcRequest {\n return \"id\" in msg;\n}\n\nfunction isNotification(\n msg: McpAppJsonRpcMessage,\n): msg is McpAppJsonRpcNotification {\n return !(\"id\" in msg);\n}\n\nexport function createMcpAppBridge(\n opts: CreateMcpAppBridgeOptions,\n): McpAppBridge {\n const {\n frame,\n handlers = {},\n hostInfo = DEFAULT_HOST_INFO,\n hostContext = {},\n } = opts;\n\n const post = (msg: McpAppJsonRpcMessage) => {\n frame.sendMessage(msg);\n };\n\n const respond = (\n id: McpAppJsonRpcRequest[\"id\"],\n payload:\n | { result: unknown }\n | { error: { code: number; message: string; data?: unknown } },\n ) => {\n const res: McpAppJsonRpcResponse = {\n jsonrpc: \"2.0\",\n id,\n ...payload,\n };\n post(res);\n };\n\n const errorResponse = (\n id: McpAppJsonRpcRequest[\"id\"],\n code: number,\n message: string,\n data?: unknown,\n ) => {\n respond(id, {\n error: {\n code,\n message,\n ...(data !== undefined ? { data } : {}),\n },\n });\n };\n\n const reportError = (error: Error) => {\n invokeCallbackSafely(() => handlers.onError?.(error), \"MCP App onError\");\n };\n\n const handleRequest = async (req: McpAppJsonRpcRequest) => {\n try {\n const params = req.params;\n\n switch (normalizeMethod(req.method)) {\n case \"ui/initialize\": {\n const requestedProtocolVersion =\n isRecord(params) && typeof params.protocolVersion === \"string\"\n ? params.protocolVersion\n : MCP_APP_PROTOCOL_VERSION;\n respond(req.id, {\n result: {\n protocolVersion: requestedProtocolVersion,\n host: hostInfo,\n hostInfo,\n hostContext,\n capabilities: {\n tools: handlers.callTool ? {} : undefined,\n resources:\n handlers.readResource || handlers.listResources\n ? {}\n : undefined,\n ui: {\n sendMessage: !!handlers.sendMessage,\n openLink: !!handlers.openLink,\n requestDisplayMode: !!handlers.requestDisplayMode,\n updateModelContext: !!handlers.updateModelContext,\n },\n },\n hostCapabilities: {\n ...(handlers.openLink ? { openLinks: {} } : {}),\n ...(handlers.callTool ? { serverTools: {} } : {}),\n ...(handlers.readResource || handlers.listResources\n ? { serverResources: {} }\n : {}),\n ...(handlers.updateModelContext\n ? { updateModelContext: { text: {} } }\n : {}),\n ...(handlers.sendMessage ? { message: { text: {} } } : {}),\n ...(handlers.onLog ? { logging: {} } : {}),\n },\n },\n });\n return;\n }\n\n case \"tools/call\": {\n if (!handlers.callTool) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"tools/call is not supported by this host\",\n );\n return;\n }\n const callParams = (params ?? {}) as {\n name?: unknown;\n arguments?: unknown;\n };\n if (typeof callParams.name !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call requires a string 'name'\",\n );\n return;\n }\n if (\n handlers.allowedTools &&\n !handlers.allowedTools.includes(callParams.name)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n `tool '${callParams.name}' is not allowed for this app`,\n );\n return;\n }\n let callArgs: Record<string, unknown> | undefined;\n if (callParams.arguments !== undefined) {\n if (\n callParams.arguments === null ||\n typeof callParams.arguments !== \"object\" ||\n Array.isArray(callParams.arguments)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"tools/call 'arguments' must be an object\",\n );\n return;\n }\n callArgs = callParams.arguments as Record<string, unknown>;\n }\n const result = await handlers.callTool({\n name: callParams.name,\n ...(callArgs !== undefined ? { arguments: callArgs } : {}),\n });\n respond(req.id, { result });\n return;\n }\n\n case \"resources/read\": {\n if (!handlers.readResource) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/read is not supported by this host\",\n );\n return;\n }\n const readParams = (params ?? {}) as { uri?: unknown };\n if (typeof readParams.uri !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"resources/read requires a string 'uri'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.readResource({ uri: readParams.uri }),\n });\n return;\n }\n\n case \"resources/list\": {\n if (!handlers.listResources) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"resources/list is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.listResources(params)) ?? null,\n });\n return;\n }\n\n case \"openLink\": {\n if (!handlers.openLink) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"openLink is not supported by this host\",\n );\n return;\n }\n const linkParams = (params ?? {}) as { url?: unknown };\n if (typeof linkParams.url !== \"string\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a string 'url'\",\n );\n return;\n }\n let linkProtocol: string;\n try {\n linkProtocol = new URL(linkParams.url).protocol;\n } catch {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink requires a valid URL\",\n );\n return;\n }\n if (linkProtocol !== \"https:\" && linkProtocol !== \"http:\") {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"openLink only accepts http(s) URLs\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.openLink({ url: linkParams.url }),\n });\n return;\n }\n\n case \"sendMessage\": {\n if (!handlers.sendMessage) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"sendMessage is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.sendMessage(params)) ?? null,\n });\n return;\n }\n\n case \"updateModelContext\": {\n if (!handlers.updateModelContext) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"updateModelContext is not supported by this host\",\n );\n return;\n }\n respond(req.id, {\n result: (await handlers.updateModelContext(params)) ?? null,\n });\n return;\n }\n\n case \"requestDisplayMode\": {\n if (!handlers.requestDisplayMode) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n \"requestDisplayMode is not supported by this host\",\n );\n return;\n }\n const modeParams = (params ?? {}) as { mode?: unknown };\n if (\n typeof modeParams.mode !== \"string\" ||\n !VALID_DISPLAY_MODES.includes(modeParams.mode as McpAppDisplayMode)\n ) {\n errorResponse(\n req.id,\n JSONRPC_ERROR.invalidParams,\n \"requestDisplayMode requires a valid 'mode'\",\n );\n return;\n }\n respond(req.id, {\n result: await handlers.requestDisplayMode({\n mode: modeParams.mode as McpAppDisplayMode,\n }),\n });\n return;\n }\n\n default: {\n errorResponse(\n req.id,\n JSONRPC_ERROR.methodNotFound,\n `Unknown method: ${req.method}`,\n );\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n errorResponse(req.id, JSONRPC_ERROR.internalError, error.message);\n }\n };\n\n const handleNotification = (note: McpAppJsonRpcNotification) => {\n try {\n switch (normalizeMethod(note.method)) {\n case \"notifications/initialized\": {\n handlers.onInitialized?.();\n return;\n }\n case \"notifications/size_changed\": {\n const p = (note.params ?? {}) as { width?: number; height?: number };\n handlers.onSizeChange?.({\n ...(typeof p.width === \"number\" ? { width: p.width } : {}),\n ...(typeof p.height === \"number\" ? { height: p.height } : {}),\n });\n return;\n }\n case \"notifications/log\": {\n handlers.onLog?.(note.params);\n return;\n }\n case \"notifications/request_teardown\": {\n handlers.onRequestTeardown?.(note.params);\n return;\n }\n case \"notifications/error\": {\n const p = (note.params ?? {}) as { message?: string };\n reportError(\n new Error(\n typeof p.message === \"string\" ? p.message : \"Widget error\",\n ),\n );\n return;\n }\n default:\n return;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n reportError(error);\n }\n };\n\n // The host applies the cross-origin guard before delegating; this only\n // validates the JSON-RPC envelope.\n const onMessage = (event: MessageEvent) => {\n if (!isJsonRpcMessage(event.data)) return;\n\n const msg = event.data;\n if (isRequest(msg)) {\n void handleRequest(msg);\n } else if (isNotification(msg)) {\n handleNotification(msg);\n }\n };\n\n return {\n onMessage,\n dispose: () => {},\n notifyToolInput: (input: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/input\",\n params: { input },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-input\",\n params: isRecord(input) ? { arguments: input } : {},\n });\n },\n notifyToolResult: (result: unknown) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/tools/call/result\",\n params: { result },\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/tool-result\",\n params: isRecord(result)\n ? result\n : { content: [{ type: \"text\", text: String(result) }] },\n });\n },\n notifyHostContextChanged: (ctx: McpAppHostContext) => {\n post({\n jsonrpc: \"2.0\",\n method: \"notifications/host_context/changed\",\n params: ctx,\n });\n post({\n jsonrpc: \"2.0\",\n method: \"ui/notifications/host-context-changed\",\n params: ctx,\n });\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionBarExportMarkdown.d.ts","names":[],"sources":["../../../src/primitives/actionBar/ActionBarExportMarkdown.tsx"],"mappings":";;cAQM,+BAA8B,UAAA;EAIlC;EACA,aAAa,2BAA2B;aACpC;kBAgCW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAGlC,kDAAgC,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;;EAvChC;EACA,aAAE,2BAA2B;oBAsDxC,cAAA"}
1
+ {"version":3,"file":"ActionBarExportMarkdown.d.ts","names":[],"sources":["../../../src/primitives/actionBar/ActionBarExportMarkdown.tsx"],"mappings":";;cAQM,+BAA8B,UAAA;EAIlC;EACA,aAAa,2BAA2B;aACpC;kBAgCW;OACH,UAAU;OACV,QAAQ,yBAAyB;;cAGlC,kDAAgC,0BAAA,KAAA,qBAAA,gBAAA,qCAAA,qBAAA;;;;;EAvChC;EACA,aAAE,2BAA2B;oBAwDxC,cAAA"}
@@ -80,7 +80,7 @@ const ActionBarPrimitiveExportMarkdown = forwardRef((t0, forwardedRef) => {
80
80
  let t3;
81
81
  if ($[9] !== callback) {
82
82
  t3 = () => {
83
- callback?.();
83
+ callback?.().catch(_temp3);
84
84
  };
85
85
  $[9] = callback;
86
86
  $[10] = t3;
@@ -116,6 +116,9 @@ function _temp(c) {
116
116
  function _temp2(s) {
117
117
  return (s.message.role !== "assistant" || s.message.status?.type !== "running") && s.message.parts.some(_temp);
118
118
  }
119
+ function _temp3(error) {
120
+ console.error("[assistant-ui] markdown export failed:", error);
121
+ }
119
122
  //#endregion
120
123
  export { ActionBarPrimitiveExportMarkdown };
121
124
 
@@ -1 +1 @@
1
- {"version":3,"file":"ActionBarExportMarkdown.js","names":["c","_c","forwardRef","useCallback","ActionButtonProps","composeEventHandlers","Primitive","useAuiState","useAui","useActionBarExportMarkdown","t0","$","t1","undefined","filename","onExport","aui","hasExportableContent","_temp2","t2","message","content","getCopyText","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","Date","now","click","setTimeout","revokeObjectURL","callback","ActionBarPrimitiveExportMarkdown","Element","HTMLButtonElement","Props","forwardedRef","disabled","onClick","props","t3","t4","t5","displayName","_temp","text","length","s","role","status","parts","some"],"sources":["../../../src/primitives/actionBar/ActionBarExportMarkdown.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useCallback } from \"react\";\nimport type { ActionButtonProps } from \"../../utils/createActionButton\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\n\nconst useActionBarExportMarkdown = ({\n filename,\n onExport,\n}: {\n filename?: string | undefined;\n onExport?: ((content: string) => void | Promise<void>) | undefined;\n} = {}) => {\n const aui = useAui();\n const hasExportableContent = useAuiState((s) => {\n return (\n (s.message.role !== \"assistant\" ||\n s.message.status?.type !== \"running\") &&\n s.message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n );\n });\n\n const callback = useCallback(async () => {\n const content = aui.message.getCopyText();\n if (!content) return;\n\n if (onExport) {\n await onExport(content);\n return;\n }\n\n const blob = new Blob([content], { type: \"text/markdown\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename ?? `message-${Date.now()}.md`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 40_000);\n }, [aui, filename, onExport]);\n\n if (!hasExportableContent) return null;\n return callback;\n};\n\nexport namespace ActionBarPrimitiveExportMarkdown {\n export type Element = HTMLButtonElement;\n export type Props = ActionButtonProps<typeof useActionBarExportMarkdown>;\n}\n\nexport const ActionBarPrimitiveExportMarkdown = forwardRef<\n ActionBarPrimitiveExportMarkdown.Element,\n ActionBarPrimitiveExportMarkdown.Props\n>(({ filename, onExport, onClick, disabled, ...props }, forwardedRef) => {\n const callback = useActionBarExportMarkdown({ filename, onExport });\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n disabled={disabled || !callback}\n onClick={composeEventHandlers(onClick, () => {\n callback?.();\n })}\n />\n );\n});\n\nActionBarPrimitiveExportMarkdown.displayName =\n \"ActionBarPrimitive.ExportMarkdown\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"ActionBarExportMarkdown.js","names":["c","_c","forwardRef","useCallback","ActionButtonProps","composeEventHandlers","Primitive","useAuiState","useAui","useActionBarExportMarkdown","t0","$","t1","undefined","filename","onExport","aui","hasExportableContent","_temp2","t2","message","content","getCopyText","blob","Blob","type","url","URL","createObjectURL","a","document","createElement","href","download","Date","now","click","setTimeout","revokeObjectURL","callback","ActionBarPrimitiveExportMarkdown","Element","HTMLButtonElement","Props","forwardedRef","disabled","onClick","props","t3","catch","_temp3","t4","t5","displayName","_temp","text","length","s","role","status","parts","some","error","console"],"sources":["../../../src/primitives/actionBar/ActionBarExportMarkdown.tsx"],"sourcesContent":["\"use client\";\n\nimport { forwardRef, useCallback } from \"react\";\nimport type { ActionButtonProps } from \"../../utils/createActionButton\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Primitive } from \"../../utils/Primitive\";\nimport { useAuiState, useAui } from \"@assistant-ui/store\";\n\nconst useActionBarExportMarkdown = ({\n filename,\n onExport,\n}: {\n filename?: string | undefined;\n onExport?: ((content: string) => void | Promise<void>) | undefined;\n} = {}) => {\n const aui = useAui();\n const hasExportableContent = useAuiState((s) => {\n return (\n (s.message.role !== \"assistant\" ||\n s.message.status?.type !== \"running\") &&\n s.message.parts.some((c) => c.type === \"text\" && c.text.length > 0)\n );\n });\n\n const callback = useCallback(async () => {\n const content = aui.message.getCopyText();\n if (!content) return;\n\n if (onExport) {\n await onExport(content);\n return;\n }\n\n const blob = new Blob([content], { type: \"text/markdown\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename ?? `message-${Date.now()}.md`;\n a.click();\n setTimeout(() => URL.revokeObjectURL(url), 40_000);\n }, [aui, filename, onExport]);\n\n if (!hasExportableContent) return null;\n return callback;\n};\n\nexport namespace ActionBarPrimitiveExportMarkdown {\n export type Element = HTMLButtonElement;\n export type Props = ActionButtonProps<typeof useActionBarExportMarkdown>;\n}\n\nexport const ActionBarPrimitiveExportMarkdown = forwardRef<\n ActionBarPrimitiveExportMarkdown.Element,\n ActionBarPrimitiveExportMarkdown.Props\n>(({ filename, onExport, onClick, disabled, ...props }, forwardedRef) => {\n const callback = useActionBarExportMarkdown({ filename, onExport });\n return (\n <Primitive.button\n type=\"button\"\n {...props}\n ref={forwardedRef}\n disabled={disabled || !callback}\n onClick={composeEventHandlers(onClick, () => {\n void callback?.().catch((error: unknown) => {\n console.error(\"[assistant-ui] markdown export failed:\", error);\n });\n })}\n />\n );\n});\n\nActionBarPrimitiveExportMarkdown.displayName =\n \"ActionBarPrimitive.ExportMarkdown\";\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BranchPickerRoot.d.ts","names":[],"sources":["../../../src/primitives/branchPicker/BranchPickerRoot.tsx"],"mappings":";;;kBAUiB;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ,gCAAgC,UAAU;;;;;;IAM5D;;;;;;;;;;;;;;;;;;;;cAqBS,2CAAyB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;;;;;;;EArBX;oBA8BzB,cAAA"}
1
+ {"version":3,"file":"BranchPickerRoot.d.ts","names":[],"sources":["../../../src/primitives/branchPicker/BranchPickerRoot.tsx"],"mappings":";;;kBAUiB;OACH,UAAU,oBAAoB,UAAU;OACxC,QAAQ,gCAAgC,UAAU;;;;;;IAM5D;;;;;;;;;;;;;;;;;;;;cAqBS,2CAAyB,0BAAA,KAAA,qBAAA,gBAAA,kCAAA,eAAA;;;;;;;;;;EArBX;oBAgCzB,cAAA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Primitive } from "../../utils/Primitive.js";
3
- import { MessagePrimitiveIf } from "../message/MessageIf.js";
4
3
  import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
4
+ import { AuiIf } from "@assistant-ui/store";
5
5
  import { forwardRef } from "@assistant-ui/tap/react-shim";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/primitives/branchPicker/BranchPickerRoot.tsx
@@ -23,7 +23,7 @@ import { jsx } from "react/jsx-runtime";
23
23
  * ```
24
24
  */
25
25
  const BranchPickerPrimitiveRoot = forwardRef((t0, ref) => {
26
- const $ = c(9);
26
+ const $ = c(11);
27
27
  let hideWhenSingleBranch;
28
28
  let rest;
29
29
  if ($[0] !== t0) {
@@ -35,27 +35,32 @@ const BranchPickerPrimitiveRoot = forwardRef((t0, ref) => {
35
35
  hideWhenSingleBranch = $[1];
36
36
  rest = $[2];
37
37
  }
38
- const t1 = hideWhenSingleBranch ? true : void 0;
38
+ let t1;
39
+ if ($[3] !== hideWhenSingleBranch) {
40
+ t1 = (s) => !hideWhenSingleBranch || s.message.branchCount >= 2;
41
+ $[3] = hideWhenSingleBranch;
42
+ $[4] = t1;
43
+ } else t1 = $[4];
39
44
  let t2;
40
- if ($[3] !== ref || $[4] !== rest) {
45
+ if ($[5] !== ref || $[6] !== rest) {
41
46
  t2 = /* @__PURE__ */ jsx(Primitive.div, {
42
47
  ...rest,
43
48
  ref
44
49
  });
45
- $[3] = ref;
46
- $[4] = rest;
47
- $[5] = t2;
48
- } else t2 = $[5];
50
+ $[5] = ref;
51
+ $[6] = rest;
52
+ $[7] = t2;
53
+ } else t2 = $[7];
49
54
  let t3;
50
- if ($[6] !== t1 || $[7] !== t2) {
51
- t3 = /* @__PURE__ */ jsx(MessagePrimitiveIf, {
52
- hasBranches: t1,
55
+ if ($[8] !== t1 || $[9] !== t2) {
56
+ t3 = /* @__PURE__ */ jsx(AuiIf, {
57
+ condition: t1,
53
58
  children: t2
54
59
  });
55
- $[6] = t1;
56
- $[7] = t2;
57
- $[8] = t3;
58
- } else t3 = $[8];
60
+ $[8] = t1;
61
+ $[9] = t2;
62
+ $[10] = t3;
63
+ } else t3 = $[10];
59
64
  return t3;
60
65
  });
61
66
  BranchPickerPrimitiveRoot.displayName = "BranchPickerPrimitive.Root";
@@ -1 +1 @@
1
- {"version":3,"file":"BranchPickerRoot.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","MessagePrimitiveIf","If","BranchPickerPrimitiveRoot","Element","div","Props","hideWhenSingleBranch","t0","ref","$","rest","t1","undefined","t2","t3","displayName"],"sources":["../../../src/primitives/branchPicker/BranchPickerRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { MessagePrimitiveIf as If } from \"../message/MessageIf\";\n\nexport namespace BranchPickerPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to hide the branch picker when there's only one branch available.\n * When true, the component will only render when multiple branches exist.\n * @default false\n */\n hideWhenSingleBranch?: boolean | undefined;\n };\n}\n\n/**\n * The root container for branch picker components.\n *\n * This component provides a container for branch navigation controls,\n * with optional conditional rendering based on the number of available branches.\n * It integrates with the message branching system to allow users to navigate\n * between different response variations.\n *\n * @example\n * ```tsx\n * <BranchPickerPrimitive.Root hideWhenSingleBranch={true}>\n * <BranchPickerPrimitive.Previous />\n * <BranchPickerPrimitive.Count />\n * <BranchPickerPrimitive.Next />\n * </BranchPickerPrimitive.Root>\n * ```\n */\nexport const BranchPickerPrimitiveRoot = forwardRef<\n BranchPickerPrimitiveRoot.Element,\n BranchPickerPrimitiveRoot.Props\n>(({ hideWhenSingleBranch, ...rest }, ref) => {\n return (\n <If hasBranches={hideWhenSingleBranch ? true : undefined}>\n <Primitive.div {...rest} ref={ref} />\n </If>\n );\n});\n\nBranchPickerPrimitiveRoot.displayName = \"BranchPickerPrimitive.Root\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAaQ,4BAA4BJ,YAGvCS,IAAAC,QAAA;CAAA,MAAAC,IAAAd,EAAA,CAAA;CAAA,IAAAW;CAAA,IAAAI;CAAA,IAAAD,EAAA,OAAAF,IAAA;EAAC,CAAA,CAAAD,yBAAAI,QAAAH;EAAiCE,EAAA,KAAAF;EAAAE,EAAA,KAAAH;EAAAG,EAAA,KAAAC;CAAA,OAAA;EAAAJ,uBAAAG,EAAA;EAAAC,OAAAD,EAAA;CAAA;CAEf,MAAAE,KAAAL,uBAAA,OAAAM,KAAAA;CAAuC,IAAAC;CAAA,IAAAJ,EAAA,OAAAD,OAAAC,EAAA,OAAAC,MAAA;EACtDG,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBH;GAAWF;EAAG,CAAA;EAAIC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAI;CAAA,OAAAA,KAAAJ,EAAA;CAAA,IAAAK;CAAA,IAAAL,EAAA,OAAAE,MAAAF,EAAA,OAAAI,IAAA;EADvCC,KAAA,oBAAC,oBAAD;GAAiB,aAAAH;GACfE,UAAAA;EADC,CAAA;EAEEJ,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAAA,KAAAL,EAAA;CAAA,OAFLK;AAEK,CAER;AAEDZ,0BAA0Ba,cAAc"}
1
+ {"version":3,"file":"BranchPickerRoot.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","AuiIf","BranchPickerPrimitiveRoot","Element","div","Props","hideWhenSingleBranch","t0","ref","$","rest","t1","s","message","branchCount","t2","t3","displayName"],"sources":["../../../src/primitives/branchPicker/BranchPickerRoot.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { AuiIf } from \"@assistant-ui/store\";\n\nexport namespace BranchPickerPrimitiveRoot {\n export type Element = ComponentRef<typeof Primitive.div>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.div> & {\n /**\n * Whether to hide the branch picker when there's only one branch available.\n * When true, the component will only render when multiple branches exist.\n * @default false\n */\n hideWhenSingleBranch?: boolean | undefined;\n };\n}\n\n/**\n * The root container for branch picker components.\n *\n * This component provides a container for branch navigation controls,\n * with optional conditional rendering based on the number of available branches.\n * It integrates with the message branching system to allow users to navigate\n * between different response variations.\n *\n * @example\n * ```tsx\n * <BranchPickerPrimitive.Root hideWhenSingleBranch={true}>\n * <BranchPickerPrimitive.Previous />\n * <BranchPickerPrimitive.Count />\n * <BranchPickerPrimitive.Next />\n * </BranchPickerPrimitive.Root>\n * ```\n */\nexport const BranchPickerPrimitiveRoot = forwardRef<\n BranchPickerPrimitiveRoot.Element,\n BranchPickerPrimitiveRoot.Props\n>(({ hideWhenSingleBranch, ...rest }, ref) => {\n return (\n <AuiIf\n condition={(s) => !hideWhenSingleBranch || s.message.branchCount >= 2}\n >\n <Primitive.div {...rest} ref={ref} />\n </AuiIf>\n );\n});\n\nBranchPickerPrimitiveRoot.displayName = \"BranchPickerPrimitive.Root\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuCA,MAAaO,4BAA4BH,YAGvCQ,IAAAC,QAAA;CAAA,MAAAC,IAAAb,EAAA,EAAA;CAAA,IAAAU;CAAA,IAAAI;CAAA,IAAAD,EAAA,OAAAF,IAAA;EAAC,CAAA,CAAAD,yBAAAI,QAAAH;EAAiCE,EAAA,KAAAF;EAAAE,EAAA,KAAAH;EAAAG,EAAA,KAAAC;CAAA,OAAA;EAAAJ,uBAAAG,EAAA;EAAAC,OAAAD,EAAA;CAAA;CAAA,IAAAE;CAAA,IAAAF,EAAA,OAAAH,sBAAA;EAGnBK,MAAAC,MAAO,CAACN,wBAAwBM,EAACC,QAAQC,eAAgB;EAACL,EAAA,KAAAH;EAAAG,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAD,OAAAC,EAAA,OAAAC,MAAA;EAErEK,KAAA,oBAAA,UAAA,KAAA;GAAA,GAAmBL;GAAWF;EAAG,CAAA;EAAIC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAO;CAAA,IAAAP,EAAA,OAAAE,MAAAF,EAAA,OAAAM,IAAA;EAHvCC,KAAA,oBAAC,OAAD;GACa,WAAAL;GAEXI,UAAAA;EAHI,CAAA;EAIEN,EAAA,KAAAE;EAAAF,EAAA,KAAAM;EAAAN,EAAA,MAAAO;CAAA,OAAAA,KAAAP,EAAA;CAAA,OAJRO;AAIQ,CAEX;AAEDd,0BAA0Be,cAAc"}
@@ -13,11 +13,11 @@ declare namespace ComposerPrimitiveDictationTranscript {
13
13
  *
14
14
  * @example
15
15
  * ```tsx
16
- * <ComposerPrimitive.If dictation>
16
+ * <AuiIf condition={(s) => s.composer.dictation != null}>
17
17
  * <div className="dictation-preview">
18
18
  * <ComposerPrimitive.DictationTranscript />
19
19
  * </div>
20
- * </ComposerPrimitive.If>
20
+ * </AuiIf>
21
21
  * ```
22
22
  */
23
23
  declare const ComposerPrimitiveDictationTranscript: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLSpanElement> & import("react").HTMLAttributes<HTMLSpanElement> & {
@@ -13,11 +13,11 @@ import { jsx } from "react/jsx-runtime";
13
13
  *
14
14
  * @example
15
15
  * ```tsx
16
- * <ComposerPrimitive.If dictation>
16
+ * <AuiIf condition={(s) => s.composer.dictation != null}>
17
17
  * <div className="dictation-preview">
18
18
  * <ComposerPrimitive.DictationTranscript />
19
19
  * </div>
20
- * </ComposerPrimitive.If>
20
+ * </AuiIf>
21
21
  * ```
22
22
  */
23
23
  const ComposerPrimitiveDictationTranscript = forwardRef((t0, forwardRef) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerDictationTranscript.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useAuiState","ComposerPrimitiveDictationTranscript","Element","span","Props","t0","$","children","props","transcript","_temp","t1","t2","displayName","s","composer","dictation"],"sources":["../../../src/primitives/composer/ComposerDictationTranscript.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveDictationTranscript {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the current interim (partial) transcript while dictation is active.\n *\n * This component displays real-time feedback of what the user is saying before\n * the transcription is finalized and committed to the composer input.\n *\n * @example\n * ```tsx\n * <ComposerPrimitive.If dictation>\n * <div className=\"dictation-preview\">\n * <ComposerPrimitive.DictationTranscript />\n * </div>\n * </ComposerPrimitive.If>\n * ```\n */\nexport const ComposerPrimitiveDictationTranscript = forwardRef<\n ComposerPrimitiveDictationTranscript.Element,\n ComposerPrimitiveDictationTranscript.Props\n>(({ children, ...props }, forwardRef) => {\n const transcript = useAuiState((s) => s.composer.dictation?.transcript);\n\n if (!transcript) return null;\n\n return (\n <Primitive.span {...props} ref={forwardRef}>\n {children ?? transcript}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveDictationTranscript.displayName =\n \"ComposerPrimitive.DictationTranscript\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAaO,uCAAuCH,YAGlDO,IAAAP,eAAA;CAAA,MAAAQ,IAAAX,EAAA,CAAA;CAAA,IAAAY;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,IAAA;EAAC,CAAA,CAAAE,aAAAC,SAAAH;EAAsBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAE;CAAA,OAAA;EAAAD,WAAAD,EAAA;EAAAE,QAAAF,EAAA;CAAA;CACvB,MAAAG,aAAmBT,YAAYU,KAAuC;CAEtE,IAAI,CAACD,YAAU,OAAS;CAInB,MAAAE,KAAAJ,YAAAE;CAAsB,IAAAG;CAAA,IAAAN,EAAA,OAAAR,cAAAQ,EAAA,OAAAE,SAAAF,EAAA,OAAAK,IAAA;EADzBC,KAAA,oBAAA,UAAA,MAAA;GAAA,GAAoBJ;GAAYV,KAAAA;GAC7Ba,UAAAA;EACH,CAAA;EAAiBL,EAAA,KAAAR;EAAAQ,EAAA,KAAAE;EAAAF,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAFjBM;AAEiB,CAEpB;AAEDX,qCAAqCY,cACnC;AAbA,SAAAH,MAAAI,GAAA;CAAA,OACsCA,EAACC,SAASC,WAAsBP;AAAA"}
1
+ {"version":3,"file":"ComposerDictationTranscript.js","names":["c","_c","Primitive","ComponentRef","forwardRef","ComponentPropsWithoutRef","useAuiState","ComposerPrimitiveDictationTranscript","Element","span","Props","t0","$","children","props","transcript","_temp","t1","t2","displayName","s","composer","dictation"],"sources":["../../../src/primitives/composer/ComposerDictationTranscript.tsx"],"sourcesContent":["\"use client\";\n\nimport { Primitive } from \"../../utils/Primitive\";\nimport {\n type ComponentRef,\n forwardRef,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nexport namespace ComposerPrimitiveDictationTranscript {\n export type Element = ComponentRef<typeof Primitive.span>;\n export type Props = ComponentPropsWithoutRef<typeof Primitive.span>;\n}\n\n/**\n * Renders the current interim (partial) transcript while dictation is active.\n *\n * This component displays real-time feedback of what the user is saying before\n * the transcription is finalized and committed to the composer input.\n *\n * @example\n * ```tsx\n * <AuiIf condition={(s) => s.composer.dictation != null}>\n * <div className=\"dictation-preview\">\n * <ComposerPrimitive.DictationTranscript />\n * </div>\n * </AuiIf>\n * ```\n */\nexport const ComposerPrimitiveDictationTranscript = forwardRef<\n ComposerPrimitiveDictationTranscript.Element,\n ComposerPrimitiveDictationTranscript.Props\n>(({ children, ...props }, forwardRef) => {\n const transcript = useAuiState((s) => s.composer.dictation?.transcript);\n\n if (!transcript) return null;\n\n return (\n <Primitive.span {...props} ref={forwardRef}>\n {children ?? transcript}\n </Primitive.span>\n );\n});\n\nComposerPrimitiveDictationTranscript.displayName =\n \"ComposerPrimitive.DictationTranscript\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA8BA,MAAaO,uCAAuCH,YAGlDO,IAAAP,eAAA;CAAA,MAAAQ,IAAAX,EAAA,CAAA;CAAA,IAAAY;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,IAAA;EAAC,CAAA,CAAAE,aAAAC,SAAAH;EAAsBC,EAAA,KAAAD;EAAAC,EAAA,KAAAC;EAAAD,EAAA,KAAAE;CAAA,OAAA;EAAAD,WAAAD,EAAA;EAAAE,QAAAF,EAAA;CAAA;CACvB,MAAAG,aAAmBT,YAAYU,KAAuC;CAEtE,IAAI,CAACD,YAAU,OAAS;CAInB,MAAAE,KAAAJ,YAAAE;CAAsB,IAAAG;CAAA,IAAAN,EAAA,OAAAR,cAAAQ,EAAA,OAAAE,SAAAF,EAAA,OAAAK,IAAA;EADzBC,KAAA,oBAAA,UAAA,MAAA;GAAA,GAAoBJ;GAAYV,KAAAA;GAC7Ba,UAAAA;EACH,CAAA;EAAiBL,EAAA,KAAAR;EAAAQ,EAAA,KAAAE;EAAAF,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,OAFjBM;AAEiB,CAEpB;AAEDX,qCAAqCY,cACnC;AAbA,SAAAH,MAAAI,GAAA;CAAA,OACsCA,EAACC,SAASC,WAAsBP;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"triggerSelectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"mappings":";;;;;KAUY,sBAAsB,MAAM;KAE5B;WAEG;WACA,WAAW;WACX,cAAc,MAAM;;WAGpB;WACA,WAAW;WACX,YAAY,MAAM;WAClB;;KAGH;;EAEV,WAAW,MAAM;;EAEjB;;EAEA,2BAA2B,IAAI;;cAyFpB,sDAAwB,SAAA;EA7EzB,UAAA;EACD,SAAA;EACJ,KAAA;EACQ;EACM,oBAAC;;EAER"}
1
+ {"version":3,"file":"triggerSelectionResource.d.ts","names":[],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"mappings":";;;;;KAUY,sBAAsB,MAAM;KAE5B;WAEG;WACA,WAAW;WACX,cAAc,MAAM;;WAGpB;WACA,WAAW;WACX,YAAY,MAAM;WAClB;;KAGH;;EAEV,WAAW,MAAM;;EAEjB;;EAEA,2BAA2B,IAAI;;cA2FpB,sDAAwB,SAAA;EA/EzB,UAAA;EACD,SAAA;EACJ,KAAA;EACQ;EACM,oBAAC;;EAER"}
@@ -4,7 +4,7 @@ import { resource } from "@assistant-ui/tap";
4
4
  //#region src/primitives/composer/trigger/triggerSelectionResource.ts
5
5
  /** Owns composer text mutation + behavior dispatch on item selection. */
6
6
  const useTriggerSelectionResource = (t0) => {
7
- const $ = c(15);
7
+ const $ = c(16);
8
8
  const { behavior, trigger, aui, triggerChar, setCursorPosition, onSelected } = t0;
9
9
  const selectItemOverrideRef = useRef(null);
10
10
  let t1;
@@ -19,7 +19,7 @@ const useTriggerSelectionResource = (t0) => {
19
19
  } else t1 = $[0];
20
20
  const registerSelectItemOverride = useEffectEvent(t1);
21
21
  let t2;
22
- if ($[1] !== aui || $[2] !== behavior || $[3] !== onSelected || $[4] !== trigger || $[5] !== triggerChar) {
22
+ if ($[1] !== aui || $[2] !== behavior || $[3] !== onSelected || $[4] !== setCursorPosition || $[5] !== trigger || $[6] !== triggerChar) {
23
23
  t2 = (item) => {
24
24
  if (!trigger || !behavior) return;
25
25
  if (selectItemOverrideRef.current?.(item)) {
@@ -32,13 +32,16 @@ const useTriggerSelectionResource = (t0) => {
32
32
  const insertDirective = () => {
33
33
  const directive = behavior.formatter.serialize(item);
34
34
  aui.composer.setText(before + directive + (after.startsWith(" ") ? after : ` ${after}`));
35
+ setCursorPosition(before.length + directive.length + 1);
35
36
  };
36
37
  if (behavior.kind === "directive") {
37
38
  insertDirective();
38
39
  behavior.onInserted?.(item);
39
40
  } else {
40
- if (behavior.removeOnExecute) aui.composer.setText(before + (after.startsWith(" ") ? after.slice(1) : after));
41
- else insertDirective();
41
+ if (behavior.removeOnExecute) {
42
+ aui.composer.setText(before + (after.startsWith(" ") ? after.slice(1) : after));
43
+ setCursorPosition(before.length);
44
+ } else insertDirective();
42
45
  behavior.onExecute(item);
43
46
  }
44
47
  onSelected();
@@ -46,35 +49,36 @@ const useTriggerSelectionResource = (t0) => {
46
49
  $[1] = aui;
47
50
  $[2] = behavior;
48
51
  $[3] = onSelected;
49
- $[4] = trigger;
50
- $[5] = triggerChar;
51
- $[6] = t2;
52
- } else t2 = $[6];
52
+ $[4] = setCursorPosition;
53
+ $[5] = trigger;
54
+ $[6] = triggerChar;
55
+ $[7] = t2;
56
+ } else t2 = $[7];
53
57
  const selectItem = useEffectEvent(t2);
54
58
  let t3;
55
- if ($[7] !== onSelected || $[8] !== setCursorPosition || $[9] !== trigger) {
59
+ if ($[8] !== onSelected || $[9] !== setCursorPosition || $[10] !== trigger) {
56
60
  t3 = () => {
57
61
  onSelected();
58
62
  if (trigger) setCursorPosition(trigger.offset);
59
63
  };
60
- $[7] = onSelected;
61
- $[8] = setCursorPosition;
62
- $[9] = trigger;
63
- $[10] = t3;
64
- } else t3 = $[10];
64
+ $[8] = onSelected;
65
+ $[9] = setCursorPosition;
66
+ $[10] = trigger;
67
+ $[11] = t3;
68
+ } else t3 = $[11];
65
69
  const close = useEffectEvent(t3);
66
70
  let t4;
67
- if ($[11] !== close || $[12] !== registerSelectItemOverride || $[13] !== selectItem) {
71
+ if ($[12] !== close || $[13] !== registerSelectItemOverride || $[14] !== selectItem) {
68
72
  t4 = {
69
73
  selectItem,
70
74
  close,
71
75
  registerSelectItemOverride
72
76
  };
73
- $[11] = close;
74
- $[12] = registerSelectItemOverride;
75
- $[13] = selectItem;
76
- $[14] = t4;
77
- } else t4 = $[14];
77
+ $[12] = close;
78
+ $[13] = registerSelectItemOverride;
79
+ $[14] = selectItem;
80
+ $[15] = t4;
81
+ } else t4 = $[15];
78
82
  return t4;
79
83
  };
80
84
  const TriggerSelectionResource = resource(useTriggerSelectionResource);
@@ -1 +1 @@
1
- {"version":3,"file":"triggerSelectionResource.js","names":["useEffectEvent","useRef","resource","Unstable_DirectiveFormatter","Unstable_TriggerItem","AssistantClient","DetectedTrigger","SelectItemOverride","item","TriggerBehavior","kind","formatter","onInserted","onExecute","removeOnExecute","TriggerSelectionResourceOutput","selectItem","close","registerSelectItemOverride","fn","useTriggerSelectionResource","t0","$","_c","behavior","trigger","aui","triggerChar","setCursorPosition","onSelected","selectItemOverrideRef","t1","Symbol","for","current","t2","currentText","composer","getState","text","before","slice","offset","after","length","query","insertDirective","directive","serialize","setText","startsWith","t3","t4","TriggerSelectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"sourcesContent":["import { useEffectEvent, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_DirectiveFormatter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport type { DetectedTrigger } from \"./triggerDetectionResource\";\n\n/** External override for selection (used by Lexical's DirectivePlugin). */\nexport type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;\n\nexport type TriggerBehavior =\n | {\n readonly kind: \"directive\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onInserted?: (item: Unstable_TriggerItem) => void;\n }\n | {\n readonly kind: \"action\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onExecute: (item: Unstable_TriggerItem) => void;\n readonly removeOnExecute?: boolean;\n };\n\nexport type TriggerSelectionResourceOutput = {\n /** Select an item — runs override (if any) then applies behavior. */\n selectItem(item: Unstable_TriggerItem): void;\n /** Close the popover (moves cursor before trigger to deactivate detection). */\n close(): void;\n /** Register a Lexical-style selection override. Returns unregister fn. */\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Owns composer text mutation + behavior dispatch on item selection. */\nconst useTriggerSelectionResource = ({\n behavior,\n trigger,\n aui,\n triggerChar,\n setCursorPosition,\n onSelected,\n}: {\n behavior: TriggerBehavior | undefined;\n trigger: DetectedTrigger | null;\n aui: AssistantClient;\n triggerChar: string;\n setCursorPosition: (pos: number) => void;\n /** Called after a successful selection so the parent can reset nav state. */\n onSelected: () => void;\n}): TriggerSelectionResourceOutput => {\n // Select-item override: lets Lexical's DirectivePlugin intercept selection\n // and drive its own node insertion.\n const selectItemOverrideRef = useRef<SelectItemOverride | null>(null);\n\n const registerSelectItemOverride = useEffectEvent(\n (fn: SelectItemOverride) => {\n selectItemOverrideRef.current = fn;\n return () => {\n if (selectItemOverrideRef.current === fn) {\n selectItemOverrideRef.current = null;\n }\n };\n },\n );\n\n const selectItem = useEffectEvent((item: Unstable_TriggerItem) => {\n if (!trigger || !behavior) return;\n\n if (selectItemOverrideRef.current?.(item)) {\n onSelected();\n return;\n }\n\n const currentText = aui.composer.getState().text;\n const before = currentText.slice(0, trigger.offset);\n const after = currentText.slice(\n trigger.offset + triggerChar.length + trigger.query.length,\n );\n\n const insertDirective = () => {\n const directive = behavior.formatter.serialize(item);\n aui.composer.setText(\n before + directive + (after.startsWith(\" \") ? after : ` ${after}`),\n );\n };\n\n if (behavior.kind === \"directive\") {\n insertDirective();\n behavior.onInserted?.(item);\n } else {\n if (behavior.removeOnExecute) {\n aui.composer.setText(\n before + (after.startsWith(\" \") ? after.slice(1) : after),\n );\n } else {\n // Leave directive chip in the composer as an audit trail\n insertDirective();\n }\n behavior.onExecute(item);\n }\n\n onSelected();\n });\n\n const close = useEffectEvent(() => {\n onSelected();\n // Move cursor before the trigger so trigger detection deactivates\n if (trigger) {\n setCursorPosition(trigger.offset);\n }\n });\n\n return {\n selectItem,\n close,\n registerSelectItemOverride,\n };\n};\n\nexport const TriggerSelectionResource = resource(useTriggerSelectionResource);\n"],"mappings":";;;;;AAmCA,MAAMoB,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,UAAAC,SAAAC,KAAAC,aAAAC,mBAAAC,eAAAR;CAkBnC,MAAAS,wBAA8B7B,OAAkC,IAAI;CAAE,IAAA8B;CAAA,IAAAT,EAAA,OAAAU,OAAAC,IAAA,2BAAA,GAAA;EAGpEF,MAAAZ,OAAA;GACEW,sBAAqBI,UAAWf;GAAH,aACtB;IACL,IAAIW,sBAAqBI,YAAaf,IACpCW,sBAAqBI,UAAW;GACjC;EACF;EACFZ,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CARH,MAAAJ,6BAAmClB,eACjC+B,EAQF;CAAE,IAAAI;CAAA,IAAAb,EAAA,OAAAI,OAAAJ,EAAA,OAAAE,YAAAF,EAAA,OAAAO,cAAAP,EAAA,OAAAG,WAAAH,EAAA,OAAAK,aAAA;EAEgCQ,MAAA3B,SAAA;GAChC,IAAI,CAACiB,WAAD,CAAaD,UAAQ;GAEzB,IAAIM,sBAAqBI,UAAW1B,IAAI,GAAC;IACvCqB,WAAW;IAAC;GAAA;GAId,MAAAO,cAAoBV,IAAGW,SAASC,SAAU,CAAC,CAAAC;GAC3C,MAAAC,SAAeJ,YAAWK,MAAO,GAAGhB,QAAOiB,MAAO;GAClD,MAAAC,QAAcP,YAAWK,MACvBhB,QAAOiB,SAAUf,YAAWiB,SAAUnB,QAAOoB,MAAMD,MACrD;GAEA,MAAAE,wBAAwB;IACtB,MAAAC,YAAkBvB,SAAQb,UAAUqC,UAAWxC,IAAI;IACnDkB,IAAGW,SAASY,QACVT,SAASO,aAAaJ,MAAKO,WAAY,GAAyB,IAA1CP,QAAA,IAAoCA,QAC5D;GAAC;GAGH,IAAInB,SAAQd,SAAU,aAAW;IAC/BoC,gBAAgB;IAChBtB,SAAQZ,aAAcJ,IAAI;GAAC,OAAA;IAE3B,IAAIgB,SAAQV,iBACVY,IAAGW,SAASY,QACVT,UAAUG,MAAKO,WAAY,GAA4B,IAArBP,MAAKF,MAAO,CAAS,IAA7CE,MACZ;SAGAG,gBAAgB;IAElBtB,SAAQX,UAAWL,IAAI;GAAC;GAG1BqB,WAAW;EAAC;EACbP,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAO;EAAAP,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CArCD,MAAAN,aAAmBhB,eAAemC,EAqCjC;CAAE,IAAAgB;CAAA,IAAA7B,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,OAAAG,SAAA;EAE0B0B,WAAA;GAC3BtB,WAAW;GAEX,IAAIJ,SACFG,kBAAkBH,QAAOiB,MAAO;EACjC;EACFpB,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAND,MAAAL,QAAcjB,eAAemD,EAM5B;CAAE,IAAAC;CAAA,IAAA9B,EAAA,QAAAL,SAAAK,EAAA,QAAAJ,8BAAAI,EAAA,QAAAN,YAAA;EAEIoC,KAAA;GAAApC;GAAAC;GAAAC;EAIP;EAACI,EAAA,MAAAL;EAAAK,EAAA,MAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAAA,OAJM8B;AAIN;AAGH,MAAaC,2BAA2BnD,SAASkB,2BAA2B"}
1
+ {"version":3,"file":"triggerSelectionResource.js","names":["useEffectEvent","useRef","resource","Unstable_DirectiveFormatter","Unstable_TriggerItem","AssistantClient","DetectedTrigger","SelectItemOverride","item","TriggerBehavior","kind","formatter","onInserted","onExecute","removeOnExecute","TriggerSelectionResourceOutput","selectItem","close","registerSelectItemOverride","fn","useTriggerSelectionResource","t0","$","_c","behavior","trigger","aui","triggerChar","setCursorPosition","onSelected","selectItemOverrideRef","t1","Symbol","for","current","t2","currentText","composer","getState","text","before","slice","offset","after","length","query","insertDirective","directive","serialize","setText","startsWith","t3","t4","TriggerSelectionResource"],"sources":["../../../../src/primitives/composer/trigger/triggerSelectionResource.ts"],"sourcesContent":["import { useEffectEvent, useRef } from \"react\";\nimport { resource } from \"@assistant-ui/tap\";\nimport type {\n Unstable_DirectiveFormatter,\n Unstable_TriggerItem,\n} from \"@assistant-ui/core\";\nimport type { AssistantClient } from \"@assistant-ui/store\";\nimport type { DetectedTrigger } from \"./triggerDetectionResource\";\n\n/** External override for selection (used by Lexical's DirectivePlugin). */\nexport type SelectItemOverride = (item: Unstable_TriggerItem) => boolean;\n\nexport type TriggerBehavior =\n | {\n readonly kind: \"directive\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onInserted?: (item: Unstable_TriggerItem) => void;\n }\n | {\n readonly kind: \"action\";\n readonly formatter: Unstable_DirectiveFormatter;\n readonly onExecute: (item: Unstable_TriggerItem) => void;\n readonly removeOnExecute?: boolean;\n };\n\nexport type TriggerSelectionResourceOutput = {\n /** Select an item — runs override (if any) then applies behavior. */\n selectItem(item: Unstable_TriggerItem): void;\n /** Close the popover (moves cursor before trigger to deactivate detection). */\n close(): void;\n /** Register a Lexical-style selection override. Returns unregister fn. */\n registerSelectItemOverride(fn: SelectItemOverride): () => void;\n};\n\n/** Owns composer text mutation + behavior dispatch on item selection. */\nconst useTriggerSelectionResource = ({\n behavior,\n trigger,\n aui,\n triggerChar,\n setCursorPosition,\n onSelected,\n}: {\n behavior: TriggerBehavior | undefined;\n trigger: DetectedTrigger | null;\n aui: AssistantClient;\n triggerChar: string;\n setCursorPosition: (pos: number) => void;\n /** Called after a successful selection so the parent can reset nav state. */\n onSelected: () => void;\n}): TriggerSelectionResourceOutput => {\n // Select-item override: lets Lexical's DirectivePlugin intercept selection\n // and drive its own node insertion.\n const selectItemOverrideRef = useRef<SelectItemOverride | null>(null);\n\n const registerSelectItemOverride = useEffectEvent(\n (fn: SelectItemOverride) => {\n selectItemOverrideRef.current = fn;\n return () => {\n if (selectItemOverrideRef.current === fn) {\n selectItemOverrideRef.current = null;\n }\n };\n },\n );\n\n const selectItem = useEffectEvent((item: Unstable_TriggerItem) => {\n if (!trigger || !behavior) return;\n\n if (selectItemOverrideRef.current?.(item)) {\n onSelected();\n return;\n }\n\n const currentText = aui.composer.getState().text;\n const before = currentText.slice(0, trigger.offset);\n const after = currentText.slice(\n trigger.offset + triggerChar.length + trigger.query.length,\n );\n\n const insertDirective = () => {\n const directive = behavior.formatter.serialize(item);\n aui.composer.setText(\n before + directive + (after.startsWith(\" \") ? after : ` ${after}`),\n );\n setCursorPosition(before.length + directive.length + 1);\n };\n\n if (behavior.kind === \"directive\") {\n insertDirective();\n behavior.onInserted?.(item);\n } else {\n if (behavior.removeOnExecute) {\n aui.composer.setText(\n before + (after.startsWith(\" \") ? after.slice(1) : after),\n );\n setCursorPosition(before.length);\n } else {\n // Leave directive chip in the composer as an audit trail\n insertDirective();\n }\n behavior.onExecute(item);\n }\n\n onSelected();\n });\n\n const close = useEffectEvent(() => {\n onSelected();\n // Move cursor before the trigger so trigger detection deactivates\n if (trigger) {\n setCursorPosition(trigger.offset);\n }\n });\n\n return {\n selectItem,\n close,\n registerSelectItemOverride,\n };\n};\n\nexport const TriggerSelectionResource = resource(useTriggerSelectionResource);\n"],"mappings":";;;;;AAmCA,MAAMoB,+BAA8BC,OAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAC,MAAA,EAAAC,UAAAC,SAAAC,KAAAC,aAAAC,mBAAAC,eAAAR;CAkBnC,MAAAS,wBAA8B7B,OAAkC,IAAI;CAAE,IAAA8B;CAAA,IAAAT,EAAA,OAAAU,OAAAC,IAAA,2BAAA,GAAA;EAGpEF,MAAAZ,OAAA;GACEW,sBAAqBI,UAAWf;GAAH,aACtB;IACL,IAAIW,sBAAqBI,YAAaf,IACpCW,sBAAqBI,UAAW;GACjC;EACF;EACFZ,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CARH,MAAAJ,6BAAmClB,eACjC+B,EAQF;CAAE,IAAAI;CAAA,IAAAb,EAAA,OAAAI,OAAAJ,EAAA,OAAAE,YAAAF,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,OAAAG,WAAAH,EAAA,OAAAK,aAAA;EAEgCQ,MAAA3B,SAAA;GAChC,IAAI,CAACiB,WAAD,CAAaD,UAAQ;GAEzB,IAAIM,sBAAqBI,UAAW1B,IAAI,GAAC;IACvCqB,WAAW;IAAC;GAAA;GAId,MAAAO,cAAoBV,IAAGW,SAASC,SAAU,CAAC,CAAAC;GAC3C,MAAAC,SAAeJ,YAAWK,MAAO,GAAGhB,QAAOiB,MAAO;GAClD,MAAAC,QAAcP,YAAWK,MACvBhB,QAAOiB,SAAUf,YAAWiB,SAAUnB,QAAOoB,MAAMD,MACrD;GAEA,MAAAE,wBAAwB;IACtB,MAAAC,YAAkBvB,SAAQb,UAAUqC,UAAWxC,IAAI;IACnDkB,IAAGW,SAASY,QACVT,SAASO,aAAaJ,MAAKO,WAAY,GAAyB,IAA1CP,QAAA,IAAoCA,QAC5D;IACAf,kBAAkBY,OAAMI,SAAUG,UAASH,SAAU,CAAC;GAAC;GAGzD,IAAIpB,SAAQd,SAAU,aAAW;IAC/BoC,gBAAgB;IAChBtB,SAAQZ,aAAcJ,IAAI;GAAC,OAAA;IAE3B,IAAIgB,SAAQV,iBAAgB;KAC1BY,IAAGW,SAASY,QACVT,UAAUG,MAAKO,WAAY,GAA4B,IAArBP,MAAKF,MAAO,CAAS,IAA7CE,MACZ;KACAf,kBAAkBY,OAAMI,MAAO;IAAC,OAGhCE,gBAAgB;IAElBtB,SAAQX,UAAWL,IAAI;GAAC;GAG1BqB,WAAW;EAAC;EACbP,EAAA,KAAAI;EAAAJ,EAAA,KAAAE;EAAAF,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAa;CAAA,OAAAA,KAAAb,EAAA;CAvCD,MAAAN,aAAmBhB,eAAemC,EAuCjC;CAAE,IAAAgB;CAAA,IAAA7B,EAAA,OAAAO,cAAAP,EAAA,OAAAM,qBAAAN,EAAA,QAAAG,SAAA;EAE0B0B,WAAA;GAC3BtB,WAAW;GAEX,IAAIJ,SACFG,kBAAkBH,QAAOiB,MAAO;EACjC;EACFpB,EAAA,KAAAO;EAAAP,EAAA,KAAAM;EAAAN,EAAA,MAAAG;EAAAH,EAAA,MAAA6B;CAAA,OAAAA,KAAA7B,EAAA;CAND,MAAAL,QAAcjB,eAAemD,EAM5B;CAAE,IAAAC;CAAA,IAAA9B,EAAA,QAAAL,SAAAK,EAAA,QAAAJ,8BAAAI,EAAA,QAAAN,YAAA;EAEIoC,KAAA;GAAApC;GAAAC;GAAAC;EAIP;EAACI,EAAA,MAAAL;EAAAK,EAAA,MAAAJ;EAAAI,EAAA,MAAAN;EAAAM,EAAA,MAAA8B;CAAA,OAAAA,KAAA9B,EAAA;CAAA,OAJM8B;AAIN;AAGH,MAAaC,2BAA2BnD,SAASkB,2BAA2B"}