agentworkshop 0.7.17 → 0.7.19

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 (38) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{BJem8_v5.js → BOJaHO5V.js} +4 -4
  3. package/.output/public/_nuxt/B_C3GLsD.js +1 -0
  4. package/.output/public/_nuxt/_id_.IbmpkhH4.css +1 -0
  5. package/.output/public/_nuxt/builds/latest.json +1 -1
  6. package/.output/public/_nuxt/builds/meta/7894c281-50fb-4f00-849f-32749ec2431c.json +1 -0
  7. package/.output/public/_nuxt/{entry.BNApuuEW.css → entry.DRUzDwmX.css} +1 -1
  8. package/.output/server/chunks/_/nitro.mjs +626 -571
  9. package/.output/server/chunks/build/{_id_-DvJZ5Qis.mjs → _id_-Bs-euJPu.mjs} +178 -131
  10. package/.output/server/chunks/build/_id_-Bs-euJPu.mjs.map +1 -0
  11. package/.output/server/chunks/routes/renderer.mjs +1 -1
  12. package/.output/server/chunks/virtual/entry.mjs +9 -1
  13. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  14. package/.output/server/package.json +1 -1
  15. package/app/pages/dcw/[id].vue +56 -6
  16. package/i18n/locales/en.ts +4 -0
  17. package/i18n/locales/zh-CN.ts +4 -0
  18. package/package.json +148 -148
  19. package/scripts/_dbg-live-line-e2e.mjs +279 -0
  20. package/scripts/_dbg-mqtt-publisher.mjs +17 -0
  21. package/scripts/_dbg-pg-tcp-probe.cjs +27 -0
  22. package/scripts/_dbg-recipe-stale-e2e.mjs +135 -0
  23. package/server/data/daqs.json +611 -86
  24. package/server/data/dcw-lines.json +28 -28
  25. package/server/data/dcw-products.json +28 -7
  26. package/server/data/dcw-recipes.json +109 -14
  27. package/server/data/dcw-rollback.json +1389 -9
  28. package/server/data/dcw-runs.json +625 -365
  29. package/server/data/dcw-writes.json +576 -0
  30. package/server/data/dcws.json +819 -316
  31. package/server/data/line-runs.json +54 -14
  32. package/server/services/workshop/agents/industrial-tools.ts +52 -18
  33. package/server/services/workshop/dcw/dcw-controller.ts +11 -1
  34. package/server/services/workshop/dcw/dcw-recipe.repo.ts +21 -6
  35. package/.output/public/_nuxt/DtM4RX5T.js +0 -1
  36. package/.output/public/_nuxt/_id_.pF-B9O6u.css +0 -1
  37. package/.output/public/_nuxt/builds/meta/6a0a88de-639e-4e7b-b7c1-7f4034e04787.json +0 -1
  38. package/.output/server/chunks/build/_id_-DvJZ5Qis.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.7.17",
3
+ "version": "0.7.19",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
@@ -389,6 +389,26 @@ const visibleRecipes = computed(() =>
389
389
  )
390
390
  const productName = (id: string): string => dcw.products.find(p => p.id === id)?.name ?? id
391
391
 
392
+ // ---------- 配方参数节点失效态(已删除/已停用/已取消绑定;灰化 + 徽标) ----------
393
+ interface StaleRef { code: 'deleted' | 'disabled' | 'unbound', label: string }
394
+ function paramStatus(nodeId: string, lineId: string): StaleRef | null {
395
+ const node = dcw.nodes.find(n => n.id === nodeId)
396
+ if (!node) return { code: 'deleted', label: t('dcwDetail.staleDeleted') }
397
+ if (!node.enabled) return { code: 'disabled', label: t('dcwDetail.staleDisabled') }
398
+ if (lineId && node.lineId !== lineId) return { code: 'unbound', label: t('dcwDetail.staleUnbound') }
399
+ return null
400
+ }
401
+ function paramNodeName(nodeId: string): string {
402
+ return dcw.nodes.find(n => n.id === nodeId)?.name ?? nodeId
403
+ }
404
+ function daqWindowStatus(nodeId: string, lineId: string): StaleRef | null {
405
+ const node = daq.nodes.find(n => n.id === nodeId)
406
+ if (!node) return { code: 'deleted', label: t('dcwDetail.staleDeleted') }
407
+ if (!node.enabled) return { code: 'disabled', label: t('dcwDetail.staleDisabled') }
408
+ if (lineId && node.lineId !== lineId) return { code: 'unbound', label: t('dcwDetail.staleUnbound') }
409
+ return null
410
+ }
411
+
392
412
  // ---------- 配方版本历史(整体修改变更记录;来源=用户/Agent/系统 + 操作者 + 回退) ----------
393
413
  interface RecipeVersionRow {
394
414
  version: number
@@ -493,6 +513,7 @@ const recipeOpen = ref(false)
493
513
  const recipeEditing = ref<string | null>(null)
494
514
  const recipeSaving = ref(false)
495
515
  const recipeError = ref('')
516
+ const recipeStaleNote = ref('')
496
517
  const recipeForm = reactive({
497
518
  productId: '',
498
519
  name: '',
@@ -520,10 +541,15 @@ function openRecipeEdit(id: string): void {
520
541
  if (!r) return
521
542
  recipeEditing.value = id
522
543
  recipeError.value = ''
544
+ // 失效参数自动清理:节点已删除的参数行直接剔除(保存会被后端归一化拒绝);
545
+ // 停用/解绑节点参数保留可编辑,状态由 select 旁徽标标示
546
+ const live = r.params.filter(p => dcw.nodes.some(n => n.id === p.nodeId))
547
+ const dropped = r.params.length - live.length
548
+ recipeStaleNote.value = dropped > 0 ? t('dcwDetail.staleDropped', { p0: dropped }) : ''
523
549
  recipeForm.productId = r.productId
524
550
  recipeForm.name = r.name
525
551
  recipeForm.description = r.description
526
- recipeForm.params = r.params.map(p => ({
552
+ recipeForm.params = live.map(p => ({
527
553
  nodeId: p.nodeId,
528
554
  value: p.value,
529
555
  min: p.min ?? '',
@@ -1428,16 +1454,25 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1428
1454
  v-for="(p, i) in r.params"
1429
1455
  :key="i"
1430
1456
  class="param-chip"
1457
+ :class="{ stale: paramStatus(p.nodeId, r.lineId) }"
1458
+ :title="paramStatus(p.nodeId, r.lineId)?.label ?? ''"
1431
1459
  >
1432
- {{ (dcw.templates.find(t => t.key === (p.templateRef ?? '').replace('dcw-', ''))?.ch ?? p.templateRef) }} = {{ p.value }}
1460
+ {{ paramNodeName(p.nodeId) }} = {{ p.value }}<span
1461
+ v-if="paramStatus(p.nodeId, r.lineId)"
1462
+ class="chip-stale-tag"
1463
+ >{{ paramStatus(p.nodeId, r.lineId)!.label }}</span>
1433
1464
  </span>
1434
1465
  <span
1435
1466
  v-for="(w, i) in r.daqWindows"
1436
1467
  :key="`w-${i}`"
1437
1468
  class="param-chip daqwin"
1438
- :title="$t('dcwDetail.k1l11api013')"
1469
+ :class="{ stale: daqWindowStatus(w.nodeId, r.lineId) }"
1470
+ :title="daqWindowStatus(w.nodeId, r.lineId)?.label ?? $t('dcwDetail.k1l11api013')"
1439
1471
  >
1440
- ◎ {{ daqNodeCh(w.nodeId) }} ∈ [{{ w.min ?? '-∞' }}, {{ w.max ?? '+∞' }}]
1472
+ ◎ {{ daqNodeCh(w.nodeId) }} ∈ [{{ w.min ?? '-∞' }}, {{ w.max ?? '+∞' }}]<span
1473
+ v-if="daqWindowStatus(w.nodeId, r.lineId)"
1474
+ class="chip-stale-tag"
1475
+ >{{ daqWindowStatus(w.nodeId, r.lineId)!.label }}</span>
1441
1476
  </span>
1442
1477
  </div>
1443
1478
  <div class="recipe-actions">
@@ -1733,6 +1768,10 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1733
1768
  {{ n.name }}({{ dcwTemplateRefCh(n.templateRef) }} · {{ n.min }}~{{ n.max }} {{ n.unit }})
1734
1769
  </option>
1735
1770
  </select>
1771
+ <span
1772
+ v-if="paramStatus(p.nodeId, lineId)"
1773
+ class="row-stale"
1774
+ >{{ paramStatus(p.nodeId, lineId)!.label }}</span>
1736
1775
  </label>
1737
1776
  <label class="f">
1738
1777
  <span>{{ $t('dcwDetail.k3renp2098') }}<em>*</em></span>
@@ -1832,6 +1871,12 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1832
1871
  >
1833
1872
  {{ $t('dcwDetail.kv1de1p105') }}
1834
1873
  </button>
1874
+ <p
1875
+ v-if="recipeStaleNote"
1876
+ class="m-note"
1877
+ >
1878
+ {{ recipeStaleNote }}
1879
+ </p>
1835
1880
  <p
1836
1881
  v-if="recipeError"
1837
1882
  class="m-err"
@@ -1867,12 +1912,12 @@ function fmtPoint(p: { value?: number, avg?: number } | undefined): string {
1867
1912
  style="max-width: 760px;"
1868
1913
  >
1869
1914
  <div class="modal-head">
1870
- <h3>
1915
+ <h3>
1871
1916
  {{ t('dcwDetail.histTitle') }}<span
1872
1917
  v-if="verRecipe"
1873
1918
  class="dim"
1874
1919
  style="margin-left: 8px; font-size: 12px;"
1875
- >{{ verRecipe.name }} · v{{ verRecipe.version }}</span>
1920
+ >{{ verRecipe.name }} · v{{ verRecipe.version }}</span>
1876
1921
  </h3>
1877
1922
  <button
1878
1923
  class="mini-btn"
@@ -2471,6 +2516,11 @@ h1 { margin: 2px 0 4px; font-size: 30px; font-weight: 400; letter-spacing: -0.01
2471
2516
  .test-result.good { color: var(--tone-success-dot); }
2472
2517
  .test-result.bad { color: var(--tone-danger-dot); }
2473
2518
  .m-err { margin: 8px 0 0; font-size: 12px; color: var(--tone-danger-dot); }
2519
+ .m-note { margin: 8px 0 0; font-size: 12px; color: var(--ink-faint); }
2520
+ /* 失效配方参数:灰化 + 徽标 */
2521
+ .param-chip.stale { color: var(--ink-faint); background: color-mix(in srgb, var(--ink) 5%, transparent); border-color: var(--divider-hair); text-decoration: line-through; text-decoration-color: color-mix(in srgb, var(--ink-faint) 60%, transparent); }
2522
+ .chip-stale-tag { margin-left: 5px; padding: 0 5px; font-size: 9.5px; font-style: normal; color: var(--tone-danger-dot); background: color-mix(in srgb, var(--tone-danger-dot) 8%, transparent); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 30%, transparent); border-radius: var(--radius-chip); text-decoration: none; }
2523
+ .row-stale { flex: none; padding: 1px 7px; font-size: 10.5px; color: var(--tone-danger-dot); border: 1px solid color-mix(in srgb, var(--tone-danger-dot) 30%, transparent); border-radius: var(--radius-chip); }
2474
2524
  .m-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 16px; }
2475
2525
  .aw-pill.outline { color: var(--ink); background: var(--paper-raised); border-color: var(--line-strong); }
2476
2526
  .err { margin-top: 14px; font-size: 13px; color: var(--tone-danger-dot); }
@@ -840,6 +840,10 @@ export default {
840
840
  k1bphrb3048: 'Delete failed',
841
841
  },
842
842
  dcwDetail: {
843
+ staleDeleted: 'deleted',
844
+ staleDisabled: 'disabled',
845
+ staleUnbound: 'unbound',
846
+ staleDropped: 'Removed {p0} stale param(s) (node deleted); re-add with a live node if needed',
843
847
  histBtn: 'History',
844
848
  histTitle: 'Recipe Version History',
845
849
  histLoading: 'Loading…',
@@ -839,6 +839,10 @@ export default {
839
839
  k1bphrb3048: '删除失败',
840
840
  },
841
841
  dcwDetail: {
842
+ staleDeleted: '已删除',
843
+ staleDisabled: '已停用',
844
+ staleUnbound: '已取消绑定',
845
+ staleDropped: '已自动移除 {p0} 条失效参数(节点已删除);如需恢复请重新添加有效节点',
842
846
  histBtn: '版本历史',
843
847
  histTitle: '配方版本历史',
844
848
  histLoading: '加载中…',
package/package.json CHANGED
@@ -1,148 +1,148 @@
1
- {
2
- "name": "agentworkshop",
3
- "version": "0.7.17",
4
- "type": "module",
5
- "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
- "license": "PolyForm-Noncommercial-1.0.0",
7
- "exports": {
8
- ".": {
9
- "types": "./sdk/index.d.mts",
10
- "default": "./sdk/index.mjs"
11
- },
12
- "./sdk": {
13
- "types": "./sdk/index.d.mts",
14
- "default": "./sdk/index.mjs"
15
- },
16
- "./sdk/client": {
17
- "types": "./sdk/client.d.mts",
18
- "default": "./sdk/client.mjs"
19
- },
20
- "./package.json": "./package.json"
21
- },
22
- "bin": {
23
- "aw": "bin/aw.mjs",
24
- "agentworkshop": "bin/aw.mjs"
25
- },
26
- "files": [
27
- ".output",
28
- "bin",
29
- "cli",
30
- "sdk",
31
- "app",
32
- "server",
33
- "shared",
34
- "i18n",
35
- "public",
36
- "scripts",
37
- ".AgentWorkShop/prompts",
38
- "config.yml",
39
- "nuxt.config.ts",
40
- "tsconfig.json",
41
- "uno.config.ts",
42
- "docker-compose.yml",
43
- ".env.example",
44
- "README-zh.md",
45
- "docs/cli.md",
46
- "docs/plugins.md",
47
- "docs/sdk.md",
48
- "docs/tui.md",
49
- "tui"
50
- ],
51
- "packageManager": "pnpm@11.9.0",
52
- "engines": {
53
- "node": ">=23.4.0"
54
- },
55
- "scripts": {
56
- "dev": "node bin/aw.mjs dev",
57
- "build": "node bin/aw.mjs build",
58
- "start": "node bin/aw.mjs start",
59
- "generate": "nuxt generate",
60
- "preview": "node bin/aw.mjs start",
61
- "cli": "node bin/aw.mjs",
62
- "tui": "node tui/aw-tui.mjs",
63
- "postinstall": "node scripts/home-bootstrap.mjs",
64
- "prepublishOnly": "node bin/aw.mjs build",
65
- "lint": "eslint .",
66
- "lint:fix": "eslint . --fix",
67
- "typecheck": "nuxt typecheck",
68
- "prepare": "husky",
69
- "game:test": "tsx scripts/test-agent-brain.ts && tsx scripts/test-game-session.ts",
70
- "test:api-live": "node scripts/api-live-e2e.mjs",
71
- "game:verify": "node scripts/verify-game.mjs",
72
- "game:build-assets": "node scripts/build-player-sheet.mjs",
73
- "game:build-wuwa": "node scripts/build-wuwa-assets.mjs",
74
- "game:build-models": "node scripts/build-character-models.mjs",
75
- "game:build-world": "node scripts/build-world-map.mjs",
76
- "game:build-model3d": "node scripts/build-model-3d.mjs"
77
- },
78
- "lint-staged": {
79
- "*.{js,mjs,cjs,ts,vue}": "eslint --fix"
80
- },
81
- "dependencies": {
82
- "@ant-design-vue/nuxt": "^1.4.6",
83
- "@ant-design/icons-vue": "^7.0.1",
84
- "@earendil-works/pi-tui": "^0.84.4",
85
- "@fontsource-variable/fraunces": "^5.3.0",
86
- "@fontsource-variable/geist": "^5.3.0",
87
- "@fontsource-variable/geist-mono": "^5.3.0",
88
- "@fontsource-variable/inter": "^5.3.0",
89
- "@fontsource/eb-garamond": "^5.3.0",
90
- "@fontsource/ibm-plex-mono": "^5.3.0",
91
- "@iconify-json/tabler": "^1.2.0",
92
- "@modelcontextprotocol/sdk": "^1.30.0",
93
- "@nuxtjs/i18n": "^9.0.0",
94
- "@pinia/nuxt": "^0.11.0",
95
- "@unocss/nuxt": "^66.0.0",
96
- "@unocss/preset-attributify": "^66.0.0",
97
- "@unocss/preset-icons": "^66.7.5",
98
- "@unocss/preset-typography": "^66.0.0",
99
- "@vueuse/core": "^13.0.0",
100
- "@vueuse/nuxt": "^13.0.0",
101
- "@xterm/addon-fit": "^0.11.0",
102
- "@xterm/xterm": "^6.0.0",
103
- "ant-design-vue": "^4.2.6",
104
- "axios": "^1.7.9",
105
- "echarts": "^5.6.0",
106
- "h3": "2.0.1-rc.26",
107
- "js-yaml": "^4.1.0",
108
- "minio": "^8.0.7",
109
- "modbus-serial": "^8.0.25",
110
- "mqtt": "^5.15.2",
111
- "node-opcua": "^2.178.0",
112
- "nuxt": "^4.0.0",
113
- "nuxt-auth-utils": "^0.5.0",
114
- "pg": "^8.23.0",
115
- "phaser": "^4.0.0",
116
- "pinia": "^3.0.0",
117
- "pinia-plugin-persistedstate": "^4.2.0",
118
- "sqlite-vec": "^0.1.9",
119
- "three": "^0.185.1",
120
- "unocss": "^66.0.0",
121
- "unplugin-icons": "^22.0.0",
122
- "vue": "^3.5.13",
123
- "vue-echarts": "^7.0.3",
124
- "vue-router": "^4.5.0",
125
- "zod": "^3.24.1"
126
- },
127
- "devDependencies": {
128
- "@commitlint/cli": "^19.6.1",
129
- "@commitlint/config-conventional": "^19.6.0",
130
- "@nuxt/eslint": "^1.0.0",
131
- "@types/js-yaml": "^4.0.9",
132
- "@types/node": "^26.2.0",
133
- "@types/three": "^0.185.4",
134
- "eslint": "^9.17.0",
135
- "husky": "^9.1.7",
136
- "lint-staged": "^15.3.0",
137
- "pngjs": "^7.0.0",
138
- "puppeteer-core": "^25.5.0",
139
- "tsx": "^4.23.12",
140
- "typescript": "^5.7.3",
141
- "vue-tsc": "^3.3.10"
142
- },
143
- "pnpm": {
144
- "ignoredBuiltDependencies": [
145
- "@serialport/bindings-cpp"
146
- ]
147
- }
148
- }
1
+ {
2
+ "name": "agentworkshop",
3
+ "version": "0.7.19",
4
+ "type": "module",
5
+ "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
+ "license": "PolyForm-Noncommercial-1.0.0",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./sdk/index.d.mts",
10
+ "default": "./sdk/index.mjs"
11
+ },
12
+ "./sdk": {
13
+ "types": "./sdk/index.d.mts",
14
+ "default": "./sdk/index.mjs"
15
+ },
16
+ "./sdk/client": {
17
+ "types": "./sdk/client.d.mts",
18
+ "default": "./sdk/client.mjs"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "bin": {
23
+ "aw": "bin/aw.mjs",
24
+ "agentworkshop": "bin/aw.mjs"
25
+ },
26
+ "files": [
27
+ ".output",
28
+ "bin",
29
+ "cli",
30
+ "sdk",
31
+ "app",
32
+ "server",
33
+ "shared",
34
+ "i18n",
35
+ "public",
36
+ "scripts",
37
+ ".AgentWorkShop/prompts",
38
+ "config.yml",
39
+ "nuxt.config.ts",
40
+ "tsconfig.json",
41
+ "uno.config.ts",
42
+ "docker-compose.yml",
43
+ ".env.example",
44
+ "README-zh.md",
45
+ "docs/cli.md",
46
+ "docs/plugins.md",
47
+ "docs/sdk.md",
48
+ "docs/tui.md",
49
+ "tui"
50
+ ],
51
+ "packageManager": "pnpm@11.9.0",
52
+ "engines": {
53
+ "node": ">=23.4.0"
54
+ },
55
+ "scripts": {
56
+ "dev": "node bin/aw.mjs dev",
57
+ "build": "node bin/aw.mjs build",
58
+ "start": "node bin/aw.mjs start",
59
+ "generate": "nuxt generate",
60
+ "preview": "node bin/aw.mjs start",
61
+ "cli": "node bin/aw.mjs",
62
+ "tui": "node tui/aw-tui.mjs",
63
+ "postinstall": "node scripts/home-bootstrap.mjs",
64
+ "prepublishOnly": "node bin/aw.mjs build",
65
+ "lint": "eslint .",
66
+ "lint:fix": "eslint . --fix",
67
+ "typecheck": "nuxt typecheck",
68
+ "prepare": "husky",
69
+ "game:test": "tsx scripts/test-agent-brain.ts && tsx scripts/test-game-session.ts",
70
+ "test:api-live": "node scripts/api-live-e2e.mjs",
71
+ "game:verify": "node scripts/verify-game.mjs",
72
+ "game:build-assets": "node scripts/build-player-sheet.mjs",
73
+ "game:build-wuwa": "node scripts/build-wuwa-assets.mjs",
74
+ "game:build-models": "node scripts/build-character-models.mjs",
75
+ "game:build-world": "node scripts/build-world-map.mjs",
76
+ "game:build-model3d": "node scripts/build-model-3d.mjs"
77
+ },
78
+ "lint-staged": {
79
+ "*.{js,mjs,cjs,ts,vue}": "eslint --fix"
80
+ },
81
+ "dependencies": {
82
+ "@ant-design-vue/nuxt": "^1.4.6",
83
+ "@ant-design/icons-vue": "^7.0.1",
84
+ "@earendil-works/pi-tui": "^0.84.4",
85
+ "@fontsource-variable/fraunces": "^5.3.0",
86
+ "@fontsource-variable/geist": "^5.3.0",
87
+ "@fontsource-variable/geist-mono": "^5.3.0",
88
+ "@fontsource-variable/inter": "^5.3.0",
89
+ "@fontsource/eb-garamond": "^5.3.0",
90
+ "@fontsource/ibm-plex-mono": "^5.3.0",
91
+ "@iconify-json/tabler": "^1.2.0",
92
+ "@modelcontextprotocol/sdk": "^1.30.0",
93
+ "@nuxtjs/i18n": "^9.0.0",
94
+ "@pinia/nuxt": "^0.11.0",
95
+ "@unocss/nuxt": "^66.0.0",
96
+ "@unocss/preset-attributify": "^66.0.0",
97
+ "@unocss/preset-icons": "^66.7.5",
98
+ "@unocss/preset-typography": "^66.0.0",
99
+ "@vueuse/core": "^13.0.0",
100
+ "@vueuse/nuxt": "^13.0.0",
101
+ "@xterm/addon-fit": "^0.11.0",
102
+ "@xterm/xterm": "^6.0.0",
103
+ "ant-design-vue": "^4.2.6",
104
+ "axios": "^1.7.9",
105
+ "echarts": "^5.6.0",
106
+ "h3": "2.0.1-rc.26",
107
+ "js-yaml": "^4.1.0",
108
+ "minio": "^8.0.7",
109
+ "modbus-serial": "^8.0.25",
110
+ "mqtt": "^5.15.2",
111
+ "node-opcua": "^2.178.0",
112
+ "nuxt": "^4.0.0",
113
+ "nuxt-auth-utils": "^0.5.0",
114
+ "pg": "^8.23.0",
115
+ "phaser": "^4.0.0",
116
+ "pinia": "^3.0.0",
117
+ "pinia-plugin-persistedstate": "^4.2.0",
118
+ "sqlite-vec": "^0.1.9",
119
+ "three": "^0.185.1",
120
+ "unocss": "^66.0.0",
121
+ "unplugin-icons": "^22.0.0",
122
+ "vue": "^3.5.13",
123
+ "vue-echarts": "^7.0.3",
124
+ "vue-router": "^4.5.0",
125
+ "zod": "^3.24.1"
126
+ },
127
+ "devDependencies": {
128
+ "@commitlint/cli": "^19.6.1",
129
+ "@commitlint/config-conventional": "^19.6.0",
130
+ "@nuxt/eslint": "^1.0.0",
131
+ "@types/js-yaml": "^4.0.9",
132
+ "@types/node": "^26.2.0",
133
+ "@types/three": "^0.185.4",
134
+ "eslint": "^9.17.0",
135
+ "husky": "^9.1.7",
136
+ "lint-staged": "^15.3.0",
137
+ "pngjs": "^7.0.0",
138
+ "puppeteer-core": "^25.5.0",
139
+ "tsx": "^4.23.12",
140
+ "typescript": "^5.7.3",
141
+ "vue-tsc": "^3.3.10"
142
+ },
143
+ "pnpm": {
144
+ "ignoredBuiltDependencies": [
145
+ "@serialport/bindings-cpp"
146
+ ]
147
+ }
148
+ }