agentworkshop 0.7.7 → 0.7.8

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 (128) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +1 -1
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +1 -1
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/{CQiKcuoG.js → Dc46i75T.js} +3 -3
  5. package/.output/public/_nuxt/R_Wv_Nd9.js +1 -0
  6. package/.output/public/_nuxt/builds/latest.json +1 -1
  7. package/.output/public/_nuxt/builds/meta/e5bb1803-86d9-43b3-85be-dc787dc9a978.json +1 -0
  8. package/.output/public/_nuxt/{entry.DvlXlPwx.css → entry.5qf6EqfN.css} +1 -1
  9. package/.output/public/_nuxt/workshop.3kAcLB_M.css +1 -0
  10. package/.output/server/chunks/_/nitro.mjs +2468 -2407
  11. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  12. package/.output/server/chunks/build/TownView-B5KifIaT.mjs +1 -1
  13. package/.output/server/chunks/build/_id_-C-ewLgfl.mjs +1 -1
  14. package/.output/server/chunks/build/_id_-Ct4Jhvl1.mjs +1 -1
  15. package/.output/server/chunks/build/daq-D9RA_uze.mjs +1 -1
  16. package/.output/server/chunks/build/dcw-BTM5YU-B.mjs +1 -1
  17. package/.output/server/chunks/build/useDaqStream-hwkhJHFU.mjs +1 -1
  18. package/.output/server/chunks/build/useDcwStream-Bdew_yrr.mjs +1 -1
  19. package/.output/server/chunks/build/{workshop-iCzNRifn.mjs → workshop-D5CQj2A8.mjs} +45 -39
  20. package/.output/server/chunks/build/workshop-D5CQj2A8.mjs.map +1 -0
  21. package/.output/server/chunks/routes/api/users/setup-status.get.mjs +25 -0
  22. package/.output/server/chunks/routes/api/users/setup-status.get.mjs.map +1 -0
  23. package/.output/server/chunks/routes/api/workshop/caller.mjs +1 -1
  24. package/.output/server/chunks/routes/api/workshop/channel-templates/_id/instantiate.post.mjs +1 -1
  25. package/.output/server/chunks/routes/api/workshop/channels.post.mjs +1 -1
  26. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs +3 -2
  27. package/.output/server/chunks/routes/api/workshop/daq/_id/samples.get.mjs.map +1 -1
  28. package/.output/server/chunks/routes/api/workshop/daq/index.post.mjs +1 -1
  29. package/.output/server/chunks/routes/api/workshop/daq/infra/reconnect.post.mjs +1 -1
  30. package/.output/server/chunks/routes/api/workshop/daq/infra.get.mjs +1 -1
  31. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.delete.mjs +1 -1
  32. package/.output/server/chunks/routes/api/workshop/daq/templates/_key_.patch.mjs +1 -1
  33. package/.output/server/chunks/routes/api/workshop/daq/test-driver.post.mjs +1 -1
  34. package/.output/server/chunks/routes/api/workshop/dcw/_id/bind.post.mjs +1 -1
  35. package/.output/server/chunks/routes/api/workshop/dcw/_id/param-ledger.get.mjs +1 -1
  36. package/.output/server/chunks/routes/api/workshop/dcw/_id/read.post.mjs +1 -1
  37. package/.output/server/chunks/routes/api/workshop/dcw/_id/test.post.mjs +1 -1
  38. package/.output/server/chunks/routes/api/workshop/dcw/_id/write.post.mjs +1 -1
  39. package/.output/server/chunks/routes/api/workshop/dcw/_id_.delete.mjs +1 -1
  40. package/.output/server/chunks/routes/api/workshop/dcw/_id_.patch.mjs +1 -1
  41. package/.output/server/chunks/routes/api/workshop/dcw/controller.post.mjs +1 -1
  42. package/.output/server/chunks/routes/api/workshop/dcw/index.get.mjs +1 -1
  43. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  44. package/.output/server/chunks/routes/api/workshop/dcw/index2.get.mjs +1 -1
  45. package/.output/server/chunks/routes/api/workshop/dcw/index2.post.mjs +1 -1
  46. package/.output/server/chunks/routes/api/workshop/dcw/index3.get.mjs +1 -1
  47. package/.output/server/chunks/routes/api/workshop/dcw/index4.post.mjs +1 -1
  48. package/.output/server/chunks/routes/api/workshop/dcw/journal/node/_nodeId/rollback.post.mjs +1 -1
  49. package/.output/server/chunks/routes/api/workshop/dcw/line/query.get.mjs +1 -1
  50. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/start.post.mjs +1 -1
  51. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id/stop.post.mjs +1 -1
  52. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.delete.mjs +1 -1
  53. package/.output/server/chunks/routes/api/workshop/dcw/lines/_id_.patch.mjs +1 -1
  54. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/judge.post.mjs +1 -1
  55. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/rollback.post.mjs +1 -1
  56. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id/series.get.mjs +1 -1
  57. package/.output/server/chunks/routes/api/workshop/dcw/optimizations/_id_.get.mjs +1 -1
  58. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.delete.mjs +1 -1
  59. package/.output/server/chunks/routes/api/workshop/dcw/products/_id_.patch.mjs +1 -1
  60. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/apply.post.mjs +1 -1
  61. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/mark-good.post.mjs +1 -1
  62. package/.output/server/chunks/routes/api/workshop/dcw/recipes/_id/rollback-good.post.mjs +1 -1
  63. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/close.post.mjs +1 -1
  64. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/data.get.mjs +1 -1
  65. package/.output/server/chunks/routes/api/workshop/dcw/runs/_id/rollback.post.mjs +1 -1
  66. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.delete.mjs +1 -1
  67. package/.output/server/chunks/routes/api/workshop/dcw/templates/_key_.patch.mjs +1 -1
  68. package/.output/server/chunks/routes/api/workshop/dcw/test-driver.post.mjs +1 -1
  69. package/.output/server/chunks/routes/api/workshop/device-twins/_id_.delete.mjs +1 -1
  70. package/.output/server/chunks/routes/api/workshop/harnesses/_id/providers.get.mjs +1 -1
  71. package/.output/server/chunks/routes/api/workshop/harnesses.get.mjs +1 -1
  72. package/.output/server/chunks/routes/api/workshop/hitl/pending.get.mjs +1 -1
  73. package/.output/server/chunks/routes/api/workshop/hitl/respond.post.mjs +1 -1
  74. package/.output/server/chunks/routes/api/workshop/index4.get.mjs +1 -1
  75. package/.output/server/chunks/routes/api/workshop/index4.post.mjs +1 -1
  76. package/.output/server/chunks/routes/api/workshop/index5.get.mjs +1 -1
  77. package/.output/server/chunks/routes/api/workshop/index6.post.mjs +1 -1
  78. package/.output/server/chunks/routes/api/workshop/plugins/_name/disable.post.mjs +1 -1
  79. package/.output/server/chunks/routes/api/workshop/plugins/_name/enable.post.mjs +1 -1
  80. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.delete.mjs +1 -1
  81. package/.output/server/chunks/routes/api/workshop/scene/layouts/_channelId_.put.mjs +1 -1
  82. package/.output/server/chunks/routes/api/workshop/workspaces/_id/channel-templates/_tplId_.post.mjs +1 -1
  83. package/.output/server/chunks/routes/renderer.mjs +2 -2
  84. package/.output/server/chunks/virtual/entry.mjs +10 -2
  85. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  86. package/.output/server/package.json +1 -1
  87. package/README-zh.md +27 -7
  88. package/README.md +455 -435
  89. package/app/pages/workshop/index.vue +25 -6
  90. package/config.yml +11 -1
  91. package/i18n/dicts/settings.json +4 -0
  92. package/i18n/locales/en.ts +4 -0
  93. package/i18n/locales/zh-CN.ts +4 -0
  94. package/package.json +1 -1
  95. package/scripts/_dbg-codex-handshake.ts +30 -0
  96. package/scripts/_dbg-codex-sandbox.ts +58 -0
  97. package/scripts/_dbg-codex-turn.ts +65 -0
  98. package/scripts/_dbg-interval-config.mjs +145 -0
  99. package/scripts/_dbg-setup-e2e.mjs +88 -0
  100. package/scripts/e2e-harness-provider-task.mjs +126 -0
  101. package/server/api/users/setup-status.get.ts +8 -0
  102. package/server/api/workshop/daq/[id]/samples.get.ts +4 -2
  103. package/server/data/daqs.json +97 -45
  104. package/server/data/dcw-lines.json +7 -0
  105. package/server/data/dcw-products.json +21 -0
  106. package/server/data/dcw-recipes.json +84 -0
  107. package/server/data/dcw-rollback.json +39 -6
  108. package/server/data/dcw-runs.json +81 -75
  109. package/server/data/dcw-writes.json +36 -0
  110. package/server/data/dcws.json +374 -299
  111. package/server/data/line-runs.json +6 -6
  112. package/server/plugins/security.ts +46 -50
  113. package/server/repositories/user.repository.ts +384 -414
  114. package/server/services/system-config.ts +2 -0
  115. package/server/services/user.service.ts +8 -3
  116. package/server/services/workshop/agents/adapters/line-spawn.ts +6 -3
  117. package/server/services/workshop/agents/host-tool-bridge.ts +21 -1
  118. package/server/services/workshop/agents/industrial-tools.ts +5 -3
  119. package/server/services/workshop/daq/daq-controller.ts +34 -6
  120. package/server/services/workshop/daq/daq-node.ts +3 -3
  121. package/server/services/workshop/daq/daq-runtime.ts +4 -3
  122. package/server/services/workshop/dcw/dcw-controller.ts +4 -2
  123. package/server/services/workshop/settings.ts +23 -0
  124. package/shared/config/schema.json +4 -0
  125. package/.output/public/_nuxt/C-GarxYC.js +0 -1
  126. package/.output/public/_nuxt/builds/meta/14df171d-89cb-43ec-ad6f-9df72d6da7f5.json +0 -1
  127. package/.output/public/_nuxt/workshop.B98sHiJq.css +0 -1
  128. package/.output/server/chunks/build/workshop-iCzNRifn.mjs.map +0 -1
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 多 Harness + 自定义 LLM provider 简单任务 E2E(一个 Channel,四种引擎)。
3
+ * NO_PROXY='127.0.0.1,localhost' node scripts/e2e-harness-provider-task.mjs [--base http://127.0.0.1:3001]
4
+ *
5
+ * P1 provider 目录:四引擎目录均含 glm-5.3-flash(可选)
6
+ * P2 同 Channel 四 harness worker(omp=zhipu-coding-plan / codex=cc-switch /
7
+ * opencode=zhipuai-coding-plan / dsh=ustc;模型均 glm-5.3-flash)
8
+ * P3 简单任务×4:真实 LLM 回合执行并 complete_task → 全部 COMPLETED(可用)
9
+ */
10
+ const BASE = (() => {
11
+ const i = process.argv.indexOf('--base')
12
+ return i > 0 ? process.argv[i + 1] : 'http://127.0.0.1:3001'
13
+ })()
14
+ const TAG = Date.now().toString(36)
15
+ let failures = 0
16
+ let passed = 0
17
+ const results = []
18
+ const check = (id, name, ok, detail = '') => {
19
+ console.log(` ${ok ? 'PASS' : 'FAIL'} ${id} ${name}${detail ? ` — ${detail}` : ''}`)
20
+ results.push({ id, name, ok, detail })
21
+ ok ? passed++ : failures++
22
+ }
23
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
24
+ const api = async (method, path, { body, token } = {}, attempt = 0) => {
25
+ try {
26
+ const res = await fetch(`${BASE}${path}`, {
27
+ method,
28
+ headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },
29
+ body: body !== undefined ? JSON.stringify(body) : undefined,
30
+ })
31
+ return { status: res.status, ...(await res.json().catch(() => ({}))) }
32
+ }
33
+ catch (err) {
34
+ if (attempt < 10) {
35
+ await sleep(3000)
36
+ return api(method, path, { body, token }, attempt + 1)
37
+ }
38
+ throw err
39
+ }
40
+ }
41
+
42
+ const ENGINES = [
43
+ { key: 'omp', harness: 'omp', cfg: { provider: 'zhipu-coding-plan', model: 'glm-5.3-flash' } },
44
+ { key: 'codex', harness: 'codex', cfg: { model: 'glm-5.3-flash', approvalPolicy: 'never' } },
45
+ { key: 'dsh', harness: 'dsh', cfg: { provider: 'ustc', model: 'glm-5.3-flash' } },
46
+ { key: 'opencode', harness: 'opencode', cfg: { model: 'zhipuai-coding-plan/glm-5.3-flash' } },
47
+ ]
48
+
49
+ async function main() {
50
+ console.log(`\n━━━ 多 Harness + provider 简单任务 E2E @ ${BASE} (tag=${TAG}) ━━━`)
51
+ const reg = await api('POST', '/api/users/register', { body: { email: `hp-${TAG}@test.local`, password: 'Passw0rd!123', name: `hp-${TAG}` } })
52
+ const token = reg.data?.token
53
+ if (!token) throw new Error('注册失败')
54
+ const auth = { token }
55
+
56
+ // ── P1 provider 目录(可选性) ──
57
+ for (const e of ENGINES) {
58
+ const r = await api('GET', `/api/workshop/harnesses/${e.harness}/providers`, auth)
59
+ const provs = r.data?.catalog?.providers ?? []
60
+ const has = provs.some(p => p.models.some(m => m.id === 'glm-5.3-flash'))
61
+ check(`P1.${e.key}`, `${e.harness} 目录含 glm-5.3-flash(可选)`, has, provs.map(p => p.id).join(',').slice(0, 60))
62
+ }
63
+
64
+ // ── P2 同 Channel 组建(不同 harness worker + 自定义 provider/model) ──
65
+ const ch = (await api('POST', '/api/workshop/channels', {
66
+ body: {
67
+ name: `harness-mix-${TAG}`,
68
+ leadAgent: { name: `lead-${TAG}`, harness: 'mock', config: { delayMs: 60 } },
69
+ }, ...auth,
70
+ })).data
71
+ const channelId = ch?.channelId
72
+ check('P2.1', 'Channel 创建(mock lead)', Boolean(channelId))
73
+ const workers = {}
74
+ for (const e of ENGINES) {
75
+ const c = await api('POST', '/api/workshop/agents', {
76
+ body: { name: `${e.key}-${TAG}`, harness: e.harness, config: { ...e.cfg, systemPromptPrefix: '你是测试执行员:严格按任务完成,完成后立即调用 complete_task。' } }, ...auth,
77
+ })
78
+ workers[e.key] = c.data
79
+ check(`P2.${e.key}-tpl`, `${e.harness} 模板(provider=${e.cfg.provider ?? 'default'},model=${e.cfg.model})`, Boolean(c.data?.id))
80
+ const join = await api('POST', `/api/workshop/channels/${channelId}/agents`, { body: { agentId: c.data.id, role: 'worker' }, ...auth })
81
+ if (join.code !== 0) check(`P2.${e.key}-join`, `${e.key} 入队`, false, join.message ?? '')
82
+ }
83
+ const members = (await api('GET', `/api/workshop/channels/${channelId}/agents`, auth)).data ?? []
84
+ check('P2.join', '四引擎 worker 全部入队(5 成员)', members.length >= 5, `members=${members.length}`)
85
+
86
+ // ── P3 简单任务×4(真实 LLM 回合) ──
87
+ const tasks = {}
88
+ for (const e of ENGINES) {
89
+ const t = await api('POST', `/api/workshop/channels/${channelId}/tasks`, {
90
+ body: {
91
+ title: `smoke-${e.key}-${TAG}`,
92
+ parts: [{ text: '请直接汇报「 Harness 冒烟测试完成」六个字所在的环境时间,然后立即调用 complete_task。不要执行任何其它操作。' }],
93
+ assigneeId: workers[e.key].id,
94
+ }, ...auth,
95
+ })
96
+ tasks[e.key] = t.data?.task?.id ?? t.data?.id
97
+ }
98
+ check('P3.1', '四路简单任务下发', Object.values(tasks).every(Boolean))
99
+
100
+ const states = {}
101
+ const deadline = Date.now() + 16 * 60_000
102
+ while (Date.now() < deadline && Object.keys(states).length < 4) {
103
+ const list = await api('GET', `/api/workshop/channels/${channelId}/tasks`, auth)
104
+ for (const [k, id] of Object.entries(tasks)) {
105
+ if (states[k]) continue
106
+ const me = (list.data ?? []).find(x => x.id === id)
107
+ if (me && ['COMPLETED', 'FAILED', 'CANCELED'].includes(me.state)) states[k] = me.state
108
+ }
109
+ await sleep(6000)
110
+ }
111
+ for (const e of ENGINES) {
112
+ check(`P3.${e.key}`, `${e.harness}(glm-5.3-flash) 简单任务 COMPLETED`, states[e.key] === 'COMPLETED', `state=${states[e.key] ?? 'RUNNING'}`)
113
+ }
114
+
115
+ // ── 清理 ──
116
+ await api('DELETE', `/api/workshop/channels/${channelId}?purge=1`, auth).catch(() => {})
117
+
118
+ console.log(`\n━━━ 多 Harness provider E2E: ${passed} passed / ${failures} failed ━━━`)
119
+ if (failures) for (const r of results.filter(x => !x.ok)) console.log(` ${r.id} ${r.name} — ${r.detail}`)
120
+ process.exit(failures === 0 ? 0 : 1)
121
+ }
122
+
123
+ main().catch((err) => {
124
+ console.error('FATAL', err)
125
+ process.exit(1)
126
+ })
@@ -0,0 +1,8 @@
1
+ import { userRepository } from '../../repositories/user.repository'
2
+ import { defineApiHandler } from '../../utils/response'
3
+
4
+ /** GET /api/users/setup-status —— 公开:系统是否处于初始化状态。
5
+ * true = 无活跃管理员 → 登录门呈现"注册管理员"表单,首个注册账号自动成为 admin */
6
+ export default defineApiHandler(async () => {
7
+ return { needsSetup: !userRepository.hasActiveAdmin() }
8
+ })
@@ -6,15 +6,17 @@ import { getQuery, getRouterParam } from 'h3'
6
6
  import { resolveUser } from '@/server/api/workshop/caller'
7
7
  import { defineApiHandler } from '@/server/utils/response'
8
8
  import { getDaqController } from '@/server/services/workshop/daq/daq-controller'
9
+ import { daqRuntimeSettings } from '@/server/services/workshop/settings'
9
10
 
10
11
  export default defineApiHandler(async (event) => {
11
12
  resolveUser(event)
12
13
  const id = getRouterParam(event, 'id') ?? ''
13
14
  const q = getQuery(event)
14
15
  const num = (k: string): number | undefined => (q[k] != null && !Number.isNaN(Number(q[k])) ? Number(q[k]) : undefined)
15
- // 时间间隔参数(bucketMs):缺省 15s;可调,下限 1s(降采样桶聚合;返回体携带实际生效间隔)
16
+ // 时间间隔参数(bucketMs):缺省与下限来自 daq.query.*(live 配置,热重载)
17
+ const { defaultBucketMs, minBucketMs } = daqRuntimeSettings().query
16
18
  const rawBucket = num('bucketMs')
17
- const bucketMs = rawBucket == null ? 15_000 : Math.max(1000, Math.min(3_600_000, Math.round(rawBucket)))
19
+ const bucketMs = rawBucket == null ? defaultBucketMs : Math.max(minBucketMs, Math.min(3_600_000, Math.round(rawBucket)))
18
20
  const points = await getDaqController().samples(id, {
19
21
  fromMs: num('from'),
20
22
  toMs: num('to'),
@@ -64,9 +64,9 @@
64
64
  "posX": 1695,
65
65
  "posZ": 1135,
66
66
  "lineId": "ln-af002514",
67
- "value": 172.4,
67
+ "value": 169.5,
68
68
  "state": "ok",
69
- "lastAt": "2026-09-05T19:05:18.249+08:00",
69
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
70
70
  "createdAt": "2026-08-27T12:39:08.110Z"
71
71
  },
72
72
  {
@@ -308,9 +308,9 @@
308
308
  "deviceBindingId": null,
309
309
  "driverConfig": {},
310
310
  "lineId": "ln-af002514",
311
- "value": 309,
311
+ "value": 317,
312
312
  "state": "ok",
313
- "lastAt": "2026-09-05T19:05:18.249+08:00",
313
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
314
314
  "createdAt": "2026-08-28T09:37:38.518Z"
315
315
  },
316
316
  {
@@ -330,9 +330,9 @@
330
330
  "deviceBindingId": null,
331
331
  "driverConfig": {},
332
332
  "lineId": "ln-af002514",
333
- "value": 169.5,
333
+ "value": 169.4,
334
334
  "state": "ok",
335
- "lastAt": "2026-09-05T19:05:18.249+08:00",
335
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
336
336
  "createdAt": "2026-08-29T03:30:57.463Z"
337
337
  },
338
338
  {
@@ -1012,9 +1012,9 @@
1012
1012
  "posX": 2395,
1013
1013
  "posZ": 1135,
1014
1014
  "lineId": "ln-af002514",
1015
- "value": 172.6,
1015
+ "value": 172.7,
1016
1016
  "state": "ok",
1017
- "lastAt": "2026-09-05T19:05:22.686+08:00",
1017
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
1018
1018
  "createdAt": "2026-08-31T04:07:19.038Z"
1019
1019
  },
1020
1020
  {
@@ -3026,9 +3026,9 @@
3026
3026
  "posX": 120,
3027
3027
  "posZ": 120,
3028
3028
  "lineId": "ln-af002514",
3029
- "value": 0.9705,
3030
- "state": "ok",
3031
- "lastAt": "2026-09-05T19:05:18.249+08:00",
3029
+ "value": 1.0214,
3030
+ "state": "alarm",
3031
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
3032
3032
  "createdAt": "2026-09-03T10:17:59.182Z"
3033
3033
  },
3034
3034
  {
@@ -3050,9 +3050,9 @@
3050
3050
  "posX": 120,
3051
3051
  "posZ": 120,
3052
3052
  "lineId": "ln-af002514",
3053
- "value": 0.9747,
3054
- "state": "ok",
3055
- "lastAt": "2026-09-05T19:05:18.249+08:00",
3053
+ "value": 0.9829,
3054
+ "state": "alarm",
3055
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
3056
3056
  "createdAt": "2026-09-03T11:18:01.401Z"
3057
3057
  },
3058
3058
  {
@@ -3072,9 +3072,9 @@
3072
3072
  "deviceBindingId": "dev-mthzr991-ujuad",
3073
3073
  "driverConfig": {},
3074
3074
  "lineId": "ln-af002514",
3075
- "value": 0.9725,
3076
- "state": "ok",
3077
- "lastAt": "2026-09-05T19:05:18.249+08:00",
3075
+ "value": 1.0231,
3076
+ "state": "alarm",
3077
+ "lastAt": "2026-09-05T20:09:01.412+08:00",
3078
3078
  "createdAt": "2026-09-03T11:34:59.332Z"
3079
3079
  },
3080
3080
  {
@@ -3214,9 +3214,9 @@
3214
3214
  "deviceBindingId": null,
3215
3215
  "driverConfig": {},
3216
3216
  "lineId": "ln-1b318320",
3217
- "value": 165.2,
3217
+ "value": 167,
3218
3218
  "state": "ok",
3219
- "lastAt": "2026-09-05T19:05:22.427+08:00",
3219
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
3220
3220
  "createdAt": "2026-09-04T05:08:10.069Z"
3221
3221
  },
3222
3222
  {
@@ -3749,9 +3749,9 @@
3749
3749
  "jsonPath": "data.temp"
3750
3750
  },
3751
3751
  "lineId": "ln-6a34fbc7",
3752
- "value": 59,
3752
+ "value": 58.9,
3753
3753
  "state": "alarm",
3754
- "lastAt": "2026-09-05T19:05:21.910+08:00",
3754
+ "lastAt": "2026-09-05T20:09:03.477+08:00",
3755
3755
  "createdAt": "2026-09-05T05:47:00.640Z"
3756
3756
  },
3757
3757
  {
@@ -3774,9 +3774,9 @@
3774
3774
  "jsonPath": "data.value"
3775
3775
  },
3776
3776
  "lineId": "ln-6a34fbc7",
3777
- "value": 42.1,
3777
+ "value": 42.4,
3778
3778
  "state": "alarm",
3779
- "lastAt": "2026-09-05T19:05:22.427+08:00",
3779
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
3780
3780
  "createdAt": "2026-09-05T05:47:00.697Z"
3781
3781
  },
3782
3782
  {
@@ -3804,9 +3804,9 @@
3804
3804
  "byteOrder": "big"
3805
3805
  },
3806
3806
  "lineId": "ln-6a34fbc7",
3807
- "value": 0.75,
3807
+ "value": 0.8,
3808
3808
  "state": "ok",
3809
- "lastAt": "2026-09-05T19:05:21.910+08:00",
3809
+ "lastAt": "2026-09-05T20:09:02.706+08:00",
3810
3810
  "createdAt": "2026-09-05T05:47:00.821Z"
3811
3811
  },
3812
3812
  {
@@ -3835,7 +3835,7 @@
3835
3835
  "lineId": "ln-6a34fbc7",
3836
3836
  "value": 66,
3837
3837
  "state": "alarm",
3838
- "lastAt": "2026-09-05T19:05:22.427+08:00",
3838
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
3839
3839
  "createdAt": "2026-09-05T05:47:00.864Z"
3840
3840
  },
3841
3841
  {
@@ -3858,9 +3858,9 @@
3858
3858
  "nodeId": "ns=2;s=AW.Temp"
3859
3859
  },
3860
3860
  "lineId": "ln-6a34fbc7",
3861
- "value": 182.6,
3861
+ "value": 183.5,
3862
3862
  "state": "warn",
3863
- "lastAt": "2026-09-05T19:05:22.686+08:00",
3863
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
3864
3864
  "createdAt": "2026-09-05T05:47:03.624Z"
3865
3865
  },
3866
3866
  {
@@ -3888,9 +3888,9 @@
3888
3888
  "byteOrder": "big"
3889
3889
  },
3890
3890
  "lineId": "ln-6a34fbc7",
3891
- "value": -0.3,
3891
+ "value": -0.4,
3892
3892
  "state": "alarm",
3893
- "lastAt": "2026-09-05T19:05:22.427+08:00",
3893
+ "lastAt": "2026-09-05T20:09:02.188+08:00",
3894
3894
  "createdAt": "2026-09-05T05:47:03.680Z"
3895
3895
  },
3896
3896
  {
@@ -3959,9 +3959,9 @@
3959
3959
  "jsonPath": "data.temp"
3960
3960
  },
3961
3961
  "lineId": "ln-419463e0",
3962
- "value": 59,
3962
+ "value": 58.9,
3963
3963
  "state": "alarm",
3964
- "lastAt": "2026-09-05T19:05:21.910+08:00",
3964
+ "lastAt": "2026-09-05T20:09:03.477+08:00",
3965
3965
  "createdAt": "2026-09-05T06:09:13.444Z"
3966
3966
  },
3967
3967
  {
@@ -3984,9 +3984,9 @@
3984
3984
  "jsonPath": "data.value"
3985
3985
  },
3986
3986
  "lineId": "ln-419463e0",
3987
- "value": 42.7,
3987
+ "value": 42.1,
3988
3988
  "state": "alarm",
3989
- "lastAt": "2026-09-05T19:05:22.427+08:00",
3989
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
3990
3990
  "createdAt": "2026-09-05T06:09:13.490Z"
3991
3991
  },
3992
3992
  {
@@ -4014,9 +4014,9 @@
4014
4014
  "byteOrder": "big"
4015
4015
  },
4016
4016
  "lineId": "ln-419463e0",
4017
- "value": 0.75,
4017
+ "value": 0.8,
4018
4018
  "state": "ok",
4019
- "lastAt": "2026-09-05T19:05:21.910+08:00",
4019
+ "lastAt": "2026-09-05T20:09:02.965+08:00",
4020
4020
  "createdAt": "2026-09-05T06:09:13.540Z"
4021
4021
  },
4022
4022
  {
@@ -4045,7 +4045,7 @@
4045
4045
  "lineId": "ln-419463e0",
4046
4046
  "value": 66,
4047
4047
  "state": "alarm",
4048
- "lastAt": "2026-09-05T19:05:22.427+08:00",
4048
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
4049
4049
  "createdAt": "2026-09-05T06:09:13.567Z"
4050
4050
  },
4051
4051
  {
@@ -4068,9 +4068,9 @@
4068
4068
  "nodeId": "ns=2;s=AW.Temp"
4069
4069
  },
4070
4070
  "lineId": "ln-419463e0",
4071
- "value": 182.6,
4071
+ "value": 183.5,
4072
4072
  "state": "warn",
4073
- "lastAt": "2026-09-05T19:05:22.686+08:00",
4073
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
4074
4074
  "createdAt": "2026-09-05T06:09:14.128Z"
4075
4075
  },
4076
4076
  {
@@ -4098,9 +4098,9 @@
4098
4098
  "byteOrder": "big"
4099
4099
  },
4100
4100
  "lineId": "ln-419463e0",
4101
- "value": -0.5,
4101
+ "value": 0,
4102
4102
  "state": "alarm",
4103
- "lastAt": "2026-09-05T19:05:21.910+08:00",
4103
+ "lastAt": "2026-09-05T20:09:03.477+08:00",
4104
4104
  "createdAt": "2026-09-05T06:09:14.173Z"
4105
4105
  },
4106
4106
  {
@@ -4350,9 +4350,9 @@
4350
4350
  "byteOrder": "big"
4351
4351
  },
4352
4352
  "lineId": "ln-3548f325",
4353
- "value": -0.5,
4353
+ "value": -0.1,
4354
4354
  "state": "alarm",
4355
- "lastAt": "2026-09-05T19:05:21.910+08:00",
4355
+ "lastAt": "2026-09-05T20:09:02.452+08:00",
4356
4356
  "createdAt": "2026-09-05T07:23:51.869Z"
4357
4357
  },
4358
4358
  {
@@ -4564,9 +4564,61 @@
4564
4564
  "deviceBindingId": null,
4565
4565
  "driverConfig": {},
4566
4566
  "lineId": "ln-871ac52d",
4567
- "value": 43.4,
4567
+ "value": 43.8,
4568
4568
  "state": "ok",
4569
- "lastAt": "2026-09-05T19:05:22.427+08:00",
4569
+ "lastAt": "2026-09-05T20:09:03.215+08:00",
4570
4570
  "createdAt": "2026-09-05T09:47:55.620Z"
4571
+ },
4572
+ {
4573
+ "id": "dn-12f70c3b",
4574
+ "templateRef": "daq-temp-tc",
4575
+ "name": "MQTT温度-mtokh78a",
4576
+ "driver": "mqtt",
4577
+ "enabled": true,
4578
+ "intervalMs": 1000,
4579
+ "publishIntervalMs": 0,
4580
+ "unit": "℃",
4581
+ "decimals": 1,
4582
+ "min": 150,
4583
+ "max": 185,
4584
+ "warnLow": 152.8,
4585
+ "warnHigh": 182.2,
4586
+ "deviceBindingId": null,
4587
+ "driverConfig": {
4588
+ "host": "127.0.0.1",
4589
+ "port": 18830,
4590
+ "topic": "aw/sim/temp",
4591
+ "jsonPath": "data.temp"
4592
+ },
4593
+ "lineId": "ln-23810e78",
4594
+ "value": null,
4595
+ "state": "offline",
4596
+ "lastAt": null,
4597
+ "createdAt": "2026-09-05T23:58:31.357+08:00"
4598
+ },
4599
+ {
4600
+ "id": "dn-e0cd4d25",
4601
+ "templateRef": "daq-temp-tc",
4602
+ "name": "HTTP流量-mtokh78a",
4603
+ "driver": "http",
4604
+ "enabled": true,
4605
+ "intervalMs": 1000,
4606
+ "publishIntervalMs": 0,
4607
+ "unit": "℃",
4608
+ "decimals": 1,
4609
+ "min": 150,
4610
+ "max": 185,
4611
+ "warnLow": 152.8,
4612
+ "warnHigh": 182.2,
4613
+ "deviceBindingId": null,
4614
+ "driverConfig": {
4615
+ "url": "http://127.0.0.1:1889/api/value",
4616
+ "jsonPath": "data.value"
4617
+ },
4618
+ "lineId": "ln-23810e78",
4619
+ "value": null,
4620
+ "state": "offline",
4621
+ "lastAt": null,
4622
+ "createdAt": "2026-09-05T23:58:31.450+08:00"
4571
4623
  }
4572
4624
  ]
@@ -1363,5 +1363,12 @@
1363
1363
  "color": "#35e0a0",
1364
1364
  "description": "",
1365
1365
  "createdAt": "2026-09-05T18:55:51.023+08:00"
1366
+ },
1367
+ {
1368
+ "id": "ln-23810e78",
1369
+ "name": "全协议产线-mtokh78a",
1370
+ "color": "#41c8f4",
1371
+ "description": "",
1372
+ "createdAt": "2026-09-05T23:58:29.513+08:00"
1366
1373
  }
1367
1374
  ]
@@ -1223,5 +1223,26 @@
1223
1223
  "name": "tzc-prod",
1224
1224
  "description": "",
1225
1225
  "createdAt": "2026-09-05T19:05:14.617+08:00"
1226
+ },
1227
+ {
1228
+ "id": "pd-3ffc5e11",
1229
+ "lineId": "",
1230
+ "name": "cfg-prod",
1231
+ "description": "",
1232
+ "createdAt": "2026-09-05T19:59:44.387+08:00"
1233
+ },
1234
+ {
1235
+ "id": "pd-36b00ed3",
1236
+ "lineId": "",
1237
+ "name": "cfg-prod",
1238
+ "description": "",
1239
+ "createdAt": "2026-09-05T20:04:40.500+08:00"
1240
+ },
1241
+ {
1242
+ "id": "pd-28fc247a",
1243
+ "lineId": "",
1244
+ "name": "cfg-prod",
1245
+ "description": "",
1246
+ "createdAt": "2026-09-05T20:08:42.255+08:00"
1226
1247
  }
1227
1248
  ]
@@ -2950,5 +2950,89 @@
2950
2950
  "lastGoodRunId": null,
2951
2951
  "createdAt": "2026-09-05T19:05:14.638+08:00",
2952
2952
  "updatedAt": "2026-09-05T19:05:14.638+08:00"
2953
+ },
2954
+ {
2955
+ "id": "rc-3799921d",
2956
+ "productId": "pd-3ffc5e11",
2957
+ "lineId": "",
2958
+ "name": "cfg-recipe",
2959
+ "description": "",
2960
+ "params": [
2961
+ {
2962
+ "nodeId": "dw-204b00c4",
2963
+ "templateRef": "dcw-temp-sp",
2964
+ "value": 180,
2965
+ "min": 150,
2966
+ "max": 200
2967
+ }
2968
+ ],
2969
+ "daqWindows": [
2970
+ {
2971
+ "nodeId": "dn-30031a86",
2972
+ "min": 0,
2973
+ "max": 260
2974
+ }
2975
+ ],
2976
+ "version": 1,
2977
+ "paramsHistory": [],
2978
+ "lastGoodRunId": null,
2979
+ "createdAt": "2026-09-05T19:59:44.404+08:00",
2980
+ "updatedAt": "2026-09-05T19:59:44.404+08:00"
2981
+ },
2982
+ {
2983
+ "id": "rc-7756484b",
2984
+ "productId": "pd-36b00ed3",
2985
+ "lineId": "",
2986
+ "name": "cfg-recipe",
2987
+ "description": "",
2988
+ "params": [
2989
+ {
2990
+ "nodeId": "dw-2dcce3c7",
2991
+ "templateRef": "dcw-temp-sp",
2992
+ "value": 180,
2993
+ "min": 150,
2994
+ "max": 200
2995
+ }
2996
+ ],
2997
+ "daqWindows": [
2998
+ {
2999
+ "nodeId": "dn-2f6aad9f",
3000
+ "min": 0,
3001
+ "max": 260
3002
+ }
3003
+ ],
3004
+ "version": 1,
3005
+ "paramsHistory": [],
3006
+ "lastGoodRunId": null,
3007
+ "createdAt": "2026-09-05T20:04:40.516+08:00",
3008
+ "updatedAt": "2026-09-05T20:04:40.516+08:00"
3009
+ },
3010
+ {
3011
+ "id": "rc-69bd3ed5",
3012
+ "productId": "pd-28fc247a",
3013
+ "lineId": "",
3014
+ "name": "cfg-recipe",
3015
+ "description": "",
3016
+ "params": [
3017
+ {
3018
+ "nodeId": "dw-07cca4c7",
3019
+ "templateRef": "dcw-temp-sp",
3020
+ "value": 180,
3021
+ "min": 150,
3022
+ "max": 200
3023
+ }
3024
+ ],
3025
+ "daqWindows": [
3026
+ {
3027
+ "nodeId": "dn-fe806ab9",
3028
+ "min": 0,
3029
+ "max": 260
3030
+ }
3031
+ ],
3032
+ "version": 1,
3033
+ "paramsHistory": [],
3034
+ "lastGoodRunId": null,
3035
+ "createdAt": "2026-09-05T20:08:42.270+08:00",
3036
+ "updatedAt": "2026-09-05T20:08:42.270+08:00"
2953
3037
  }
2954
3038
  ]