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

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 +38 -0
  2. package/builtin-skills/app-skill/references/process.md +72 -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 +65 -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 +147 -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 +143 -30
  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,6 +51,7 @@ 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,
@@ -58,6 +59,7 @@ import {
58
59
  } from '@loom-framework/frontend-antd';
59
60
  import type {
60
61
  ProcessInfo, ProcessLogEntry, ProcessMetricsAggregate, ProcessFileInfo, FileContent,
62
+ ProcessMetricSnapshot, ProcessMetricsViewConfig,
61
63
  } from '@loom-framework/frontend-antd';
62
64
  import { DashboardChart } from '@loom-framework/frontend-antd';
63
65
 
@@ -97,6 +99,7 @@ registerMessages('zh-CN', {
97
99
  'process.modeFull': '完整',
98
100
  'process.statusIdle': '空闲',
99
101
  'process.statusRunning': '运行中',
102
+ 'process.statusBusy': '繁忙',
100
103
  'process.statusPaused': '已暂停',
101
104
  'process.statusError': '错误',
102
105
  'process.noProcesses': '暂无过程',
@@ -146,6 +149,12 @@ registerMessages('zh-CN', {
146
149
  'process.colResult': '结果',
147
150
  'process.colTime': '时间',
148
151
  'process.viewSession': '查看 AI 会话',
152
+ 'process.businessMetrics': '业务指标',
153
+ 'process.operationalMetrics': '运行统计',
154
+ 'process.noBusinessMetrics': '暂无业务指标数据',
155
+ 'process.metricValue': '指标值',
156
+ 'process.metricTarget': '目标',
157
+ 'process.metricTrend': '趋势',
149
158
  });
150
159
 
151
160
  registerMessages('en-US', {
@@ -169,6 +178,7 @@ registerMessages('en-US', {
169
178
  'process.modeFull': 'Full',
170
179
  'process.statusIdle': 'Idle',
171
180
  'process.statusRunning': 'Running',
181
+ 'process.statusBusy': 'Busy',
172
182
  'process.statusPaused': 'Paused',
173
183
  'process.statusError': 'Error',
174
184
  'process.noProcesses': 'No processes',
@@ -218,11 +228,18 @@ registerMessages('en-US', {
218
228
  'process.colResult': 'Result',
219
229
  'process.colTime': 'Time',
220
230
  'process.viewSession': 'View AI Session',
231
+ 'process.businessMetrics': 'Business Metrics',
232
+ 'process.operationalMetrics': 'Operational Metrics',
233
+ 'process.noBusinessMetrics': 'No business metrics data',
234
+ 'process.metricValue': 'Value',
235
+ 'process.metricTarget': 'Target',
236
+ 'process.metricTrend': 'Trend',
221
237
  });
222
238
 
223
239
  const STATUS_COLORS: Record<string, string> = {
224
240
  idle: 'default',
225
241
  running: 'processing',
242
+ busy: 'orange',
226
243
  paused: 'warning',
227
244
  error: 'error',
228
245
  };
@@ -230,6 +247,7 @@ const STATUS_COLORS: Record<string, string> = {
230
247
  const STATUS_ICONS: Record<string, React.ReactNode> = {
231
248
  idle: <ClockCircleOutlined />,
232
249
  running: <PlayCircleOutlined />,
250
+ busy: <ThunderboltOutlined />,
233
251
  paused: <PauseCircleOutlined />,
234
252
  error: <ExclamationCircleOutlined />,
235
253
  };
@@ -259,6 +277,8 @@ export default function ProcessManagementPage(): React.ReactElement {
259
277
  const [logs, setLogs] = useState<ProcessLogEntry[]>([]);
260
278
  const [metrics, setMetrics] = useState<ProcessMetricsAggregate[]>([]);
261
279
  const [metricsConfig, setMetricsConfig] = useState<Record<string, unknown>[]>([]);
280
+ const [metricSnapshots, setMetricSnapshots] = useState<ProcessMetricSnapshot[]>([]);
281
+ const [metricsViewConfig, setMetricsViewConfig] = useState<ProcessMetricsViewConfig | null>(null);
262
282
  const [files, setFiles] = useState<ProcessFileInfo[]>([]);
263
283
  const [executing, setExecuting] = useState(false);
264
284
 
@@ -319,6 +339,27 @@ export default function ProcessManagementPage(): React.ReactElement {
319
339
 
320
340
  useEffect(() => { loadProcesses(); }, [loadProcesses]);
321
341
 
342
+ // Auto-refresh every 5 seconds, pause when tab is hidden
343
+ const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);
344
+ useEffect(() => {
345
+ const poll = () => {
346
+ if (document.visibilityState === 'visible') {
347
+ loadProcesses();
348
+ }
349
+ };
350
+ pollRef.current = setInterval(poll, 5000);
351
+ const handleVisibility = () => {
352
+ if (document.visibilityState === 'visible') {
353
+ poll(); // Immediate refresh when tab becomes visible
354
+ }
355
+ };
356
+ document.addEventListener('visibilitychange', handleVisibility);
357
+ return () => {
358
+ if (pollRef.current) clearInterval(pollRef.current);
359
+ document.removeEventListener('visibilitychange', handleVisibility);
360
+ };
361
+ }, [loadProcesses]);
362
+
322
363
  const loadDirChildren = useCallback(async (processName: string, dirName: string): Promise<ProcessTreeNode[]> => {
323
364
  const data = await fetchProcessFiles(processName);
324
365
  const dirFiles = data.filter((f) => f.path.startsWith(\`\${dirName}/\`) && !f.isDirectory);
@@ -402,6 +443,8 @@ export default function ProcessManagementPage(): React.ReactElement {
402
443
  setLogs([]);
403
444
  setMetrics([]);
404
445
  setMetricsConfig([]);
446
+ setMetricSnapshots([]);
447
+ setMetricsViewConfig(null);
405
448
  setFiles([]);
406
449
  setActiveTab('overview');
407
450
  } catch {
@@ -450,12 +493,15 @@ export default function ProcessManagementPage(): React.ReactElement {
450
493
  try {
451
494
  const result = await runProcess(selectedProcess.name);
452
495
  message.success(t('process.runTriggered', { runId: result.runId }));
496
+ // Immediate refresh to show Running status
497
+ await loadProcesses();
498
+ selectProcess(selectedProcess.name);
453
499
  } catch {
454
500
  message.error(t('process.runFailed'));
455
501
  } finally {
456
502
  setExecuting(false);
457
503
  }
458
- }, [selectedProcess, t]);
504
+ }, [selectedProcess, loadProcesses, selectProcess, t]);
459
505
 
460
506
  const handlePause = useCallback(async () => {
461
507
  if (!selectedProcess) return;
@@ -505,12 +551,16 @@ export default function ProcessManagementPage(): React.ReactElement {
505
551
  const loadMetrics = useCallback(async () => {
506
552
  if (!selectedProcess) return;
507
553
  try {
508
- const [m, c] = await Promise.all([
554
+ const [m, c, snapshots, viewConfig] = await Promise.all([
509
555
  fetchProcessMetrics(selectedProcess.name),
510
556
  fetchProcessMetricsConfig(selectedProcess.name),
557
+ fetchProcessMetricsSnapshots(selectedProcess.name),
558
+ fetchProcessMetricsViewConfig(selectedProcess.name),
511
559
  ]);
512
560
  setMetrics(m);
513
561
  setMetricsConfig(c);
562
+ setMetricSnapshots(snapshots);
563
+ setMetricsViewConfig(viewConfig);
514
564
  } catch { /* ignore */ }
515
565
  }, [selectedProcess]);
516
566
 
@@ -537,8 +587,8 @@ export default function ProcessManagementPage(): React.ReactElement {
537
587
 
538
588
  // Build status tag for tree node
539
589
  const getStatusColor = useCallback((proc: ProcessInfo) => {
540
- if (proc.paused) return 'warning';
541
- return 'default';
590
+ const status = proc.status ?? 'idle';
591
+ return STATUS_COLORS[status] ?? 'default';
542
592
  }, []);
543
593
 
544
594
  return (
@@ -602,9 +652,15 @@ export default function ProcessManagementPage(): React.ReactElement {
602
652
  {node.isProcess && (() => {
603
653
  const proc = processes.find(p => p.name === node.processName);
604
654
  if (!proc) return null;
655
+ const status = proc.status ?? 'idle';
656
+ const statusLabel = status === 'running' ? t('process.statusRunning')
657
+ : status === 'busy' ? t('process.statusBusy')
658
+ : status === 'paused' ? t('process.statusPaused')
659
+ : status === 'error' ? t('process.statusError')
660
+ : t('process.statusIdle');
605
661
  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')}
662
+ <Tag color={STATUS_COLORS[status]} icon={STATUS_ICONS[status]} style={{ fontSize: 11, lineHeight: '16px', padding: '0 4px', marginRight: 0 }}>
663
+ {statusLabel}
608
664
  </Tag>
609
665
  );
610
666
  })()}
@@ -648,7 +704,14 @@ export default function ProcessManagementPage(): React.ReactElement {
648
704
  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
649
705
  <Space>
650
706
  <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')))}
707
+ {(() => {
708
+ const s = selectedProcess.status ?? 'idle';
709
+ return s === 'running' ? t('process.statusRunning')
710
+ : s === 'busy' ? t('process.statusBusy')
711
+ : s === 'paused' ? t('process.statusPaused')
712
+ : s === 'error' ? t('process.statusError')
713
+ : t('process.statusIdle');
714
+ })()}
652
715
  </Tag>
653
716
  <Tag>{selectedProcess.hasProcessFile ? t('process.modeFull') : t('process.modeLightweight')}</Tag>
654
717
  </Space>
@@ -767,29 +830,79 @@ export default function ProcessManagementPage(): React.ReactElement {
767
830
  {
768
831
  key: 'metrics',
769
832
  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
- />
833
+ children: (
834
+ <Space direction="vertical" style={{ width: '100%' }} size="large">
835
+ {/* Business Metrics — agent-reported */}
836
+ {metricsViewConfig && metricsViewConfig.metrics.length > 0 && (
837
+ <div>
838
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.businessMetrics')}</Text>
839
+ <div style={{ display: 'grid', gridTemplateColumns: \`repeat(auto-fill, minmax(200px, 1fr))\`, gap: 12, marginBottom: 16 }}>
840
+ {metricsViewConfig.metrics.map((m) => {
841
+ const latestSnapshot = [...metricSnapshots].filter(s => s.metricName === m.metricName).sort((a, b) => b.timestamp.localeCompare(a.timestamp))[0];
842
+ const trend = (() => {
843
+ const ms = metricSnapshots.filter(s => s.metricName === m.metricName).sort((a, b) => a.timestamp.localeCompare(b.timestamp));
844
+ if (ms.length < 2) return null;
845
+ const diff = ms[ms.length - 1]!.value - ms[0]!.value;
846
+ if (diff === 0) return { color: 'default', label: '→' };
847
+ const good = m.direction === 'decreasing' ? diff < 0 : m.direction === 'increasing' ? diff > 0 : true;
848
+ return { color: good ? 'success' : 'error', label: diff > 0 ? '' : '↓' };
849
+ })();
850
+ return (
851
+ <Card key={m.metricName} size="small">
852
+ <div style={{ fontSize: 12, color: token.colorTextSecondary }}>{m.title}</div>
853
+ <div style={{ fontSize: 24, fontWeight: 600, marginTop: 4 }}>
854
+ {latestSnapshot ? \`\${latestSnapshot.value}\${latestSnapshot.unit ?? m.unit ?? ''}\` : '-'}
855
+ {trend && <Tag color={trend.color} style={{ marginLeft: 6, fontSize: 12 }}>{trend.label}</Tag>}
856
+ </div>
857
+ {m.target !== undefined && <div style={{ fontSize: 11, color: token.colorTextTertiary }}>Target: {m.target}{m.unit ?? ''}</div>}
858
+ </Card>
859
+ );
860
+ })}
861
+ </div>
862
+ {metricsViewConfig.charts.length > 0 && metricSnapshots.length > 0 && (
863
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
864
+ {metricsViewConfig.charts.map((chart, i) => (
865
+ <DashboardChart key={i} spec={{ ...chart, data: metricSnapshots }} />
866
+ ))}
867
+ </div>
868
+ )}
869
+ </div>
792
870
  )}
871
+ {!metricsViewConfig && metricSnapshots.length > 0 && (
872
+ <div>
873
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.businessMetrics')}</Text>
874
+ <Text type="secondary">{t('process.noBusinessMetrics')}</Text>
875
+ </div>
876
+ )}
877
+ {/* Operational Metrics — system aggregates */}
878
+ <div>
879
+ <Text strong style={{ fontSize: 14, marginBottom: 8, display: 'block' }}>{t('process.operationalMetrics')}</Text>
880
+ {metricsConfig.length === 0 && metrics.length === 0 ? (
881
+ <Empty description={t('process.noMetrics')} />
882
+ ) : (
883
+ <>
884
+ {metricsConfig.map((widget, i) => (
885
+ <DashboardChart key={\`op-\${i}\`} spec={{ ...widget, data: metrics }} />
886
+ ))}
887
+ {metrics.length > 0 && (
888
+ <Table
889
+ dataSource={metrics}
890
+ rowKey="date"
891
+ size="small"
892
+ pagination={{ pageSize: 7 }}
893
+ columns={[
894
+ { title: t('process.colDate'), dataIndex: 'date', key: 'date' },
895
+ { title: t('process.colTotal'), dataIndex: 'totalRuns', key: 'totalRuns' },
896
+ { title: t('process.colCompleted'), dataIndex: 'completedRuns', key: 'completedRuns' },
897
+ { title: t('process.colFailed'), dataIndex: 'failedRuns', key: 'failedRuns' },
898
+ { title: t('process.colTimeout'), dataIndex: 'timeoutRuns', key: 'timeoutRuns' },
899
+ { title: t('process.colAvgDuration'), dataIndex: 'avgDurationMs', key: 'avgDurationMs', render: (ms: number) => \`\${(ms / 1000).toFixed(1)}s\` },
900
+ ]}
901
+ />
902
+ )}
903
+ </>
904
+ )}
905
+ </div>
793
906
  </Space>
794
907
  ),
795
908
  },
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+5BR,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":"AAAA;;GAEG;AAEH,iCAAiC;AACjC,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE7D,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,+DAA+D;IAC/D,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAG1C,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yDAAyD;AAEzD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7E,4CAA4C;AAC5C,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,WAAW,EAAE,kBAAkB,CAAC;IAChC,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,oBAAoB;IACpB,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjE,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,kBAAkB,CAAC;IAChC,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd;8EAC0E;IAC1E,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,oFAAoF;AACpF,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,yEAAyE;AACzE,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,CAAC;IACnD,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACvC,0CAA0C;IAC1C,OAAO,EAAE,CAAC,CAAC;IACX,yBAAyB;IACzB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACnC"}
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.155",
4
4
  "description": "Loom framework - DataAdapter, Capability Generator, config system, backend server, CLI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",