agentworkshop 0.7.15 → 0.7.16

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 (33) hide show
  1. package/.AgentWorkShop/prompts/host-tools.json +819 -755
  2. package/.output/.AgentWorkShop/prompts/host-tools.json +819 -755
  3. package/.output/nitro.json +1 -1
  4. package/.output/public/_nuxt/builds/latest.json +1 -1
  5. package/.output/public/_nuxt/builds/meta/cf0a8831-4514-493d-ad5a-4e371a089ef9.json +1 -0
  6. package/.output/server/chunks/_/nitro.mjs +947 -787
  7. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  8. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs +1 -1
  9. package/.output/server/chunks/routes/api/workshop/dcw/index.post.mjs.map +1 -1
  10. package/.output/server/chunks/routes/api/workshop/index3.post.mjs +1 -1
  11. package/.output/server/chunks/routes/api/workshop/index3.post.mjs.map +1 -1
  12. package/.output/server/package.json +1 -1
  13. package/package.json +1 -1
  14. package/scripts/_dbg-opslog-agent-e2e.mjs +191 -0
  15. package/server/api/workshop/daq/index.post.ts +1 -1
  16. package/server/api/workshop/dcw/lines/index.post.ts +1 -1
  17. package/server/data/daqs.json +471 -61
  18. package/server/data/dcw-lines.json +49 -0
  19. package/server/data/dcw-products.json +49 -0
  20. package/server/data/dcw-recipes.json +64 -0
  21. package/server/data/dcw-rollback.json +239 -6
  22. package/server/data/dcw-runs.json +162 -142
  23. package/server/data/dcw-writes.json +132 -0
  24. package/server/data/dcws.json +363 -217
  25. package/server/data/line-runs.json +41 -11
  26. package/server/data/scene-layouts.json +11 -0
  27. package/server/plugins/workshop.ts +9 -0
  28. package/server/services/workshop/agents/agent-badge.ts +38 -0
  29. package/server/services/workshop/agents/host-tool-bridge.ts +622 -612
  30. package/server/services/workshop/agents/industrial-tools.ts +139 -4
  31. package/server/services/workshop/daq/drivers.ts +25 -5
  32. package/server/services/workshop/dcw/recipe-rollback-manager.ts +8 -6
  33. package/.output/public/_nuxt/builds/meta/65f6bed9-b794-44a4-805a-e22700c10817.json +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nitro.mjs","sources":["../../../../node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.node.mjs","../../../../node_modules/.pnpm/destr@2.0.5/node_modules/destr/dist/index.mjs","../../../../node_modules/.pnpm/ufo@1.6.4/node_modules/ufo/dist/index.mjs","../../../../node_modules/.pnpm/cookie-es@1.2.3/node_modules/cookie-es/dist/index.mjs","../../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../../../../node_modules/.pnpm/defu@6.1.7/node_modules/defu/dist/defu.mjs","../../../../node_modules/.pnpm/iron-webcrypto@1.2.1/node_modules/iron-webcrypto/dist/index.js","../../../../node_modules/.pnpm/node-mock-http@1.0.5/node_modules/node-mock-http/dist/index.mjs","../../../../node_modules/.pnpm/h3@1.15.11/node_modules/h3/dist/index.mjs","../../../../node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs","../../../../node_modules/.pnpm/node-fetch-native@1.6.7/node_modules/node-fetch-native/dist/native.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/node.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/dist/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/utils/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/fs-lite.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs","../../../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/crypto/node/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/dist/index.mjs","../../../../node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/route-rules-utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/plugins/oauth.js","../../../../node_modules/.pnpm/hookable@6.1.1/node_modules/hookable/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../server/utils/errors.ts","../../../../sdk/hooks.mjs","../../../../sdk/api.mjs","../../../../sdk/context.mjs","../../../../server/services/workshop/plugins/host.mjs","../../../../server/services/workshop/scene-events.ts","../../../../server/services/workshop/ops/ops.ts","../../../../server/utils/approval-gate.ts","../../../../server/utils/auth.ts","../../../../server/utils/config.ts","../../../../server/utils/response.ts","../../../../server/utils/validate.ts","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/utils/session.js","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/plugins/ws.js","../../../../shared/local-time.mjs","../../../../server/plugins/00-local-time.ts","../../../../server/plugins/aw-plugins.ts","../../../../shared/config/home.mjs","../../../../shared/config/engine.mjs","../../../../server/services/workshop/settings.ts","../../../../server/services/workshop/db/backup-registry.ts","../../../../server/plugins/backup.ts","../../../../server/services/workshop/logger.ts","../../../../server/services/workshop/daq/infra.ts","../../../../server/services/workshop/daq/storage/sqlite.adapter.ts","../../../../server/services/workshop/daq/storage/timescale.adapter.ts","../../../../server/services/workshop/daq/storage/index.ts","../../../../server/services/workshop/daq/objectstore/disk.adapter.ts","../../../../server/services/workshop/daq/objectstore/minio.adapter.ts","../../../../server/services/workshop/daq/objectstore/index.ts","../../../../server/services/workshop/daq/bus/inproc.adapter.ts","../../../../server/services/workshop/daq/bus/mqtt.adapter.ts","../../../../server/services/workshop/daq/bus/index.ts","../../../../server/services/system-config.ts","../../../../shared/daq-protocol.ts","../../../../server/services/workshop/daq/png-enc.ts","../../../../server/services/workshop/daq/drivers.ts","../../../../server/services/workshop/json-store.mjs","../../../../server/services/workshop/daq/daq-templates.ts","../../../../server/services/workshop/daq/daq-node.ts","../../../../server/services/workshop/daq/daq-runtime.ts","../../../../server/services/workshop/daq/daq-node.repo.ts","../../../../server/services/workshop/daq/host-ports.ts","../../../../server/services/workshop/daq/frames.ts","../../../../server/services/workshop/daq/objectstore/objectstore-port.ts","../../../../server/services/workshop/daq/alarm-notify.ts","../../../../server/services/workshop/daq/plugin-bridge.ts","../../../../server/services/workshop/daq/daq-controller.ts","../../../../server/plugins/daq.ts","../../../../server/plugins/dev-stability-guard.ts","../../../../server/services/workshop/db/retention.ts","../../../../server/plugins/retention.ts","../../../../server/plugins/security.ts","../../../../server/plugins/system-config.ts","../../../../server/services/workshop/db/database.ts","../../../../server/services/workshop/db/channel.repo.ts","../../../../server/services/workshop/db/agent.repo.ts","../../../../server/services/workshop/db/channel-agent.repo.ts","../../../../server/services/workshop/db/team.repo.ts","../../../../server/services/workshop/db/team-member.repo.ts","../../../../server/services/workshop/db/channel-template.repo.ts","../../../../server/services/workshop/db/task.repo.ts","../../../../server/services/workshop/db/message.repo.ts","../../../../server/services/workshop/db/subscription.repo.ts","../../../../server/services/workshop/db/memory.repo.ts","../../../../server/services/workshop/db/user.repo.ts","../../../../server/services/workshop/db/channel-event.repo.ts","../../../../server/services/workshop/db/ops.repo.ts","../../../../server/services/workshop/agents/hitl-registry.ts","../../../../server/repositories/user.repository.ts","../../../../server/services/user.service.ts","../../../../server/services/workshop/runtime/mailbox.ts","../../../../server/services/workshop/permissions.ts","../../../../server/api/workshop/ws.ts","../../../../server/services/workshop/runtime/execution-mode.ts","../../../../server/services/workshop/agents/mock-agent.ts","../../../../server/services/workshop/agents/harness-process.ts","../../../../server/services/workshop/agents/adapters/omp-rpc-client.ts","../../../../shared/terminal-protocol.ts","../../../../server/services/workshop/agents/harness-terminal.ts","../../../../server/services/workshop/prompts/loader.ts","../../../../server/services/workshop/agents/node-bindings.repo.ts","../../../../server/services/workshop/agents/tool-approvals.ts","../../../../shared/dcw-protocol.ts","../../../../server/services/workshop/dcw/drivers.ts","../../../../server/services/workshop/dcw/dcw-templates.ts","../../../../server/services/workshop/assets/device-twin.repo.ts","../../../../server/services/workshop/dcw/dcw-node.ts","../../../../server/services/workshop/dcw/dcw-node.repo.ts","../../../../server/services/workshop/dcw/dcw-runtime.ts","../../../../server/services/workshop/dcw/dcw-product.repo.ts","../../../../server/services/workshop/dcw/dcw-recipe.repo.ts","../../../../server/services/workshop/dcw/dcw-line.repo.ts","../../../../server/services/workshop/dcw/line-run.ts","../../../../server/services/workshop/dcw/recipe-rollback.repo.ts","../../../../server/services/workshop/dcw/recipe-rollback-manager.ts","../../../../server/services/workshop/dcw/dcw-controller.ts","../../../../server/services/workshop/agents/industrial-context.ts","../../../../server/services/workshop/agents/industrial-tools.ts","../../../../server/services/workshop/agents/plugin-tools.ts","../../../../server/services/workshop/agents/host-tool-bridge.ts","../../../../server/services/workshop/agents/prompt-builder.ts","../../../../server/services/workshop/agents/omp-agent.ts","../../../../server/services/workshop/agents/claude-agent.ts","../../../../server/services/workshop/agents/adapters/line-spawn.ts","../../../../server/services/workshop/agents/harness-env.ts","../../../../server/services/workshop/agents/opencode-agent.ts","../../../../server/services/workshop/agents/adapters/stdio-jsonrpc.ts","../../../../server/services/workshop/agents/codex-agent.ts","../../../../server/services/workshop/agents/dsh-agent.ts","../../../../server/services/workshop/agents/registry.ts","../../../../server/services/workshop/agents/factory.ts","../../../../server/services/workshop/types/task.ts","../../../../server/services/workshop/runtime/agent-runtime.ts","../../../../server/services/workshop/runtime/channel-runtime.ts","../../../../server/services/workshop/runtime/scheduler-loop.ts","../../../../server/services/workshop/runtime/task-engine.ts","../../../../server/services/workshop/runtime/memory.ts","../../../../server/services/workshop/runtime/embedding-provider.ts","../../../../server/services/workshop/agents/harness-availability.ts","../../../../server/services/workshop/runtime/manager.ts","../../../../server/plugins/workshop.ts","../../../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/request-log.ts","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/api/session.delete.js","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/api/session.get.js","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/shutdown.mjs"],"names":["decode","getQuery","parse","serialize","createRouter","f","h","c","i","l","g","p","createError","process","mergeHeaders","crypto","flatHooks","createTask","serialTaskCaller","parallelTaskCaller","callEachWith","createHooks","Hookable","s","callHooks","nodeFetch","fetch","Headers","Headers$1","AbortController","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","_inlineAppConfig","createRadixRouter","__publicField","permissions","userRepository","log","watch","AEP_VERSION","randomUUID","cache","registry","copyFileAsync","state","_a","DB_PATH","rows","pointsFromMeta","asObject","_b","_c","_d","makeFallback","writeFile","readFile","reqNative","modbusRead","sleep","REGISTRY","bad","load","normalize","pubMs","now","allowPublish","singleton","num","attached","require","SCHEMA_SQL","COLS","randomPassword","randomBytes","hubGlobal","hub","criteria","worker","frame","save","DATA_DIR","COOLDOWN_MS","_e","fresh","partsToText","buildContextPrefix","pid","launchChildProcess","seen","modeInfo","rowToTask","TaskEngineImpl","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,51,52,161,162,164,165,166,167,168]}
1
+ {"version":3,"file":"nitro.mjs","sources":["../../../../node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.node.mjs","../../../../node_modules/.pnpm/destr@2.0.5/node_modules/destr/dist/index.mjs","../../../../node_modules/.pnpm/ufo@1.6.4/node_modules/ufo/dist/index.mjs","../../../../node_modules/.pnpm/cookie-es@1.2.3/node_modules/cookie-es/dist/index.mjs","../../../../node_modules/.pnpm/radix3@1.1.2/node_modules/radix3/dist/index.mjs","../../../../node_modules/.pnpm/defu@6.1.7/node_modules/defu/dist/defu.mjs","../../../../node_modules/.pnpm/iron-webcrypto@1.2.1/node_modules/iron-webcrypto/dist/index.js","../../../../node_modules/.pnpm/node-mock-http@1.0.5/node_modules/node-mock-http/dist/index.mjs","../../../../node_modules/.pnpm/h3@1.15.11/node_modules/h3/dist/index.mjs","../../../../node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs","../../../../node_modules/.pnpm/node-fetch-native@1.6.7/node_modules/node-fetch-native/dist/native.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs","../../../../node_modules/.pnpm/ofetch@1.5.1/node_modules/ofetch/dist/node.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/dist/shared/unstorage.zVDD2mZo.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/dist/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/utils/index.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/utils/node-fs.mjs","../../../../node_modules/.pnpm/unstorage@1.17.5_db0@0.3.4_ioredis@5.11.1/node_modules/unstorage/drivers/fs-lite.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/storage.mjs","../../../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/shared/ohash.D__AXeF1.mjs","../../../../node_modules/.pnpm/ohash@2.0.11/node_modules/ohash/dist/crypto/node/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/cache.mjs","../../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/dist/index.mjs","../../../../node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/route-rules-utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/error/prod.mjs","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/plugins/oauth.js","../../../../node_modules/.pnpm/hookable@6.1.1/node_modules/hookable/dist/index.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_b6375e2fc1335b7cac3be8af25556e69/node_modules/@nuxt/nitro-server/dist/runtime/utils/paths.mjs","../../../../server/utils/errors.ts","../../../../sdk/hooks.mjs","../../../../sdk/api.mjs","../../../../sdk/context.mjs","../../../../server/services/workshop/plugins/host.mjs","../../../../server/services/workshop/scene-events.ts","../../../../server/services/workshop/ops/ops.ts","../../../../server/utils/approval-gate.ts","../../../../server/utils/auth.ts","../../../../server/utils/config.ts","../../../../server/utils/response.ts","../../../../server/utils/validate.ts","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/utils/session.js","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/plugins/ws.js","../../../../shared/local-time.mjs","../../../../server/plugins/00-local-time.ts","../../../../server/plugins/aw-plugins.ts","../../../../shared/config/home.mjs","../../../../shared/config/engine.mjs","../../../../server/services/workshop/settings.ts","../../../../server/services/workshop/db/backup-registry.ts","../../../../server/plugins/backup.ts","../../../../server/services/workshop/logger.ts","../../../../server/services/workshop/daq/infra.ts","../../../../server/services/workshop/daq/storage/sqlite.adapter.ts","../../../../server/services/workshop/daq/storage/timescale.adapter.ts","../../../../server/services/workshop/daq/storage/index.ts","../../../../server/services/workshop/daq/objectstore/disk.adapter.ts","../../../../server/services/workshop/daq/objectstore/minio.adapter.ts","../../../../server/services/workshop/daq/objectstore/index.ts","../../../../server/services/workshop/daq/bus/inproc.adapter.ts","../../../../server/services/workshop/daq/bus/mqtt.adapter.ts","../../../../server/services/workshop/daq/bus/index.ts","../../../../server/services/system-config.ts","../../../../shared/daq-protocol.ts","../../../../server/services/workshop/daq/png-enc.ts","../../../../server/services/workshop/daq/drivers.ts","../../../../server/services/workshop/json-store.mjs","../../../../server/services/workshop/daq/daq-templates.ts","../../../../server/services/workshop/daq/daq-node.ts","../../../../server/services/workshop/daq/daq-runtime.ts","../../../../server/services/workshop/daq/daq-node.repo.ts","../../../../server/services/workshop/daq/host-ports.ts","../../../../server/services/workshop/daq/frames.ts","../../../../server/services/workshop/daq/objectstore/objectstore-port.ts","../../../../server/services/workshop/daq/alarm-notify.ts","../../../../server/services/workshop/daq/plugin-bridge.ts","../../../../server/services/workshop/daq/daq-controller.ts","../../../../server/plugins/daq.ts","../../../../server/plugins/dev-stability-guard.ts","../../../../server/services/workshop/db/retention.ts","../../../../server/plugins/retention.ts","../../../../server/plugins/security.ts","../../../../server/plugins/system-config.ts","../../../../server/services/workshop/db/database.ts","../../../../server/services/workshop/db/channel.repo.ts","../../../../server/services/workshop/db/agent.repo.ts","../../../../server/services/workshop/db/channel-agent.repo.ts","../../../../server/services/workshop/db/team.repo.ts","../../../../server/services/workshop/db/team-member.repo.ts","../../../../server/services/workshop/db/channel-template.repo.ts","../../../../server/services/workshop/db/task.repo.ts","../../../../server/services/workshop/db/message.repo.ts","../../../../server/services/workshop/db/subscription.repo.ts","../../../../server/services/workshop/db/memory.repo.ts","../../../../server/services/workshop/db/user.repo.ts","../../../../server/services/workshop/db/channel-event.repo.ts","../../../../server/services/workshop/db/ops.repo.ts","../../../../server/services/workshop/agents/hitl-registry.ts","../../../../server/services/workshop/agents/agent-badge.ts","../../../../server/repositories/user.repository.ts","../../../../server/services/user.service.ts","../../../../server/services/workshop/runtime/mailbox.ts","../../../../server/services/workshop/permissions.ts","../../../../server/api/workshop/ws.ts","../../../../server/services/workshop/runtime/execution-mode.ts","../../../../server/services/workshop/agents/mock-agent.ts","../../../../server/services/workshop/agents/harness-process.ts","../../../../server/services/workshop/agents/adapters/omp-rpc-client.ts","../../../../shared/terminal-protocol.ts","../../../../server/services/workshop/agents/harness-terminal.ts","../../../../server/services/workshop/prompts/loader.ts","../../../../server/services/workshop/agents/node-bindings.repo.ts","../../../../server/services/workshop/agents/tool-approvals.ts","../../../../shared/dcw-protocol.ts","../../../../server/services/workshop/dcw/drivers.ts","../../../../server/services/workshop/dcw/dcw-templates.ts","../../../../server/services/workshop/assets/device-twin.repo.ts","../../../../server/services/workshop/dcw/dcw-node.ts","../../../../server/services/workshop/dcw/dcw-node.repo.ts","../../../../server/services/workshop/dcw/dcw-runtime.ts","../../../../server/services/workshop/dcw/dcw-product.repo.ts","../../../../server/services/workshop/dcw/dcw-recipe.repo.ts","../../../../server/services/workshop/dcw/dcw-line.repo.ts","../../../../server/services/workshop/dcw/line-run.ts","../../../../server/services/workshop/dcw/recipe-rollback.repo.ts","../../../../server/services/workshop/dcw/recipe-rollback-manager.ts","../../../../server/services/workshop/dcw/dcw-controller.ts","../../../../server/services/workshop/agents/industrial-context.ts","../../../../server/services/workshop/agents/industrial-tools.ts","../../../../server/services/workshop/agents/plugin-tools.ts","../../../../server/services/workshop/agents/host-tool-bridge.ts","../../../../server/services/workshop/agents/prompt-builder.ts","../../../../server/services/workshop/agents/omp-agent.ts","../../../../server/services/workshop/agents/claude-agent.ts","../../../../server/services/workshop/agents/adapters/line-spawn.ts","../../../../server/services/workshop/agents/harness-env.ts","../../../../server/services/workshop/agents/opencode-agent.ts","../../../../server/services/workshop/agents/adapters/stdio-jsonrpc.ts","../../../../server/services/workshop/agents/codex-agent.ts","../../../../server/services/workshop/agents/dsh-agent.ts","../../../../server/services/workshop/agents/registry.ts","../../../../server/services/workshop/agents/factory.ts","../../../../server/services/workshop/types/task.ts","../../../../server/services/workshop/runtime/agent-runtime.ts","../../../../server/services/workshop/runtime/channel-runtime.ts","../../../../server/services/workshop/runtime/scheduler-loop.ts","../../../../server/services/workshop/runtime/task-engine.ts","../../../../server/services/workshop/runtime/memory.ts","../../../../server/services/workshop/runtime/embedding-provider.ts","../../../../server/services/workshop/agents/harness-availability.ts","../../../../server/services/workshop/runtime/manager.ts","../../../../server/plugins/workshop.ts","../../../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/static.mjs","../../../../server/middleware/request-log.ts","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/api/session.delete.js","../../../../node_modules/.pnpm/nuxt-auth-utils@0.5.30_magi_25cfea03c37d60c613297752f2919dae/node_modules/nuxt-auth-utils/dist/runtime/server/api/session.get.js","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_1ea3e01e591cb0fd9b154d63486cc9e1/node_modules/nitropack/dist/runtime/internal/shutdown.mjs"],"names":["decode","getQuery","parse","serialize","createRouter","f","h","c","i","l","g","p","createError","process","mergeHeaders","crypto","flatHooks","createTask","serialTaskCaller","parallelTaskCaller","callEachWith","createHooks","Hookable","s","callHooks","nodeFetch","fetch","Headers","Headers$1","AbortController","AbortController$1","normalizeKey","defineDriver","DRIVER_NAME","dirname","fsPromises","resolve","fsp","_inlineAppConfig","createRadixRouter","__publicField","permissions","userRepository","log","watch","AEP_VERSION","randomUUID","cache","registry","copyFileAsync","state","_a","DB_PATH","rows","pointsFromMeta","asObject","_b","_c","_d","makeFallback","writeFile","readFile","reqNative","modbusRead","sleep","REGISTRY","bad","load","normalize","pubMs","now","allowPublish","singleton","num","attached","require","SCHEMA_SQL","COLS","randomPassword","randomBytes","hubGlobal","hub","criteria","worker","frame","save","DATA_DIR","COOLDOWN_MS","_e","fresh","partsToText","buildContextPrefix","pid","launchChildProcess","seen","modeInfo","rowToTask","TaskEngineImpl","callNodeRequestHandler","fetchNodeRequestHandler","gracefulShutdown"],"mappings":"","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,51,52,162,163,165,166,167,168,169]}
@@ -20,7 +20,7 @@ import 'node:zlib';
20
20
 
21
21
  const index_post = defineApiHandler(async (event) => {
22
22
  var _a;
23
- requireRole(event, ["admin", "editor"]);
23
+ const user = requireRole(event, ["admin", "editor"]);
24
24
  bindDcwBroadcast(broadcastSceneEvent);
25
25
  const body = (_a = await readBody(event)) != null ? _a : { name: "" };
26
26
  const line = getDcwController().createLine(body);
@@ -1 +1 @@
1
- {"version":3,"file":"index.post.mjs","sources":["../../../../../../../server/api/workshop/dcw/lines/index.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,mBAAe,gBAAA,CAAiB,OAAO,KAAA,KAAU;AAZjD,EAAA,IAAA,EAAA;AAaE,EAAA,WAAA,CAAY,KAAA,EAAO,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACtC,EAAA,gBAAA,CAAiB,mBAAmB,CAAA;AACpC,EAAA,MAAM,IAAA,GAAA,CAAO,WAAM,QAAA,CAAoB,KAAK,MAA/B,IAAA,GAAA,EAAA,GAAoC,EAAE,MAAM,EAAA,EAAG;AAC5D,EAAA,MAAM,IAAA,GAAO,gBAAA,EAAiB,CAAE,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,mBAAA,CAAoB,kBAAA,EAAoB,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACtF,EAAA,SAAA,CAAU;AAAA,IACR,OAAO,IAAA,CAAK,EAAA;AAAA,IACZ,WAAW,IAAA,CAAK,IAAA;AAAA,IAChB,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,MAAA;AAAA,IACZ,UAAU,IAAA,CAAK,EAAA;AAAA,IACf,OAAA,EAAS,CAAA,8BAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,MAAA,CAAA;AAAA,IAC1B,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"index.post.mjs","sources":["../../../../../../../server/api/workshop/dcw/lines/index.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAYA,mBAAe,gBAAA,CAAiB,OAAO,KAAA,KAAU;AAZjD,EAAA,IAAA,EAAA;AAaE,EAAA,MAAM,OAAO,WAAA,CAAY,KAAA,EAAO,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACnD,EAAA,gBAAA,CAAiB,mBAAmB,CAAA;AACpC,EAAA,MAAM,IAAA,GAAA,CAAO,WAAM,QAAA,CAAoB,KAAK,MAA/B,IAAA,GAAA,EAAA,GAAoC,EAAE,MAAM,EAAA,EAAG;AAC5D,EAAA,MAAM,IAAA,GAAO,gBAAA,EAAiB,CAAE,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,mBAAA,CAAoB,kBAAA,EAAoB,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,CAAA;AACtF,EAAA,SAAA,CAAU;AAAA,IACR,OAAO,IAAA,CAAK,EAAA;AAAA,IACZ,WAAW,IAAA,CAAK,IAAA;AAAA,IAChB,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,MAAA;AAAA,IACZ,UAAU,IAAA,CAAK,EAAA;AAAA,IACf,OAAA,EAAS,CAAA,8BAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,MAAA,CAAA;AAAA,IAC1B,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB,CAAC,CAAA;;;;"}
@@ -21,7 +21,7 @@ import 'node:zlib';
21
21
 
22
22
  const index_post = defineApiHandler(async (event) => {
23
23
  var _a, _b;
24
- requireRole(event, ["admin", "editor"]);
24
+ const user = requireRole(event, ["admin", "editor"]);
25
25
  bindDaqHost(broadcastSceneEvent);
26
26
  const body = (_a = await readBody(event)) != null ? _a : {};
27
27
  const node = getDaqController().create(body);
@@ -1 +1 @@
1
- {"version":3,"file":"index3.post.mjs","sources":["../../../../../../server/api/workshop/daq/index.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAcA,mBAAe,gBAAA,CAAiB,OAAO,KAAA,KAAU;AAdjD,EAAA,IAAA,EAAA,EAAA,EAAA;AAeE,EAAA,WAAA,CAAY,KAAA,EAAO,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACtC,EAAA,WAAA,CAAY,mBAAmB,CAAA;AAC/B,EAAA,MAAM,QAAO,EAAA,GAAA,MAAM,QAAA,CAAyB,KAAK,CAAA,KAApC,YAAyC,EAAC;AACvD,EAAA,MAAM,IAAA,GAAO,gBAAA,EAAiB,CAAE,MAAA,CAAO,IAAI,CAAA;AAC3C,EAAA,SAAA,CAAU;AAAA,IACR,OAAO,IAAA,CAAK,EAAA;AAAA,IACZ,WAAW,IAAA,CAAK,IAAA;AAAA,IAChB,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,UAAU,IAAA,CAAK,EAAA;AAAA,IACf,SAAS,CAAA,0CAAA,EAAU,IAAA,CAAK,IAAI,CAAA,cAAA,EAAY,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,IACnD,MAAA,EAAA,CAAQ,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,EAAA,GAAe,EAAA;AAAA,IACvB,QAAQ,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,WAAA,EAAa,KAAK,WAAA;AAAY,GAC9D,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,MAAA,EAAO,EAAE;AAC/B,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"index3.post.mjs","sources":["../../../../../../server/api/workshop/daq/index.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAcA,mBAAe,gBAAA,CAAiB,OAAO,KAAA,KAAU;AAdjD,EAAA,IAAA,EAAA,EAAA,EAAA;AAeE,EAAA,MAAM,OAAO,WAAA,CAAY,KAAA,EAAO,CAAC,OAAA,EAAS,QAAQ,CAAC,CAAA;AACnD,EAAA,WAAA,CAAY,mBAAmB,CAAA;AAC/B,EAAA,MAAM,QAAO,EAAA,GAAA,MAAM,QAAA,CAAyB,KAAK,CAAA,KAApC,YAAyC,EAAC;AACvD,EAAA,MAAM,IAAA,GAAO,gBAAA,EAAiB,CAAE,MAAA,CAAO,IAAI,CAAA;AAC3C,EAAA,SAAA,CAAU;AAAA,IACR,OAAO,IAAA,CAAK,EAAA;AAAA,IACZ,WAAW,IAAA,CAAK,IAAA;AAAA,IAChB,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,UAAA,EAAY,UAAA;AAAA,IACZ,UAAU,IAAA,CAAK,EAAA;AAAA,IACf,SAAS,CAAA,0CAAA,EAAU,IAAA,CAAK,IAAI,CAAA,cAAA,EAAY,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,IACnD,MAAA,EAAA,CAAQ,EAAA,GAAA,IAAA,CAAK,MAAA,KAAL,IAAA,GAAA,EAAA,GAAe,EAAA;AAAA,IACvB,QAAQ,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,WAAA,EAAa,KAAK,WAAA;AAAY,GAC9D,CAAA;AACD,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,MAAA,EAAO,EAAE;AAC/B,CAAC,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.7.15",
3
+ "version": "0.7.16",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "dependencies": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop",
3
- "version": "0.7.15",
3
+ "version": "0.7.16",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
@@ -0,0 +1,191 @@
1
+ /**
2
+ * OpsLog Agent 归属 + ops_log/recipe_log 工具 E2E(隔离实例 :3021)
3
+ *
4
+ * 验证:
5
+ * 1) Agent dcw_control 下发 → audit: actorKind=agent, actorName=「Channel名/成员名」(非 UUID)
6
+ * 2) ops_log / recipe_log 注入全部 harness worker 的工具面(agent-tools/list)
7
+ * 3) REST 直调 ops_log/recipe_log:能看到 来源=Agent 条目 + 配方下发/优化开窗
8
+ * 4) 负向:未绑定节点查询被拒
9
+ * 5) 真实 LLM 任务 ×4 引擎(omp/codex/dsh/opencode):Agent 自主调用两工具并在交付中
10
+ * 回带 LOGCHECK-OK / RECIPECHECK-OK 标记(mock 引擎无 LLM 回合,由 2/3 覆盖)
11
+ * 用法:NO_PROXY='127.0.0.1,localhost' node scripts/_dbg-opslog-agent-e2e.mjs [base]
12
+ */
13
+ const BASE = process.argv[2] ?? 'http://127.0.0.1:3021'
14
+ const TAG = `ol${Math.random().toString(36).slice(2, 6)}`
15
+ let pass = 0
16
+ let fail = 0
17
+ const ok = (cond, name, extra = '') => {
18
+ if (cond) { pass++; console.log(` ✓ ${name}`) }
19
+ else { fail++; console.log(` ✗ ${name} ${extra}`) }
20
+ }
21
+ const sleep = ms => new Promise(r => setTimeout(r, ms))
22
+ const api = async (method, path, { body, token } = {}) => {
23
+ const res = await fetch(`${BASE}${path}`, {
24
+ method,
25
+ headers: { 'content-type': 'application/json', ...(token ? { authorization: `Bearer ${token}` } : {}) },
26
+ body: body !== undefined ? JSON.stringify(body) : undefined,
27
+ signal: AbortSignal.timeout(30_000),
28
+ })
29
+ return { status: res.status, ...(await res.json().catch(() => ({}))) }
30
+ }
31
+
32
+ const ENGINES = [
33
+ { key: 'omp', harness: 'omp', cfg: { provider: 'zhipu-coding-plan', model: 'glm-5.3-flash' } },
34
+ { key: 'codex', harness: 'codex', cfg: { model: 'glm-5.3-flash', approvalPolicy: 'never' } },
35
+ { key: 'dsh', harness: 'dsh', cfg: { provider: 'ustc', model: 'glm-5.3-flash' } },
36
+ { key: 'opencode', harness: 'opencode', cfg: { model: 'zhipuai-coding-plan/glm-5.3-flash' } },
37
+ ]
38
+
39
+ async function main() {
40
+ console.log(`━━━ OpsLog/Recipe 工具 E2E @ ${BASE} (tag=${TAG}) ━━━`)
41
+
42
+ // ── 0. admin 登录(用户名) ──
43
+ const login = await api('POST', '/api/users/login', { body: { email: 'admin', password: 'admin123' } })
44
+ const token = login.data?.token
45
+ ok(Boolean(token), 'admin 用户名登录')
46
+ if (!token) process.exit(1)
47
+
48
+ // ── 1. 产线 + mock 节点 + 配方(+下发) ──
49
+ const line = (await api('POST', '/api/workshop/dcw/lines', { body: { name: `opsline-${TAG}` }, token })).data?.line
50
+ ok(Boolean(line?.id), `产线创建 ${line?.id ?? ''}`)
51
+ const node = (await api('POST', '/api/workshop/dcw', {
52
+ body: { name: `opsnode-${TAG}`, templateRef: 'temp-sp', driver: 'mock', driverConfig: { key: `opsnode-${TAG}` }, min: 0, max: 100, unit: '℃', lineId: line.id },
53
+ token,
54
+ })).data?.node
55
+ ok(Boolean(node?.id), `mock 数控节点创建 ${node?.id ?? ''}`)
56
+ const product = (await api('POST', '/api/workshop/dcw/products', {
57
+ body: { name: `opsproduct-${TAG}`, lineId: line.id },
58
+ token,
59
+ })).data?.product
60
+ ok(Boolean(product?.id), `产品创建 ${product?.id ?? ''}`)
61
+ const recipe = (await api('POST', '/api/workshop/dcw/recipes', {
62
+ body: { name: `opsrecipe-${TAG}`, productId: product?.id, params: [{ nodeId: node.id, value: 42, min: 0, max: 100 }] },
63
+ token,
64
+ })).data?.recipe ?? (await api('GET', '/api/workshop/dcw/recipes', { token })).data?.recipes?.find(r => r.name === `opsrecipe-${TAG}`)
65
+ ok(Boolean(recipe?.id), `配方创建 ${recipe?.id ?? ''}`)
66
+ const applied = await api('POST', `/api/workshop/dcw/recipes/${recipe.id}/apply`, { body: {}, token })
67
+ ok(applied.status === 200 || applied.pending === true, `配方一键下发(status=${applied.status} ${applied.message ?? ''})`)
68
+
69
+ // ── 2. 每 harness:channel(mock lead)+ worker + 绑定 ──
70
+ const members = {}
71
+ for (const e of [...ENGINES, { key: 'mock', harness: 'mock', cfg: { delayMs: 50 } }]) {
72
+ const ch = (await api('POST', '/api/workshop/channels', {
73
+ body: { name: `opslog-${e.key}-${TAG}`, leadAgent: { name: `lead-${TAG}`, harness: 'mock', config: { delayMs: 60 } } },
74
+ token,
75
+ })).data
76
+ const tpl = await api('POST', '/api/workshop/agents', {
77
+ body: { name: `ops-${e.key}-${TAG}`, harness: e.harness, config: { ...e.cfg, systemPromptPrefix: '你是产线操作员:严格按任务执行,只做任务要求的事,完成后立即调用 complete_task。' } },
78
+ token,
79
+ })
80
+ const join = await api('POST', `/api/workshop/channels/${ch.channelId}/agents`, { body: { agentId: tpl.data.id, role: 'worker' }, token })
81
+ const instId = join.data?.id
82
+ const bind = await api('POST', '/api/workshop/agent-tools/bindings', { body: { agentId: instId, nodeId: node.id, kind: 'dcw', mode: 'auto' }, token })
83
+ members[e.key] = { channelId: ch.channelId, instId, name: `ops-${e.key}-${TAG}` }
84
+ ok(Boolean(instId) && bind.code === 0, `${e.harness} worker 建号+绑定(bind=${bind.code === 0 ? 'ok' : bind.message})`)
85
+ }
86
+
87
+ // ── 3. 工具面注入断言(全 harness 一致) ──
88
+ for (const [k, m] of Object.entries(members)) {
89
+ const list = await api('GET', `/api/workshop/agent-tools/list?agentId=${m.instId}`, { token })
90
+ const names = ((list.data?.tools) ?? []).map(t => t.name)
91
+ ok(names.includes('ops_log') && names.includes('recipe_log'), `[${k}] 工具面含 ops_log+recipe_log`)
92
+ }
93
+
94
+ // ── 4. Agent 下发(mock 直调:mock 驱动确定性 ACK,无需 PLC)→ 审计归属 ──
95
+ const wr = await api('POST', '/api/workshop/agent-tools/invoke', {
96
+ body: { agentId: members.omp.instId, tool: 'dcw_control', args: { node_id: node.id, value: 55, task_id: 'e2e-opslog' } },
97
+ token,
98
+ })
99
+ ok(wr.data?.result?.text?.includes('下发成功'), '[omp 直调] dcw_control 下发成功', wr.data?.result?.text?.slice(0, 80))
100
+ const audit = await api('GET', '/api/workshop/audit?limit=100&action=dcw.write.agent', { token })
101
+ const entry = ((audit.data?.entries) ?? []).find(x => x.targetId === node.id)
102
+ ok(Boolean(entry), 'audit 出现 dcw.write.agent 条目')
103
+ ok(entry?.actorKind === 'agent', `条目来源=agent(实际 ${entry?.actorKind})`)
104
+ ok(entry?.actorName === `opslog-omp-${TAG}/ops-omp-${TAG}`, `操作者=Channel/成员(实际 ${entry?.actorName})`)
105
+
106
+ // ── 5. 工具直调查询 ──
107
+ const q1 = await api('POST', '/api/workshop/agent-tools/invoke', {
108
+ body: { agentId: members.omp.instId, tool: 'ops_log', args: { minutes: 120 } },
109
+ token,
110
+ })
111
+ ok(q1.data?.result?.text?.includes('来源=Agent') && q1.data?.result?.text?.includes(`opslog-omp-${TAG}/ops-omp-${TAG}`), '[omp] ops_log 看到来源=Agent + 人话操作者', q1.data?.result?.text?.slice(0, 100))
112
+ const q2 = await api('POST', '/api/workshop/agent-tools/invoke', {
113
+ body: { agentId: members.omp.instId, tool: 'recipe_log', args: { minutes: 120 } },
114
+ token,
115
+ })
116
+ ok(q2.data?.result?.text?.includes('配方下发') || q2.data?.result?.text?.includes('优化开窗'), '[omp] recipe_log 看到配方下发/优化开窗', q2.data?.result?.text?.slice(0, 100))
117
+ const q3 = await api('POST', '/api/workshop/agent-tools/invoke', {
118
+ body: { agentId: members.omp.instId, tool: 'ops_log', args: { node_id: 'not-bound-node' } },
119
+ token,
120
+ })
121
+ ok(q3.data?.result?.isError === true, '负向:未绑定节点查询被拒')
122
+
123
+ // ── 6. 真实 LLM 任务 ×4:Agent 自主调用两工具并回带标记 ──
124
+ const tasks = {}
125
+ for (const e of ENGINES) {
126
+ const m = members[e.key]
127
+ const t = await api('POST', `/api/workshop/channels/${m.channelId}/tasks`, {
128
+ body: {
129
+ title: `opslog-check-${e.key}-${TAG}`,
130
+ parts: [{ text: `执行自查(严格按步骤,不要下发任何控制指令):
131
+ 1. 调用工具 ops_log(minutes=180)查看你负责产线的运维日志;
132
+ 2. 调用工具 recipe_log(minutes=180)查看配方下发与回退历史;
133
+ 3. 在最终交付中原样包含两行标记(各占一行):LOGCHECK-OK 与 RECIPECHECK-OK,并各引用一条你看到的日志摘要(一句话)。
134
+ 完成后调用 complete_task。` }],
135
+ assigneeId: m.instId,
136
+ },
137
+ token,
138
+ })
139
+ tasks[e.key] = t.data?.task?.id ?? t.data?.id
140
+ ok(Boolean(tasks[e.key]), `[${e.key}] 任务下发`)
141
+ }
142
+ const states = {}
143
+ const pollTask = async (id) => {
144
+ for (let i = 0; i < 3; i++) {
145
+ try {
146
+ const me = await api('GET', `/api/workshop/tasks/${id}`, { token })
147
+ return me.data?.state
148
+ }
149
+ catch { await sleep(3000) }
150
+ }
151
+ return undefined
152
+ }
153
+ const deadline = Date.now() + 20 * 60_000
154
+ while (Date.now() < deadline && Object.keys(states).length < ENGINES.length) {
155
+ for (const e of ENGINES) {
156
+ if (states[e.key]) continue
157
+ const st = await pollTask(tasks[e.key])
158
+ if (st && ['COMPLETED', 'FAILED', 'CANCELED'].includes(st)) states[e.key] = st
159
+ }
160
+ if (Object.keys(states).length < ENGINES.length) await sleep(6000)
161
+ }
162
+ for (const e of ENGINES) {
163
+ ok(states[e.key] === 'COMPLETED', `[${e.key}] 引擎任务 COMPLETED(state=${states[e.key] ?? 'RUNNING'})`)
164
+ // 交付标记在 任务 artifacts / channel messages / events 三处任一出现即可
165
+ const taskBlob = JSON.stringify((await api('GET', `/api/workshop/tasks/${tasks[e.key]}`, { token })).data ?? {})
166
+ const msgBlob = JSON.stringify((await api('GET', `/api/workshop/channels/${members[e.key].channelId}/messages?limit=200`, { token })).data ?? {})
167
+ const evBlob = JSON.stringify((await api('GET', `/api/workshop/channels/${members[e.key].channelId}/events?limit=400`, { token })).data ?? {})
168
+ const blob = taskBlob + msgBlob + evBlob
169
+ ok(blob.includes('LOGCHECK-OK'), `[${e.key}] 交付含 LOGCHECK-OK(Agent 真读到日志)`)
170
+ ok(blob.includes('RECIPECHECK-OK'), `[${e.key}] 交付含 RECIPECHECK-OK(Agent 真读到 Recipe 历史)`)
171
+ }
172
+
173
+ // ── 清理 ──
174
+ for (const m of Object.values(members)) await api('DELETE', `/api/workshop/channels/${m.channelId}?purge=1`, { token }).catch(() => {})
175
+ for (const e of [...ENGINES, { key: 'mock' }]) {
176
+ const list = await api('GET', '/api/workshop/agents', { token })
177
+ const tpl = (list.data ?? []).find(x => x.name === `ops-${e.key}-${TAG}`)
178
+ if (tpl) await api('DELETE', `/api/workshop/agents/${tpl.id}`, { token }).catch(() => {})
179
+ }
180
+ await api('DELETE', `/api/workshop/dcw/${node.id}`, { token }).catch(() => {})
181
+ await api('DELETE', `/api/workshop/dcw/recipes/${recipe.id}`, { token }).catch(() => {})
182
+ await api('DELETE', `/api/workshop/dcw/lines/${line.id}`, { token }).catch(() => {})
183
+
184
+ console.log(`\n━━━ OpsLog E2E: ${pass} passed / ${fail} failed ━━━`)
185
+ process.exit(fail === 0 ? 0 : 1)
186
+ }
187
+
188
+ main().catch((err) => {
189
+ console.error('E2E 异常:', err)
190
+ process.exit(1)
191
+ })
@@ -13,7 +13,7 @@ import { broadcastSceneEvent } from '../../../services/workshop/scene-events'
13
13
  import { recordOps } from '../../../services/workshop/ops/ops'
14
14
 
15
15
  export default defineApiHandler(async (event) => {
16
- requireRole(event, ['admin', 'editor'])
16
+ const user = requireRole(event, ['admin', 'editor'])
17
17
  bindDaqHost(broadcastSceneEvent)
18
18
  const body = await readBody<DaqCreateInput>(event) ?? {}
19
19
  const node = getDaqController().create(body)
@@ -11,7 +11,7 @@ import { recordOps } from '@/server/services/workshop/ops/ops'
11
11
  import type { LineInput } from '#shared/dcw-protocol'
12
12
 
13
13
  export default defineApiHandler(async (event) => {
14
- requireRole(event, ['admin', 'editor'])
14
+ const user = requireRole(event, ['admin', 'editor'])
15
15
  bindDcwBroadcast(broadcastSceneEvent)
16
16
  const body = await readBody<LineInput>(event) ?? { name: '' }
17
17
  const line = getDcwController().createLine(body)