@loom-framework/core 0.1.0-alpha.154 → 0.1.0-alpha.156

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 (34) hide show
  1. package/builtin-skills/app-skill/references/process-builder.md +229 -1
  2. package/builtin-skills/app-skill/references/process.md +76 -4
  3. package/dist/backend/ai/engine.d.ts.map +1 -1
  4. package/dist/backend/ai/engine.js +3 -0
  5. package/dist/backend/ai/engine.js.map +1 -1
  6. package/dist/backend/index.d.ts.map +1 -1
  7. package/dist/backend/index.js +1 -0
  8. package/dist/backend/index.js.map +1 -1
  9. package/dist/backend/process/engine.d.ts +18 -0
  10. package/dist/backend/process/engine.d.ts.map +1 -1
  11. package/dist/backend/process/engine.js +76 -0
  12. package/dist/backend/process/engine.js.map +1 -1
  13. package/dist/backend/process/metrics-store.d.ts +30 -0
  14. package/dist/backend/process/metrics-store.d.ts.map +1 -0
  15. package/dist/backend/process/metrics-store.js +106 -0
  16. package/dist/backend/process/metrics-store.js.map +1 -0
  17. package/dist/backend/process/queue.d.ts +2 -0
  18. package/dist/backend/process/queue.d.ts.map +1 -1
  19. package/dist/backend/process/queue.js +14 -0
  20. package/dist/backend/process/queue.js.map +1 -1
  21. package/dist/backend/routes/process-routes.d.ts.map +1 -1
  22. package/dist/backend/routes/process-routes.js +67 -1
  23. package/dist/backend/routes/process-routes.js.map +1 -1
  24. package/dist/cli/commands/process.d.ts.map +1 -1
  25. package/dist/cli/commands/process.js +88 -0
  26. package/dist/cli/commands/process.js.map +1 -1
  27. package/dist/cli/templates/process-management-page.d.ts.map +1 -1
  28. package/dist/cli/templates/process-management-page.js +182 -104
  29. package/dist/cli/templates/process-management-page.js.map +1 -1
  30. package/dist/types/ai.d.ts +6 -0
  31. package/dist/types/ai.d.ts.map +1 -1
  32. package/dist/types/process.d.ts +43 -1
  33. package/dist/types/process.d.ts.map +1 -1
  34. package/package.json +1 -1
@@ -5,7 +5,7 @@
5
5
  * theme tokens, showLine/blockNode tree, i18n, Card wrapper.
6
6
  */
7
7
  export function processManagementPageTemplate() {
8
- return `import React, { useState, useEffect, useCallback, useMemo, useContext } from 'react';
8
+ return `import React, { useState, useEffect, useCallback, useMemo, useContext, useRef } from 'react';
9
9
  import {
10
10
  Card,
11
11
  Tree,
@@ -51,13 +51,15 @@ import {
51
51
  SkillFileViewer,
52
52
  fetchProcesses, fetchProcess,
53
53
  fetchProcessLogs, fetchProcessMetrics, fetchProcessMetricsConfig,
54
+ fetchProcessMetricsSnapshots, fetchProcessMetricsViewConfig,
54
55
  fetchProcessFiles, fetchProcessFileContent,
55
56
  runProcess, pauseProcess, resumeProcess, deleteProcess,
56
57
  getFileIcon,
57
58
  AIContext,
58
59
  } from '@loom-framework/frontend-antd';
59
60
  import type {
60
- ProcessInfo, ProcessLogEntry, ProcessMetricsAggregate, ProcessFileInfo, FileContent,
61
+ ProcessInfo, ProcessLogEntry, ProcessMetricsAggregate, FileContent,
62
+ ProcessMetricSnapshot, ProcessMetricsViewConfig,
61
63
  } from '@loom-framework/frontend-antd';
62
64
  import { DashboardChart } from '@loom-framework/frontend-antd';
63
65
 
@@ -85,7 +87,6 @@ registerMessages('zh-CN', {
85
87
  'process.pause': '暂停',
86
88
  'process.resume': '恢复',
87
89
  'process.overview': '概览',
88
- 'process.files': '文件',
89
90
  'process.logs': '日志',
90
91
  'process.metrics': '指标',
91
92
  'process.name': '名称',
@@ -97,10 +98,10 @@ registerMessages('zh-CN', {
97
98
  'process.modeFull': '完整',
98
99
  'process.statusIdle': '空闲',
99
100
  'process.statusRunning': '运行中',
101
+ 'process.statusBusy': '繁忙',
100
102
  'process.statusPaused': '已暂停',
101
103
  'process.statusError': '错误',
102
104
  'process.noProcesses': '暂无过程',
103
- 'process.noFiles': '轻量过程没有文件',
104
105
  'process.noMetrics': '未配置指标',
105
106
  'process.noLogs': '暂无执行日志',
106
107
  'process.queue': '执行队列',
@@ -131,10 +132,6 @@ registerMessages('zh-CN', {
131
132
  'process.selectToView': '选择左侧过程或文件以查看详情',
132
133
  'process.preview': '预览',
133
134
  'process.source': '源码',
134
- 'process.view': '查看',
135
- 'process.colName': '名称',
136
- 'process.colSize': '大小',
137
- 'process.colAction': '操作',
138
135
  'process.colDate': '日期',
139
136
  'process.colTotal': '总执行',
140
137
  'process.colCompleted': '成功',
@@ -146,6 +143,12 @@ registerMessages('zh-CN', {
146
143
  'process.colResult': '结果',
147
144
  'process.colTime': '时间',
148
145
  'process.viewSession': '查看 AI 会话',
146
+ 'process.businessMetrics': '业务指标',
147
+ 'process.operationalMetrics': '运行统计',
148
+ 'process.noBusinessMetrics': '暂无业务指标数据',
149
+ 'process.metricValue': '指标值',
150
+ 'process.metricTarget': '目标',
151
+ 'process.metricTrend': '趋势',
149
152
  });
150
153
 
151
154
  registerMessages('en-US', {
@@ -157,7 +160,6 @@ registerMessages('en-US', {
157
160
  'process.pause': 'Pause',
158
161
  'process.resume': 'Resume',
159
162
  'process.overview': 'Overview',
160
- 'process.files': 'Files',
161
163
  'process.logs': 'Logs',
162
164
  'process.metrics': 'Metrics',
163
165
  'process.name': 'Name',
@@ -169,10 +171,10 @@ registerMessages('en-US', {
169
171
  'process.modeFull': 'Full',
170
172
  'process.statusIdle': 'Idle',
171
173
  'process.statusRunning': 'Running',
174
+ 'process.statusBusy': 'Busy',
172
175
  'process.statusPaused': 'Paused',
173
176
  'process.statusError': 'Error',
174
177
  'process.noProcesses': 'No processes',
175
- 'process.noFiles': 'Lightweight process has no files',
176
178
  'process.noMetrics': 'No metrics configured',
177
179
  'process.noLogs': 'No execution logs',
178
180
  'process.queue': 'Execution Queue',
@@ -203,10 +205,6 @@ registerMessages('en-US', {
203
205
  'process.selectToView': 'Select a process or file to view details',
204
206
  'process.preview': 'Preview',
205
207
  'process.source': 'Source',
206
- 'process.view': 'View',
207
- 'process.colName': 'Name',
208
- 'process.colSize': 'Size',
209
- 'process.colAction': 'Action',
210
208
  'process.colDate': 'Date',
211
209
  'process.colTotal': 'Total',
212
210
  'process.colCompleted': 'Completed',
@@ -218,11 +216,18 @@ registerMessages('en-US', {
218
216
  'process.colResult': 'Result',
219
217
  'process.colTime': 'Time',
220
218
  'process.viewSession': 'View AI Session',
219
+ 'process.businessMetrics': 'Business Metrics',
220
+ 'process.operationalMetrics': 'Operational Metrics',
221
+ 'process.noBusinessMetrics': 'No business metrics data',
222
+ 'process.metricValue': 'Value',
223
+ 'process.metricTarget': 'Target',
224
+ 'process.metricTrend': 'Trend',
221
225
  });
222
226
 
223
227
  const STATUS_COLORS: Record<string, string> = {
224
228
  idle: 'default',
225
229
  running: 'processing',
230
+ busy: 'orange',
226
231
  paused: 'warning',
227
232
  error: 'error',
228
233
  };
@@ -230,6 +235,7 @@ const STATUS_COLORS: Record<string, string> = {
230
235
  const STATUS_ICONS: Record<string, React.ReactNode> = {
231
236
  idle: <ClockCircleOutlined />,
232
237
  running: <PlayCircleOutlined />,
238
+ busy: <ThunderboltOutlined />,
233
239
  paused: <PauseCircleOutlined />,
234
240
  error: <ExclamationCircleOutlined />,
235
241
  };
@@ -253,13 +259,15 @@ export default function ProcessManagementPage(): React.ReactElement {
253
259
  const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
254
260
  const [selectedProcess, setSelectedProcess] = useState<(ProcessInfo & { status?: string }) | null>(null);
255
261
  const [fileContent, setFileContent] = useState<FileContent | null>(null);
262
+ const [processMdContent, setProcessMdContent] = useState<FileContent | null>(null);
256
263
  const [loading, setLoading] = useState(false);
257
264
  const [viewMode, setViewMode] = useState<'preview' | 'source'>('preview');
258
265
  const [activeTab, setActiveTab] = useState('overview');
259
266
  const [logs, setLogs] = useState<ProcessLogEntry[]>([]);
260
267
  const [metrics, setMetrics] = useState<ProcessMetricsAggregate[]>([]);
261
268
  const [metricsConfig, setMetricsConfig] = useState<Record<string, unknown>[]>([]);
262
- const [files, setFiles] = useState<ProcessFileInfo[]>([]);
269
+ const [metricSnapshots, setMetricSnapshots] = useState<ProcessMetricSnapshot[]>([]);
270
+ const [metricsViewConfig, setMetricsViewConfig] = useState<ProcessMetricsViewConfig | null>(null);
263
271
  const [executing, setExecuting] = useState(false);
264
272
 
265
273
  const buildTreeData = useCallback((processList: ProcessInfo[]): ProcessTreeNode[] => {
@@ -319,6 +327,27 @@ export default function ProcessManagementPage(): React.ReactElement {
319
327
 
320
328
  useEffect(() => { loadProcesses(); }, [loadProcesses]);
321
329
 
330
+ // Auto-refresh every 5 seconds, pause when tab is hidden
331
+ const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);
332
+ useEffect(() => {
333
+ const poll = () => {
334
+ if (document.visibilityState === 'visible') {
335
+ loadProcesses();
336
+ }
337
+ };
338
+ pollRef.current = setInterval(poll, 5000);
339
+ const handleVisibility = () => {
340
+ if (document.visibilityState === 'visible') {
341
+ poll(); // Immediate refresh when tab becomes visible
342
+ }
343
+ };
344
+ document.addEventListener('visibilitychange', handleVisibility);
345
+ return () => {
346
+ if (pollRef.current) clearInterval(pollRef.current);
347
+ document.removeEventListener('visibilitychange', handleVisibility);
348
+ };
349
+ }, [loadProcesses]);
350
+
322
351
  const loadDirChildren = useCallback(async (processName: string, dirName: string): Promise<ProcessTreeNode[]> => {
323
352
  const data = await fetchProcessFiles(processName);
324
353
  const dirFiles = data.filter((f) => f.path.startsWith(\`\${dirName}/\`) && !f.isDirectory);
@@ -399,11 +428,19 @@ export default function ProcessManagementPage(): React.ReactElement {
399
428
  const data = await fetchProcess(name);
400
429
  setSelectedProcess(data);
401
430
  setFileContent(null);
431
+ setProcessMdContent(null);
402
432
  setLogs([]);
403
433
  setMetrics([]);
404
434
  setMetricsConfig([]);
405
- setFiles([]);
435
+ setMetricSnapshots([]);
436
+ setMetricsViewConfig(null);
406
437
  setActiveTab('overview');
438
+ if (data.hasProcessFile) {
439
+ try {
440
+ const mdContent = await fetchProcessFileContent(name, 'PROCESS.md');
441
+ setProcessMdContent({ content: mdContent, path: 'PROCESS.md' });
442
+ } catch { /* ignore */ }
443
+ }
407
444
  } catch {
408
445
  // error handled silently
409
446
  }
@@ -423,14 +460,12 @@ export default function ProcessManagementPage(): React.ReactElement {
423
460
  setLoading(true);
424
461
  try {
425
462
  if (node.filePath === 'PROCESS.md') {
426
- const data = await fetchProcess(node.processName);
427
- setSelectedProcess(data);
428
- setFileContent(null);
429
- setActiveTab('overview');
463
+ await selectProcess(node.processName);
430
464
  } else {
431
465
  const content = await fetchProcessFileContent(node.processName, node.filePath);
432
466
  setFileContent({ content, path: node.filePath });
433
467
  setSelectedProcess(null);
468
+ setProcessMdContent(null);
434
469
  }
435
470
  } catch {
436
471
  // error handled silently
@@ -450,12 +485,15 @@ export default function ProcessManagementPage(): React.ReactElement {
450
485
  try {
451
486
  const result = await runProcess(selectedProcess.name);
452
487
  message.success(t('process.runTriggered', { runId: result.runId }));
488
+ // Immediate refresh to show Running status
489
+ await loadProcesses();
490
+ selectProcess(selectedProcess.name);
453
491
  } catch {
454
492
  message.error(t('process.runFailed'));
455
493
  } finally {
456
494
  setExecuting(false);
457
495
  }
458
- }, [selectedProcess, t]);
496
+ }, [selectedProcess, loadProcesses, selectProcess, t]);
459
497
 
460
498
  const handlePause = useCallback(async () => {
461
499
  if (!selectedProcess) return;
@@ -505,20 +543,16 @@ export default function ProcessManagementPage(): React.ReactElement {
505
543
  const loadMetrics = useCallback(async () => {
506
544
  if (!selectedProcess) return;
507
545
  try {
508
- const [m, c] = await Promise.all([
546
+ const [m, c, snapshots, viewConfig] = await Promise.all([
509
547
  fetchProcessMetrics(selectedProcess.name),
510
548
  fetchProcessMetricsConfig(selectedProcess.name),
549
+ fetchProcessMetricsSnapshots(selectedProcess.name),
550
+ fetchProcessMetricsViewConfig(selectedProcess.name),
511
551
  ]);
512
552
  setMetrics(m);
513
553
  setMetricsConfig(c);
514
- } catch { /* ignore */ }
515
- }, [selectedProcess]);
516
-
517
- const loadFiles = useCallback(async () => {
518
- if (!selectedProcess) return;
519
- try {
520
- const data = await fetchProcessFiles(selectedProcess.name);
521
- setFiles(data);
554
+ setMetricSnapshots(snapshots);
555
+ setMetricsViewConfig(viewConfig);
522
556
  } catch { /* ignore */ }
523
557
  }, [selectedProcess]);
524
558
 
@@ -526,8 +560,7 @@ export default function ProcessManagementPage(): React.ReactElement {
526
560
  setActiveTab(key);
527
561
  if (key === 'logs') loadLogs();
528
562
  if (key === 'metrics') loadMetrics();
529
- if (key === 'files') loadFiles();
530
- }, [loadLogs, loadMetrics, loadFiles]);
563
+ }, [loadLogs, loadMetrics]);
531
564
 
532
565
  const rightTitle = useMemo(() => {
533
566
  if (selectedProcess) return \`\${selectedProcess.name}\`;
@@ -537,8 +570,8 @@ export default function ProcessManagementPage(): React.ReactElement {
537
570
 
538
571
  // Build status tag for tree node
539
572
  const getStatusColor = useCallback((proc: ProcessInfo) => {
540
- if (proc.paused) return 'warning';
541
- return 'default';
573
+ const status = proc.status ?? 'idle';
574
+ return STATUS_COLORS[status] ?? 'default';
542
575
  }, []);
543
576
 
544
577
  return (
@@ -602,9 +635,15 @@ export default function ProcessManagementPage(): React.ReactElement {
602
635
  {node.isProcess && (() => {
603
636
  const proc = processes.find(p => p.name === node.processName);
604
637
  if (!proc) return null;
638
+ const status = proc.status ?? 'idle';
639
+ const statusLabel = status === 'running' ? t('process.statusRunning')
640
+ : status === 'busy' ? t('process.statusBusy')
641
+ : status === 'paused' ? t('process.statusPaused')
642
+ : status === 'error' ? t('process.statusError')
643
+ : t('process.statusIdle');
605
644
  return (
606
- <Tag color={getStatusColor(proc)} style={{ fontSize: 11, lineHeight: '16px', padding: '0 4px', marginRight: 0 }}>
607
- {proc.paused ? t('process.statusPaused') : t('process.statusIdle')}
645
+ <Tag color={STATUS_COLORS[status]} icon={STATUS_ICONS[status]} style={{ fontSize: 11, lineHeight: '16px', padding: '0 4px', marginRight: 0 }}>
646
+ {statusLabel}
608
647
  </Tag>
609
648
  );
610
649
  })()}
@@ -621,7 +660,7 @@ export default function ProcessManagementPage(): React.ReactElement {
621
660
  title={
622
661
  <Flex align="center" gap="small">
623
662
  <span>{rightTitle}</span>
624
- {(selectedProcess || fileContent) && !selectedProcess?.hasProcessFile && fileContent && (
663
+ {((fileContent && !selectedProcess) || (selectedProcess && processMdContent)) && (
625
664
  <Segmented
626
665
  size="small"
627
666
  options={[
@@ -648,7 +687,14 @@ export default function ProcessManagementPage(): React.ReactElement {
648
687
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
649
688
  <Space>
650
689
  <Tag color={STATUS_COLORS[selectedProcess.status ?? 'idle']} icon={STATUS_ICONS[selectedProcess.status ?? 'idle']}>
651
- {selectedProcess.paused ? t('process.statusPaused') : (selectedProcess.status === 'running' ? t('process.statusRunning') : (selectedProcess.status === 'error' ? t('process.statusError') : t('process.statusIdle')))}
690
+ {(() => {
691
+ const s = selectedProcess.status ?? 'idle';
692
+ return s === 'running' ? t('process.statusRunning')
693
+ : s === 'busy' ? t('process.statusBusy')
694
+ : s === 'paused' ? t('process.statusPaused')
695
+ : s === 'error' ? t('process.statusError')
696
+ : t('process.statusIdle');
697
+ })()}
652
698
  </Tag>
653
699
  <Tag>{selectedProcess.hasProcessFile ? t('process.modeFull') : t('process.modeLightweight')}</Tag>
654
700
  </Space>
@@ -678,51 +724,21 @@ export default function ProcessManagementPage(): React.ReactElement {
678
724
  ...(selectedProcess.prompt ? [{ key: 'prompt', label: t('process.prompt'), children: <Text code style={{ whiteSpace: 'pre-wrap', fontSize: 12, maxWidth: 400, display: 'inline-block' }}>{selectedProcess.prompt}</Text> }] : []),
679
725
  ]}
680
726
  />
727
+
728
+ {selectedProcess.hasProcessFile && processMdContent && (
729
+ <SkillFileViewer
730
+ skillDetail={null}
731
+ fileContent={processMdContent}
732
+ viewMode={viewMode}
733
+ onViewModeChange={setViewMode}
734
+ mode={mode}
735
+ token={token}
736
+ t={t}
737
+ />
738
+ )}
681
739
  </Space>
682
740
  ),
683
741
  },
684
- ...(selectedProcess.hasProcessFile ? [{
685
- key: 'files',
686
- label: t('process.files'),
687
- children: fileContent ? (
688
- <SkillFileViewer
689
- skillDetail={null}
690
- fileContent={fileContent}
691
- viewMode={viewMode}
692
- onViewModeChange={setViewMode}
693
- mode={mode}
694
- token={token}
695
- t={t}
696
- />
697
- ) : (
698
- <Table
699
- dataSource={files}
700
- rowKey="path"
701
- size="small"
702
- pagination={false}
703
- columns={[
704
- { title: t('process.colName'), dataIndex: 'name', key: 'name' },
705
- { title: t('process.colSize'), dataIndex: 'size', key: 'size', render: (s: number) => s > 0 ? \`\${(s / 1024).toFixed(1)} KB\` : '-' },
706
- {
707
- title: t('process.colAction'), key: 'action', width: 80,
708
- render: (_: unknown, record: ProcessFileInfo) => !record.isDirectory && (
709
- <Button type="link" size="small" onClick={async () => {
710
- if (!selectedProcess) return;
711
- try {
712
- const c = await fetchProcessFileContent(selectedProcess.name, record.path);
713
- setFileContent({ content: c, path: record.path });
714
- } catch { /* ignore */ }
715
- }}>{t('process.view')}</Button>
716
- ),
717
- },
718
- ]}
719
- />
720
- ),
721
- }] : [{
722
- key: 'files',
723
- label: t('process.files'),
724
- children: <Empty description={t('process.noFiles')} />,
725
- }]),
726
742
  {
727
743
  key: 'logs',
728
744
  label: t('process.logs'),
@@ -764,35 +780,97 @@ export default function ProcessManagementPage(): React.ReactElement {
764
780
  </Space>
765
781
  ),
766
782
  },
767
- {
783
+ ...(selectedProcess.hasProcessFile ? [{
768
784
  key: 'metrics',
769
785
  label: t('process.metrics'),
770
- children: metricsConfig.length === 0 ? (
771
- <Empty description={t('process.noMetrics')} />
772
- ) : (
773
- <Space direction="vertical" style={{ width: '100%' }} size="middle">
774
- {metricsConfig.map((widget, i) => (
775
- <DashboardChart key={i} spec={{ ...widget, data: metrics }} />
776
- ))}
777
- {metrics.length > 0 && (
778
- <Table
779
- dataSource={metrics}
780
- rowKey="date"
781
- size="small"
782
- pagination={{ pageSize: 7 }}
783
- columns={[
784
- { title: t('process.colDate'), dataIndex: 'date', key: 'date' },
785
- { title: t('process.colTotal'), dataIndex: 'totalRuns', key: 'totalRuns' },
786
- { title: t('process.colCompleted'), dataIndex: 'completedRuns', key: 'completedRuns' },
787
- { title: t('process.colFailed'), dataIndex: 'failedRuns', key: 'failedRuns' },
788
- { title: t('process.colTimeout'), dataIndex: 'timeoutRuns', key: 'timeoutRuns' },
789
- { title: t('process.colAvgDuration'), dataIndex: 'avgDurationMs', key: 'avgDurationMs', render: (ms: number) => \`\${(ms / 1000).toFixed(1)}s\` },
790
- ]}
791
- />
786
+ children: (
787
+ <Space direction="vertical" style={{ width: '100%' }} size="large">
788
+ {/* Business Metrics — agent-reported */}
789
+ {metricsViewConfig && metricsViewConfig.metrics.length > 0 && (
790
+ <div>
791
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.businessMetrics')}</Text>
792
+ <div style={{ display: 'grid', gridTemplateColumns: \`repeat(auto-fill, minmax(200px, 1fr))\`, gap: 12, marginBottom: 16 }}>
793
+ {metricsViewConfig.metrics.map((m) => {
794
+ const latestSnapshot = [...metricSnapshots].filter(s => s.metricName === m.metricName).sort((a, b) => b.timestamp.localeCompare(a.timestamp))[0];
795
+ const trend = (() => {
796
+ const ms = metricSnapshots.filter(s => s.metricName === m.metricName).sort((a, b) => a.timestamp.localeCompare(b.timestamp));
797
+ if (ms.length < 2) return null;
798
+ const diff = ms[ms.length - 1]!.value - ms[0]!.value;
799
+ if (diff === 0) return { color: 'default', label: '→' };
800
+ const good = m.direction === 'decreasing' ? diff < 0 : m.direction === 'increasing' ? diff > 0 : true;
801
+ return { color: good ? 'success' : 'error', label: diff > 0 ? '' : '↓' };
802
+ })();
803
+ return (
804
+ <Card key={m.metricName} size="small">
805
+ <div style={{ fontSize: 12, color: token.colorTextSecondary }}>{m.title}</div>
806
+ <div style={{ fontSize: 24, fontWeight: 600, marginTop: 4 }}>
807
+ {latestSnapshot ? \`\${latestSnapshot.value}\${latestSnapshot.unit ?? m.unit ?? ''}\` : '-'}
808
+ {trend && <Tag color={trend.color} style={{ marginLeft: 6, fontSize: 12 }}>{trend.label}</Tag>}
809
+ </div>
810
+ {m.target !== undefined && <div style={{ fontSize: 11, color: token.colorTextTertiary }}>Target: {m.target}{m.unit ?? ''}</div>}
811
+ </Card>
812
+ );
813
+ })}
814
+ </div>
815
+ {metricsViewConfig.charts.length > 0 && metricSnapshots.length > 0 && (
816
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
817
+ {metricsViewConfig.charts.map((chart, i) => {
818
+ const chartMetricName = (chart as Record<string, unknown>).metricName as string | undefined;
819
+ const chartTitle = (chart as Record<string, unknown>).title as string | undefined;
820
+ const filteredSnapshots = chartMetricName
821
+ ? metricSnapshots
822
+ .filter(s => s.metricName === chartMetricName)
823
+ .sort((a, b) => a.timestamp.localeCompare(b.timestamp))
824
+ : metricSnapshots;
825
+ const { metricName: _mn, title: _t, ...chartSpec } = chart as Record<string, unknown>;
826
+ return (
827
+ <Card key={i} size="small" {...(chartTitle ? { title: chartTitle } : {})}>
828
+ <DashboardChart spec={{ ...chartSpec, data: filteredSnapshots }} />
829
+ </Card>
830
+ );
831
+ })}
832
+ </div>
833
+ )}
834
+ </div>
792
835
  )}
836
+ {!metricsViewConfig && metricSnapshots.length > 0 && (
837
+ <div>
838
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.businessMetrics')}</Text>
839
+ <Text type="secondary">{t('process.noBusinessMetrics')}</Text>
840
+ </div>
841
+ )}
842
+ {/* Operational Metrics — system aggregates */}
843
+ <div>
844
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.operationalMetrics')}</Text>
845
+ {metricsConfig.length === 0 && metrics.length === 0 ? (
846
+ <Empty description={t('process.noMetrics')} />
847
+ ) : (
848
+ <>
849
+ {metricsConfig.map((widget, i) => (
850
+ <DashboardChart key={\`op-\${i}\`} spec={{ ...widget, data: metrics }} />
851
+ ))}
852
+ {metrics.length > 0 && (
853
+ <Table
854
+ dataSource={metrics}
855
+ rowKey="date"
856
+ size="small"
857
+ pagination={{ pageSize: 7 }}
858
+ columns={[
859
+ { title: t('process.colDate'), dataIndex: 'date', key: 'date' },
860
+ { title: t('process.colTotal'), dataIndex: 'totalRuns', key: 'totalRuns' },
861
+ { title: t('process.colCompleted'), dataIndex: 'completedRuns', key: 'completedRuns' },
862
+ { title: t('process.colFailed'), dataIndex: 'failedRuns', key: 'failedRuns' },
863
+ { title: t('process.colTimeout'), dataIndex: 'timeoutRuns', key: 'timeoutRuns' },
864
+ { title: t('process.colAvgDuration'), dataIndex: 'avgDurationMs', key: 'avgDurationMs', render: (ms: number) => \`\${(ms / 1000).toFixed(1)}s\` },
865
+ ]}
866
+ />
867
+ )}
868
+ </>
869
+ )}
870
+ </div>
793
871
  </Space>
794
872
  ),
795
- },
873
+ }] : []),
796
874
  ]}
797
875
  />
798
876
  ) : fileContent ? (
@@ -1 +1 @@
1
- {"version":3,"file":"process-management-page.js","sourceRoot":"","sources":["../../../src/cli/templates/process-management-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8yBR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"process-management-page.js","sourceRoot":"","sources":["../../../src/cli/templates/process-management-page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA43BR,CAAC;AACF,CAAC"}
@@ -44,6 +44,12 @@ export interface AICallOptions {
44
44
  model?: string;
45
45
  /** JWT token for the authenticated user, passed as LOOM_TOKEN env to child process */
46
46
  userToken?: string;
47
+ /** Server URL for process agent CLI commands, passed as LOOM_SERVER env */
48
+ serverUrl?: string;
49
+ /** Process name, passed as LOOM_PROCESS_NAME env */
50
+ processName?: string;
51
+ /** Run ID, passed as LOOM_RUN_ID env */
52
+ runId?: string;
47
53
  }
48
54
  export interface AIUsage {
49
55
  inputTokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;CACvE"}
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/types/ai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;CACvE"}
@@ -46,7 +46,7 @@ export interface ProcessDefinition {
46
46
  updatedAt: string;
47
47
  }
48
48
  /** Runtime status of a process (computed, not stored) */
49
- export type ProcessStatus = 'idle' | 'running' | 'paused' | 'error';
49
+ export type ProcessStatus = 'idle' | 'running' | 'busy' | 'paused' | 'error';
50
50
  /** Queue entry for a triggered execution */
51
51
  export interface ProcessQueueEntry {
52
52
  /** Unique run ID */
@@ -103,4 +103,46 @@ export interface ProcessMetricsAggregate {
103
103
  lastRunAt: string | null;
104
104
  lastStatus: string | null;
105
105
  }
106
+ /** Agent-reported metric snapshot — one data point per metric per run */
107
+ export interface ProcessMetricSnapshot {
108
+ /** ISO timestamp when the metric was collected */
109
+ timestamp: string;
110
+ /** Human-readable metric name, e.g. "错题 review 率" */
111
+ metricName: string;
112
+ /** Numeric value */
113
+ value: number;
114
+ /** Optional dimension labels, e.g. { subject: "数学" } */
115
+ dimensions?: Record<string, string>;
116
+ /** Which execution run this snapshot belongs to */
117
+ runId: string;
118
+ /** Optional target value for goal-line display */
119
+ target?: number;
120
+ /** Optional unit label, e.g. "%", "条", "次" */
121
+ unit?: string;
122
+ }
123
+ /** View metadata for a single metric */
124
+ export interface ProcessMetricView {
125
+ metricName: string;
126
+ /** Display title */
127
+ title: string;
128
+ /** Description */
129
+ description?: string;
130
+ /** Chart type hint: line, bar, gauge, number, pie, ring, etc. */
131
+ chartType: string;
132
+ /** Goal direction: decreasing=better when lower, increasing=better when higher, target=approach target */
133
+ direction?: 'decreasing' | 'increasing' | 'target';
134
+ /** Target value */
135
+ target?: number;
136
+ /** Unit label */
137
+ unit?: string;
138
+ }
139
+ /** Agent-generated view config describing how to visualize process metrics */
140
+ export interface ProcessMetricsViewConfig {
141
+ /** Config version for format evolution */
142
+ version: 1;
143
+ /** Metric definitions */
144
+ metrics: ProcessMetricView[];
145
+ /** G2 v5 chart specs (each references metricName for data binding) */
146
+ charts: Record<string, unknown>[];
147
+ }
106
148
  //# sourceMappingURL=process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/types/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/types/process.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loom-framework/core",
3
- "version": "0.1.0-alpha.154",
3
+ "version": "0.1.0-alpha.156",
4
4
  "description": "Loom framework - DataAdapter, Capability Generator, config system, backend server, CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",