crewly 1.20.362 → 1.20.364
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/hooks/destructive-git-guard/guard.mjs +96 -0
- package/config/roles/orchestrator/prompt.md +3 -3
- package/config/roles/team-leader/prompt.md +2 -0
- package/config/skills/agent/core/ask-owner/SKILL.md +31 -0
- package/config/skills/agent/core/ask-owner/execute.sh +14 -3
- package/config/skills/agent/core/ask-owner/execute.test.sh +8 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +8 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +10 -3
- package/config/skills/agent/core/gmail-send/execute.sh +2 -1
- package/config/skills/agent/core/gmail-watch-thread/SKILL.md +69 -0
- package/config/skills/agent/core/gmail-watch-thread/execute.sh +51 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +12 -0
- package/config/skills/agent/core/project-tickets/execute.sh +13 -3
- package/config/skills/agent/core/project-tickets/execute.test.sh +4 -0
- package/config/skills/agent/core/watch-for-event/SKILL.md +22 -0
- package/config/skills/orchestrator/delegate-task/SKILL.md +14 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +19 -2
- package/config/skills/orchestrator/delegate-task/execute.test.sh +30 -0
- package/config/skills/orchestrator/harness-login/SKILL.md +1 -1
- package/config/skills/team-leader/delegate-task/execute.sh +6 -0
- package/dist/backend/backend/src/constants.d.ts +74 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +75 -3
- package/dist/backend/backend/src/constants.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 +14 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +44 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +121 -3
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +5 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +2 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -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 +7 -0
- 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 +61 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts +46 -13
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js +100 -50
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +23 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-contract.js +76 -4
- package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-wording.d.ts +167 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.js +406 -0
- package/dist/backend/backend/src/services/decisions/decision-wording.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +30 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +44 -8
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +17 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -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 +6 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts +142 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js +304 -0
- package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts +130 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.js +216 -0
- package/dist/backend/backend/src/services/google/gmail-send-approval.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts +28 -13
- package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/gmail-send-gate.js +82 -29
- package/dist/backend/backend/src/services/google/gmail-send-gate.js.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +90 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.js +122 -0
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +24 -14
- package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-accounts.js +35 -21
- package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-native-login.d.ts +106 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.js +174 -0
- package/dist/backend/backend/src/services/harness/claude-native-login.js.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.js +283 -0
- package/dist/backend/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +96 -39
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.js +1 -1
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +2 -2
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.service.js +10 -1
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +24 -21
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/login-broker.service.js +50 -64
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-rules.d.ts +17 -11
- package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/login-rules.js +22 -25
- package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js +70 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +25 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +65 -5
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +5 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +50 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +103 -11
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +27 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +25 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +4 -2
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +30 -6
- package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.js +6 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-file.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts +64 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js +93 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.js +301 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +33 -3
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +50 -4
- 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 +8 -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 +26 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +6 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js +3 -2
- package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +4 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts +34 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js +70 -2
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +36 -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 +72 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +5 -2
- package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts +7 -2
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts.map +1 -1
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js +11 -2
- package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +53 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +10 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +8 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/project-ticket.types.d.ts +7 -0
- package/dist/backend/backend/src/types/project-ticket.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/project-ticket.types.js +1 -0
- package/dist/backend/backend/src/types/project-ticket.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +8 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +74 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +75 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts +46 -13
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.js +100 -50
- package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +23 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-contract.js +76 -4
- package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-wording.d.ts +167 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.js +406 -0
- package/dist/cli/backend/src/services/decisions/decision-wording.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +30 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +44 -8
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js +6 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +24 -14
- package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-accounts.js +35 -21
- package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-native-login.d.ts +106 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.js +174 -0
- package/dist/cli/backend/src/services/harness/claude-native-login.js.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.js +283 -0
- package/dist/cli/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +96 -39
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.js +1 -1
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +2 -2
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.service.js +10 -1
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +24 -21
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/login-broker.service.js +50 -64
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-rules.d.ts +17 -11
- package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/login-rules.js +22 -25
- package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js +70 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +25 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +65 -5
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +113 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +195 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +30 -6
- package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.js +6 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-file.js.map +1 -1
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.js +301 -0
- package/dist/cli/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +36 -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 +72 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +53 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +10 -2
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js +8 -0
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/cli/backend/src/types/project-ticket.types.d.ts +7 -0
- package/dist/cli/backend/src/types/project-ticket.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/project-ticket.types.js +1 -0
- package/dist/cli/backend/src/types/project-ticket.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +8 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one line the harness posts to the owner when an agent finished
|
|
3
|
+
* owner-requested work and never reported it (crewly#1357).
|
|
4
|
+
*
|
|
5
|
+
* The owner thread is not a log: the line names the deliverable in plain
|
|
6
|
+
* words, in the owner's language, with no work item ids, links, file names,
|
|
7
|
+
* codecs, sizes or "Results:" dumps. On 2026-10-17 the fallback posted
|
|
8
|
+
* "Ella finished: <WorkItem titles> Results: <PR link, codec, file sizes>"
|
|
9
|
+
* into a video thread; the owner's reaction: 我还是收到agent发的这种message.
|
|
10
|
+
*
|
|
11
|
+
* Pure functions only.
|
|
12
|
+
*
|
|
13
|
+
* @module services/orc/owner-completion-report.text
|
|
14
|
+
*/
|
|
15
|
+
import { OWNER_COMPLETION_REPORT_CONSTANTS as C } from '../../constants.js';
|
|
16
|
+
/** CJK ideographs, kana and hangul. */
|
|
17
|
+
const CJK_RE = /[-ヿ㐀-䶿一-鿿가-豈-]/g;
|
|
18
|
+
/** Letters of any script (what the ratio is measured against). */
|
|
19
|
+
const LETTER_RE = /[\p{L}]/gu;
|
|
20
|
+
/** http(s) links, bare www. links and `<url|label>` Slack links. */
|
|
21
|
+
const URL_RE = /<?(?:https?:\/\/|www\.)[^\s<>|]+(?:\|[^>]*)?>?/gi;
|
|
22
|
+
/** UUIDs. */
|
|
23
|
+
const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;
|
|
24
|
+
/** Short ids: 8+ hex chars (work item prefixes, commit shas). */
|
|
25
|
+
const HEX_ID_RE = /\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{8,}\b/gi;
|
|
26
|
+
/** Ticket ids (`CREW-305`, `TKT-12`, `#1357`). */
|
|
27
|
+
const TICKET_RE = /\b[A-Z][A-Z0-9]{1,9}-\d{1,6}\b|(?<![\w&])#\d{2,7}\b/g;
|
|
28
|
+
/** Paths: anything with a slash and no spaces that looks like a file / dir, plus `~/…` and `./…`. */
|
|
29
|
+
const PATH_RE = /(?:~|\.{1,2})?\/[\w.@~-]+(?:\/[\w.@~-]+)+\/?|\b[\w.-]+\/[\w./-]*\.[a-z0-9]{1,6}\b/gi;
|
|
30
|
+
/** Bare file names with a known extension (`clip.mp4`, `notes.md`). */
|
|
31
|
+
const FILE_RE = /\b[\w-]+\.(?:mp4|mov|webm|mkv|gif|png|jpe?g|svg|pdf|md|txt|csv|json|ya?ml|html?|tsx?|jsx?|sh|zip|docx?|xlsx?|pptx?)\b/gi;
|
|
32
|
+
/** Parentheses (ASCII and full-width) with their content. */
|
|
33
|
+
const PARENS_RE = /\(([^()]*)\)|(([^()]*))/g;
|
|
34
|
+
/** Backtick code spans. */
|
|
35
|
+
const CODE_RE = /`[^`]*`/g;
|
|
36
|
+
/** Status markers such as `[DONE]`. */
|
|
37
|
+
const MARKER_RE = /\[[A-Z_ ]{2,20}\]/g;
|
|
38
|
+
/** Where the first clause ends. */
|
|
39
|
+
const CLAUSE_END_RE = /(?:\.\s|。|;|;|\s[—–-]\s|\n|:\s|:)/;
|
|
40
|
+
/** Leftover punctuation at the ends. */
|
|
41
|
+
const EDGE_PUNCT_RE = /^[\s,.;:!?、,。;:—–\-"'“”‘’(())]+|[\s,.;:!?、,。;:—–\-"'“”‘’(())]+$/g;
|
|
42
|
+
/** Trailing words a stripped sentence may leave dangling. */
|
|
43
|
+
const DANGLING_RE = /\s+(?:in|at|to|for|of|on|from|with|under|into|via|as|by|and|or|的|在|到|于)$/i;
|
|
44
|
+
/**
|
|
45
|
+
* Which language the owner writes in, from a sample of their text: Chinese
|
|
46
|
+
* when at least {@link OWNER_COMPLETION_REPORT_CONSTANTS.OWNER_LANGUAGE_CJK_MIN_RATIO}
|
|
47
|
+
* of its letters are CJK, else English. An empty sample is English.
|
|
48
|
+
*
|
|
49
|
+
* @param sample - The owner's own words (one or several messages)
|
|
50
|
+
* @returns `zh` or `en`
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* detectOwnerLanguage('什么是投资'); // 'zh'
|
|
55
|
+
* detectOwnerLanguage('Record a short demo'); // 'en'
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export function detectOwnerLanguage(sample) {
|
|
59
|
+
const text = Array.isArray(sample) ? sample.join('\n') : String(sample ?? '');
|
|
60
|
+
const letters = text.match(LETTER_RE)?.length ?? 0;
|
|
61
|
+
if (!letters)
|
|
62
|
+
return 'en';
|
|
63
|
+
const cjk = text.match(CJK_RE)?.length ?? 0;
|
|
64
|
+
return cjk / letters >= C.OWNER_LANGUAGE_CJK_MIN_RATIO ? 'zh' : 'en';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The deliverable a work item title or summary names, in plain words: its
|
|
68
|
+
* first clause with links, ids, paths, file names, code spans, markers and
|
|
69
|
+
* parentheses holding digits removed.
|
|
70
|
+
*
|
|
71
|
+
* @param text - Title or summary
|
|
72
|
+
* @returns The plain phrase (possibly empty), at most {@link OWNER_COMPLETION_REPORT_CONSTANTS.DELIVERABLE_MAX_CHARS} characters
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* plainDeliverable('Screen recording of the tutorial page (1080p, 42 MB) — https://x.test/a.mp4');
|
|
77
|
+
* // 'Screen recording of the tutorial page'
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export function plainDeliverable(text) {
|
|
81
|
+
let t = String(text ?? '').replace(/\s+/g, ' ').trim();
|
|
82
|
+
t = t.replace(MARKER_RE, ' ').replace(CODE_RE, ' ').replace(URL_RE, ' ');
|
|
83
|
+
// An aside that held a number or something internal (a file, an id) is an
|
|
84
|
+
// aside the owner does not need; one that only held words stays.
|
|
85
|
+
t = t.replace(PARENS_RE, (whole, ascii, wide) => {
|
|
86
|
+
const inner = (ascii ?? wide ?? '').trim();
|
|
87
|
+
const cleaned = stripInternal(inner).trim();
|
|
88
|
+
return /\d/.test(inner) || !cleaned || cleaned !== inner ? ' ' : whole;
|
|
89
|
+
});
|
|
90
|
+
const clause = t.split(CLAUSE_END_RE)[0] ?? '';
|
|
91
|
+
t = stripInternal(clause)
|
|
92
|
+
.replace(/\s+/g, ' ')
|
|
93
|
+
.replace(EDGE_PUNCT_RE, '')
|
|
94
|
+
.trim();
|
|
95
|
+
// Stripping can leave "Fix for and" behind: drop dangling connectives until none is left.
|
|
96
|
+
for (let prev = ''; prev !== t;) {
|
|
97
|
+
prev = t;
|
|
98
|
+
t = t.replace(DANGLING_RE, '').replace(EDGE_PUNCT_RE, '').trim();
|
|
99
|
+
}
|
|
100
|
+
if (t.length > C.DELIVERABLE_MAX_CHARS)
|
|
101
|
+
t = `${t.slice(0, C.DELIVERABLE_MAX_CHARS - 1).trimEnd()}…`;
|
|
102
|
+
return t;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Remove what is internal to the harness from a phrase: ids, paths, file
|
|
106
|
+
* names, ticket ids and short hex ids.
|
|
107
|
+
*
|
|
108
|
+
* @param text - Phrase
|
|
109
|
+
* @returns The phrase without them (spacing not yet normalised)
|
|
110
|
+
*/
|
|
111
|
+
function stripInternal(text) {
|
|
112
|
+
return text.replace(UUID_RE, ' ').replace(PATH_RE, ' ').replace(FILE_RE, ' ').replace(TICKET_RE, ' ').replace(HEX_ID_RE, ' ');
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The deliverables of a chain, de-duplicated, at most
|
|
116
|
+
* {@link OWNER_COMPLETION_REPORT_CONSTANTS.MAX_TITLES}.
|
|
117
|
+
*
|
|
118
|
+
* @param texts - Titles / summaries of the finished work, in order
|
|
119
|
+
* @returns Plain phrases (possibly empty)
|
|
120
|
+
*/
|
|
121
|
+
export function plainDeliverables(texts) {
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const text of texts) {
|
|
124
|
+
const phrase = plainDeliverable(text);
|
|
125
|
+
if (phrase && !out.some((p) => p.toLowerCase() === phrase.toLowerCase()))
|
|
126
|
+
out.push(phrase);
|
|
127
|
+
if (out.length >= C.MAX_TITLES)
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Join phrases the way the language does ("a, b and c" / "a、b和c").
|
|
134
|
+
*
|
|
135
|
+
* @param phrases - Plain phrases
|
|
136
|
+
* @param language - Owner language
|
|
137
|
+
* @returns One list phrase
|
|
138
|
+
*/
|
|
139
|
+
export function joinDeliverables(phrases, language) {
|
|
140
|
+
if (phrases.length === 0)
|
|
141
|
+
return '';
|
|
142
|
+
if (phrases.length === 1)
|
|
143
|
+
return phrases[0];
|
|
144
|
+
const head = phrases.slice(0, -1);
|
|
145
|
+
const last = phrases[phrases.length - 1];
|
|
146
|
+
return language === 'zh' ? `${head.join('、')}和${last}` : `${head.join(', ')} and ${last}`;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The one sentence posted for the agent, plus the short "sent by Crewly"
|
|
150
|
+
* marker, in the owner's language.
|
|
151
|
+
*
|
|
152
|
+
* @param input - Agent name, deliverables, language
|
|
153
|
+
* @returns Two lines: the sentence and the marker
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* fallbackLine({ agentName: 'Ella', deliverables: ['排期里 5 张卡的文案', '教程页的录屏'], language: 'zh' });
|
|
158
|
+
* // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏,细节稍后补在这里。\n— 由 Crewly 代发'
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export function fallbackLine(input) {
|
|
162
|
+
const what = joinDeliverables(plainDeliverables(input.deliverables), input.language);
|
|
163
|
+
if (input.language === 'zh') {
|
|
164
|
+
const sentence = what ? `${input.agentName} 做完了${what},细节稍后补在这里。` : `${input.agentName} 把你要的事做完了,细节稍后补在这里。`;
|
|
165
|
+
return `${sentence}\n— 由 Crewly 代发`;
|
|
166
|
+
}
|
|
167
|
+
const sentence = what ? `${input.agentName} finished ${what}; the details will follow here.` : `${input.agentName} finished what you asked for; the details will follow here.`;
|
|
168
|
+
return `${sentence}\n— sent by Crewly`;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The line the harness posts in the team channel, as the team lead, when the
|
|
172
|
+
* lead never reported team work the orchestrator delegated for the owner
|
|
173
|
+
* (crewly#1371): who finished what the owner approved, and where the owner
|
|
174
|
+
* approved it; plus the short "sent by Crewly" marker.
|
|
175
|
+
*
|
|
176
|
+
* @param input - Worker name, deliverables, language, approval link
|
|
177
|
+
* @returns The lines
|
|
178
|
+
*
|
|
179
|
+
* @example
|
|
180
|
+
* ```typescript
|
|
181
|
+
* leadFallbackLine({ workerName: 'Dana', deliverables: ['两个账号的教程文案'], language: 'zh', approvalLink: 'https://slack.com/archives/D1/p1' });
|
|
182
|
+
* // 'Dana 做完了你批准的两个账号的教程文案。\n批准的对话:https://slack.com/archives/D1/p1\n— 由 Crewly 代发'
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export function leadFallbackLine(input) {
|
|
186
|
+
const what = joinDeliverables(plainDeliverables(input.deliverables), input.language);
|
|
187
|
+
const link = input.approvalLink?.trim();
|
|
188
|
+
if (input.language === 'zh') {
|
|
189
|
+
const sentence = what ? `${input.workerName} 做完了你批准的${what}。` : `${input.workerName} 把你批准的事做完了。`;
|
|
190
|
+
return [sentence, ...(link ? [`批准的对话:${link}`] : []), '— 由 Crewly 代发'].join('\n');
|
|
191
|
+
}
|
|
192
|
+
const sentence = what ? `${input.workerName} finished ${what}, which you approved.` : `${input.workerName} finished what you approved.`;
|
|
193
|
+
return [sentence, ...(link ? [`Where you approved it: ${link}`] : []), '— sent by Crewly'].join('\n');
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=owner-completion-report.text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"owner-completion-report.text.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/owner-completion-report.text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team work the orchestrator delegated on the owner's behalf is reported to
|
|
3
|
+
* the owner by the team's lead, in the team's Slack channel, as the lead
|
|
4
|
+
* (crewly#1371).
|
|
5
|
+
*
|
|
6
|
+
* Incident 2026-10-17: the orc opened one DM thread with four items across
|
|
7
|
+
* two teams; the owner replied 「按建议」. Marketing re-worded a tutorial and
|
|
8
|
+
* the orc posted "[Orc] 第 2 条已上线 …" in that DM thread, under an
|
|
9
|
+
* unrelated email draft. The owner could not tell who did the work or why
|
|
10
|
+
* the orc was telling him. Owner decision: 「团队做完的事由负责人汇报」.
|
|
11
|
+
*
|
|
12
|
+
* A work item the orchestrator delegates with an owner origin (`delegate-task
|
|
13
|
+
* --thread/--conversation`) to a member of a team that has a Slack channel is
|
|
14
|
+
* stamped with a {@link LeadReport} (`metadata.leadReport`): who reports it
|
|
15
|
+
* (the team lead; the worker when the team has no lead) and where (the team
|
|
16
|
+
* channel). Verify items and re-delegations of that work carry the same
|
|
17
|
+
* stamp. Everything downstream reads the stamp:
|
|
18
|
+
*
|
|
19
|
+
* | Where | What changes |
|
|
20
|
+
* |---|---|
|
|
21
|
+
* | owner completion report | the chain is the lead's: nudge the lead, fallback posts in the team channel as the lead |
|
|
22
|
+
* | orc `[EVENT:task:verified]` / `[DONE]` | informational, "no owner post needed — <lead> reports it in #<channel>" |
|
|
23
|
+
* | OrcDeliveryEnforcer | no `[DELIVER_REQUIRED]` for it |
|
|
24
|
+
* | `reply --work-item` | a new top-level post in the team channel |
|
|
25
|
+
*
|
|
26
|
+
* Work that was never delegated to a team (the orc's own work, a member of
|
|
27
|
+
* no team, a team with no Slack channel) is not stamped and keeps the
|
|
28
|
+
* existing behaviour. Pure functions only.
|
|
29
|
+
*
|
|
30
|
+
* @module services/orc/team-lead-report
|
|
31
|
+
*/
|
|
32
|
+
import type { Team, TeamMember } from '../../types/index.js';
|
|
33
|
+
import type { WorkItem } from '../../types/v2/work-item.types.js';
|
|
34
|
+
import { type LeadReport, type WorkItemOrigin } from './work-item-destination.js';
|
|
35
|
+
export { isLeadReport, leadReportOf, type LeadReport } from './work-item-destination.js';
|
|
36
|
+
/** An owner origin. */
|
|
37
|
+
type OwnerOrigin = Extract<WorkItemOrigin, {
|
|
38
|
+
kind: 'owner';
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* The team's lead by the lead rule (no "first member" fallback): among
|
|
42
|
+
* several, the one the hierarchy marks as top.
|
|
43
|
+
*
|
|
44
|
+
* @param team - Team
|
|
45
|
+
* @returns The lead, or null when the team has none
|
|
46
|
+
*/
|
|
47
|
+
export declare function leadOfTeam(team: Team): TeamMember | null;
|
|
48
|
+
/** Inputs of {@link planTeamLeadReport}. */
|
|
49
|
+
export interface PlanTeamLeadReportInput {
|
|
50
|
+
/** The item being created, its origin already stamped */
|
|
51
|
+
workItem: WorkItem;
|
|
52
|
+
/** The agent creating (delegating) it */
|
|
53
|
+
creator?: string;
|
|
54
|
+
/** Every team */
|
|
55
|
+
teams: readonly Team[];
|
|
56
|
+
/** Orchestrator check */
|
|
57
|
+
isOrchestrator: (name: string) => boolean;
|
|
58
|
+
/** A team's Slack channel, or null when it has none */
|
|
59
|
+
channelOf: (teamId: string) => {
|
|
60
|
+
slackChannelId: string;
|
|
61
|
+
channelName: string;
|
|
62
|
+
} | null;
|
|
63
|
+
/** Pool items (for a re-delegation of work already stamped) */
|
|
64
|
+
items?: readonly WorkItem[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Whether two owner origins name the same place.
|
|
68
|
+
*
|
|
69
|
+
* @param a - Owner origin
|
|
70
|
+
* @param b - Owner origin
|
|
71
|
+
* @returns True for the same Slack thread / DM, or the same chat conversation thread
|
|
72
|
+
*/
|
|
73
|
+
export declare function sameOwnerPlace(a: OwnerOrigin, b: OwnerOrigin): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Who reports a new work item to the owner, and where — or null when it is
|
|
76
|
+
* not team work the orchestrator delegated on the owner's behalf.
|
|
77
|
+
*
|
|
78
|
+
* - the orchestrator delegated it with an owner origin to a member of a team
|
|
79
|
+
* that has a Slack channel → that team's lead (the worker when the team has
|
|
80
|
+
* no lead), in that channel;
|
|
81
|
+
* - a member re-delegates work it holds that is already stamped, for the same
|
|
82
|
+
* owner place → the same lead and channel, with the new worker;
|
|
83
|
+
* - anything else → null (existing behaviour).
|
|
84
|
+
*
|
|
85
|
+
* @param input - New item, creator, teams, channels
|
|
86
|
+
* @returns The stamp, or null
|
|
87
|
+
*/
|
|
88
|
+
export declare function planTeamLeadReport(input: PlanTeamLeadReportInput): LeadReport | null;
|
|
89
|
+
/**
|
|
90
|
+
* A link to the owner's thread the approval came from.
|
|
91
|
+
*
|
|
92
|
+
* @param origin - Owner origin
|
|
93
|
+
* @returns Slack link, or null when the origin is not a Slack thread
|
|
94
|
+
*/
|
|
95
|
+
export declare function approvalLink(origin: WorkItemOrigin | null | undefined): string | null;
|
|
96
|
+
/**
|
|
97
|
+
* The reporter's display name.
|
|
98
|
+
*
|
|
99
|
+
* @param report - Stamp
|
|
100
|
+
* @returns Name (session when unknown)
|
|
101
|
+
*/
|
|
102
|
+
export declare function leadNameOf(report: LeadReport): string;
|
|
103
|
+
/**
|
|
104
|
+
* The line the orchestrator's notice about this work carries: it is
|
|
105
|
+
* informational, the lead reports it.
|
|
106
|
+
*
|
|
107
|
+
* @param report - Stamp
|
|
108
|
+
* @returns English harness text
|
|
109
|
+
*/
|
|
110
|
+
export declare function orchestratorNote(report: LeadReport): string;
|
|
111
|
+
/**
|
|
112
|
+
* The note a delegated member gets for stamped work: the lead tells the
|
|
113
|
+
* owner, in the team channel; the member reports its result as usual.
|
|
114
|
+
*
|
|
115
|
+
* @param wi - The stored work item
|
|
116
|
+
* @param report - Its stamp
|
|
117
|
+
* @returns English harness text
|
|
118
|
+
*/
|
|
119
|
+
export declare function memberLeadReportNote(wi: Pick<WorkItem, 'id' | 'target'>, report: LeadReport): string;
|
|
120
|
+
//# sourceMappingURL=team-lead-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lead-report.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAkC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAElH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEzF,uBAAuB;AACvB,KAAK,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAY9D;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI,CAIxD;AAED,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,QAAQ,EAAE,QAAQ,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,yBAAyB;IACzB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,uDAAuD;IACvD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,+DAA+D;IAC/D,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAItE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,UAAU,GAAG,IAAI,CAmCpF;AA6BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAWpG"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team work the orchestrator delegated on the owner's behalf is reported to
|
|
3
|
+
* the owner by the team's lead, in the team's Slack channel, as the lead
|
|
4
|
+
* (crewly#1371).
|
|
5
|
+
*
|
|
6
|
+
* Incident 2026-10-17: the orc opened one DM thread with four items across
|
|
7
|
+
* two teams; the owner replied 「按建议」. Marketing re-worded a tutorial and
|
|
8
|
+
* the orc posted "[Orc] 第 2 条已上线 …" in that DM thread, under an
|
|
9
|
+
* unrelated email draft. The owner could not tell who did the work or why
|
|
10
|
+
* the orc was telling him. Owner decision: 「团队做完的事由负责人汇报」.
|
|
11
|
+
*
|
|
12
|
+
* A work item the orchestrator delegates with an owner origin (`delegate-task
|
|
13
|
+
* --thread/--conversation`) to a member of a team that has a Slack channel is
|
|
14
|
+
* stamped with a {@link LeadReport} (`metadata.leadReport`): who reports it
|
|
15
|
+
* (the team lead; the worker when the team has no lead) and where (the team
|
|
16
|
+
* channel). Verify items and re-delegations of that work carry the same
|
|
17
|
+
* stamp. Everything downstream reads the stamp:
|
|
18
|
+
*
|
|
19
|
+
* | Where | What changes |
|
|
20
|
+
* |---|---|
|
|
21
|
+
* | owner completion report | the chain is the lead's: nudge the lead, fallback posts in the team channel as the lead |
|
|
22
|
+
* | orc `[EVENT:task:verified]` / `[DONE]` | informational, "no owner post needed — <lead> reports it in #<channel>" |
|
|
23
|
+
* | OrcDeliveryEnforcer | no `[DELIVER_REQUIRED]` for it |
|
|
24
|
+
* | `reply --work-item` | a new top-level post in the team channel |
|
|
25
|
+
*
|
|
26
|
+
* Work that was never delegated to a team (the orc's own work, a member of
|
|
27
|
+
* no team, a team with no Slack channel) is not stamped and keeps the
|
|
28
|
+
* existing behaviour. Pure functions only.
|
|
29
|
+
*
|
|
30
|
+
* @module services/orc/team-lead-report
|
|
31
|
+
*/
|
|
32
|
+
import { getTeamLeads } from '../../utils/team.utils.js';
|
|
33
|
+
import { slackArchiveLink } from '../decisions/ticket-thread-store.js';
|
|
34
|
+
import { leadReportOf, originOfWorkItem } from './work-item-destination.js';
|
|
35
|
+
export { isLeadReport, leadReportOf } from './work-item-destination.js';
|
|
36
|
+
/**
|
|
37
|
+
* Session of a team member (permanent agent id first, like the pool).
|
|
38
|
+
*
|
|
39
|
+
* @param m - Member
|
|
40
|
+
* @returns Session name
|
|
41
|
+
*/
|
|
42
|
+
function sessionOf(m) {
|
|
43
|
+
return m?.agentId || m?.sessionName || undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The team's lead by the lead rule (no "first member" fallback): among
|
|
47
|
+
* several, the one the hierarchy marks as top.
|
|
48
|
+
*
|
|
49
|
+
* @param team - Team
|
|
50
|
+
* @returns The lead, or null when the team has none
|
|
51
|
+
*/
|
|
52
|
+
export function leadOfTeam(team) {
|
|
53
|
+
const leads = getTeamLeads(team);
|
|
54
|
+
if (leads.length === 0)
|
|
55
|
+
return null;
|
|
56
|
+
return leads.find((m) => m.hierarchyLevel === 1 && m.canDelegate === true) ?? leads[0];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Whether two owner origins name the same place.
|
|
60
|
+
*
|
|
61
|
+
* @param a - Owner origin
|
|
62
|
+
* @param b - Owner origin
|
|
63
|
+
* @returns True for the same Slack thread / DM, or the same chat conversation thread
|
|
64
|
+
*/
|
|
65
|
+
export function sameOwnerPlace(a, b) {
|
|
66
|
+
if (a.slackChannelId && b.slackChannelId)
|
|
67
|
+
return a.slackChannelId === b.slackChannelId && (a.threadTs ?? '') === (b.threadTs ?? '');
|
|
68
|
+
if (a.conversationId && b.conversationId)
|
|
69
|
+
return a.conversationId === b.conversationId && (a.chatThreadId ?? '') === (b.chatThreadId ?? '');
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Who reports a new work item to the owner, and where — or null when it is
|
|
74
|
+
* not team work the orchestrator delegated on the owner's behalf.
|
|
75
|
+
*
|
|
76
|
+
* - the orchestrator delegated it with an owner origin to a member of a team
|
|
77
|
+
* that has a Slack channel → that team's lead (the worker when the team has
|
|
78
|
+
* no lead), in that channel;
|
|
79
|
+
* - a member re-delegates work it holds that is already stamped, for the same
|
|
80
|
+
* owner place → the same lead and channel, with the new worker;
|
|
81
|
+
* - anything else → null (existing behaviour).
|
|
82
|
+
*
|
|
83
|
+
* @param input - New item, creator, teams, channels
|
|
84
|
+
* @returns The stamp, or null
|
|
85
|
+
*/
|
|
86
|
+
export function planTeamLeadReport(input) {
|
|
87
|
+
const { workItem, creator, teams, isOrchestrator } = input;
|
|
88
|
+
const origin = originOfWorkItem(workItem);
|
|
89
|
+
const worker = workItem.target;
|
|
90
|
+
if (origin?.kind !== 'owner' || !worker || !creator || isOrchestrator(worker))
|
|
91
|
+
return null;
|
|
92
|
+
if (!isOrchestrator(creator)) {
|
|
93
|
+
// A re-delegation of stamped work (the lead hands it to a member).
|
|
94
|
+
for (const held of input.items ?? []) {
|
|
95
|
+
if (held.target !== creator)
|
|
96
|
+
continue;
|
|
97
|
+
const stamp = leadReportOf(held);
|
|
98
|
+
const heldOrigin = originOfWorkItem(held);
|
|
99
|
+
if (!stamp || heldOrigin?.kind !== 'owner' || !sameOwnerPlace(heldOrigin, origin))
|
|
100
|
+
continue;
|
|
101
|
+
const member = findMember(teams, worker);
|
|
102
|
+
return { ...stamp, worker, ...(member?.name ? { workerName: member.name } : {}) };
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const found = findMemberAndTeam(teams, worker);
|
|
107
|
+
if (!found)
|
|
108
|
+
return null;
|
|
109
|
+
const channel = input.channelOf(found.team.id);
|
|
110
|
+
if (!channel)
|
|
111
|
+
return null;
|
|
112
|
+
const lead = leadOfTeam(found.team);
|
|
113
|
+
const leadSession = sessionOf(lead) ?? worker;
|
|
114
|
+
return {
|
|
115
|
+
lead: leadSession,
|
|
116
|
+
...(lead?.name ? { leadName: lead.name } : leadSession === worker && found.member.name ? { leadName: found.member.name } : {}),
|
|
117
|
+
worker,
|
|
118
|
+
...(found.member.name ? { workerName: found.member.name } : {}),
|
|
119
|
+
teamId: found.team.id,
|
|
120
|
+
teamName: found.team.name,
|
|
121
|
+
slackChannelId: channel.slackChannelId,
|
|
122
|
+
channelName: channel.channelName.replace(/^#/, ''),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The (non-archived) team a session is a member of, with the member.
|
|
127
|
+
*
|
|
128
|
+
* @param teams - Every team
|
|
129
|
+
* @param session - Agent session
|
|
130
|
+
* @returns Team + member, or null
|
|
131
|
+
*/
|
|
132
|
+
function findMemberAndTeam(teams, session) {
|
|
133
|
+
for (const team of teams) {
|
|
134
|
+
if (team.archived)
|
|
135
|
+
continue;
|
|
136
|
+
const member = (team.members ?? []).find((m) => sessionOf(m) === session || m.sessionName === session);
|
|
137
|
+
if (member)
|
|
138
|
+
return { team, member };
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* The member a session is, in any team.
|
|
144
|
+
*
|
|
145
|
+
* @param teams - Every team
|
|
146
|
+
* @param session - Agent session
|
|
147
|
+
* @returns Member, or null
|
|
148
|
+
*/
|
|
149
|
+
function findMember(teams, session) {
|
|
150
|
+
return findMemberAndTeam(teams, session)?.member ?? null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* A link to the owner's thread the approval came from.
|
|
154
|
+
*
|
|
155
|
+
* @param origin - Owner origin
|
|
156
|
+
* @returns Slack link, or null when the origin is not a Slack thread
|
|
157
|
+
*/
|
|
158
|
+
export function approvalLink(origin) {
|
|
159
|
+
if (origin?.kind !== 'owner' || !origin.slackChannelId || !origin.threadTs)
|
|
160
|
+
return null;
|
|
161
|
+
return slackArchiveLink(origin.slackChannelId, origin.threadTs);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The reporter's display name.
|
|
165
|
+
*
|
|
166
|
+
* @param report - Stamp
|
|
167
|
+
* @returns Name (session when unknown)
|
|
168
|
+
*/
|
|
169
|
+
export function leadNameOf(report) {
|
|
170
|
+
return report.leadName ?? report.lead;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* The line the orchestrator's notice about this work carries: it is
|
|
174
|
+
* informational, the lead reports it.
|
|
175
|
+
*
|
|
176
|
+
* @param report - Stamp
|
|
177
|
+
* @returns English harness text
|
|
178
|
+
*/
|
|
179
|
+
export function orchestratorNote(report) {
|
|
180
|
+
return `No owner post needed — ${leadNameOf(report)} reports it in #${report.channelName}; do not post it in your thread with the owner.`;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* The note a delegated member gets for stamped work: the lead tells the
|
|
184
|
+
* owner, in the team channel; the member reports its result as usual.
|
|
185
|
+
*
|
|
186
|
+
* @param wi - The stored work item
|
|
187
|
+
* @param report - Its stamp
|
|
188
|
+
* @returns English harness text
|
|
189
|
+
*/
|
|
190
|
+
export function memberLeadReportNote(wi, report) {
|
|
191
|
+
if (wi.target === report.lead) {
|
|
192
|
+
return (`The owner approved this in the orchestrator's thread. When it is finished you report it to the owner yourself, in #${report.channelName}: ` +
|
|
193
|
+
`reply --work-item ${wi.id} "<one or two plain lines>". The orchestrator does not relay it.`);
|
|
194
|
+
}
|
|
195
|
+
return (`The owner approved this in the orchestrator's thread. When it is finished, ${leadNameOf(report)} reports it to the owner in #${report.channelName}; ` +
|
|
196
|
+
`do not post it to the owner yourself. Report your result as usual (report-status).`);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=team-lead-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lead-report.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wiring for {@link planTeamLeadReport} (crewly#1371): the real teams, team
|
|
3
|
+
* channels and pool. The planning stays in `team-lead-report.ts`.
|
|
4
|
+
*
|
|
5
|
+
* @module services/orc/team-lead-report.wiring
|
|
6
|
+
*/
|
|
7
|
+
import type { Team } from '../../types/index.js';
|
|
8
|
+
import type { WorkItem } from '../../types/v2/work-item.types.js';
|
|
9
|
+
import { type LeadReport } from './team-lead-report.js';
|
|
10
|
+
/** Collaborators of {@link resolveLeadReport}. */
|
|
11
|
+
export interface LeadReportSources {
|
|
12
|
+
/** The team → Slack channel mappings, or null when Slack team channels are not set up */
|
|
13
|
+
channels(): Promise<Array<{
|
|
14
|
+
teamId: string;
|
|
15
|
+
slackChannelId: string;
|
|
16
|
+
slackChannelName: string;
|
|
17
|
+
}> | null>;
|
|
18
|
+
/** Every team */
|
|
19
|
+
teams(): Promise<Team[]>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The real sources (lazy imports keep this module light).
|
|
23
|
+
*
|
|
24
|
+
* @returns Sources
|
|
25
|
+
*/
|
|
26
|
+
export declare function defaultLeadReportSources(): LeadReportSources;
|
|
27
|
+
/**
|
|
28
|
+
* Who reports a new work item to the owner, and where: the stamp to put on
|
|
29
|
+
* it (see {@link planTeamLeadReport}). Never throws.
|
|
30
|
+
*
|
|
31
|
+
* @param input - The item (origin already stamped), its creator, the pool
|
|
32
|
+
* @param sources - Teams and channels (default: the real ones)
|
|
33
|
+
* @returns The stamp, or null
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveLeadReport(input: {
|
|
36
|
+
workItem: WorkItem;
|
|
37
|
+
creator?: string;
|
|
38
|
+
items: readonly WorkItem[];
|
|
39
|
+
}, sources?: LeadReportSources): Promise<LeadReport | null>;
|
|
40
|
+
/**
|
|
41
|
+
* The lead report of the work an agent status report is about (the item it
|
|
42
|
+
* names, else the sender's current or just-finished item). Never throws.
|
|
43
|
+
*
|
|
44
|
+
* @param input - Sender and the work item the report named
|
|
45
|
+
* @param poolItems - Pool items (default: the task pool)
|
|
46
|
+
* @param now - Clock (epoch ms)
|
|
47
|
+
* @returns The stamp, or null
|
|
48
|
+
*/
|
|
49
|
+
export declare function leadReportForStatus(input: {
|
|
50
|
+
sender: string;
|
|
51
|
+
workItemId?: string;
|
|
52
|
+
}, poolItems?: () => Promise<WorkItem[]>, now?: number): Promise<LeadReport | null>;
|
|
53
|
+
//# sourceMappingURL=team-lead-report.wiring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-lead-report.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.wiring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE1F,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACxG,iBAAiB;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAY5D;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,EAC3E,OAAO,GAAE,iBAA8C,GACtD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsB5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,EACrC,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5B"}
|