foliko 1.0.84 → 1.0.86

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 (170) hide show
  1. package/.agent/agents/code-assistant.json +14 -0
  2. package/.agent/agents/email-assistant.json +14 -0
  3. package/.agent/agents/file-assistant.json +15 -0
  4. package/.agent/agents/system-assistant.json +15 -0
  5. package/.agent/agents/web-assistant.json +12 -0
  6. package/.agent/data/ambient/goals.json +50 -0
  7. package/.agent/data/ambient/memories.json +7 -0
  8. package/.agent/data/default.json +4156 -244
  9. package/.agent/data/plugins-state.json +162 -174
  10. package/.agent/data/scheduler/tasks.json +1 -0
  11. package/.agent/data/weixin.json +6 -0
  12. package/.agent/mcp_config.json +1 -0
  13. package/.agent/package.json +8 -0
  14. package/.agent/plugins/__pycache__/test_plugin.cpython-312.pyc +0 -0
  15. package/.agent/plugins/daytona/README.md +89 -0
  16. package/.agent/plugins/daytona/index.js +377 -0
  17. package/.agent/plugins/daytona/package.json +12 -0
  18. package/.agent/plugins/marknative/README.md +134 -0
  19. package/.agent/plugins/marknative/index.js +233 -0
  20. package/.agent/plugins/marknative/package.json +12 -0
  21. package/.agent/plugins/marknative/update-readme.js +134 -0
  22. package/.agent/plugins/system-info/index.js +387 -0
  23. package/.agent/plugins/system-info/package.json +4 -0
  24. package/.agent/plugins/system-info/test.js +40 -0
  25. package/.agent/plugins/temp-repo/LICENSE +201 -0
  26. package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/index.js +101 -3
  27. package/.agent/plugins/test_plugin.py +304 -0
  28. package/.agent/plugins.json +14 -5
  29. package/.agent/python-scripts/test_sample.py +24 -0
  30. package/.agent/skills/agent-browser/SKILL.md +311 -0
  31. package/.agent/skills/agent-browser/TEST_PLAN.md +200 -0
  32. package/.agent/skills/sysinfo/SKILL.md +38 -0
  33. package/.agent/skills/sysinfo/system-info.sh +130 -0
  34. package/.agent/skills/workflow/SKILL.md +324 -0
  35. package/.agent/workflows/email-digest.json +50 -0
  36. package/.agent/workflows/file-backup.json +21 -0
  37. package/.agent/workflows/get-ip-notify.json +32 -0
  38. package/.agent/workflows/news-aggregator.json +93 -0
  39. package/.agent/workflows/news-dashboard-v2.json +94 -0
  40. package/.agent/workflows/notification-batch.json +32 -0
  41. package/.claude/settings.local.json +171 -178
  42. package/.env.example +56 -56
  43. package/README.md +441 -441
  44. package/package.json +2 -2
  45. package/plugins/ambient-agent/EventWatcher.js +4 -4
  46. package/plugins/extension-executor-plugin.js +52 -1
  47. package/plugins/file-system-plugin.js +44 -5
  48. package/plugins/session-plugin.js +3 -3
  49. package/plugins/weixin-plugin.js +278 -29
  50. package/skills/find-skills/AGENTS.md +162 -162
  51. package/skills/find-skills/SKILL.md +133 -133
  52. package/skills/foliko-dev/SKILL.md +67 -0
  53. package/skills/python-plugin-dev/SKILL.md +238 -238
  54. package/src/core/agent-chat.js +11 -21
  55. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +0 -26
  56. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +0 -97
  57. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +0 -101
  58. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +0 -31
  59. package/.agent/.shared/ui-ux-pro-max/data/products.csv +0 -97
  60. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +0 -24
  61. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +0 -45
  62. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +0 -53
  63. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +0 -56
  64. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +0 -53
  65. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +0 -53
  66. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +0 -51
  67. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +0 -59
  68. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +0 -52
  69. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +0 -54
  70. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +0 -61
  71. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +0 -54
  72. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +0 -51
  73. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +0 -50
  74. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +0 -59
  75. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +0 -58
  76. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  77. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  78. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +0 -31
  79. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  80. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  81. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +0 -258
  82. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +0 -1067
  83. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +0 -106
  84. package/.agent/ARCHITECTURE.md +0 -288
  85. package/.agent/agents/ambient-agent.md +0 -57
  86. package/.agent/agents/debugger.md +0 -55
  87. package/.agent/agents/email-assistant.md +0 -49
  88. package/.agent/agents/file-manager.md +0 -42
  89. package/.agent/agents/python-developer.md +0 -60
  90. package/.agent/agents/scheduler.md +0 -59
  91. package/.agent/agents/web-developer.md +0 -45
  92. package/.agent/data/puppeteer-sessions/undefined.json +0 -6
  93. package/.agent/mcp_config_updated.json +0 -12
  94. package/.agent/rules/GEMINI.md +0 -273
  95. package/.agent/rules/allow-rule.md +0 -77
  96. package/.agent/rules/log-rule.md +0 -83
  97. package/.agent/rules/security-rule.md +0 -93
  98. package/.agent/scripts/auto_preview.py +0 -148
  99. package/.agent/scripts/checklist.py +0 -217
  100. package/.agent/scripts/session_manager.py +0 -120
  101. package/.agent/scripts/verify_all.py +0 -327
  102. package/.agent/skills/api-patterns/SKILL.md +0 -81
  103. package/.agent/skills/api-patterns/api-style.md +0 -42
  104. package/.agent/skills/api-patterns/auth.md +0 -24
  105. package/.agent/skills/api-patterns/documentation.md +0 -26
  106. package/.agent/skills/api-patterns/graphql.md +0 -41
  107. package/.agent/skills/api-patterns/rate-limiting.md +0 -31
  108. package/.agent/skills/api-patterns/response.md +0 -37
  109. package/.agent/skills/api-patterns/rest.md +0 -40
  110. package/.agent/skills/api-patterns/scripts/api_validator.py +0 -211
  111. package/.agent/skills/api-patterns/security-testing.md +0 -122
  112. package/.agent/skills/api-patterns/trpc.md +0 -41
  113. package/.agent/skills/api-patterns/versioning.md +0 -22
  114. package/.agent/skills/app-builder/SKILL.md +0 -75
  115. package/.agent/skills/app-builder/agent-coordination.md +0 -71
  116. package/.agent/skills/app-builder/feature-building.md +0 -53
  117. package/.agent/skills/app-builder/project-detection.md +0 -34
  118. package/.agent/skills/app-builder/scaffolding.md +0 -118
  119. package/.agent/skills/app-builder/tech-stack.md +0 -40
  120. package/.agent/skills/app-builder/templates/SKILL.md +0 -39
  121. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
  122. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
  123. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
  124. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
  125. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
  126. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
  127. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
  128. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -122
  129. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -122
  130. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -169
  131. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -134
  132. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
  133. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -119
  134. package/.agent/skills/architecture/SKILL.md +0 -55
  135. package/.agent/skills/architecture/context-discovery.md +0 -43
  136. package/.agent/skills/architecture/examples.md +0 -94
  137. package/.agent/skills/architecture/pattern-selection.md +0 -68
  138. package/.agent/skills/architecture/patterns-reference.md +0 -50
  139. package/.agent/skills/architecture/trade-off-analysis.md +0 -77
  140. package/.agent/skills/clean-code/SKILL.md +0 -201
  141. package/.agent/skills/doc.md +0 -177
  142. package/.agent/skills/frontend-design/SKILL.md +0 -418
  143. package/.agent/skills/frontend-design/animation-guide.md +0 -331
  144. package/.agent/skills/frontend-design/color-system.md +0 -311
  145. package/.agent/skills/frontend-design/decision-trees.md +0 -418
  146. package/.agent/skills/frontend-design/motion-graphics.md +0 -306
  147. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +0 -183
  148. package/.agent/skills/frontend-design/scripts/ux_audit.py +0 -722
  149. package/.agent/skills/frontend-design/typography-system.md +0 -345
  150. package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
  151. package/.agent/skills/frontend-design/visual-effects.md +0 -383
  152. package/.agent/skills/i18n-localization/SKILL.md +0 -154
  153. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +0 -241
  154. package/.agent/skills/mcp-builder/SKILL.md +0 -176
  155. package/.agent/skills/web-design-guidelines/SKILL.md +0 -57
  156. package/.agent/workflows/brainstorm.md +0 -113
  157. package/.agent/workflows/create.md +0 -59
  158. package/.agent/workflows/debug.md +0 -103
  159. package/.agent/workflows/deploy.md +0 -176
  160. package/.agent/workflows/enhance.md +0 -63
  161. package/.agent/workflows/orchestrate.md +0 -237
  162. package/.agent/workflows/plan.md +0 -89
  163. package/.agent/workflows/preview.md +0 -81
  164. package/.agent/workflows/simple-test.md +0 -42
  165. package/.agent/workflows/status.md +0 -86
  166. package/.agent/workflows/structured-orchestrate.md +0 -180
  167. package/.agent/workflows/test.md +0 -144
  168. package/.agent/workflows/ui-ux-pro-max.md +0 -296
  169. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/README.md +0 -0
  170. /package/.agent/plugins/{puppeteer-plugin → temp-repo/puppeteer-plugin}/package.json +0 -0
@@ -0,0 +1,377 @@
1
+ const { z } = require('zod');
2
+
3
+ module.exports = function (Plugin) {
4
+ return class DaytonaPlugin extends Plugin {
5
+ constructor(config = {}) {
6
+ super();
7
+ this.name = 'daytona';
8
+ this.version = '1.0.0';
9
+ this.description = 'Daytona 云开发环境管理插件';
10
+ this.priority = 10;
11
+ this.daytona = null;
12
+ this.currentSandbox = null;
13
+ this.config = {};
14
+ }
15
+
16
+ start(framework) {
17
+ this._framework = framework;
18
+ this._loadConfig();
19
+ return this;
20
+ }
21
+
22
+ _loadConfig() {
23
+ try {
24
+ const storage = this._framework.pluginManager.get('storage');
25
+ if (storage) {
26
+ const store = storage.getStore();
27
+ const entry = store.get('daytona:config');
28
+ if (entry && entry.value) {
29
+ this.config = entry.value;
30
+ if (this.config.apiKey) {
31
+ const { Daytona } = require('@daytonaio/sdk');
32
+ this.daytona = new Daytona(this.config);
33
+ }
34
+ }
35
+ }
36
+ } catch (error) {
37
+ // 配置加载失败,忽略
38
+ }
39
+ }
40
+
41
+ tools = {
42
+ daytona_configure: {
43
+ description: '配置 Daytona API 密钥和连接信息(配置会持久化保存)',
44
+ inputSchema: z.object({
45
+ apiKey: z.string().describe('Daytona API Key'),
46
+ apiUrl: z.string().optional().describe('Daytona API URL,默认为 https://app.daytona.io/api'),
47
+ target: z.string().optional().describe('目标区域,如 us, eu 等'),
48
+ organizationId: z.string().optional().describe('组织 ID(JWT 认证时需要)'),
49
+ }),
50
+ execute: async (args, framework) => {
51
+ try {
52
+ const { Daytona } = require('@daytonaio/sdk');
53
+ this.config = {
54
+ apiKey: args.apiKey,
55
+ };
56
+ if (args.apiUrl) this.config.apiUrl = args.apiUrl;
57
+ if (args.target) this.config.target = args.target;
58
+ if (args.organizationId) this.config.organizationId = args.organizationId;
59
+
60
+ this.daytona = new Daytona(this.config);
61
+
62
+ const storage = framework.pluginManager.get('storage');
63
+ if (storage) {
64
+ storage.setDirect('daytona:config', {
65
+ value: this.config,
66
+ updatedAt: new Date()
67
+ });
68
+ }
69
+
70
+ return {
71
+ success: true,
72
+ message: 'Daytona 配置已保存',
73
+ config: {
74
+ apiUrl: this.config.apiUrl || 'https://app.daytona.io/api',
75
+ target: this.config.target || 'default',
76
+ hasApiKey: true
77
+ },
78
+ };
79
+ } catch (error) {
80
+ return { success: false, error: error.message };
81
+ }
82
+ },
83
+ },
84
+
85
+ daytona_create_sandbox: {
86
+ description: '创建 Daytona 沙箱环境',
87
+ inputSchema: z.object({
88
+ language: z.string().optional().describe('编程语言:javascript, typescript, python(默认 javascript)'),
89
+ name: z.string().optional().describe('沙箱名称'),
90
+ resources: z.object({
91
+ cpu: z.number().optional().describe('CPU 核心数'),
92
+ memory: z.number().optional().describe('内存大小(GiB)'),
93
+ disk: z.number().optional().describe('磁盘大小(GiB)'),
94
+ }).optional().describe('资源配置'),
95
+ envVars: z.record(z.string()).optional().describe('环境变量'),
96
+ ephemeral: z.boolean().optional().describe('是否临时沙箱(停止后自动删除)'),
97
+ autoStopInterval: z.number().optional().describe('自动停止间隔(分钟,0 禁用)'),
98
+ }),
99
+ execute: async (args) => {
100
+ try {
101
+ if (!this.daytona) {
102
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
103
+ }
104
+ const params = {
105
+ language: args.language || 'javascript',
106
+ };
107
+ if (args.name) params.name = args.name;
108
+ if (args.resources) params.resources = args.resources;
109
+ if (args.envVars) params.envVars = args.envVars;
110
+ if (args.ephemeral !== undefined) params.ephemeral = args.ephemeral;
111
+ if (args.autoStopInterval !== undefined) params.autoStopInterval = args.autoStopInterval;
112
+ const sandbox = await this.daytona.create(params);
113
+ this.currentSandbox = sandbox;
114
+ return {
115
+ success: true,
116
+ sandbox: {
117
+ id: sandbox.id,
118
+ name: sandbox.name,
119
+ state: sandbox.state,
120
+ language: sandbox.language,
121
+ },
122
+ };
123
+ } catch (error) {
124
+ return { success: false, error: error.message };
125
+ }
126
+ },
127
+ },
128
+
129
+ daytona_get_sandbox: {
130
+ description: '获取指定沙箱信息',
131
+ inputSchema: z.object({
132
+ sandboxId: z.string().describe('沙箱 ID 或名称'),
133
+ }),
134
+ execute: async (args) => {
135
+ try {
136
+ if (!this.daytona) {
137
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
138
+ }
139
+ const sandbox = await this.daytona.get(args.sandboxId);
140
+ return {
141
+ success: true,
142
+ sandbox: {
143
+ id: sandbox.id,
144
+ name: sandbox.name,
145
+ state: sandbox.state,
146
+ language: sandbox.language,
147
+ createdAt: sandbox.createdAt,
148
+ },
149
+ };
150
+ } catch (error) {
151
+ return { success: false, error: error.message };
152
+ }
153
+ },
154
+ },
155
+
156
+ daytona_list_sandboxes: {
157
+ description: '列出所有沙箱',
158
+ inputSchema: z.object({
159
+ labels: z.record(z.string()).optional().describe('标签过滤'),
160
+ page: z.number().optional().describe('页码'),
161
+ limit: z.number().optional().describe('每页数量'),
162
+ }),
163
+ execute: async (args) => {
164
+ try {
165
+ if (!this.daytona) {
166
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
167
+ }
168
+ const result = await this.daytona.list(args.labels, args.page, args.limit);
169
+ return {
170
+ success: true,
171
+ total: result.total,
172
+ page: result.page,
173
+ sandboxes: result.items.map((s) => ({
174
+ id: s.id,
175
+ name: s.name,
176
+ state: s.state,
177
+ language: s.language,
178
+ })),
179
+ };
180
+ } catch (error) {
181
+ return { success: false, error: error.message };
182
+ }
183
+ },
184
+ },
185
+
186
+ daytona_start_sandbox: {
187
+ description: '启动沙箱',
188
+ inputSchema: z.object({
189
+ sandboxId: z.string().describe('沙箱 ID 或名称'),
190
+ timeout: z.number().optional().describe('超时时间(秒)'),
191
+ }),
192
+ execute: async (args) => {
193
+ try {
194
+ if (!this.daytona) {
195
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
196
+ }
197
+ const sandbox = await this.daytona.get(args.sandboxId);
198
+ await this.daytona.start(sandbox, args.timeout || 60);
199
+ return { success: true, message: `沙箱 ${args.sandboxId} 启动成功` };
200
+ } catch (error) {
201
+ return { success: false, error: error.message };
202
+ }
203
+ },
204
+ },
205
+
206
+ daytona_stop_sandbox: {
207
+ description: '停止沙箱',
208
+ inputSchema: z.object({
209
+ sandboxId: z.string().describe('沙箱 ID 或名称'),
210
+ }),
211
+ execute: async (args) => {
212
+ try {
213
+ if (!this.daytona) {
214
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
215
+ }
216
+ const sandbox = await this.daytona.get(args.sandboxId);
217
+ await this.daytona.stop(sandbox);
218
+ return { success: true, message: `沙箱 ${args.sandboxId} 已停止` };
219
+ } catch (error) {
220
+ return { success: false, error: error.message };
221
+ }
222
+ },
223
+ },
224
+
225
+ daytona_delete_sandbox: {
226
+ description: '删除沙箱',
227
+ inputSchema: z.object({
228
+ sandboxId: z.string().describe('沙箱 ID 或名称'),
229
+ timeout: z.number().optional().describe('超时时间(秒)'),
230
+ }),
231
+ execute: async (args) => {
232
+ try {
233
+ if (!this.daytona) {
234
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
235
+ }
236
+ const sandbox = await this.daytona.get(args.sandboxId);
237
+ await this.daytona.delete(sandbox, args.timeout || 60);
238
+ if (this.currentSandbox?.id === sandbox.id) {
239
+ this.currentSandbox = null;
240
+ }
241
+ return { success: true, message: `沙箱 ${args.sandboxId} 已删除` };
242
+ } catch (error) {
243
+ return { success: false, error: error.message };
244
+ }
245
+ },
246
+ },
247
+
248
+ daytona_execute_code: {
249
+ description: '在沙箱中执行代码',
250
+ inputSchema: z.object({
251
+ code: z.string().describe('要执行的代码'),
252
+ sandboxId: z.string().optional().describe('沙箱 ID(不填使用当前沙箱)'),
253
+ }),
254
+ execute: async (args) => {
255
+ try {
256
+ if (!this.daytona) {
257
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
258
+ }
259
+ let sandbox = this.currentSandbox;
260
+ if (args.sandboxId) {
261
+ sandbox = await this.daytona.get(args.sandboxId);
262
+ }
263
+ if (!sandbox) {
264
+ return { success: false, error: '没有活动的沙箱,请先创建或指定沙箱' };
265
+ }
266
+ const result = await sandbox.process.executeCommand(args.code);
267
+ return {
268
+ success: true,
269
+ stdout: result.result,
270
+ stderr: result.stderr,
271
+ exitCode: result.exitCode,
272
+ };
273
+ } catch (error) {
274
+ return { success: false, error: error.message };
275
+ }
276
+ },
277
+ },
278
+
279
+ daytona_write_file: {
280
+ description: '在沙箱中写入文件',
281
+ inputSchema: z.object({
282
+ path: z.string().describe('文件路径'),
283
+ content: z.string().describe('文件内容'),
284
+ sandboxId: z.string().optional().describe('沙箱 ID(不填使用当前沙箱)'),
285
+ }),
286
+ execute: async (args) => {
287
+ try {
288
+ if (!this.daytona) {
289
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
290
+ }
291
+ let sandbox = this.currentSandbox;
292
+ if (args.sandboxId) {
293
+ sandbox = await this.daytona.get(args.sandboxId);
294
+ }
295
+ if (!sandbox) {
296
+ return { success: false, error: '没有活动的沙箱,请先创建或指定沙箱' };
297
+ }
298
+ await sandbox.fs.uploadFiles([{ source: Buffer.from(args.content), destination: args.path }]);
299
+ return { success: true, message: `文件 ${args.path} 写入成功` };
300
+ } catch (error) {
301
+ return { success: false, error: error.message };
302
+ }
303
+ },
304
+ },
305
+
306
+ daytona_read_file: {
307
+ description: '在沙箱中读取文件',
308
+ inputSchema: z.object({
309
+ path: z.string().describe('文件路径'),
310
+ sandboxId: z.string().optional().describe('沙箱 ID(不填使用当前沙箱)'),
311
+ }),
312
+ execute: async (args) => {
313
+ try {
314
+ if (!this.daytona) {
315
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
316
+ }
317
+ let sandbox = this.currentSandbox;
318
+ if (args.sandboxId) {
319
+ sandbox = await this.daytona.get(args.sandboxId);
320
+ }
321
+ if (!sandbox) {
322
+ return { success: false, error: '没有活动的沙箱,请先创建或指定沙箱' };
323
+ }
324
+ const result = await sandbox.process.executeCommand(`cat "${args.path}"`);
325
+ return { success: true, path: args.path, content: result.result || '' };
326
+ } catch (error) {
327
+ return { success: false, error: error.message };
328
+ }
329
+ },
330
+ },
331
+
332
+ daytona_create_ephemeral_sandbox: {
333
+ description: '创建临时沙箱(停止后自动删除)',
334
+ inputSchema: z.object({
335
+ language: z.string().optional().describe('编程语言(默认 javascript)'),
336
+ timeout: z.number().optional().describe('创建超时时间(秒,默认 60)'),
337
+ }),
338
+ execute: async (args) => {
339
+ try {
340
+ if (!this.daytona) {
341
+ return { success: false, error: '请先调用 daytona_configure 配置 API' };
342
+ }
343
+ const params = {
344
+ language: args.language || 'javascript',
345
+ ephemeral: true,
346
+ autoStopInterval: 5,
347
+ };
348
+ const sandbox = await this.daytona.create(params, { timeout: args.timeout || 60 });
349
+ this.currentSandbox = sandbox;
350
+ return {
351
+ success: true,
352
+ message: '临时沙箱创建成功(5分钟后自动停止并删除)',
353
+ sandbox: {
354
+ id: sandbox.id,
355
+ name: sandbox.name,
356
+ state: sandbox.state,
357
+ language: sandbox.language,
358
+ },
359
+ };
360
+ } catch (error) {
361
+ return { success: false, error: error.message };
362
+ }
363
+ },
364
+ },
365
+ };
366
+
367
+ install(framework) {
368
+ return this;
369
+ }
370
+
371
+ uninstall(framework) {
372
+ if (this.currentSandbox && this.daytona) {
373
+ this.daytona.delete(this.currentSandbox).catch(() => {});
374
+ }
375
+ }
376
+ };
377
+ };
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "daytona-plugin",
3
+ "version": "1.0.0",
4
+ "description": "Daytona 云开发环境管理插件",
5
+ "main": "index.js",
6
+ "keywords": ["daytona", "sandbox", "cloud", "foliko", "plugin"],
7
+ "author": "",
8
+ "license": "Apache-2.0",
9
+ "dependencies": {
10
+ "@daytonaio/sdk": "^0.161.0"
11
+ }
12
+ }
@@ -0,0 +1,134 @@
1
+ # MarkNative Plugin
2
+
3
+ 将 Markdown 转换为 PNG/SVG 图片的 Foliko 插件。基于 [marknative](https://github.com/liyown/marknative) 项目。
4
+
5
+ ## 特性
6
+
7
+ - **原生渲染**: 不需要浏览器,使用原生 2D canvas API
8
+ - **多种格式**: 支持 PNG 和 SVG 输出
9
+ - **丰富主题**: 10 种内置主题(浅色/深色)
10
+ - **代码高亮**: 支持代码块语法高亮
11
+ - **分页支持**: 自动分页处理长文档
12
+ - **双重模式**: 支持本地运行和 Daytona 沙箱运行
13
+
14
+ ## 安装依赖
15
+
16
+ ### 方式一:本地安装
17
+ ```bash
18
+ cd .agent/plugins/marknative
19
+ npm install
20
+ ```
21
+
22
+ ### 方式二:使用 Daytona 沙箱
23
+ 确保已配置 Daytona 插件,插件将自动在沙箱中运行。
24
+
25
+ ## 工具列表
26
+
27
+ ### marknative_render
28
+ 将 Markdown 渲染为图片(Base64 编码返回)
29
+
30
+ 参数:
31
+ - `markdown`: Markdown 内容(必填)
32
+ - `format`: 输出格式 (png/svg)
33
+ - `theme`: 主题名称
34
+ - `singlePage`: 是否单页输出
35
+ - `codeTheme`: 代码高亮主题
36
+ - `useSandbox`: 是否强制使用沙箱执行
37
+
38
+ ### marknative_render_to_file
39
+ 将 Markdown 渲染为图片并保存到文件
40
+
41
+ 参数:
42
+ - `markdown`: Markdown 内容(必填)
43
+ - `outputPath`: 输出文件路径(必填)
44
+ - `format`: 输出格式
45
+ - `theme`: 主题名称
46
+ - `codeTheme`: 代码高亮主题
47
+
48
+ ### marknative_preview
49
+ 预览渲染效果(返回第一页 Base64)
50
+
51
+ 参数:
52
+ - `markdown`: Markdown 内容(必填)
53
+ - `theme`: 主题名称
54
+ - `codeTheme`: 代码高亮主题
55
+
56
+ ### marknative_get_themes
57
+ 获取所有可用主题和代码高亮主题列表
58
+
59
+ ### marknative_status
60
+ 检查插件状态
61
+
62
+ ## 可用主题
63
+
64
+ | 主题 | 描述 |
65
+ |------|------|
66
+ | default | 默认主题(浅色) |
67
+ | github | GitHub 风格 |
68
+ | solarized | Solarized 风格 |
69
+ | sepia | 复古纸张风格 |
70
+ | rose | 玫瑰粉风格 |
71
+ | dark | 深色主题 |
72
+ | nord | Nord 风格 |
73
+ | dracula | Dracula 风格 |
74
+ | ocean | 海洋风格 |
75
+ | forest | 森林风格 |
76
+
77
+ ## 代码高亮主题
78
+
79
+ 支持 Shiki 主题:`github-light`, `github-dark`, `nord`, `dracula`, `solarized-light`, `solarized-dark`, `monokai` 等。
80
+
81
+ ## 使用示例
82
+
83
+ ```javascript
84
+ // 1. 检查状态
85
+ marknative_status({})
86
+
87
+ // 2. 渲染为 Base64 图片
88
+ marknative_render({
89
+ markdown: '# Hello\n\nThis is **markdown** to image!',
90
+ format: 'png',
91
+ theme: 'github'
92
+ })
93
+
94
+ // 3. 保存为文件
95
+ marknative_render_to_file({
96
+ markdown: '# Document\n\nContent here...',
97
+ outputPath: './output.png',
98
+ theme: 'dark'
99
+ })
100
+
101
+ // 4. 预览
102
+ marknative_preview({
103
+ markdown: '# Preview\n\nTest content',
104
+ theme: 'nord'
105
+ })
106
+
107
+ // 5. 获取主题列表
108
+ marknative_get_themes({})
109
+ ```
110
+
111
+ ## 完整示例
112
+
113
+ ```javascript
114
+ // 渲染带有代码高亮的文档
115
+ marknative_render({
116
+ markdown: `# 示例代码
117
+
118
+ \`\`\`javascript
119
+ function hello() {
120
+ console.log('Hello, World!');
121
+ }
122
+ \`\`\`
123
+
124
+ **支持语法高亮!**
125
+ `,
126
+ format: 'png',
127
+ theme: 'dark',
128
+ codeTheme: 'github-dark'
129
+ })
130
+ ```
131
+
132
+ ## 许可证
133
+
134
+ MIT