crewly 1.6.1 → 1.6.2
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.
- package/config/roles/orchestrator/prompt.md +16 -0
- package/config/skills/agent/core/get-my-active-work/SKILL.md +101 -0
- package/config/skills/agent/core/get-my-active-work/execute.sh +122 -0
- package/config/skills/agent/core/record-learning/SKILL.md +29 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +41 -0
- package/config/skills/agent/core/reply-channel/execute.sh +165 -0
- package/config/skills/agent/core/reply-channel/execute.test.sh +148 -0
- package/config/skills/agent/remote-browser/execute.sh +296 -14
- package/config/skills/agent/remote-browser/execute.test.sh +482 -0
- package/config/skills/orchestrator/send-message/SKILL.md +30 -7
- package/config/skills/orchestrator/team-health-scan/SKILL.md +98 -0
- package/config/skills/orchestrator/team-health-scan/execute.sh +44 -0
- package/config/skills/registry.json +62 -1
- package/config/sops/developer/git-workflow.md +38 -3
- package/dist/backend/backend/src/constants.d.ts +69 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +69 -2
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts +53 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js +92 -0
- package/dist/backend/backend/src/controllers/active-work/active-work.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js +18 -1
- package/dist/backend/backend/src/controllers/agent-stream/agent-stream.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +68 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +233 -5
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +10 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +8 -3
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +132 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +401 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +29 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +39 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js +8 -0
- package/dist/backend/backend/src/controllers/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts +13 -13
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js +74 -234
- package/dist/backend/backend/src/controllers/onboarding/onboarding.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.controller.js +4 -6
- package/dist/backend/backend/src/controllers/request/request.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts +43 -0
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js +200 -72
- package/dist/backend/backend/src/controllers/task-management/tasks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +46 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts +59 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js +127 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts +13 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js +20 -0
- package/dist/backend/backend/src/controllers/team-health/team-health.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +9 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +233 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +40 -6
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +498 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +759 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +25 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +193 -57
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +9 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +35 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +8 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +1 -0
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux-command.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js +2 -1
- package/dist/backend/backend/src/services/agent/tmux.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +148 -3
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +241 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js +26 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +161 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +382 -2
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +105 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +232 -13
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +178 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts +25 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js +23 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.realtime-holder.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +254 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +467 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts +43 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js +54 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.team-membership.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/config.js +174 -0
- package/dist/backend/backend/src/services/chat-v2/config.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts +11 -0
- package/dist/backend/backend/src/services/chat-v2/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/index.js +12 -0
- package/dist/backend/backend/src/services/chat-v2/index.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +114 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +194 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts +100 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js +351 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +132 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +281 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +295 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/types.js +61 -0
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts +113 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js +179 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts +131 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js +227 -0
- package/dist/backend/backend/src/services/cloud/cloud-event-forwarder.service.js.map +1 -0
- package/dist/backend/backend/src/services/core/config.service.js +3 -3
- package/dist/backend/backend/src/services/core/config.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +7 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +15 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +69 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +118 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +275 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +736 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +123 -29
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js +304 -0
- package/dist/backend/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +24 -4
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts +174 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js +375 -0
- package/dist/backend/backend/src/services/memory/auto-learning.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts +97 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.d.ts.map +1 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js +209 -0
- package/dist/backend/backend/src/services/memory/learning-format.validator.js.map +1 -0
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +19 -4
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts +16 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js +32 -5
- package/dist/backend/backend/src/services/onboarding/onboarding-provision.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts +157 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js +229 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts +141 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js +18 -0
- package/dist/backend/backend/src/services/onboarding/onboarding.types.js.map +1 -0
- package/dist/backend/backend/src/services/pr-review/pr-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js +1 -1
- package/dist/backend/backend/src/services/pr-review/pr-review.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js +17 -1
- package/dist/backend/backend/src/services/slack/cross-machine-message.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +39 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +158 -26
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +248 -6
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +531 -51
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/team-health/index.d.ts +16 -0
- package/dist/backend/backend/src/services/team-health/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/index.js +16 -0
- package/dist/backend/backend/src/services/team-health/index.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts +52 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js +161 -0
- package/dist/backend/backend/src/services/team-health/live-team-health-data-provider.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts +53 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js +88 -0
- package/dist/backend/backend/src/services/team-health/lost-dispatch-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts +44 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js +83 -0
- package/dist/backend/backend/src/services/team-health/stale-trigger-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts +92 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js +328 -0
- package/dist/backend/backend/src/services/team-health/team-health-alert-router.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts +41 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js +213 -0
- package/dist/backend/backend/src/services/team-health/team-health-config.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts +46 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js +347 -0
- package/dist/backend/backend/src/services/team-health/team-health-detector.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts +154 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js +94 -0
- package/dist/backend/backend/src/services/team-health/team-health-types.js.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts +111 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js +226 -0
- package/dist/backend/backend/src/services/team-health/team-health-watchdog.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +148 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +545 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts +499 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +1105 -0
- package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +71 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +1 -0
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +22 -6
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +19 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +43 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +22 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/review-reason.types.d.ts +63 -0
- package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/review-reason.types.js +50 -0
- package/dist/backend/backend/src/types/review-reason.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +4 -1
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +18 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js +1 -0
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/backend/src/utils/team.utils.d.ts +38 -0
- package/dist/backend/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/team.utils.js +45 -0
- package/dist/backend/backend/src/utils/team.utils.js.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts +195 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.d.ts.map +1 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js +401 -0
- package/dist/backend/backend/src/websocket/chat-v2.gateway.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +37 -2
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +106 -5
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +69 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +69 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/core/config.service.js +3 -3
- package/dist/cli/backend/src/services/core/config.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +7 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +15 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +18 -2
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +49 -13
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +123 -29
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +24 -4
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +22 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +25 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/frontend/dist/assets/{index-70356616.js → index-7a4e7df5.js} +328 -326
- package/frontend/dist/assets/index-b7e59b2b.css +33 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +2 -1
- package/config/skills/orchestrator/recall/SKILL.md +0 -47
- package/config/skills/orchestrator/recall/execute.sh +0 -13
- package/config/skills/orchestrator/record-learning/SKILL.md +0 -47
- package/config/skills/orchestrator/record-learning/execute.sh +0 -13
- package/config/skills/orchestrator/remember/SKILL.md +0 -55
- package/config/skills/orchestrator/remember/execute.sh +0 -15
- package/frontend/dist/assets/index-6aaa0630.css +0 -33
|
@@ -13,8 +13,26 @@
|
|
|
13
13
|
* @module services/browser/browser-bridge.service
|
|
14
14
|
*/
|
|
15
15
|
import { WebSocketServer, WebSocket } from 'ws';
|
|
16
|
+
import { createRequire } from 'module';
|
|
17
|
+
import { pathToFileURL } from 'url';
|
|
16
18
|
import { LoggerService } from '../core/logger.service.js';
|
|
17
19
|
import { BROWSER_BRIDGE_CONSTANTS } from '../../constants.js';
|
|
20
|
+
/**
|
|
21
|
+
* CJS-style `require` for synchronous lookups of the
|
|
22
|
+
* `BrowserRelayAdapter` (see `getStatus` / `isConnected` below). A
|
|
23
|
+
* top-level ESM import would force the relay adapter to load eagerly
|
|
24
|
+
* at module init time even when the relay isn't available; keeping
|
|
25
|
+
* the lazy access avoids that.
|
|
26
|
+
*
|
|
27
|
+
* Anchor `createRequire` to `process.argv[1]` (entry script) instead of
|
|
28
|
+
* `import.meta.url`. The previous `new Function('return import.meta.url')()`
|
|
29
|
+
* trick parsed clean under ts-jest's CJS but failed at runtime because
|
|
30
|
+
* `new Function(...)` runs in non-module scope where `import.meta` is a
|
|
31
|
+
* SyntaxError.
|
|
32
|
+
*/
|
|
33
|
+
const nodeRequire = typeof require === 'function'
|
|
34
|
+
? require
|
|
35
|
+
: createRequire(pathToFileURL(process.argv[1] || process.cwd()).href);
|
|
18
36
|
/**
|
|
19
37
|
* BrowserBridgeService manages WebSocket connections from the Crewly Chrome
|
|
20
38
|
* Extension and provides a command-response bridge for the REST API layer.
|
|
@@ -28,6 +46,16 @@ export class BrowserBridgeService {
|
|
|
28
46
|
clients = new Map();
|
|
29
47
|
pendingCommands = new Map();
|
|
30
48
|
commandCounter = 0;
|
|
49
|
+
/**
|
|
50
|
+
* Per-agent tab bindings (per-tab dispatch §3.2). Keyed by `agentSession`
|
|
51
|
+
* so each agent has at most one bound tab. Cleared on `unbindAgentTab`,
|
|
52
|
+
* tab-removed events from the Extension, TTL expiry, or shutdown.
|
|
53
|
+
*/
|
|
54
|
+
agentTabBindings = new Map();
|
|
55
|
+
/** Periodic timer that evicts idle bindings (§4.2). Only running while attached. */
|
|
56
|
+
sweepTimer = null;
|
|
57
|
+
/** Last time we logged the soft-cap warning, used to throttle to once per sweep cycle. */
|
|
58
|
+
softWarnLoggedAt = 0;
|
|
31
59
|
constructor() {
|
|
32
60
|
this.logger = LoggerService.getInstance().createComponentLogger('BrowserBridge');
|
|
33
61
|
}
|
|
@@ -127,6 +155,8 @@ export class BrowserBridgeService {
|
|
|
127
155
|
this.wss.on('error', (err) => {
|
|
128
156
|
this.logger.error('WebSocket server error', { error: err.message });
|
|
129
157
|
});
|
|
158
|
+
// Begin per-tab binding TTL sweep — only useful once attached.
|
|
159
|
+
this.startSweepTimer();
|
|
130
160
|
this.logger.info('Crewly in Chrome WebSocket server attached', {
|
|
131
161
|
path: BROWSER_BRIDGE_CONSTANTS.WS_PATH,
|
|
132
162
|
});
|
|
@@ -149,6 +179,36 @@ export class BrowserBridgeService {
|
|
|
149
179
|
}
|
|
150
180
|
return;
|
|
151
181
|
}
|
|
182
|
+
// Handle tab-removed event from the Extension (per-tab dispatch §4.3).
|
|
183
|
+
// User manually closed a Crewly tab, or Chrome reaped it — clear the binding.
|
|
184
|
+
if (msg.type === 'tabRemoved' && typeof msg.tabId === 'number') {
|
|
185
|
+
this.handleTabRemoved(msg.tabId);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Handle tab inventory from the Extension (§4.4 reconciliation handshake).
|
|
189
|
+
// Sent by the Extension after each WS connection is established.
|
|
190
|
+
if (msg.type === 'tabInventory' && Array.isArray(msg.tabs)) {
|
|
191
|
+
const tabs = msg.tabs.filter((t) => typeof t?.tabId === 'number');
|
|
192
|
+
const { orphans } = this.handleTabInventory(tabs);
|
|
193
|
+
// Ask the Extension to close orphan Crewly tabs. Best-effort —
|
|
194
|
+
// failures here only mean the tabs linger; users can close them.
|
|
195
|
+
const client = this.clients.get(clientId);
|
|
196
|
+
if (client && client.ws.readyState === WebSocket.OPEN) {
|
|
197
|
+
for (const tabId of orphans) {
|
|
198
|
+
try {
|
|
199
|
+
const id = `cmd-orphan-${++this.commandCounter}-${Date.now()}`;
|
|
200
|
+
client.ws.send(JSON.stringify({ id, tool: 'unbindTab', params: { tabId } }));
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
this.logger.warn('Failed to send orphan unbindTab', {
|
|
204
|
+
tabId,
|
|
205
|
+
error: err.message,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
152
212
|
// Handle command response (has 'id' field)
|
|
153
213
|
if (msg.id && this.pendingCommands.has(msg.id)) {
|
|
154
214
|
const pending = this.pendingCommands.get(msg.id);
|
|
@@ -210,6 +270,314 @@ export class BrowserBridgeService {
|
|
|
210
270
|
}
|
|
211
271
|
});
|
|
212
272
|
}
|
|
273
|
+
// -------------------------------------------------------------------------
|
|
274
|
+
// Per-tab dispatch (§3.2 — 1 agent : 1 tab binding)
|
|
275
|
+
// -------------------------------------------------------------------------
|
|
276
|
+
/**
|
|
277
|
+
* Look up the current binding for an agent session, if any. Read-only —
|
|
278
|
+
* does NOT update `lastActivityAt`. Use `sendCommandForAgent` for the
|
|
279
|
+
* activity-tracking lookup path.
|
|
280
|
+
*
|
|
281
|
+
* @param agentSession `X-Agent-Session` header value.
|
|
282
|
+
* @returns The binding, or `undefined` if this agent has no bound tab.
|
|
283
|
+
*/
|
|
284
|
+
getBinding(agentSession) {
|
|
285
|
+
return this.agentTabBindings.get(agentSession);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Snapshot the current bindings as a plain array — used by `GET
|
|
289
|
+
* /api/browser/bindings` and by tests.
|
|
290
|
+
*/
|
|
291
|
+
listBindings() {
|
|
292
|
+
return Array.from(this.agentTabBindings.values()).map((b) => ({ ...b }));
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Bind an agent to a fresh Chrome tab via the Extension. Idempotent: if
|
|
296
|
+
* the agent already has a binding, return it instead of creating a new
|
|
297
|
+
* tab (avoids tab leak when skill cache and backend disagree under
|
|
298
|
+
* concurrent calls).
|
|
299
|
+
*
|
|
300
|
+
* @param agentSession Owning agent session.
|
|
301
|
+
* @param opts.foreground Pass `active: true` to the Extension on create.
|
|
302
|
+
* Defaults to `false` so the user's foreground tab is never disturbed.
|
|
303
|
+
* @param opts.timeoutMs Optional override for the create-tab WS round-trip.
|
|
304
|
+
* @returns The (possibly pre-existing) binding.
|
|
305
|
+
* @throws `Error` with a `tab_pool_full` cause when at hard cap.
|
|
306
|
+
*/
|
|
307
|
+
async bindAgentTab(agentSession, opts = {}) {
|
|
308
|
+
if (!agentSession) {
|
|
309
|
+
throw new Error('bindAgentTab requires a non-empty agentSession');
|
|
310
|
+
}
|
|
311
|
+
// Idempotent: existing binding short-circuits creation.
|
|
312
|
+
const existing = this.agentTabBindings.get(agentSession);
|
|
313
|
+
if (existing) {
|
|
314
|
+
existing.lastActivityAt = new Date();
|
|
315
|
+
return existing;
|
|
316
|
+
}
|
|
317
|
+
const cap = this.getTabPoolCap();
|
|
318
|
+
if (this.agentTabBindings.size >= cap) {
|
|
319
|
+
const err = new Error(`tab_pool_full: ${this.agentTabBindings.size} bindings at hard cap ${cap}`);
|
|
320
|
+
err.code = 'tab_pool_full';
|
|
321
|
+
throw err;
|
|
322
|
+
}
|
|
323
|
+
const response = await this.sendCommand('bindTab', { active: opts.foreground === true }, opts.timeoutMs, opts.agentName);
|
|
324
|
+
if (!response.success) {
|
|
325
|
+
throw new Error(`Extension refused bindTab: ${response.error ?? 'unknown error'}`);
|
|
326
|
+
}
|
|
327
|
+
const result = (response.result ?? {});
|
|
328
|
+
if (typeof result.tabId !== 'number') {
|
|
329
|
+
throw new Error('Extension bindTab response missing numeric tabId');
|
|
330
|
+
}
|
|
331
|
+
const binding = {
|
|
332
|
+
agentSession,
|
|
333
|
+
tabId: result.tabId,
|
|
334
|
+
windowId: result.windowId,
|
|
335
|
+
boundAt: new Date(),
|
|
336
|
+
lastActivityAt: new Date(),
|
|
337
|
+
};
|
|
338
|
+
this.agentTabBindings.set(agentSession, binding);
|
|
339
|
+
this.maybeWarnSoftCap();
|
|
340
|
+
this.logger.info('Agent tab bound', {
|
|
341
|
+
agentSession,
|
|
342
|
+
tabId: binding.tabId,
|
|
343
|
+
windowId: binding.windowId,
|
|
344
|
+
bindingCount: this.agentTabBindings.size,
|
|
345
|
+
});
|
|
346
|
+
return { ...binding };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Release an agent's bound tab. Optionally instruct the Extension to
|
|
350
|
+
* close the tab as well (default: true). Safe to call when no binding
|
|
351
|
+
* exists — returns `{ released: false, tabClosed: false }` instead of
|
|
352
|
+
* throwing.
|
|
353
|
+
*/
|
|
354
|
+
async unbindAgentTab(agentSession, opts = {}) {
|
|
355
|
+
const closeTab = opts.closeTab !== false;
|
|
356
|
+
const binding = this.agentTabBindings.get(agentSession);
|
|
357
|
+
if (!binding) {
|
|
358
|
+
return { released: false, tabClosed: false };
|
|
359
|
+
}
|
|
360
|
+
this.agentTabBindings.delete(agentSession);
|
|
361
|
+
let tabClosed = false;
|
|
362
|
+
if (closeTab) {
|
|
363
|
+
try {
|
|
364
|
+
const resp = await this.sendCommand('unbindTab', { tabId: binding.tabId }, opts.timeoutMs);
|
|
365
|
+
tabClosed = resp.success === true;
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
// Non-fatal — Extension may be offline or tab already gone. Log and move on.
|
|
369
|
+
this.logger.warn('unbindTab Extension call failed (binding still cleared)', {
|
|
370
|
+
agentSession,
|
|
371
|
+
tabId: binding.tabId,
|
|
372
|
+
error: err.message,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
this.logger.info('Agent tab unbound', {
|
|
377
|
+
agentSession,
|
|
378
|
+
tabId: binding.tabId,
|
|
379
|
+
reason: opts.reason ?? 'unbind',
|
|
380
|
+
tabClosed,
|
|
381
|
+
bindingCount: this.agentTabBindings.size,
|
|
382
|
+
});
|
|
383
|
+
return { released: true, tabClosed };
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Send a command on behalf of an agent. Resolution priority (matches §4.2):
|
|
387
|
+
*
|
|
388
|
+
* 1. Explicit `tabId` in `params` — used as-is, NO ownership check
|
|
389
|
+
* (legacy testing/debug only; controller layer is responsible for
|
|
390
|
+
* enforcing cross-agent ownership rules before reaching here).
|
|
391
|
+
* 2. `agentSession` provided AND has a binding — inject bound tabId,
|
|
392
|
+
* bump `lastActivityAt`.
|
|
393
|
+
* 3. `agentSession` provided AND no binding — auto-bind first, then
|
|
394
|
+
* forward the original command with the new tabId.
|
|
395
|
+
* 4. No `agentSession` — pass through to plain `sendCommand` (active-tab
|
|
396
|
+
* fallback in Extension, preserving backward compat).
|
|
397
|
+
*
|
|
398
|
+
* @param agentSession Owning agent session, or `undefined` for legacy fallback.
|
|
399
|
+
* @param tool Tool name (e.g. `navigate`, `read-text`).
|
|
400
|
+
* @param params Tool params; if it contains `tabId` we treat as explicit override.
|
|
401
|
+
* @param timeoutMs Optional command timeout.
|
|
402
|
+
* @param agentName Optional agent name for the Extension banner.
|
|
403
|
+
*/
|
|
404
|
+
async sendCommandForAgent(agentSession, tool, params, timeoutMs, agentName) {
|
|
405
|
+
// Path 1: explicit tabId override — pass through, log so it's auditable.
|
|
406
|
+
if (params && typeof params.tabId === 'number') {
|
|
407
|
+
this.logger.debug('sendCommandForAgent: explicit tabId override', {
|
|
408
|
+
agentSession,
|
|
409
|
+
tabId: params.tabId,
|
|
410
|
+
tool,
|
|
411
|
+
});
|
|
412
|
+
return this.sendCommand(tool, params, timeoutMs, agentName);
|
|
413
|
+
}
|
|
414
|
+
// Path 4: no agent session — legacy active-tab path.
|
|
415
|
+
if (!agentSession) {
|
|
416
|
+
return this.sendCommand(tool, params, timeoutMs, agentName);
|
|
417
|
+
}
|
|
418
|
+
// Path 2 / 3: resolve binding, auto-bind on miss.
|
|
419
|
+
let binding = this.agentTabBindings.get(agentSession);
|
|
420
|
+
if (!binding) {
|
|
421
|
+
binding = await this.bindAgentTab(agentSession, { agentName, timeoutMs });
|
|
422
|
+
}
|
|
423
|
+
binding.lastActivityAt = new Date();
|
|
424
|
+
const merged = { ...(params ?? {}), tabId: binding.tabId };
|
|
425
|
+
return this.sendCommand(tool, merged, timeoutMs, agentName);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Handle a `tabRemoved` event from the Extension (§4.3 — fires when
|
|
429
|
+
* the user manually closes a Crewly tab or when Chrome reaps it).
|
|
430
|
+
* Idempotent: tabs not in any binding are ignored.
|
|
431
|
+
*/
|
|
432
|
+
handleTabRemoved(tabId) {
|
|
433
|
+
for (const [agentSession, binding] of this.agentTabBindings) {
|
|
434
|
+
if (binding.tabId === tabId) {
|
|
435
|
+
this.agentTabBindings.delete(agentSession);
|
|
436
|
+
this.logger.info('Binding cleared (tab closed in Extension)', {
|
|
437
|
+
agentSession,
|
|
438
|
+
tabId,
|
|
439
|
+
reason: 'tab_removed',
|
|
440
|
+
bindingCount: this.agentTabBindings.size,
|
|
441
|
+
});
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Reconcile bindings against the Extension's current tab inventory
|
|
448
|
+
* (§4.4). Called whenever a fresh WS connection completes the post-
|
|
449
|
+
* reconnect handshake.
|
|
450
|
+
*
|
|
451
|
+
* - For each backend binding whose tabId no longer exists in the
|
|
452
|
+
* Extension → drop the binding (`reconcile_extension_missing`).
|
|
453
|
+
* - For each Extension tab that is Crewly-owned but unknown to any
|
|
454
|
+
* binding → ask the Extension to close it (orphan cleanup).
|
|
455
|
+
*
|
|
456
|
+
* Caller is responsible for actually sending the close commands; this
|
|
457
|
+
* method returns the orphan list rather than firing `unbindTab` itself
|
|
458
|
+
* to keep the function pure-ish and easier to test.
|
|
459
|
+
*
|
|
460
|
+
* @returns Orphan tabs the caller should close.
|
|
461
|
+
*/
|
|
462
|
+
handleTabInventory(extensionTabs) {
|
|
463
|
+
const extensionTabIds = new Set(extensionTabs.filter((t) => typeof t.tabId === 'number').map((t) => t.tabId));
|
|
464
|
+
const boundTabIds = new Set(Array.from(this.agentTabBindings.values()).map((b) => b.tabId));
|
|
465
|
+
// Drop stale bindings.
|
|
466
|
+
for (const [agentSession, binding] of this.agentTabBindings) {
|
|
467
|
+
if (!extensionTabIds.has(binding.tabId)) {
|
|
468
|
+
this.agentTabBindings.delete(agentSession);
|
|
469
|
+
this.logger.info('Binding cleared (tab missing from Extension inventory)', {
|
|
470
|
+
agentSession,
|
|
471
|
+
tabId: binding.tabId,
|
|
472
|
+
reason: 'reconcile_extension_missing',
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
// Identify Crewly-owned orphans (tabs in Crewly group with no binding).
|
|
477
|
+
const orphans = [];
|
|
478
|
+
for (const tab of extensionTabs) {
|
|
479
|
+
if (typeof tab.tabId !== 'number')
|
|
480
|
+
continue;
|
|
481
|
+
if (!tab.crewlyOwned)
|
|
482
|
+
continue; // never auto-close user's regular tabs
|
|
483
|
+
if (!boundTabIds.has(tab.tabId)) {
|
|
484
|
+
orphans.push(tab.tabId);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (orphans.length > 0) {
|
|
488
|
+
this.logger.info('Reconcile found Crewly-owned orphan tabs', {
|
|
489
|
+
orphanCount: orphans.length,
|
|
490
|
+
orphanTabIds: orphans,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
return { orphans };
|
|
494
|
+
}
|
|
495
|
+
/** Effective hard cap, allowing env override `CREWLY_TAB_BIND_MAX`. */
|
|
496
|
+
getTabPoolCap() {
|
|
497
|
+
const raw = process.env['CREWLY_TAB_BIND_MAX'];
|
|
498
|
+
if (raw) {
|
|
499
|
+
const n = Number.parseInt(raw, 10);
|
|
500
|
+
if (Number.isFinite(n) && n > 0)
|
|
501
|
+
return n;
|
|
502
|
+
}
|
|
503
|
+
return BROWSER_BRIDGE_CONSTANTS.TAB_BIND_HARD_CAP;
|
|
504
|
+
}
|
|
505
|
+
/** Effective TTL in ms, allowing env override `CREWLY_TAB_BIND_TTL_MINUTES`. */
|
|
506
|
+
getTabBindingTtlMs() {
|
|
507
|
+
const raw = process.env['CREWLY_TAB_BIND_TTL_MINUTES'];
|
|
508
|
+
const minutes = raw && Number.isFinite(Number.parseFloat(raw)) && Number.parseFloat(raw) > 0
|
|
509
|
+
? Number.parseFloat(raw)
|
|
510
|
+
: BROWSER_BRIDGE_CONSTANTS.TAB_BIND_TTL_MINUTES;
|
|
511
|
+
return minutes * 60 * 1000;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Soft warning ping when bindings cross the warn threshold. Throttled
|
|
515
|
+
* to once per sweep cycle so we don't flood the logs during a burst.
|
|
516
|
+
*/
|
|
517
|
+
maybeWarnSoftCap() {
|
|
518
|
+
if (this.agentTabBindings.size < BROWSER_BRIDGE_CONSTANTS.TAB_BIND_SOFT_WARN)
|
|
519
|
+
return;
|
|
520
|
+
const now = Date.now();
|
|
521
|
+
if (now - this.softWarnLoggedAt < BROWSER_BRIDGE_CONSTANTS.TAB_BIND_SWEEP_MS)
|
|
522
|
+
return;
|
|
523
|
+
this.softWarnLoggedAt = now;
|
|
524
|
+
this.logger.warn('Browser bindings crossed soft warn threshold', {
|
|
525
|
+
bindingCount: this.agentTabBindings.size,
|
|
526
|
+
softWarnAt: BROWSER_BRIDGE_CONSTANTS.TAB_BIND_SOFT_WARN,
|
|
527
|
+
hardCap: this.getTabPoolCap(),
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Run the TTL sweep once. Idle bindings (`lastActivityAt + TTL < now`)
|
|
532
|
+
* are removed. Sends `unbindTab` to the Extension when a client is
|
|
533
|
+
* connected, but never fails the sweep on Extension errors.
|
|
534
|
+
*
|
|
535
|
+
* Exported via `runSweepOnce` for tests so we don't have to advance
|
|
536
|
+
* fake timers across the full 5-minute interval.
|
|
537
|
+
*
|
|
538
|
+
* @returns Number of bindings evicted in this pass.
|
|
539
|
+
*/
|
|
540
|
+
async runSweepOnce() {
|
|
541
|
+
const ttlMs = this.getTabBindingTtlMs();
|
|
542
|
+
const now = Date.now();
|
|
543
|
+
const expired = [];
|
|
544
|
+
for (const [agentSession, binding] of this.agentTabBindings) {
|
|
545
|
+
if (now - binding.lastActivityAt.getTime() > ttlMs) {
|
|
546
|
+
expired.push({ agentSession, tabId: binding.tabId });
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
for (const { agentSession } of expired) {
|
|
550
|
+
await this.unbindAgentTab(agentSession, {
|
|
551
|
+
closeTab: true,
|
|
552
|
+
reason: 'ttl_expired',
|
|
553
|
+
}).catch((err) => {
|
|
554
|
+
this.logger.warn('Sweep unbind failed (binding still removed)', {
|
|
555
|
+
agentSession,
|
|
556
|
+
error: err.message,
|
|
557
|
+
});
|
|
558
|
+
});
|
|
559
|
+
}
|
|
560
|
+
return expired.length;
|
|
561
|
+
}
|
|
562
|
+
startSweepTimer() {
|
|
563
|
+
if (this.sweepTimer)
|
|
564
|
+
return;
|
|
565
|
+
this.sweepTimer = setInterval(() => {
|
|
566
|
+
this.runSweepOnce().catch((err) => {
|
|
567
|
+
this.logger.error('TTL sweep crashed', { error: err.message });
|
|
568
|
+
});
|
|
569
|
+
}, BROWSER_BRIDGE_CONSTANTS.TAB_BIND_SWEEP_MS);
|
|
570
|
+
// Don't keep the event loop alive solely for the sweep timer.
|
|
571
|
+
if (typeof this.sweepTimer.unref === 'function') {
|
|
572
|
+
this.sweepTimer.unref();
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
stopSweepTimer() {
|
|
576
|
+
if (this.sweepTimer) {
|
|
577
|
+
clearInterval(this.sweepTimer);
|
|
578
|
+
this.sweepTimer = null;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
213
581
|
/**
|
|
214
582
|
* Get the current bridge status, including relay availability.
|
|
215
583
|
*
|
|
@@ -221,7 +589,7 @@ export class BrowserBridgeService {
|
|
|
221
589
|
let relayDeviceId = null;
|
|
222
590
|
try {
|
|
223
591
|
// Dynamic import avoided — use synchronous check
|
|
224
|
-
const { BrowserRelayAdapter } =
|
|
592
|
+
const { BrowserRelayAdapter } = nodeRequire('./browser-relay-adapter.service.js');
|
|
225
593
|
const adapter = BrowserRelayAdapter.getInstance();
|
|
226
594
|
relayAvailable = adapter.isAvailable();
|
|
227
595
|
relayDeviceId = adapter.getExtensionDeviceId();
|
|
@@ -235,6 +603,7 @@ export class BrowserBridgeService {
|
|
|
235
603
|
wsPath: BROWSER_BRIDGE_CONSTANTS.WS_PATH,
|
|
236
604
|
relayAvailable,
|
|
237
605
|
relayDeviceId,
|
|
606
|
+
bindingCount: this.agentTabBindings.size,
|
|
238
607
|
};
|
|
239
608
|
}
|
|
240
609
|
/**
|
|
@@ -249,7 +618,7 @@ export class BrowserBridgeService {
|
|
|
249
618
|
return true;
|
|
250
619
|
// Check relay fallback
|
|
251
620
|
try {
|
|
252
|
-
const { BrowserRelayAdapter } =
|
|
621
|
+
const { BrowserRelayAdapter } = nodeRequire('./browser-relay-adapter.service.js');
|
|
253
622
|
const adapter = BrowserRelayAdapter.getInstance();
|
|
254
623
|
return adapter.isAvailable();
|
|
255
624
|
}
|
|
@@ -276,6 +645,17 @@ export class BrowserBridgeService {
|
|
|
276
645
|
* Shut down the WebSocket server and disconnect all clients.
|
|
277
646
|
*/
|
|
278
647
|
stop() {
|
|
648
|
+
// Stop the per-tab binding TTL sweep before tearing down state.
|
|
649
|
+
this.stopSweepTimer();
|
|
650
|
+
// Clear pending agent→tab bindings without sending unbindTab to the
|
|
651
|
+
// Extension — process is exiting; orphan cleanup happens on next
|
|
652
|
+
// reconnect handshake (§4.4) instead.
|
|
653
|
+
if (this.agentTabBindings.size > 0) {
|
|
654
|
+
this.logger.info('Bridge shutting down with active bindings', {
|
|
655
|
+
bindingCount: this.agentTabBindings.size,
|
|
656
|
+
});
|
|
657
|
+
this.agentTabBindings.clear();
|
|
658
|
+
}
|
|
279
659
|
// Clear all pending commands
|
|
280
660
|
for (const [id, pending] of this.pendingCommands) {
|
|
281
661
|
clearTimeout(pending.timer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,16 @@ export interface BrowserInstanceInfo {
|
|
|
22
22
|
sessionId: string;
|
|
23
23
|
/** ISO timestamp of last activity (heartbeat, command, or event) */
|
|
24
24
|
lastSeenAt: string;
|
|
25
|
+
/**
|
|
26
|
+
* Optional stable identifier of the physical device the extension runs on.
|
|
27
|
+
* Used to dedup re-install events that produce a fresh `instanceId` UUID
|
|
28
|
+
* for the same underlying browser. Backward compatible: if absent on either
|
|
29
|
+
* side of a comparison, dedup is skipped — older ext builds that do not
|
|
30
|
+
* emit this field continue to behave exactly as before.
|
|
31
|
+
*
|
|
32
|
+
* Spec: `.crewly/specs/browser-ext-stale-status-fix-2026-04-30.md`.
|
|
33
|
+
*/
|
|
34
|
+
deviceFingerprint?: string;
|
|
25
35
|
}
|
|
26
36
|
/** Connection state of the proxy to the cloud relay. */
|
|
27
37
|
export type ProxyConnectionState = 'disconnected' | 'connecting' | 'connected';
|
|
@@ -57,6 +67,22 @@ export declare class BrowserProxyService {
|
|
|
57
67
|
private heartbeatTimer;
|
|
58
68
|
/** Reconnect timer */
|
|
59
69
|
private reconnectTimer;
|
|
70
|
+
/**
|
|
71
|
+
* Heartbeat tick counter. Resets on each `startHeartbeat()` call (i.e. on
|
|
72
|
+
* fresh registration). Used to fire a defensive `list_browsers` re-issue
|
|
73
|
+
* every {@link BROWSER_PROXY_CONSTANTS.LIST_REFRESH_EVERY_N_HEARTBEATS}
|
|
74
|
+
* ticks so the local `instances` Map stays bounded against the 5-min
|
|
75
|
+
* sweep purge even when the cloud relay drops `browser_event:updated`
|
|
76
|
+
* pushes (observed during 2026-04-30 SteamFun customer demo).
|
|
77
|
+
*/
|
|
78
|
+
private heartbeatTickCounter;
|
|
79
|
+
/**
|
|
80
|
+
* Wall-clock TTL sweep timer. Runs every {@link BROWSER_PROXY_CONSTANTS.SWEEP_INTERVAL_MS}
|
|
81
|
+
* and purges any `BrowserInstanceInfo` whose `lastSeenAt` exceeds
|
|
82
|
+
* {@link BROWSER_PROXY_CONSTANTS.STALE_PURGE_THRESHOLD_MS}. Independent of
|
|
83
|
+
* the heartbeat — guards against the relay dropping a `disconnected` event.
|
|
84
|
+
*/
|
|
85
|
+
private sweepTimer;
|
|
60
86
|
/** Auth token for relay registration */
|
|
61
87
|
private authToken;
|
|
62
88
|
/** Relay WebSocket URL */
|
|
@@ -163,6 +189,16 @@ export declare class BrowserProxyService {
|
|
|
163
189
|
/**
|
|
164
190
|
* Resolve which browser instance to target.
|
|
165
191
|
*
|
|
192
|
+
* Auto-select rules when no explicit `instance` is provided:
|
|
193
|
+
* - 0 instances → null (caller raises "No browser instances connected")
|
|
194
|
+
* - 1 instance → that instance
|
|
195
|
+
* - N>1 instances → the freshest by `lastSeenAt`. This handles two cases:
|
|
196
|
+
* (a) Multiple Chromes connected (user gets the most-recently-active one).
|
|
197
|
+
* (b) Ghost entries left behind by a relay that has not yet pruned a
|
|
198
|
+
* stale session after the extension reconnected with a new sessionId.
|
|
199
|
+
* The freshest entry is the live one.
|
|
200
|
+
* Ties on `lastSeenAt` are broken by insertion order (Map iteration).
|
|
201
|
+
*
|
|
166
202
|
* @param instance - Explicit instance name/ID, or undefined for auto-select
|
|
167
203
|
* @returns Matching BrowserInstanceInfo or null
|
|
168
204
|
*/
|
|
@@ -183,12 +219,27 @@ export declare class BrowserProxyService {
|
|
|
183
219
|
/**
|
|
184
220
|
* Handle browser_list message from relay.
|
|
185
221
|
*
|
|
222
|
+
* Behavior:
|
|
223
|
+
* 1. Clear and rebuild the local instance Map from the relay snapshot.
|
|
224
|
+
* `deviceFingerprint`, when present on incoming entries, is preserved
|
|
225
|
+
* via the spread so the dedup pass below can use it.
|
|
226
|
+
* 2. Group entries by `deviceFingerprint`. For each group with more than
|
|
227
|
+
* one entry (relay snapshot contains a ghost row alongside the live
|
|
228
|
+
* row, e.g. extension was reinstalled and the relay still caches the
|
|
229
|
+
* previous session), invoke `dedupByFingerprint` with the freshest
|
|
230
|
+
* entry in the group — the freshest "wins" and older rows are removed.
|
|
231
|
+
*
|
|
186
232
|
* @param instances - Array of browser instance info from relay
|
|
187
233
|
*/
|
|
188
234
|
private handleBrowserList;
|
|
189
235
|
/**
|
|
190
236
|
* Handle browser_event (connected/disconnected/updated) from relay.
|
|
191
237
|
*
|
|
238
|
+
* On `connected`, propagates the optional `deviceFingerprint` from the
|
|
239
|
+
* relay payload onto the new entry, then runs `dedupByFingerprint` so
|
|
240
|
+
* an older entry with the same fingerprint (e.g. previous install of
|
|
241
|
+
* the extension on this device) is collapsed in favor of the new one.
|
|
242
|
+
*
|
|
192
243
|
* @param msg - Event message
|
|
193
244
|
*/
|
|
194
245
|
private handleBrowserEvent;
|
|
@@ -206,12 +257,66 @@ export declare class BrowserProxyService {
|
|
|
206
257
|
private sendRaw;
|
|
207
258
|
/**
|
|
208
259
|
* Start heartbeat interval to keep relay connection alive.
|
|
260
|
+
*
|
|
261
|
+
* Beyond the basic relay keepalive, every Nth tick (controlled by
|
|
262
|
+
* {@link BROWSER_PROXY_CONSTANTS.LIST_REFRESH_EVERY_N_HEARTBEATS}) we
|
|
263
|
+
* re-issue `list_browsers` so the local `instances` Map is refreshed
|
|
264
|
+
* even if the cloud relay drops `browser_event:updated` pushes. This
|
|
265
|
+
* is a defensive sync against a real bug observed during the 2026-04-30
|
|
266
|
+
* SteamFun customer demo where ext registrations were correctly synced
|
|
267
|
+
* on initial connect but `lastSeenAt` was never refreshed by ongoing
|
|
268
|
+
* heartbeats — leading to the 5-min sweep purging live ext entries and
|
|
269
|
+
* surfacing 503 NO_BROWSER_CLIENT to callers.
|
|
270
|
+
*
|
|
271
|
+
* Resets the tick counter so a re-`start` (e.g. after reconnect) does
|
|
272
|
+
* not accidentally fire the refresh on the very first tick post-reset.
|
|
209
273
|
*/
|
|
210
274
|
private startHeartbeat;
|
|
211
275
|
/**
|
|
212
276
|
* Stop heartbeat interval.
|
|
213
277
|
*/
|
|
214
278
|
private stopHeartbeat;
|
|
279
|
+
/**
|
|
280
|
+
* Start the wall-clock TTL sweep timer.
|
|
281
|
+
*
|
|
282
|
+
* Independent of the heartbeat. Every
|
|
283
|
+
* {@link BROWSER_PROXY_CONSTANTS.SWEEP_INTERVAL_MS} (default 60s) it walks
|
|
284
|
+
* `this.instances` and deletes any entry whose `lastSeenAt` is older than
|
|
285
|
+
* {@link BROWSER_PROXY_CONSTANTS.STALE_PURGE_THRESHOLD_MS} (default 5 min).
|
|
286
|
+
*
|
|
287
|
+
* Why: the relay is supposed to push a `browser_event:disconnected` when
|
|
288
|
+
* an extension drops, but in practice that event is occasionally lost
|
|
289
|
+
* (network blip, ext crash without graceful close). Without a sweep, the
|
|
290
|
+
* `instances` Map accumulates phantom entries that the Cloud Portal then
|
|
291
|
+
* renders as "Online" even though their `lastSeenAt` is hours stale.
|
|
292
|
+
*
|
|
293
|
+
* Idempotent: calls `stopSweepTimer()` first to avoid stacking intervals
|
|
294
|
+
* on an already-running proxy (e.g. on reconnect).
|
|
295
|
+
*/
|
|
296
|
+
private startSweepTimer;
|
|
297
|
+
/**
|
|
298
|
+
* Stop the wall-clock TTL sweep timer. Safe to call when no timer is
|
|
299
|
+
* running (no-op via the null guard).
|
|
300
|
+
*/
|
|
301
|
+
private stopSweepTimer;
|
|
302
|
+
/**
|
|
303
|
+
* Collapse older entries in `this.instances` that share a `deviceFingerprint`
|
|
304
|
+
* with the incoming entry.
|
|
305
|
+
*
|
|
306
|
+
* Use case: a user reinstalls / updates the Chrome extension. The fresh
|
|
307
|
+
* install generates a new `instanceId` UUID and registers via the relay.
|
|
308
|
+
* Without dedup, the Cloud Portal would show two rows for the same
|
|
309
|
+
* physical browser — the new live one and the old phantom one — until
|
|
310
|
+
* the TTL sweep eventually purges the old row 5 min later.
|
|
311
|
+
*
|
|
312
|
+
* Backward compatible: if `incoming.deviceFingerprint` is falsy or empty,
|
|
313
|
+
* this is a no-op. Older ext builds that do not yet emit `deviceFingerprint`
|
|
314
|
+
* therefore continue to behave exactly as before — the TTL sweep alone
|
|
315
|
+
* still cleans them up over the 5-min threshold.
|
|
316
|
+
*
|
|
317
|
+
* @param incoming - Entry that was just registered/refreshed
|
|
318
|
+
*/
|
|
319
|
+
private dedupByFingerprint;
|
|
215
320
|
/**
|
|
216
321
|
* Handle disconnection — clean up and optionally reconnect with backoff.
|
|
217
322
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-proxy.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-proxy.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAG1E,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-proxy.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-proxy.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAG1E,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAYD,wDAAwD;AACxD,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;AAiB/E;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,MAAM,GAAG,IAAI,CAAC;AAEhD;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAA0B;IACpC,6DAA6D;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,uBAAuB;IACvB,OAAO,CAAC,KAAK,CAAwC;IACrD,2DAA2D;IAC3D,OAAO,CAAC,eAAe,CAA+C;IACtE,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAA+C;IAChE,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B,+BAA+B;IAC/B,OAAO,CAAC,cAAc,CAA+C;IACrE,sBAAsB;IACtB,OAAO,CAAC,cAAc,CAA8C;IACpE;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB,CAAK;IACjC;;;;;OAKG;IACH,OAAO,CAAC,UAAU,CAA+C;IACjE,wCAAwC;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,0BAA0B;IAC1B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,wCAAwC;IACxC,OAAO,CAAC,aAAa,CAAQ;IAC7B,0DAA0D;IAC1D,OAAO,CAAC,aAAa,CAAS;IAC9B,sEAAsE;IACtE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,wEAAwE;IACxE,OAAO,CAAC,aAAa,CAA8B;IAEnD,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;OAQG;IACH,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI/C;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA+BnC;;;;;;;;OAQG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAwD/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,QAAQ,IAAI,oBAAoB;IAIhC;;;;OAIG;IACH,YAAY,IAAI,mBAAmB,EAAE;IAIrC;;;;;;;;;;;;;;OAcG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,GAAE,MAAoD,EAC/D,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC;IAoDlC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,eAAe;IA+BvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA4DrB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IAkD1B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAMf;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,cAAc;IA8BtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAOtB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAmGxB;;OAEG;IACH,OAAO,CAAC,OAAO;CAgChB"}
|