@applica-software-guru/persona-sdk 0.0.1-preview0

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 (66) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/.nvmrc +1 -0
  3. package/.prettierignore +5 -0
  4. package/.prettierrc +8 -0
  5. package/README.md +66 -0
  6. package/bitbucket-pipelines.yml +29 -0
  7. package/dist/bundle.cjs.js +27 -0
  8. package/dist/bundle.cjs.js.map +1 -0
  9. package/dist/bundle.es.js +6585 -0
  10. package/dist/bundle.es.js.map +1 -0
  11. package/dist/bundle.iife.js +27 -0
  12. package/dist/bundle.iife.js.map +1 -0
  13. package/dist/bundle.umd.js +27 -0
  14. package/dist/bundle.umd.js.map +1 -0
  15. package/dist/index.d.ts +5 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/logging.d.ts +18 -0
  18. package/dist/logging.d.ts.map +1 -0
  19. package/dist/messages.d.ts +7 -0
  20. package/dist/messages.d.ts.map +1 -0
  21. package/dist/protocol/base.d.ts +23 -0
  22. package/dist/protocol/base.d.ts.map +1 -0
  23. package/dist/protocol/index.d.ts +5 -0
  24. package/dist/protocol/index.d.ts.map +1 -0
  25. package/dist/protocol/rest.d.ts +22 -0
  26. package/dist/protocol/rest.d.ts.map +1 -0
  27. package/dist/protocol/webrtc.d.ts +56 -0
  28. package/dist/protocol/webrtc.d.ts.map +1 -0
  29. package/dist/protocol/websocket.d.ts +22 -0
  30. package/dist/protocol/websocket.d.ts.map +1 -0
  31. package/dist/runtime.d.ts +21 -0
  32. package/dist/runtime.d.ts.map +1 -0
  33. package/dist/types.d.ts +79 -0
  34. package/dist/types.d.ts.map +1 -0
  35. package/jsconfig.node.json +10 -0
  36. package/package.json +72 -0
  37. package/playground/index.html +14 -0
  38. package/playground/src/app.tsx +10 -0
  39. package/playground/src/chat.tsx +52 -0
  40. package/playground/src/components/assistant-ui/assistant-modal.tsx +57 -0
  41. package/playground/src/components/assistant-ui/markdown-text.tsx +119 -0
  42. package/playground/src/components/assistant-ui/thread-list.tsx +62 -0
  43. package/playground/src/components/assistant-ui/thread.tsx +249 -0
  44. package/playground/src/components/assistant-ui/tool-fallback.tsx +33 -0
  45. package/playground/src/components/assistant-ui/tooltip-icon-button.tsx +38 -0
  46. package/playground/src/components/ui/avatar.tsx +35 -0
  47. package/playground/src/components/ui/button.tsx +43 -0
  48. package/playground/src/components/ui/tooltip.tsx +32 -0
  49. package/playground/src/lib/utils.ts +6 -0
  50. package/playground/src/main.tsx +10 -0
  51. package/playground/src/styles.css +1 -0
  52. package/playground/src/vite-env.d.ts +1 -0
  53. package/preview.sh +13 -0
  54. package/src/index.ts +4 -0
  55. package/src/logging.ts +34 -0
  56. package/src/messages.ts +79 -0
  57. package/src/protocol/base.ts +55 -0
  58. package/src/protocol/index.ts +4 -0
  59. package/src/protocol/rest.ts +64 -0
  60. package/src/protocol/webrtc.ts +337 -0
  61. package/src/protocol/websocket.ts +106 -0
  62. package/src/runtime.tsx +214 -0
  63. package/src/types.ts +98 -0
  64. package/tsconfig.json +36 -0
  65. package/tsconfig.node.json +15 -0
  66. package/vite.config.ts +69 -0
@@ -0,0 +1,5 @@
1
+ export * from './runtime';
2
+ export * from './logging';
3
+ export * from './protocol';
4
+ export * from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ interface PersonaLogger {
2
+ log: (message: string, ...args: unknown[]) => void;
3
+ info: (message: string, ...args: unknown[]) => void;
4
+ warn: (message: string, ...args: unknown[]) => void;
5
+ error: (message: string, ...args: unknown[]) => void;
6
+ debug: (message: string, ...args: unknown[]) => void;
7
+ }
8
+ declare class PersonaConsoleLogger implements PersonaLogger {
9
+ prefix: string;
10
+ log(message: string, ...args: unknown[]): void;
11
+ info(message: string, ...args: unknown[]): void;
12
+ warn(message: string, ...args: unknown[]): void;
13
+ error(message: string, ...args: unknown[]): void;
14
+ debug(message: string, ...args: unknown[]): void;
15
+ }
16
+ export { PersonaConsoleLogger };
17
+ export type { PersonaLogger };
18
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAAA,UAAU,aAAa;IACrB,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACnD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpD,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrD,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACtD;AAED,cAAM,oBAAqB,YAAW,aAAa;IACjD,MAAM,SAAe;IAErB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIxC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAIzC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;CAG1C;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { PersonaMessage } from './types';
2
+ import { ThreadMessageLike } from '@assistant-ui/react';
3
+ declare function removeEmptyMessages(messages: PersonaMessage[]): PersonaMessage[];
4
+ declare function parseMessages(messages: PersonaMessage[]): PersonaMessage[];
5
+ declare function convertMessage(message: PersonaMessage): ThreadMessageLike;
6
+ export { parseMessages, convertMessage, removeEmptyMessages };
7
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,iBAAS,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAOzE;AACD,iBAAS,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CA0CnE;AAED,iBAAS,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAqBlE;AAED,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Message, MessageListenerCallback, PersonaMessage, PersonaProtocol, ProtocolStatus, Session, StatusChangeCallback } from '../types';
2
+ declare abstract class PersonaProtocolBase implements PersonaProtocol {
3
+ abstract status: ProtocolStatus;
4
+ abstract session: Session;
5
+ abstract autostart: boolean;
6
+ private statusChangeCallbacks;
7
+ private messageCallbacks;
8
+ addStatusChangeListener(callback: StatusChangeCallback): void;
9
+ addMessageListener(callback: MessageListenerCallback): void;
10
+ syncSession(session: Session): Promise<void>;
11
+ notifyMessage(message: PersonaMessage): Promise<void>;
12
+ notifyMessages(messages: PersonaMessage[]): Promise<void>;
13
+ setSession(session: Session): Promise<void>;
14
+ setStatus(status: ProtocolStatus): Promise<void>;
15
+ clearListeners(): void;
16
+ abstract getName(): string;
17
+ abstract getPriority(): number;
18
+ abstract connect(session?: Session): Promise<Session>;
19
+ abstract disconnect(): Promise<void>;
20
+ abstract send(message: Message): Promise<void>;
21
+ }
22
+ export { PersonaProtocolBase };
23
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/protocol/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE5I,uBAAe,mBAAoB,YAAW,eAAe;IAC3D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B,OAAO,CAAC,qBAAqB,CAA8B;IAC3D,OAAO,CAAC,gBAAgB,CAAiC;IAElD,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB;IAItD,kBAAkB,CAAC,QAAQ,EAAE,uBAAuB;IAG9C,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAGrD,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAG3C,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAStD,cAAc,IAAI,IAAI;IAK7B,QAAQ,CAAC,OAAO,IAAI,MAAM;IAC1B,QAAQ,CAAC,WAAW,IAAI,MAAM;IAC9B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACrD,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAC/C;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './rest';
2
+ export * from './base';
3
+ export * from './websocket';
4
+ export * from './webrtc';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protocol/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { PersonaProtocolBase } from './base';
2
+ import { Message, Session, ProtocolStatus, PersonaProtocolBaseConfig } from '../types';
3
+ type PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {
4
+ apiUrl: string;
5
+ };
6
+ declare class PersonaRESTProtocol extends PersonaProtocolBase {
7
+ status: ProtocolStatus;
8
+ autostart: boolean;
9
+ session: Session;
10
+ config: PersonaRESTProtocolConfig;
11
+ notify: boolean;
12
+ constructor(config: PersonaRESTProtocolConfig);
13
+ getName(): string;
14
+ getPriority(): number;
15
+ connect(session: Session): Promise<Session>;
16
+ disconnect(): Promise<void>;
17
+ syncSession(session: Session): Promise<void>;
18
+ send(message: Message): Promise<void>;
19
+ }
20
+ export { PersonaRESTProtocol };
21
+ export type { PersonaRESTProtocolConfig };
22
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../../src/protocol/rest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAmB,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAExG,KAAK,yBAAyB,GAAG,yBAAyB,GAAG;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,cAAM,mBAAoB,SAAQ,mBAAmB;IACnD,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,OAAO,CAAQ;gBAEX,MAAM,EAAE,yBAAyB;IAOtC,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIf,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBnD;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { PersonaProtocolBase } from './base';
2
+ import { Message, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';
3
+ type AudioAnalysisData = {
4
+ localAmplitude: number;
5
+ remoteAmplitude: number;
6
+ };
7
+ type AudioVisualizerCallback = (data: AudioAnalysisData) => void;
8
+ type PersonaWebRTCMessageCallback = (data: MessageEvent) => void;
9
+ type PersonaWebRTCConfig = PersonaProtocolBaseConfig & {
10
+ webrtcUrl: string;
11
+ iceServers?: RTCIceServer[];
12
+ };
13
+ declare class PersonaWebRTCClient {
14
+ private config;
15
+ private pc;
16
+ private ws;
17
+ private localStream;
18
+ private remoteStream;
19
+ private audioCtx;
20
+ private localAnalyser;
21
+ private remoteAnalyser;
22
+ private analyzerFrame;
23
+ private dataChannel;
24
+ private isConnected;
25
+ private visualizerCallbacks;
26
+ private messageCallbacks;
27
+ constructor(config: PersonaWebRTCConfig);
28
+ connect(session: Session): Promise<Session>;
29
+ disconnect(): Promise<void>;
30
+ addVisualizerCallback(callback: AudioVisualizerCallback): void;
31
+ addMessageCallback(callback: PersonaWebRTCMessageCallback): void;
32
+ createDataChannel(label?: string): void;
33
+ sendMessage(message: string): void;
34
+ private _startAnalyzers;
35
+ private _stopAnalyzers;
36
+ }
37
+ type PersonaWebRTCProtocolConfig = PersonaWebRTCConfig & {
38
+ autostart?: boolean;
39
+ };
40
+ declare class PersonaWebRTCProtocol extends PersonaProtocolBase {
41
+ status: ProtocolStatus;
42
+ session: Session;
43
+ autostart: boolean;
44
+ config: PersonaWebRTCProtocolConfig;
45
+ webRTCClient: PersonaWebRTCClient;
46
+ constructor(config: PersonaWebRTCProtocolConfig);
47
+ getName(): string;
48
+ getPriority(): number;
49
+ syncSession(session: Session): Promise<void>;
50
+ connect(session?: Session): Promise<Session>;
51
+ disconnect(): Promise<void>;
52
+ send(message: Message): Promise<void>;
53
+ }
54
+ export { PersonaWebRTCProtocol };
55
+ export type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };
56
+ //# sourceMappingURL=webrtc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../../../src/protocol/webrtc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAkB,yBAAyB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEvG,KAAK,iBAAiB,GAAG;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,uBAAuB,GAAG,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;AAEjE,KAAK,4BAA4B,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAEjE,KAAK,mBAAmB,GAAG,yBAAyB,GAAG;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B,CAAC;AAEF,cAAM,mBAAmB;IACvB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,WAAW,CAA+B;IAElD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,mBAAmB,CAAiC;IAC5D,OAAO,CAAC,gBAAgB,CAAsC;gBAElD,MAAM,EAAE,mBAAmB;IAI1B,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA+G3C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAG9D,kBAAkB,CAAC,QAAQ,EAAE,4BAA4B,GAAG,IAAI;IAIhE,iBAAiB,CAAC,KAAK,SAAa,GAAG,IAAI;IAW3C,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUzC,OAAO,CAAC,eAAe;IAgDvB,OAAO,CAAC,cAAc;CAQvB;AAED,KAAK,2BAA2B,GAAG,mBAAmB,GAAG;IACvD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,cAAM,qBAAsB,SAAQ,mBAAmB;IACrD,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,mBAAmB,CAAC;gBAEtB,MAAM,EAAE,2BAA2B;IAgBxC,OAAO,IAAI,MAAM;IAGjB,WAAW,IAAI,MAAM;IAIf,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ7C;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC;AACjC,YAAY,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Message, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';
2
+ import { PersonaProtocolBase } from './base';
3
+ type PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {
4
+ webSocketUrl: string;
5
+ };
6
+ declare class PersonaWebSocketProtocol extends PersonaProtocolBase {
7
+ status: ProtocolStatus;
8
+ autostart: boolean;
9
+ session: Session;
10
+ config: PersonaWebSocketProtocolConfig;
11
+ webSocket: WebSocket | null;
12
+ constructor(config: PersonaWebSocketProtocolConfig);
13
+ getName(): string;
14
+ getPriority(): number;
15
+ syncSession(session: Session): Promise<void>;
16
+ connect(session?: Session): Promise<Session>;
17
+ disconnect(): Promise<void>;
18
+ send(message: Message): Promise<void>;
19
+ }
20
+ export { PersonaWebSocketProtocol };
21
+ export type { PersonaWebSocketProtocolConfig };
22
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/protocol/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAkB,yBAAyB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACvG,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,KAAK,8BAA8B,GAAG,yBAAyB,GAAG;IAChE,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,cAAM,wBAAyB,SAAQ,mBAAmB;IACxD,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,8BAA8B,CAAC;IACvC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;gBAEhB,MAAM,EAAE,8BAA8B;IAS3C,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIf,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA4C5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ7C;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC;AACpC,YAAY,EAAE,8BAA8B,EAAE,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { PropsWithChildren } from '../node_modules/react';
2
+ import { PersonaConfig, PersonaMessage, PersonaProtocol, PersonaResponse, ProtocolStatus } from './types';
3
+ import { PersonaWebRTCProtocol } from './protocol';
4
+ type PersonaRuntimeContextType = {
5
+ protocols: PersonaProtocol[];
6
+ protocolsStatus: Map<string, ProtocolStatus>;
7
+ };
8
+ declare function PersonaRuntimeProvider({ children, ...config }: PropsWithChildren<PersonaConfig>): import('../node_modules/react/jsx-runtime').JSX.Element;
9
+ declare function usePersonaRuntime(): PersonaRuntimeContextType;
10
+ /**
11
+ * Retrieves a specific protocol instance from the PersonaRuntimeContext.
12
+ *
13
+ * @param protocol - The name of the protocol to use.
14
+ * @returns {PersonaProtocol | null} - The protocol instance or null if not found.
15
+ * @throws {Error} - If the hook is used outside of a PersonaRuntimeProvider.
16
+ */
17
+ declare function usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null;
18
+ declare function usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null;
19
+ export { PersonaRuntimeProvider, usePersonaRuntime, usePersonaRuntimeProtocol, usePersonaRuntimeWebRTCProtocol };
20
+ export type { PersonaMessage, PersonaResponse };
21
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,iBAAiB,EAA8C,MAAM,OAAO,CAAC;AAExH,OAAO,EACL,aAAa,EACb,cAAc,EACd,eAAe,EAEf,eAAe,EACf,cAAc,EAEf,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGL,qBAAqB,EAItB,MAAM,YAAY,CAAC;AAEpB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC9C,CAAC;AA0IF,iBAAS,sBAAsB,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,EAAE,iBAAiB,CAAC,aAAa,CAAC,2CAExF;AAED,iBAAS,iBAAiB,IAAI,yBAAyB,CAMtD;AAED;;;;;;GAMG;AACH,iBAAS,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAyB3E;AAED,iBAAS,+BAA+B,IAAI,qBAAqB,GAAG,IAAI,CAEvE;AAED,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,CAAC;AACjH,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { PersonaLogger } from './logging';
2
+ import { ReactNode } from '../node_modules/react';
3
+ export type ReadonlyJSONObject = {
4
+ readonly [key: string]: string | number | boolean | null | ReadonlyJSONObject | ReadonlyArray<ReadonlyJSONObject>;
5
+ };
6
+ export type FunctionCall = {
7
+ id?: string;
8
+ name: string;
9
+ args: ReadonlyJSONObject;
10
+ };
11
+ export type FunctionResponse = {
12
+ name: string;
13
+ result: unknown;
14
+ function_call_id: string;
15
+ };
16
+ export type PersonaMessage = {
17
+ id?: string | null;
18
+ protocol?: string;
19
+ text: string;
20
+ type: 'reasoning' | 'text';
21
+ role: 'user' | 'assistant' | 'function';
22
+ sessionId?: string;
23
+ finishReason?: 'stop' | 'function_call';
24
+ functionCalls?: FunctionCall[];
25
+ functionResponse?: FunctionResponse;
26
+ };
27
+ export type ModelResponse = {
28
+ messages: PersonaMessage[];
29
+ };
30
+ export type PersonaResponse = {
31
+ sessionId: string;
32
+ response: ModelResponse;
33
+ };
34
+ export type PersonaBaseConfig = {
35
+ logger?: PersonaLogger;
36
+ };
37
+ export type PersonaWebRTCConfig = PersonaBaseConfig & {
38
+ webrtcUrl: string;
39
+ iceServers?: RTCIceServer[];
40
+ onDataMessage?: (msg: MessageEvent) => void;
41
+ };
42
+ export type Session = string | null | undefined;
43
+ export type Message = string;
44
+ export type MessageListenerCallback = (message: PersonaMessage) => void;
45
+ export type StatusChangeCallback = (status: ProtocolStatus) => void;
46
+ export type ProtocolStatus = 'disconnected' | 'connecting' | 'connected';
47
+ export type PersonaProtocolBaseConfig = {
48
+ logger?: PersonaLogger;
49
+ apiKey: string;
50
+ agentId: string;
51
+ };
52
+ export interface PersonaProtocol {
53
+ status: ProtocolStatus;
54
+ autostart: boolean;
55
+ getName: () => string;
56
+ getPriority: () => number;
57
+ connect: (session?: Session) => Promise<Session>;
58
+ disconnect: () => Promise<void>;
59
+ setSession: (session: Session) => Promise<void>;
60
+ send: (message: Message) => Promise<void>;
61
+ clearListeners: () => void;
62
+ addStatusChangeListener: (callback: StatusChangeCallback) => void;
63
+ addMessageListener: (callback: MessageListenerCallback) => void;
64
+ }
65
+ export type PersonaConfig = PersonaBaseConfig & PersonaProtocolBaseConfig & {
66
+ /**
67
+ * In 'dev' mode the endpoint is set to localhost:8000,
68
+ * use it only for development purposes.
69
+ */
70
+ dev?: boolean;
71
+ session?: Session;
72
+ children: ReactNode;
73
+ protocols: PersonaProtocol[] | {
74
+ rest?: PersonaProtocolBaseConfig | true;
75
+ webrtc?: PersonaProtocolBaseConfig | true;
76
+ websocket?: PersonaProtocolBaseConfig | true;
77
+ };
78
+ };
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowSyntheticDefaultImports": true,
4
+ "composite": true,
5
+ "module": "ESNext",
6
+ "moduleResolution": "Node",
7
+ "resolveJsonModule": true
8
+ },
9
+ "include": ["vite.config.js", "package.json"]
10
+ }
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@applica-software-guru/persona-sdk",
3
+ "private": false,
4
+ "version": "0.0.1-preview0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc --outDir dist && vite build",
9
+ "preview": "vite preview",
10
+ "lint": "eslint . --ext .ts,.tsx",
11
+ "lint:fix": "eslint . --ext .ts,.tsx --fix",
12
+ "format": "prettier --write ."
13
+ },
14
+ "devDependencies": {
15
+ "@assistant-ui/react": "0.8.17",
16
+ "@assistant-ui/react-markdown": "0.8.0",
17
+ "@radix-ui/react-avatar": "^1.1.3",
18
+ "@radix-ui/react-tooltip": "^1.1.8",
19
+ "@types/inflection": "^1.13.2",
20
+ "@types/lodash": "^4.17.15",
21
+ "@types/node": "^20.12.13",
22
+ "@types/react": "^18.3.3",
23
+ "@types/react-dom": "^18.3.0",
24
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
25
+ "@typescript-eslint/parser": "^7.18.0",
26
+ "@vitejs/plugin-react": "^4.3.0",
27
+ "class-variance-authority": "^0.7.1",
28
+ "clsx": "^2.1.1",
29
+ "eslint": "^8.25.0",
30
+ "eslint-config-prettier": "^8.10.0",
31
+ "eslint-config-react-app": "7.0.1",
32
+ "eslint-plugin-export": "^0.1.2",
33
+ "eslint-plugin-filenames": "^1.3.2",
34
+ "eslint-plugin-import": "^2.26.0",
35
+ "eslint-plugin-jsx-a11y": "^6.6.1",
36
+ "eslint-plugin-prettier": "^4.2.1",
37
+ "eslint-plugin-react": "^7.31.10",
38
+ "eslint-plugin-react-hooks": "^4.6.0",
39
+ "eslint-plugin-react-refresh": "^0.4.19",
40
+ "eslint-plugin-sort-exports": "^0.9.1",
41
+ "husky": "^9.0.11",
42
+ "jsdom": "^22.1.0",
43
+ "lucide-react": "^0.485.0",
44
+ "prettier": "^2.8.8",
45
+ "react": "^18",
46
+ "react-dom": "^18",
47
+ "react-markdown": "^10.0.1",
48
+ "remark-gfm": "^4.0.1",
49
+ "tailwind-merge": "^3.0.2",
50
+ "typescript": "^5.4.5",
51
+ "vite": "^5.2.12",
52
+ "vite-plugin-compression": "^0.5.1",
53
+ "vite-plugin-dts": "^2.3.0",
54
+ "vite-plugin-linter": "^2.0.2",
55
+ "vitest": "^1.6.0",
56
+ "@tailwindcss/vite": "^4.0.17",
57
+ "lodash": "^4.17.21",
58
+ "tailwindcss": "^4.0.17"
59
+ },
60
+ "peerDependencies": {
61
+ "react": ">=18",
62
+ "react-dom": ">=18"
63
+ },
64
+ "keywords": [
65
+ "persona-sdk"
66
+ ],
67
+ "main": "dist/bundle.cjs.js",
68
+ "module": "dist/bundle.es.js",
69
+ "types": "dist/index.d.ts",
70
+ "typings": "dist/index.d.ts",
71
+ "dependencies": {}
72
+ }
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/png" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <link href="/src/styles.css" rel="stylesheet">
8
+ <title>Persona SDK</title>
9
+ </head>
10
+ <body>
11
+ <div id="app"></div>
12
+ <script type="module" src="/src/main.tsx"></script>
13
+ </body>
14
+ </html>
@@ -0,0 +1,10 @@
1
+ function App() {
2
+ return (
3
+ <div className="flex flex-col items-center justify-center min-h-screen bg-gray-100">
4
+ <h1 className="text-4xl font-bold text-gray-800">Hello, world!</h1>
5
+ <p className="mt-4 text-lg text-gray-600">This is a simple React app.</p>
6
+ </div>
7
+ );
8
+ }
9
+
10
+ export default App;
@@ -0,0 +1,52 @@
1
+ import { Thread } from '@/components/assistant-ui/thread';
2
+ import { PersonaRuntimeProvider, PersonaConsoleLogger, Session } from '@applica-software-guru/persona-sdk';
3
+ import { useMemo } from 'react';
4
+
5
+ const logger = new PersonaConsoleLogger();
6
+
7
+ function generateSID() {
8
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
9
+ let sid = '';
10
+ for (let i = 0; i < 16; i++) {
11
+ sid += chars.charAt(Math.floor(Math.random() * chars.length));
12
+ }
13
+ return sid;
14
+ }
15
+
16
+ function getQueryParam(param: string): string | null {
17
+ const urlParams = new URLSearchParams(window.location.search);
18
+ return urlParams.get(param);
19
+ }
20
+
21
+ function Chat() {
22
+ const agent = getQueryParam('agent');
23
+ const sid = getQueryParam('sid');
24
+
25
+ const session = useMemo((): Session => {
26
+ if (sid) {
27
+ return sid;
28
+ }
29
+ return generateSID();
30
+ }, [sid]);
31
+
32
+ return (
33
+ <PersonaRuntimeProvider
34
+ dev
35
+ logger={logger}
36
+ protocols={{
37
+ rest: true,
38
+ webrtc: true,
39
+ websocket: true,
40
+ }}
41
+ session={session}
42
+ apiKey="2398utf8g$9pahwv8#93q8.h8349q*!ty89w4uefghwqh849tg934yg894hq3g89q34h9"
43
+ agentId={(agent as string) || 'default'}
44
+ >
45
+ <div className="h-dvh w-full">
46
+ <Thread />
47
+ </div>
48
+ </PersonaRuntimeProvider>
49
+ );
50
+ }
51
+
52
+ export { Chat };
@@ -0,0 +1,57 @@
1
+ 'use client';
2
+
3
+ import { BotIcon, ChevronDownIcon } from 'lucide-react';
4
+
5
+ import { type FC, forwardRef } from 'react';
6
+ import { AssistantModalPrimitive } from '@assistant-ui/react';
7
+
8
+ import { Thread } from '@/components/assistant-ui/thread';
9
+ import { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';
10
+
11
+ export const AssistantModal: FC = () => {
12
+ return (
13
+ <AssistantModalPrimitive.Root>
14
+ <AssistantModalPrimitive.Anchor className="fixed bottom-4 right-4 size-11">
15
+ <AssistantModalPrimitive.Trigger asChild>
16
+ <AssistantModalButton />
17
+ </AssistantModalPrimitive.Trigger>
18
+ </AssistantModalPrimitive.Anchor>
19
+ <AssistantModalPrimitive.Content
20
+ sideOffset={16}
21
+ className="bg-popover text-popover-foreground z-50 h-[500px] w-[400px] overflow-clip rounded-xl border p-0 shadow-md outline-none [&>.aui-thread-root]:bg-inherit data-[state=closed]:animate-out data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out data-[state=open]:zoom-in data-[state=open]:slide-in-from-bottom-1/2 data-[state=open]:slide-in-from-right-1/2 data-[state=closed]:slide-out-to-bottom-1/2 data-[state=closed]:slide-out-to-right-1/2"
22
+ >
23
+ <Thread />
24
+ </AssistantModalPrimitive.Content>
25
+ </AssistantModalPrimitive.Root>
26
+ );
27
+ };
28
+
29
+ type AssistantModalButtonProps = { 'data-state'?: 'open' | 'closed' };
30
+
31
+ const AssistantModalButton = forwardRef<HTMLButtonElement, AssistantModalButtonProps>(({ 'data-state': state, ...rest }, ref) => {
32
+ const tooltip = state === 'open' ? 'Close Assistant' : 'Open Assistant';
33
+
34
+ return (
35
+ <TooltipIconButton
36
+ variant="default"
37
+ tooltip={tooltip}
38
+ side="left"
39
+ {...rest}
40
+ className="size-full rounded-full shadow transition-transform hover:scale-110 active:scale-90"
41
+ ref={ref}
42
+ >
43
+ <BotIcon
44
+ data-state={state}
45
+ className="absolute size-6 transition-all data-[state=closed]:rotate-0 data-[state=open]:rotate-90 data-[state=closed]:scale-100 data-[state=open]:scale-0"
46
+ />
47
+
48
+ <ChevronDownIcon
49
+ data-state={state}
50
+ className="absolute size-6 transition-all data-[state=closed]:-rotate-90 data-[state=open]:rotate-0 data-[state=closed]:scale-0 data-[state=open]:scale-100"
51
+ />
52
+ <span className="sr-only">{tooltip}</span>
53
+ </TooltipIconButton>
54
+ );
55
+ });
56
+
57
+ AssistantModalButton.displayName = 'AssistantModalButton';