flashclaw 1.0.0

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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/config/plugins.json +23 -0
  4. package/dist/agent-runner.d.ts +103 -0
  5. package/dist/agent-runner.d.ts.map +1 -0
  6. package/dist/agent-runner.js +530 -0
  7. package/dist/agent-runner.js.map +1 -0
  8. package/dist/cli.d.ts +7 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +497 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands.d.ts +68 -0
  13. package/dist/commands.d.ts.map +1 -0
  14. package/dist/commands.js +252 -0
  15. package/dist/commands.js.map +1 -0
  16. package/dist/config-schema.d.ts +21 -0
  17. package/dist/config-schema.d.ts.map +1 -0
  18. package/dist/config-schema.js +26 -0
  19. package/dist/config-schema.js.map +1 -0
  20. package/dist/config.d.ts +11 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +36 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/core/api-client.d.ts +236 -0
  25. package/dist/core/api-client.d.ts.map +1 -0
  26. package/dist/core/api-client.js +369 -0
  27. package/dist/core/api-client.js.map +1 -0
  28. package/dist/core/memory.d.ts +291 -0
  29. package/dist/core/memory.d.ts.map +1 -0
  30. package/dist/core/memory.js +754 -0
  31. package/dist/core/memory.js.map +1 -0
  32. package/dist/core/model-capabilities.d.ts +45 -0
  33. package/dist/core/model-capabilities.d.ts.map +1 -0
  34. package/dist/core/model-capabilities.js +85 -0
  35. package/dist/core/model-capabilities.js.map +1 -0
  36. package/dist/db.d.ts +103 -0
  37. package/dist/db.d.ts.map +1 -0
  38. package/dist/db.js +380 -0
  39. package/dist/db.js.map +1 -0
  40. package/dist/errors.d.ts +22 -0
  41. package/dist/errors.d.ts.map +1 -0
  42. package/dist/errors.js +44 -0
  43. package/dist/errors.js.map +1 -0
  44. package/dist/health.d.ts +27 -0
  45. package/dist/health.d.ts.map +1 -0
  46. package/dist/health.js +55 -0
  47. package/dist/health.js.map +1 -0
  48. package/dist/index.d.ts +11 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +1181 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/logger.d.ts +9 -0
  53. package/dist/logger.d.ts.map +1 -0
  54. package/dist/logger.js +19 -0
  55. package/dist/logger.js.map +1 -0
  56. package/dist/message-queue.d.ts +69 -0
  57. package/dist/message-queue.d.ts.map +1 -0
  58. package/dist/message-queue.js +198 -0
  59. package/dist/message-queue.js.map +1 -0
  60. package/dist/metrics.d.ts +46 -0
  61. package/dist/metrics.d.ts.map +1 -0
  62. package/dist/metrics.js +101 -0
  63. package/dist/metrics.js.map +1 -0
  64. package/dist/paths.d.ts +81 -0
  65. package/dist/paths.d.ts.map +1 -0
  66. package/dist/paths.js +127 -0
  67. package/dist/paths.js.map +1 -0
  68. package/dist/plugins/index.d.ts +9 -0
  69. package/dist/plugins/index.d.ts.map +1 -0
  70. package/dist/plugins/index.js +13 -0
  71. package/dist/plugins/index.js.map +1 -0
  72. package/dist/plugins/installer.d.ts +120 -0
  73. package/dist/plugins/installer.d.ts.map +1 -0
  74. package/dist/plugins/installer.js +1008 -0
  75. package/dist/plugins/installer.js.map +1 -0
  76. package/dist/plugins/loader.d.ts +37 -0
  77. package/dist/plugins/loader.d.ts.map +1 -0
  78. package/dist/plugins/loader.js +429 -0
  79. package/dist/plugins/loader.js.map +1 -0
  80. package/dist/plugins/manager.d.ts +72 -0
  81. package/dist/plugins/manager.d.ts.map +1 -0
  82. package/dist/plugins/manager.js +187 -0
  83. package/dist/plugins/manager.js.map +1 -0
  84. package/dist/plugins/types.d.ts +101 -0
  85. package/dist/plugins/types.d.ts.map +1 -0
  86. package/dist/plugins/types.js +12 -0
  87. package/dist/plugins/types.js.map +1 -0
  88. package/dist/session-tracker.d.ts +81 -0
  89. package/dist/session-tracker.d.ts.map +1 -0
  90. package/dist/session-tracker.js +228 -0
  91. package/dist/session-tracker.js.map +1 -0
  92. package/dist/task-scheduler.d.ts +47 -0
  93. package/dist/task-scheduler.d.ts.map +1 -0
  94. package/dist/task-scheduler.js +331 -0
  95. package/dist/task-scheduler.js.map +1 -0
  96. package/dist/types.d.ts +57 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +2 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/utils/env-substitute.d.ts +63 -0
  101. package/dist/utils/env-substitute.d.ts.map +1 -0
  102. package/dist/utils/env-substitute.js +133 -0
  103. package/dist/utils/env-substitute.js.map +1 -0
  104. package/dist/utils/log-rotate.d.ts +19 -0
  105. package/dist/utils/log-rotate.d.ts.map +1 -0
  106. package/dist/utils/log-rotate.js +85 -0
  107. package/dist/utils/log-rotate.js.map +1 -0
  108. package/dist/utils/rate-limiter.d.ts +38 -0
  109. package/dist/utils/rate-limiter.d.ts.map +1 -0
  110. package/dist/utils/rate-limiter.js +79 -0
  111. package/dist/utils/rate-limiter.js.map +1 -0
  112. package/dist/utils/retry.d.ts +10 -0
  113. package/dist/utils/retry.d.ts.map +1 -0
  114. package/dist/utils/retry.js +47 -0
  115. package/dist/utils/retry.js.map +1 -0
  116. package/dist/utils.d.ts +86 -0
  117. package/dist/utils.d.ts.map +1 -0
  118. package/dist/utils.js +218 -0
  119. package/dist/utils.js.map +1 -0
  120. package/package.json +78 -0
  121. package/plugins/cancel-task/index.ts +161 -0
  122. package/plugins/cancel-task/plugin.json +9 -0
  123. package/plugins/feishu/index.ts +944 -0
  124. package/plugins/feishu/plugin.json +29 -0
  125. package/plugins/list-tasks/index.ts +150 -0
  126. package/plugins/list-tasks/plugin.json +9 -0
  127. package/plugins/memory/index.ts +190 -0
  128. package/plugins/memory/plugin.json +7 -0
  129. package/plugins/pause-task/index.ts +95 -0
  130. package/plugins/pause-task/plugin.json +8 -0
  131. package/plugins/register-group/index.ts +147 -0
  132. package/plugins/register-group/plugin.json +7 -0
  133. package/plugins/resume-task/index.ts +92 -0
  134. package/plugins/resume-task/plugin.json +8 -0
  135. package/plugins/schedule-task/index.ts +248 -0
  136. package/plugins/schedule-task/plugin.json +9 -0
  137. package/plugins/send-message/index.ts +75 -0
  138. package/plugins/send-message/plugin.json +9 -0
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "flashclaw",
3
+ "version": "1.0.0",
4
+ "description": "⚡ 闪电龙虾 - 快如闪电的 AI 助手,乐高式插件架构",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "flashclaw": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist/**/*",
13
+ "plugins/**/*",
14
+ "config/**/*"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "start": "node dist/cli.js start",
19
+ "dev": "tsx src/index.ts",
20
+ "cli": "tsx src/cli.ts",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "test:watch": "vitest",
24
+ "prepublishOnly": "npm run build",
25
+ "postinstall": "node scripts/postinstall.js"
26
+ },
27
+ "keywords": [
28
+ "ai",
29
+ "assistant",
30
+ "chatbot",
31
+ "feishu",
32
+ "claude",
33
+ "anthropic",
34
+ "plugin",
35
+ "flashclaw",
36
+ "bot"
37
+ ],
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/GuLu9527/flashclaw.git"
41
+ },
42
+ "homepage": "https://github.com/GuLu9527/flashclaw#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/GuLu9527/flashclaw/issues"
45
+ },
46
+ "author": "GuLu9527",
47
+ "license": "MIT",
48
+ "engines": {
49
+ "node": ">=20"
50
+ },
51
+ "dependencies": {
52
+ "@anthropic-ai/sdk": "^0.72.1",
53
+ "@larksuiteoapi/node-sdk": "^1.58.0",
54
+ "better-sqlite3": "^11.8.1",
55
+ "chalk": "^5.6.2",
56
+ "cheerio": "^1.2.0",
57
+ "commander": "^14.0.3",
58
+ "cron-parser": "^5.5.0",
59
+ "dotenv": "^17.2.3",
60
+ "html-to-text": "^9.0.5",
61
+ "jiti": "^2.6.1",
62
+ "p-limit": "^7.2.0",
63
+ "pino": "^9.6.0",
64
+ "pino-pretty": "^13.0.0",
65
+ "playwright-core": "^1.58.1",
66
+ "turndown": "^7.2.2",
67
+ "undici": "^7.20.0",
68
+ "zod": "^4.3.6"
69
+ },
70
+ "devDependencies": {
71
+ "@types/better-sqlite3": "^7.6.12",
72
+ "@types/node": "^22.10.0",
73
+ "@types/ws": "^8.18.1",
74
+ "tsx": "^4.19.0",
75
+ "typescript": "^5.7.0",
76
+ "vitest": "^4.0.18"
77
+ }
78
+ }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * FlashClaw 插件 - 取消定时任务
3
+ * 取消或暂停定时任务
4
+ */
5
+
6
+ import { ToolPlugin, ToolContext, ToolResult } from '../../src/plugins/types.js';
7
+ import { getTaskById, updateTask, deleteTask, getTasksForGroup } from '../../src/db.js';
8
+ import { MAIN_GROUP_FOLDER } from '../../src/config.js';
9
+
10
+ /**
11
+ * 取消任务参数
12
+ */
13
+ interface CancelTaskParams {
14
+ /** 要取消的任务 ID */
15
+ taskId: string;
16
+ /** 操作类型:cancel(取消并删除)、pause(暂停)、resume(恢复) */
17
+ action?: 'cancel' | 'pause' | 'resume';
18
+ }
19
+
20
+ const plugin: ToolPlugin = {
21
+ name: 'cancel_task',
22
+ version: '1.0.0',
23
+ description: '取消、暂停或恢复定时任务',
24
+
25
+ schema: {
26
+ name: 'cancel_task',
27
+ description: '管理定时任务的状态。可以取消(永久删除)、暂停或恢复任务。',
28
+ input_schema: {
29
+ type: 'object',
30
+ properties: {
31
+ taskId: {
32
+ type: 'string',
33
+ description: '任务 ID,可以通过 list_tasks 工具获取'
34
+ },
35
+ action: {
36
+ type: 'string',
37
+ enum: ['cancel', 'pause', 'resume'],
38
+ description: '操作类型。cancel 永久删除任务,pause 暂停任务,resume 恢复已暂停的任务。默认为 cancel'
39
+ }
40
+ },
41
+ required: ['taskId']
42
+ }
43
+ },
44
+
45
+ async execute(params: unknown, context: ToolContext): Promise<ToolResult> {
46
+ const { taskId, action = 'cancel' } = params as CancelTaskParams;
47
+
48
+ // 参数验证
49
+ if (!taskId || typeof taskId !== 'string') {
50
+ return {
51
+ success: false,
52
+ error: '任务 ID 不能为空'
53
+ };
54
+ }
55
+
56
+ if (!['cancel', 'pause', 'resume'].includes(action)) {
57
+ return {
58
+ success: false,
59
+ error: '操作类型必须是 cancel、pause 或 resume'
60
+ };
61
+ }
62
+
63
+ // 查找任务
64
+ const task = getTaskById(taskId);
65
+
66
+ if (!task) {
67
+ return {
68
+ success: false,
69
+ error: `任务不存在: ${taskId}`
70
+ };
71
+ }
72
+
73
+ // 权限检查:只能操作自己群组的任务,或者 main 群组可以操作所有任务
74
+ const isMainGroup = context.groupId === MAIN_GROUP_FOLDER;
75
+ const isOwnTask = task.group_folder === context.groupId;
76
+
77
+ if (!isMainGroup && !isOwnTask) {
78
+ return {
79
+ success: false,
80
+ error: '无权操作其他群组的任务'
81
+ };
82
+ }
83
+
84
+ try {
85
+ switch (action) {
86
+ case 'cancel': {
87
+ // 永久删除任务
88
+ deleteTask(taskId);
89
+ return {
90
+ success: true,
91
+ data: {
92
+ taskId,
93
+ action: 'cancelled',
94
+ message: '任务已永久删除'
95
+ }
96
+ };
97
+ }
98
+
99
+ case 'pause': {
100
+ // 暂停任务
101
+ if (task.status === 'paused') {
102
+ return {
103
+ success: false,
104
+ error: '任务已经是暂停状态'
105
+ };
106
+ }
107
+ if (task.status === 'completed') {
108
+ return {
109
+ success: false,
110
+ error: '已完成的任务无法暂停'
111
+ };
112
+ }
113
+
114
+ updateTask(taskId, { status: 'paused' });
115
+ return {
116
+ success: true,
117
+ data: {
118
+ taskId,
119
+ action: 'paused',
120
+ message: '任务已暂停,可以使用 resume 操作恢复'
121
+ }
122
+ };
123
+ }
124
+
125
+ case 'resume': {
126
+ // 恢复任务
127
+ if (task.status !== 'paused') {
128
+ return {
129
+ success: false,
130
+ error: '只能恢复已暂停的任务'
131
+ };
132
+ }
133
+
134
+ updateTask(taskId, { status: 'active' });
135
+ return {
136
+ success: true,
137
+ data: {
138
+ taskId,
139
+ action: 'resumed',
140
+ message: '任务已恢复,将在下一个调度时间执行',
141
+ nextRun: task.next_run
142
+ }
143
+ };
144
+ }
145
+
146
+ default:
147
+ return {
148
+ success: false,
149
+ error: `未知操作: ${action}`
150
+ };
151
+ }
152
+ } catch (error) {
153
+ return {
154
+ success: false,
155
+ error: `操作失败: ${error instanceof Error ? error.message : String(error)}`
156
+ };
157
+ }
158
+ }
159
+ };
160
+
161
+ export default plugin;
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "cancel-task",
3
+ "version": "1.0.0",
4
+ "type": "tool",
5
+ "description": "取消定时任务",
6
+ "main": "index.ts"
7
+ }
8
+
9
+