crewly 1.20.361 → 1.20.363
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/team-leader/prompt.md +1 -1
- package/config/roles/team-leader/tl-addon.md +1 -1
- 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/harness-login/SKILL.md +1 -1
- package/config/skills/team-leader/delegate-task/SKILL.md +21 -6
- package/config/skills/team-leader/delegate-task/execute.sh +12 -1
- package/dist/backend/backend/src/constants.d.ts +216 -8
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +217 -9
- package/dist/backend/backend/src/constants.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 -4
- 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 +114 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js +2 -0
- package/dist/backend/backend/src/services/agent/follow-through.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/agent/handover-interrupted.d.ts +76 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.js +139 -0
- package/dist/backend/backend/src/services/agent/handover-interrupted.js.map +1 -0
- package/dist/backend/backend/src/services/agent/handover-pointers.d.ts +4 -0
- package/dist/backend/backend/src/services/agent/handover-pointers.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/handover-pointers.js +11 -4
- package/dist/backend/backend/src/services/agent/handover-pointers.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts +3 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-work-guard.js +2 -0
- package/dist/backend/backend/src/services/agent/idle-work-guard.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts +5 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js +6 -1
- package/dist/backend/backend/src/services/agent/resource-mode-protection.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts +7 -0
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.js +18 -1
- package/dist/backend/backend/src/services/agent/runtime-session-recovery.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/chat-v2/chat-v2.singleton.d.ts +8 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.js +10 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.singleton.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 +1 -0
- 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 +79 -2
- 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 +194 -13
- 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 +65 -1
- 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 +140 -7
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +8 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js +19 -1
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +35 -19
- 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 +60 -63
- 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 +86 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +170 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts +24 -0
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js +38 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +2 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +8 -3
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +76 -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 +83 -3
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +31 -2
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +38 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.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/background-run-detector.d.ts +56 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.js +93 -0
- package/dist/backend/backend/src/services/stall/background-run-detector.js.map +1 -0
- package/dist/backend/backend/src/services/stall/claim-check.d.ts +60 -0
- package/dist/backend/backend/src/services/stall/claim-check.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/claim-check.js +98 -0
- package/dist/backend/backend/src/services/stall/claim-check.js.map +1 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.d.ts +110 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.js +109 -0
- package/dist/backend/backend/src/services/stall/in-flight-runs.store.js.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts +490 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js +922 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.service.js.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.d.ts +98 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.js +217 -0
- package/dist/backend/backend/src/services/stall/stall-watcher.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +53 -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 +162 -15
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/tl-delegation/tl-delegation.service.js +1 -1
- package/dist/backend/backend/src/services/tl-delegation/tl-delegation.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 +4 -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 +10 -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 +216 -8
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +217 -9
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/handover-interrupted.d.ts +76 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.js +139 -0
- package/dist/cli/backend/src/services/agent/handover-interrupted.js.map +1 -0
- package/dist/cli/backend/src/services/agent/handover-pointers.d.ts +4 -0
- package/dist/cli/backend/src/services/agent/handover-pointers.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/handover-pointers.js +11 -4
- package/dist/cli/backend/src/services/agent/handover-pointers.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts +7 -0
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.js +18 -1
- package/dist/cli/backend/src/services/agent/runtime-session-recovery.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/chat-v2/chat-v2.singleton.d.ts +8 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js +10 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.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 +1 -0
- 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 +79 -2
- 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 +194 -13
- 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 +65 -1
- 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 +140 -7
- 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 +86 -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 +170 -0
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +76 -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 +83 -3
- 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 +53 -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 +162 -15
- 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 +4 -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 +10 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-facing wording of decision cards (crewly#1367, crewly#1369 §3). Pure.
|
|
3
|
+
*
|
|
4
|
+
* A card is read by the owner on a phone: it leads with the question in
|
|
5
|
+
* plain words, in the owner's language. Ticket ids, PR numbers, branch and
|
|
6
|
+
* worktree names and `GOAL:` prefixes are internal mechanics; they are
|
|
7
|
+
* taken out of the question when the card is created (a PR link may stay in
|
|
8
|
+
* a short details line). The harness's own text on the card — buttons, the
|
|
9
|
+
* context line, reminders — follows the owner's language.
|
|
10
|
+
*
|
|
11
|
+
* Card D-822 (2026-10-16) is the incident: its title was
|
|
12
|
+
* "CREW-646 · GOAL: Decide the fate of OPEN PR #1138 (…, CREW-257), worktree
|
|
13
|
+
* crewly-projec…", in English, to an owner who writes Chinese; the question
|
|
14
|
+
* really was "should agent-sent Gmail go out only after you approve a card?".
|
|
15
|
+
*
|
|
16
|
+
* The Chinese strings below are owner-facing text in the owner's language
|
|
17
|
+
* (an allowed exception to the English-only rule).
|
|
18
|
+
*
|
|
19
|
+
* @module services/decisions/decision-wording
|
|
20
|
+
*/
|
|
21
|
+
import type { DecisionContext, DecisionLanguage, DecisionOption } from '../../types/decision.types.js';
|
|
22
|
+
/** Result of {@link stripInternalRefs}. */
|
|
23
|
+
export interface StrippedText {
|
|
24
|
+
/** The text without internal references (one line, tidied) */
|
|
25
|
+
text: string;
|
|
26
|
+
/** PR references and links that were taken out, for a details line */
|
|
27
|
+
refs: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Take ticket ids, PR numbers, links, branch / worktree names, paths and
|
|
31
|
+
* `GOAL:` prefixes out of a question or title (crewly#1367).
|
|
32
|
+
*
|
|
33
|
+
* @param raw - Question or title
|
|
34
|
+
* @returns The plain text, and the PR references / links removed
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* stripInternalRefs('CREW-646 · GOAL: Merge PR #1138 (Gmail approve card)?');
|
|
39
|
+
* // { text: 'Merge (Gmail approve card)?', refs: ['PR #1138'] }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function stripInternalRefs(raw: string | undefined | null): StrippedText;
|
|
43
|
+
/** How many letters (any script) a text has. */
|
|
44
|
+
export declare function letterCount(s: string): number;
|
|
45
|
+
/**
|
|
46
|
+
* Whether an ask is about merging a PR: the question (before stripping) or
|
|
47
|
+
* one of its options talks about merging. A card that only names a PR (to
|
|
48
|
+
* close it, to review it) is not a merge card.
|
|
49
|
+
*
|
|
50
|
+
* @param rawQuestion - The question as the agent wrote it
|
|
51
|
+
* @param options - Its options
|
|
52
|
+
* @returns True for a merge card
|
|
53
|
+
*/
|
|
54
|
+
export declare function isMergeAsk(rawQuestion: string, options: ReadonlyArray<Pick<DecisionOption, 'label' | 'detail'>>): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Parse the optional card context. Each field is one short line.
|
|
57
|
+
*
|
|
58
|
+
* @param raw - `{requestedBy?, ownerLastSaid?, runtimeChanges?, link?}`
|
|
59
|
+
* @returns The context, or undefined when empty
|
|
60
|
+
* @throws Error (message for the agent) when a field is too long or not text
|
|
61
|
+
*/
|
|
62
|
+
export declare function parseDecisionContext(raw: unknown): DecisionContext | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Whether a question is written in the owner's language. Only a Chinese
|
|
65
|
+
* owner is checked (an English owner reading a bilingual question is fine).
|
|
66
|
+
*
|
|
67
|
+
* @param question - The plain question
|
|
68
|
+
* @param ownerLanguage - The owner's language, when known
|
|
69
|
+
* @returns True when the question can go out as is
|
|
70
|
+
*/
|
|
71
|
+
export declare function questionFitsOwnerLanguage(question: string, ownerLanguage: DecisionLanguage | null | undefined): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* The option label in the owner's language: generic English labels ("Yes",
|
|
74
|
+
* "Not now", "Yes, merge") become Chinese for a Chinese owner; a merge card
|
|
75
|
+
* names the outcome (合并 / 先不合). Any other label is left as written.
|
|
76
|
+
*
|
|
77
|
+
* @param label - Label as asked
|
|
78
|
+
* @param lang - Owner language
|
|
79
|
+
* @param merge - The card is a merge question
|
|
80
|
+
* @returns Label to show (and to match replies against)
|
|
81
|
+
*/
|
|
82
|
+
export declare function localizeOptionLabel(label: string, lang: DecisionLanguage | undefined, merge?: boolean): string;
|
|
83
|
+
/**
|
|
84
|
+
* Localize every option label; keeps labels distinct (a collision keeps the
|
|
85
|
+
* original label).
|
|
86
|
+
*
|
|
87
|
+
* @param options - Options
|
|
88
|
+
* @param lang - Owner language
|
|
89
|
+
* @param merge - Merge card
|
|
90
|
+
* @returns Options with localized labels
|
|
91
|
+
*/
|
|
92
|
+
export declare function localizeOptions(options: DecisionOption[], lang: DecisionLanguage | undefined, merge?: boolean): DecisionOption[];
|
|
93
|
+
/**
|
|
94
|
+
* A question clipped for a one-line reminder.
|
|
95
|
+
*
|
|
96
|
+
* @param q - Question
|
|
97
|
+
* @param max - Max characters
|
|
98
|
+
* @returns Clipped text
|
|
99
|
+
*/
|
|
100
|
+
export declare function clipQuestion(q: string, max?: number): string;
|
|
101
|
+
/** The harness's own card text, per owner language. */
|
|
102
|
+
export interface CardText {
|
|
103
|
+
remindButton: string;
|
|
104
|
+
skipButton: string;
|
|
105
|
+
details: string;
|
|
106
|
+
requestedBy: string;
|
|
107
|
+
ownerLastSaid: string;
|
|
108
|
+
runtimeChanges: string;
|
|
109
|
+
mergeRuntimeChanges: string;
|
|
110
|
+
remindingAt: (when: string) => string;
|
|
111
|
+
declineDefault: (when: string, label: string) => string;
|
|
112
|
+
heldDefault: (when: string, label: string) => string;
|
|
113
|
+
sensitive: (kind: string) => string;
|
|
114
|
+
waitHold: string;
|
|
115
|
+
goWithDefault: (when: string, label: string) => string;
|
|
116
|
+
waitReminder: (at: string, q: string) => string;
|
|
117
|
+
waitReminderMany: (at: string, n: number) => string;
|
|
118
|
+
remindNow: (at: string, q: string) => string;
|
|
119
|
+
sensitiveReask: (at: string, q: string, kind: string) => string;
|
|
120
|
+
chose: (who: string, label: string, at: string) => string;
|
|
121
|
+
answered: (who: string, words: string, at: string) => string;
|
|
122
|
+
answeredInThread: (at: string) => string;
|
|
123
|
+
parked: (id: string) => string;
|
|
124
|
+
closed: (reason: string, at: string) => string;
|
|
125
|
+
skipped: (who: string, at: string) => string;
|
|
126
|
+
theOwner: string;
|
|
127
|
+
defaultNoAnswerOpen: (when: string) => string;
|
|
128
|
+
defaultNoAnswer: (when: string, verb: string, label: string) => string;
|
|
129
|
+
defaultVerb: (name: string | null, settled: boolean) => string;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The harness's card text in a language.
|
|
133
|
+
*
|
|
134
|
+
* @param lang - Owner language (absent = English)
|
|
135
|
+
* @returns Strings
|
|
136
|
+
*/
|
|
137
|
+
export declare function cardText(lang: DecisionLanguage | undefined): CardText;
|
|
138
|
+
/**
|
|
139
|
+
* Short local time in Chinese: "14:05" today, "明天 12:00", else "10月2日 周四 12:00".
|
|
140
|
+
*
|
|
141
|
+
* @param at - Moment
|
|
142
|
+
* @param now - Clock
|
|
143
|
+
* @returns Text
|
|
144
|
+
*/
|
|
145
|
+
export declare function formatWhenZh(at: Date, now?: Date): string;
|
|
146
|
+
/**
|
|
147
|
+
* The context lines of a card (who asked, what the owner said last, what
|
|
148
|
+
* changes), as mrkdwn — null when there is no context.
|
|
149
|
+
*
|
|
150
|
+
* @param context - Card context
|
|
151
|
+
* @param lang - Owner language
|
|
152
|
+
* @param merge - Merge card ("What merging changes")
|
|
153
|
+
* @returns mrkdwn, or null
|
|
154
|
+
*/
|
|
155
|
+
export declare function contextSection(context: DecisionContext | undefined, lang: DecisionLanguage | undefined, merge?: boolean): string | null;
|
|
156
|
+
/**
|
|
157
|
+
* The short details line (PR link / references), or null.
|
|
158
|
+
*
|
|
159
|
+
* @param d - Decision context + stripped refs
|
|
160
|
+
* @param lang - Owner language
|
|
161
|
+
* @returns mrkdwn, or null
|
|
162
|
+
*/
|
|
163
|
+
export declare function detailsLine(d: {
|
|
164
|
+
context?: DecisionContext;
|
|
165
|
+
details?: string[];
|
|
166
|
+
}, lang: DecisionLanguage | undefined): string | null;
|
|
167
|
+
//# sourceMappingURL=decision-wording.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-wording.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-wording.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-facing wording of decision cards (crewly#1367, crewly#1369 §3). Pure.
|
|
3
|
+
*
|
|
4
|
+
* A card is read by the owner on a phone: it leads with the question in
|
|
5
|
+
* plain words, in the owner's language. Ticket ids, PR numbers, branch and
|
|
6
|
+
* worktree names and `GOAL:` prefixes are internal mechanics; they are
|
|
7
|
+
* taken out of the question when the card is created (a PR link may stay in
|
|
8
|
+
* a short details line). The harness's own text on the card — buttons, the
|
|
9
|
+
* context line, reminders — follows the owner's language.
|
|
10
|
+
*
|
|
11
|
+
* Card D-822 (2026-10-16) is the incident: its title was
|
|
12
|
+
* "CREW-646 · GOAL: Decide the fate of OPEN PR #1138 (…, CREW-257), worktree
|
|
13
|
+
* crewly-projec…", in English, to an owner who writes Chinese; the question
|
|
14
|
+
* really was "should agent-sent Gmail go out only after you approve a card?".
|
|
15
|
+
*
|
|
16
|
+
* The Chinese strings below are owner-facing text in the owner's language
|
|
17
|
+
* (an allowed exception to the English-only rule).
|
|
18
|
+
*
|
|
19
|
+
* @module services/decisions/decision-wording
|
|
20
|
+
*/
|
|
21
|
+
import { DECISION_WORDING_CONSTANTS as W } from '../../constants.js';
|
|
22
|
+
import { detectOwnerLanguage } from '../orc/owner-completion-report.text.js';
|
|
23
|
+
/** URLs (plain and Slack `<url|label>`). */
|
|
24
|
+
const URL_RE = /<?https?:\/\/[^\s<>|]+(?:\|[^>]*)?>?/gi;
|
|
25
|
+
/** `PR #1138`, `PR 1138`, `pull request #1138`. */
|
|
26
|
+
const PR_RE = /\b(?:PR|pull\s+request)\s*#?\s*(\d{1,7})\b/gi;
|
|
27
|
+
/** A bare `#1138` (two digits or more). */
|
|
28
|
+
const HASH_NUM_RE = /(?<![\w&])#(\d{2,7})\b/g;
|
|
29
|
+
/** Ticket and decision ids: `CREW-646`, `APP-12`, `D-822`. Single-letter prefixes other than D (H-1B) are words. */
|
|
30
|
+
const TICKET_RE = /\b(?:[A-Z][A-Z0-9]{1,9}|D)-\d{1,6}\b/g;
|
|
31
|
+
/** `GOAL:` / `Goal -` prefixes. */
|
|
32
|
+
const GOAL_RE = /\bgoal\s*[::-]\s*/gi;
|
|
33
|
+
/** `worktree crewly-projects/wt-x`, `branch fix/foo`. */
|
|
34
|
+
const WORKTREE_RE = /\b(?:in\s+|on\s+)?(?:the\s+)?(?:git\s+)?(?:worktrees?|branch(?:es)?)\s*[::]?\s*[`'"]?[\w./~@-]+[`'"]?(?:…|\.{3})?/gi;
|
|
35
|
+
/** Branch names with a conventional prefix: `fix/decision-card-wording`. */
|
|
36
|
+
const BRANCH_RE = /\b(?:feat|feature|fix|bugfix|hotfix|chore|docs|refactor|test|release|wip)\/[\w./-]+/gi;
|
|
37
|
+
/** `wt-crew257`-style worktree directory names. */
|
|
38
|
+
const WT_RE = /\bwt-[\w.-]+/gi;
|
|
39
|
+
/** Absolute / home / relative paths. */
|
|
40
|
+
const PATH_RE = /(?:~|\.{1,2})?\/[\w.@-]+(?:\/[\w.@-]+)+\/?|\b[\w.@-]+(?:\/[\w.@-]+){2,}\/?/g;
|
|
41
|
+
/** Marks where a reference was removed (so only prepositions left dangling by a removal are dropped). */
|
|
42
|
+
const GAP = '\u0000';
|
|
43
|
+
/** A preposition (or "the") right before a removed reference that ended its phrase: "in <path>?" → "?". */
|
|
44
|
+
const DANGLING_PREP_RE = new RegExp(`\\b(?:in|at|on|from|to|into|onto|of|for|with|via|under|the|see)\\s*${GAP}(?=[\\s${GAP}]*(?:[??.。!!,,;;::))—–-]|$))`, 'gi');
|
|
45
|
+
/** Backtick code spans. */
|
|
46
|
+
const CODE_RE = /`[^`]*`/g;
|
|
47
|
+
/**
|
|
48
|
+
* Take ticket ids, PR numbers, links, branch / worktree names, paths and
|
|
49
|
+
* `GOAL:` prefixes out of a question or title (crewly#1367).
|
|
50
|
+
*
|
|
51
|
+
* @param raw - Question or title
|
|
52
|
+
* @returns The plain text, and the PR references / links removed
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* stripInternalRefs('CREW-646 · GOAL: Merge PR #1138 (Gmail approve card)?');
|
|
57
|
+
* // { text: 'Merge (Gmail approve card)?', refs: ['PR #1138'] }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export function stripInternalRefs(raw) {
|
|
61
|
+
const refs = [];
|
|
62
|
+
const addRef = (r) => {
|
|
63
|
+
if (!refs.includes(r))
|
|
64
|
+
refs.push(r);
|
|
65
|
+
};
|
|
66
|
+
let t = String(raw ?? '').replace(/\s+/g, ' ');
|
|
67
|
+
t = t.replace(URL_RE, (m) => {
|
|
68
|
+
addRef(m.replace(/^</, '').replace(/>$/, '').split('|')[0]);
|
|
69
|
+
return ` ${GAP} `;
|
|
70
|
+
});
|
|
71
|
+
t = t.replace(CODE_RE, (m) => (/[/#]|\b[A-Z]{2,}-\d/.test(m) ? ` ${GAP} ` : m.replace(/`/g, '')));
|
|
72
|
+
t = t.replace(PR_RE, (_m, n) => {
|
|
73
|
+
addRef(`PR #${n}`);
|
|
74
|
+
return ` ${GAP} `;
|
|
75
|
+
});
|
|
76
|
+
t = t.replace(HASH_NUM_RE, (_m, n) => {
|
|
77
|
+
addRef(`PR #${n}`);
|
|
78
|
+
return ` ${GAP} `;
|
|
79
|
+
});
|
|
80
|
+
const gap = ` ${GAP} `;
|
|
81
|
+
t = t
|
|
82
|
+
.replace(GOAL_RE, ' ')
|
|
83
|
+
.replace(WORKTREE_RE, gap)
|
|
84
|
+
.replace(BRANCH_RE, gap)
|
|
85
|
+
.replace(WT_RE, gap)
|
|
86
|
+
.replace(PATH_RE, gap)
|
|
87
|
+
.replace(TICKET_RE, gap);
|
|
88
|
+
if (!t.includes(GAP) && t === String(raw ?? '').replace(/\s+/g, ' '))
|
|
89
|
+
return { text: t.trim(), refs };
|
|
90
|
+
t = t.replace(/\s+/g, ' ');
|
|
91
|
+
for (let i = 0; i < 3; i++)
|
|
92
|
+
t = t.replace(DANGLING_PREP_RE, GAP);
|
|
93
|
+
return { text: tidy(t.split(GAP).join(' ')), refs };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Tidy what stripping left: empty brackets, doubled separators, dangling
|
|
97
|
+
* punctuation at the ends.
|
|
98
|
+
*
|
|
99
|
+
* @param s - Text
|
|
100
|
+
* @returns One clean line
|
|
101
|
+
*/
|
|
102
|
+
function tidy(s) {
|
|
103
|
+
let t = s.replace(/\s+/g, ' ');
|
|
104
|
+
for (let i = 0; i < 3; i++) {
|
|
105
|
+
t = t
|
|
106
|
+
.replace(/\(\s*[,;·:|]*\s*\)|(\s*[,,;;·::|]*\s*)|\[\s*\]/g, ' ')
|
|
107
|
+
.replace(/([((])\s*[,;,;·|]+\s*/g, '$1')
|
|
108
|
+
.replace(/\s*[,;,;·|]+\s*([))])/g, '$1')
|
|
109
|
+
.replace(/\s*([·|])\s*(?:[·|,;:]\s*)+/g, ' $1 ')
|
|
110
|
+
.replace(/\s+([,;:,;:??!!.。])/g, '$1')
|
|
111
|
+
.replace(/([,;,;])(?:\s*[,;,;])+/g, '$1')
|
|
112
|
+
.replace(/\s+/g, ' ');
|
|
113
|
+
}
|
|
114
|
+
return t
|
|
115
|
+
.replace(/^[\s·|,;::,;…—–-]+/u, '')
|
|
116
|
+
.replace(/[\s·|,;::,;—–-]+$/u, '')
|
|
117
|
+
.replace(/\s*(?:…|\.{3})\s*$/u, '')
|
|
118
|
+
.trim();
|
|
119
|
+
}
|
|
120
|
+
/** How many letters (any script) a text has. */
|
|
121
|
+
export function letterCount(s) {
|
|
122
|
+
return s.match(/\p{L}/gu)?.length ?? 0;
|
|
123
|
+
}
|
|
124
|
+
/** Words that make a question a merge question. */
|
|
125
|
+
const MERGE_RE = /\bmerg(?:e|es|ing)\b|合并|合入|合进/i;
|
|
126
|
+
/**
|
|
127
|
+
* Whether an ask is about merging a PR: the question (before stripping) or
|
|
128
|
+
* one of its options talks about merging. A card that only names a PR (to
|
|
129
|
+
* close it, to review it) is not a merge card.
|
|
130
|
+
*
|
|
131
|
+
* @param rawQuestion - The question as the agent wrote it
|
|
132
|
+
* @param options - Its options
|
|
133
|
+
* @returns True for a merge card
|
|
134
|
+
*/
|
|
135
|
+
export function isMergeAsk(rawQuestion, options) {
|
|
136
|
+
if (MERGE_RE.test(rawQuestion))
|
|
137
|
+
return true;
|
|
138
|
+
return options.some((o) => MERGE_RE.test(`${o.label} ${o.detail ?? ''}`));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Parse the optional card context. Each field is one short line.
|
|
142
|
+
*
|
|
143
|
+
* @param raw - `{requestedBy?, ownerLastSaid?, runtimeChanges?, link?}`
|
|
144
|
+
* @returns The context, or undefined when empty
|
|
145
|
+
* @throws Error (message for the agent) when a field is too long or not text
|
|
146
|
+
*/
|
|
147
|
+
export function parseDecisionContext(raw) {
|
|
148
|
+
if (raw === undefined || raw === null || raw === '')
|
|
149
|
+
return undefined;
|
|
150
|
+
if (typeof raw !== 'object' || Array.isArray(raw))
|
|
151
|
+
throw new Error('context must be an object: {"requestedBy": "...", "ownerLastSaid": "...", "runtimeChanges": "...", "link": "..."}.');
|
|
152
|
+
const o = raw;
|
|
153
|
+
const out = {};
|
|
154
|
+
for (const key of ['requestedBy', 'ownerLastSaid', 'runtimeChanges', 'link']) {
|
|
155
|
+
const v = o[key];
|
|
156
|
+
if (v === undefined || v === null || v === '')
|
|
157
|
+
continue;
|
|
158
|
+
if (typeof v !== 'string')
|
|
159
|
+
throw new Error(`context.${key} must be text.`);
|
|
160
|
+
const line = v.replace(/\s+/g, ' ').trim();
|
|
161
|
+
if (!line)
|
|
162
|
+
continue;
|
|
163
|
+
const max = key === 'link' ? W.LINK_MAX_CHARS : W.CONTEXT_FIELD_MAX_CHARS;
|
|
164
|
+
if (line.length > max)
|
|
165
|
+
throw new Error(`context.${key} is too long (max ${max} characters): one short line the owner reads on a phone.`);
|
|
166
|
+
out[key] = line;
|
|
167
|
+
}
|
|
168
|
+
return Object.keys(out).length ? out : undefined;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Whether a question is written in the owner's language. Only a Chinese
|
|
172
|
+
* owner is checked (an English owner reading a bilingual question is fine).
|
|
173
|
+
*
|
|
174
|
+
* @param question - The plain question
|
|
175
|
+
* @param ownerLanguage - The owner's language, when known
|
|
176
|
+
* @returns True when the question can go out as is
|
|
177
|
+
*/
|
|
178
|
+
export function questionFitsOwnerLanguage(question, ownerLanguage) {
|
|
179
|
+
if (ownerLanguage !== 'zh')
|
|
180
|
+
return true;
|
|
181
|
+
return detectOwnerLanguage(question) === 'zh';
|
|
182
|
+
}
|
|
183
|
+
/** Generic English option labels, lower-cased with trailing punctuation removed, and their Chinese. */
|
|
184
|
+
const GENERIC_ZH = {
|
|
185
|
+
yes: '好',
|
|
186
|
+
'yes, do it': '好,去做',
|
|
187
|
+
'do it': '去做',
|
|
188
|
+
'go ahead': '去做',
|
|
189
|
+
ok: '好',
|
|
190
|
+
okay: '好',
|
|
191
|
+
approve: '同意',
|
|
192
|
+
no: '不用',
|
|
193
|
+
'not now': '先不',
|
|
194
|
+
'not yet': '先不',
|
|
195
|
+
later: '以后再说',
|
|
196
|
+
hold: '先放着',
|
|
197
|
+
wait: '先等等',
|
|
198
|
+
cancel: '取消',
|
|
199
|
+
skip: '不用了',
|
|
200
|
+
'remind me tomorrow': '明天再问',
|
|
201
|
+
};
|
|
202
|
+
/** Merge-card option labels and their Chinese. */
|
|
203
|
+
const MERGE_ZH = {
|
|
204
|
+
yes: '合并',
|
|
205
|
+
'yes, merge': '合并',
|
|
206
|
+
'yes, merge it': '合并',
|
|
207
|
+
'yes merge': '合并',
|
|
208
|
+
merge: '合并',
|
|
209
|
+
'merge it': '合并',
|
|
210
|
+
'merge now': '合并',
|
|
211
|
+
approve: '合并',
|
|
212
|
+
ok: '合并',
|
|
213
|
+
no: '先不合',
|
|
214
|
+
'not now': '先不合',
|
|
215
|
+
'not yet': '先不合',
|
|
216
|
+
"don't merge": '先不合',
|
|
217
|
+
'dont merge': '先不合',
|
|
218
|
+
'do not merge': '先不合',
|
|
219
|
+
hold: '先不合',
|
|
220
|
+
wait: '先不合',
|
|
221
|
+
close: '关掉这个 PR',
|
|
222
|
+
'close it': '关掉这个 PR',
|
|
223
|
+
'close the pr': '关掉这个 PR',
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* The option label in the owner's language: generic English labels ("Yes",
|
|
227
|
+
* "Not now", "Yes, merge") become Chinese for a Chinese owner; a merge card
|
|
228
|
+
* names the outcome (合并 / 先不合). Any other label is left as written.
|
|
229
|
+
*
|
|
230
|
+
* @param label - Label as asked
|
|
231
|
+
* @param lang - Owner language
|
|
232
|
+
* @param merge - The card is a merge question
|
|
233
|
+
* @returns Label to show (and to match replies against)
|
|
234
|
+
*/
|
|
235
|
+
export function localizeOptionLabel(label, lang, merge = false) {
|
|
236
|
+
if (lang !== 'zh')
|
|
237
|
+
return label;
|
|
238
|
+
const k = label.toLowerCase().replace(/[.。!!]+$/u, '').trim();
|
|
239
|
+
return (merge ? MERGE_ZH[k] : undefined) ?? GENERIC_ZH[k] ?? label;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Localize every option label; keeps labels distinct (a collision keeps the
|
|
243
|
+
* original label).
|
|
244
|
+
*
|
|
245
|
+
* @param options - Options
|
|
246
|
+
* @param lang - Owner language
|
|
247
|
+
* @param merge - Merge card
|
|
248
|
+
* @returns Options with localized labels
|
|
249
|
+
*/
|
|
250
|
+
export function localizeOptions(options, lang, merge = false) {
|
|
251
|
+
if (lang !== 'zh')
|
|
252
|
+
return options;
|
|
253
|
+
const used = new Set();
|
|
254
|
+
return options.map((o) => {
|
|
255
|
+
const next = localizeOptionLabel(o.label, lang, merge);
|
|
256
|
+
const label = used.has(next.toLowerCase()) ? o.label : next;
|
|
257
|
+
used.add(label.toLowerCase());
|
|
258
|
+
return label === o.label ? o : { ...o, label };
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* A question clipped for a one-line reminder.
|
|
263
|
+
*
|
|
264
|
+
* @param q - Question
|
|
265
|
+
* @param max - Max characters
|
|
266
|
+
* @returns Clipped text
|
|
267
|
+
*/
|
|
268
|
+
export function clipQuestion(q, max = W.REMINDER_QUESTION_MAX_CHARS) {
|
|
269
|
+
const t = q.replace(/\s+/g, ' ').trim();
|
|
270
|
+
return t.length > max ? `${t.slice(0, max - 1).trimEnd()}…` : t;
|
|
271
|
+
}
|
|
272
|
+
const SENSITIVE_ZH = {
|
|
273
|
+
email: '对外发消息',
|
|
274
|
+
publish: '公开发布',
|
|
275
|
+
deploy: '上线部署',
|
|
276
|
+
spend: '花钱',
|
|
277
|
+
};
|
|
278
|
+
const EN = {
|
|
279
|
+
remindButton: 'Remind me tomorrow',
|
|
280
|
+
skipButton: 'Skip',
|
|
281
|
+
details: 'Details',
|
|
282
|
+
requestedBy: 'Asked for by',
|
|
283
|
+
ownerLastSaid: 'You said last',
|
|
284
|
+
runtimeChanges: 'What it changes',
|
|
285
|
+
mergeRuntimeChanges: 'What merging changes',
|
|
286
|
+
remindingAt: (when) => `⏰ Reminding you ${when}.`,
|
|
287
|
+
declineDefault: (when, label) => `Nothing is accepted until you answer. No answer by ${when}: ${label}.`,
|
|
288
|
+
heldDefault: (when, label) => `Nothing happens without your OK. If no answer by ${when}, the answer is ${label}.`,
|
|
289
|
+
sensitive: (kind) => `This needs your OK (${kind}); I won't go ahead without an answer.`,
|
|
290
|
+
waitHold: 'Tap an answer or reply in this thread — I\'ll hold this until you do.',
|
|
291
|
+
goWithDefault: (when, label) => `If no answer by ${when}, I'll go with ${label}.`,
|
|
292
|
+
waitReminder: (at, q) => `${at}Still waiting on you: “${q}” — tap an answer on the card above, or reply here.`,
|
|
293
|
+
waitReminderMany: (at, n) => `${at}Still waiting on you for ${n} questions in this thread — tap an answer on each card above, or reply here.`,
|
|
294
|
+
remindNow: (at, q) => `${at}Reminder: “${q}” — tap an answer on the card above, or reply here.`,
|
|
295
|
+
sensitiveReask: (at, q, kind) => `${at}Still need your answer: “${q}” — it needs your OK (${kind}), so I'm not going ahead without it. The card is above.`,
|
|
296
|
+
chose: (who, label, at) => `✔ ${who} chose *${label}* · ${at}`,
|
|
297
|
+
answered: (who, words, at) => `✔ ${who} answered: “${words}” · ${at}`,
|
|
298
|
+
answeredInThread: (at) => `✔ Answered in thread · ${at}`,
|
|
299
|
+
parked: (id) => `⏸ Parked — no answer, so I'm not going ahead. Answer from "Waiting on you" to reopen it. · ${id}`,
|
|
300
|
+
closed: (reason, at) => `✓ Closed — ${reason} · ${at}`,
|
|
301
|
+
skipped: (who, at) => `⤼ ${who} skipped this · ${at}`,
|
|
302
|
+
theOwner: 'The owner',
|
|
303
|
+
defaultNoAnswerOpen: (when) => `No answer by ${when} — still open.`,
|
|
304
|
+
defaultNoAnswer: (when, verb, label) => `No answer by ${when}, so ${verb} "${label}".`,
|
|
305
|
+
defaultVerb: (name, settled) => (settled ? `${name ?? 'I'} went with` : name ? `${name} will go with` : "I'll go with"),
|
|
306
|
+
};
|
|
307
|
+
const ZH = {
|
|
308
|
+
remindButton: '明天再问',
|
|
309
|
+
skipButton: '不用了',
|
|
310
|
+
details: '详情',
|
|
311
|
+
requestedBy: '谁提的',
|
|
312
|
+
ownerLastSaid: '你上次说',
|
|
313
|
+
runtimeChanges: '会带来的变化',
|
|
314
|
+
mergeRuntimeChanges: '合并后会',
|
|
315
|
+
remindingAt: (when) => `⏰ ${when} 再提醒你。`,
|
|
316
|
+
declineDefault: (when, label) => `你回答之前什么都不会生效。${when} 前没回答:${label}。`,
|
|
317
|
+
heldDefault: (when, label) => `没有你的同意什么都不会发生。${when} 前没回答就按「${label}」。`,
|
|
318
|
+
sensitive: (kind) => `这件事需要你同意(${SENSITIVE_ZH[kind] ?? kind}),没有答复我不会继续。`,
|
|
319
|
+
waitHold: '点一个选项,或在这个帖子里回复——你回答之前我先不动。',
|
|
320
|
+
goWithDefault: (when, label) => `${when} 前没回答,我就按「${label}」。`,
|
|
321
|
+
waitReminder: (at, q) => `${at}还在等你回复:「${q}」——点上面卡片里的选项,或直接在这里回复。`,
|
|
322
|
+
waitReminderMany: (at, n) => `${at}这个帖子里还有 ${n} 个问题在等你回复——点上面卡片里的选项,或直接在这里回复。`,
|
|
323
|
+
remindNow: (at, q) => `${at}提醒一下:「${q}」——点上面卡片里的选项,或直接在这里回复。`,
|
|
324
|
+
sensitiveReask: (at, q, kind) => `${at}还需要你确认:「${q}」——这件事需要你同意(${SENSITIVE_ZH[kind] ?? kind}),没有答复我不会继续。卡片在上面。`,
|
|
325
|
+
chose: (who, label, at) => `✔ ${who} 选了 *${label}* · ${at}`,
|
|
326
|
+
answered: (who, words, at) => `✔ ${who} 回复:“${words}” · ${at}`,
|
|
327
|
+
answeredInThread: (at) => `✔ 已在帖子里回复 · ${at}`,
|
|
328
|
+
parked: (id) => `⏸ 没有答复,先不做。在「等你处理」里回答可以重新打开。 · ${id}`,
|
|
329
|
+
closed: (reason, at) => `✓ 已关闭——${reason} · ${at}`,
|
|
330
|
+
skipped: (who, at) => `⤼ ${who} 跳过了 · ${at}`,
|
|
331
|
+
theOwner: '你',
|
|
332
|
+
defaultNoAnswerOpen: (when) => `${when} 前没有回答——还开着。`,
|
|
333
|
+
defaultNoAnswer: (when, verb, label) => `${when} 前没有回答,所以${verb}「${label}」。`,
|
|
334
|
+
defaultVerb: (name, settled) => (settled ? `${name ?? '我'}按了` : `${name ?? '我'}会按`),
|
|
335
|
+
};
|
|
336
|
+
/**
|
|
337
|
+
* The harness's card text in a language.
|
|
338
|
+
*
|
|
339
|
+
* @param lang - Owner language (absent = English)
|
|
340
|
+
* @returns Strings
|
|
341
|
+
*/
|
|
342
|
+
export function cardText(lang) {
|
|
343
|
+
return lang === 'zh' ? ZH : EN;
|
|
344
|
+
}
|
|
345
|
+
const DAYS_ZH = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
|
|
346
|
+
/**
|
|
347
|
+
* Short local time in Chinese: "14:05" today, "明天 12:00", else "10月2日 周四 12:00".
|
|
348
|
+
*
|
|
349
|
+
* @param at - Moment
|
|
350
|
+
* @param now - Clock
|
|
351
|
+
* @returns Text
|
|
352
|
+
*/
|
|
353
|
+
export function formatWhenZh(at, now = new Date()) {
|
|
354
|
+
const hm = `${String(at.getHours()).padStart(2, '0')}:${String(at.getMinutes()).padStart(2, '0')}`;
|
|
355
|
+
const day = (d) => `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
|
|
356
|
+
if (day(at) === day(now))
|
|
357
|
+
return hm;
|
|
358
|
+
const tomorrow = new Date(now.getTime());
|
|
359
|
+
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
360
|
+
if (day(at) === day(tomorrow))
|
|
361
|
+
return `明天 ${hm}`;
|
|
362
|
+
return `${at.getMonth() + 1}月${at.getDate()}日 ${DAYS_ZH[at.getDay()]} ${hm}`;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The context lines of a card (who asked, what the owner said last, what
|
|
366
|
+
* changes), as mrkdwn — null when there is no context.
|
|
367
|
+
*
|
|
368
|
+
* @param context - Card context
|
|
369
|
+
* @param lang - Owner language
|
|
370
|
+
* @param merge - Merge card ("What merging changes")
|
|
371
|
+
* @returns mrkdwn, or null
|
|
372
|
+
*/
|
|
373
|
+
export function contextSection(context, lang, merge = false) {
|
|
374
|
+
if (!context)
|
|
375
|
+
return null;
|
|
376
|
+
const t = cardText(lang);
|
|
377
|
+
const sep = lang === 'zh' ? ':' : ': ';
|
|
378
|
+
const lines = [];
|
|
379
|
+
if (context.requestedBy)
|
|
380
|
+
lines.push(`*${t.requestedBy}*${sep}${context.requestedBy}`);
|
|
381
|
+
if (context.ownerLastSaid)
|
|
382
|
+
lines.push(`*${t.ownerLastSaid}*${sep}“${context.ownerLastSaid.replace(/^[“"「]+|[”"」]+$/gu, '')}”`);
|
|
383
|
+
if (context.runtimeChanges)
|
|
384
|
+
lines.push(`*${merge ? t.mergeRuntimeChanges : t.runtimeChanges}*${sep}${context.runtimeChanges}`);
|
|
385
|
+
return lines.length ? lines.join('\n') : null;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* The short details line (PR link / references), or null.
|
|
389
|
+
*
|
|
390
|
+
* @param d - Decision context + stripped refs
|
|
391
|
+
* @param lang - Owner language
|
|
392
|
+
* @returns mrkdwn, or null
|
|
393
|
+
*/
|
|
394
|
+
export function detailsLine(d, lang) {
|
|
395
|
+
const refs = [...(d.context?.link ? [d.context.link] : []), ...(d.details ?? [])];
|
|
396
|
+
const unique = refs.filter((r, i) => refs.indexOf(r) === i);
|
|
397
|
+
// A link already names the PR: drop a bare "PR #n" it contains.
|
|
398
|
+
const shown = unique.filter((r) => {
|
|
399
|
+
const n = /^PR #(\d+)$/.exec(r)?.[1];
|
|
400
|
+
return !n || !unique.some((o) => o !== r && new RegExp(`/pull/${n}\\b`).test(o));
|
|
401
|
+
});
|
|
402
|
+
if (shown.length === 0)
|
|
403
|
+
return null;
|
|
404
|
+
return `${cardText(lang).details}${lang === 'zh' ? ':' : ': '}${shown.slice(0, W.DETAILS_MAX_REFS).join(' · ')}`;
|
|
405
|
+
}
|
|
406
|
+
//# sourceMappingURL=decision-wording.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-wording.js","sourceRoot":"","sources":["../../../../../../backend/src/services/decisions/decision-wording.ts"],"names":[],"mappings":"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"}
|