@autobe/ui 0.19.1

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 (63) hide show
  1. package/LICENSE +661 -0
  2. package/lib/AutoBeAssistantMessageMovie.d.ts +7 -0
  3. package/lib/AutoBeAssistantMessageMovie.js +13 -0
  4. package/lib/AutoBeAssistantMessageMovie.js.map +1 -0
  5. package/lib/AutoBeUserMessageMovie.d.ts +6 -0
  6. package/lib/AutoBeUserMessageMovie.js +17 -0
  7. package/lib/AutoBeUserMessageMovie.js.map +1 -0
  8. package/lib/common/ChatBubble.d.ts +19 -0
  9. package/lib/common/ChatBubble.js +56 -0
  10. package/lib/common/ChatBubble.js.map +1 -0
  11. package/lib/common/openai/OpenAIContent.d.ts +6 -0
  12. package/lib/common/openai/OpenAIContent.js +37 -0
  13. package/lib/common/openai/OpenAIContent.js.map +1 -0
  14. package/lib/common/openai/OpenAIUserAudioContent.d.ts +6 -0
  15. package/lib/common/openai/OpenAIUserAudioContent.js +39 -0
  16. package/lib/common/openai/OpenAIUserAudioContent.js.map +1 -0
  17. package/lib/common/openai/OpenAIUserFileContent.d.ts +6 -0
  18. package/lib/common/openai/OpenAIUserFileContent.js +45 -0
  19. package/lib/common/openai/OpenAIUserFileContent.js.map +1 -0
  20. package/lib/common/openai/OpenAIUserImageContent.d.ts +6 -0
  21. package/lib/common/openai/OpenAIUserImageContent.js +21 -0
  22. package/lib/common/openai/OpenAIUserImageContent.js.map +1 -0
  23. package/lib/common/openai/OpenAIUserTextContent.d.ts +5 -0
  24. package/lib/common/openai/OpenAIUserTextContent.js +15 -0
  25. package/lib/common/openai/OpenAIUserTextContent.js.map +1 -0
  26. package/lib/common/openai/index.d.ts +5 -0
  27. package/lib/common/openai/index.js +14 -0
  28. package/lib/common/openai/index.js.map +1 -0
  29. package/lib/events/AutoBeProgressEventMovie.d.ts +9 -0
  30. package/lib/events/AutoBeProgressEventMovie.js +163 -0
  31. package/lib/events/AutoBeProgressEventMovie.js.map +1 -0
  32. package/lib/events/AutoBeScenarioEventMovie.d.ts +6 -0
  33. package/lib/events/AutoBeScenarioEventMovie.js +84 -0
  34. package/lib/events/AutoBeScenarioEventMovie.js.map +1 -0
  35. package/lib/events/AutoBeStartEventMovie.d.ts +8 -0
  36. package/lib/events/AutoBeStartEventMovie.js +39 -0
  37. package/lib/events/AutoBeStartEventMovie.js.map +1 -0
  38. package/lib/events/index.d.ts +3 -0
  39. package/lib/events/index.js +13 -0
  40. package/lib/events/index.js.map +1 -0
  41. package/lib/index.d.ts +5 -0
  42. package/lib/index.js +28 -0
  43. package/lib/index.js.map +1 -0
  44. package/lib/utils/time.d.ts +7 -0
  45. package/lib/utils/time.js +19 -0
  46. package/lib/utils/time.js.map +1 -0
  47. package/package.json +28 -0
  48. package/src/AutoBeAssistantMessageMovie.tsx +22 -0
  49. package/src/AutoBeUserMessageMovie.tsx +25 -0
  50. package/src/common/ChatBubble.tsx +119 -0
  51. package/src/common/openai/OpenAIContent.tsx +53 -0
  52. package/src/common/openai/OpenAIUserAudioContent.tsx +70 -0
  53. package/src/common/openai/OpenAIUserFileContent.tsx +76 -0
  54. package/src/common/openai/OpenAIUserImageContent.tsx +34 -0
  55. package/src/common/openai/OpenAIUserTextContent.tsx +16 -0
  56. package/src/common/openai/index.ts +5 -0
  57. package/src/events/AutoBeProgressEventMovie.tsx +250 -0
  58. package/src/events/AutoBeScenarioEventMovie.tsx +183 -0
  59. package/src/events/AutoBeStartEventMovie.tsx +82 -0
  60. package/src/events/index.ts +3 -0
  61. package/src/index.ts +8 -0
  62. package/src/utils/time.ts +14 -0
  63. package/tsconfig.json +9 -0
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutoBeScenarioEventMovie = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const time_1 = require("../utils/time");
6
+ const AutoBeScenarioEventMovie = (props) => {
7
+ const { event } = props;
8
+ const { title, description } = getState(event);
9
+ return ((0, jsx_runtime_1.jsxs)("div", { style: {
10
+ backgroundColor: "#f8fafc",
11
+ border: "1px solid #e2e8f0",
12
+ borderRadius: "0.75rem",
13
+ padding: "1.5rem",
14
+ marginBottom: "1rem",
15
+ boxShadow: "0 1px 3px 0 rgb(0 0 0 / 0.1)",
16
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
17
+ display: "flex",
18
+ alignItems: "center",
19
+ justifyContent: "space-between",
20
+ marginBottom: "1rem",
21
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { style: {
22
+ display: "flex",
23
+ alignItems: "center",
24
+ gap: "0.75rem",
25
+ }, children: [(0, jsx_runtime_1.jsx)("div", { style: {
26
+ width: "2rem",
27
+ height: "2rem",
28
+ backgroundColor: "#3b82f6",
29
+ borderRadius: "50%",
30
+ display: "flex",
31
+ alignItems: "center",
32
+ justifyContent: "center",
33
+ }, children: (0, jsx_runtime_1.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", style: { color: "#ffffff" }, children: (0, jsx_runtime_1.jsx)("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }) }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)("h3", { style: {
34
+ fontSize: "1.125rem",
35
+ fontWeight: "600",
36
+ color: "#1e293b",
37
+ margin: 0,
38
+ marginBottom: "0.25rem",
39
+ }, children: title }) })] }), (0, jsx_runtime_1.jsx)("div", { style: {
40
+ fontSize: "0.75rem",
41
+ color: "#64748b",
42
+ textAlign: "right",
43
+ }, children: (0, time_1.formatTime)(event.created_at) })] }), (0, jsx_runtime_1.jsx)("div", { style: {
44
+ fontSize: "0.875rem",
45
+ lineHeight: "1.5",
46
+ color: "#475569",
47
+ backgroundColor: "#ffffff",
48
+ padding: "1rem",
49
+ borderRadius: "0.5rem",
50
+ border: "1px solid #e2e8f0",
51
+ }, children: description })] }));
52
+ };
53
+ exports.AutoBeScenarioEventMovie = AutoBeScenarioEventMovie;
54
+ exports.default = exports.AutoBeScenarioEventMovie;
55
+ function getState(event) {
56
+ switch (event.type) {
57
+ case "analyzeScenario":
58
+ return {
59
+ title: "Analyze Scenario",
60
+ description: ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Generating analysis report.", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {}), "Number of documents to write: #", event.files.length] })),
61
+ };
62
+ case "prismaComponents":
63
+ return {
64
+ title: "Prisma Components",
65
+ description: ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Generating Prisma components.", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {}), "Number of Prisma schemas would be:", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("ul", { children: [(0, jsx_runtime_1.jsxs)("li", { children: ["namespaces: #", event.components.length] }), (0, jsx_runtime_1.jsxs)("li", { children: ["tables: #", event.components
66
+ .map((c) => c.tables.length)
67
+ .reduce((a, b) => a + b, 0)] })] })] })),
68
+ };
69
+ case "interfaceGroups":
70
+ return {
71
+ title: "Interface Endpoint Groups",
72
+ description: ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Generating interface endpoint groups.", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("br", {}), "Number of API operation groups would be #", event.groups.length] })),
73
+ };
74
+ case "realizeTestReset":
75
+ return {
76
+ title: "Realize Test Reset",
77
+ description: "Resetting test environment.",
78
+ };
79
+ default:
80
+ event;
81
+ throw new Error("Unknown event type");
82
+ }
83
+ }
84
+ //# sourceMappingURL=AutoBeScenarioEventMovie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoBeScenarioEventMovie.js","sourceRoot":"","sources":["../../src/events/AutoBeScenarioEventMovie.tsx"],"names":[],"mappings":";;;;AAQA,wCAA2C;AASpC,MAAM,wBAAwB,GAAG,CACtC,KAAqC,EACrC,EAAE;IACF,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE/C,OAAO,CACL,iCACE,KAAK,EAAE;YACL,eAAe,EAAE,SAAS;YAC1B,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,SAAS;YACvB,OAAO,EAAE,QAAQ;YACjB,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,8BAA8B;SAC1C,aAGD,iCACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,QAAQ;oBACpB,cAAc,EAAE,eAAe;oBAC/B,YAAY,EAAE,MAAM;iBACrB,aAED,iCACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,GAAG,EAAE,SAAS;yBACf,aAGD,gCACE,KAAK,EAAE;oCACL,KAAK,EAAE,MAAM;oCACb,MAAM,EAAE,MAAM;oCACd,eAAe,EAAE,SAAS;oCAC1B,YAAY,EAAE,KAAK;oCACnB,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,QAAQ;oCACpB,cAAc,EAAE,QAAQ;iCACzB,YAED,gCACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAE3B,iCAAM,CAAC,EAAC,8FAA8F,GAAG,GACrG,GACF,EAGN,0CACE,+BACE,KAAK,EAAE;wCACL,QAAQ,EAAE,UAAU;wCACpB,UAAU,EAAE,KAAK;wCACjB,KAAK,EAAE,SAAS;wCAChB,MAAM,EAAE,CAAC;wCACT,YAAY,EAAE,SAAS;qCACxB,YAEA,KAAK,GACH,GACD,IACF,EAGN,gCACE,KAAK,EAAE;4BACL,QAAQ,EAAE,SAAS;4BACnB,KAAK,EAAE,SAAS;4BAChB,SAAS,EAAE,OAAO;yBACnB,YAEA,IAAA,iBAAU,EAAC,KAAK,CAAC,UAAU,CAAC,GACzB,IACF,EAGN,gCACE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,KAAK;oBACjB,KAAK,EAAE,SAAS;oBAChB,eAAe,EAAE,SAAS;oBAC1B,OAAO,EAAE,MAAM;oBACf,YAAY,EAAE,QAAQ;oBACtB,MAAM,EAAE,mBAAmB;iBAC5B,YAEA,WAAW,GACR,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AApGW,QAAA,wBAAwB,4BAoGnC;AACF,kBAAe,gCAAwB,CAAC;AAOxC,SAAS,QAAQ,CAAC,KAA8C;IAC9D,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,iBAAiB;YACpB,OAAO;gBACL,KAAK,EAAE,kBAAkB;gBACzB,WAAW,EAAE,CACX,4FAEE,gCAAM,EACN,gCAAM,qCAC0B,KAAK,CAAC,KAAK,CAAC,MAAM,IACjD,CACJ;aACF,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,KAAK,EAAE,mBAAmB;gBAC1B,WAAW,EAAE,CACX,8FAEE,gCAAM,EACN,gCAAM,wCAEN,gCAAM,EACN,2CACE,4DAAkB,KAAK,CAAC,UAAU,CAAC,MAAM,IAAM,EAC/C,wDAEG,KAAK,CAAC,UAAU;6CACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;6CAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAC1B,IACF,IACJ,CACJ;aACF,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO;gBACL,KAAK,EAAE,2BAA2B;gBAClC,WAAW,EAAE,CACX,sGAEE,gCAAM,EACN,gCAAM,+CACoC,KAAK,CAAC,MAAM,CAAC,MAAM,IAC5D,CACJ;aACF,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO;gBACL,KAAK,EAAE,oBAAoB;gBAC3B,WAAW,EAAE,6BAA6B;aAC3C,CAAC;QACJ;YACE,KAAqB,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { AutoBeAnalyzeStartEvent, AutoBeInterfaceStartEvent, AutoBePrismaStartEvent, AutoBeRealizeAuthorizationStartEvent, AutoBeRealizeStartEvent, AutoBeRealizeTestStartEvent, AutoBeTestStartEvent } from "@autobe/interface";
2
+ interface IAutoBeStartEventProps {
3
+ event: AutoBeAnalyzeStartEvent | AutoBePrismaStartEvent | AutoBeInterfaceStartEvent | AutoBeTestStartEvent | AutoBeRealizeStartEvent | AutoBeRealizeAuthorizationStartEvent | AutoBeRealizeTestStartEvent;
4
+ style?: React.CSSProperties;
5
+ className?: string;
6
+ }
7
+ declare const AutoBeStartEventMovie: (props: IAutoBeStartEventProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default AutoBeStartEventMovie;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const AutoBeStartEventMovie = (props) => {
5
+ const { event } = props;
6
+ const title = getTitle(event);
7
+ return ((0, jsx_runtime_1.jsx)("div", { style: {
8
+ display: "flex",
9
+ justifyContent: "center",
10
+ marginBottom: "1rem",
11
+ }, children: (0, jsx_runtime_1.jsx)("div", { className: props.className, style: Object.assign({ backgroundColor: "#f0f0f0", border: "1px solid #e0e0e0", borderRadius: "0.5rem", padding: "0.5rem 1rem" }, props.style), children: (0, jsx_runtime_1.jsxs)("div", { style: {
12
+ fontSize: "0.875rem",
13
+ color: "#666",
14
+ fontWeight: "medium",
15
+ }, children: ["\uD83D\uDE80 ", title, " has started."] }) }) }));
16
+ };
17
+ function getTitle(event) {
18
+ switch (event.type) {
19
+ case "analyzeStart":
20
+ return "Analyze";
21
+ case "prismaStart":
22
+ return "Prisma";
23
+ case "interfaceStart":
24
+ return "Interface";
25
+ case "testStart":
26
+ return "Test";
27
+ case "realizeStart":
28
+ return "Realize";
29
+ case "realizeAuthorizationStart":
30
+ return "Realize Authorization";
31
+ case "realizeTestStart":
32
+ return "Final E2E Test";
33
+ default:
34
+ event;
35
+ throw new Error("Unknown event type"); // unreachable
36
+ }
37
+ }
38
+ exports.default = AutoBeStartEventMovie;
39
+ //# sourceMappingURL=AutoBeStartEventMovie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoBeStartEventMovie.js","sourceRoot":"","sources":["../../src/events/AutoBeStartEventMovie.tsx"],"names":[],"mappings":";;;AAuBA,MAAM,qBAAqB,GAAG,CAAC,KAA6B,EAAE,EAAE;IAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,CACL,gCACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,cAAc,EAAE,QAAQ;YACxB,YAAY,EAAE,MAAM;SACrB,YAED,gCACE,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,KAAK,kBACH,eAAe,EAAE,SAAS,EAC1B,MAAM,EAAE,mBAAmB,EAC3B,YAAY,EAAE,QAAQ,EACtB,OAAO,EAAE,aAAa,IACnB,KAAK,CAAC,KAAK,aAGhB,iCACE,KAAK,EAAE;oBACL,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,MAAM;oBACb,UAAU,EAAE,QAAQ;iBACrB,8BAEG,KAAK,qBACL,GACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,SAAS,QAAQ,CAAC,KAAsC;IACtD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,cAAc;YACjB,OAAO,SAAS,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,QAAQ,CAAC;QAClB,KAAK,gBAAgB;YACnB,OAAO,WAAW,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,SAAS,CAAC;QACnB,KAAK,2BAA2B;YAC9B,OAAO,uBAAuB,CAAC;QACjC,KAAK,kBAAkB;YACrB,OAAO,gBAAgB,CAAC;QAC1B;YACE,KAAqB,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,cAAc;IACzD,CAAC;AACH,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as AutoBeStartEventMovie } from "./AutoBeStartEventMovie";
2
+ export { default as AutoBeScenarioEventMovie } from "./AutoBeScenarioEventMovie";
3
+ export { default as AutoBeProgressEventMovie } from "./AutoBeProgressEventMovie";
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AutoBeProgressEventMovie = exports.AutoBeScenarioEventMovie = exports.AutoBeStartEventMovie = void 0;
7
+ var AutoBeStartEventMovie_1 = require("./AutoBeStartEventMovie");
8
+ Object.defineProperty(exports, "AutoBeStartEventMovie", { enumerable: true, get: function () { return __importDefault(AutoBeStartEventMovie_1).default; } });
9
+ var AutoBeScenarioEventMovie_1 = require("./AutoBeScenarioEventMovie");
10
+ Object.defineProperty(exports, "AutoBeScenarioEventMovie", { enumerable: true, get: function () { return __importDefault(AutoBeScenarioEventMovie_1).default; } });
11
+ var AutoBeProgressEventMovie_1 = require("./AutoBeProgressEventMovie");
12
+ Object.defineProperty(exports, "AutoBeProgressEventMovie", { enumerable: true, get: function () { return __importDefault(AutoBeProgressEventMovie_1).default; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":";;;;;;AAAA,iEAA2E;AAAlE,+IAAA,OAAO,OAAyB;AACzC,uEAAiF;AAAxE,qJAAA,OAAO,OAA4B;AAC5C,uEAAiF;AAAxE,qJAAA,OAAO,OAA4B"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./events";
2
+ export { default as AutoBeAssistantMessageMovie } from "./AutoBeAssistantMessageMovie";
3
+ export { default as AutoBeUserMessageMovie } from "./AutoBeUserMessageMovie";
4
+ export { default as ChatBubble } from "./common/ChatBubble";
5
+ export type { IChatBubbleProps, IContentRendererProps, } from "./common/ChatBubble";
package/lib/index.js ADDED
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.ChatBubble = exports.AutoBeUserMessageMovie = exports.AutoBeAssistantMessageMovie = void 0;
21
+ __exportStar(require("./events"), exports);
22
+ var AutoBeAssistantMessageMovie_1 = require("./AutoBeAssistantMessageMovie");
23
+ Object.defineProperty(exports, "AutoBeAssistantMessageMovie", { enumerable: true, get: function () { return __importDefault(AutoBeAssistantMessageMovie_1).default; } });
24
+ var AutoBeUserMessageMovie_1 = require("./AutoBeUserMessageMovie");
25
+ Object.defineProperty(exports, "AutoBeUserMessageMovie", { enumerable: true, get: function () { return __importDefault(AutoBeUserMessageMovie_1).default; } });
26
+ var ChatBubble_1 = require("./common/ChatBubble");
27
+ Object.defineProperty(exports, "ChatBubble", { enumerable: true, get: function () { return __importDefault(ChatBubble_1).default; } });
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6EAAuF;AAA9E,2JAAA,OAAO,OAA+B;AAC/C,mEAA6E;AAApE,iJAAA,OAAO,OAA0B;AAC1C,kDAA4D;AAAnD,yHAAA,OAAO,OAAc"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Formats an ISO timestamp string to display time in Korean locale
3
+ *
4
+ * @param isoString - ISO format timestamp string
5
+ * @returns Formatted time string (HH:mm)
6
+ */
7
+ export declare const formatTime: (isoString: string) => string;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatTime = void 0;
4
+ /**
5
+ * Formats an ISO timestamp string to display time in Korean locale
6
+ *
7
+ * @param isoString - ISO format timestamp string
8
+ * @returns Formatted time string (HH:mm)
9
+ */
10
+ const formatTime = (isoString) => {
11
+ const date = new Date(isoString);
12
+ return date.toLocaleTimeString("ko-KR", {
13
+ hour: "2-digit",
14
+ minute: "2-digit",
15
+ hour12: false,
16
+ });
17
+ };
18
+ exports.formatTime = formatTime;
19
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACI,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAU,EAAE;IACtD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtC,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;AACL,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@autobe/ui",
3
+ "type": "commonjs",
4
+ "version": "0.19.1",
5
+ "description": "AutoBE UI",
6
+ "author": "Wrtn Technologies",
7
+ "homepage": "https://wrtnlabs.io/autobe",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/wrtnlabs/autobe.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/wrtnlabs/autobe/issues"
14
+ },
15
+ "main": "lib/index.js",
16
+ "devDependencies": {
17
+ "@types/react": "^19.1.10",
18
+ "@types/react-dom": "^19.1.5",
19
+ "react": "^19.1.1",
20
+ "react-dom": "^19.1.1",
21
+ "typescript": "~5.9.2",
22
+ "@autobe/interface": "0.19.1"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsc --watch"
27
+ }
28
+ }
@@ -0,0 +1,22 @@
1
+ import ChatBubble from "./common/ChatBubble";
2
+
3
+ interface IAssistantMessageProps {
4
+ text: string;
5
+ isoTimestamp?: string; // ISO format: "2025-08-13T04:45:20.341Z"
6
+ assistantName?: string;
7
+ }
8
+
9
+ const AutoBeAssistantMessageMovie = (props: IAssistantMessageProps) => {
10
+ const { text, isoTimestamp, assistantName = "AutoBe" } = props;
11
+
12
+ return (
13
+ <ChatBubble
14
+ content={[text]}
15
+ direction="left"
16
+ timestamp={isoTimestamp}
17
+ assistantName={assistantName}
18
+ />
19
+ );
20
+ };
21
+
22
+ export default AutoBeAssistantMessageMovie;
@@ -0,0 +1,25 @@
1
+ import { AutoBeUserMessageContent } from "@autobe/interface";
2
+
3
+ import ChatBubble from "./common/ChatBubble";
4
+
5
+ interface IAutoBeUserMessageHistoryMovieProps {
6
+ message: Array<AutoBeUserMessageContent>;
7
+ }
8
+
9
+ const AutoBeUserMessageMovie = (props: IAutoBeUserMessageHistoryMovieProps) => {
10
+ const { message } = props;
11
+
12
+ return (
13
+ <div
14
+ style={{
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ gap: 8,
18
+ }}
19
+ >
20
+ <ChatBubble content={message} direction="right" assistantName="You" />
21
+ </div>
22
+ );
23
+ };
24
+
25
+ export default AutoBeUserMessageMovie;
@@ -0,0 +1,119 @@
1
+ import { AutoBeUserMessageContent } from "@autobe/interface";
2
+
3
+ import { formatTime } from "../utils/time";
4
+ import { OpenAIContent } from "./openai";
5
+
6
+ /** Props interface for ChatBubble component */
7
+ export interface IChatBubbleProps {
8
+ /** Message content - supports text, audio, file, and image types */
9
+ content: Array<AutoBeUserMessageContent | string>;
10
+
11
+ /** Direction of the chat bubble - left or right */
12
+ direction: "left" | "right";
13
+ /** Timestamp (ISO format) */
14
+ timestamp?: string;
15
+ /** Assistant name (default: "Assistant") */
16
+ assistantName?: string;
17
+ }
18
+
19
+ /** Props interface for content renderer functions */
20
+ export interface IContentRendererProps {
21
+ /** Whether the bubble is positioned on the right side */
22
+ isRight: boolean;
23
+ }
24
+
25
+ const ChatBubble = (props: IChatBubbleProps) => {
26
+ const { content, direction, timestamp, assistantName = "Assistant" } = props;
27
+
28
+ const isRight = direction === "right";
29
+
30
+ return (
31
+ <div
32
+ style={{
33
+ display: "flex",
34
+ marginBottom: "1rem",
35
+ justifyContent: isRight ? "flex-end" : "flex-start",
36
+ }}
37
+ >
38
+ <div
39
+ style={{
40
+ display: "flex",
41
+ flexDirection: "column",
42
+ maxWidth: "48rem",
43
+ alignItems: isRight ? "flex-end" : "flex-start",
44
+ }}
45
+ >
46
+ {/* User name/time */}
47
+ <div
48
+ style={{
49
+ marginBottom: "0.25rem",
50
+ textAlign: isRight ? "right" : "left",
51
+ }}
52
+ >
53
+ <span
54
+ style={{
55
+ fontSize: "0.75rem",
56
+ lineHeight: "1rem",
57
+ color: "#6b7280",
58
+ }}
59
+ >
60
+ {isRight ? "You" : assistantName}
61
+ {timestamp && (
62
+ <>
63
+ <span
64
+ style={{
65
+ marginLeft: "0.25rem",
66
+ marginRight: "0.25rem",
67
+ }}
68
+ >
69
+
70
+ </span>
71
+ {formatTime(timestamp)}
72
+ </>
73
+ )}
74
+ </span>
75
+ </div>
76
+
77
+ {/* Message bubble */}
78
+ <div
79
+ style={{
80
+ position: "relative",
81
+ maxWidth: "32rem",
82
+ paddingLeft: "1rem",
83
+ paddingRight: "1rem",
84
+ paddingTop: "0.75rem",
85
+ paddingBottom: "0.75rem",
86
+ borderRadius: "1rem",
87
+ boxShadow: "0 1px 2px 0 rgb(0 0 0 / 0.05)",
88
+ backgroundColor: isRight ? "#3b82f6" : "#f3f4f6",
89
+ color: isRight ? "#ffffff" : "#1f2937",
90
+ borderTopRightRadius: isRight ? "0.375rem" : "1rem",
91
+ borderTopLeftRadius: isRight ? "1rem" : "0.375rem",
92
+ border: isRight ? "none" : "1px solid #e5e7eb",
93
+ }}
94
+ >
95
+ {/* Bubble tail */}
96
+ <div
97
+ style={{
98
+ position: "absolute",
99
+ width: "0.75rem",
100
+ height: "0.75rem",
101
+ transform: "rotate(45deg)",
102
+ backgroundColor: isRight ? "#3b82f6" : "#f3f4f6",
103
+ right: isRight ? "-0.25rem" : undefined,
104
+ left: isRight ? undefined : "-0.25rem",
105
+ top: "0.75rem",
106
+ borderLeft: isRight ? "none" : "1px solid #e5e7eb",
107
+ borderBottom: isRight ? "none" : "1px solid #e5e7eb",
108
+ }}
109
+ />
110
+
111
+ {/* Message content */}
112
+ <OpenAIContent content={content} />
113
+ </div>
114
+ </div>
115
+ </div>
116
+ );
117
+ };
118
+
119
+ export default ChatBubble;
@@ -0,0 +1,53 @@
1
+ import { AutoBeUserMessageContent } from "@autobe/interface";
2
+
3
+ import { OpenAIUserAudioContent } from "./OpenAIUserAudioContent";
4
+ import { OpenAIUserFileContent } from "./OpenAIUserFileContent";
5
+ import { OpenAIUserImageContent } from "./OpenAIUserImageContent";
6
+ import { OpenAIUserTextContent } from "./OpenAIUserTextContent";
7
+
8
+ export interface IOpenAIUserContentProps {
9
+ content: Array<AutoBeUserMessageContent | string>;
10
+ }
11
+
12
+ export const OpenAIContent = (props: IOpenAIUserContentProps) => {
13
+ const { content } = props;
14
+
15
+ /** Renders a single content item */
16
+ const renderSingleContent = (
17
+ item: AutoBeUserMessageContent | string,
18
+ index: number,
19
+ ) => {
20
+ if (typeof item === "string") {
21
+ return <OpenAIUserTextContent key={index} text={item} />;
22
+ }
23
+
24
+ switch (item.type) {
25
+ case "text":
26
+ return <OpenAIUserTextContent key={index} text={item.text} />;
27
+ case "audio":
28
+ return <OpenAIUserAudioContent key={index} content={item} />;
29
+ case "file":
30
+ return <OpenAIUserFileContent key={index} content={item} />;
31
+ case "image":
32
+ return <OpenAIUserImageContent key={index} content={item} />;
33
+ default:
34
+ return (
35
+ <OpenAIUserTextContent key={index} text="Unsupported content type" />
36
+ );
37
+ }
38
+ };
39
+
40
+ return (
41
+ <div
42
+ style={{
43
+ display: "flex",
44
+ flexDirection: "column",
45
+ gap: "0.75rem",
46
+ }}
47
+ >
48
+ {content.map((item, index) => renderSingleContent(item, index))}
49
+ </div>
50
+ );
51
+ };
52
+
53
+ export default OpenAIContent;
@@ -0,0 +1,70 @@
1
+ import { AutoBeUserMessageAudioContent } from "@autobe/interface";
2
+
3
+ /** Audio content renderer component for OpenAI messages */
4
+ export const OpenAIUserAudioContent = ({
5
+ content,
6
+ }: {
7
+ content: AutoBeUserMessageAudioContent;
8
+ }) => {
9
+ const isRight = true; // UserContent는 항상 오른쪽
10
+
11
+ return (
12
+ <div
13
+ style={{
14
+ display: "flex",
15
+ flexDirection: "column",
16
+ alignItems: "center",
17
+ justifyContent: "center",
18
+ padding: "1rem",
19
+ minWidth: "6rem",
20
+ minHeight: "6rem",
21
+ }}
22
+ >
23
+ {/* Audio Icon */}
24
+ <div
25
+ style={{
26
+ width: "2.5rem",
27
+ height: "2.5rem",
28
+ borderRadius: "50%",
29
+ backgroundColor: isRight ? "rgba(255,255,255,0.2)" : "#3b82f6",
30
+ display: "flex",
31
+ alignItems: "center",
32
+ justifyContent: "center",
33
+ marginBottom: "0.5rem",
34
+ }}
35
+ >
36
+ <svg
37
+ width="20"
38
+ height="20"
39
+ viewBox="0 0 24 24"
40
+ fill="currentColor"
41
+ style={{ color: isRight ? "#ffffff" : "#ffffff" }}
42
+ >
43
+ <path d="M12 3v10.55c-.59-.34-1.27-.55-2-.55-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4V7h4V3h-6z" />
44
+ </svg>
45
+ </div>
46
+ <div
47
+ style={{
48
+ fontSize: "0.7rem",
49
+ fontWeight: "bold",
50
+ color: isRight ? "rgba(255,255,255,0.9)" : "#6b7280",
51
+ textAlign: "center",
52
+ }}
53
+ >
54
+ AUDIO
55
+ </div>
56
+ <div
57
+ style={{
58
+ fontSize: "0.65rem",
59
+ color: isRight ? "rgba(255,255,255,0.7)" : "#9ca3af",
60
+ textAlign: "center",
61
+ marginTop: "0.25rem",
62
+ }}
63
+ >
64
+ {content.format.toUpperCase()}
65
+ </div>
66
+ </div>
67
+ );
68
+ };
69
+
70
+ export default OpenAIUserAudioContent;
@@ -0,0 +1,76 @@
1
+ import { AutoBeUserMessageFileContent } from "@autobe/interface";
2
+
3
+ /** File content renderer component for OpenAI messages */
4
+ export const OpenAIUserFileContent = ({
5
+ content,
6
+ }: {
7
+ content: AutoBeUserMessageFileContent;
8
+ }) => {
9
+ const isRight = true; // UserContent는 항상 오른쪽
10
+ const fileName =
11
+ content.file.type === "base64"
12
+ ? content.file.name
13
+ : `File ID: ${content.file.id}`;
14
+
15
+ return (
16
+ <div
17
+ style={{
18
+ display: "flex",
19
+ flexDirection: "column",
20
+ alignItems: "center",
21
+ justifyContent: "center",
22
+ padding: "1rem",
23
+ minWidth: "8rem",
24
+ minHeight: "6rem",
25
+ }}
26
+ >
27
+ {/* File Icon */}
28
+ <div
29
+ style={{
30
+ width: "2.5rem",
31
+ height: "2.5rem",
32
+ borderRadius: "0.5rem",
33
+ backgroundColor: isRight ? "rgba(255,255,255,0.2)" : "#10b981",
34
+ display: "flex",
35
+ alignItems: "center",
36
+ justifyContent: "center",
37
+ marginBottom: "0.5rem",
38
+ }}
39
+ >
40
+ <svg
41
+ width="20"
42
+ height="20"
43
+ viewBox="0 0 24 24"
44
+ fill="currentColor"
45
+ style={{ color: "#ffffff" }}
46
+ >
47
+ <path d="M14,2H6A2,2 0 0,0 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2M18,20H6V4H13V9H18V20Z" />
48
+ </svg>
49
+ </div>
50
+ <div
51
+ style={{
52
+ fontSize: "0.7rem",
53
+ fontWeight: "bold",
54
+ color: isRight ? "rgba(255,255,255,0.9)" : "#6b7280",
55
+ textAlign: "center",
56
+ marginBottom: "0.25rem",
57
+ }}
58
+ >
59
+ {fileName.split(".").at(-1)?.toUpperCase()} FILE
60
+ </div>
61
+ <div
62
+ style={{
63
+ fontSize: "0.65rem",
64
+ color: isRight ? "rgba(255,255,255,0.7)" : "#9ca3af",
65
+ textAlign: "center",
66
+ wordBreak: "break-all",
67
+ maxWidth: "8rem",
68
+ }}
69
+ >
70
+ {fileName}
71
+ </div>
72
+ </div>
73
+ );
74
+ };
75
+
76
+ export default OpenAIUserFileContent;