agent-loft 0.2.30 → 0.2.32

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 (47) hide show
  1. package/README.md +11 -1
  2. package/package.json +1 -1
  3. package/src/agents/claude/driver.ts +13 -8
  4. package/src/agents/claude/session.ts +38 -6
  5. package/src/agents/codex/session.ts +32 -5
  6. package/src/channels/feishu/bot.ts +8 -4
  7. package/src/channels/feishu/turn-stream.ts +3 -2
  8. package/src/channels/web/api.ts +8 -0
  9. package/src/channels/web/http.ts +2 -2
  10. package/src/channels/web/server.ts +21 -1
  11. package/src/channels/web/skills-api.ts +225 -0
  12. package/src/channels/web/tasks-api.ts +94 -0
  13. package/src/core/chat-mode.ts +16 -16
  14. package/src/core/command-catalog.ts +8 -1
  15. package/src/core/commands.ts +3 -0
  16. package/src/core/hub.ts +147 -19
  17. package/src/core/memory-mcp.ts +1 -1
  18. package/src/core/personal.ts +5 -1
  19. package/src/core/skill-runtime.ts +359 -0
  20. package/src/core/skills-bridge.ts +288 -0
  21. package/src/core/skills.ts +675 -0
  22. package/src/core/store.ts +2 -0
  23. package/src/core/task-prompt.ts +38 -0
  24. package/src/core/task-runner.ts +232 -0
  25. package/src/core/task-schedule.ts +250 -0
  26. package/src/core/tasks-bridge.ts +256 -0
  27. package/src/core/tasks-mcp.ts +66 -0
  28. package/src/core/tasks.ts +281 -0
  29. package/src/core/types.ts +21 -0
  30. package/src/core/zip.ts +98 -0
  31. package/src/main.ts +12 -0
  32. package/src/mcp/tasks-server.ts +327 -0
  33. package/web/css/skills.css +368 -0
  34. package/web/css/tasks.css +455 -0
  35. package/web/index.html +2 -0
  36. package/web/lib/dom.js +1 -0
  37. package/web/lib/ws.js +8 -0
  38. package/web/state.js +2 -0
  39. package/web/views/composer.js +15 -3
  40. package/web/views/conv-actions.js +15 -7
  41. package/web/views/layout.js +22 -1
  42. package/web/views/mention.js +193 -0
  43. package/web/views/messages.js +23 -2
  44. package/web/views/sidebar.js +4 -0
  45. package/web/views/skills.js +703 -0
  46. package/web/views/tasks.js +469 -0
  47. package/web/views/topbar.js +9 -3
@@ -0,0 +1,368 @@
1
+ /* ---------- 技能页(版式沿用定时任务页的 .tasks-page / .task-card) ---------- */
2
+
3
+ .skill-head-btns {
4
+ display: flex;
5
+ gap: 8px;
6
+ flex-shrink: 0;
7
+ }
8
+
9
+ .skill-tabs {
10
+ display: flex;
11
+ align-items: center;
12
+ gap: 12px;
13
+ flex-wrap: wrap;
14
+ }
15
+
16
+ .skill-tabs .seg {
17
+ display: inline-flex;
18
+ padding: 3px;
19
+ border-radius: 10px;
20
+ background: var(--bg-soft);
21
+ }
22
+
23
+ .skill-tabs .seg button {
24
+ padding: 6px 12px;
25
+ border-radius: 8px;
26
+ font-size: 13px;
27
+ color: var(--fg-soft);
28
+ white-space: nowrap;
29
+ }
30
+
31
+ .skill-tabs .seg button.on {
32
+ background: var(--bg);
33
+ color: var(--fg);
34
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
35
+ }
36
+
37
+ .skill-search {
38
+ flex: 1;
39
+ min-width: 160px;
40
+ padding: 7px 12px;
41
+ border: 1px solid var(--border);
42
+ border-radius: 10px;
43
+ background: var(--bg-input);
44
+ color: var(--fg);
45
+ font: inherit;
46
+ font-size: 13px;
47
+ }
48
+
49
+ .skill-list-box {
50
+ display: flex;
51
+ flex-direction: column;
52
+ gap: 12px;
53
+ }
54
+
55
+ .skill-card .skill-name {
56
+ font-family: var(--mono);
57
+ font-size: 15px;
58
+ }
59
+
60
+ .skill-card .btn {
61
+ padding: 5px 12px;
62
+ font-size: 13px;
63
+ border-radius: 8px;
64
+ }
65
+
66
+ .skill-warn {
67
+ color: var(--danger);
68
+ }
69
+
70
+ .skill-note {
71
+ margin: 0;
72
+ font-size: 13px;
73
+ line-height: 1.6;
74
+ color: var(--fg-soft);
75
+ }
76
+
77
+ .skill-empty {
78
+ padding: 32px 0;
79
+ text-align: center;
80
+ font-size: 13px;
81
+ color: var(--fg-faint);
82
+ }
83
+
84
+ .skills-page .badge,
85
+ .skill-detail .badge {
86
+ font-size: 11px;
87
+ padding: 1px 6px;
88
+ border-radius: 6px;
89
+ background: var(--bg-soft);
90
+ color: var(--fg-soft);
91
+ white-space: nowrap;
92
+ }
93
+
94
+ .skill-detail .badge.ok {
95
+ color: var(--ok);
96
+ }
97
+
98
+ /* 查看 */
99
+ .skill-detail {
100
+ display: flex;
101
+ flex-direction: column;
102
+ gap: 14px;
103
+ }
104
+
105
+ .skill-desc {
106
+ margin: 0;
107
+ font-size: 14px;
108
+ line-height: 1.6;
109
+ }
110
+
111
+ .skill-section h4 {
112
+ margin: 0 0 8px;
113
+ font-size: 13px;
114
+ font-weight: 600;
115
+ color: var(--fg-soft);
116
+ }
117
+
118
+ .skill-md {
119
+ padding: 12px 14px;
120
+ border: 1px solid var(--border);
121
+ border-radius: 10px;
122
+ font-size: 14px;
123
+ max-height: 50vh;
124
+ overflow: auto;
125
+ }
126
+
127
+ .skill-vars {
128
+ margin: 0 0 8px;
129
+ padding: 0;
130
+ list-style: none;
131
+ display: flex;
132
+ flex-direction: column;
133
+ gap: 6px;
134
+ font-size: 13px;
135
+ }
136
+
137
+ .skill-vars li {
138
+ display: flex;
139
+ flex-wrap: wrap;
140
+ align-items: center;
141
+ gap: 6px;
142
+ }
143
+
144
+ .skill-var-desc {
145
+ color: var(--fg-soft);
146
+ }
147
+
148
+ .skill-files {
149
+ display: flex;
150
+ flex-direction: column;
151
+ gap: 2px;
152
+ }
153
+
154
+ .skill-file {
155
+ display: flex;
156
+ justify-content: space-between;
157
+ gap: 12px;
158
+ padding: 6px 10px;
159
+ border-radius: 8px;
160
+ font-size: 13px;
161
+ text-align: left;
162
+ }
163
+
164
+ .skill-file:hover {
165
+ background: var(--bg-hover);
166
+ }
167
+
168
+ .skill-file span {
169
+ color: var(--fg-faint);
170
+ flex-shrink: 0;
171
+ }
172
+
173
+ .skill-file-preview:empty {
174
+ display: none;
175
+ }
176
+
177
+ .skill-file-name {
178
+ margin: 10px 0 6px;
179
+ font-family: var(--mono);
180
+ font-size: 12px;
181
+ color: var(--fg-soft);
182
+ }
183
+
184
+ .skill-file-preview pre,
185
+ .skill-raw {
186
+ margin: 0;
187
+ padding: 10px 12px;
188
+ border-radius: 10px;
189
+ background: var(--code-bg);
190
+ font-family: var(--mono);
191
+ font-size: 12px;
192
+ line-height: 1.5;
193
+ white-space: pre-wrap;
194
+ word-break: break-word;
195
+ max-height: 50vh;
196
+ overflow: auto;
197
+ }
198
+
199
+ /* 编辑 */
200
+ .skill-body-input {
201
+ font-family: var(--mono) !important;
202
+ font-size: 13px !important;
203
+ }
204
+
205
+ .skill-var-edit {
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: 6px;
209
+ }
210
+
211
+ .skill-var-edit:empty {
212
+ display: none;
213
+ }
214
+
215
+ .skill-var-item {
216
+ display: flex;
217
+ flex-direction: column;
218
+ gap: 4px;
219
+ }
220
+
221
+ .skill-var-hosts[hidden] {
222
+ display: none;
223
+ }
224
+
225
+ .skill-var-hosts {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: 8px;
229
+ }
230
+
231
+ .skill-var-hosts span {
232
+ flex-shrink: 0;
233
+ font-size: 13px;
234
+ color: var(--fg-soft);
235
+ }
236
+
237
+ .skill-var-hosts input {
238
+ flex: 1;
239
+ min-width: 0;
240
+ font-family: var(--mono);
241
+ font-size: 13px;
242
+ }
243
+
244
+ .skill-guard {
245
+ color: var(--ok) !important;
246
+ }
247
+
248
+ .skill-pending {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: 8px;
252
+ padding: 8px 10px;
253
+ border-radius: 8px;
254
+ border: 1px solid var(--warn-border);
255
+ background: var(--warn-bg);
256
+ font-size: 13px;
257
+ }
258
+
259
+ .skill-pending .btn {
260
+ flex-shrink: 0;
261
+ }
262
+
263
+ .skill-var-line {
264
+ display: flex;
265
+ align-items: center;
266
+ gap: 6px;
267
+ }
268
+
269
+ .skill-var-line input:not([type="checkbox"]) {
270
+ flex: 1;
271
+ min-width: 0;
272
+ }
273
+
274
+ .skill-var-line input:first-child {
275
+ font-family: var(--mono);
276
+ flex: 0 1 220px;
277
+ }
278
+
279
+ .skill-var-line label {
280
+ display: inline-flex;
281
+ align-items: center;
282
+ gap: 3px;
283
+ font-size: 13px;
284
+ white-space: nowrap;
285
+ color: var(--fg-soft);
286
+ }
287
+
288
+ .skill-var-edit + .btn,
289
+ .skill-var-row .btn,
290
+ .skill-upload-btns .btn {
291
+ align-self: flex-start;
292
+ }
293
+
294
+ .task-form .btn.ghost,
295
+ .skill-var-row .btn.ghost {
296
+ border-color: transparent;
297
+ background: var(--bg-soft);
298
+ }
299
+
300
+ .skill-var-row {
301
+ display: flex;
302
+ gap: 6px;
303
+ }
304
+
305
+ .skill-var-row input {
306
+ flex: 1;
307
+ min-width: 0;
308
+ font-family: var(--mono);
309
+ }
310
+
311
+ .skill-visibility {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 8px;
315
+ }
316
+
317
+ .skill-people {
318
+ display: flex;
319
+ flex-wrap: wrap;
320
+ gap: 6px 14px;
321
+ }
322
+
323
+ .skill-people[hidden] {
324
+ display: none;
325
+ }
326
+
327
+ .skill-person {
328
+ display: inline-flex;
329
+ align-items: center;
330
+ gap: 5px;
331
+ font-size: 14px;
332
+ }
333
+
334
+ .skill-upload-btns {
335
+ display: flex;
336
+ gap: 8px;
337
+ margin-top: 14px;
338
+ }
339
+
340
+ /* @ 补全:在弹窗里的输入框下面弹出 */
341
+ .mention-wrap {
342
+ position: relative;
343
+ }
344
+
345
+ .slash-menu.below {
346
+ top: calc(100% + 4px);
347
+ bottom: auto;
348
+ max-height: 240px;
349
+ }
350
+
351
+ @media (max-width: 640px) {
352
+ .skills-page .tasks-head {
353
+ flex-direction: column;
354
+ gap: 12px;
355
+ }
356
+
357
+ .skill-head-btns .btn {
358
+ padding: 7px 10px;
359
+ }
360
+
361
+ .skill-var-line {
362
+ flex-wrap: wrap;
363
+ }
364
+
365
+ .skill-var-line input:first-child {
366
+ flex: 1 1 100%;
367
+ }
368
+ }