@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.
- package/builtin-skills/app-skill/references/process-builder.md +38 -0
- package/builtin-skills/app-skill/references/process.md +72 -4
- package/dist/backend/ai/engine.d.ts.map +1 -1
- package/dist/backend/ai/engine.js +3 -0
- package/dist/backend/ai/engine.js.map +1 -1
- package/dist/backend/index.d.ts.map +1 -1
- package/dist/backend/index.js +1 -0
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/process/engine.d.ts +18 -0
- package/dist/backend/process/engine.d.ts.map +1 -1
- package/dist/backend/process/engine.js +65 -0
- package/dist/backend/process/engine.js.map +1 -1
- package/dist/backend/process/metrics-store.d.ts +30 -0
- package/dist/backend/process/metrics-store.d.ts.map +1 -0
- package/dist/backend/process/metrics-store.js +106 -0
- package/dist/backend/process/metrics-store.js.map +1 -0
- package/dist/backend/process/queue.d.ts +2 -0
- package/dist/backend/process/queue.d.ts.map +1 -1
- package/dist/backend/process/queue.js +14 -0
- package/dist/backend/process/queue.js.map +1 -1
- package/dist/backend/routes/process-routes.d.ts.map +1 -1
- package/dist/backend/routes/process-routes.js +67 -1
- package/dist/backend/routes/process-routes.js.map +1 -1
- package/dist/cli/commands/process.d.ts.map +1 -1
- package/dist/cli/commands/process.js +147 -0
- package/dist/cli/commands/process.js.map +1 -1
- package/dist/cli/templates/process-management-page.d.ts.map +1 -1
- package/dist/cli/templates/process-management-page.js +143 -30
- package/dist/cli/templates/process-management-page.js.map +1 -1
- package/dist/types/ai.d.ts +6 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/process.d.ts +43 -1
- package/dist/types/process.d.ts.map +1 -1
- 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
|
-
|
|
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={
|
|
607
|
-
{
|
|
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
|
-
{
|
|
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:
|
|
771
|
-
<
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
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
|
|
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"}
|
package/dist/types/ai.d.ts
CHANGED
|
@@ -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;
|
package/dist/types/ai.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/types/process.d.ts
CHANGED
|
@@ -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":"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;
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/types/process.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED