@fugood/bricks-project 2.23.2 → 2.23.4
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.
- package/compile/index.ts +343 -125
- package/package.json +4 -2
- package/skills/bricks-project/rules/automations.md +7 -7
- package/tools/deploy.ts +39 -10
- package/tools/mcp-server.ts +10 -877
- package/tools/mcp-tools/compile.ts +91 -0
- package/tools/mcp-tools/huggingface.ts +653 -0
- package/tools/mcp-tools/icons.ts +60 -0
- package/tools/mcp-tools/lottie.ts +102 -0
- package/tools/mcp-tools/media.ts +110 -0
- package/tools/postinstall.ts +11 -6
- package/tools/pull.ts +25 -9
- package/tsconfig.json +16 -0
- package/types/bricks/Camera.ts +1 -1
- package/types/bricks/Chart.ts +1 -1
- package/types/bricks/GenerativeMedia.ts +1 -1
- package/types/bricks/Icon.ts +1 -1
- package/types/bricks/Image.ts +1 -1
- package/types/bricks/Items.ts +1 -1
- package/types/bricks/Lottie.ts +1 -1
- package/types/bricks/Maps.ts +1 -1
- package/types/bricks/QrCode.ts +1 -1
- package/types/bricks/Rect.ts +1 -1
- package/types/bricks/RichText.ts +1 -1
- package/types/bricks/Rive.ts +1 -1
- package/types/bricks/Slideshow.ts +1 -1
- package/types/bricks/Svg.ts +1 -1
- package/types/bricks/Text.ts +1 -1
- package/types/bricks/TextInput.ts +1 -1
- package/types/bricks/Video.ts +1 -1
- package/types/bricks/VideoStreaming.ts +1 -1
- package/types/bricks/WebRtcStream.ts +1 -1
- package/types/bricks/WebView.ts +1 -1
- package/types/canvas.ts +2 -2
- package/types/common.ts +4 -4
- package/types/generators/AlarmClock.ts +1 -1
- package/types/generators/Assistant.ts +1 -1
- package/types/generators/BleCentral.ts +1 -1
- package/types/generators/BlePeripheral.ts +1 -1
- package/types/generators/CanvasMap.ts +1 -1
- package/types/generators/CastlesPay.ts +1 -1
- package/types/generators/DataBank.ts +1 -1
- package/types/generators/File.ts +1 -1
- package/types/generators/GraphQl.ts +1 -1
- package/types/generators/Http.ts +1 -1
- package/types/generators/HttpServer.ts +1 -1
- package/types/generators/Information.ts +1 -1
- package/types/generators/Intent.ts +1 -1
- package/types/generators/Iterator.ts +1 -1
- package/types/generators/Keyboard.ts +1 -1
- package/types/generators/LlmAnthropicCompat.ts +1 -1
- package/types/generators/LlmAppleBuiltin.ts +1 -1
- package/types/generators/LlmGgml.ts +1 -1
- package/types/generators/LlmOnnx.ts +1 -1
- package/types/generators/LlmOpenAiCompat.ts +1 -1
- package/types/generators/LlmQualcommAiEngine.ts +1 -1
- package/types/generators/Mcp.ts +1 -1
- package/types/generators/McpServer.ts +1 -1
- package/types/generators/MediaFlow.ts +1 -1
- package/types/generators/MqttBroker.ts +1 -1
- package/types/generators/MqttClient.ts +1 -1
- package/types/generators/Question.ts +1 -1
- package/types/generators/RealtimeTranscription.ts +1 -1
- package/types/generators/RerankerGgml.ts +1 -1
- package/types/generators/SerialPort.ts +1 -1
- package/types/generators/SoundPlayer.ts +1 -1
- package/types/generators/SoundRecorder.ts +1 -1
- package/types/generators/SpeechToTextGgml.ts +1 -1
- package/types/generators/SpeechToTextOnnx.ts +1 -1
- package/types/generators/SpeechToTextPlatform.ts +1 -1
- package/types/generators/SqLite.ts +1 -1
- package/types/generators/Step.ts +1 -1
- package/types/generators/SttAppleBuiltin.ts +1 -1
- package/types/generators/Tcp.ts +1 -1
- package/types/generators/TcpServer.ts +1 -1
- package/types/generators/TextToSpeechAppleBuiltin.ts +1 -1
- package/types/generators/TextToSpeechGgml.ts +1 -1
- package/types/generators/TextToSpeechOnnx.ts +1 -1
- package/types/generators/TextToSpeechOpenAiLike.ts +1 -1
- package/types/generators/ThermalPrinter.ts +1 -1
- package/types/generators/Tick.ts +1 -1
- package/types/generators/Udp.ts +1 -1
- package/types/generators/VadGgml.ts +1 -1
- package/types/generators/VadOnnx.ts +1 -1
- package/types/generators/VadTraditional.ts +1 -1
- package/types/generators/VectorStore.ts +1 -1
- package/types/generators/Watchdog.ts +1 -1
- package/types/generators/WebCrawler.ts +1 -1
- package/types/generators/WebRtc.ts +1 -1
- package/types/generators/WebSocket.ts +1 -1
- package/types/system.ts +1 -1
- package/utils/calc.ts +16 -10
- package/utils/id.ts +4 -0
- package/api/index.ts +0 -1
- package/api/instance.ts +0 -213
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import * as TOON from '@toon-format/toon'
|
|
4
|
+
|
|
5
|
+
const LOTTIEFILES_API_URL = 'https://lottiefiles.com/api'
|
|
6
|
+
|
|
7
|
+
export function register(server: McpServer) {
|
|
8
|
+
server.tool(
|
|
9
|
+
'lottie_search',
|
|
10
|
+
{
|
|
11
|
+
query: z.string().describe('Search keywords for animations'),
|
|
12
|
+
page: z.number().min(1).optional().default(1),
|
|
13
|
+
limit: z.number().min(1).max(100).optional().default(10),
|
|
14
|
+
},
|
|
15
|
+
async ({ query, page, limit }) => {
|
|
16
|
+
try {
|
|
17
|
+
const url = new URL(`${LOTTIEFILES_API_URL}/search/get-animations`)
|
|
18
|
+
url.searchParams.set('query', query)
|
|
19
|
+
url.searchParams.set('page', String(page))
|
|
20
|
+
url.searchParams.set('limit', String(limit))
|
|
21
|
+
url.searchParams.set('format', 'json')
|
|
22
|
+
|
|
23
|
+
const response = await fetch(url.toString())
|
|
24
|
+
const data = await response.json()
|
|
25
|
+
const animations = data?.data?.data ?? []
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: 'text',
|
|
31
|
+
text: TOON.encode({ count: animations.length, animations }),
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
}
|
|
35
|
+
} catch (err: any) {
|
|
36
|
+
return {
|
|
37
|
+
content: [{ type: 'text', text: `Failed to search animations: ${err.message}` }],
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
server.tool(
|
|
44
|
+
'lottie_get_details',
|
|
45
|
+
{
|
|
46
|
+
id: z.string().describe('Animation file ID'),
|
|
47
|
+
},
|
|
48
|
+
async ({ id }) => {
|
|
49
|
+
try {
|
|
50
|
+
const url = new URL(`${LOTTIEFILES_API_URL}/animations/get-animation-data`)
|
|
51
|
+
url.searchParams.set('fileId', id)
|
|
52
|
+
url.searchParams.set('format', 'json')
|
|
53
|
+
|
|
54
|
+
const response = await fetch(url.toString())
|
|
55
|
+
const data = await response.json()
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: 'text', text: TOON.encode(data) }],
|
|
59
|
+
}
|
|
60
|
+
} catch (err: any) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: 'text', text: `Failed to get animation: ${err.message}` }],
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
server.tool(
|
|
69
|
+
'lottie_popular',
|
|
70
|
+
{
|
|
71
|
+
page: z.number().min(1).optional().default(1),
|
|
72
|
+
limit: z.number().min(1).max(100).optional().default(10),
|
|
73
|
+
},
|
|
74
|
+
async ({ page, limit }) => {
|
|
75
|
+
try {
|
|
76
|
+
const url = new URL(
|
|
77
|
+
`${LOTTIEFILES_API_URL}/iconscout/popular-animations-weekly?api=%26sort%3Dpopular`,
|
|
78
|
+
)
|
|
79
|
+
url.searchParams.set('page', String(page))
|
|
80
|
+
url.searchParams.set('limit', String(limit))
|
|
81
|
+
url.searchParams.set('format', 'json')
|
|
82
|
+
|
|
83
|
+
const response = await fetch(url.toString())
|
|
84
|
+
const data = await response.json()
|
|
85
|
+
const animations = data?.popularWeeklyData?.data ?? []
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: 'text',
|
|
91
|
+
text: TOON.encode({ count: animations.length, animations }),
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
}
|
|
95
|
+
} catch (err: any) {
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: 'text', text: `Failed to get popular animations: ${err.message}` }],
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
)
|
|
102
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
import { $ } from 'bun'
|
|
4
|
+
|
|
5
|
+
const runBricks = async (projectDir: string, ...args: string[]) => {
|
|
6
|
+
try {
|
|
7
|
+
return await $`bunx bricks ${args}`.cwd(projectDir).text()
|
|
8
|
+
} catch (err: any) {
|
|
9
|
+
throw new Error(err.stderr?.toString() || err.message)
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function register(server: McpServer, projectDir: string) {
|
|
14
|
+
server.tool('media_boxes', {}, async () => {
|
|
15
|
+
try {
|
|
16
|
+
const output = await runBricks(projectDir, 'media', 'boxes')
|
|
17
|
+
return { content: [{ type: 'text', text: output }] }
|
|
18
|
+
} catch (err: any) {
|
|
19
|
+
return { content: [{ type: 'text', text: `Failed to list media boxes: ${err.message}` }] }
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
server.tool('media_get_box', { id: z.string().describe('Media box ID') }, async ({ id }) => {
|
|
24
|
+
try {
|
|
25
|
+
const output = await runBricks(projectDir, 'media', 'box', id)
|
|
26
|
+
return { content: [{ type: 'text', text: output }] }
|
|
27
|
+
} catch (err: any) {
|
|
28
|
+
return { content: [{ type: 'text', text: `Failed to get media box: ${err.message}` }] }
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
server.tool(
|
|
33
|
+
'media_files',
|
|
34
|
+
{
|
|
35
|
+
boxId: z.string().describe('Media box ID'),
|
|
36
|
+
types: z.string().describe('Comma-separated file types to include').optional(),
|
|
37
|
+
userTag: z.array(z.string()).describe('Filter by user tags').optional(),
|
|
38
|
+
limit: z.number().describe('Limit results').optional(),
|
|
39
|
+
offset: z.number().describe('Offset results').optional(),
|
|
40
|
+
},
|
|
41
|
+
async ({ boxId, types, userTag, limit, offset }) => {
|
|
42
|
+
try {
|
|
43
|
+
const args = ['media', 'files', boxId]
|
|
44
|
+
if (types) args.push('-t', types)
|
|
45
|
+
if (userTag) userTag.forEach((tag) => args.push('-u', tag))
|
|
46
|
+
if (limit != null) args.push('-l', String(limit))
|
|
47
|
+
if (offset != null) args.push('-o', String(offset))
|
|
48
|
+
const output = await runBricks(projectDir, ...args)
|
|
49
|
+
return { content: [{ type: 'text', text: output }] }
|
|
50
|
+
} catch (err: any) {
|
|
51
|
+
return { content: [{ type: 'text', text: `Failed to list media files: ${err.message}` }] }
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
server.tool('media_file', { id: z.string().describe('Media file ID') }, async ({ id }) => {
|
|
57
|
+
try {
|
|
58
|
+
const output = await runBricks(projectDir, 'media', 'file', id)
|
|
59
|
+
return { content: [{ type: 'text', text: output }] }
|
|
60
|
+
} catch (err: any) {
|
|
61
|
+
return { content: [{ type: 'text', text: `Failed to get media file: ${err.message}` }] }
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
server.tool(
|
|
66
|
+
'media_upload_files',
|
|
67
|
+
{
|
|
68
|
+
boxId: z.string().describe('Target media box ID'),
|
|
69
|
+
files: z.array(z.string()).min(1).describe('File paths to upload'),
|
|
70
|
+
description: z.string().describe('File description').optional(),
|
|
71
|
+
userTags: z.array(z.string()).max(15).describe('User tags (max 15)').optional(),
|
|
72
|
+
imageVersion: z
|
|
73
|
+
.array(z.string())
|
|
74
|
+
.describe('Image resize specs as WxH or WxH:STRATEGY')
|
|
75
|
+
.optional(),
|
|
76
|
+
imageVersionType: z.enum(['jpg', 'png']).describe('Image output format').optional(),
|
|
77
|
+
enableAiAnalysis: z.boolean().describe('Enable AI analysis').optional(),
|
|
78
|
+
aiInstruction: z.string().describe('Custom AI analysis instruction').optional(),
|
|
79
|
+
concurrency: z.number().min(1).describe('Max concurrent uploads').optional(),
|
|
80
|
+
},
|
|
81
|
+
async ({
|
|
82
|
+
boxId,
|
|
83
|
+
files,
|
|
84
|
+
description,
|
|
85
|
+
userTags,
|
|
86
|
+
imageVersion,
|
|
87
|
+
imageVersionType,
|
|
88
|
+
enableAiAnalysis,
|
|
89
|
+
aiInstruction,
|
|
90
|
+
concurrency,
|
|
91
|
+
}) => {
|
|
92
|
+
try {
|
|
93
|
+
const args = ['media', 'upload', boxId, ...files]
|
|
94
|
+
if (description) args.push('-d', description)
|
|
95
|
+
if (userTags) userTags.forEach((tag) => args.push('-t', tag))
|
|
96
|
+
if (imageVersion) imageVersion.forEach((spec) => args.push('--image-version', spec))
|
|
97
|
+
if (imageVersionType) args.push('--image-version-type', imageVersionType)
|
|
98
|
+
if (enableAiAnalysis) args.push('--enable-ai-analysis')
|
|
99
|
+
if (aiInstruction) args.push('--ai-instruction', aiInstruction)
|
|
100
|
+
if (concurrency != null) args.push('--concurrency', String(concurrency))
|
|
101
|
+
const output = await runBricks(projectDir, ...args)
|
|
102
|
+
return { content: [{ type: 'text', text: output }] }
|
|
103
|
+
} catch (err: any) {
|
|
104
|
+
return {
|
|
105
|
+
content: [{ type: 'text', text: `Failed to upload media files: ${err.message}` }],
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
}
|
package/tools/postinstall.ts
CHANGED
|
@@ -30,6 +30,10 @@ const projectMcpServer = {
|
|
|
30
30
|
args: [`${cwd}/node_modules/@fugood/bricks-project/tools/mcp-server.ts`],
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
type CodexMcpConfig = {
|
|
34
|
+
mcp_servers: Record<string, typeof projectMcpServer>
|
|
35
|
+
}
|
|
36
|
+
|
|
33
37
|
const defaultMcpConfig = {
|
|
34
38
|
mcpServers: {
|
|
35
39
|
'bricks-project': projectMcpServer,
|
|
@@ -44,7 +48,7 @@ const handleMcpConfigOverride = async (mcpConfigPath: string) => {
|
|
|
44
48
|
mcpConfig = JSON.parse(configStr)
|
|
45
49
|
if (!mcpConfig?.mcpServers) throw new Error('mcpServers is not defined')
|
|
46
50
|
mcpConfig.mcpServers['bricks-project'] = projectMcpServer
|
|
47
|
-
} catch
|
|
51
|
+
} catch {
|
|
48
52
|
mcpConfig = defaultMcpConfig
|
|
49
53
|
}
|
|
50
54
|
} else {
|
|
@@ -104,21 +108,22 @@ if (hasAgentsMd) {
|
|
|
104
108
|
}
|
|
105
109
|
|
|
106
110
|
const handleCodexMcpConfigOverride = async (mcpConfigPath: string) => {
|
|
107
|
-
let mcpConfig:
|
|
111
|
+
let mcpConfig: CodexMcpConfig | null = null
|
|
108
112
|
if (await exists(mcpConfigPath)) {
|
|
109
113
|
const configStr = await readFile(mcpConfigPath, 'utf-8')
|
|
110
114
|
try {
|
|
111
|
-
|
|
112
|
-
if (!
|
|
115
|
+
const parsed = TOML.parse(configStr) as Partial<CodexMcpConfig>
|
|
116
|
+
if (!parsed?.mcp_servers) throw new Error('mcp_servers is not defined')
|
|
117
|
+
mcpConfig = { mcp_servers: parsed.mcp_servers }
|
|
113
118
|
mcpConfig.mcp_servers['bricks-project'] = projectMcpServer
|
|
114
|
-
} catch
|
|
119
|
+
} catch {
|
|
115
120
|
mcpConfig = defaultCodexMcpConfig
|
|
116
121
|
}
|
|
117
122
|
} else {
|
|
118
123
|
mcpConfig = defaultCodexMcpConfig
|
|
119
124
|
}
|
|
120
125
|
|
|
121
|
-
await writeFile(mcpConfigPath, `${TOML.stringify(mcpConfig
|
|
126
|
+
await writeFile(mcpConfigPath, `${TOML.stringify(mcpConfig)}\n`)
|
|
122
127
|
|
|
123
128
|
console.log(`Updated ${mcpConfigPath}`)
|
|
124
129
|
}
|
package/tools/pull.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { $ } from 'bun'
|
|
|
2
2
|
import { format } from 'prettier'
|
|
3
3
|
|
|
4
4
|
const cwd = process.cwd()
|
|
5
|
+
const args = process.argv.slice(2)
|
|
6
|
+
const force = args.includes('--force') || args.includes('-f')
|
|
5
7
|
|
|
6
8
|
// Check git status
|
|
7
9
|
const { exitCode } = await $`cd ${cwd} && git status`.nothrow()
|
|
@@ -9,8 +11,15 @@ const isGitRepo = exitCode === 0
|
|
|
9
11
|
|
|
10
12
|
if (isGitRepo) {
|
|
11
13
|
const unstagedChanges = await $`cd ${cwd} && git diff --name-only --diff-filter=ACMR`.text()
|
|
12
|
-
if (unstagedChanges)
|
|
13
|
-
|
|
14
|
+
if (unstagedChanges) {
|
|
15
|
+
if (force) {
|
|
16
|
+
console.log('Force mode: committing unstaged changes before pull...')
|
|
17
|
+
await $`cd ${cwd} && git add .`
|
|
18
|
+
await $`cd ${cwd} && git commit -m ${'chore(force-pull): saved unstaged changes before pull'}`
|
|
19
|
+
} else {
|
|
20
|
+
throw new Error('Unstaged changes found, please commit or stash your changes before pulling')
|
|
21
|
+
}
|
|
22
|
+
}
|
|
14
23
|
} else {
|
|
15
24
|
const confirmContinue = prompt(
|
|
16
25
|
'No git repository found, so it will not be safe to pull, continue? (y/n)',
|
|
@@ -25,6 +34,7 @@ const isModule = app.type === 'module'
|
|
|
25
34
|
const command = isModule ? 'module' : 'app'
|
|
26
35
|
|
|
27
36
|
// Fetch project files using CLI
|
|
37
|
+
console.log(`Pulling ${command} project (${app.id})...`)
|
|
28
38
|
const result = await $`bricks ${command} project-pull ${app.id} --json`.quiet().nothrow()
|
|
29
39
|
|
|
30
40
|
if (result.exitCode !== 0) {
|
|
@@ -40,7 +50,8 @@ if (result.exitCode !== 0) {
|
|
|
40
50
|
const { files, lastCommitId } = JSON.parse(result.stdout.toString())
|
|
41
51
|
|
|
42
52
|
let useMain = false
|
|
43
|
-
if (isGitRepo) {
|
|
53
|
+
if (isGitRepo && !force) {
|
|
54
|
+
console.log(`Checking commit ${lastCommitId}...`)
|
|
44
55
|
const found = (await $`cd ${cwd} && git rev-list -1 ${lastCommitId}`.nothrow().text())
|
|
45
56
|
.trim()
|
|
46
57
|
.match(/^[\da-f]{40}$/)
|
|
@@ -86,13 +97,18 @@ await Promise.all(
|
|
|
86
97
|
|
|
87
98
|
if (isGitRepo) {
|
|
88
99
|
await $`cd ${cwd} && git add .`
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
100
|
+
const hasChanges = !!(await $`cd ${cwd} && git diff --cached --name-only`.text()).trim()
|
|
101
|
+
if (hasChanges) {
|
|
102
|
+
let commitMsg = 'chore(project): apply file changes from BRICKS application'
|
|
103
|
+
if (force) commitMsg = `chore(force-pull): apply force pull-${command}`
|
|
104
|
+
else if (isModule) commitMsg = 'chore(project): apply file changes from BRICKS module'
|
|
105
|
+
await $`cd ${cwd} && git commit -m ${commitMsg}`
|
|
106
|
+
}
|
|
107
|
+
if (!force && !useMain) {
|
|
94
108
|
await $`cd ${cwd} && git merge main`
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
111
|
|
|
98
|
-
console.log(
|
|
112
|
+
console.log(
|
|
113
|
+
`${isModule ? 'Module' : 'App'} project pulled: ${files.length} files${force ? ' (force)' : ''}`,
|
|
114
|
+
)
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"lib": ["ESNext"],
|
|
4
|
+
"target": "ESNext",
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"moduleDetection": "force",
|
|
7
|
+
"allowJs": true,
|
|
8
|
+
"resolveJsonModule": true,
|
|
9
|
+
"moduleResolution": "bundler",
|
|
10
|
+
"allowImportingTsExtensions": true,
|
|
11
|
+
"verbatimModuleSyntax": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
},
|
|
15
|
+
"exclude": ["node_modules"],
|
|
16
|
+
}
|
package/types/bricks/Camera.ts
CHANGED
package/types/bricks/Chart.ts
CHANGED
package/types/bricks/Icon.ts
CHANGED
package/types/bricks/Image.ts
CHANGED
package/types/bricks/Items.ts
CHANGED
package/types/bricks/Lottie.ts
CHANGED
package/types/bricks/Maps.ts
CHANGED
package/types/bricks/QrCode.ts
CHANGED
package/types/bricks/Rect.ts
CHANGED
package/types/bricks/RichText.ts
CHANGED
package/types/bricks/Rive.ts
CHANGED
package/types/bricks/Svg.ts
CHANGED
package/types/bricks/Text.ts
CHANGED
package/types/bricks/Video.ts
CHANGED
package/types/bricks/WebView.ts
CHANGED
package/types/canvas.ts
CHANGED
package/types/common.ts
CHANGED
|
@@ -7,8 +7,8 @@ export interface Brick {
|
|
|
7
7
|
__typename: 'Brick'
|
|
8
8
|
id: string
|
|
9
9
|
templateKey: string
|
|
10
|
-
title
|
|
11
|
-
description
|
|
10
|
+
title?: string
|
|
11
|
+
description?: string
|
|
12
12
|
property?: {}
|
|
13
13
|
events: {}
|
|
14
14
|
outlets?: {}
|
|
@@ -25,8 +25,8 @@ export interface Generator {
|
|
|
25
25
|
__typename: 'Generator'
|
|
26
26
|
id: string
|
|
27
27
|
templateKey: string
|
|
28
|
-
title
|
|
29
|
-
description
|
|
28
|
+
title?: string
|
|
29
|
+
description?: string
|
|
30
30
|
localSyncRunMode?: LocalSyncStrategy
|
|
31
31
|
property?: {}
|
|
32
32
|
events: {}
|
|
@@ -185,7 +185,7 @@ Default property:
|
|
|
185
185
|
export type GeneratorBlePeripheral = Generator &
|
|
186
186
|
GeneratorBlePeripheralDef & {
|
|
187
187
|
templateKey: 'GENERATOR_BLE_PERIPHERAL'
|
|
188
|
-
switches
|
|
188
|
+
switches?: Array<
|
|
189
189
|
SwitchDef &
|
|
190
190
|
GeneratorBlePeripheralDef & {
|
|
191
191
|
conds?: Array<{
|