agentworkshop 0.2.1

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 (895) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +631 -0
  2. package/.AgentWorkShop/prompts/lead-supervise.md +42 -0
  3. package/.AgentWorkShop/prompts/mode-goal.md +26 -0
  4. package/.AgentWorkShop/prompts/mode-loop.md +10 -0
  5. package/.AgentWorkShop/prompts/mode-pipeline.md +16 -0
  6. package/.AgentWorkShop/prompts/peer-lead-roster.md +3 -0
  7. package/.AgentWorkShop/prompts/peer-message.md +14 -0
  8. package/.AgentWorkShop/prompts/peer-reply-optional.md +2 -0
  9. package/.AgentWorkShop/prompts/peer-reply-required.md +8 -0
  10. package/.AgentWorkShop/prompts/scenario-default.md +11 -0
  11. package/.AgentWorkShop/prompts/system-manual.md +18 -0
  12. package/.AgentWorkShop/prompts/team-roster.md +9 -0
  13. package/.AgentWorkShop/prompts/worker-workflow.md +19 -0
  14. package/.env.example +34 -0
  15. package/README-zh.md +424 -0
  16. package/README.md +424 -0
  17. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.json +1 -0
  18. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/1459e6269990a5d229b9228c8b2f62ffaa7d350068380ae8b875fee0db45cca6.source +180 -0
  19. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/c2991e909c70c5c12b90a407c7adcf63384c51668a2b334e6e047fa675c268fe.source +305 -0
  20. package/app/.mimosa/hook-state/sess_05189059-e42d-4188-8911-4f7baabe009b.mtg0vz68-49792-75b0709555.baseline/e09129039d1e27e3fac24becc9bdafd2d1a7c8049bff24173df007be865f0165.source +264 -0
  21. package/app/.mimosa/hook-status/sess_05189059-e42d-4188-8911-4f7baabe009b-28ef7c75ea.json +14 -0
  22. package/app/app.vue +139 -0
  23. package/app/assets/css/main.css +1257 -0
  24. package/app/components/AppHeader.vue +675 -0
  25. package/app/components/AppSidebar.vue +286 -0
  26. package/app/components/AwChart.vue +44 -0
  27. package/app/components/AwLogo.vue +75 -0
  28. package/app/components/workshop/A2aRpcDebugger.vue +237 -0
  29. package/app/components/workshop/AgentInspectorDrawer.vue +424 -0
  30. package/app/components/workshop/AgentLanesView.vue +947 -0
  31. package/app/components/workshop/ArtifactCard.vue +120 -0
  32. package/app/components/workshop/AssetLibrary.vue +450 -0
  33. package/app/components/workshop/ChannelSessionList.vue +593 -0
  34. package/app/components/workshop/CommandPalette.vue +270 -0
  35. package/app/components/workshop/Composer.vue +731 -0
  36. package/app/components/workshop/DeviceTwinPanel.vue +607 -0
  37. package/app/components/workshop/EventBlock.vue +602 -0
  38. package/app/components/workshop/FileSelectorModal.vue +188 -0
  39. package/app/components/workshop/InspectorPanel.vue +265 -0
  40. package/app/components/workshop/LiveAgentBar.vue +362 -0
  41. package/app/components/workshop/MemoryPanel.vue +364 -0
  42. package/app/components/workshop/MentionHoverCard.vue +155 -0
  43. package/app/components/workshop/MultiChannelView.vue +189 -0
  44. package/app/components/workshop/PaneSplitter.vue +142 -0
  45. package/app/components/workshop/StatsPanel.vue +168 -0
  46. package/app/components/workshop/TaskBoardView.vue +636 -0
  47. package/app/components/workshop/TaskInspectorDrawer.vue +390 -0
  48. package/app/components/workshop/TranscriptTimeline.vue +545 -0
  49. package/app/components/workshop/blocks/ClusterArtifact.vue +77 -0
  50. package/app/components/workshop/blocks/ClusterError.vue +85 -0
  51. package/app/components/workshop/blocks/ClusterLife.vue +87 -0
  52. package/app/components/workshop/blocks/ClusterMember.vue +93 -0
  53. package/app/components/workshop/blocks/ClusterMemory.vue +84 -0
  54. package/app/components/workshop/blocks/ClusterOther.vue +67 -0
  55. package/app/components/workshop/blocks/ClusterRoute.vue +359 -0
  56. package/app/components/workshop/blocks/ClusterStatus.vue +147 -0
  57. package/app/components/workshop/blocks/ClusterStream.vue +325 -0
  58. package/app/components/workshop/blocks/ClusterTask.vue +151 -0
  59. package/app/components/workshop/blocks/ClusterTool.vue +158 -0
  60. package/app/components/workshop/lanes/LaneBlocks.vue +149 -0
  61. package/app/components/workshop/terminal/OmpTerminalPanel.vue +1010 -0
  62. package/app/components/workshop/town/ModelPreview3D.vue +276 -0
  63. package/app/components/workshop/town/TownScene.ts +1355 -0
  64. package/app/components/workshop/town/TownScene3D.ts +4533 -0
  65. package/app/components/workshop/town/TownView.vue +7071 -0
  66. package/app/composables/useCodeCopy.ts +30 -0
  67. package/app/composables/useHttp.ts +8 -0
  68. package/app/composables/useRouteMeta.ts +50 -0
  69. package/app/composables/useSiteConfig.ts +21 -0
  70. package/app/composables/workshop/apiClient.ts +95 -0
  71. package/app/composables/workshop/useCharacterAssets.ts +292 -0
  72. package/app/composables/workshop/useClusteredBlocks.ts +150 -0
  73. package/app/composables/workshop/useComposerBus.ts +16 -0
  74. package/app/composables/workshop/useDaqStream.ts +379 -0
  75. package/app/composables/workshop/useDcwStream.ts +300 -0
  76. package/app/composables/workshop/useDeviceTwins.ts +147 -0
  77. package/app/composables/workshop/useEventBlocks.ts +662 -0
  78. package/app/composables/workshop/useLocalTime.ts +33 -0
  79. package/app/composables/workshop/useOpsLog.ts +164 -0
  80. package/app/composables/workshop/useSceneLayouts.ts +166 -0
  81. package/app/composables/workshop/useTownBus.ts +47 -0
  82. package/app/composables/workshop/useVisibleInterval.ts +42 -0
  83. package/app/composables/workshop/useWorkshopApi.ts +224 -0
  84. package/app/composables/workshop/useWorkshopWs.ts +113 -0
  85. package/app/config/index.ts +66 -0
  86. package/app/config/schema.ts +68 -0
  87. package/app/error.vue +76 -0
  88. package/app/layouts/default.vue +100 -0
  89. package/app/layouts/town.vue +16 -0
  90. package/app/pages/daq/[id].vue +796 -0
  91. package/app/pages/daq/index.vue +2577 -0
  92. package/app/pages/dcw/[id].vue +2259 -0
  93. package/app/pages/dcw/index.vue +1079 -0
  94. package/app/pages/index.vue +830 -0
  95. package/app/pages/logs/index.vue +621 -0
  96. package/app/pages/monitor.vue +665 -0
  97. package/app/pages/settings.vue +757 -0
  98. package/app/pages/tokens.vue +610 -0
  99. package/app/pages/town.vue +145 -0
  100. package/app/pages/users.vue +257 -0
  101. package/app/pages/workshop/agents.vue +382 -0
  102. package/app/pages/workshop/channel-templates.vue +456 -0
  103. package/app/pages/workshop/index.vue +604 -0
  104. package/app/pages/workshop/teams.vue +448 -0
  105. package/app/pages/workshop/w/[wsId].vue +516 -0
  106. package/app/plugins/http.ts +71 -0
  107. package/app/plugins/locale-restore.client.ts +13 -0
  108. package/app/plugins/runtime-config.client.ts +65 -0
  109. package/app/plugins/session-restore.client.ts +24 -0
  110. package/app/plugins/theme.client.ts +15 -0
  111. package/app/stores/app.ts +32 -0
  112. package/app/stores/route-trail.ts +45 -0
  113. package/app/stores/runtime-config.ts +212 -0
  114. package/app/stores/workshop/connection.ts +184 -0
  115. package/app/stores/workshop/entities.ts +350 -0
  116. package/app/stores/workshop/events.ts +292 -0
  117. package/app/stores/workshop/user.ts +176 -0
  118. package/app/stores/workshop/workspaces.ts +133 -0
  119. package/bin/aw.mjs +13 -0
  120. package/cli/aw.mjs +184 -0
  121. package/cli/commands/build.mjs +33 -0
  122. package/cli/commands/config.mjs +157 -0
  123. package/cli/commands/dev.mjs +74 -0
  124. package/cli/commands/doctor.mjs +120 -0
  125. package/cli/commands/home.mjs +75 -0
  126. package/cli/commands/init.mjs +150 -0
  127. package/cli/commands/register.mjs +123 -0
  128. package/cli/commands/start.mjs +106 -0
  129. package/cli/commands/status.mjs +67 -0
  130. package/cli/commands/update.mjs +116 -0
  131. package/cli/commands/version.mjs +32 -0
  132. package/cli/core/args.mjs +95 -0
  133. package/cli/core/context.mjs +264 -0
  134. package/cli/core/errors.mjs +18 -0
  135. package/cli/core/help.mjs +68 -0
  136. package/cli/core/logger.mjs +40 -0
  137. package/cli/core/registry.mjs +111 -0
  138. package/config.yml +70 -0
  139. package/docker-compose.yml +34 -0
  140. package/docs/cli.md +220 -0
  141. package/i18n/dicts/_en.json +1097 -0
  142. package/i18n/dicts/_en2.json +300 -0
  143. package/i18n/dicts/_en3.json +102 -0
  144. package/i18n/dicts/_en4.json +115 -0
  145. package/i18n/dicts/_en5.json +33 -0
  146. package/i18n/dicts/a2aRpcDebugger.json +10 -0
  147. package/i18n/dicts/agentInspectorDrawer.json +25 -0
  148. package/i18n/dicts/agentLanesView.json +57 -0
  149. package/i18n/dicts/agents.json +27 -0
  150. package/i18n/dicts/appHeader.json +7 -0
  151. package/i18n/dicts/appSidebar.json +1 -0
  152. package/i18n/dicts/artifactCard.json +6 -0
  153. package/i18n/dicts/assetLibrary.json +18 -0
  154. package/i18n/dicts/awChart.json +1 -0
  155. package/i18n/dicts/awLogo.json +1 -0
  156. package/i18n/dicts/channelSessionList.json +45 -0
  157. package/i18n/dicts/clusterArtifact.json +4 -0
  158. package/i18n/dicts/clusterError.json +3 -0
  159. package/i18n/dicts/clusterLife.json +5 -0
  160. package/i18n/dicts/clusterMember.json +3 -0
  161. package/i18n/dicts/clusterMemory.json +3 -0
  162. package/i18n/dicts/clusterOther.json +3 -0
  163. package/i18n/dicts/clusterRoute.json +15 -0
  164. package/i18n/dicts/clusterStatus.json +3 -0
  165. package/i18n/dicts/clusterStream.json +3 -0
  166. package/i18n/dicts/clusterTask.json +10 -0
  167. package/i18n/dicts/clusterTool.json +3 -0
  168. package/i18n/dicts/commandPalette.json +16 -0
  169. package/i18n/dicts/composer.json +38 -0
  170. package/i18n/dicts/ctpl.json +32 -0
  171. package/i18n/dicts/daq.json +157 -0
  172. package/i18n/dicts/daqDetail.json +55 -0
  173. package/i18n/dicts/dcw.json +68 -0
  174. package/i18n/dicts/dcwDetail.json +199 -0
  175. package/i18n/dicts/deviceTwinPanel.json +12 -0
  176. package/i18n/dicts/eventBlock.json +8 -0
  177. package/i18n/dicts/fileSelectorModal.json +6 -0
  178. package/i18n/dicts/inspectorPanel.json +12 -0
  179. package/i18n/dicts/laneBlocks.json +6 -0
  180. package/i18n/dicts/liveAgentBar.json +8 -0
  181. package/i18n/dicts/logs.json +39 -0
  182. package/i18n/dicts/memoryPanel.json +20 -0
  183. package/i18n/dicts/mentionHoverCard.json +4 -0
  184. package/i18n/dicts/modelPreview3D.json +1 -0
  185. package/i18n/dicts/monitor.json +5 -0
  186. package/i18n/dicts/multiChannelView.json +13 -0
  187. package/i18n/dicts/ompTerminalPanel.json +7 -0
  188. package/i18n/dicts/paneSplitter.json +3 -0
  189. package/i18n/dicts/settings.json +1 -0
  190. package/i18n/dicts/statsPanel.json +6 -0
  191. package/i18n/dicts/taskBoardView.json +22 -0
  192. package/i18n/dicts/taskInspectorDrawer.json +19 -0
  193. package/i18n/dicts/teams.json +33 -0
  194. package/i18n/dicts/tokens.json +30 -0
  195. package/i18n/dicts/town.json +7 -0
  196. package/i18n/dicts/townView.json +209 -0
  197. package/i18n/dicts/transcriptTimeline.json +31 -0
  198. package/i18n/dicts/users.json +15 -0
  199. package/i18n/dicts/wsHome.json +33 -0
  200. package/i18n/dicts/wsView.json +15 -0
  201. package/i18n/locales/en.ts +1737 -0
  202. package/i18n/locales/zh-CN.ts +1736 -0
  203. package/nuxt.config.ts +209 -0
  204. package/package.json +123 -0
  205. package/public/assets/game/character/bot.png +0 -0
  206. package/public/assets/game/character/device-3d.glb +0 -0
  207. package/public/assets/game/character/hero-3d.glb +0 -0
  208. package/public/assets/game/character/hero-anime-1.glb +0 -0
  209. package/public/assets/game/character/hero-anime-2.glb +0 -0
  210. package/public/assets/game/character/hero-anime-3.glb +0 -0
  211. package/public/assets/game/character/hero-anime-4.glb +0 -0
  212. package/public/assets/game/character/knight.png +0 -0
  213. package/public/assets/game/character/mage.png +0 -0
  214. package/public/assets/game/coin.png +0 -0
  215. package/public/assets/game/devices/agv.glb +0 -0
  216. package/public/assets/game/devices/caster.glb +0 -0
  217. package/public/assets/game/devices/device-console.glb +0 -0
  218. package/public/assets/game/devices/device-robot-arm.glb +0 -0
  219. package/public/assets/game/devices/device-scanner.glb +0 -0
  220. package/public/assets/game/devices/extruder.glb +0 -0
  221. package/public/assets/game/devices/mdo.glb +0 -0
  222. package/public/assets/game/devices/power-cabinet.glb +0 -0
  223. package/public/assets/game/devices/pump.glb +0 -0
  224. package/public/assets/game/devices/tdo.glb +0 -0
  225. package/public/assets/game/devices/thickness-scanner.glb +0 -0
  226. package/public/assets/game/devices/winder.glb +0 -0
  227. package/public/assets/game/npc/boltnu-sheet.png +0 -0
  228. package/public/assets/game/npc/fluttaflap-sheet.png +0 -0
  229. package/public/assets/game/npc/rockitten-sheet.png +0 -0
  230. package/public/assets/game/npc/tux-sheet.png +0 -0
  231. package/public/assets/game/player/misa-back-walk.000.png +0 -0
  232. package/public/assets/game/player/misa-back-walk.001.png +0 -0
  233. package/public/assets/game/player/misa-back-walk.002.png +0 -0
  234. package/public/assets/game/player/misa-back-walk.003.png +0 -0
  235. package/public/assets/game/player/misa-back.png +0 -0
  236. package/public/assets/game/player/misa-front-walk.000.png +0 -0
  237. package/public/assets/game/player/misa-front-walk.001.png +0 -0
  238. package/public/assets/game/player/misa-front-walk.002.png +0 -0
  239. package/public/assets/game/player/misa-front-walk.003.png +0 -0
  240. package/public/assets/game/player/misa-front.png +0 -0
  241. package/public/assets/game/player/misa-left-walk.000.png +0 -0
  242. package/public/assets/game/player/misa-left-walk.001.png +0 -0
  243. package/public/assets/game/player/misa-left-walk.002.png +0 -0
  244. package/public/assets/game/player/misa-left-walk.003.png +0 -0
  245. package/public/assets/game/player/misa-left.png +0 -0
  246. package/public/assets/game/player/misa-right-walk.000.png +0 -0
  247. package/public/assets/game/player/misa-right-walk.001.png +0 -0
  248. package/public/assets/game/player/misa-right-walk.002.png +0 -0
  249. package/public/assets/game/player/misa-right-walk.003.png +0 -0
  250. package/public/assets/game/player/misa-right.png +0 -0
  251. package/public/assets/game/player-sheet.png +0 -0
  252. package/public/assets/game/tuxemon-town.json +1 -0
  253. package/public/assets/game/tuxmon-sample-32px-extruded.png +0 -0
  254. package/public/assets/game/wuwa/scene-map.png +0 -0
  255. package/public/assets/game/wuwa/world-far.png +0 -0
  256. package/public/assets/game/wuwa/world-middle.png +0 -0
  257. package/public/assets/game/wuwa/world-near.png +0 -0
  258. package/public/assets/game/wuwa/wu-aura.png +0 -0
  259. package/public/assets/game/wuwa/wu-lead.png +0 -0
  260. package/public/assets/game/wuwa/wu-ring.png +0 -0
  261. package/public/assets/game/wuwa/wu-slash.png +0 -0
  262. package/public/assets/game/wuwa/wu-worker-0.png +0 -0
  263. package/public/assets/game/wuwa/wu-worker-1.png +0 -0
  264. package/public/assets/game/wuwa/wu-worker-2.png +0 -0
  265. package/public/favicon.svg +14 -0
  266. package/public/scene/background/cyber-town-background.svg +110 -0
  267. package/scripts/_daq-realtime-probe.mjs +68 -0
  268. package/scripts/_daq-warn-probe.mjs +50 -0
  269. package/scripts/_dbg-agent-tools-audit.mjs +154 -0
  270. package/scripts/_dbg-agent-workflow-audit.mjs +177 -0
  271. package/scripts/_dbg-anim-verify.mjs +81 -0
  272. package/scripts/_dbg-audit-all-pages.mjs +43 -0
  273. package/scripts/_dbg-autoframe.mjs +103 -0
  274. package/scripts/_dbg-beacon-final.mjs +181 -0
  275. package/scripts/_dbg-bind-bidi-e2e.mjs +239 -0
  276. package/scripts/_dbg-callout-near.mjs +108 -0
  277. package/scripts/_dbg-chan-focus.mjs +49 -0
  278. package/scripts/_dbg-cleanup.mjs +31 -0
  279. package/scripts/_dbg-closedloop-ui-shot.mjs +61 -0
  280. package/scripts/_dbg-console-audit.mjs +61 -0
  281. package/scripts/_dbg-console-probe.mjs +23 -0
  282. package/scripts/_dbg-context-inject-audit.mjs +231 -0
  283. package/scripts/_dbg-crash-recovery.mjs +143 -0
  284. package/scripts/_dbg-crop-shot.mjs +16 -0
  285. package/scripts/_dbg-daq-acc-probe.mjs +24 -0
  286. package/scripts/_dbg-daq-attrib.mjs +34 -0
  287. package/scripts/_dbg-daq-bind-audit.mjs +119 -0
  288. package/scripts/_dbg-daq-cadence.mjs +104 -0
  289. package/scripts/_dbg-daq-debug.mjs +22 -0
  290. package/scripts/_dbg-daq-diag.mjs +33 -0
  291. package/scripts/_dbg-daq-e2e.mjs +171 -0
  292. package/scripts/_dbg-daq-film.mjs +136 -0
  293. package/scripts/_dbg-daq-filter-e2e.mjs +109 -0
  294. package/scripts/_dbg-daq-filter-e2e2.mjs +62 -0
  295. package/scripts/_dbg-daq-final-regression.mjs +78 -0
  296. package/scripts/_dbg-daq-full-check.mjs +179 -0
  297. package/scripts/_dbg-daq-line-note-verify.mjs +61 -0
  298. package/scripts/_dbg-daq-linebanner-audit.mjs +107 -0
  299. package/scripts/_dbg-daq-pages-shot.mjs +37 -0
  300. package/scripts/_dbg-daq-perf.mjs +61 -0
  301. package/scripts/_dbg-daq-probe.mjs +27 -0
  302. package/scripts/_dbg-daq-recipe-e2e.mjs +30 -0
  303. package/scripts/_dbg-daq-redesign-shot.mjs +88 -0
  304. package/scripts/_dbg-daq-rows-probe.mjs +26 -0
  305. package/scripts/_dbg-daq-rowstate-e2e.mjs +152 -0
  306. package/scripts/_dbg-daq-rowstate-shot.mjs +45 -0
  307. package/scripts/_dbg-daq-rowstate-shot2.mjs +38 -0
  308. package/scripts/_dbg-daq-tpl.mjs +144 -0
  309. package/scripts/_dbg-dash-console-check.mjs +49 -0
  310. package/scripts/_dbg-dash-deep-probe.mjs +61 -0
  311. package/scripts/_dbg-dash-hitpoint.mjs +44 -0
  312. package/scripts/_dbg-dash-live-shot.mjs +36 -0
  313. package/scripts/_dbg-dash-shot.mjs +21 -0
  314. package/scripts/_dbg-dashboard-shot.mjs +35 -0
  315. package/scripts/_dbg-dcw-audit.mjs +126 -0
  316. package/scripts/_dbg-dcw-card-e2e.mjs +108 -0
  317. package/scripts/_dbg-dcw-channel-ui.mjs +144 -0
  318. package/scripts/_dbg-dcw-examples.mjs +81 -0
  319. package/scripts/_dbg-dcw-light-shot.mjs +19 -0
  320. package/scripts/_dbg-dcw-line-audit.mjs +107 -0
  321. package/scripts/_dbg-dcw-pause-tpl-audit.mjs +161 -0
  322. package/scripts/_dbg-dcw-pause-ui.mjs +175 -0
  323. package/scripts/_dbg-dcw-scene.mjs +72 -0
  324. package/scripts/_dbg-dcw-shot2.mjs +14 -0
  325. package/scripts/_dbg-dcw-twin-e2e.mjs +192 -0
  326. package/scripts/_dbg-dt-interact.mjs +193 -0
  327. package/scripts/_dbg-error-probe.mjs +54 -0
  328. package/scripts/_dbg-filter-light-verify.mjs +54 -0
  329. package/scripts/_dbg-final-acceptance-2.mjs +72 -0
  330. package/scripts/_dbg-final-acceptance.mjs +192 -0
  331. package/scripts/_dbg-final-agent-e2e.mjs +151 -0
  332. package/scripts/_dbg-final-full-e2e.mjs +218 -0
  333. package/scripts/_dbg-final-line-e2e.mjs +173 -0
  334. package/scripts/_dbg-final-t6-hitl.mjs +38 -0
  335. package/scripts/_dbg-focus-range.mjs +115 -0
  336. package/scripts/_dbg-fresh-scene-e2e.mjs +125 -0
  337. package/scripts/_dbg-full-feature-e2e.mjs +219 -0
  338. package/scripts/_dbg-fullchain-e2e.mjs +178 -0
  339. package/scripts/_dbg-gate-debug.mjs +37 -0
  340. package/scripts/_dbg-gif-encode.mjs +111 -0
  341. package/scripts/_dbg-gizmo.mjs +95 -0
  342. package/scripts/_dbg-glass-probe.mjs +57 -0
  343. package/scripts/_dbg-glass-shot.mjs +50 -0
  344. package/scripts/_dbg-glass-sweep.mjs +25 -0
  345. package/scripts/_dbg-glb-probe.mjs +43 -0
  346. package/scripts/_dbg-hardening-probe.mjs +90 -0
  347. package/scripts/_dbg-hero-btn-probe.mjs +21 -0
  348. package/scripts/_dbg-hidden-check.mjs +21 -0
  349. package/scripts/_dbg-hitl-timeout-e2e.mjs +93 -0
  350. package/scripts/_dbg-hmi-audit.mjs +164 -0
  351. package/scripts/_dbg-home-repro.mjs +24 -0
  352. package/scripts/_dbg-home-stack.mjs +13 -0
  353. package/scripts/_dbg-huashu-survey.mjs +31 -0
  354. package/scripts/_dbg-huashu-survey2.mjs +35 -0
  355. package/scripts/_dbg-huashu-verify.mjs +25 -0
  356. package/scripts/_dbg-huashu-verify2.mjs +26 -0
  357. package/scripts/_dbg-hydration-detail.mjs +18 -0
  358. package/scripts/_dbg-i18n-debug.mjs +27 -0
  359. package/scripts/_dbg-i18n-debug2.mjs +26 -0
  360. package/scripts/_dbg-i18n-final.mjs +42 -0
  361. package/scripts/_dbg-i18n-scan.mjs +38 -0
  362. package/scripts/_dbg-infra-lifecycle.mjs +44 -0
  363. package/scripts/_dbg-line-aura-shots.mjs +54 -0
  364. package/scripts/_dbg-line-control-e2e.mjs +120 -0
  365. package/scripts/_dbg-line-gate-audit.mjs +108 -0
  366. package/scripts/_dbg-line-live-e2e.mjs +144 -0
  367. package/scripts/_dbg-line-scenario-e2e.mjs +256 -0
  368. package/scripts/_dbg-minimal-omp.mjs +77 -0
  369. package/scripts/_dbg-mode-nav.mjs +173 -0
  370. package/scripts/_dbg-mqtt-chain-e2e.mjs +90 -0
  371. package/scripts/_dbg-nav-rpg.mjs +84 -0
  372. package/scripts/_dbg-nav-shot.mjs +28 -0
  373. package/scripts/_dbg-nav.mjs +27 -0
  374. package/scripts/_dbg-opslog-e2e.mjs +121 -0
  375. package/scripts/_dbg-opslog-shots.mjs +62 -0
  376. package/scripts/_dbg-opt-team-e2e.mjs +133 -0
  377. package/scripts/_dbg-optimization-e2e.mjs +94 -0
  378. package/scripts/_dbg-orbit.mjs +58 -0
  379. package/scripts/_dbg-panesplitter-fix-check.mjs +62 -0
  380. package/scripts/_dbg-phase-e3-monitor.mjs +25 -0
  381. package/scripts/_dbg-pop-clamp-verify.mjs +77 -0
  382. package/scripts/_dbg-preset-e2e.mjs +116 -0
  383. package/scripts/_dbg-preview-console.mjs +28 -0
  384. package/scripts/_dbg-preview-minrepro.mjs +156 -0
  385. package/scripts/_dbg-preview-pixels.mjs +93 -0
  386. package/scripts/_dbg-quality-pages-e2e.mjs +84 -0
  387. package/scripts/_dbg-query-cancel.ts +12 -0
  388. package/scripts/_dbg-rail-tree-e2e.mjs +183 -0
  389. package/scripts/_dbg-real-driver-e2e.mjs +55 -0
  390. package/scripts/_dbg-redesign-shots.mjs +34 -0
  391. package/scripts/_dbg-restart-persist.mjs +41 -0
  392. package/scripts/_dbg-rollback-mgr-audit.mjs +169 -0
  393. package/scripts/_dbg-rpg.mjs +71 -0
  394. package/scripts/_dbg-sc001-dispatch.mjs +63 -0
  395. package/scripts/_dbg-scenario-final-shot.mjs +24 -0
  396. package/scripts/_dbg-scenario-phase-e2.mjs +75 -0
  397. package/scripts/_dbg-scenario-phase-e3.mjs +96 -0
  398. package/scripts/_dbg-scenario-phase1.mjs +90 -0
  399. package/scripts/_dbg-scenario-phase2.mjs +105 -0
  400. package/scripts/_dbg-scenario-phase3-monitor.mjs +48 -0
  401. package/scripts/_dbg-scenario-phase3.mjs +111 -0
  402. package/scripts/_dbg-scene-polish-shot.mjs +118 -0
  403. package/scripts/_dbg-selring-probe.mjs +47 -0
  404. package/scripts/_dbg-sideinfo.mjs +101 -0
  405. package/scripts/_dbg-splitter.mjs +88 -0
  406. package/scripts/_dbg-team-repro.mjs +76 -0
  407. package/scripts/_dbg-town-alarm-e2e.mjs +40 -0
  408. package/scripts/_dbg-town-beauty-shots.mjs +54 -0
  409. package/scripts/_dbg-town-daq-shot.mjs +26 -0
  410. package/scripts/_dbg-town-full-e2e.mjs +104 -0
  411. package/scripts/_dbg-town-gate.mjs +44 -0
  412. package/scripts/_dbg-town-ins-probe.mjs +37 -0
  413. package/scripts/_dbg-town-perf.mjs +50 -0
  414. package/scripts/_dbg-town-polish-shots.mjs +82 -0
  415. package/scripts/_dbg-town-realtime.mjs +42 -0
  416. package/scripts/_dbg-town-shot3.mjs +17 -0
  417. package/scripts/_dbg-town-truth.mjs +37 -0
  418. package/scripts/_dbg-town-truth2.mjs +27 -0
  419. package/scripts/_dbg-transform-audit.mjs +98 -0
  420. package/scripts/_dbg-trend-expand-test.mjs +38 -0
  421. package/scripts/_dbg-twindaq-focus.mjs +81 -0
  422. package/scripts/_dbg-ui-polish-shot.mjs +43 -0
  423. package/scripts/_dbg-ui-polish-verify1.mjs +92 -0
  424. package/scripts/_dbg-ui-polish-verify2.mjs +50 -0
  425. package/scripts/_dbg-ui-polish-verify3.mjs +51 -0
  426. package/scripts/_dbg-ui-polish-verify4.mjs +50 -0
  427. package/scripts/_dbg-ui-shot.mjs +26 -0
  428. package/scripts/_dbg-unify-shot.mjs +43 -0
  429. package/scripts/_dbg-uplink-probe.mjs +36 -0
  430. package/scripts/_dbg-wizard-preview-shot.mjs +58 -0
  431. package/scripts/_dbg-wizard-ui-e2e.mjs +93 -0
  432. package/scripts/_dbg-ws-probe.mjs +86 -0
  433. package/scripts/_dbg-ws-shot2.mjs +23 -0
  434. package/scripts/_dbg-wsdot-sanity.mjs +25 -0
  435. package/scripts/_dev-stack.mjs +46 -0
  436. package/scripts/_http-driver-probe.mjs +30 -0
  437. package/scripts/_lib-dcw-line.mjs +24 -0
  438. package/scripts/_mqtt-driver-probe.mjs +30 -0
  439. package/scripts/_newdriver-rest-probe.mjs +100 -0
  440. package/scripts/_node-state-probe.mjs +5 -0
  441. package/scripts/_opcua-driver-probe.mjs +31 -0
  442. package/scripts/_rtu-debug.mjs +41 -0
  443. package/scripts/_rtu-direct.mjs +6 -0
  444. package/scripts/_rtu-driver-probe.mjs +53 -0
  445. package/scripts/_rtu-mini-slave.mjs +63 -0
  446. package/scripts/_townview_style.css +1185 -0
  447. package/scripts/_townview_template.html +1215 -0
  448. package/scripts/_wizard-shots.mjs +90 -0
  449. package/scripts/acceptance-suite.py +207 -0
  450. package/scripts/api-live-e2e.mjs +467 -0
  451. package/scripts/build-anime-models.mjs +339 -0
  452. package/scripts/build-character-models.mjs +175 -0
  453. package/scripts/build-film-devices.mjs +227 -0
  454. package/scripts/build-model-3d.mjs +173 -0
  455. package/scripts/build-player-sheet.mjs +58 -0
  456. package/scripts/build-world-map.mjs +188 -0
  457. package/scripts/build-wuwa-assets.mjs +345 -0
  458. package/scripts/collab-live-test.py +177 -0
  459. package/scripts/debug-mcp-http.ts +64 -0
  460. package/scripts/demo-lead-worker.ts +256 -0
  461. package/scripts/demo-modes.ts +415 -0
  462. package/scripts/demo-omp-channel.ts +135 -0
  463. package/scripts/design-preflight.mjs +223 -0
  464. package/scripts/design-verify-templates.mjs +110 -0
  465. package/scripts/design-verify.mjs +170 -0
  466. package/scripts/dev-guard.mjs +74 -0
  467. package/scripts/dev-modbus-simulator.mjs +55 -0
  468. package/scripts/dev-opcua-simulator.mjs +57 -0
  469. package/scripts/dev-protocol-simulators.mjs +145 -0
  470. package/scripts/dev-window.cmd +6 -0
  471. package/scripts/device-line-restore.mjs +34 -0
  472. package/scripts/diag-lead-status.ts +101 -0
  473. package/scripts/e2e-a2a-steer-live.mjs +193 -0
  474. package/scripts/e2e-agent-channel-task.ts +151 -0
  475. package/scripts/e2e-agent-team.mjs +168 -0
  476. package/scripts/e2e-auth-matrix.mjs +119 -0
  477. package/scripts/e2e-channel-isolation.ts +325 -0
  478. package/scripts/e2e-dual-drive-comm.ts +259 -0
  479. package/scripts/e2e-lead-team-mgmt.ts +217 -0
  480. package/scripts/e2e-memory-persistence.ts +320 -0
  481. package/scripts/e2e-memory-system.ts +332 -0
  482. package/scripts/e2e-omp-modes.ts +274 -0
  483. package/scripts/e2e-omp-realtime.ts +258 -0
  484. package/scripts/e2e-omp-workspace.ts +180 -0
  485. package/scripts/e2e-parallel-execution.mjs +151 -0
  486. package/scripts/e2e-rest-memory.mjs +251 -0
  487. package/scripts/e2e-rest-robustness.mjs +177 -0
  488. package/scripts/e2e-resume-crash.mjs +254 -0
  489. package/scripts/e2e-tab-close.mjs +136 -0
  490. package/scripts/e2e-task-queue.ts +277 -0
  491. package/scripts/e2e-template-isolation.mjs +267 -0
  492. package/scripts/e2e-token-ui.mjs +149 -0
  493. package/scripts/final-soup-run.py +192 -0
  494. package/scripts/final-soup-watch.py +83 -0
  495. package/scripts/home-bootstrap.mjs +117 -0
  496. package/scripts/i18n-codemod.mjs +173 -0
  497. package/scripts/i18n-fix-en.py +28 -0
  498. package/scripts/i18n-fix-en2.py +31 -0
  499. package/scripts/i18n-merge.mjs +67 -0
  500. package/scripts/omp-real-test.py +328 -0
  501. package/scripts/smoke-optimization-verify.ts +72 -0
  502. package/scripts/start.mjs +60 -0
  503. package/scripts/test-a2a-relay.mjs +222 -0
  504. package/scripts/test-a2a-types.ts +296 -0
  505. package/scripts/test-agent-brain.ts +135 -0
  506. package/scripts/test-agent-multi-channel.ts +160 -0
  507. package/scripts/test-agent-runtime.ts +348 -0
  508. package/scripts/test-api-client.ts +108 -0
  509. package/scripts/test-api-suite.mjs +271 -0
  510. package/scripts/test-block-consumption.mjs +194 -0
  511. package/scripts/test-channel-routing.ts +301 -0
  512. package/scripts/test-cmd-render.mjs +218 -0
  513. package/scripts/test-collab-e2e.mjs +136 -0
  514. package/scripts/test-collab-omp.mjs +192 -0
  515. package/scripts/test-dedup-logic.ts +132 -0
  516. package/scripts/test-dual-drive.ts +227 -0
  517. package/scripts/test-e2e-collaboration.ts +262 -0
  518. package/scripts/test-e2e-monitor.ts +192 -0
  519. package/scripts/test-event-history.ts +112 -0
  520. package/scripts/test-event-persistence.mjs +169 -0
  521. package/scripts/test-exec-modes.ts +316 -0
  522. package/scripts/test-fifo-realtime.mjs +193 -0
  523. package/scripts/test-final-e2e.mjs +290 -0
  524. package/scripts/test-full-system.ts +439 -0
  525. package/scripts/test-game-session.ts +160 -0
  526. package/scripts/test-goal-summary.ts +202 -0
  527. package/scripts/test-harness-liveness.ts +109 -0
  528. package/scripts/test-harness-terminal.ts +164 -0
  529. package/scripts/test-header-trail.mjs +95 -0
  530. package/scripts/test-hitl.ts +360 -0
  531. package/scripts/test-koda-restyle.mjs +105 -0
  532. package/scripts/test-lane-history-live.mjs +103 -0
  533. package/scripts/test-lane-raw.ts +67 -0
  534. package/scripts/test-lanes-history-render.mjs +138 -0
  535. package/scripts/test-loop-omp.mjs +154 -0
  536. package/scripts/test-mcp-tools.ts +285 -0
  537. package/scripts/test-mdlite.ts +53 -0
  538. package/scripts/test-memory-dynamic.ts +99 -0
  539. package/scripts/test-memory-maintenance.ts +117 -0
  540. package/scripts/test-memory-vector.ts +154 -0
  541. package/scripts/test-memory.ts +431 -0
  542. package/scripts/test-mock-collab.mjs +226 -0
  543. package/scripts/test-modern-render.mjs +174 -0
  544. package/scripts/test-omp-terminal.mjs +187 -0
  545. package/scripts/test-orchestration.ts +425 -0
  546. package/scripts/test-persistence-lazy.ts +323 -0
  547. package/scripts/test-prompt-system.mjs +181 -0
  548. package/scripts/test-prompts-loader.ts +56 -0
  549. package/scripts/test-protocol.ts +156 -0
  550. package/scripts/test-real-scenario.mjs +290 -0
  551. package/scripts/test-route-reason.mjs +111 -0
  552. package/scripts/test-scheduler-loop.ts +469 -0
  553. package/scripts/test-stream-render.ts +37 -0
  554. package/scripts/test-task-drawer.mjs +204 -0
  555. package/scripts/test-task-engine.ts +433 -0
  556. package/scripts/test-task-invariants.mjs +169 -0
  557. package/scripts/test-terminal-e2e.mjs +264 -0
  558. package/scripts/test-town-3d.mjs +121 -0
  559. package/scripts/test-town-drag.mjs +218 -0
  560. package/scripts/test-town-layout.mjs +200 -0
  561. package/scripts/test-town-page.mjs +136 -0
  562. package/scripts/test-town-scene-math.ts +169 -0
  563. package/scripts/test-town-twin.mjs +121 -0
  564. package/scripts/test-town-upload.mjs +89 -0
  565. package/scripts/test-town-user-flow.mjs +619 -0
  566. package/scripts/test-town-world.mjs +76 -0
  567. package/scripts/test-town-wuwa.mjs +198 -0
  568. package/scripts/test-user-isolation.mjs +193 -0
  569. package/scripts/test-workshop-db.ts +280 -0
  570. package/scripts/test-workshop-entries.ts +370 -0
  571. package/scripts/test-workspace-api.ts +329 -0
  572. package/scripts/test-ws-aep.mjs +187 -0
  573. package/scripts/test-ws-protocol.ts +134 -0
  574. package/scripts/test-ws-stress.mjs +208 -0
  575. package/scripts/town-demo-seed.mjs +75 -0
  576. package/scripts/town-scene-clear.mjs +56 -0
  577. package/scripts/ui-screenshot.mjs +128 -0
  578. package/scripts/verify-a2a-live.mjs +124 -0
  579. package/scripts/verify-exec-modes-report.ts +248 -0
  580. package/scripts/verify-game.mjs +477 -0
  581. package/scripts/verify-lead-mail.ts +188 -0
  582. package/scripts/verify-page-smoke.mjs +87 -0
  583. package/scripts/verify-ws-events.mjs +123 -0
  584. package/scripts/ws-test.mjs +176 -0
  585. package/scripts/ws-test.py +4 -0
  586. package/server/api/health.get.ts +32 -0
  587. package/server/api/mcp/workshop.ts +78 -0
  588. package/server/api/metrics.ts +75 -0
  589. package/server/api/system/config.get.ts +12 -0
  590. package/server/api/system/monitor/terminal/ws.ts +177 -0
  591. package/server/api/system/monitor/terminate.post.ts +36 -0
  592. package/server/api/system/monitor.get.ts +13 -0
  593. package/server/api/system/settings/events.get.ts +28 -0
  594. package/server/api/system/settings/index.get.ts +14 -0
  595. package/server/api/system/settings/index.patch.ts +22 -0
  596. package/server/api/system/settings/reset.post.ts +12 -0
  597. package/server/api/users/[id].delete.ts +11 -0
  598. package/server/api/users/[id].get.ts +11 -0
  599. package/server/api/users/[id].put.ts +14 -0
  600. package/server/api/users/index.get.ts +13 -0
  601. package/server/api/users/index.post.ts +13 -0
  602. package/server/api/users/login.post.ts +11 -0
  603. package/server/api/users/logout.post.ts +9 -0
  604. package/server/api/users/me.get.ts +9 -0
  605. package/server/api/users/register.post.ts +11 -0
  606. package/server/api/users/tokens/[id]/token.get.ts +11 -0
  607. package/server/api/users/tokens/[id].delete.ts +11 -0
  608. package/server/api/users/tokens/[id].patch.ts +14 -0
  609. package/server/api/users/tokens/index.get.ts +9 -0
  610. package/server/api/users/tokens/index.post.ts +13 -0
  611. package/server/api/workshop/[...path].ts +13 -0
  612. package/server/api/workshop/a2a/[agentId]/card/index.get.ts +75 -0
  613. package/server/api/workshop/a2a/[agentId]/rpc/index.post.ts +429 -0
  614. package/server/api/workshop/a2a/send.post.ts +28 -0
  615. package/server/api/workshop/agent-tools/approvals/[id]/decide.post.ts +21 -0
  616. package/server/api/workshop/agent-tools/approvals/index.get.ts +18 -0
  617. package/server/api/workshop/agent-tools/bindings/[id].delete.ts +21 -0
  618. package/server/api/workshop/agent-tools/bindings/[id].patch.ts +14 -0
  619. package/server/api/workshop/agent-tools/bindings/index.get.ts +14 -0
  620. package/server/api/workshop/agent-tools/bindings/index.post.ts +20 -0
  621. package/server/api/workshop/agent-tools/invoke.post.ts +34 -0
  622. package/server/api/workshop/agents/[id].delete.ts +20 -0
  623. package/server/api/workshop/agents/[id].get.ts +19 -0
  624. package/server/api/workshop/agents/[id].patch.ts +30 -0
  625. package/server/api/workshop/agents/index.get.ts +13 -0
  626. package/server/api/workshop/agents/index.post.ts +29 -0
  627. package/server/api/workshop/agents/subscribe.post.ts +21 -0
  628. package/server/api/workshop/approvals/[id]/decide.post.ts +30 -0
  629. package/server/api/workshop/approvals/index.get.ts +22 -0
  630. package/server/api/workshop/assets/character/[id].delete.ts +33 -0
  631. package/server/api/workshop/assets/character/index.get.ts +17 -0
  632. package/server/api/workshop/assets/character/index.post.ts +87 -0
  633. package/server/api/workshop/assets/devices/[id].delete.ts +43 -0
  634. package/server/api/workshop/assets/devices/index.get.ts +103 -0
  635. package/server/api/workshop/assets/devices/index.post.ts +53 -0
  636. package/server/api/workshop/audit.get.ts +43 -0
  637. package/server/api/workshop/caller.ts +141 -0
  638. package/server/api/workshop/channel-templates/[id]/instantiate.post.ts +31 -0
  639. package/server/api/workshop/channel-templates/[id].delete.ts +20 -0
  640. package/server/api/workshop/channel-templates/[id].get.ts +19 -0
  641. package/server/api/workshop/channel-templates/[id].patch.ts +48 -0
  642. package/server/api/workshop/channel-templates/from-channel.post.ts +31 -0
  643. package/server/api/workshop/channel-templates/index.get.ts +13 -0
  644. package/server/api/workshop/channel-templates/index.post.ts +61 -0
  645. package/server/api/workshop/channels/[id]/activate.post.ts +19 -0
  646. package/server/api/workshop/channels/[id]/agents/[agentId]/memories/[memoryId].delete.ts +30 -0
  647. package/server/api/workshop/channels/[id]/agents/[agentId]/memories/index.get.ts +29 -0
  648. package/server/api/workshop/channels/[id]/agents/[agentId]/memories/index.post.ts +48 -0
  649. package/server/api/workshop/channels/[id]/agents/[agentId]/memories/search.post.ts +43 -0
  650. package/server/api/workshop/channels/[id]/agents/[agentId]/model.patch.ts +39 -0
  651. package/server/api/workshop/channels/[id]/agents/[agentId]/position.patch.ts +33 -0
  652. package/server/api/workshop/channels/[id]/agents/[agentId]/range.patch.ts +54 -0
  653. package/server/api/workshop/channels/[id]/agents/[agentId]/stop.post.ts +25 -0
  654. package/server/api/workshop/channels/[id]/agents/[agentId].delete.ts +23 -0
  655. package/server/api/workshop/channels/[id]/agents/[agentId].patch.ts +28 -0
  656. package/server/api/workshop/channels/[id]/agents/index.get.ts +27 -0
  657. package/server/api/workshop/channels/[id]/agents/index.post.ts +61 -0
  658. package/server/api/workshop/channels/[id]/events.get.ts +55 -0
  659. package/server/api/workshop/channels/[id]/index.get.ts +18 -0
  660. package/server/api/workshop/channels/[id]/index.patch.ts +30 -0
  661. package/server/api/workshop/channels/[id]/memories/[memoryId].delete.ts +29 -0
  662. package/server/api/workshop/channels/[id]/memories/index.get.ts +28 -0
  663. package/server/api/workshop/channels/[id]/memories/index.post.ts +42 -0
  664. package/server/api/workshop/channels/[id]/messages/index.get.ts +56 -0
  665. package/server/api/workshop/channels/[id]/messages/index.post.ts +75 -0
  666. package/server/api/workshop/channels/[id]/queue.get.ts +25 -0
  667. package/server/api/workshop/channels/[id]/tasks/index.get.ts +24 -0
  668. package/server/api/workshop/channels/[id]/tasks/index.post.ts +79 -0
  669. package/server/api/workshop/channels/[id]/terminals.get.ts +21 -0
  670. package/server/api/workshop/channels/[id].delete.ts +18 -0
  671. package/server/api/workshop/channels.get.ts +11 -0
  672. package/server/api/workshop/channels.post.ts +48 -0
  673. package/server/api/workshop/daq/[id]/bind.post.ts +19 -0
  674. package/server/api/workshop/daq/[id]/samples.get.ts +22 -0
  675. package/server/api/workshop/daq/[id]/test.post.ts +17 -0
  676. package/server/api/workshop/daq/[id].delete.ts +30 -0
  677. package/server/api/workshop/daq/[id].patch.ts +31 -0
  678. package/server/api/workshop/daq/alarms/[id]/ack.post.ts +15 -0
  679. package/server/api/workshop/daq/alarms.get.ts +16 -0
  680. package/server/api/workshop/daq/controller.post.ts +52 -0
  681. package/server/api/workshop/daq/index.get.ts +40 -0
  682. package/server/api/workshop/daq/index.post.ts +33 -0
  683. package/server/api/workshop/daq/infra/reconnect.post.ts +17 -0
  684. package/server/api/workshop/daq/infra.get.ts +11 -0
  685. package/server/api/workshop/daq/templates/[key].delete.ts +17 -0
  686. package/server/api/workshop/daq/templates/[key].patch.ts +18 -0
  687. package/server/api/workshop/daq/templates/index.post.ts +17 -0
  688. package/server/api/workshop/daq/test-driver.post.ts +23 -0
  689. package/server/api/workshop/dcw/[id]/bind.post.ts +17 -0
  690. package/server/api/workshop/dcw/[id]/param-ledger.get.ts +15 -0
  691. package/server/api/workshop/dcw/[id]/test.post.ts +15 -0
  692. package/server/api/workshop/dcw/[id]/write.post.ts +19 -0
  693. package/server/api/workshop/dcw/[id].delete.ts +30 -0
  694. package/server/api/workshop/dcw/[id].patch.ts +18 -0
  695. package/server/api/workshop/dcw/controller.post.ts +43 -0
  696. package/server/api/workshop/dcw/index.get.ts +25 -0
  697. package/server/api/workshop/dcw/index.post.ts +20 -0
  698. package/server/api/workshop/dcw/journal/index.get.ts +21 -0
  699. package/server/api/workshop/dcw/journal/node/[nodeId]/rollback.post.ts +22 -0
  700. package/server/api/workshop/dcw/line/query.get.ts +31 -0
  701. package/server/api/workshop/dcw/lines/[id]/start.post.ts +35 -0
  702. package/server/api/workshop/dcw/lines/[id]/stop.post.ts +34 -0
  703. package/server/api/workshop/dcw/lines/[id].delete.ts +35 -0
  704. package/server/api/workshop/dcw/lines/[id].patch.ts +15 -0
  705. package/server/api/workshop/dcw/lines/index.get.ts +14 -0
  706. package/server/api/workshop/dcw/lines/index.post.ts +31 -0
  707. package/server/api/workshop/dcw/optimizations/[id]/judge.post.ts +24 -0
  708. package/server/api/workshop/dcw/optimizations/[id]/rollback.post.ts +29 -0
  709. package/server/api/workshop/dcw/optimizations/[id]/series.get.ts +18 -0
  710. package/server/api/workshop/dcw/optimizations/[id].get.ts +17 -0
  711. package/server/api/workshop/dcw/optimizations/index.get.ts +23 -0
  712. package/server/api/workshop/dcw/products/[id].delete.ts +16 -0
  713. package/server/api/workshop/dcw/products/[id].patch.ts +17 -0
  714. package/server/api/workshop/dcw/products/index.post.ts +16 -0
  715. package/server/api/workshop/dcw/recipes/[id]/apply.post.ts +40 -0
  716. package/server/api/workshop/dcw/recipes/[id]/mark-good.post.ts +21 -0
  717. package/server/api/workshop/dcw/recipes/[id]/rollback-good.post.ts +19 -0
  718. package/server/api/workshop/dcw/recipes/[id].delete.ts +14 -0
  719. package/server/api/workshop/dcw/recipes/[id].patch.ts +16 -0
  720. package/server/api/workshop/dcw/recipes/index.get.ts +12 -0
  721. package/server/api/workshop/dcw/recipes/index.post.ts +15 -0
  722. package/server/api/workshop/dcw/runs/[id]/close.post.ts +15 -0
  723. package/server/api/workshop/dcw/runs/[id]/data.get.ts +15 -0
  724. package/server/api/workshop/dcw/runs/[id]/rollback.post.ts +20 -0
  725. package/server/api/workshop/dcw/runs/index.get.ts +11 -0
  726. package/server/api/workshop/dcw/templates/[key].delete.ts +14 -0
  727. package/server/api/workshop/dcw/templates/[key].patch.ts +16 -0
  728. package/server/api/workshop/dcw/templates/index.post.ts +15 -0
  729. package/server/api/workshop/dcw/test-driver.post.ts +16 -0
  730. package/server/api/workshop/device-twins/[id]/control.post.ts +21 -0
  731. package/server/api/workshop/device-twins/[id]/telemetry.post.ts +21 -0
  732. package/server/api/workshop/device-twins/[id].delete.ts +25 -0
  733. package/server/api/workshop/device-twins/[id].patch.ts +29 -0
  734. package/server/api/workshop/device-twins/index.get.ts +16 -0
  735. package/server/api/workshop/device-twins/index.post.ts +32 -0
  736. package/server/api/workshop/fs/dirs.get.ts +40 -0
  737. package/server/api/workshop/mailbox/all.get.ts +19 -0
  738. package/server/api/workshop/mailbox.get.ts +14 -0
  739. package/server/api/workshop/memories/maintenance.post.ts +15 -0
  740. package/server/api/workshop/ops-logs/index.get.ts +30 -0
  741. package/server/api/workshop/ops-logs/index.post.ts +39 -0
  742. package/server/api/workshop/runtime.get.ts +11 -0
  743. package/server/api/workshop/scene/layouts/[channelId].delete.ts +23 -0
  744. package/server/api/workshop/scene/layouts/[channelId].put.ts +31 -0
  745. package/server/api/workshop/scene/layouts.get.ts +13 -0
  746. package/server/api/workshop/tasks/[id]/cancel/index.post.ts +34 -0
  747. package/server/api/workshop/tasks/[id]/complete.post.ts +32 -0
  748. package/server/api/workshop/tasks/[id]/dispatch.post.ts +30 -0
  749. package/server/api/workshop/tasks/[id]/report.post.ts +38 -0
  750. package/server/api/workshop/tasks/[id]/retry.post.ts +33 -0
  751. package/server/api/workshop/tasks/[id].get.ts +32 -0
  752. package/server/api/workshop/tasks.get.ts +13 -0
  753. package/server/api/workshop/teams/[id]/deploy.post.ts +40 -0
  754. package/server/api/workshop/teams/[id]/members/[agentId].delete.ts +19 -0
  755. package/server/api/workshop/teams/[id]/members/index.get.ts +19 -0
  756. package/server/api/workshop/teams/[id]/members/index.post.ts +32 -0
  757. package/server/api/workshop/teams/[id].delete.ts +20 -0
  758. package/server/api/workshop/teams/[id].get.ts +19 -0
  759. package/server/api/workshop/teams/[id].patch.ts +32 -0
  760. package/server/api/workshop/teams/index.get.ts +13 -0
  761. package/server/api/workshop/teams/index.post.ts +27 -0
  762. package/server/api/workshop/users/me.get.ts +23 -0
  763. package/server/api/workshop/users/register.post.ts +33 -0
  764. package/server/api/workshop/workspaces/[id]/channel-templates/[tplId].post.ts +31 -0
  765. package/server/api/workshop/workspaces/[id]/channels/[channelId].delete.ts +15 -0
  766. package/server/api/workshop/workspaces/[id]/channels/[channelId].post.ts +15 -0
  767. package/server/api/workshop/workspaces/[id]/index.delete.ts +14 -0
  768. package/server/api/workshop/workspaces/index.get.ts +11 -0
  769. package/server/api/workshop/workspaces/index.post.ts +17 -0
  770. package/server/api/workshop/ws.ts +694 -0
  771. package/server/data/agent-node-bindings.json +554 -0
  772. package/server/data/daq-templates.json +16 -0
  773. package/server/data/daqs.json +2680 -0
  774. package/server/data/dcw-lines.json +919 -0
  775. package/server/data/dcw-products.json +835 -0
  776. package/server/data/dcw-recipes.json +1650 -0
  777. package/server/data/dcw-rollback.json +9339 -0
  778. package/server/data/dcw-runs.json +4633 -0
  779. package/server/data/dcw-templates.json +26 -0
  780. package/server/data/dcw-writes.json +9770 -0
  781. package/server/data/dcws.json +1736 -0
  782. package/server/data/device-twins.json +133 -0
  783. package/server/data/line-runs.json +152 -0
  784. package/server/data/scene-layouts.json +200 -0
  785. package/server/mcp/workshop-server.ts +510 -0
  786. package/server/middleware/request-log.ts +15 -0
  787. package/server/plugins/backup.ts +85 -0
  788. package/server/plugins/daq.ts +65 -0
  789. package/server/plugins/dev-stability-guard.ts +42 -0
  790. package/server/plugins/security.ts +29 -0
  791. package/server/plugins/system-config.ts +38 -0
  792. package/server/plugins/workshop.ts +145 -0
  793. package/server/repositories/user.repository.ts +391 -0
  794. package/server/schemas/user.schema.ts +67 -0
  795. package/server/services/system-config.ts +356 -0
  796. package/server/services/user.service.ts +186 -0
  797. package/server/services/workshop/agents/adapters/omp-rpc-client.ts +539 -0
  798. package/server/services/workshop/agents/adapters/to-a2a.ts +40 -0
  799. package/server/services/workshop/agents/agent-interface.ts +219 -0
  800. package/server/services/workshop/agents/claude-agent.ts +47 -0
  801. package/server/services/workshop/agents/factory.ts +24 -0
  802. package/server/services/workshop/agents/harness-process.ts +158 -0
  803. package/server/services/workshop/agents/harness-terminal.ts +545 -0
  804. package/server/services/workshop/agents/industrial-context.ts +222 -0
  805. package/server/services/workshop/agents/industrial-tools.ts +362 -0
  806. package/server/services/workshop/agents/mock-agent.ts +396 -0
  807. package/server/services/workshop/agents/node-bindings.repo.ts +165 -0
  808. package/server/services/workshop/agents/omp-agent.ts +1598 -0
  809. package/server/services/workshop/agents/tool-approvals.ts +174 -0
  810. package/server/services/workshop/assets/character-asset.repo.ts +120 -0
  811. package/server/services/workshop/assets/device-twin.repo.ts +236 -0
  812. package/server/services/workshop/daq/alarm-notify.ts +100 -0
  813. package/server/services/workshop/daq/bus/index.ts +46 -0
  814. package/server/services/workshop/daq/bus/inproc.adapter.ts +62 -0
  815. package/server/services/workshop/daq/bus/mqtt.adapter.ts +112 -0
  816. package/server/services/workshop/daq/bus/queue-port.ts +36 -0
  817. package/server/services/workshop/daq/daq-controller.ts +778 -0
  818. package/server/services/workshop/daq/daq-node.repo.ts +96 -0
  819. package/server/services/workshop/daq/daq-node.ts +247 -0
  820. package/server/services/workshop/daq/daq-runtime.ts +168 -0
  821. package/server/services/workshop/daq/daq-templates.ts +157 -0
  822. package/server/services/workshop/daq/drivers.ts +771 -0
  823. package/server/services/workshop/daq/host-bindings.ts +71 -0
  824. package/server/services/workshop/daq/host-ports.ts +64 -0
  825. package/server/services/workshop/daq/infra.ts +202 -0
  826. package/server/services/workshop/daq/storage/index.ts +96 -0
  827. package/server/services/workshop/daq/storage/sqlite.adapter.ts +205 -0
  828. package/server/services/workshop/daq/storage/timescale.adapter.ts +185 -0
  829. package/server/services/workshop/daq/storage/tsdb-port.ts +74 -0
  830. package/server/services/workshop/db/agent.repo.ts +105 -0
  831. package/server/services/workshop/db/channel-agent.repo.ts +119 -0
  832. package/server/services/workshop/db/channel-event.repo.ts +154 -0
  833. package/server/services/workshop/db/channel-template.repo.ts +113 -0
  834. package/server/services/workshop/db/channel.repo.ts +101 -0
  835. package/server/services/workshop/db/database.ts +934 -0
  836. package/server/services/workshop/db/memory.repo.ts +249 -0
  837. package/server/services/workshop/db/message.repo.ts +149 -0
  838. package/server/services/workshop/db/ops.repo.ts +323 -0
  839. package/server/services/workshop/db/schema.sql +143 -0
  840. package/server/services/workshop/db/subscription.repo.ts +62 -0
  841. package/server/services/workshop/db/task.repo.ts +175 -0
  842. package/server/services/workshop/db/team-member.repo.ts +70 -0
  843. package/server/services/workshop/db/team.repo.ts +109 -0
  844. package/server/services/workshop/db/user.repo.ts +100 -0
  845. package/server/services/workshop/dcw/dcw-controller.ts +841 -0
  846. package/server/services/workshop/dcw/dcw-line.repo.ts +86 -0
  847. package/server/services/workshop/dcw/dcw-node.repo.ts +89 -0
  848. package/server/services/workshop/dcw/dcw-node.ts +200 -0
  849. package/server/services/workshop/dcw/dcw-product.repo.ts +95 -0
  850. package/server/services/workshop/dcw/dcw-recipe.repo.ts +349 -0
  851. package/server/services/workshop/dcw/dcw-runtime.ts +82 -0
  852. package/server/services/workshop/dcw/dcw-templates.ts +138 -0
  853. package/server/services/workshop/dcw/drivers.ts +523 -0
  854. package/server/services/workshop/dcw/line-run.ts +101 -0
  855. package/server/services/workshop/dcw/recipe-rollback-manager.ts +702 -0
  856. package/server/services/workshop/dcw/recipe-rollback.repo.ts +197 -0
  857. package/server/services/workshop/logger.ts +58 -0
  858. package/server/services/workshop/ops/ops.ts +78 -0
  859. package/server/services/workshop/prompts/loader.ts +112 -0
  860. package/server/services/workshop/runtime/agent-runtime.ts +698 -0
  861. package/server/services/workshop/runtime/channel-runtime.ts +202 -0
  862. package/server/services/workshop/runtime/embedding-provider.ts +79 -0
  863. package/server/services/workshop/runtime/execution-mode.ts +215 -0
  864. package/server/services/workshop/runtime/mailbox.ts +148 -0
  865. package/server/services/workshop/runtime/manager.ts +2543 -0
  866. package/server/services/workshop/runtime/memory.ts +439 -0
  867. package/server/services/workshop/runtime/monitor.ts +194 -0
  868. package/server/services/workshop/runtime/scheduler-loop.ts +773 -0
  869. package/server/services/workshop/runtime/task-engine.ts +574 -0
  870. package/server/services/workshop/scene/scene-layout.repo.ts +112 -0
  871. package/server/services/workshop/scene-events.ts +63 -0
  872. package/server/services/workshop/types/a2a.ts +61 -0
  873. package/server/services/workshop/types/task.ts +85 -0
  874. package/server/types/user.ts +53 -0
  875. package/server/utils/approval-gate.ts +67 -0
  876. package/server/utils/auth.ts +13 -0
  877. package/server/utils/config.ts +40 -0
  878. package/server/utils/errors.ts +24 -0
  879. package/server/utils/response.ts +49 -0
  880. package/server/utils/validate.ts +19 -0
  881. package/shared/config/engine.d.mts +41 -0
  882. package/shared/config/engine.mjs +291 -0
  883. package/shared/config/home.d.mts +48 -0
  884. package/shared/config/home.mjs +146 -0
  885. package/shared/config/schema.json +30 -0
  886. package/shared/daq-protocol.ts +361 -0
  887. package/shared/dcw-protocol.ts +576 -0
  888. package/shared/terminal-protocol.ts +70 -0
  889. package/shared/town-anim.ts +56 -0
  890. package/shared/town-behavior.ts +136 -0
  891. package/shared/town-protocol.ts +110 -0
  892. package/shared/town-scene-math.ts +283 -0
  893. package/shared/workshop-protocol.ts +199 -0
  894. package/tsconfig.json +10 -0
  895. package/uno.config.ts +37 -0
@@ -0,0 +1,185 @@
1
+ /**
2
+ * TimescaleAdapter —— 生产级 TimescaleDB 实现(端口契约见 tsdb-port)。
3
+ *
4
+ * 由 DAQ_TSDB_URL(postgres://user:pass@host:5432/db)启用。首次 init 幂等建表
5
+ * 并调用 create_hypertable(ts 列,chunk 按天);写走参数化批量 INSERT,
6
+ * 读按 time_bucket 降采样(Timescale 原生函数)。连接失败由工厂捕获降级仿真库。
7
+ */
8
+ import { createRequire } from 'node:module'
9
+ import type { Pool } from 'pg'
10
+ import type { DaqQueryOpts, DaqSampleRow, TsdbPoint, TsdbPort } from './tsdb-port'
11
+
12
+ /* nitro(Windows)dev 下对 external 的动态 import 会生成绝对盘符路径 → ESM loader
13
+ * 拒绝 'd:' scheme;用 createRequire 走 CJS require 由 Node 原生解析(生产亦同)。 */
14
+ const requirePg = createRequire(import.meta.url)
15
+
16
+ export class TimescaleAdapter implements TsdbPort {
17
+ readonly backend = 'timescale'
18
+ private pool: Pool | null = null
19
+ private retentionTimer: NodeJS.Timeout | null = null
20
+ /** 保留期(默认 7 天,DAQ_TS_RETENTION_H 可调) */
21
+ private readonly retentionH = Number(process.env.DAQ_TS_RETENTION_H ?? 168)
22
+
23
+ constructor(private readonly url: string) {}
24
+
25
+ async init(): Promise<void> {
26
+ const mod = requirePg('pg') as typeof import('pg')
27
+ this.pool = new mod.Pool({ connectionString: this.url, max: 4 })
28
+ await this.pool.query(`
29
+ CREATE TABLE IF NOT EXISTS daq_samples (
30
+ node_id text NOT NULL,
31
+ ts timestamptz NOT NULL,
32
+ value double precision NOT NULL,
33
+ state text NOT NULL DEFAULT 'ok',
34
+ PRIMARY KEY (node_id, ts)
35
+ );
36
+ `)
37
+ // hypertable 幂等创建(未装 timescaledb 扩展时报错 → 由工厂降级)
38
+ await this.pool.query(
39
+ `SELECT create_hypertable('daq_samples', 'ts', if_not_exists => TRUE, migrate_data => TRUE)`,
40
+ )
41
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_daq_samples_node_ts ON daq_samples (node_id, ts DESC)`)
42
+ // 存量库迁移:先补打标列(幂等;已存在时报错吞掉),再建依赖列的索引
43
+ for (const ddl of [
44
+ 'ALTER TABLE daq_samples ADD COLUMN IF NOT EXISTS line_id text',
45
+ 'ALTER TABLE daq_samples ADD COLUMN IF NOT EXISTS product_id text',
46
+ 'ALTER TABLE daq_samples ADD COLUMN IF NOT EXISTS recipe_id text',
47
+ 'ALTER TABLE daq_samples ADD COLUMN IF NOT EXISTS run_id text',
48
+ ]) {
49
+ await this.pool.query(ddl).catch(() => {})
50
+ }
51
+ await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_daq_samples_tag ON daq_samples (product_id, recipe_id, ts DESC)`).catch(() => {})
52
+ // 保留期:drop_chunks 周期执行(30min;未装扩展时静默跳过)
53
+ void this.sweepRetention()
54
+ if (!this.retentionTimer) {
55
+ this.retentionTimer = setInterval(() => void this.sweepRetention(), 30 * 60_000)
56
+ this.retentionTimer.unref?.()
57
+ }
58
+ }
59
+
60
+ private async sweepRetention(): Promise<void> {
61
+ if (!this.pool) return
62
+ try {
63
+ await this.pool.query(
64
+ `SELECT drop_chunks('daq_samples', older_than => now() - ($1 || ' hours')::interval)`,
65
+ [this.retentionH],
66
+ )
67
+ }
68
+ catch { /* 非 hypertable(扩展缺失)→ 静默 */ }
69
+ }
70
+
71
+ async close(): Promise<void> {
72
+ if (this.retentionTimer) {
73
+ clearInterval(this.retentionTimer)
74
+ this.retentionTimer = null
75
+ }
76
+ await this.pool?.end().catch(() => {})
77
+ this.pool = null
78
+ }
79
+
80
+ async writeSamples(rows: DaqSampleRow[]): Promise<void> {
81
+ if (!this.pool || rows.length === 0) return
82
+ const values: unknown[] = []
83
+ const tuples = rows.map((r, i) => {
84
+ values.push(r.nodeId, new Date(r.tsMs).toISOString(), r.value, r.state, r.lineId ?? null, r.productId ?? null, r.recipeId ?? null, r.runId ?? null)
85
+ const b = i * 8
86
+ return `($${b + 1}, $${b + 2}, $${b + 3}, $${b + 4}, $${b + 5}, $${b + 6}, $${b + 7}, $${b + 8})`
87
+ })
88
+ await this.pool.query(
89
+ `INSERT INTO daq_samples (node_id, ts, value, state, line_id, product_id, recipe_id, run_id) VALUES ${tuples.join(',')}
90
+ ON CONFLICT (node_id, ts) DO NOTHING`,
91
+ values,
92
+ )
93
+ }
94
+
95
+ async query(nodeId: string, opts: DaqQueryOpts): Promise<TsdbPoint[]> {
96
+ if (!this.pool) return []
97
+ const limit = Math.min(opts.limit ?? 500, 5000)
98
+ if (opts.bucketMs && opts.bucketMs >= 100) {
99
+ const { rows } = await this.pool.query(
100
+ `SELECT time_bucket($1::interval, ts) AS bucket,
101
+ avg(value)::double precision AS avg, min(value) AS min, max(value) AS max, count(*) AS cnt
102
+ FROM daq_samples WHERE node_id = $2 AND ts >= $3 AND ts <= $4
103
+ GROUP BY bucket ORDER BY bucket DESC LIMIT $5`,
104
+ [`${opts.bucketMs} milliseconds`, nodeId, new Date(opts.fromMs ?? 0).toISOString(), new Date(opts.toMs ?? Date.now()).toISOString(), limit],
105
+ )
106
+ return rows.map(r => ({ at: Date.parse(r.bucket), avg: Number(r.avg), min: Number(r.min), max: Number(r.max), cnt: Number(r.cnt) }))
107
+ }
108
+ const { rows } = await this.pool.query(
109
+ `SELECT ts, value, state FROM daq_samples WHERE node_id = $1 AND ts >= $2 AND ts <= $3
110
+ ORDER BY ts DESC LIMIT $4`,
111
+ [nodeId, new Date(opts.fromMs ?? 0).toISOString(), new Date(opts.toMs ?? Date.now()).toISOString(), limit],
112
+ )
113
+ return rows.map(r => ({ at: Date.parse(r.ts), value: Number(r.value), state: String(r.state) }))
114
+ }
115
+
116
+ async queryTagged(q: import('./tsdb-port').TsdbTagQuery): Promise<Map<string, import('./tsdb-port').TsdbPoint[]>> {
117
+ const out = new Map<string, import('./tsdb-port').TsdbPoint[]>()
118
+ if (!this.pool) return out
119
+ const where: string[] = []
120
+ const params: unknown[] = []
121
+ if (q.lineId) {
122
+ where.push(`line_id = $${params.length + 1}`)
123
+ params.push(q.lineId)
124
+ }
125
+ if (q.productId) {
126
+ where.push(`product_id = $${params.length + 1}`)
127
+ params.push(q.productId)
128
+ }
129
+ if (q.recipeId) {
130
+ where.push(`recipe_id = $${params.length + 1}`)
131
+ params.push(q.recipeId)
132
+ }
133
+ if (q.runId) {
134
+ where.push(`run_id = $${params.length + 1}`)
135
+ params.push(q.runId)
136
+ }
137
+ if (q.nodeIds?.length) {
138
+ where.push(`node_id = ANY($${params.length + 1})`)
139
+ params.push(q.nodeIds)
140
+ }
141
+ where.push(`ts >= $${params.length + 1}`)
142
+ params.push(new Date(q.fromMs ?? 0).toISOString())
143
+ where.push(`ts <= $${params.length + 1}`)
144
+ params.push(new Date(q.toMs ?? Date.now()).toISOString())
145
+ const limit = Math.min(q.limit ?? 2000, 10_000)
146
+ const whereSql = where.join(' AND ')
147
+ if (q.bucketMs && q.bucketMs >= 100) {
148
+ const { rows } = await this.pool.query(
149
+ `SELECT node_id, time_bucket($${params.length + 1}::interval, ts) AS b_at,
150
+ avg(value)::double precision AS avg, min(value) AS min, max(value) AS max, count(*) AS cnt
151
+ FROM daq_samples WHERE ${whereSql}
152
+ GROUP BY node_id, b_at ORDER BY b_at ASC LIMIT $${params.length + 2}`,
153
+ [...params, `${q.bucketMs} milliseconds`, limit],
154
+ )
155
+ for (const r of rows as Array<{ node_id: string, b_at: string, avg: string, min: string, max: string, cnt: string }>) {
156
+ const list = out.get(String(r.node_id)) ?? []
157
+ list.push({ at: Date.parse(r.b_at), avg: Number(r.avg), min: Number(r.min), max: Number(r.max), cnt: Number(r.cnt) })
158
+ out.set(String(r.node_id), list)
159
+ }
160
+ return out
161
+ }
162
+ const { rows } = await this.pool.query(
163
+ `SELECT node_id, ts, value FROM daq_samples WHERE ${whereSql} ORDER BY ts ASC LIMIT $${params.length + 1}`,
164
+ [...params, limit],
165
+ )
166
+ for (const r of rows as Array<{ node_id: string, ts: string, value: number }>) {
167
+ const list = out.get(String(r.node_id)) ?? []
168
+ list.push({ at: Date.parse(r.ts), value: Number(r.value) })
169
+ out.set(String(r.node_id), list)
170
+ }
171
+ return out
172
+ }
173
+
174
+ async latest(): Promise<Map<string, DaqSampleRow>> {
175
+ const out = new Map<string, DaqSampleRow>()
176
+ if (!this.pool) return out
177
+ const { rows } = await this.pool.query(
178
+ `SELECT DISTINCT ON (node_id) node_id, ts, value, state FROM daq_samples ORDER BY node_id, ts DESC`,
179
+ )
180
+ for (const r of rows) {
181
+ out.set(String(r.node_id), { nodeId: String(r.node_id), tsMs: Date.parse(r.ts), value: Number(r.value), state: String(r.state) })
182
+ }
183
+ return out
184
+ }
185
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * TsdbPort —— 时序数据库端口(hexagonal seam)。
3
+ *
4
+ * 数采读数的唯一持久化出口;采集管线只依赖此接口:
5
+ * 采集(生产者) → MQTT 队列 → 消费者 → writeSamples() 落时序库
6
+ * ↘ query()/latest() → 前端历史/图表
7
+ *
8
+ * 实现:
9
+ * - timescale.adapter —— 生产级 TimescaleDB(PostgreSQL + timescaledb 扩展),
10
+ * 由环境变量 DAQ_TSDB_URL(postgres://…)启用;自动建表 + create_hypertable。
11
+ * - sqlite.adapter —— 开发仿真:同一契约落在本地 SQLite(WAL),结构对齐
12
+ * 时序语义(ts_ms 主键、按段聚合)。缺省后端,保证 mock 环境全链路可跑。
13
+ */
14
+
15
+ export interface DaqSampleRow {
16
+ nodeId: string
17
+ /** epoch 毫秒(内部统一时间轴) */
18
+ tsMs: number
19
+ value: number
20
+ state: string
21
+ /** 产线批次打标(活动 LineRun 窗口内的样本逐条携带;null = 线体空闲段) */
22
+ lineId?: string | null
23
+ productId?: string | null
24
+ recipeId?: string | null
25
+ runId?: string | null
26
+ }
27
+
28
+ export interface DaqQueryOpts {
29
+ fromMs?: number
30
+ toMs?: number
31
+ /** 降采样桶宽(ms);给出则返回桶聚合(avg/min/max/cnt) */
32
+ bucketMs?: number
33
+ /** 原始点上限(降采样模式下为桶数上限) */
34
+ limit?: number
35
+ }
36
+
37
+ /** 原始点(raw)或桶聚合(bucket)两种形态 */
38
+ export interface TsdbPoint {
39
+ at: number
40
+ value?: number
41
+ avg?: number
42
+ min?: number
43
+ max?: number
44
+ cnt?: number
45
+ state?: string
46
+ }
47
+
48
+ /** 跨通道打标查询(产线数据隔离:产品/配方/批次/通道/时间/桶) */
49
+ export interface TsdbTagQuery {
50
+ lineId?: string
51
+ productId?: string
52
+ recipeId?: string
53
+ runId?: string
54
+ /** 限定通道(缺省全部) */
55
+ nodeIds?: string[]
56
+ fromMs?: number
57
+ toMs?: number
58
+ bucketMs?: number
59
+ limit?: number
60
+ }
61
+
62
+ export interface TsdbPort {
63
+ /** 后端标识(sqlite-emulated | timescale)——REST meta 直报前端 */
64
+ readonly backend: string
65
+ init(): Promise<void>
66
+ writeSamples(rows: DaqSampleRow[]): Promise<void>
67
+ query(nodeId: string, opts: DaqQueryOpts): Promise<TsdbPoint[]>
68
+ /** 按产线打标跨通道查询(产品/配方隔离) */
69
+ queryTagged(q: TsdbTagQuery): Promise<Map<string, TsdbPoint[]>>
70
+ /** 各节点最近一个样本(列表页值列兜底) */
71
+ latest(): Promise<Map<string, DaqSampleRow>>
72
+ /** 释放底层连接池/句柄(rebuild 换池时由工厂调用;可选) */
73
+ close?(): Promise<void> | void
74
+ }
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Agent 仓储:agents 表 CRUD(全局 Agent 元数据定义,无 channel 绑定)。
3
+ * Channel 成员关系见 channel-agent.repo.ts。
4
+ * 工厂接收 DatabaseSync(依赖注入),不持有任何单例。
5
+ * 可见性(v10):private 仅属主可见;public 全员可读可用;owner NULL = 内置(恒 public,不可变更)。
6
+ */
7
+ import { randomUUID } from 'node:crypto'
8
+ import type { DatabaseSync } from 'node:sqlite'
9
+ import type { AgentRow } from './database'
10
+
11
+ const COLS = 'id, name, harness, config_json AS configJson, enabled, visibility, owner_user_id AS ownerUserId, created_at AS createdAt, updated_at AS updatedAt'
12
+
13
+ export interface AgentCreateInput {
14
+ name: string
15
+ harness: string
16
+ config?: Record<string, unknown>
17
+ /** 可见性(缺省 private) */
18
+ visibility?: string
19
+ /** 归属用户(null = 内置公共) */
20
+ ownerUserId?: string | null
21
+ }
22
+
23
+ export interface AgentPatch {
24
+ name?: string
25
+ harness?: string
26
+ config?: Record<string, unknown>
27
+ enabled?: number
28
+ visibility?: string
29
+ }
30
+
31
+ export type AgentRepo = ReturnType<typeof createAgentRepo>
32
+
33
+ export function createAgentRepo(db: DatabaseSync) {
34
+ const insert = db.prepare(
35
+ `INSERT INTO agents (id, name, harness, config_json, enabled, visibility, owner_user_id, created_at, updated_at)
36
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
37
+ )
38
+ const selectAll = db.prepare(`SELECT ${COLS} FROM agents ORDER BY createdAt ASC`)
39
+ const selectByOwner = db.prepare(`SELECT ${COLS} FROM agents WHERE owner_user_id = ? OR owner_user_id IS NULL ORDER BY createdAt ASC`)
40
+ const selectVisible = db.prepare(`SELECT ${COLS} FROM agents WHERE owner_user_id = ? OR visibility = 'public' ORDER BY createdAt ASC`)
41
+ const selectById = db.prepare(`SELECT ${COLS} FROM agents WHERE id = ?`)
42
+ const updateStmt = db.prepare(
43
+ `UPDATE agents SET name = ?, harness = ?, config_json = ?, enabled = ?, visibility = ?, updated_at = ? WHERE id = ?`,
44
+ )
45
+ const removeStmt = db.prepare(`DELETE FROM agents WHERE id = ?`)
46
+
47
+ return {
48
+ /** 创建 agent 定义(config 缺省 {};visibility 缺省 private) */
49
+ create(input: AgentCreateInput): AgentRow {
50
+ const now = new Date().toISOString()
51
+ const row: AgentRow = {
52
+ id: randomUUID(),
53
+ name: input.name,
54
+ harness: input.harness,
55
+ configJson: JSON.stringify(input.config ?? {}),
56
+ enabled: 1,
57
+ visibility: input.visibility ?? 'private',
58
+ ownerUserId: input.ownerUserId ?? null,
59
+ createdAt: now,
60
+ updatedAt: now,
61
+ }
62
+ insert.run(row.id, row.name, row.harness, row.configJson, row.enabled, row.visibility, row.ownerUserId, row.createdAt, row.updatedAt)
63
+ return row
64
+ },
65
+
66
+ list(): AgentRow[] {
67
+ return selectAll.all() as unknown as AgentRow[]
68
+ },
69
+
70
+ /** 按 owner 过滤(含 NULL 内置公共行) */
71
+ listForOwner(ownerUserId: string): AgentRow[] {
72
+ return selectByOwner.all(ownerUserId) as unknown as AgentRow[]
73
+ },
74
+
75
+ /** 用户可见集:本人(任意可见性)+ 全部 public(含内置) */
76
+ listVisible(userId: string): AgentRow[] {
77
+ return selectVisible.all(userId) as unknown as AgentRow[]
78
+ },
79
+
80
+ findById(id: string): AgentRow | undefined {
81
+ return selectById.get(id) as unknown as AgentRow | undefined
82
+ },
83
+
84
+ /** 局部更新;config 提供时重新序列化;未命中返回 undefined */
85
+ update(id: string, patch: AgentPatch): AgentRow | undefined {
86
+ const current = selectById.get(id) as unknown as AgentRow | undefined
87
+ if (!current) return undefined
88
+ const next: AgentRow = {
89
+ ...current,
90
+ name: patch.name ?? current.name,
91
+ harness: patch.harness ?? current.harness,
92
+ configJson: patch.config !== undefined ? JSON.stringify(patch.config) : current.configJson,
93
+ enabled: patch.enabled ?? current.enabled,
94
+ visibility: patch.visibility ?? current.visibility,
95
+ updatedAt: new Date().toISOString(),
96
+ }
97
+ updateStmt.run(next.name, next.harness, next.configJson, next.enabled, next.visibility, next.updatedAt, id)
98
+ return next
99
+ },
100
+
101
+ remove(id: string): void {
102
+ removeStmt.run(id)
103
+ },
104
+ }
105
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * ChannelAgent 仓储:channel_agents 表(Channel 中的 Agent 实例)。
3
+ * 每次把 Agent 模板放入 channel 都创建一个全新实例:独立身份 id + 复制自模板的
4
+ * name/harness/config + 独立 role + token。
5
+ * 工厂接收 DatabaseSync(依赖注入),不持有任何单例。
6
+ */
7
+ import { randomUUID } from 'node:crypto'
8
+ import type { DatabaseSync } from 'node:sqlite'
9
+ import type { ChannelAgentRow } from './database'
10
+
11
+ export interface ChannelAgentCreateInput {
12
+ channelId: string
13
+ templateId: string | null
14
+ name: string
15
+ harness: string
16
+ config?: Record<string, unknown>
17
+ role: 'lead' | 'worker'
18
+ token?: string
19
+ }
20
+
21
+ export interface ChannelAgentPatch {
22
+ name?: string
23
+ harness?: string
24
+ config?: Record<string, unknown>
25
+ role?: 'lead' | 'worker'
26
+ enabled?: number
27
+ }
28
+
29
+ export type ChannelAgentRepo = ReturnType<typeof createChannelAgentRepo>
30
+
31
+ const COLS
32
+ = 'id, channel_id AS channelId, template_id AS templateId, name, harness, config_json AS configJson, role, token, enabled, created_at AS createdAt, updated_at AS updatedAt'
33
+
34
+ export function createChannelAgentRepo(db: DatabaseSync) {
35
+ const insert = db.prepare(
36
+ `INSERT INTO channel_agents (id, channel_id, template_id, name, harness, config_json, role, token, enabled, created_at, updated_at)
37
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
38
+ )
39
+ const selectByChannel = db.prepare(`SELECT ${COLS} FROM channel_agents WHERE channel_id = ? ORDER BY created_at ASC`)
40
+ const selectById = db.prepare(`SELECT ${COLS} FROM channel_agents WHERE id = ?`)
41
+ const selectByChannelAgent = db.prepare(`SELECT ${COLS} FROM channel_agents WHERE channel_id = ? AND id = ?`)
42
+ const selectByToken = db.prepare(`SELECT ${COLS} FROM channel_agents WHERE token = ?`)
43
+ const selectByTemplate = db.prepare(`SELECT ${COLS} FROM channel_agents WHERE template_id = ? ORDER BY created_at ASC`)
44
+ const updateStmt = db.prepare(
45
+ `UPDATE channel_agents SET name = ?, harness = ?, config_json = ?, role = ?, enabled = ?, updated_at = ? WHERE id = ?`,
46
+ )
47
+ const removeStmt = db.prepare(`DELETE FROM channel_agents WHERE channel_id = ? AND id = ?`)
48
+
49
+ return {
50
+ /** 创建实例(独立身份 id;token 缺省自动生成 UUIDv4) */
51
+ create(input: ChannelAgentCreateInput): ChannelAgentRow {
52
+ const now = new Date().toISOString()
53
+ const row: ChannelAgentRow = {
54
+ id: randomUUID(),
55
+ channelId: input.channelId,
56
+ templateId: input.templateId,
57
+ name: input.name,
58
+ harness: input.harness,
59
+ configJson: JSON.stringify(input.config ?? {}),
60
+ role: input.role,
61
+ token: input.token ?? randomUUID(),
62
+ enabled: 1,
63
+ createdAt: now,
64
+ updatedAt: now,
65
+ }
66
+ insert.run(
67
+ row.id, row.channelId, row.templateId, row.name, row.harness, row.configJson, row.role, row.token, row.enabled, row.createdAt, row.updatedAt,
68
+ )
69
+ return row
70
+ },
71
+
72
+ /** channel 内全部实例 */
73
+ listByChannel(channelId: string): ChannelAgentRow[] {
74
+ return selectByChannel.all(channelId) as unknown as ChannelAgentRow[]
75
+ },
76
+
77
+ /** 按实例 id 查找 */
78
+ findById(id: string): ChannelAgentRow | undefined {
79
+ return selectById.get(id) as unknown as ChannelAgentRow | undefined
80
+ },
81
+
82
+ /** channel 内的某个实例 */
83
+ findByChannelAgent(channelId: string, id: string): ChannelAgentRow | undefined {
84
+ return selectByChannelAgent.get(channelId, id) as unknown as ChannelAgentRow | undefined
85
+ },
86
+
87
+ /** 实例级 token → 实例(MCP/REST caller 解析) */
88
+ findByToken(token: string): ChannelAgentRow | undefined {
89
+ return selectByToken.get(token) as unknown as ChannelAgentRow | undefined
90
+ },
91
+
92
+ /** 某模板克隆出的全部实例(跨 channel) */
93
+ listByTemplate(templateId: string): ChannelAgentRow[] {
94
+ return selectByTemplate.all(templateId) as unknown as ChannelAgentRow[]
95
+ },
96
+
97
+ /** 局部更新;config 提供时重新序列化;未命中返回 undefined */
98
+ update(id: string, patch: ChannelAgentPatch): ChannelAgentRow | undefined {
99
+ const current = selectById.get(id) as unknown as ChannelAgentRow | undefined
100
+ if (!current) return undefined
101
+ const next: ChannelAgentRow = {
102
+ ...current,
103
+ name: patch.name ?? current.name,
104
+ harness: patch.harness ?? current.harness,
105
+ configJson: patch.config !== undefined ? JSON.stringify(patch.config) : current.configJson,
106
+ role: patch.role ?? current.role,
107
+ enabled: patch.enabled ?? current.enabled,
108
+ updatedAt: new Date().toISOString(),
109
+ }
110
+ updateStmt.run(next.name, next.harness, next.configJson, next.role, next.enabled, next.updatedAt, id)
111
+ return next
112
+ },
113
+
114
+ /** 移除实例(仅删实例,不删模板) */
115
+ remove(channelId: string, id: string): void {
116
+ removeStmt.run(channelId, id)
117
+ },
118
+ }
119
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * ChannelEvent 仓储:AEP 事件持久化(channel_events)。
3
+ * hub publish 同步写入(server 驱动);时间线/lane 历史经 REST 拉取渲染,与 client 无关。
4
+ *
5
+ * 过滤查询(EventQueryOpts):lane 按需加载按 agent 维度拉取(避免单 agent 的
6
+ * 高频流式帧淹没全局 200 帧窗口);excludeTypes 剔除过程帧(agent.delta 的
7
+ * 打字机增量在历史回放里由落定 agent.message 携带全文,无需逐帧重放)。
8
+ */
9
+ import type { DatabaseSync, SQLInputValue } from 'node:sqlite'
10
+ import type { ChannelEventRow } from './database'
11
+
12
+ export interface StoredAepEvent {
13
+ seq: number
14
+ type: string
15
+ at: string
16
+ agentId: string | null
17
+ taskId: string | null
18
+ payload: unknown
19
+ }
20
+
21
+ /** 历史查询过滤(lane 按需加载 / 历史窗口提质) */
22
+ export interface EventQueryOpts {
23
+ /** 仅该 agent 的事件(a2a.message 归发送方,与 WS 信封 agentId 同口径) */
24
+ agentId?: string
25
+ /** 排除的事件类型(如 ['agent.delta']) */
26
+ excludeTypes?: readonly string[]
27
+ }
28
+
29
+ export type ChannelEventRepo = ReturnType<typeof createChannelEventRepo>
30
+
31
+ const COLS = `id, channel_id AS channelId, seq, type, at, agent_id AS agentId, task_id AS taskId, payload_json AS payloadJson`
32
+
33
+ export function createChannelEventRepo(db: DatabaseSync) {
34
+ const insertStmt = db.prepare(
35
+ `INSERT OR IGNORE INTO channel_events (channel_id, seq, type, at, agent_id, task_id, payload_json)
36
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
37
+ )
38
+ /** 动态条件语句缓存(opts 变体有限,按 SQL 文本缓存命中稳定) */
39
+ const stmtCache = new Map<string, ReturnType<DatabaseSync['prepare']>>()
40
+
41
+ /** WHERE 追加过滤(agentId / excludeTypes),返回 [sql片段, 绑定参数] */
42
+ const filterClause = (opts?: EventQueryOpts): [string, SQLInputValue[]] => {
43
+ let sql = ''
44
+ const params: SQLInputValue[] = []
45
+ if (opts?.agentId !== undefined) {
46
+ sql += ' AND agent_id = ?'
47
+ params.push(opts.agentId)
48
+ }
49
+ if (opts?.excludeTypes && opts.excludeTypes.length > 0) {
50
+ sql += ` AND type NOT IN (${opts.excludeTypes.map(() => '?').join(', ')})`
51
+ params.push(...opts.excludeTypes)
52
+ }
53
+ return [sql, params]
54
+ }
55
+
56
+ const select = (baseWhere: string, tail: string, baseParams: SQLInputValue[], tailParams: SQLInputValue[], opts?: EventQueryOpts) => {
57
+ const [filterSql, filterParams] = filterClause(opts)
58
+ const sql = `SELECT ${COLS} FROM channel_events WHERE ${baseWhere}${filterSql} ${tail}`
59
+ let stmt = stmtCache.get(sql)
60
+ if (!stmt) {
61
+ stmt = db.prepare(sql)
62
+ stmtCache.set(sql, stmt)
63
+ }
64
+ // 绑定顺序与 SQL 文本一致:WHERE 基础参数 → 过滤参数 → 排序/分页参数
65
+ return stmt.all(...baseParams, ...filterParams, ...tailParams) as unknown as ChannelEventRow[]
66
+ }
67
+
68
+ /** hub publish 同步写库(INSERT OR IGNORE:hub 内存 seq 与库重放幂等) */
69
+ function insert(channelId: string, e: StoredAepEvent): void {
70
+ insertStmt.run(channelId, e.seq, e.type, e.at, e.agentId, e.taskId, JSON.stringify(e.payload))
71
+ }
72
+
73
+ /** 批量写(单事务一次 fsync;hub 400ms 聚合缓冲的刷盘出口) */
74
+ function insertMany(channelId: string, events: StoredAepEvent[]): void {
75
+ if (events.length === 0) return
76
+ db.exec('BEGIN')
77
+ try {
78
+ for (const e of events) {
79
+ insertStmt.run(channelId, e.seq, e.type, e.at, e.agentId, e.taskId, JSON.stringify(e.payload))
80
+ }
81
+ db.exec('COMMIT')
82
+ }
83
+ catch (err) {
84
+ try {
85
+ db.exec('ROLLBACK')
86
+ }
87
+ catch { /* 事务已终结 */ }
88
+ throw err
89
+ }
90
+ }
91
+
92
+ /** 保留期清理:分批 DELETE(单批 5000 行,防长事务锁库);返回清理行数 */
93
+ function sweepRetention(retentionDays = 7): number {
94
+ const cutoff = new Date(Date.now() - retentionDays * 86_400_000).toISOString()
95
+ let removed = 0
96
+ for (;;) {
97
+ const r = db.prepare(
98
+ 'DELETE FROM channel_events WHERE rowid IN (SELECT rowid FROM channel_events WHERE at < ? LIMIT 5000)',
99
+ ).run(cutoff) as { changes: number | bigint }
100
+ const n = Number(r.changes)
101
+ removed += n
102
+ if (n < 5000) break
103
+ }
104
+ return removed
105
+ }
106
+
107
+ /** 最近 N 条(倒序取→正序返回,时间线顺序) */
108
+ function listRecent(channelId: string, limit: number, opts?: EventQueryOpts): StoredAepEvent[] {
109
+ return select('channel_id = ?', 'ORDER BY seq DESC LIMIT ?', [channelId], [limit], opts)
110
+ .map(rowToEvent)
111
+ .reverse()
112
+ }
113
+
114
+ /** 翻页:seq < beforeSeq 的最近 N 条(正序返回) */
115
+ function listBefore(channelId: string, beforeSeq: number, limit: number, opts?: EventQueryOpts): StoredAepEvent[] {
116
+ return select('channel_id = ? AND seq < ?', 'ORDER BY seq DESC LIMIT ?', [channelId, beforeSeq], [limit], opts)
117
+ .map(rowToEvent)
118
+ .reverse()
119
+ }
120
+
121
+ function maxSeq(channelId: string): number {
122
+ return ((db.prepare('SELECT MAX(seq) AS maxSeq FROM channel_events WHERE channel_id = ?')
123
+ .get(channelId) as { maxSeq: number | null } | undefined)?.maxSeq) ?? 0
124
+ }
125
+
126
+ function count(channelId: string, opts?: EventQueryOpts): number {
127
+ const [filterSql, filterParams] = filterClause(opts)
128
+ const sql = `SELECT COUNT(*) AS n FROM channel_events WHERE channel_id = ?${filterSql}`
129
+ let stmt = stmtCache.get(sql)
130
+ if (!stmt) {
131
+ stmt = db.prepare(sql)
132
+ stmtCache.set(sql, stmt)
133
+ }
134
+ return ((stmt.get(channelId, ...filterParams) as { n: number } | undefined)?.n) ?? 0
135
+ }
136
+
137
+ return { insert, insertMany, sweepRetention, listRecent, listBefore, maxSeq, count }
138
+ }
139
+
140
+ function rowToEvent(row: ChannelEventRow): StoredAepEvent {
141
+ let payload: unknown = null
142
+ try {
143
+ payload = JSON.parse(row.payloadJson)
144
+ }
145
+ catch { /* 损坏 payload 容错为 null */ }
146
+ return {
147
+ seq: row.seq,
148
+ type: row.type,
149
+ at: row.at,
150
+ agentId: row.agentId,
151
+ taskId: row.taskId,
152
+ payload,
153
+ }
154
+ }