crewly 1.20.133 → 1.20.135
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/skills/agent/core/block-task/SKILL.md +16 -3
- package/dist/backend/backend/src/constants.d.ts +82 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +87 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +6 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +9 -2
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +28 -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 +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +43 -7
- 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 +144 -51
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/registration-flow-registry.d.ts +92 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.js +121 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.d.ts +66 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.js +72 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +9 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +8 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +85 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +32 -0
- 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 +60 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +5 -2
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +4 -2
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +37 -0
- 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 +33 -0
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +82 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +87 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +43 -7
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +144 -51
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/registration-flow-registry.d.ts +92 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.js +121 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.js.map +1 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.d.ts +66 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.js +72 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.js +20 -0
- package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +85 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +32 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +60 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.js +5 -2
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.js +10 -0
- package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +37 -0
- 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 +33 -0
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +80 -3
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +5 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +5 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +15 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/frontend/dist/assets/{index-e6c403b6.js → index-2c7ee4a6.js} +276 -276
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration flow registry: at most one live registration/kickoff flow per
|
|
3
|
+
* agent session, bound to the PTY it was started for.
|
|
4
|
+
*
|
|
5
|
+
* Background (2026-09-25 startup-prompt loop): two launchers brought the same
|
|
6
|
+
* agent up at boot. The second one killed the first one's PTY and built a new
|
|
7
|
+
* one under the same session name, but the first one's background
|
|
8
|
+
* registration flow was never cancelled. It kept polling the session by name,
|
|
9
|
+
* found the replacement PTY, and typed its own kickoff into it, so the agent
|
|
10
|
+
* saw two kickoffs in one resumed conversation.
|
|
11
|
+
*
|
|
12
|
+
* A flow is therefore cancelled when:
|
|
13
|
+
* - a newer flow starts for the same session (it supersedes the old one),
|
|
14
|
+
* - the session is killed or recreated ({@link RegistrationFlowRegistry.cancel}), or
|
|
15
|
+
* - the PTY now registered under the session name is not the one the flow was
|
|
16
|
+
* started for. This catches kills from any code path, including ones that
|
|
17
|
+
* never call `cancel`.
|
|
18
|
+
*
|
|
19
|
+
* Senders must check {@link RegistrationFlowRegistry.isCancelled} right before
|
|
20
|
+
* every write to the terminal.
|
|
21
|
+
*
|
|
22
|
+
* @module services/agent/registration-flow-registry
|
|
23
|
+
*/
|
|
24
|
+
/** A live registration flow for one session incarnation. */
|
|
25
|
+
export interface RegistrationFlow {
|
|
26
|
+
/** Session name the flow delivers into. */
|
|
27
|
+
readonly sessionName: string;
|
|
28
|
+
/** Monotonic per-session generation; a newer flow has a higher number. */
|
|
29
|
+
readonly generation: number;
|
|
30
|
+
/** Aborted when the flow is superseded, cancelled or its PTY is replaced. */
|
|
31
|
+
readonly signal: AbortSignal;
|
|
32
|
+
}
|
|
33
|
+
/** Why a flow was cancelled (logged by the caller). */
|
|
34
|
+
export type RegistrationFlowCancelReason = 'superseded' | 'session-killed' | 'session-replaced' | 'runtime-exited';
|
|
35
|
+
/**
|
|
36
|
+
* Tracks the single live registration flow per session.
|
|
37
|
+
*
|
|
38
|
+
* @typeParam TSession - Identity object of a live PTY (compared by reference)
|
|
39
|
+
*/
|
|
40
|
+
export declare class RegistrationFlowRegistry<TSession extends object = object> {
|
|
41
|
+
private readonly current;
|
|
42
|
+
private readonly bySignal;
|
|
43
|
+
private readonly generations;
|
|
44
|
+
/**
|
|
45
|
+
* Start a flow for a session. Any earlier flow for the same session is
|
|
46
|
+
* aborted first: only the newest incarnation may deliver a kickoff.
|
|
47
|
+
*
|
|
48
|
+
* @param sessionName - Session the flow delivers into
|
|
49
|
+
* @param boundSession - The PTY currently registered under that name (undefined for in-process runtimes)
|
|
50
|
+
* @returns The new flow and whether an older one was superseded
|
|
51
|
+
*/
|
|
52
|
+
begin(sessionName: string, boundSession: TSession | undefined): {
|
|
53
|
+
flow: RegistrationFlow;
|
|
54
|
+
superseded: boolean;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Abort the live flow for a session, if any.
|
|
58
|
+
*
|
|
59
|
+
* @param sessionName - Session whose flow to abort
|
|
60
|
+
* @param reason - Why (recorded on the abort signal)
|
|
61
|
+
* @returns True when a live flow was aborted
|
|
62
|
+
*/
|
|
63
|
+
cancel(sessionName: string, reason: RegistrationFlowCancelReason): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Decide whether a flow may still write to its session. Aborts the flow
|
|
66
|
+
* (and says so) when the session's PTY has been replaced or removed since
|
|
67
|
+
* the flow started, or a newer flow took over.
|
|
68
|
+
*
|
|
69
|
+
* Signals the registry does not know are judged by `aborted` alone, so
|
|
70
|
+
* callers can pass any AbortSignal.
|
|
71
|
+
*
|
|
72
|
+
* @param signal - The flow's abort signal (undefined = not a guarded flow)
|
|
73
|
+
* @param currentSession - The PTY registered under the session name right now
|
|
74
|
+
* @returns True when the flow must not write anything further
|
|
75
|
+
*/
|
|
76
|
+
isCancelled(signal: AbortSignal | undefined, currentSession: TSession | undefined): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Mark a flow finished. Only removes it while it is still the live flow,
|
|
79
|
+
* so a finishing old flow can never drop its successor's entry.
|
|
80
|
+
*
|
|
81
|
+
* @param flow - The finished flow
|
|
82
|
+
*/
|
|
83
|
+
end(flow: RegistrationFlow): void;
|
|
84
|
+
/**
|
|
85
|
+
* Whether a session has a live (not yet finished or aborted) flow.
|
|
86
|
+
*
|
|
87
|
+
* @param sessionName - Session to check
|
|
88
|
+
* @returns True when a flow is in progress
|
|
89
|
+
*/
|
|
90
|
+
has(sessionName: string): boolean;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=registration-flow-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-flow-registry.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/registration-flow-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAChC,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC7B;AAUD,uDAAuD;AACvD,MAAM,MAAM,4BAA4B,GACrC,YAAY,GACZ,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,CAAC;AAEpB;;;;GAIG;AACH,qBAAa,wBAAwB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoD;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IAEzD;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE;IAY/G;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,GAAG,OAAO;IAQ1E;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,cAAc,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO;IAkB3F;;;;;OAKG;IACH,GAAG,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAKjC;;;;;OAKG;IACH,GAAG,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAGjC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registration flow registry: at most one live registration/kickoff flow per
|
|
3
|
+
* agent session, bound to the PTY it was started for.
|
|
4
|
+
*
|
|
5
|
+
* Background (2026-09-25 startup-prompt loop): two launchers brought the same
|
|
6
|
+
* agent up at boot. The second one killed the first one's PTY and built a new
|
|
7
|
+
* one under the same session name, but the first one's background
|
|
8
|
+
* registration flow was never cancelled. It kept polling the session by name,
|
|
9
|
+
* found the replacement PTY, and typed its own kickoff into it, so the agent
|
|
10
|
+
* saw two kickoffs in one resumed conversation.
|
|
11
|
+
*
|
|
12
|
+
* A flow is therefore cancelled when:
|
|
13
|
+
* - a newer flow starts for the same session (it supersedes the old one),
|
|
14
|
+
* - the session is killed or recreated ({@link RegistrationFlowRegistry.cancel}), or
|
|
15
|
+
* - the PTY now registered under the session name is not the one the flow was
|
|
16
|
+
* started for. This catches kills from any code path, including ones that
|
|
17
|
+
* never call `cancel`.
|
|
18
|
+
*
|
|
19
|
+
* Senders must check {@link RegistrationFlowRegistry.isCancelled} right before
|
|
20
|
+
* every write to the terminal.
|
|
21
|
+
*
|
|
22
|
+
* @module services/agent/registration-flow-registry
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Tracks the single live registration flow per session.
|
|
26
|
+
*
|
|
27
|
+
* @typeParam TSession - Identity object of a live PTY (compared by reference)
|
|
28
|
+
*/
|
|
29
|
+
export class RegistrationFlowRegistry {
|
|
30
|
+
current = new Map();
|
|
31
|
+
bySignal = new WeakMap();
|
|
32
|
+
generations = new Map();
|
|
33
|
+
/**
|
|
34
|
+
* Start a flow for a session. Any earlier flow for the same session is
|
|
35
|
+
* aborted first: only the newest incarnation may deliver a kickoff.
|
|
36
|
+
*
|
|
37
|
+
* @param sessionName - Session the flow delivers into
|
|
38
|
+
* @param boundSession - The PTY currently registered under that name (undefined for in-process runtimes)
|
|
39
|
+
* @returns The new flow and whether an older one was superseded
|
|
40
|
+
*/
|
|
41
|
+
begin(sessionName, boundSession) {
|
|
42
|
+
const superseded = this.cancel(sessionName, 'superseded');
|
|
43
|
+
const generation = (this.generations.get(sessionName) ?? 0) + 1;
|
|
44
|
+
this.generations.set(sessionName, generation);
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
const flow = { sessionName, generation, signal: controller.signal };
|
|
47
|
+
const record = { flow, controller, boundSession };
|
|
48
|
+
this.current.set(sessionName, record);
|
|
49
|
+
this.bySignal.set(controller.signal, record);
|
|
50
|
+
return { flow, superseded };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Abort the live flow for a session, if any.
|
|
54
|
+
*
|
|
55
|
+
* @param sessionName - Session whose flow to abort
|
|
56
|
+
* @param reason - Why (recorded on the abort signal)
|
|
57
|
+
* @returns True when a live flow was aborted
|
|
58
|
+
*/
|
|
59
|
+
cancel(sessionName, reason) {
|
|
60
|
+
const record = this.current.get(sessionName);
|
|
61
|
+
if (!record)
|
|
62
|
+
return false;
|
|
63
|
+
this.current.delete(sessionName);
|
|
64
|
+
if (!record.controller.signal.aborted)
|
|
65
|
+
record.controller.abort(reason);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Decide whether a flow may still write to its session. Aborts the flow
|
|
70
|
+
* (and says so) when the session's PTY has been replaced or removed since
|
|
71
|
+
* the flow started, or a newer flow took over.
|
|
72
|
+
*
|
|
73
|
+
* Signals the registry does not know are judged by `aborted` alone, so
|
|
74
|
+
* callers can pass any AbortSignal.
|
|
75
|
+
*
|
|
76
|
+
* @param signal - The flow's abort signal (undefined = not a guarded flow)
|
|
77
|
+
* @param currentSession - The PTY registered under the session name right now
|
|
78
|
+
* @returns True when the flow must not write anything further
|
|
79
|
+
*/
|
|
80
|
+
isCancelled(signal, currentSession) {
|
|
81
|
+
if (!signal)
|
|
82
|
+
return false;
|
|
83
|
+
if (signal.aborted)
|
|
84
|
+
return true;
|
|
85
|
+
const record = this.bySignal.get(signal);
|
|
86
|
+
if (!record)
|
|
87
|
+
return false;
|
|
88
|
+
const { sessionName } = record.flow;
|
|
89
|
+
if (this.current.get(sessionName) !== record) {
|
|
90
|
+
record.controller.abort('superseded');
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
if (record.boundSession !== undefined && currentSession !== record.boundSession) {
|
|
94
|
+
this.current.delete(sessionName);
|
|
95
|
+
record.controller.abort('session-replaced');
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Mark a flow finished. Only removes it while it is still the live flow,
|
|
102
|
+
* so a finishing old flow can never drop its successor's entry.
|
|
103
|
+
*
|
|
104
|
+
* @param flow - The finished flow
|
|
105
|
+
*/
|
|
106
|
+
end(flow) {
|
|
107
|
+
const record = this.current.get(flow.sessionName);
|
|
108
|
+
if (record && record.flow === flow)
|
|
109
|
+
this.current.delete(flow.sessionName);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Whether a session has a live (not yet finished or aborted) flow.
|
|
113
|
+
*
|
|
114
|
+
* @param sessionName - Session to check
|
|
115
|
+
* @returns True when a flow is in progress
|
|
116
|
+
*/
|
|
117
|
+
has(sessionName) {
|
|
118
|
+
return this.current.has(sessionName);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=registration-flow-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registration-flow-registry.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/registration-flow-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kickoff text for an agent whose runtime conversation was resumed
|
|
3
|
+
* (Claude Code `--resume`, Codex `resume`) at a Crewly restart.
|
|
4
|
+
*
|
|
5
|
+
* The full kickoff ("Begin your work now… Step 1, Step 2, Step 3
|
|
6
|
+
* (register-self)") typed into a resumed conversation reads, to the agent, as
|
|
7
|
+
* being started over from scratch. Every release restart used to do that, and
|
|
8
|
+
* agents re-announced themselves and redid their startup steps (2026-09-25
|
|
9
|
+
* startup-prompt loop). A resumed agent only needs to register again, since
|
|
10
|
+
* the backend's registration state did not survive the restart, and then carry on.
|
|
11
|
+
*
|
|
12
|
+
* @module services/agent/resumed-kickoff
|
|
13
|
+
*/
|
|
14
|
+
/** Where the register-self skill lives, relative to the Crewly project root. */
|
|
15
|
+
export declare const REGISTER_SELF_SKILL_PATHS: {
|
|
16
|
+
/** Team members: config/skills/agent/core/register-self */
|
|
17
|
+
readonly AGENT: readonly ["config", "skills", "agent", "core", "register-self", "execute.sh"];
|
|
18
|
+
/** Orchestrator: config/skills/orchestrator/register-self */
|
|
19
|
+
readonly ORCHESTRATOR: readonly ["config", "skills", "orchestrator", "register-self", "execute.sh"];
|
|
20
|
+
};
|
|
21
|
+
/** Fixed wording of the resumed kickoff. */
|
|
22
|
+
export declare const RESUMED_KICKOFF_TEXT: {
|
|
23
|
+
readonly OPENING: "[Crewly restarted — this is your same conversation, resumed.";
|
|
24
|
+
readonly REGISTER: "Run register-self now (only that step):";
|
|
25
|
+
readonly CONTINUE: "— then continue exactly where you left off. Do not redo your startup steps or re-announce yourself.";
|
|
26
|
+
/** Only for runtimes whose instructions are not loaded as a system prompt. */
|
|
27
|
+
readonly CONTEXT_REFRESH: "If your instructions are no longer in your context, re-read";
|
|
28
|
+
readonly CLOSING: "]";
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Marker that identifies a resumed kickoff, for tests and log checks.
|
|
32
|
+
*/
|
|
33
|
+
export declare const RESUMED_KICKOFF_MARKER: "[Crewly restarted — this is your same conversation, resumed.";
|
|
34
|
+
/**
|
|
35
|
+
* Build the exact register-self command the agent's full prompt tells it to
|
|
36
|
+
* run, so a resumed agent registers the same way a fresh one does.
|
|
37
|
+
*
|
|
38
|
+
* @param projectRoot - Crewly project root (where `config/skills` lives)
|
|
39
|
+
* @param sessionName - The agent's session name
|
|
40
|
+
* @param role - The agent's role
|
|
41
|
+
* @returns A shell command line
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* buildRegisterSelfCommand('/opt/crewly', 'team-sam-1', 'developer');
|
|
46
|
+
* // bash /opt/crewly/config/skills/agent/core/register-self/execute.sh '{"role":"developer","sessionName":"team-sam-1"}'
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildRegisterSelfCommand(projectRoot: string, sessionName: string, role: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Build the short kickoff for a resumed conversation.
|
|
52
|
+
*
|
|
53
|
+
* @param args.projectRoot - Crewly project root
|
|
54
|
+
* @param args.sessionName - The agent's session name
|
|
55
|
+
* @param args.role - The agent's role
|
|
56
|
+
* @param args.promptFilePath - Init prompt file to point at for a context refresh.
|
|
57
|
+
* Omit for Claude Code, whose prompt is loaded as its agent definition.
|
|
58
|
+
* @returns The single-line message to type into the runtime
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildResumedKickoff(args: {
|
|
61
|
+
projectRoot: string;
|
|
62
|
+
sessionName: string;
|
|
63
|
+
role: string;
|
|
64
|
+
promptFilePath?: string;
|
|
65
|
+
}): string;
|
|
66
|
+
//# sourceMappingURL=resumed-kickoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumed-kickoff.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resumed-kickoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,gFAAgF;AAChF,eAAO,MAAM,yBAAyB;IACrC,2DAA2D;;IAE3D,6DAA6D;;CAEpD,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB;;;;IAIhC,8EAA8E;;;CAGrE,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,sBAAsB,gEAA+B,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIvG;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAOT"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kickoff text for an agent whose runtime conversation was resumed
|
|
3
|
+
* (Claude Code `--resume`, Codex `resume`) at a Crewly restart.
|
|
4
|
+
*
|
|
5
|
+
* The full kickoff ("Begin your work now… Step 1, Step 2, Step 3
|
|
6
|
+
* (register-self)") typed into a resumed conversation reads, to the agent, as
|
|
7
|
+
* being started over from scratch. Every release restart used to do that, and
|
|
8
|
+
* agents re-announced themselves and redid their startup steps (2026-09-25
|
|
9
|
+
* startup-prompt loop). A resumed agent only needs to register again, since
|
|
10
|
+
* the backend's registration state did not survive the restart, and then carry on.
|
|
11
|
+
*
|
|
12
|
+
* @module services/agent/resumed-kickoff
|
|
13
|
+
*/
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { ORCHESTRATOR_ROLE } from '../../constants.js';
|
|
16
|
+
/** Where the register-self skill lives, relative to the Crewly project root. */
|
|
17
|
+
export const REGISTER_SELF_SKILL_PATHS = {
|
|
18
|
+
/** Team members: config/skills/agent/core/register-self */
|
|
19
|
+
AGENT: ['config', 'skills', 'agent', 'core', 'register-self', 'execute.sh'],
|
|
20
|
+
/** Orchestrator: config/skills/orchestrator/register-self */
|
|
21
|
+
ORCHESTRATOR: ['config', 'skills', 'orchestrator', 'register-self', 'execute.sh'],
|
|
22
|
+
};
|
|
23
|
+
/** Fixed wording of the resumed kickoff. */
|
|
24
|
+
export const RESUMED_KICKOFF_TEXT = {
|
|
25
|
+
OPENING: '[Crewly restarted — this is your same conversation, resumed.',
|
|
26
|
+
REGISTER: 'Run register-self now (only that step):',
|
|
27
|
+
CONTINUE: '— then continue exactly where you left off. Do not redo your startup steps or re-announce yourself.',
|
|
28
|
+
/** Only for runtimes whose instructions are not loaded as a system prompt. */
|
|
29
|
+
CONTEXT_REFRESH: 'If your instructions are no longer in your context, re-read',
|
|
30
|
+
CLOSING: ']',
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Marker that identifies a resumed kickoff, for tests and log checks.
|
|
34
|
+
*/
|
|
35
|
+
export const RESUMED_KICKOFF_MARKER = RESUMED_KICKOFF_TEXT.OPENING;
|
|
36
|
+
/**
|
|
37
|
+
* Build the exact register-self command the agent's full prompt tells it to
|
|
38
|
+
* run, so a resumed agent registers the same way a fresh one does.
|
|
39
|
+
*
|
|
40
|
+
* @param projectRoot - Crewly project root (where `config/skills` lives)
|
|
41
|
+
* @param sessionName - The agent's session name
|
|
42
|
+
* @param role - The agent's role
|
|
43
|
+
* @returns A shell command line
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* buildRegisterSelfCommand('/opt/crewly', 'team-sam-1', 'developer');
|
|
48
|
+
* // bash /opt/crewly/config/skills/agent/core/register-self/execute.sh '{"role":"developer","sessionName":"team-sam-1"}'
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export function buildRegisterSelfCommand(projectRoot, sessionName, role) {
|
|
52
|
+
const segments = role === ORCHESTRATOR_ROLE ? REGISTER_SELF_SKILL_PATHS.ORCHESTRATOR : REGISTER_SELF_SKILL_PATHS.AGENT;
|
|
53
|
+
const script = path.join(projectRoot, ...segments);
|
|
54
|
+
return `bash ${script} '${JSON.stringify({ role, sessionName })}'`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build the short kickoff for a resumed conversation.
|
|
58
|
+
*
|
|
59
|
+
* @param args.projectRoot - Crewly project root
|
|
60
|
+
* @param args.sessionName - The agent's session name
|
|
61
|
+
* @param args.role - The agent's role
|
|
62
|
+
* @param args.promptFilePath - Init prompt file to point at for a context refresh.
|
|
63
|
+
* Omit for Claude Code, whose prompt is loaded as its agent definition.
|
|
64
|
+
* @returns The single-line message to type into the runtime
|
|
65
|
+
*/
|
|
66
|
+
export function buildResumedKickoff(args) {
|
|
67
|
+
const command = buildRegisterSelfCommand(args.projectRoot, args.sessionName, args.role);
|
|
68
|
+
const refresh = args.promptFilePath ? ` ${RESUMED_KICKOFF_TEXT.CONTEXT_REFRESH} ${args.promptFilePath}.` : '';
|
|
69
|
+
return (`${RESUMED_KICKOFF_TEXT.OPENING} ${RESUMED_KICKOFF_TEXT.REGISTER} ${command} ` +
|
|
70
|
+
`${RESUMED_KICKOFF_TEXT.CONTINUE}${refresh}${RESUMED_KICKOFF_TEXT.CLOSING}`);
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=resumed-kickoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resumed-kickoff.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resumed-kickoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,2DAA2D;IAC3D,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC;IAC3E,6DAA6D;IAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,CAAC;CACxE,CAAC;AAEX,4CAA4C;AAC5C,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,OAAO,EAAE,8DAA8D;IACvE,QAAQ,EAAE,yCAAyC;IACnD,QAAQ,EAAE,qGAAqG;IAC/G,8EAA8E;IAC9E,eAAe,EAAE,6DAA6D;IAC9E,OAAO,EAAE,GAAG;CACH,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAEnE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB,EAAE,WAAmB,EAAE,IAAY;IAC9F,MAAM,QAAQ,GAAG,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC,CAAC,yBAAyB,CAAC,KAAK,CAAC;IACvH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC;IACnD,OAAO,QAAQ,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAKnC;IACA,MAAM,OAAO,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9G,OAAO,CACN,GAAG,oBAAoB,CAAC,OAAO,IAAI,oBAAoB,CAAC,QAAQ,IAAI,OAAO,GAAG;QAC9E,GAAG,oBAAoB,CAAC,QAAQ,GAAG,OAAO,GAAG,oBAAoB,CAAC,OAAO,EAAE,CAC3E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real wiring of the bundle apply engine inside the backend.
|
|
3
|
+
*
|
|
4
|
+
* Adds the live collaborators to the base set (`bundle-deps.ts`): Slack
|
|
5
|
+
* through SlackTeamChannelService, the orchestrator through the chat path
|
|
6
|
+
* the onboarding first task uses, connector probes through the Cloud token
|
|
7
|
+
* services, and the running CronTaskService. Also runs the timer that
|
|
8
|
+
* delivers due first-week tasks and resumes deployments that were waiting
|
|
9
|
+
* (on the backend, or on Slack).
|
|
10
|
+
*
|
|
11
|
+
* @module services/bundle/bundle-apply.factory
|
|
12
|
+
*/
|
|
13
|
+
import { BundleApplyService, type BundleApplyDeps, type BundleSlackApi } from './bundle-apply.service.js';
|
|
14
|
+
import type { BundleCatalog } from './bundle-catalog.js';
|
|
15
|
+
/**
|
|
16
|
+
* Slack through the team-channel service; reads as not connected when the
|
|
17
|
+
* service is not up (Slack never configured on this machine).
|
|
18
|
+
*
|
|
19
|
+
* @returns Slack collaborator
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSlackBundleApi(): BundleSlackApi;
|
|
22
|
+
/**
|
|
23
|
+
* Backend collaborators.
|
|
24
|
+
*
|
|
25
|
+
* @returns Dependencies backed by the backend's services
|
|
26
|
+
*/
|
|
27
|
+
export declare function createBackendBundleDeps(): BundleApplyDeps & {
|
|
28
|
+
catalog: BundleCatalog;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The backend's apply engine.
|
|
32
|
+
*
|
|
33
|
+
* @returns The singleton
|
|
34
|
+
*/
|
|
35
|
+
export declare function getBundleApplyService(): BundleApplyService;
|
|
36
|
+
/**
|
|
37
|
+
* The backend's bundle catalog (OSS templates + CREWLY_TEMPLATE_DIRS).
|
|
38
|
+
*
|
|
39
|
+
* @returns The catalog
|
|
40
|
+
*/
|
|
41
|
+
export declare function getBundleCatalog(): BundleCatalog;
|
|
42
|
+
/**
|
|
43
|
+
* Replace or clear the singleton (tests).
|
|
44
|
+
*
|
|
45
|
+
* @param service - Service to use, or null to clear
|
|
46
|
+
*/
|
|
47
|
+
export declare function setBundleApplyServiceForTesting(service: BundleApplyService | null): void;
|
|
48
|
+
/**
|
|
49
|
+
* One maintenance pass: resume waiting deployments, deliver due tasks.
|
|
50
|
+
*
|
|
51
|
+
* @param service - Engine
|
|
52
|
+
*/
|
|
53
|
+
export declare function runBundleMaintenance(service?: BundleApplyService): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Start the maintenance timer (runs once right away). Idempotent.
|
|
56
|
+
*/
|
|
57
|
+
export declare function startBundleMaintenance(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Stop the maintenance timer.
|
|
60
|
+
*/
|
|
61
|
+
export declare function stopBundleMaintenance(): void;
|
|
62
|
+
//# sourceMappingURL=bundle-apply.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-apply.factory.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/bundle/bundle-apply.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAcH,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE1G,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAsBrD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,eAAe,GAAG;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CA8BtF;AAgBD;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,kBAAkB,CAG1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAGxF;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,GAAE,kBAA4C,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/G;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAK7C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real wiring of the bundle apply engine inside the backend.
|
|
3
|
+
*
|
|
4
|
+
* Adds the live collaborators to the base set (`bundle-deps.ts`): Slack
|
|
5
|
+
* through SlackTeamChannelService, the orchestrator through the chat path
|
|
6
|
+
* the onboarding first task uses, connector probes through the Cloud token
|
|
7
|
+
* services, and the running CronTaskService. Also runs the timer that
|
|
8
|
+
* delivers due first-week tasks and resumes deployments that were waiting
|
|
9
|
+
* (on the backend, or on Slack).
|
|
10
|
+
*
|
|
11
|
+
* @module services/bundle/bundle-apply.factory
|
|
12
|
+
*/
|
|
13
|
+
import { BUNDLE_CONSTANTS } from '../../constants.js';
|
|
14
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
15
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
16
|
+
import { CronTaskService } from '../workflow/cron-task.service.js';
|
|
17
|
+
import { getHarnessService } from '../harness/harness.service.js';
|
|
18
|
+
import { getSlackService } from '../slack/slack.service.js';
|
|
19
|
+
import { getSlackTeamChannelService } from '../slack/slack-team-channel.service.js';
|
|
20
|
+
import { GoogleWorkspaceTokenService } from '../google/google-workspace-token.service.js';
|
|
21
|
+
import { CanvaTokenService } from '../canva/canva-token.service.js';
|
|
22
|
+
import { MicrosoftTokenService } from '../microsoft/microsoft-token.service.js';
|
|
23
|
+
import { getWhatsAppService } from '../whatsapp/whatsapp.service.js';
|
|
24
|
+
import { BundleApplyService } from './bundle-apply.service.js';
|
|
25
|
+
import { createConnectorChecker } from './bundle-connectors.js';
|
|
26
|
+
import { createBaseBundleDeps } from './bundle-deps.js';
|
|
27
|
+
const logger = LoggerService.getInstance().createComponentLogger('BundleApply');
|
|
28
|
+
/**
|
|
29
|
+
* Slack through the team-channel service; reads as not connected when the
|
|
30
|
+
* service is not up (Slack never configured on this machine).
|
|
31
|
+
*
|
|
32
|
+
* @returns Slack collaborator
|
|
33
|
+
*/
|
|
34
|
+
export function createSlackBundleApi() {
|
|
35
|
+
return {
|
|
36
|
+
isConnected: () => {
|
|
37
|
+
try {
|
|
38
|
+
return !!getSlackTeamChannelService() && getSlackService().isConnected();
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
async ensureTeamChannel(team) {
|
|
45
|
+
const service = getSlackTeamChannelService();
|
|
46
|
+
if (!service)
|
|
47
|
+
throw new Error('Slack team channels are not running');
|
|
48
|
+
const mapping = await service.ensureTeamChannel(team);
|
|
49
|
+
return { slackChannelId: mapping.slackChannelId, slackChannelName: mapping.slackChannelName };
|
|
50
|
+
},
|
|
51
|
+
async ensureAgentChannel(input) {
|
|
52
|
+
const service = getSlackTeamChannelService();
|
|
53
|
+
if (!service)
|
|
54
|
+
throw new Error('Slack team channels are not running');
|
|
55
|
+
const mapping = await service.ensureAgentChannel(input);
|
|
56
|
+
return { slackChannelId: mapping.slackChannelId, slackChannelName: mapping.slackChannelName };
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Backend collaborators.
|
|
62
|
+
*
|
|
63
|
+
* @returns Dependencies backed by the backend's services
|
|
64
|
+
*/
|
|
65
|
+
export function createBackendBundleDeps() {
|
|
66
|
+
const base = createBaseBundleDeps({
|
|
67
|
+
crewlyHome: getCrewlyHomePath(),
|
|
68
|
+
// The backend runs with the package root as its working directory
|
|
69
|
+
// (`crewly start`), the same assumption TemplateService makes.
|
|
70
|
+
packageRoot: process.cwd(),
|
|
71
|
+
getOrcHarness: () => getHarnessService().orc.get(),
|
|
72
|
+
});
|
|
73
|
+
return {
|
|
74
|
+
...base,
|
|
75
|
+
slack: createSlackBundleApi(),
|
|
76
|
+
schedules: { create: (request) => CronTaskService.getInstance().create(request) },
|
|
77
|
+
orchestrator: {
|
|
78
|
+
async send(content, metadata) {
|
|
79
|
+
// Loaded lazily: the chat path pulls in the chat controller.
|
|
80
|
+
const { sendViaChat } = await import('../onboarding/onboarding-checklist.factory.js');
|
|
81
|
+
return sendViaChat(content, metadata);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
connectors: createConnectorChecker({
|
|
85
|
+
'google-workspace': async () => {
|
|
86
|
+
const status = await GoogleWorkspaceTokenService.getInstance().status();
|
|
87
|
+
return { connected: status.connected, connections: status.connections.map((c) => ({ products: [...c.products] })) };
|
|
88
|
+
},
|
|
89
|
+
canva: async () => (await CanvaTokenService.getInstance().status()).connected,
|
|
90
|
+
'microsoft-todo': async () => (await MicrosoftTokenService.getInstance().status()).connected,
|
|
91
|
+
whatsapp: async () => getWhatsAppService().isConnected(),
|
|
92
|
+
slack: async () => getSlackService().isConnected(),
|
|
93
|
+
}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
let deps = null;
|
|
97
|
+
let instance = null;
|
|
98
|
+
let timer = null;
|
|
99
|
+
/**
|
|
100
|
+
* The backend collaborators, built once.
|
|
101
|
+
*
|
|
102
|
+
* @returns Dependencies
|
|
103
|
+
*/
|
|
104
|
+
function backendDeps() {
|
|
105
|
+
if (!deps)
|
|
106
|
+
deps = createBackendBundleDeps();
|
|
107
|
+
return deps;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The backend's apply engine.
|
|
111
|
+
*
|
|
112
|
+
* @returns The singleton
|
|
113
|
+
*/
|
|
114
|
+
export function getBundleApplyService() {
|
|
115
|
+
if (!instance)
|
|
116
|
+
instance = new BundleApplyService(backendDeps());
|
|
117
|
+
return instance;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The backend's bundle catalog (OSS templates + CREWLY_TEMPLATE_DIRS).
|
|
121
|
+
*
|
|
122
|
+
* @returns The catalog
|
|
123
|
+
*/
|
|
124
|
+
export function getBundleCatalog() {
|
|
125
|
+
return backendDeps().catalog;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Replace or clear the singleton (tests).
|
|
129
|
+
*
|
|
130
|
+
* @param service - Service to use, or null to clear
|
|
131
|
+
*/
|
|
132
|
+
export function setBundleApplyServiceForTesting(service) {
|
|
133
|
+
instance = service;
|
|
134
|
+
if (!service)
|
|
135
|
+
deps = null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* One maintenance pass: resume waiting deployments, deliver due tasks.
|
|
139
|
+
*
|
|
140
|
+
* @param service - Engine
|
|
141
|
+
*/
|
|
142
|
+
export async function runBundleMaintenance(service = getBundleApplyService()) {
|
|
143
|
+
try {
|
|
144
|
+
const resumed = await service.resumeWaiting();
|
|
145
|
+
if (resumed.length > 0)
|
|
146
|
+
logger.info('Resumed bundle deployments', { templates: resumed });
|
|
147
|
+
const sent = await service.deliverDue();
|
|
148
|
+
if (sent > 0)
|
|
149
|
+
logger.info('Delivered first-week tasks', { count: sent });
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
logger.warn('Bundle maintenance failed (non-critical)', { error: error instanceof Error ? error.message : String(error) });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Start the maintenance timer (runs once right away). Idempotent.
|
|
157
|
+
*/
|
|
158
|
+
export function startBundleMaintenance() {
|
|
159
|
+
if (timer)
|
|
160
|
+
return;
|
|
161
|
+
void runBundleMaintenance();
|
|
162
|
+
timer = setInterval(() => void runBundleMaintenance(), BUNDLE_CONSTANTS.TICK_INTERVAL_MS);
|
|
163
|
+
timer.unref();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Stop the maintenance timer.
|
|
167
|
+
*/
|
|
168
|
+
export function stopBundleMaintenance() {
|
|
169
|
+
if (timer)
|
|
170
|
+
clearInterval(timer);
|
|
171
|
+
timer = null;
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=bundle-apply.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-apply.factory.js","sourceRoot":"","sources":["../../../../../../backend/src/services/bundle/bundle-apply.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAA6C,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,CAAC;gBACH,OAAO,CAAC,CAAC,0BAA0B,EAAE,IAAI,eAAe,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3E,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,IAAU;YAChC,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChG,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,KAAK;YAC5B,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;YAC7C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxD,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAChG,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,oBAAoB,CAAC;QAChC,UAAU,EAAE,iBAAiB,EAAE;QAC/B,kEAAkE;QAClE,+DAA+D;QAC/D,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE;QAC1B,aAAa,EAAE,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE;KACnD,CAAC,CAAC;IACH,OAAO;QACL,GAAG,IAAI;QACP,KAAK,EAAE,oBAAoB,EAAE;QAC7B,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACjF,YAAY,EAAE;YACZ,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ;gBAC1B,6DAA6D;gBAC7D,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,+CAA+C,CAAC,CAAC;gBACtF,OAAO,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACxC,CAAC;SACF;QACD,UAAU,EAAE,sBAAsB,CAAC;YACjC,kBAAkB,EAAE,KAAK,IAAI,EAAE;gBAC7B,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC;gBACxE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACtH,CAAC;YACD,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,iBAAiB,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS;YAC7E,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,qBAAqB,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS;YAC5F,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC,WAAW,EAAE;YACxD,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC,WAAW,EAAE;SACnD,CAAC;KACH,CAAC;AACJ,CAAC;AAED,IAAI,IAAI,GAA0D,IAAI,CAAC;AACvE,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAC/C,IAAI,KAAK,GAA0C,IAAI,CAAC;AAExD;;;;GAIG;AACH,SAAS,WAAW;IAClB,IAAI,CAAC,IAAI;QAAE,IAAI,GAAG,uBAAuB,EAAE,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,EAAE,CAAC,OAAO,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAAC,OAAkC;IAChF,QAAQ,GAAG,OAAO,CAAC;IACnB,IAAI,CAAC,OAAO;QAAE,IAAI,GAAG,IAAI,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAA8B,qBAAqB,EAAE;IAC9F,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,IAAI,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,IAAI,KAAK;QAAE,OAAO;IAClB,KAAK,oBAAoB,EAAE,CAAC;IAC5B,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,oBAAoB,EAAE,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAC1F,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,KAAK;QAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,GAAG,IAAI,CAAC;AACf,CAAC"}
|