agentworkshop 0.5.5 → 0.5.7

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 (50) hide show
  1. package/.AgentWorkShop/prompts/compaction-hints.md +9 -0
  2. package/.AgentWorkShop/prompts/host-tools.json +695 -630
  3. package/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -0
  4. package/.AgentWorkShop/prompts/system-manual.md +6 -1
  5. package/.output/.AgentWorkShop/prompts/compaction-hints.md +9 -0
  6. package/.output/.AgentWorkShop/prompts/host-tools.json +695 -630
  7. package/.output/.AgentWorkShop/prompts/peer-reply-cross-channel.md +10 -0
  8. package/.output/.AgentWorkShop/prompts/system-manual.md +6 -1
  9. package/.output/nitro.json +1 -1
  10. package/.output/public/_nuxt/builds/latest.json +1 -1
  11. package/.output/public/_nuxt/builds/meta/02278199-eeea-4f96-882a-94c5408c6cb6.json +1 -0
  12. package/.output/server/chunks/_/nitro.mjs +2188 -1324
  13. package/.output/server/chunks/_/nitro.mjs.map +1 -1
  14. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +5 -2
  15. package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
  16. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs +25 -3
  17. package/.output/server/chunks/routes/api/workshop/channels/_id/index3.post.mjs.map +1 -1
  18. package/.output/server/package.json +1 -1
  19. package/package.json +1 -1
  20. package/scripts/_dbg-cross-channel-e2e.mjs +157 -0
  21. package/scripts/_dbg-cross-team-visibility-e2e.mjs +129 -0
  22. package/scripts/test-context-governor.ts +176 -0
  23. package/scripts/test-memory-brief-chronicle.ts +180 -0
  24. package/scripts/test-memory-dynamic.ts +3 -1
  25. package/scripts/test-memory-rrf-mmr.ts +114 -0
  26. package/server/api/workshop/agent-tools/invoke.post.ts +8 -1
  27. package/server/api/workshop/channels/[id]/messages/index.post.ts +26 -1
  28. package/server/api/workshop/ws.ts +1 -0
  29. package/server/data/daqs.json +35 -13
  30. package/server/data/dcw-lines.json +14 -0
  31. package/server/data/dcw-products.json +14 -0
  32. package/server/data/dcw-recipes.json +28 -0
  33. package/server/data/dcw-rollback.json +122 -1
  34. package/server/data/dcw-runs.json +54 -36
  35. package/server/data/dcw-writes.json +60 -0
  36. package/server/data/dcws.json +42 -0
  37. package/server/data/line-runs.json +32 -22
  38. package/server/services/workshop/agents/adapters/omp-rpc-client.ts +65 -0
  39. package/server/services/workshop/agents/agent-interface.ts +44 -1
  40. package/server/services/workshop/agents/mock-agent.ts +12 -0
  41. package/server/services/workshop/agents/omp-agent.ts +304 -8
  42. package/server/services/workshop/db/database.ts +16 -1
  43. package/server/services/workshop/db/memory.repo.ts +40 -2
  44. package/server/services/workshop/prompts/loader.ts +6 -5
  45. package/server/services/workshop/runtime/agent-runtime.ts +52 -6
  46. package/server/services/workshop/runtime/channel-runtime.ts +14 -6
  47. package/server/services/workshop/runtime/manager.ts +314 -3
  48. package/server/services/workshop/runtime/memory.ts +313 -78
  49. package/server/services/workshop/types/task.ts +14 -0
  50. package/.output/public/_nuxt/builds/meta/f2f649c5-fd3b-4507-a3a1-8b4a194de72d.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_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/route-rules-utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/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","../../../../server/plugins/aw-plugins.ts","../../../../shared/config/home.mjs","../../../../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/bus/inproc.adapter.ts","../../../../server/services/workshop/daq/bus/mqtt.adapter.ts","../../../../server/services/workshop/daq/bus/index.ts","../../../../shared/daq-protocol.ts","../../../../server/services/workshop/daq/drivers.ts","../../../../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/alarm-notify.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","../../../../shared/config/engine.mjs","../../../../server/services/system-config.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/repositories/user.repository.ts","../../../../server/services/user.service.ts","../../../../server/services/workshop/runtime/mailbox.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/omp-agent.ts","../../../../server/services/workshop/agents/claude-agent.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/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_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/shutdown.mjs"],"names":["decode","getQuery","parse","serialize","createRouter","f","h","c","i","l","g","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","log","watch","AEP_VERSION","randomUUID","_a","DB_PATH","rows","_b","_c","_d","reqNative","sleep","REGISTRY","bad","load","normalize","singleton","require","SCHEMA_SQL","COLS","randomPassword","randomBytes","hubGlobal","hub","criteria","worker","registry","frame","save","DATA_DIR","COOLDOWN_MS","_e","fresh","partsToText","pid","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,136,137,139,140,141,142,143]}
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_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/hash.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/utils.env.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/config.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/route-rules-utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/route-rules.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/utils.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/node_modules/@nuxt/nitro-server/dist/runtime/utils/error.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/node_modules/@nuxt/nitro-server/dist/runtime/handlers/error.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/error/utils.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/plugin.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/renderer.mjs","../../../../node_modules/.pnpm/@nuxt+nitro-server@4.5.2_2b2a73a5ea3a6c1cac65dd2aa61911d0/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","../../../../server/plugins/aw-plugins.ts","../../../../shared/config/home.mjs","../../../../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/bus/inproc.adapter.ts","../../../../server/services/workshop/daq/bus/mqtt.adapter.ts","../../../../server/services/workshop/daq/bus/index.ts","../../../../shared/daq-protocol.ts","../../../../server/services/workshop/daq/drivers.ts","../../../../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/alarm-notify.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","../../../../shared/config/engine.mjs","../../../../server/services/system-config.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/repositories/user.repository.ts","../../../../server/services/user.service.ts","../../../../server/services/workshop/runtime/mailbox.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/runtime/memory.ts","../../../../server/services/workshop/agents/omp-agent.ts","../../../../server/services/workshop/agents/claude-agent.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/embedding-provider.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_b1d7d58181e96cbc69b3295f5f958520/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_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/app.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/lib/http-graceful-shutdown.mjs","../../../../node_modules/.pnpm/nitropack@2.13.4_oxc-parser_b1d7d58181e96cbc69b3295f5f958520/node_modules/nitropack/dist/runtime/internal/shutdown.mjs"],"names":["decode","getQuery","parse","serialize","createRouter","f","h","c","i","l","g","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","log","watch","AEP_VERSION","randomUUID","_a","DB_PATH","rows","_b","_c","_d","reqNative","sleep","REGISTRY","bad","load","normalize","singleton","require","SCHEMA_SQL","COLS","randomPassword","randomBytes","hubGlobal","hub","criteria","worker","registry","frame","save","DATA_DIR","COOLDOWN_MS","_e","fresh","partsToText","pid","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,136,137,139,140,141,142,143]}
@@ -1,4 +1,4 @@
1
- import { c as defineApiHandler, o as readBody, n as createError, X as toolMyIndustrialNodes, Y as toolDcwControl, Z as toolDaqQuery, _ as toolDcwJudge, $ as toolDcwRollback, a0 as toolDcwJournal } from '../../../../_/nitro.mjs';
1
+ import { c as defineApiHandler, o as readBody, n as createError, g as getWorkshopManager, X as toolMyIndustrialNodes, Y as toolDcwControl, Z as toolDaqQuery, _ as toolDcwJudge, $ as toolDcwRollback, a0 as toolDcwJournal } from '../../../../_/nitro.mjs';
2
2
  import { resolveUser } from '../caller.mjs';
3
3
  import 'node:crypto';
4
4
  import 'node:http';
@@ -15,6 +15,7 @@ import 'node:net';
15
15
  import 'node:util';
16
16
  import 'node:module';
17
17
 
18
+ const COLLAB_TOOLS = /* @__PURE__ */ new Set(["list_other_teams", "search_other_teams_memory", "send_cross_channel_message"]);
18
19
  const invoke_post = defineApiHandler(async (event) => {
19
20
  var _a, _b, _c, _d;
20
21
  resolveUser(event);
@@ -24,7 +25,9 @@ const invoke_post = defineApiHandler(async (event) => {
24
25
  const args = (_d = body.args) != null ? _d : {};
25
26
  if (!agentId) throw createError({ statusCode: 400, statusMessage: "agentId required" });
26
27
  let result;
27
- if (tool === "my_industrial_nodes") result = await toolMyIndustrialNodes(agentId);
28
+ if (COLLAB_TOOLS.has(tool)) {
29
+ result = getWorkshopManager().invokeAgentWorkspaceTool(agentId, tool, args);
30
+ } else if (tool === "my_industrial_nodes") result = await toolMyIndustrialNodes(agentId);
28
31
  else if (tool === "dcw_control") result = await toolDcwControl(agentId, args);
29
32
  else if (tool === "daq_query") result = await toolDaqQuery(agentId, args);
30
33
  else if (tool === "dcw_judge") result = await toolDcwJudge(agentId, args);
@@ -1 +1 @@
1
- {"version":3,"file":"invoke.post.mjs","sources":["../../../../../../../server/api/workshop/agent-tools/invoke.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAiBA,oBAAA,gBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,WAAA,CAAA,KAAA,CAAA;AACA,EAAA,MAAA,QAAA,EAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA,KAAA,YAAA,EAAA;AACA,EAAA,MAAA,OAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,OAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,IAAA,GAAA,EAAA,GAAA,EAAA;AACA,EAAA,IAAA,CAAA,SAAA,MAAA,WAAA,CAAA,EAAA,UAAA,EAAA,GAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,CAAA;AACA,EAAA,IAAA,MAAA;AACA,EAAA,IAAA,IAAA,KAAA,qBAAA,EAAA,MAAA,GAAA,MAAA,sBAAA,OAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,cAAA,EAAA,MAAA,GAAA,MAAA,eAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OACA,MAAA,YAAA,EAAA,UAAA,EAAA,KAAA,aAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,CAAA,EAAA,CAAA;AACA,EAAA,OAAA,EAAA,MAAA,EAAA;AACA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"invoke.post.mjs","sources":["../../../../../../../server/api/workshop/agent-tools/invoke.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,MAAA,+BAAA,IAAA,GAAA,CAAA,CAAA,kBAAA,EAAA,2BAAA,EAAA,4BAAA,CAAA,CAAA;AAEA,oBAAA,gBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,WAAA,CAAA,KAAA,CAAA;AACA,EAAA,MAAA,QAAA,EAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA,KAAA,YAAA,EAAA;AACA,EAAA,MAAA,OAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,OAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,IAAA,GAAA,EAAA,GAAA,EAAA;AACA,EAAA,IAAA,CAAA,SAAA,MAAA,WAAA,CAAA,EAAA,UAAA,EAAA,GAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,CAAA;AACA,EAAA,IAAA,MAAA;AACA,EAAA,IAAA,YAAA,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA;AACA,IAAA,MAAA,GAAA,kBAAA,EAAA,CAAA,wBAAA,CAAA,OAAA,EAAA,MAAA,IAAA,CAAA;AAAA,EACA,WACA,IAAA,KAAA,qBAAA,EAAA,MAAA,GAAA,MAAA,sBAAA,OAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,cAAA,EAAA,MAAA,GAAA,MAAA,eAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OACA,MAAA,YAAA,EAAA,UAAA,EAAA,KAAA,aAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,CAAA,EAAA,CAAA;AACA,EAAA,OAAA,EAAA,MAAA,EAAA;AACA,CAAA,CAAA;;;;"}
@@ -1,6 +1,6 @@
1
+ import { c as defineApiHandler, q as getRouterParam, L as readValidatedBody, M as zValidator, g as getWorkshopManager, H as AppError } from '../../../../../_/nitro.mjs';
1
2
  import { z } from 'zod';
2
3
  import { resolveUser } from '../../caller.mjs';
3
- import { c as defineApiHandler, q as getRouterParam, L as readValidatedBody, M as zValidator, g as getWorkshopManager } from '../../../../../_/nitro.mjs';
4
4
  import 'node:crypto';
5
5
  import 'node:http';
6
6
  import 'node:https';
@@ -17,14 +17,19 @@ import 'node:util';
17
17
  import 'node:module';
18
18
 
19
19
  const sendMessageSchema = z.object({
20
- toAgentId: z.string().min(1, "toAgentId \u5FC5\u586B"),
20
+ toAgentId: z.string().min(1, "toAgentId \u5FC5\u586B").optional(),
21
21
  text: z.string().min(1, "text \u5FC5\u586B"),
22
22
  fromAgentId: z.string().optional(),
23
23
  /** 人类发送者显示名(时间线 a2a.message 的发送者归属 → x-aw-from-label) */
24
24
  fromLabel: z.string().max(120).optional(),
25
25
  priority: z.enum(["immediate", "task"]).default("task"),
26
26
  /** 触发器:要求接收方回执(执行结果 + 所需内容,in_reply_to 关联) */
27
- requireReply: z.boolean().optional()
27
+ requireReply: z.boolean().optional(),
28
+ /**
29
+ * 跨 Channel 通信(仅 lead):指定目标 channel(id 或名字)→ 消息直投其 lead mailbox。
30
+ * 与 toAgentId 二选一;fromAgentId 必填且必须是本 channel 的 lead(worker 拒绝)。
31
+ */
32
+ toChannelId: z.string().optional()
28
33
  });
29
34
  const index_post = defineApiHandler(async (event) => {
30
35
  var _a, _b;
@@ -34,6 +39,23 @@ const index_post = defineApiHandler(async (event) => {
34
39
  const manager = getWorkshopManager();
35
40
  const channel = manager.getChannelForUser(channelId, user.id);
36
41
  manager.requireOwned(channel.ownerUserId, user.id, "channel");
42
+ if (body.toChannelId) {
43
+ if (body.toAgentId) {
44
+ throw new AppError(400, "BAD_REQUEST", "toChannelId \u4E0E toAgentId \u4E8C\u9009\u4E00,\u4E0D\u53EF\u540C\u65F6\u6307\u5B9A");
45
+ }
46
+ if (!body.fromAgentId) {
47
+ throw new AppError(403, "ROLE_FORBIDDEN", "\u8DE8 Channel \u901A\u4FE1\u5FC5\u987B\u4EE5\u672C channel Leader \u8EAB\u4EFD\u53D1\u9001(fromAgentId \u5FC5\u586B)");
48
+ }
49
+ const fromAgentId2 = manager.resolveChannelMember(channelId, body.fromAgentId).id;
50
+ return manager.sendCrossChannelMessage(channelId, fromAgentId2, {
51
+ toChannelId: body.toChannelId,
52
+ parts: [{ text: body.text }],
53
+ requireReply: body.requireReply
54
+ });
55
+ }
56
+ if (!body.toAgentId) {
57
+ throw new AppError(400, "BAD_REQUEST", "toAgentId \u5FC5\u586B(\u8DE8 Channel \u8BF7\u6539\u7528 toChannelId)");
58
+ }
37
59
  const target = manager.resolveChannelMember(channelId, body.toAgentId);
38
60
  let fromAgentId = body.fromAgentId;
39
61
  if (fromAgentId) {
@@ -1 +1 @@
1
- {"version":3,"file":"index3.post.mjs","sources":["../../../../../../../../server/api/workshop/channels/[id]/messages/index.post.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index3.post.mjs","sources":["../../../../../../../../server/api/workshop/channels/[id]/messages/index.post.ts"],"names":["fromAgentId"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentworkshop-prod",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
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.5.5",
3
+ "version": "0.5.7",
4
4
  "type": "module",
5
5
  "description": "AgentWorkShop 软件开发系统 - 基于 Nuxt 4 的配置驱动运行范式",
6
6
  "license": "PolyForm-Noncommercial-1.0.0",
@@ -0,0 +1,157 @@
1
+ /**
2
+ * 跨 Channel 通信端到端验证(针对运行中的环境,默认 http://127.0.0.1:3000)。
3
+ * 覆盖:lead→异 channel lead 投递(metadata 盖章/落对方 mailbox)→ mock lead 消费并
4
+ * 自动回执(跨 channel 回信)→ 回信到达源 channel lead → 权限(worker 拒)→
5
+ * 边界(自指/停用/无 lead channel)。
6
+ * 运行: node scripts/_dbg-cross-channel-e2e.mjs (AW_BASE 可覆盖目标)
7
+ */
8
+ const ROOT = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
9
+ let TOKEN = process.env.AW_E2E_TOKEN ?? ''
10
+ const H = () => ({ authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' })
11
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms))
12
+ let failures = 0
13
+ const check = (name, ok, detail = '') => {
14
+ console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
15
+ if (!ok) failures++
16
+ }
17
+ const fail = (m) => { console.error('FATAL:', m); process.exit(1) }
18
+
19
+ async function api(method, path, body) {
20
+ const res = await fetch(ROOT + path, { method, headers: H(), body: body !== undefined ? JSON.stringify(body) : undefined })
21
+ const json = await res.json().catch(() => ({}))
22
+ return { status: res.status, ...json }
23
+ }
24
+ const jpost = (u, b) => api('POST', u, b ?? {})
25
+ const jget = (u) => api('GET', u)
26
+ const cleanup = []
27
+ const tag = Math.random().toString(36).slice(2, 8)
28
+
29
+ async function deployTeam(channelName, extraWorkers = []) {
30
+ const chRes = (await jpost('/api/workshop/channels', { name: channelName, description: '跨Channel验证' })).data
31
+ cleanup.push(['channel', chRes.channelId])
32
+ const team = (await jpost('/api/workshop/teams', { name: channelName + '-组', description: '跨Channel验证' })).data
33
+ cleanup.push(['team', team.id])
34
+ // 成员先入队再一次 deploy(重复 deploy 不会同步新增成员)
35
+ await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: 'tpl-default-lead', role: 'lead' })
36
+ for (const w of extraWorkers) {
37
+ await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: w.id, role: 'worker' })
38
+ }
39
+ await jpost(`/api/workshop/teams/${team.id}/deploy`, { channelId: chRes.channelId })
40
+ const agents = (await jget(`/api/workshop/channels/${chRes.channelId}/agents`)).data
41
+ const lead = agents.find(a => a.role === 'lead')
42
+ const worker = agents.find(a => a.role === 'worker')
43
+ cleanup.push(['channel-agent', `${chRes.channelId}:${lead?.id}`])
44
+ if (worker) cleanup.push(['channel-agent', `${chRes.channelId}:${worker.id}`])
45
+ return { channelId: chRes.channelId, lead, worker, teamId: team.id }
46
+ }
47
+
48
+ async function main() {
49
+ console.log('━━━ 0. 用户注册 ━━━')
50
+ const reg = await jpost('/api/workshop/users/register', { name: 'xcc-' + tag })
51
+ TOKEN = reg.data?.token
52
+ if (!TOKEN) fail('用户注册失败: ' + JSON.stringify(reg).slice(0, 120))
53
+ check('用户注册并取得 token', !!TOKEN)
54
+
55
+ // ===== 1. 两个团队:西线(lead mock + worker mock)/ 东线(lead mock)=====
56
+ console.log('\n━━━ 1. 双 channel 部署 ━━━')
57
+ const workerTpl = (await jpost('/api/workshop/agents', { name: '西线worker-' + tag, harness: 'mock', config: {} })).data
58
+ cleanup.push(['agent-tpl', workerTpl.id])
59
+ const west = await deployTeam('西线团队-' + tag, [workerTpl])
60
+ check('西线 channel + mock lead 就绪', !!west.channelId && !!west.lead?.id)
61
+ const east = await deployTeam('东线团队-' + tag)
62
+ check('东线 channel + mock lead 就绪', !!east.channelId && !!east.lead?.id)
63
+ const westWorker = west.worker
64
+ check('西线 worker 就绪(权限反证用)', !!westWorker?.id)
65
+
66
+ // ===== 2. 跨 Channel 发送(REST,lead 身份)=====
67
+ console.log('\n━━━ 2. 跨 Channel 投递(lead → 对方 lead)━━━')
68
+ const ask = '东线请注意:西线请求支援——请分析你们 channel 的负载情况,并把结论回执给我。'
69
+ const sent = await jpost(`/api/workshop/channels/${west.channelId}/messages`, {
70
+ toChannelId: east.channelId,
71
+ fromAgentId: west.lead.id,
72
+ text: ask,
73
+ requireReply: true,
74
+ })
75
+ check('跨 Channel 发送成功(回执含目标 channel/lead)',
76
+ sent.status === 200 && sent.data?.toChannelId === east.channelId && sent.data?.toLeadAgentId === east.lead.id,
77
+ `messageId=${String(sent.data?.messageId ?? '').slice(0, 8)} toChannel=${String(sent.data?.toChannelName ?? '')}`)
78
+ const crossMsgId = sent.data?.messageId
79
+ cleanup.push(['cross-message', crossMsgId])
80
+
81
+ // 落库断言:消息出现在东线历史,盖章齐全,收件人=东线 lead
82
+ const eastMsgs = (await jget(`/api/workshop/channels/${east.channelId}/messages?limit=20`)).data
83
+ const list = Array.isArray(eastMsgs) ? eastMsgs : eastMsgs?.messages ?? []
84
+ const delivered = list.find(m => m.id === crossMsgId)
85
+ const meta = delivered?.metadata ?? {}
86
+ check('东线 mailbox 可见该消息(收件人=东线 lead)', !!delivered && delivered.toAgentId === east.lead.id)
87
+ check('跨 Channel 盖章齐全(cross-channel/from-channel/from-label)',
88
+ meta['x-aw-cross-channel'] === 'true'
89
+ && meta['x-aw-from-channel'] === west.channelId
90
+ && String(meta['x-aw-from-label'] ?? '').includes('西线团队'),
91
+ `label=${String(meta['x-aw-from-label'] ?? '')}`)
92
+
93
+ // ===== 3. 东线 lead 消费并自动回执(跨 channel 回信到西线 lead)=====
94
+ console.log('\n━━━ 3. 对方 lead 消费并回信(闭环)━━━')
95
+ let reply = null
96
+ for (let i = 0; i < 20; i++) {
97
+ await sleep(1500)
98
+ const westMsgs = (await jget(`/api/workshop/channels/${west.channelId}/messages?limit=20`)).data
99
+ const wlist = Array.isArray(westMsgs) ? westMsgs : westMsgs?.messages ?? []
100
+ reply = wlist.find(m => m.metadata?.['x-aw-in-reply-to'] === crossMsgId
101
+ && m.metadata?.['x-aw-cross-channel'] === 'true'
102
+ && m.toAgentId === west.lead.id)
103
+ if (reply) break
104
+ }
105
+ check('东线 lead 自动回信到达西线 lead(in_reply_to 关联)', !!reply,
106
+ reply ? `text=${String(reply.parts?.[0]?.text ?? '').slice(0, 50)}…` : '30s 内未收到回信')
107
+ if (reply) cleanup.push(['cross-message', reply.id])
108
+
109
+ // 回信已被西线 lead 消费?(mock 收到无需回执的信件仅登记;此处只验投递与可见性)
110
+
111
+ // ===== 4. 权限:worker 跨 Channel 被拒 =====
112
+ console.log('\n━━━ 4. 权限反证 ━━━')
113
+ const denied = await jpost(`/api/workshop/channels/${west.channelId}/messages`, {
114
+ toChannelId: east.channelId,
115
+ fromAgentId: westWorker.id,
116
+ text: 'worker 试图跨 Channel(应被拒)',
117
+ })
118
+ check('worker 跨 Channel 被拒(403 ROLE_FORBIDDEN)',
119
+ denied.status === 403 && String(denied.message ?? '').includes('Leader'),
120
+ `status=${denied.status} msg=${String(denied.message ?? '').slice(0, 60)}`)
121
+
122
+ // 无 fromAgentId(人类身份)跨 Channel 同样拒绝
123
+ const anon = await jpost(`/api/workshop/channels/${west.channelId}/messages`, {
124
+ toChannelId: east.channelId,
125
+ text: '匿名跨 Channel(应被拒)',
126
+ })
127
+ check('无 Leader 身份被拒(403)', anon.status === 403, `status=${anon.status}`)
128
+
129
+ // ===== 5. 边界:自指 / 停用 / 不存在 =====
130
+ console.log('\n━━━ 5. 边界用例 ━━━')
131
+ const selfRef = await jpost(`/api/workshop/channels/${west.channelId}/messages`, {
132
+ toChannelId: west.channelId, fromAgentId: west.lead.id, text: 'self',
133
+ })
134
+ check('目标=本 channel 被拒(404)', selfRef.status === 404, `status=${selfRef.status}`)
135
+ const ghost = await jpost(`/api/workshop/channels/${west.channelId}/messages`, {
136
+ toChannelId: 'ch-not-exists-' + tag, fromAgentId: west.lead.id, text: 'ghost',
137
+ })
138
+ check('目标不存在被拒(404)', ghost.status === 404, `status=${ghost.status}`)
139
+
140
+ // ===== 清理 =====
141
+ console.log('\n━━━ 清理 ━━━')
142
+ for (const [kind, id] of cleanup.reverse()) {
143
+ if (kind === 'channel') await api('DELETE', `/api/workshop/channels/${id}`)
144
+ else if (kind === 'team') await api('DELETE', `/api/workshop/teams/${id}`)
145
+ else if (kind === 'agent-tpl') await api('DELETE', `/api/workshop/agents/${id}`)
146
+ else if (kind === 'channel-agent') {
147
+ const [cid, aid] = String(id).split(':')
148
+ if (cid && aid) await api('DELETE', `/api/workshop/channels/${cid}/agents/${aid}`)
149
+ }
150
+ }
151
+ console.log('清理完成')
152
+
153
+ console.log(failures === 0 ? '\nE2E ALL PASS' : `\nE2E ${failures} FAILED`)
154
+ if (failures > 0) process.exit(1)
155
+ }
156
+
157
+ main().catch((e) => { console.error(e); process.exit(1) })
@@ -0,0 +1,129 @@
1
+ /**
2
+ * 跨团队可见性端到端验证:leader 看其他团队任务场景(list_other_teams)、
3
+ * 全员查其他团队共享记忆(search_other_teams_memory)、权限反证(worker 查概览被拒)。
4
+ * 前置:运行中的环境(默认 3000)。运行: node scripts/_dbg-cross-team-visibility-e2e.mjs
5
+ */
6
+ const ROOT = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
7
+ let TOKEN = ''
8
+ const H = () => ({ authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' })
9
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms))
10
+ let failures = 0
11
+ const check = (name, ok, detail = '') => {
12
+ console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
13
+ if (!ok) failures++
14
+ }
15
+ const fail = (m) => { console.error('FATAL:', m); process.exit(1) }
16
+
17
+ async function api(method, path, body) {
18
+ const res = await fetch(ROOT + path, { method, headers: H(), body: body !== undefined ? JSON.stringify(body) : undefined })
19
+ const json = await res.json().catch(() => ({}))
20
+ return { status: res.status, ...json }
21
+ }
22
+ const jpost = (u, b) => api('POST', u, b ?? {})
23
+ const jget = (u) => api('GET', u)
24
+ const invoke = async (agentId, tool, args = {}) => {
25
+ const r = await jpost('/api/workshop/agent-tools/invoke', { agentId, tool, args })
26
+ const result = r.data?.result
27
+ return { status: r.status, text: String(result?.text ?? JSON.stringify(r).slice(0, 200)), isError: result?.isError === true }
28
+ }
29
+ const cleanup = []
30
+ const tag = Math.random().toString(36).slice(2, 8)
31
+
32
+ async function deployTeam(name, withWorker) {
33
+ const chRes = (await jpost('/api/workshop/channels', { name, description: '跨团队可见性验证' })).data
34
+ cleanup.push(['channel', chRes.channelId])
35
+ const team = (await jpost('/api/workshop/teams', { name: name + '-组', description: '跨团队可见性验证' })).data
36
+ cleanup.push(['team', team.id])
37
+ await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: 'tpl-default-lead', role: 'lead' })
38
+ let worker = null
39
+ if (withWorker) {
40
+ const tpl = (await jpost('/api/workshop/agents', { name: name + '-worker', harness: 'mock', config: {} })).data
41
+ cleanup.push(['agent-tpl', tpl.id])
42
+ await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: tpl.id, role: 'worker' })
43
+ }
44
+ await jpost(`/api/workshop/teams/${team.id}/deploy`, { channelId: chRes.channelId })
45
+ const agents = (await jget(`/api/workshop/channels/${chRes.channelId}/agents`)).data
46
+ const lead = agents.find(a => a.role === 'lead')
47
+ worker = agents.find(a => a.role === 'worker') ?? null
48
+ if (lead) cleanup.push(['channel-agent', `${chRes.channelId}:${lead.id}`])
49
+ if (worker) cleanup.push(['channel-agent', `${chRes.channelId}:${worker.id}`])
50
+ return { channelId: chRes.channelId, lead, worker }
51
+ }
52
+
53
+ async function main() {
54
+ console.log('━━━ 0. 注册与双团队部署 ━━━')
55
+ const reg = await jpost('/api/workshop/users/register', { name: 'xvis-' + tag })
56
+ TOKEN = reg.data?.token
57
+ if (!TOKEN) fail('注册失败: ' + JSON.stringify(reg).slice(0, 120))
58
+ check('注册并取得 token', !!TOKEN)
59
+ const east = await deployTeam('东线团队-' + tag, false)
60
+ const west = await deployTeam('西线团队-' + tag, true)
61
+ check('东线(无 worker)+ 西线(含 worker)就绪', !!east.lead?.id && !!west.lead?.id && !!west.worker?.id,
62
+ `eastLead=${String(east.lead?.id ?? '').slice(0, 8)} westLead=${String(west.lead?.id ?? '').slice(0, 8)}`)
63
+
64
+ // ===== 1. 东线沉淀共享记忆(他人将检索的知识)=====
65
+ console.log('\n━━━ 1. 东线共享记忆沉淀 ━━━')
66
+ const mem = await jpost(`/api/workshop/channels/${east.channelId}/memories`, {
67
+ title: '淬火工艺结论-' + tag,
68
+ content: `东线团队完成淬火工序验证:淬火温度 182℃ 保温 30 分钟后硬度达标 HRC58,温度超过 190℃ 会出现过回火软化。结论可用于西线同类工件工艺制定(${tag})。`,
69
+ importance: 0.9,
70
+ })
71
+ check('东线共享记忆写入', mem.status === 200, `status=${mem.status}`)
72
+
73
+ // ===== 2. 东线创建进行中场景任务 =====
74
+ console.log('\n━━━ 2. 东线进行中任务 ━━━')
75
+ const task = await jpost(`/api/workshop/channels/${east.channelId}/tasks`, {
76
+ title: '东线批次复检-' + tag,
77
+ parts: [{ text: '对当前批次做复检并记录结论' }],
78
+ })
79
+ const taskId = task.data?.task?.id ?? task.data?.id
80
+ cleanup.push(['task', taskId])
81
+ check('东线任务创建(进行中)', !!taskId, `id=${String(taskId ?? '').slice(0, 8)}`)
82
+
83
+ // ===== 3. 西线 lead:list_other_teams 看到东线的任务场景 =====
84
+ console.log('\n━━━ 3. Leader 跨团队观察面 ━━━')
85
+ const ov = await invoke(west.lead.id, 'list_other_teams')
86
+ const ovText = String(ov.text ?? '')
87
+ check('lead 查看其他团队概览', ov.status === 200 && ovText.includes('东线团队-' + tag), `status=${ov.status}`)
88
+ check('概览包含东线进行中任务标题', ovText.includes('东线批次复检-' + tag))
89
+ check('概览包含东线近期完成记录', ovText.includes('近期完成'))
90
+
91
+ // ===== 4. 西线 worker:search_other_teams_memory 查到东线共享知识 =====
92
+ console.log('\n━━━ 4. Worker 跨团队记忆检索 ━━━')
93
+ const hit = await invoke(west.worker.id, 'search_other_teams_memory', { query: '淬火 温度 硬度', limit: 5 })
94
+ const hitText = String(hit.text ?? '')
95
+ check('worker 检索到东线共享记忆', hit.status === 200 && hitText.includes('淬火工艺结论-' + tag),
96
+ `status=${hit.status} text=${hitText.slice(0, 60)}`)
97
+ check('检索结果带团队归属', hitText.includes('东线团队-' + tag))
98
+
99
+ // ===== 5. 权限反证:worker 查任务概览被拒(仅 lead)=====
100
+ const denied = await invoke(west.worker.id, 'list_other_teams')
101
+ check('worker 查任务概览被拒(仅 lead)', denied.isError === true || denied.status === 403 || String(denied.text ?? '').includes('Leader'),
102
+ `status=${denied.status} text=${String(denied.text ?? '').slice(0, 60)}`)
103
+
104
+ // ===== 6. 工作流语义:知识已存在 → lead 直接复用,无需发信 =====
105
+ const reuse = hitText.includes('182') && hitText.includes('HRC58')
106
+ check('跨团队知识可复用(检索内容含结论数值)', reuse)
107
+ console.log(' (工作流:命中知识 → 直接复用;未命中但有相关任务 → lead 用 send_cross_channel_message 发信请求协作)')
108
+
109
+ // ===== 清理 =====
110
+ console.log('\n━━━ 清理 ━━━')
111
+ for (const [kind, id] of [...cleanup].reverse()) {
112
+ try {
113
+ if (kind === 'channel') await api('DELETE', `/api/workshop/channels/${id}`)
114
+ else if (kind === 'team') await api('DELETE', `/api/workshop/teams/${id}`)
115
+ else if (kind === 'agent-tpl') await api('DELETE', `/api/workshop/agents/${id}`)
116
+ else if (kind === 'channel-agent') {
117
+ const [cid, aid] = String(id).split(':')
118
+ if (cid && aid) await api('DELETE', `/api/workshop/channels/${cid}/agents/${aid}`)
119
+ }
120
+ }
121
+ catch { /* 清理失败不阻断 */ }
122
+ }
123
+ console.log('清理完成')
124
+
125
+ console.log(failures === 0 ? '\nE2E ALL PASS' : `\nE2E ${failures} FAILED`)
126
+ if (failures > 0) process.exit(1)
127
+ }
128
+
129
+ main().catch((e) => { console.error(e); process.exit(1) })