@loom-framework/core 0.1.0-alpha.180 → 0.1.0-alpha.181

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 (105) hide show
  1. package/builtin-skills/app-skill/SKILL.md +4 -5
  2. package/builtin-skills/app-skill/references/auth.md +79 -79
  3. package/builtin-skills/app-skill/references/events.md +237 -19
  4. package/builtin-skills/app-skill/references/evolution.md +59 -59
  5. package/builtin-skills/app-skill/references/model.md +48 -48
  6. package/builtin-skills/app-skill/references/notification.md +47 -47
  7. package/builtin-skills/app-skill/references/process-builder.md +173 -197
  8. package/builtin-skills/app-skill/references/process.md +274 -163
  9. package/builtin-skills/loom/SKILL.md +17 -10
  10. package/builtin-skills/loom/references/data-model.md +19 -3
  11. package/dist/backend/auth/rbac.js +1 -1
  12. package/dist/backend/auth/rbac.js.map +1 -1
  13. package/dist/backend/events/subscription-service.d.ts +46 -0
  14. package/dist/backend/events/subscription-service.d.ts.map +1 -0
  15. package/dist/backend/events/subscription-service.js +209 -0
  16. package/dist/backend/events/subscription-service.js.map +1 -0
  17. package/dist/backend/index.d.ts +1 -0
  18. package/dist/backend/index.d.ts.map +1 -1
  19. package/dist/backend/index.js +27 -13
  20. package/dist/backend/index.js.map +1 -1
  21. package/dist/backend/lifecycle/manager.d.ts +4 -2
  22. package/dist/backend/lifecycle/manager.d.ts.map +1 -1
  23. package/dist/backend/lifecycle/manager.js +9 -3
  24. package/dist/backend/lifecycle/manager.js.map +1 -1
  25. package/dist/backend/loom-paths.d.ts +3 -1
  26. package/dist/backend/loom-paths.d.ts.map +1 -1
  27. package/dist/backend/loom-paths.js +5 -1
  28. package/dist/backend/loom-paths.js.map +1 -1
  29. package/dist/backend/process/engine.d.ts +15 -1
  30. package/dist/backend/process/engine.d.ts.map +1 -1
  31. package/dist/backend/process/engine.js +79 -23
  32. package/dist/backend/process/engine.js.map +1 -1
  33. package/dist/backend/process/registry.d.ts +44 -9
  34. package/dist/backend/process/registry.d.ts.map +1 -1
  35. package/dist/backend/process/registry.js +208 -40
  36. package/dist/backend/process/registry.js.map +1 -1
  37. package/dist/backend/process/trigger.d.ts +18 -8
  38. package/dist/backend/process/trigger.d.ts.map +1 -1
  39. package/dist/backend/process/trigger.js +86 -32
  40. package/dist/backend/process/trigger.js.map +1 -1
  41. package/dist/backend/routes/ai-config.d.ts.map +1 -1
  42. package/dist/backend/routes/ai-config.js +1 -69
  43. package/dist/backend/routes/ai-config.js.map +1 -1
  44. package/dist/backend/routes/config-writer.d.ts +94 -0
  45. package/dist/backend/routes/config-writer.d.ts.map +1 -0
  46. package/dist/backend/routes/config-writer.js +522 -0
  47. package/dist/backend/routes/config-writer.js.map +1 -0
  48. package/dist/backend/routes/event-routes.d.ts +9 -2
  49. package/dist/backend/routes/event-routes.d.ts.map +1 -1
  50. package/dist/backend/routes/event-routes.js +101 -7
  51. package/dist/backend/routes/event-routes.js.map +1 -1
  52. package/dist/backend/routes/process-routes.d.ts +3 -0
  53. package/dist/backend/routes/process-routes.d.ts.map +1 -1
  54. package/dist/backend/routes/process-routes.js +120 -49
  55. package/dist/backend/routes/process-routes.js.map +1 -1
  56. package/dist/cli/commands/event.d.ts +12 -0
  57. package/dist/cli/commands/event.d.ts.map +1 -0
  58. package/dist/cli/commands/event.js +332 -0
  59. package/dist/cli/commands/event.js.map +1 -0
  60. package/dist/cli/commands/process.d.ts.map +1 -1
  61. package/dist/cli/commands/process.js +82 -44
  62. package/dist/cli/commands/process.js.map +1 -1
  63. package/dist/cli/generators/capability-generator.d.ts.map +1 -1
  64. package/dist/cli/generators/capability-generator.js +28 -32
  65. package/dist/cli/generators/capability-generator.js.map +1 -1
  66. package/dist/cli/helpers/system-page-config.d.ts +1 -1
  67. package/dist/cli/helpers/system-page-config.d.ts.map +1 -1
  68. package/dist/cli/helpers/system-page-config.js +9 -0
  69. package/dist/cli/helpers/system-page-config.js.map +1 -1
  70. package/dist/cli/index.d.ts.map +1 -1
  71. package/dist/cli/index.js +2 -0
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/templates/event-management-page.d.ts +8 -0
  74. package/dist/cli/templates/event-management-page.d.ts.map +1 -0
  75. package/dist/cli/templates/event-management-page.js +598 -0
  76. package/dist/cli/templates/event-management-page.js.map +1 -0
  77. package/dist/cli/templates/login-page.d.ts +1 -1
  78. package/dist/cli/templates/login-page.js +1 -1
  79. package/dist/cli/templates/model-management-page.d.ts +1 -1
  80. package/dist/cli/templates/model-management-page.js +1 -1
  81. package/dist/cli/templates/notification-center-page.d.ts +1 -1
  82. package/dist/cli/templates/notification-center-page.js +1 -1
  83. package/dist/cli/templates/notification-detail-page.d.ts +1 -1
  84. package/dist/cli/templates/notification-detail-page.js +1 -1
  85. package/dist/cli/templates/process-management-page.d.ts +1 -1
  86. package/dist/cli/templates/process-management-page.js +1 -1
  87. package/dist/cli/templates/skill-management-page.d.ts +1 -1
  88. package/dist/cli/templates/skill-management-page.js +1 -1
  89. package/dist/cli/templates/user-management-page.d.ts +1 -1
  90. package/dist/cli/templates/user-management-page.js +1 -1
  91. package/dist/config.d.ts +327 -11
  92. package/dist/config.d.ts.map +1 -1
  93. package/dist/config.js +26 -7
  94. package/dist/config.js.map +1 -1
  95. package/dist/index.d.ts +1 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js.map +1 -1
  98. package/dist/types/event.d.ts +6 -0
  99. package/dist/types/event.d.ts.map +1 -1
  100. package/dist/types/index.d.ts +1 -1
  101. package/dist/types/index.d.ts.map +1 -1
  102. package/dist/types/process.d.ts +45 -7
  103. package/dist/types/process.d.ts.map +1 -1
  104. package/package.json +1 -1
  105. package/builtin-skills/app-skill/references/process-metrics.md +0 -93
@@ -0,0 +1,598 @@
1
+ /**
2
+ * Event Management page template
3
+ *
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
+ * Source: packages/frontend-antd/src/components/pages/event-management-page.tsx
6
+ */
7
+ export function eventManagementPageTemplate() {
8
+ return `/**
9
+ * EventManagementPage — Manage event subscriptions
10
+ */
11
+
12
+ import React, { useState, useEffect, useCallback } from 'react';
13
+ import {
14
+ Card,
15
+ Table,
16
+ Button,
17
+ Modal,
18
+ Form,
19
+ Input,
20
+ Select,
21
+ Tag,
22
+ Space,
23
+ Flex,
24
+ Breadcrumb,
25
+ Empty,
26
+ message,
27
+ Popconfirm,
28
+ Typography,
29
+ theme,
30
+ } from 'antd';
31
+ import {
32
+ PlusOutlined,
33
+ DeleteOutlined,
34
+ EditOutlined,
35
+ SendOutlined,
36
+ ReloadOutlined,
37
+ HomeOutlined,
38
+ } from '@ant-design/icons';
39
+ import {
40
+ import type { EventSubscription } from '@loom-framework/frontend-antd';
41
+ import { useLocale, registerMessages, useLoomTheme, useAppShell } from '@loom-framework/frontend-antd';
42
+ fetchSubscriptions,
43
+ createSubscription,
44
+ updateSubscription,
45
+ deleteSubscription,
46
+ emitTestEvent,
47
+ } from './event-api.js';
48
+
49
+ registerMessages('zh-CN', {
50
+ 'event.title': '事件管理',
51
+ 'event.description': '管理事件订阅,将事件路由到过程、Webhook、日志或通知',
52
+ 'event.create': '新建订阅',
53
+ 'event.delete': '删除',
54
+ 'event.test': '测试',
55
+ 'event.refresh': '刷新',
56
+ 'event.pattern': '事件模式',
57
+ 'event.handler': '处理器',
58
+ 'event.config': '配置',
59
+ 'event.status': '状态',
60
+ 'event.active': '活跃',
61
+ 'event.inactive': '未激活',
62
+ 'event.noSubscriptions': '暂无事件订阅',
63
+ 'event.process': '过程触发',
64
+ 'event.webhook': 'Webhook',
65
+ 'event.log': '日志',
66
+ 'event.notify': '通知',
67
+ 'event.processName': '目标过程',
68
+ 'event.filter': '过滤条件 (JSON)',
69
+ 'event.debounce': '防抖 (ms)',
70
+ 'event.webhookUrl': 'Webhook URL',
71
+ 'event.webhookMethod': 'HTTP 方法',
72
+ 'event.webhookHeaders': '请求头 (JSON)',
73
+ 'event.logLevel': '日志级别',
74
+ 'event.notifyTitle': '通知标题',
75
+ 'event.notifyDescription': '通知描述',
76
+ 'event.testEvent': '发送测试事件',
77
+ 'event.testPattern': '事件模式',
78
+ 'event.testPayload': '事件载荷 (JSON)',
79
+ 'event.createSuccess': '订阅创建成功',
80
+ 'event.updateSuccess': '订阅更新成功',
81
+ 'event.deleteSuccess': '订阅已删除',
82
+ 'event.testSuccess': '测试事件已发送',
83
+ 'event.edit': '编辑',
84
+ 'event.id': 'ID',
85
+ });
86
+
87
+ registerMessages('en-US', {
88
+ 'event.title': 'Event Management',
89
+ 'event.description': 'Manage event subscriptions, routing events to processes, webhooks, logs, or notifications',
90
+ 'event.create': 'New Subscription',
91
+ 'event.delete': 'Delete',
92
+ 'event.test': 'Test',
93
+ 'event.refresh': 'Refresh',
94
+ 'event.pattern': 'Pattern',
95
+ 'event.handler': 'Handler',
96
+ 'event.config': 'Config',
97
+ 'event.status': 'Status',
98
+ 'event.active': 'Active',
99
+ 'event.inactive': 'Inactive',
100
+ 'event.noSubscriptions': 'No event subscriptions',
101
+ 'event.process': 'Process',
102
+ 'event.webhook': 'Webhook',
103
+ 'event.log': 'Log',
104
+ 'event.notify': 'Notify',
105
+ 'event.processName': 'Target Process',
106
+ 'event.filter': 'Filter (JSON)',
107
+ 'event.debounce': 'Debounce (ms)',
108
+ 'event.webhookUrl': 'Webhook URL',
109
+ 'event.webhookMethod': 'HTTP Method',
110
+ 'event.webhookHeaders': 'Headers (JSON)',
111
+ 'event.logLevel': 'Log Level',
112
+ 'event.notifyTitle': 'Notification Title',
113
+ 'event.notifyDescription': 'Notification Description',
114
+ 'event.testEvent': 'Send Test Event',
115
+ 'event.testPattern': 'Event Pattern',
116
+ 'event.testPayload': 'Payload (JSON)',
117
+ 'event.createSuccess': 'Subscription created',
118
+ 'event.updateSuccess': 'Subscription updated',
119
+ 'event.deleteSuccess': 'Subscription deleted',
120
+ 'event.testSuccess': 'Test event sent',
121
+ 'event.edit': 'Edit',
122
+ 'event.id': 'ID',
123
+ });
124
+
125
+ const HANDLER_COLORS: Record<string, string> = {
126
+ process: 'blue',
127
+ webhook: 'purple',
128
+ log: 'default',
129
+ notify: 'green',
130
+ };
131
+
132
+ function getConfigSummary(sub: EventSubscription): React.ReactNode {
133
+ const config = sub.config as Record<string, unknown>;
134
+ switch (sub.handler) {
135
+ case 'process': {
136
+ const parts: React.ReactNode[] = [];
137
+ if (config.process) {
138
+ parts.push(<Tag key="proc" style={{ marginRight: 4 }}>{String(config.process)}</Tag>);
139
+ }
140
+ if (config.filter) parts.push(<span key="filter" style={{ marginRight: 4 }}>filter</span>);
141
+ if (config.debounceMs) parts.push(<span key="debounce">{String(config.debounceMs)}ms</span>);
142
+ return parts.length > 0 ? parts : null;
143
+ }
144
+ case 'webhook':
145
+ return <span>{String(config.url ?? '')}{config.method && config.method !== 'POST' ? \` \${config.method}\` : ''}</span>;
146
+ case 'log':
147
+ return <span>{String(config.level ?? 'info')}</span>;
148
+ case 'notify':
149
+ return config.title ? <span>{String(config.title)}</span> : null;
150
+ default:
151
+ return null;
152
+ }
153
+ }
154
+
155
+ function EventManagementPage() {
156
+ const { t } = useLocale();
157
+ const { token } = theme.useToken();
158
+ const { breadcrumbs, onNavClick } = useAppShell();
159
+ const [subscriptions, setSubscriptions] = useState<EventSubscription[]>([]);
160
+ const [loading, setLoading] = useState(false);
161
+ const [createOpen, setCreateOpen] = useState(false);
162
+ const [editOpen, setEditOpen] = useState(false);
163
+ const [editingId, setEditingId] = useState<string | null>(null);
164
+ const [testOpen, setTestOpen] = useState(false);
165
+ const [createForm] = Form.useForm();
166
+ const [editForm] = Form.useForm();
167
+ const [testForm] = Form.useForm();
168
+ const handlerType = Form.useWatch('handler', createForm);
169
+ const editHandlerType = Form.useWatch('handler', editForm);
170
+
171
+ const loadSubscriptions = useCallback(async () => {
172
+ setLoading(true);
173
+ try {
174
+ const subs = await fetchSubscriptions();
175
+ setSubscriptions(subs);
176
+ } catch (err) {
177
+ message.error(err instanceof Error ? err.message : 'Failed to load subscriptions');
178
+ } finally {
179
+ setLoading(false);
180
+ }
181
+ }, []);
182
+
183
+ useEffect(() => {
184
+ loadSubscriptions();
185
+ }, [loadSubscriptions]);
186
+
187
+ const handleCreate = async (values: Record<string, unknown>) => {
188
+ try {
189
+ const { pattern, handler, ...rest } = values;
190
+ const config: Record<string, unknown> = {};
191
+
192
+ switch (handler) {
193
+ case 'process':
194
+ config.process = rest.processName;
195
+ if (rest.filter) {
196
+ try { config.filter = JSON.parse(rest.filter as string); } catch { /* ignore */ }
197
+ }
198
+ if (rest.debounceMs) config.debounceMs = Number(rest.debounceMs);
199
+ break;
200
+ case 'webhook':
201
+ config.url = rest.webhookUrl;
202
+ if (rest.webhookMethod && rest.webhookMethod !== 'POST') config.method = rest.webhookMethod;
203
+ if (rest.webhookHeaders) {
204
+ try { config.headers = JSON.parse(rest.webhookHeaders as string); } catch { /* ignore */ }
205
+ }
206
+ break;
207
+ case 'log':
208
+ if (rest.logLevel) config.level = rest.logLevel;
209
+ break;
210
+ case 'notify':
211
+ if (rest.notifyTitle) config.title = rest.notifyTitle;
212
+ if (rest.notifyDescription) config.description = rest.notifyDescription;
213
+ break;
214
+ }
215
+
216
+ await createSubscription(pattern as string, handler as EventSubscription['handler'], config);
217
+ message.success(t('event.createSuccess'));
218
+ setCreateOpen(false);
219
+ createForm.resetFields();
220
+ loadSubscriptions();
221
+ } catch (err) {
222
+ message.error(err instanceof Error ? err.message : 'Failed to create subscription');
223
+ }
224
+ };
225
+
226
+ const handleDelete = async (id: string) => {
227
+ try {
228
+ await deleteSubscription(id);
229
+ message.success(t('event.deleteSuccess'));
230
+ loadSubscriptions();
231
+ } catch (err) {
232
+ message.error(err instanceof Error ? err.message : 'Failed to delete subscription');
233
+ }
234
+ };
235
+
236
+ const handleTest = async (values: Record<string, unknown>) => {
237
+ try {
238
+ let payload: Record<string, unknown> = {};
239
+ if (values.payload) {
240
+ try { payload = JSON.parse(values.payload as string); } catch { /* ignore */ }
241
+ }
242
+ await emitTestEvent(values.pattern as string, payload);
243
+ message.success(t('event.testSuccess'));
244
+ setTestOpen(false);
245
+ testForm.resetFields();
246
+ } catch (err) {
247
+ message.error(err instanceof Error ? err.message : 'Failed to send test event');
248
+ }
249
+ };
250
+
251
+ const handleEditClick = (record: EventSubscription) => {
252
+ setEditingId(record.id ?? null);
253
+ const config = record.config as Record<string, unknown>;
254
+ const formValues: Record<string, unknown> = {
255
+ pattern: record.pattern,
256
+ handler: record.handler,
257
+ };
258
+ switch (record.handler) {
259
+ case 'process':
260
+ formValues.processName = config.process ?? '';
261
+ if (config.filter) formValues.filter = JSON.stringify(config.filter);
262
+ if (config.debounceMs) formValues.debounceMs = config.debounceMs;
263
+ break;
264
+ case 'webhook':
265
+ formValues.webhookUrl = config.url ?? '';
266
+ if (config.method) formValues.webhookMethod = config.method;
267
+ if (config.headers) formValues.webhookHeaders = JSON.stringify(config.headers);
268
+ break;
269
+ case 'log':
270
+ if (config.level) formValues.logLevel = config.level;
271
+ break;
272
+ case 'notify':
273
+ if (config.title) formValues.notifyTitle = config.title;
274
+ if (config.description) formValues.notifyDescription = config.description;
275
+ break;
276
+ }
277
+ editForm.setFieldsValue(formValues);
278
+ setEditOpen(true);
279
+ };
280
+
281
+ const handleEdit = async (values: Record<string, unknown>) => {
282
+ if (!editingId) return;
283
+ try {
284
+ const { pattern, handler, ...rest } = values;
285
+ const config: Record<string, unknown> = {};
286
+ switch (handler) {
287
+ case 'process':
288
+ config.process = rest.processName;
289
+ if (rest.filter) { try { config.filter = JSON.parse(rest.filter as string); } catch { /* ignore */ } }
290
+ if (rest.debounceMs) config.debounceMs = Number(rest.debounceMs);
291
+ break;
292
+ case 'webhook':
293
+ config.url = rest.webhookUrl;
294
+ if (rest.webhookMethod && rest.webhookMethod !== 'POST') config.method = rest.webhookMethod;
295
+ if (rest.webhookHeaders) { try { config.headers = JSON.parse(rest.webhookHeaders as string); } catch { /* ignore */ } }
296
+ break;
297
+ case 'log':
298
+ if (rest.logLevel) config.level = rest.logLevel;
299
+ break;
300
+ case 'notify':
301
+ if (rest.notifyTitle) config.title = rest.notifyTitle;
302
+ if (rest.notifyDescription) config.description = rest.notifyDescription;
303
+ break;
304
+ }
305
+ await updateSubscription(editingId, { pattern: pattern as string, handler: handler as EventSubscription['handler'], config });
306
+ message.success(t('event.updateSuccess'));
307
+ setEditOpen(false);
308
+ editForm.resetFields();
309
+ setEditingId(null);
310
+ loadSubscriptions();
311
+ } catch (err) {
312
+ message.error(err instanceof Error ? err.message : 'Failed to update subscription');
313
+ }
314
+ };
315
+
316
+ const columns = [
317
+ {
318
+ title: t('event.id'),
319
+ dataIndex: 'id',
320
+ key: 'id',
321
+ width: 140,
322
+ render: (id: string) => (
323
+ <Typography.Text copyable={{ text: id }} style={{ fontSize: 12 }}>
324
+ {id ? id.substring(0, 12) + '...' : '?'}
325
+ </Typography.Text>
326
+ ),
327
+ },
328
+ {
329
+ title: t('event.pattern'),
330
+ dataIndex: 'pattern',
331
+ key: 'pattern',
332
+ render: (pattern: string) => <Typography.Text code>{pattern}</Typography.Text>,
333
+ },
334
+ {
335
+ title: t('event.handler'),
336
+ dataIndex: 'handler',
337
+ key: 'handler',
338
+ width: 120,
339
+ render: (handler: string) => (
340
+ <Tag color={HANDLER_COLORS[handler] ?? 'default'}>
341
+ {t(\`event.\${handler}\`)}
342
+ </Tag>
343
+ ),
344
+ },
345
+ {
346
+ title: t('event.config'),
347
+ key: 'config',
348
+ ellipsis: true,
349
+ render: (_: unknown, record: EventSubscription) => getConfigSummary(record),
350
+ },
351
+ {
352
+ title: t('event.status'),
353
+ key: 'status',
354
+ width: 80,
355
+ render: (_: unknown, record: EventSubscription) => {
356
+ if (record.handler === 'process' && record.active !== undefined) {
357
+ return record.active
358
+ ? <Tag color="success">{t('event.active')}</Tag>
359
+ : <Tag color="default">{t('event.inactive')}</Tag>;
360
+ }
361
+ return <Tag color="success">{t('event.active')}</Tag>;
362
+ },
363
+ },
364
+ {
365
+ title: '',
366
+ key: 'actions',
367
+ width: 100,
368
+ render: (_: unknown, record: EventSubscription) => (
369
+ <Space size={4}>
370
+ <Button type="text" size="small" icon={<EditOutlined />} onClick={() => handleEditClick(record)} />
371
+ <Popconfirm
372
+ title={t('event.delete')}
373
+ description={\`\${record.pattern}\`}
374
+ onConfirm={() => record.id && handleDelete(record.id)}
375
+ >
376
+ <Button type="text" size="small" danger icon={<DeleteOutlined />} />
377
+ </Popconfirm>
378
+ </Space>
379
+ ),
380
+ },
381
+ ];
382
+
383
+ return (
384
+ <div style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 0 }}>
385
+ <Flex justify="space-between" align="center" style={{ marginBottom: 12 }}>
386
+ <Breadcrumb items={[{ title: <HomeOutlined onClick={() => onNavClick?.('')} style={{ cursor: 'pointer' }} /> }, ...(breadcrumbs || []).map((b: { title: string; path?: string }) => ({ title: b.path ? <a onClick={() => onNavClick?.(b.path!)}>{b.title}</a> : b.title }))]} />
387
+ <Space>
388
+ <Button icon={<SendOutlined />} onClick={() => setTestOpen(true)}>
389
+ {t('event.test')}
390
+ </Button>
391
+ <Button type="primary" icon={<PlusOutlined />} onClick={() => setCreateOpen(true)}>
392
+ {t('event.create')}
393
+ </Button>
394
+ <Button icon={<ReloadOutlined />} onClick={loadSubscriptions} loading={loading}>
395
+ {t('event.refresh')}
396
+ </Button>
397
+ </Space>
398
+ </Flex>
399
+
400
+ <Card
401
+ size="small"
402
+ style={{ flex: 1, display: 'flex', flexDirection: 'column', minHeight: 0 }}
403
+ styles={{ body: { padding: 16, flex: 1, overflow: 'auto', minHeight: 0 } }}
404
+ >
405
+ {subscriptions.length === 0 && !loading ? (
406
+ <Empty
407
+ image={Empty.PRESENTED_IMAGE_SIMPLE}
408
+ description={t('event.noSubscriptions')}
409
+ style={{ marginTop: 120 }}
410
+ />
411
+ ) : (
412
+ <Table
413
+ dataSource={subscriptions}
414
+ columns={columns}
415
+ rowKey={(record) => record.id ?? String(Math.random())}
416
+ loading={loading}
417
+ size="middle"
418
+ pagination={false}
419
+ locale={{ emptyText: t('event.noSubscriptions') }}
420
+ />
421
+ )}
422
+ </Card>
423
+
424
+ {/* Create Subscription Modal */}
425
+ <Modal
426
+ title={t('event.create')}
427
+ open={createOpen}
428
+ onCancel={() => { setCreateOpen(false); createForm.resetFields(); }}
429
+ onOk={() => createForm.submit()}
430
+ destroyOnClose
431
+ >
432
+ <Form form={createForm} layout="vertical" onFinish={handleCreate}>
433
+ <Form.Item name="pattern" label={t('event.pattern')} rules={[{ required: true, message: 'Pattern is required' }]}>
434
+ <Input placeholder="data:created" />
435
+ </Form.Item>
436
+ <Form.Item name="handler" label={t('event.handler')} rules={[{ required: true, message: 'Handler is required' }]} initialValue="process">
437
+ <Select>
438
+ <Select.Option value="process">{t('event.process')}</Select.Option>
439
+ <Select.Option value="webhook">{t('event.webhook')}</Select.Option>
440
+ <Select.Option value="log">{t('event.log')}</Select.Option>
441
+ <Select.Option value="notify">{t('event.notify')}</Select.Option>
442
+ </Select>
443
+ </Form.Item>
444
+
445
+ {handlerType === 'process' && (
446
+ <>
447
+ <Form.Item name="processName" label={t('event.processName')} rules={[{ required: true, message: 'Process name is required' }]}>
448
+ <Input placeholder="my-process" />
449
+ </Form.Item>
450
+ <Form.Item name="filter" label={t('event.filter')}>
451
+ <Input placeholder='{"type": "critical"}' />
452
+ </Form.Item>
453
+ <Form.Item name="debounceMs" label={t('event.debounce')} initialValue={1000}>
454
+ <Input type="number" />
455
+ </Form.Item>
456
+ </>
457
+ )}
458
+
459
+ {handlerType === 'webhook' && (
460
+ <>
461
+ <Form.Item name="webhookUrl" label={t('event.webhookUrl')} rules={[{ required: true, message: 'URL is required' }]}>
462
+ <Input placeholder="https://example.com/hook" />
463
+ </Form.Item>
464
+ <Form.Item name="webhookMethod" label={t('event.webhookMethod')} initialValue="POST">
465
+ <Select>
466
+ <Select.Option value="POST">POST</Select.Option>
467
+ <Select.Option value="PUT">PUT</Select.Option>
468
+ </Select>
469
+ </Form.Item>
470
+ <Form.Item name="webhookHeaders" label={t('event.webhookHeaders')}>
471
+ <Input placeholder='{"Authorization": "Bearer ..."}' />
472
+ </Form.Item>
473
+ </>
474
+ )}
475
+
476
+ {handlerType === 'log' && (
477
+ <Form.Item name="logLevel" label={t('event.logLevel')} initialValue="info">
478
+ <Select>
479
+ <Select.Option value="info">info</Select.Option>
480
+ <Select.Option value="debug">debug</Select.Option>
481
+ <Select.Option value="warn">warn</Select.Option>
482
+ </Select>
483
+ </Form.Item>
484
+ )}
485
+
486
+ {handlerType === 'notify' && (
487
+ <>
488
+ <Form.Item name="notifyTitle" label={t('event.notifyTitle')}>
489
+ <Input placeholder="Alert" />
490
+ </Form.Item>
491
+ <Form.Item name="notifyDescription" label={t('event.notifyDescription')}>
492
+ <Input.TextArea rows={2} />
493
+ </Form.Item>
494
+ </>
495
+ )}
496
+ </Form>
497
+ </Modal>
498
+
499
+ {/* Edit Subscription Modal */}
500
+ <Modal
501
+ title={t('event.edit')}
502
+ open={editOpen}
503
+ onCancel={() => { setEditOpen(false); editForm.resetFields(); setEditingId(null); }}
504
+ onOk={() => editForm.submit()}
505
+ destroyOnClose
506
+ >
507
+ <Form form={editForm} layout="vertical" onFinish={handleEdit}>
508
+ <Form.Item name="pattern" label={t('event.pattern')} rules={[{ required: true, message: 'Pattern is required' }]}>
509
+ <Input placeholder="data:created" />
510
+ </Form.Item>
511
+ <Form.Item name="handler" label={t('event.handler')} rules={[{ required: true, message: 'Handler is required' }]}>
512
+ <Select>
513
+ <Select.Option value="process">{t('event.process')}</Select.Option>
514
+ <Select.Option value="webhook">{t('event.webhook')}</Select.Option>
515
+ <Select.Option value="log">{t('event.log')}</Select.Option>
516
+ <Select.Option value="notify">{t('event.notify')}</Select.Option>
517
+ </Select>
518
+ </Form.Item>
519
+
520
+ {editHandlerType === 'process' && (
521
+ <>
522
+ <Form.Item name="processName" label={t('event.processName')} rules={[{ required: true, message: 'Process name is required' }]}>
523
+ <Input placeholder="my-process" />
524
+ </Form.Item>
525
+ <Form.Item name="filter" label={t('event.filter')}>
526
+ <Input placeholder='{"type": "critical"}' />
527
+ </Form.Item>
528
+ <Form.Item name="debounceMs" label={t('event.debounce')} initialValue={1000}>
529
+ <Input type="number" />
530
+ </Form.Item>
531
+ </>
532
+ )}
533
+
534
+ {editHandlerType === 'webhook' && (
535
+ <>
536
+ <Form.Item name="webhookUrl" label={t('event.webhookUrl')} rules={[{ required: true, message: 'URL is required' }]}>
537
+ <Input placeholder="https://example.com/hook" />
538
+ </Form.Item>
539
+ <Form.Item name="webhookMethod" label={t('event.webhookMethod')} initialValue="POST">
540
+ <Select>
541
+ <Select.Option value="POST">POST</Select.Option>
542
+ <Select.Option value="PUT">PUT</Select.Option>
543
+ </Select>
544
+ </Form.Item>
545
+ <Form.Item name="webhookHeaders" label={t('event.webhookHeaders')}>
546
+ <Input placeholder='{"Authorization": "Bearer ..."}' />
547
+ </Form.Item>
548
+ </>
549
+ )}
550
+
551
+ {editHandlerType === 'log' && (
552
+ <Form.Item name="logLevel" label={t('event.logLevel')} initialValue="info">
553
+ <Select>
554
+ <Select.Option value="info">info</Select.Option>
555
+ <Select.Option value="debug">debug</Select.Option>
556
+ <Select.Option value="warn">warn</Select.Option>
557
+ </Select>
558
+ </Form.Item>
559
+ )}
560
+
561
+ {editHandlerType === 'notify' && (
562
+ <>
563
+ <Form.Item name="notifyTitle" label={t('event.notifyTitle')}>
564
+ <Input placeholder="Alert" />
565
+ </Form.Item>
566
+ <Form.Item name="notifyDescription" label={t('event.notifyDescription')}>
567
+ <Input.TextArea rows={2} />
568
+ </Form.Item>
569
+ </>
570
+ )}
571
+ </Form>
572
+ </Modal>
573
+
574
+ {/* Test Event Modal */}
575
+ <Modal
576
+ title={t('event.testEvent')}
577
+ open={testOpen}
578
+ onCancel={() => { setTestOpen(false); testForm.resetFields(); }}
579
+ onOk={() => testForm.submit()}
580
+ destroyOnClose
581
+ >
582
+ <Form form={testForm} layout="vertical" onFinish={handleTest}>
583
+ <Form.Item name="pattern" label={t('event.testPattern')} rules={[{ required: true, message: 'Pattern is required' }]}>
584
+ <Input placeholder="data:created" />
585
+ </Form.Item>
586
+ <Form.Item name="payload" label={t('event.testPayload')}>
587
+ <Input.TextArea rows={4} placeholder='{"key": "value"}' />
588
+ </Form.Item>
589
+ </Form>
590
+ </Modal>
591
+ </div>
592
+ );
593
+ }
594
+
595
+ export default EventManagementPage;
596
+ `;
597
+ }
598
+ //# sourceMappingURL=event-management-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-management-page.js","sourceRoot":"","sources":["../../../src/cli/templates/event-management-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4kBR,CAAC;AACF,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Login page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/auth/login-page.tsx
6
6
  */
7
7
  export declare function loginPageTemplate(): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Login page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/auth/login-page.tsx
6
6
  */
7
7
  export function loginPageTemplate() {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Model Management page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/auth/model-management-page.tsx
6
6
  */
7
7
  export declare function modelManagementPageTemplate(): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Model Management page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/auth/model-management-page.tsx
6
6
  */
7
7
  export function modelManagementPageTemplate() {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NotificationCenter page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/components/pages/NotificationCenter.tsx
6
6
  */
7
7
  export declare function notificationCenterPageTemplate(): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NotificationCenter page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/components/pages/NotificationCenter.tsx
6
6
  */
7
7
  export function notificationCenterPageTemplate() {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NotificationDetail page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/components/pages/NotificationDetail.tsx
6
6
  */
7
7
  export declare function notificationDetailPageTemplate(): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * NotificationDetail page template
3
3
  *
4
- * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.180 — DO NOT EDIT MANUALLY.
4
+ * GENERATED by scripts/generate-templates.ts — v0.1.0-alpha.181 — DO NOT EDIT MANUALLY.
5
5
  * Source: packages/frontend-antd/src/components/pages/NotificationDetail.tsx
6
6
  */
7
7
  export function notificationDetailPageTemplate() {