@mybricks/plugin-ai 0.0.1 → 0.0.2

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 (93) hide show
  1. package/package.json +7 -2
  2. package/src/agents/app.ts +188 -60
  3. package/src/agents/common.ts +428 -68
  4. package/src/agents/custom.ts +14 -0
  5. package/src/agents/index.ts +31 -1
  6. package/src/agents/knowledges/README.md +614 -0
  7. package/src/agents/knowledges/SUMMARY.md +527 -0
  8. package/src/agents/knowledges/index.ts +8 -0
  9. package/src/agents/knowledges/knowledge-base.ts +565 -0
  10. package/src/agents/knowledges/knowledge-node.ts +266 -0
  11. package/src/agents/knowledges/types.ts +208 -0
  12. package/src/agents/utils/config.ts +427 -0
  13. package/src/agents/workspace/coding-manager.ts +31 -0
  14. package/src/agents/workspace/components-manager.ts +124 -0
  15. package/src/agents/workspace/outline-focus.ts +188 -0
  16. package/src/agents/workspace/outline-info.ts +520 -0
  17. package/src/agents/workspace/page-tree-generator.ts +83 -0
  18. package/src/agents/workspace/workspace.ts +319 -0
  19. package/src/agents/workspace-by-knowledges/MIGRATION.md +568 -0
  20. package/src/agents/workspace-by-knowledges/README.md +521 -0
  21. package/src/agents/workspace-by-knowledges/index.ts +11 -0
  22. package/src/agents/workspace-by-knowledges/providers/component-docs-provider.ts +92 -0
  23. package/src/agents/workspace-by-knowledges/providers/focus-info-provider.ts +131 -0
  24. package/src/agents/workspace-by-knowledges/providers/index.ts +8 -0
  25. package/src/agents/workspace-by-knowledges/providers/project-info-provider.ts +151 -0
  26. package/src/agents/workspace-by-knowledges/test.ts +240 -0
  27. package/src/agents/workspace-by-knowledges/types.ts +56 -0
  28. package/src/agents/workspace-by-knowledges/utils/components-manager.ts +145 -0
  29. package/src/agents/workspace-by-knowledges/utils/index.ts +8 -0
  30. package/src/agents/workspace-by-knowledges/utils/outline-focus.ts +178 -0
  31. package/src/agents/workspace-by-knowledges/utils/outline-info.ts +521 -0
  32. package/src/agents/workspace-by-knowledges/workspace.ts +166 -0
  33. package/src/api/cloud-components.ts +129 -0
  34. package/src/api-record-replay/README.md +187 -0
  35. package/src/api-record-replay/index.ts +11 -0
  36. package/src/api-record-replay/manager.ts +168 -0
  37. package/src/api-record-replay/recorder.ts +117 -0
  38. package/src/api-record-replay/replayer.ts +148 -0
  39. package/src/components/attachments/index.less +117 -0
  40. package/src/components/attachments/index.tsx +136 -0
  41. package/src/components/icons/index.tsx +21 -1
  42. package/src/components/index.less +34 -0
  43. package/src/components/mention/index.less +23 -0
  44. package/src/components/mention/index.tsx +19 -0
  45. package/src/components/messages/index.less +444 -237
  46. package/src/components/messages/index.tsx +371 -88
  47. package/src/components/sender/index.less +203 -0
  48. package/src/components/sender/index.tsx +298 -0
  49. package/src/components/types.ts +31 -0
  50. package/src/constants/index.ts +8 -0
  51. package/src/context/RequestStatusTracker.ts +50 -0
  52. package/src/context/index.ts +68 -6
  53. package/src/{types.d.ts → global.d.ts} +40 -5
  54. package/src/index.tsx +212 -32
  55. package/src/preset/agents.ts +380 -0
  56. package/src/preset/createTemplates.ts +25 -0
  57. package/src/preset/index.ts +12 -0
  58. package/src/preset/prompts.ts +235 -0
  59. package/src/preset/requestAsStream.ts +246 -0
  60. package/src/preset/user.ts +6 -0
  61. package/src/startView/components/header/header.less +17 -0
  62. package/src/startView/components/header/header.tsx +15 -0
  63. package/src/startView/components/index.ts +1 -0
  64. package/src/startView/index.less +22 -204
  65. package/src/startView/index.tsx +35 -203
  66. package/src/tools/analyze-and-expand-prd.ts +192 -86
  67. package/src/tools/analyze-requirement-and-components.ts +589 -0
  68. package/src/tools/answer.ts +59 -0
  69. package/src/tools/build-process.ts +1174 -0
  70. package/src/tools/coding-subagent-as-tool.ts +119 -0
  71. package/src/tools/generate-ui-content.ts +1083 -0
  72. package/src/tools/index.ts +22 -19
  73. package/src/tools/open-dsl.ts +69 -0
  74. package/src/tools/refactor-ui-content.ts +801 -0
  75. package/src/tools/utils.ts +880 -28
  76. package/src/types/index.ts +4 -0
  77. package/src/view/components/header/header.less +36 -2
  78. package/src/view/components/header/header.tsx +47 -2
  79. package/src/view/components/index.ts +0 -2
  80. package/src/view/index.tsx +158 -8
  81. package/src/tools/answer-user.ts +0 -35
  82. package/src/tools/focus-element.ts +0 -47
  83. package/src/tools/generate-page.ts +0 -750
  84. package/src/tools/get-component-info-by-ids.ts +0 -166
  85. package/src/tools/get-component-info.ts +0 -53
  86. package/src/tools/get-components-doc-and-prd.ts +0 -137
  87. package/src/tools/get-focus-mybricks-dsl.ts +0 -26
  88. package/src/tools/get-mybricks-dsl.ts +0 -73
  89. package/src/tools/modify-component.ts +0 -385
  90. package/src/view/components/messages/messages.less +0 -228
  91. package/src/view/components/messages/messages.tsx +0 -172
  92. package/src/view/components/sender/sender.less +0 -44
  93. package/src/view/components/sender/sender.tsx +0 -62
@@ -1,172 +0,0 @@
1
- import React, { useEffect, useLayoutEffect, useState, useRef } from "react"
2
- import classNames from "classnames"
3
- import { Loading3QuartersOutlined, CheckCircleOutlined, CloseCircleOutlined } from "@ant-design/icons"
4
- import { marked } from "marked";
5
- import { context } from "../../../context"
6
- import css from "./messages.less"
7
-
8
- const Messages = ({ user }: any) => {
9
- const destroysRef = useRef<(() => void)[]>([]);
10
- const [plans, setPlans] = useState<any>([]);
11
-
12
- useLayoutEffect(() => {
13
- // @ts-ignore TODO
14
- destroysRef.current.push(context.rxai.events.on('plan', (plans: any) => {
15
- setPlans([...plans])
16
- }, true))
17
- }, [])
18
-
19
- useEffect(() => {
20
- return () => {
21
- for (const destroy of destroysRef.current) {
22
- destroy()
23
- }
24
- }
25
- }, [])
26
-
27
- return (
28
- <div className={classNames(css.messages)}>
29
- {plans.map((plan: any, index: number) => {
30
- return <Plan key={index} plan={plan} user={user} />
31
- })}
32
- <div className={classNames(css.anchor)} />
33
- </div>
34
- )
35
- }
36
-
37
- export { Messages }
38
-
39
- const Plan = ({ plan, user }: { plan: any, user: any }) => {
40
- const [messages, setMessages] = useState<any[]>([])
41
- const [message, setMessage] = useState("")
42
- const [loading, setLoading] = useState(true)
43
- const destroysRef = useRef<any[]>([]);
44
- const messageRef = useRef<HTMLDivElement>(null)
45
-
46
- useLayoutEffect(() => {
47
- destroysRef.current.push(
48
- plan.events.on('loading', (loading: boolean) => {
49
- setLoading(loading);
50
- }, true),
51
- plan.events.on('messageStream', (messageStream: string) => {
52
- setMessage((pre) => {
53
- return pre + messageStream;
54
- })
55
- }, true),
56
- plan.events.on('userFriendlyMessages', (messages: any[]) => {
57
- setMessages([...messages])
58
- setMessage("")
59
- }, true),
60
- )
61
- }, [])
62
-
63
- useEffect(() => {
64
- return () => {
65
- for (const destroy of destroysRef.current) {
66
- destroy()
67
- }
68
- }
69
- }, [])
70
-
71
- useEffect(() => {
72
- if (message) {
73
- messageRef.current!.innerHTML = marked.parse(message) as string;
74
- }
75
- }, [message])
76
-
77
- return (
78
- <>
79
- {messages[0] && (
80
- <div className={css.bubbleContainer}>
81
- <div className={css.bubbleHeader}>
82
- <span className={css.bubbleHeaderAvatar}>
83
- <img className={css.userAvatar} src={user.avatar} />
84
- </span>
85
- <span className={css.bubbleHeaderName}>{user.name}</span>
86
- </div>
87
- <BubbleUser message={messages[0]} />
88
- </div>
89
- )}
90
- {messages[0] && (
91
- <div className={css.bubbleContainer}>
92
- <div className={css.bubbleHeader}>
93
- <span className={css.bubbleHeaderAvatar}>
94
- <img className={css.aiAvatar} src={"https://my.mybricks.world/image/icon.png"} />
95
- </span>
96
- <span className={css.bubbleHeaderName}>MyBricks.ai</span>
97
- </div>
98
- <div className={classNames(css.messageContainer)}>
99
- <div className={css.markDown}>
100
- {messages.slice(1).map((message, index) => {
101
- return message.role === "tool" ? <BubbleAITool key={index + message.status} message={message} /> : <BubbleAI key={index} message={message} />
102
- })}
103
- {message ? (
104
- <div ref={messageRef}>
105
- </div>
106
- ) : null}
107
- {!message && loading ? (
108
- <>
109
- <span>正在思考</span>
110
- <Loading3QuartersOutlined className={css.spinIcon} />
111
- </>
112
- ) : null}
113
- </div>
114
- </div>
115
- </div>
116
- )}
117
- </>
118
- )
119
- }
120
-
121
- const BubbleAITool = ({ message }: any) => {
122
- return (
123
- <div className={css.collapsibleCodeBlock}>
124
- <div className={css.codeHeader}>
125
- <span className={css.codeTitle}>{message.content.displayName}</span>
126
- <span className={css.codeTitleStatus}>
127
- {message.status === "pending" && <Loading3QuartersOutlined className={css.spinIcon} />}
128
- {message.status === "success" && <CheckCircleOutlined style={{ color: "green" }} />}
129
- {message.status === "error" && <CloseCircleOutlined style={{ color: "red" }} />}
130
- </span>
131
- </div>
132
- </div>
133
- )
134
- }
135
-
136
- const BubbleAI = ({ message }: any) => {
137
- const bubbleRef = useRef<HTMLDivElement>(null);
138
-
139
- useLayoutEffect(() => {
140
- const content = typeof message.content === "string" ?
141
- message.content :
142
- message.content.find((content: any) => {
143
- if (content.type === "text") {
144
- return content
145
- }
146
- })?.text
147
- bubbleRef.current!.innerHTML = marked.parse(content) as string;
148
- }, [])
149
-
150
- return <span ref={bubbleRef}></span>
151
- }
152
-
153
- const BubbleUser = ({ message }: any) => {
154
- const bubbleRef = useRef<HTMLDivElement>(null);
155
-
156
- useLayoutEffect(() => {
157
- const content = typeof message.content === "string" ?
158
- message.content :
159
- message.content.find((content: any) => {
160
- if (content.type === "text") {
161
- return content
162
- }
163
- })?.text
164
- bubbleRef.current!.innerHTML = marked.parse(content) as string;
165
- }, [])
166
-
167
- return (
168
- <div className={classNames(css.messageContainer, css.userMessage)}>
169
- <div ref={bubbleRef} className={css.markDown}></div>
170
- </div>
171
- )
172
- }
@@ -1,44 +0,0 @@
1
- .sender {
2
- width: 100%;
3
- padding: 12px;
4
-
5
- .content {
6
- width: 100%;
7
- height: 40px;
8
- box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03), 0 1px 6px -1px rgba(0, 0, 0, 0.02), 0 2px 4px 0 rgba(0, 0, 0, 0.02);
9
- border-radius: 12px;
10
- border: 1px solid #d9d9d9;
11
- display: flex;
12
- align-items: center;
13
- padding: 6px;
14
-
15
- .textarea {
16
- resize: none;
17
- flex: 1;
18
- font-size: 12px;
19
- height: 22px;
20
- line-height: 22px;
21
- }
22
-
23
- .button {
24
- width: 28px;
25
- height: 28px;
26
- border-radius: 50%;
27
- background-color: var(--mybricks-color-primary);
28
-
29
- &:hover {
30
- cursor: pointer;
31
- }
32
-
33
- &:disabled {
34
- opacity: 0.5;
35
- cursor: not-allowed;
36
- }
37
-
38
- .icon {
39
- font-size: 14px;
40
- color: #ffffff;
41
- }
42
- }
43
- }
44
- }
@@ -1,62 +0,0 @@
1
- import React, { useState } from "react"
2
- import classNames from "classnames"
3
- import { ArrowUpOutlined } from "@ant-design/icons"
4
- import { context } from "../../../context"
5
- import { Agents } from '../../../agents'
6
- import css from "./sender.less"
7
-
8
- const Sender = () => {
9
- const [message, setMessage] = useState('');
10
-
11
- const send = () => {
12
- Agents.requestCommonAgent({
13
- message
14
- })
15
-
16
- // context.rxai.requestAI({
17
- // message,
18
- // emits: {
19
- // write: () => { },
20
- // complete: () => { },
21
- // error: () => { },
22
- // cancel: () => { }
23
- // },
24
- // key: "",
25
- // tools: context.getTools(),
26
- // presetMessages: context.getPresetMessages()
27
- // })
28
- setMessage("");
29
- }
30
-
31
- return (
32
- <div className={classNames(css.sender)}>
33
- <div className={classNames(css.content)}>
34
- <textarea
35
- className={classNames(css.textarea)}
36
- value={message}
37
- onChange={(event) => {
38
- setMessage(event.target.value);
39
- }}
40
- autoFocus
41
- onKeyDown={(event) => {
42
- if (event.key === 'Enter' && !event.shiftKey) {
43
- event.preventDefault()
44
- if (message) {
45
- send()
46
- }
47
- }
48
- }}
49
- />
50
- <button
51
- className={classNames(css.button)}
52
- disabled={!message}
53
- onClick={send}
54
- >
55
- <ArrowUpOutlined className={classNames(css.icon)} />
56
- </button>
57
- </div>
58
- </div>
59
- )
60
- }
61
-
62
- export { Sender }