crewly 1.20.106 → 1.20.107
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/README.md +22 -12
- package/config/constants.ts +43 -0
- package/config/index.ts +2 -0
- package/config/skills/_common/lib.sh +55 -2
- package/config/skills/_common/lib.test.sh +58 -1
- package/config/skills/_common/task-pool-body-shape.test.sh +60 -0
- package/config/skills/agent/core/cancel-followup/execute.sh +18 -3
- package/config/skills/agent/core/cancel-followup/execute.test.sh +73 -0
- package/config/skills/agent/core/complete-task/execute.sh +1 -1
- package/config/skills/agent/core/create-intent-tasks/execute.sh +1 -1
- package/config/skills/agent/core/create-task/SKILL.md +1 -0
- package/config/skills/agent/core/create-task/execute.sh +10 -0
- package/config/skills/agent/core/decompose-intent/execute.sh +1 -1
- package/config/skills/agent/core/handoff-task/execute.sh +1 -1
- package/config/skills/agent/core/list-my-followups/SKILL.md +1 -1
- package/config/skills/agent/core/list-my-followups/execute.sh +25 -3
- package/config/skills/agent/core/list-my-followups/execute.test.sh +72 -0
- package/config/skills/agent/core/poll-tasks/execute.sh +3 -3
- package/config/skills/agent/core/reply-channel/SKILL.md +1 -1
- package/config/skills/agent/core/report-progress/execute.sh +1 -1
- package/config/skills/agent/core/report-status/execute.sh +1 -1
- package/config/skills/agent/core/slack-post/SKILL.md +1 -1
- package/config/skills/agent/core/update-intent-task/execute.sh +1 -1
- package/config/skills/agent/marketing/brand-onboarding/execute.sh +1 -1
- package/config/skills/agent/marketing/submit-for-approval/execute.sh +1 -1
- package/config/skills/agent/remote-browser/SOP-google-flow-video.md +1 -1
- package/config/skills/agent/remote-browser/execute.sh +33 -1
- package/config/skills/agent/remote-browser/execute.test.sh +62 -0
- package/config/skills/agent/screenshot-compare/execute.sh +1 -1
- package/config/skills/agent/transcribe-audio/SKILL.md +1 -1
- package/config/skills/agent/transcribe-audio/execute.sh +1 -1
- package/config/skills/agent/transcribe-audio/instructions.md +1 -1
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/get-tasks/SKILL.md +7 -1
- package/config/skills/orchestrator/get-tasks/execute.sh +51 -28
- package/config/skills/orchestrator/get-tasks/execute.test.sh +67 -0
- package/config/skills/orchestrator/heartbeat/execute.sh +2 -2
- package/config/skills/orchestrator/list-missions/execute.sh +1 -1
- package/config/skills/orchestrator/list-missions/execute.test.sh +38 -11
- package/config/skills/team-leader/decompose-goal/SKILL.md +1 -0
- package/config/skills/team-leader/decompose-goal/execute.sh +17 -2
- package/config/skills/team-leader/delegate-task/SKILL.md +1 -0
- package/config/skills/team-leader/delegate-task/execute.sh +6 -2
- package/dist/backend/backend/src/constants.d.ts +199 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +190 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +33 -0
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +176 -9
- package/dist/backend/backend/src/controllers/browser/browser.controller.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 +38 -35
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +10 -45
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +40 -89
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts +2 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +21 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +51 -3
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts +23 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js +35 -0
- package/dist/backend/backend/src/controllers/system/restart-readiness.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts +5 -3
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +27 -6
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.routes.js +3 -0
- package/dist/backend/backend/src/controllers/system/system.routes.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 +29 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +86 -6
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts +41 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +135 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.js +25 -0
- package/dist/backend/backend/src/controllers/tickets/tickets.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts +70 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +352 -71
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +3 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts +128 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js +200 -0
- package/dist/backend/backend/src/scripts/leaked-stub-teams.lib.js.map +1 -0
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js +3 -1
- package/dist/backend/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +4 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +61 -4
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
- package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js +62 -1
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +2 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +0 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js +0 -2
- package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +113 -10
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts +12 -0
- package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/restore-filter.js +19 -0
- package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
- package/dist/backend/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +57 -5
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +98 -18
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +12 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +25 -4
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +2 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +5 -1
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +38 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.js +34 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +5 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js +7 -2
- package/dist/backend/backend/src/services/chat-v2/chat-v2.relay-adapter.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +58 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts +63 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js +72 -0
- package/dist/backend/backend/src/services/chat-v2/owner-inbound.utils.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +15 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +6 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/retry.util.d.ts +5 -0
- package/dist/backend/backend/src/services/core/retry.util.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/retry.util.js +2 -2
- package/dist/backend/backend/src/services/core/retry.util.js.map +1 -1
- package/dist/backend/backend/src/services/factory.service.js +3 -3
- package/dist/backend/backend/src/services/factory.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js +24 -1
- package/dist/backend/backend/src/services/messaging/google-chat-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +9 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +55 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
- package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +90 -2
- package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +22 -16
- package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js +11 -1
- package/dist/backend/backend/src/services/orchestrator/onboarding/materialize-team.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +9 -9
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
- package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +153 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.js +279 -0
- package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +176 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.js +298 -0
- package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts +52 -0
- package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -0
- package/dist/backend/backend/src/services/restart/turn-probe.js +61 -0
- package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
- package/dist/backend/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +2 -0
- package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js +53 -1
- package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-binding.d.ts +125 -0
- package/dist/backend/backend/src/services/session/session-binding.d.ts.map +1 -0
- package/dist/backend/backend/src/services/session/session-binding.js +183 -0
- package/dist/backend/backend/src/services/session/session-binding.js.map +1 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-handoff.service.js +19 -0
- package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +37 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +4 -3
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +4 -3
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +72 -7
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +185 -23
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +57 -190
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts +59 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.js +69 -0
- package/dist/backend/backend/src/services/slack/slack-source-preference.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +64 -3
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +33 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +129 -4
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts +108 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.d.ts.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js +193 -0
- package/dist/backend/backend/src/services/task-pool/pool-archive-migration.js.map +1 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts +15 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/pool-storage.js +30 -0
- package/dist/backend/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
- 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 +55 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts +7 -0
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js +32 -1
- package/dist/backend/backend/src/services/telegram/telegram-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +4 -3
- package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js +12 -0
- package/dist/backend/backend/src/services/v3/request-decompose.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts +7 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +17 -0
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js +458 -0
- package/dist/backend/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.js +566 -0
- package/dist/backend/backend/src/services/v3/ticket-intake.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +3 -3
- package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +28 -4
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +40 -10
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +1 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +3 -3
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +29 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/thread-status.types.d.ts +26 -0
- package/dist/backend/backend/src/types/thread-status.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/thread-status.types.js +17 -0
- package/dist/backend/backend/src/types/thread-status.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +3 -2
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -1
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts +39 -3
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js +11 -2
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/ticket.types.d.ts +173 -0
- package/dist/backend/backend/src/types/v2/ticket.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/ticket.types.js +203 -0
- package/dist/backend/backend/src/types/v2/ticket.types.js.map +1 -0
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +26 -0
- package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/agent-caller.utils.js +40 -3
- package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts +62 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.js +104 -0
- package/dist/backend/backend/src/utils/gemini-auth-settings.js.map +1 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.d.ts +56 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.js +80 -0
- package/dist/backend/backend/src/utils/local-api-url.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +40 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +41 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +4 -2
- package/dist/backend/config/index.d.ts.map +1 -1
- package/dist/backend/config/index.js +2 -2
- package/dist/backend/config/index.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +199 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +190 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +2 -2
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +3 -1
- package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +4 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +61 -4
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +30 -0
- package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js +62 -1
- package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +2 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +0 -2
- package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js +0 -2
- package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +65 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +113 -10
- package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +3 -2
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts +28 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js +34 -0
- package/dist/cli/backend/src/services/agent/runtime-startup-blocked.error.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +6 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +5 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +58 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +15 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +7 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +12 -0
- package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +36 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +90 -2
- package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +189 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +246 -0
- package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +176 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.js +298 -0
- package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts +70 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js +105 -0
- package/dist/cli/backend/src/services/session/pty/node-pty-install.utils.js.map +1 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +2 -0
- package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js +53 -1
- package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/session/session-handoff.service.js +19 -0
- package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts +10 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +37 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +4 -45
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +57 -190
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +18 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +64 -3
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +33 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +129 -4
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts +15 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/pool-storage.js +30 -0
- package/dist/cli/backend/src/services/task-pool/pool-storage.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +41 -1
- 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 +55 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.d.ts +7 -0
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +17 -0
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts +279 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js +458 -0
- package/dist/cli/backend/src/services/v3/ticket-channel-hooks.js.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts +376 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.js +566 -0
- package/dist/cli/backend/src/services/v3/ticket-intake.service.js.map +1 -0
- package/dist/cli/backend/src/types/slack.types.d.ts +29 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/thread-status.types.d.ts +26 -0
- package/dist/cli/backend/src/types/thread-status.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/thread-status.types.js +17 -0
- package/dist/cli/backend/src/types/thread-status.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts +3 -2
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -1
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts +39 -3
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js +11 -2
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/ticket.types.d.ts +173 -0
- package/dist/cli/backend/src/types/v2/ticket.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/ticket.types.js +203 -0
- package/dist/cli/backend/src/types/v2/ticket.types.js.map +1 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts +62 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.js +104 -0
- package/dist/cli/backend/src/utils/gemini-auth-settings.js.map +1 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.d.ts +56 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.js +80 -0
- package/dist/cli/backend/src/utils/local-api-url.utils.js.map +1 -0
- package/dist/cli/cli/src/commands/doctor.d.ts +73 -2
- package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/doctor.js +250 -8
- package/dist/cli/cli/src/commands/doctor.js.map +1 -1
- package/dist/cli/cli/src/commands/install.js +2 -0
- package/dist/cli/cli/src/commands/install.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +68 -0
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +149 -18
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/service.d.ts +6 -0
- package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/service.js +152 -50
- package/dist/cli/cli/src/commands/service.js.map +1 -1
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +25 -80
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/commands/status.d.ts +17 -1
- package/dist/cli/cli/src/commands/status.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/status.js +133 -68
- package/dist/cli/cli/src/commands/status.js.map +1 -1
- package/dist/cli/cli/src/commands/stop.d.ts +28 -1
- package/dist/cli/cli/src/commands/stop.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/stop.js +260 -100
- package/dist/cli/cli/src/commands/stop.js.map +1 -1
- package/dist/cli/cli/src/index.js +3 -2
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts +68 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.d.ts.map +1 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.js +167 -0
- package/dist/cli/cli/src/scripts/ensure-node-pty.js.map +1 -0
- package/dist/cli/cli/src/utils/backend-status.d.ts +175 -0
- package/dist/cli/cli/src/utils/backend-status.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/backend-status.js +322 -0
- package/dist/cli/cli/src/utils/backend-status.js.map +1 -0
- package/dist/cli/cli/src/utils/marketplace.d.ts +31 -2
- package/dist/cli/cli/src/utils/marketplace.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/marketplace.js +78 -20
- package/dist/cli/cli/src/utils/marketplace.js.map +1 -1
- package/dist/cli/cli/src/utils/native-toolchain.d.ts +53 -8
- package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/native-toolchain.js +107 -15
- package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -1
- package/dist/cli/cli/src/utils/process-cleanup.d.ts +38 -6
- package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/process-cleanup.js +83 -53
- package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -1
- package/dist/cli/cli/src/utils/runtime-auth.d.ts +130 -0
- package/dist/cli/cli/src/utils/runtime-auth.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/runtime-auth.js +248 -0
- package/dist/cli/cli/src/utils/runtime-auth.js.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts +137 -0
- package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/safe-shutdown.js +236 -0
- package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -0
- package/dist/cli/config/constants.d.ts +40 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +41 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +4 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +2 -2
- package/dist/cli/config/index.js.map +1 -1
- package/frontend/dist/assets/{index-488339c1.js → index-f7b99e81.js} +222 -222
- package/frontend/dist/index.html +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -22,14 +22,8 @@ Crewly is an open-source multi-agent orchestration platform that coordinates AI
|
|
|
22
22
|
## Quick Start
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
# Initialize Crewly in your project (no global install needed)
|
|
26
|
-
npx crewly init
|
|
27
|
-
|
|
28
|
-
# Or install globally first
|
|
29
25
|
npm install -g crewly
|
|
30
26
|
crewly init
|
|
31
|
-
|
|
32
|
-
# Start the platform
|
|
33
27
|
crewly start
|
|
34
28
|
```
|
|
35
29
|
|
|
@@ -39,10 +33,19 @@ The `init` command walks you through provider selection, installs agent skills,
|
|
|
39
33
|
2. Assign the team to a **project** (any local code directory)
|
|
40
34
|
3. Watch agents work in real time through live terminal streams
|
|
41
35
|
|
|
42
|
-
##
|
|
36
|
+
## Requirements
|
|
37
|
+
|
|
38
|
+
- **Node.js 22 or later** (with npm). Node 20 is end-of-life and its `better-sqlite3` has no prebuilt binary.
|
|
39
|
+
- **No C/C++ toolchain on macOS (x64/arm64) or glibc Linux (x64/arm64).** The native modules install from prebuilt binaries there. You do need `python3`, `make` and `g++` (Xcode Command Line Tools on macOS) in these cases:
|
|
40
|
+
- Alpine/musl, glibc older than 2.28, or other architectures, where `node-pty` compiles from source
|
|
41
|
+
|
|
42
|
+
On Debian/Ubuntu, install the toolchain with `sudo apt-get install -y python3 make g++`. `crewly doctor` tells you whether you need it.
|
|
43
|
+
- **jq** (`brew install jq` on macOS, `sudo apt-get install -y jq` on Debian/Ubuntu). Agent skills use it, and `crewly init` stops if it is missing.
|
|
44
|
+
- **curl**
|
|
45
|
+
- **One AI coding CLI, installed and logged in**: Claude Code (`claude`), Gemini CLI (`gemini`) or Codex (`codex`). OpenCode also works.
|
|
46
|
+
- **A normal user account, not root.** Run Crewly as a normal user, not with `sudo` or as root. Claude Code refuses to start its agents under root.
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
- **At least one** AI coding CLI installed:
|
|
48
|
+
tmux is not required.
|
|
46
49
|
|
|
47
50
|
| Runtime | Install | Verify |
|
|
48
51
|
|---------|---------|--------|
|
|
@@ -51,7 +54,7 @@ The `init` command walks you through provider selection, installs agent skills,
|
|
|
51
54
|
| **Codex (OpenAI)** | `npm install -g @openai/codex` | `codex --version` |
|
|
52
55
|
| **OpenCode** | `npm install -g opencode-ai` | `opencode --version` |
|
|
53
56
|
|
|
54
|
-
**API keys:** Gemini CLI requires `GEMINI_API_KEY`. Codex requires an OpenAI API key. Claude Code
|
|
57
|
+
**API keys:** Gemini CLI requires `GEMINI_API_KEY`. On a Gemini agent's first run, answer its two terminal prompts: authentication (**Use Gemini API Key**) and folder trust (**Yes**). Codex requires an OpenAI API key. Claude Code: run `claude` once in a terminal, finish its first-run setup (choose a theme) **and** log in before you start a team. A Claude agent cannot get past those screens on its own. OpenCode uses whichever provider you connect via `opencode auth login` (or the `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` env vars Crewly already exports to agent sessions).
|
|
55
58
|
|
|
56
59
|
## Architecture
|
|
57
60
|
|
|
@@ -128,7 +131,7 @@ GEMINI_API_KEY=your_key_here # Required for Gemini CLI runtime
|
|
|
128
131
|
SLACK_BOT_TOKEN=xoxb-... # Optional: self-hosted Slack app (see "Slack" below)
|
|
129
132
|
SLACK_APP_TOKEN=xapp-...
|
|
130
133
|
SLACK_SIGNING_SECRET=...
|
|
131
|
-
CREWLY_SLACK_SOURCE=cloud # Optional: env | cloud (unset =
|
|
134
|
+
CREWLY_SLACK_SOURCE=cloud # Optional: env | cloud (unset = last connected source, else self-hosted, when both exist)
|
|
132
135
|
CREWLY_SLACK_PRIMARY=1 # Optional: this instance handles DMs / unmapped channels
|
|
133
136
|
|
|
134
137
|
LOG_LEVEL=info # debug, info, warn, error
|
|
@@ -165,7 +168,14 @@ instance — the Settings toggle, or `CREWLY_SLACK_PRIMARY=1`.
|
|
|
165
168
|
`SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` / `SLACK_SIGNING_SECRET` or the form under
|
|
166
169
|
Settings → Slack → Advanced) still works. `CREWLY_SLACK_SOURCE` picks the source:
|
|
167
170
|
`cloud` uses only the Cloud workspace, `env` uses only local tokens and never
|
|
168
|
-
asks Cloud,
|
|
171
|
+
asks Cloud. Unset, when both exist, a restart keeps the app that was last
|
|
172
|
+
connected (with none recorded, the self-hosted app) and logs a warning — the
|
|
173
|
+
two are different bot users, so switching silently would break every channel of
|
|
174
|
+
the other one. The other app is used only if the chosen one cannot connect.
|
|
175
|
+
Switch explicitly with `PUT /api/slack/source {"source":"env"|"cloud"}`.
|
|
176
|
+
`GET /api/slack/status` reports the connected `source` and turns `degraded`
|
|
177
|
+
(with `degradedReason`) when posts keep failing with `channel_not_found` /
|
|
178
|
+
`not_in_channel`.
|
|
169
179
|
|
|
170
180
|
### Securing a server install
|
|
171
181
|
|
package/config/constants.ts
CHANGED
|
@@ -188,6 +188,32 @@ export const PROCESS_EXIT_CODES = {
|
|
|
188
188
|
RESTART_REQUESTED: 120,
|
|
189
189
|
} as const;
|
|
190
190
|
|
|
191
|
+
// ========================= SAFE RESTART CONSTANTS =========================
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Safe-restart budget shared by the backend (which drains in-flight agent
|
|
195
|
+
* turns on SIGTERM/SIGINT) and every supervisor that stops it (CLI `start`
|
|
196
|
+
* parent, `crewly stop`, `crewly service`, the systemd unit). A supervisor
|
|
197
|
+
* that escalates to SIGKILL sooner than the drain plus a margin would cut
|
|
198
|
+
* off the very turns the drain is waiting for.
|
|
199
|
+
*/
|
|
200
|
+
export const SAFE_RESTART_CONSTANTS = {
|
|
201
|
+
/** Default time the backend waits for agents to finish their current turn (ms) */
|
|
202
|
+
DRAIN_TIMEOUT_MS: 120_000,
|
|
203
|
+
/** Env var overriding DRAIN_TIMEOUT_MS; `0` disables the wait */
|
|
204
|
+
DRAIN_ENV_VAR: 'CREWLY_RESTART_DRAIN_MS',
|
|
205
|
+
/**
|
|
206
|
+
* Time allowed after the drain for the rest of the shutdown (session state
|
|
207
|
+
* save, PTY teardown, queue flush) before a supervisor may SIGKILL (ms).
|
|
208
|
+
* Must exceed the backend's own post-drain force-exit timer (10s).
|
|
209
|
+
*/
|
|
210
|
+
SHUTDOWN_MARGIN_MS: 30_000,
|
|
211
|
+
/** Two signals closer together than this count as one (tty process-group delivery) */
|
|
212
|
+
SIGNAL_DEDUP_WINDOW_MS: 1_000,
|
|
213
|
+
/** REST path an operator (or the CLI) polls before restarting */
|
|
214
|
+
READINESS_ENDPOINT: '/api/system/restart-readiness',
|
|
215
|
+
} as const;
|
|
216
|
+
|
|
191
217
|
// ========================= WEB SERVER CONSTANTS =========================
|
|
192
218
|
|
|
193
219
|
/**
|
|
@@ -220,6 +246,10 @@ export const WEB_CONSTANTS = {
|
|
|
220
246
|
ORCHESTRATOR: '/api/orchestrator',
|
|
221
247
|
/** Terminal operations endpoints */
|
|
222
248
|
TERMINAL: '/api/terminal',
|
|
249
|
+
/** Live agent sessions (PTY): name, pid, cwd */
|
|
250
|
+
SESSIONS: '/api/sessions',
|
|
251
|
+
/** Live terminal sessions including in-process (no PTY) agents */
|
|
252
|
+
TERMINAL_SESSIONS: '/api/terminal/sessions',
|
|
223
253
|
/** Task management endpoints */
|
|
224
254
|
TASKS: '/api/tasks',
|
|
225
255
|
/** Factory SSE endpoint */
|
|
@@ -295,6 +325,19 @@ export const API_SECURITY_CONSTANTS = {
|
|
|
295
325
|
},
|
|
296
326
|
/** Actor recorded on approvals performed with the owner token */
|
|
297
327
|
OWNER_ACTOR: 'owner',
|
|
328
|
+
/**
|
|
329
|
+
* Header the dashboard sets on owner-initiated actions (e.g. the per-member
|
|
330
|
+
* Start button). Paired with the ABSENCE of `X-Agent-Session`, it marks a
|
|
331
|
+
* request as a human action rather than an agent skill or an internal
|
|
332
|
+
* server-to-server call, which send neither (issue #775).
|
|
333
|
+
*/
|
|
334
|
+
CALLER_HEADER: 'x-crewly-caller',
|
|
335
|
+
/** Value of {@link CALLER_HEADER} sent by the dashboard. */
|
|
336
|
+
DASHBOARD_CALLER: 'dashboard',
|
|
337
|
+
/** Header skills send to identify the calling agent session. */
|
|
338
|
+
AGENT_SESSION_HEADER: 'x-agent-session',
|
|
339
|
+
/** Legacy alias of {@link AGENT_SESSION_HEADER} still accepted by the backend. */
|
|
340
|
+
AGENT_SESSION_HEADER_LEGACY: 'x-crewly-agent-session',
|
|
298
341
|
/** Hint appended to 401 responses */
|
|
299
342
|
UNAUTHORIZED_HINT:
|
|
300
343
|
'Non-loopback callers must send the API token: `Authorization: Bearer <token>`, `X-Crewly-Token: <token>` or a `crewly_token` cookie. Run `crewly token` on the server to print it.',
|
package/config/index.ts
CHANGED
|
@@ -36,6 +36,7 @@ import {
|
|
|
36
36
|
MARKETPLACE_CONSTANTS,
|
|
37
37
|
TEMPLATE_MARKETPLACE_CONSTANTS,
|
|
38
38
|
PROCESS_EXIT_CODES,
|
|
39
|
+
SAFE_RESTART_CONSTANTS,
|
|
39
40
|
SERVER_CONSTANTS,
|
|
40
41
|
API_SECURITY_CONSTANTS,
|
|
41
42
|
EVENT_DEBOUNCE_MS,
|
|
@@ -64,6 +65,7 @@ export {
|
|
|
64
65
|
MARKETPLACE_CONSTANTS,
|
|
65
66
|
TEMPLATE_MARKETPLACE_CONSTANTS,
|
|
66
67
|
PROCESS_EXIT_CODES,
|
|
68
|
+
SAFE_RESTART_CONSTANTS,
|
|
67
69
|
SERVER_CONSTANTS,
|
|
68
70
|
API_SECURITY_CONSTANTS,
|
|
69
71
|
EVENT_DEBOUNCE_MS,
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
# Provides common utilities for all bash skills (agent and orchestrator).
|
|
5
5
|
# =============================================================================
|
|
6
6
|
|
|
7
|
-
# Base URL for the Crewly backend API
|
|
8
|
-
|
|
7
|
+
# Base URL for the Crewly backend API. The backend sets CREWLY_API_URL on
|
|
8
|
+
# every agent to the port it actually runs on (#777); without it, fall back to
|
|
9
|
+
# the WEB_PORT the server was started with, then the default port.
|
|
10
|
+
CREWLY_API_URL="${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}"
|
|
9
11
|
|
|
10
12
|
# -----------------------------------------------------------------------------
|
|
11
13
|
# Skill output cap (context-cost control)
|
|
@@ -249,6 +251,14 @@ api_call() {
|
|
|
249
251
|
if [ -n "${CREWLY_GOOGLE_ACCOUNT:-}" ]; then
|
|
250
252
|
args+=(-H "X-Google-Account: $CREWLY_GOOGLE_ACCOUNT")
|
|
251
253
|
fi
|
|
254
|
+
# What the agent is trying to accomplish, shown in the owner's Chrome
|
|
255
|
+
# takeover banner and the live browser view. Callers export
|
|
256
|
+
# CREWLY_AGENT_GOAL, or pass remote-browser's --goal. Base64 for the same
|
|
257
|
+
# reason as the authorization above: goals are often not ASCII, and a raw
|
|
258
|
+
# newline would end the header.
|
|
259
|
+
if [ -n "${CREWLY_AGENT_GOAL:-}" ]; then
|
|
260
|
+
args+=(-H "X-Agent-Goal: b64:$(printf '%s' "$CREWLY_AGENT_GOAL" | base64 | tr -d '\n')")
|
|
261
|
+
fi
|
|
252
262
|
[ -n "$body" ] && args+=(-d "$body")
|
|
253
263
|
|
|
254
264
|
local response
|
|
@@ -273,6 +283,49 @@ api_call() {
|
|
|
273
283
|
fi
|
|
274
284
|
}
|
|
275
285
|
|
|
286
|
+
# -----------------------------------------------------------------------------
|
|
287
|
+
# api_call_full METHOD endpoint [json_body]
|
|
288
|
+
#
|
|
289
|
+
# api_call for skills that reduce the response THEMSELVES — filter a list to
|
|
290
|
+
# the caller's team, count rows, pick one id — and therefore must see all of
|
|
291
|
+
# it. The output cap in api_call replaces any body over
|
|
292
|
+
# CREWLY_SKILL_MAX_OUTPUT_BYTES with a {"truncated":true,...} envelope, and a
|
|
293
|
+
# skill that runs `.data // []` over that envelope reports an EMPTY list with
|
|
294
|
+
# success:true (2026-09-21: list-my-followups and cancel-followup saw 0 of
|
|
295
|
+
# 335 triggers because GET /triggers was 233 KB). This helper:
|
|
296
|
+
# 1. bypasses the cap for this one call;
|
|
297
|
+
# 2. if an envelope still comes back (api_call swapped for a test double,
|
|
298
|
+
# or a future cap path), reads the parked file it points at;
|
|
299
|
+
# 3. otherwise prints an error object on stderr and returns 1 — never a
|
|
300
|
+
# body the caller could mistake for "no rows".
|
|
301
|
+
#
|
|
302
|
+
# The full body must not reach the LLM: callers reduce it before printing.
|
|
303
|
+
# Do not use this from a skill that echoes the response verbatim — that is
|
|
304
|
+
# exactly what the cap exists to prevent.
|
|
305
|
+
#
|
|
306
|
+
# Usage:
|
|
307
|
+
# if ! RESP=$(api_call_full GET "/triggers"); then error_exit "..."; fi
|
|
308
|
+
# -----------------------------------------------------------------------------
|
|
309
|
+
api_call_full() {
|
|
310
|
+
local body
|
|
311
|
+
if ! body=$(CREWLY_SKILL_FULL_OUTPUT=1 api_call "$@"); then
|
|
312
|
+
return 1
|
|
313
|
+
fi
|
|
314
|
+
if printf '%s' "$body" | jq -e 'if type == "object" then .truncated == true else false end' >/dev/null 2>&1; then
|
|
315
|
+
local file
|
|
316
|
+
file=$(printf '%s' "$body" | jq -r '.file // empty')
|
|
317
|
+
if [ -n "$file" ] && [ -r "$file" ]; then
|
|
318
|
+
cat "$file"
|
|
319
|
+
echo
|
|
320
|
+
return 0
|
|
321
|
+
fi
|
|
322
|
+
jq -nc --arg m "$1" --arg e "$2" --arg f "$file" \
|
|
323
|
+
'{error: true, truncated: true, details: ("api_call_full \($m) \($e): the response was replaced by a truncated envelope and its parked file (" + $f + ") is unreadable; refusing to return a body that would parse as an empty list")}' >&2
|
|
324
|
+
return 1
|
|
325
|
+
fi
|
|
326
|
+
printf '%s\n' "$body"
|
|
327
|
+
}
|
|
328
|
+
|
|
276
329
|
# -----------------------------------------------------------------------------
|
|
277
330
|
# error_exit message
|
|
278
331
|
# Prints a JSON error to stderr and exits with code 1.
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
# =============================================================================
|
|
3
3
|
# Tests for lib.sh — shared skills library
|
|
4
4
|
# Covers: --file preprocessor, read_json_input, require_param, error_exit,
|
|
5
|
-
# api_call output cap (CREWLY_SKILL_MAX_OUTPUT_BYTES)
|
|
5
|
+
# api_call output cap (CREWLY_SKILL_MAX_OUTPUT_BYTES),
|
|
6
|
+
# CREWLY_API_URL default (#777)
|
|
6
7
|
# =============================================================================
|
|
7
8
|
set -euo pipefail
|
|
8
9
|
|
|
@@ -252,12 +253,68 @@ assert_eq "api_call: prune runs even when the body is small" '{"ok":true}' "$RES
|
|
|
252
253
|
assert_eq "api_call: stale parked output is deleted" "missing" "$([ -f "$CAP_DIR/old-skill-stale.json" ] && echo present || echo missing)"
|
|
253
254
|
assert_eq "api_call: fresh parked output is kept" "present" "$([ -f "$CAP_DIR/fresh-skill-recent.json" ] && echo present || echo missing)"
|
|
254
255
|
|
|
256
|
+
# =============================================================================
|
|
257
|
+
# api_call_full — callers that reduce the body themselves must see all of it
|
|
258
|
+
# (2026-09-21: list-my-followups saw 0 of 335 triggers via the envelope).
|
|
259
|
+
# =============================================================================
|
|
260
|
+
mkdir -p "$TEMP_DIR/skills/fake-full"
|
|
261
|
+
cat > "$TEMP_DIR/skills/fake-full/execute.sh" << 'SKILL_EOF'
|
|
262
|
+
#!/bin/bash
|
|
263
|
+
set -euo pipefail
|
|
264
|
+
source "$LIB_PATH"
|
|
265
|
+
curl() {
|
|
266
|
+
printf '%s\n%s' "$MOCK_BODY" "${MOCK_CODE:-200}"
|
|
267
|
+
}
|
|
268
|
+
# MOCK_ENVELOPE, when set, swaps api_call for a double that always hands back a
|
|
269
|
+
# truncated envelope pointing at that path — what an api_call that ignored the
|
|
270
|
+
# bypass (or a future cap path) would do.
|
|
271
|
+
if [ -n "${MOCK_ENVELOPE:-}" ]; then
|
|
272
|
+
api_call() { printf '{"truncated":true,"bytes":9,"file":"%s","head":"","hint":"x"}' "$MOCK_ENVELOPE"; }
|
|
273
|
+
fi
|
|
274
|
+
api_call_full GET "/anything"
|
|
275
|
+
SKILL_EOF
|
|
276
|
+
chmod +x "$TEMP_DIR/skills/fake-full/execute.sh"
|
|
277
|
+
|
|
278
|
+
# ---- Test 24: an oversized body comes back whole, and nothing is parked ----
|
|
279
|
+
export MOCK_BODY="$BIG"; unset MOCK_ENVELOPE MOCK_CODE
|
|
280
|
+
RESULT=$(CREWLY_SKILL_MAX_OUTPUT_BYTES=1000 bash "$TEMP_DIR/skills/fake-full/execute.sh")
|
|
281
|
+
assert_eq "api_call_full: oversized body returned whole" "$BIG" "$RESULT"
|
|
282
|
+
assert_eq "api_call_full: nothing parked on disk" "0" "$(find "$CAP_DIR" -name 'fake-full-*' 2>/dev/null | wc -l | tr -d ' ')"
|
|
283
|
+
|
|
284
|
+
# ---- Test 25: an envelope that still arrives is resolved from its parked file ----
|
|
285
|
+
printf '%s' '{"data":[1,2,3]}' > "$TEMP_DIR/parked.json"
|
|
286
|
+
RESULT=$(MOCK_ENVELOPE="$TEMP_DIR/parked.json" bash "$TEMP_DIR/skills/fake-full/execute.sh")
|
|
287
|
+
assert_eq "api_call_full: envelope resolved from its parked file" '{"data":[1,2,3]}' "$RESULT"
|
|
288
|
+
|
|
289
|
+
# ---- Test 26: an envelope whose parked file is unreadable fails loudly ----
|
|
290
|
+
FULL_CODE=0
|
|
291
|
+
RESULT=$(MOCK_ENVELOPE="$TEMP_DIR/missing.json" bash "$TEMP_DIR/skills/fake-full/execute.sh" 2>&1) || FULL_CODE=$?
|
|
292
|
+
assert_eq "api_call_full: unreadable parked file -> exit 1" "1" "$FULL_CODE"
|
|
293
|
+
assert_contains "api_call_full: the error names the truncation" '"truncated":true' "$RESULT"
|
|
294
|
+
assert_eq "api_call_full: no body on stdout for the caller to mistake for empty" "" \
|
|
295
|
+
"$(MOCK_ENVELOPE="$TEMP_DIR/missing.json" bash "$TEMP_DIR/skills/fake-full/execute.sh" 2>/dev/null || true)"
|
|
296
|
+
|
|
297
|
+
# ---- Test 27: HTTP errors still propagate as a non-zero return ----
|
|
298
|
+
export MOCK_BODY='{"error":"nope"}' MOCK_CODE=500; unset MOCK_ENVELOPE
|
|
299
|
+
FULL_CODE=0
|
|
300
|
+
bash "$TEMP_DIR/skills/fake-full/execute.sh" >/dev/null 2>&1 || FULL_CODE=$?
|
|
301
|
+
assert_eq "api_call_full: non-2xx returns 1" "1" "$FULL_CODE"
|
|
302
|
+
unset MOCK_BODY MOCK_CODE
|
|
303
|
+
|
|
255
304
|
# ---- Test 23: error responses are untouched by the cap ----
|
|
256
305
|
export MOCK_BODY='{"error":"nope"}' MOCK_CODE=500
|
|
257
306
|
RESULT=$(CREWLY_SKILL_MAX_OUTPUT_BYTES=5 bash "$TEMP_DIR/skills/fake-skill/execute.sh" 2>&1 || true)
|
|
258
307
|
assert_contains "api_call: non-2xx still reports the error object" '"status":500' "$RESULT"
|
|
259
308
|
unset MOCK_BODY MOCK_CODE CREWLY_HOME
|
|
260
309
|
|
|
310
|
+
# ---- Test 24: CREWLY_API_URL default follows the instance's port (#777) ----
|
|
311
|
+
RESULT=$(env -u CREWLY_API_URL WEB_PORT=8797 bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
|
|
312
|
+
assert_eq "lib.sh: default API URL uses WEB_PORT" "http://localhost:8797" "$RESULT"
|
|
313
|
+
RESULT=$(env -u CREWLY_API_URL -u WEB_PORT bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
|
|
314
|
+
assert_eq "lib.sh: default API URL without WEB_PORT is 8787" "http://localhost:8787" "$RESULT"
|
|
315
|
+
RESULT=$(CREWLY_API_URL=http://localhost:9001 WEB_PORT=8797 bash -c 'source "$1"; echo "$CREWLY_API_URL"' _ "$SCRIPT_DIR/lib.sh")
|
|
316
|
+
assert_eq "lib.sh: CREWLY_API_URL set by the backend wins" "http://localhost:9001" "$RESULT"
|
|
317
|
+
|
|
261
318
|
echo ""
|
|
262
319
|
echo "=== Results: $PASS/$TOTAL passed, $FAIL failed ==="
|
|
263
320
|
|
|
@@ -465,6 +465,66 @@ else
|
|
|
465
465
|
PASS=$((PASS + 1)); echo " ✓ no /block POST emitted"
|
|
466
466
|
fi
|
|
467
467
|
|
|
468
|
+
# ---------------------------------------------------------------------------
|
|
469
|
+
# Scenario 12 — ticket loop: every WorkItem-creating skill forwards
|
|
470
|
+
# --request-id as the top-level `requestId` (specs/ticket-loop.md §3), and
|
|
471
|
+
# omits it entirely when not given.
|
|
472
|
+
# ---------------------------------------------------------------------------
|
|
473
|
+
echo ""
|
|
474
|
+
echo "--- Scenario 12: --request-id reaches /add as requestId ---"
|
|
475
|
+
: > "$LOG"
|
|
476
|
+
bash "${REPO_ROOT}/config/skills/agent/core/create-task/execute.sh" \
|
|
477
|
+
--project-path /tmp/proj-foo --task "Ticketed task" --request-id TKT-042 >/dev/null 2>&1 || true
|
|
478
|
+
BODY=$(capture "/api/task-pool/add")
|
|
479
|
+
if [ -z "$BODY" ]; then
|
|
480
|
+
FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for create-task --request-id"
|
|
481
|
+
else
|
|
482
|
+
assert_add_contract "create-task(ticket)" "$BODY"
|
|
483
|
+
assert_jq "create-task: --request-id forwarded as requestId" '.requestId == "TKT-042"' "$BODY"
|
|
484
|
+
fi
|
|
485
|
+
|
|
486
|
+
: > "$LOG"
|
|
487
|
+
bash "${REPO_ROOT}/config/skills/agent/core/create-task/execute.sh" \
|
|
488
|
+
--project-path /tmp/proj-foo --task "Unticketed task" >/dev/null 2>&1 || true
|
|
489
|
+
BODY=$(capture "/api/task-pool/add")
|
|
490
|
+
if [ -n "$BODY" ]; then
|
|
491
|
+
assert_jq "create-task: omits requestId when not given" 'has("requestId") == false' "$BODY"
|
|
492
|
+
fi
|
|
493
|
+
|
|
494
|
+
: > "$LOG"
|
|
495
|
+
bash "${REPO_ROOT}/config/skills/team-leader/delegate-task/execute.sh" \
|
|
496
|
+
--to quinn-target --task "Ticketed delegation" --request-id req-ticket-7 >/dev/null 2>&1 || true
|
|
497
|
+
BODY=$(capture "/api/task-pool/add")
|
|
498
|
+
if [ -z "$BODY" ]; then
|
|
499
|
+
FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for tl-delegate-task --request-id"
|
|
500
|
+
else
|
|
501
|
+
assert_add_contract "tl-delegate-task(ticket)" "$BODY"
|
|
502
|
+
assert_jq "tl-delegate-task: --request-id forwarded as requestId" '.requestId == "req-ticket-7"' "$BODY"
|
|
503
|
+
fi
|
|
504
|
+
|
|
505
|
+
: > "$LOG"
|
|
506
|
+
bash "${REPO_ROOT}/config/skills/team-leader/decompose-goal/execute.sh" \
|
|
507
|
+
'{"objective":"Ticketed objective","projectPath":"/tmp/proj-foo","tasks":[{"title":"Sub","description":"d"}]}' \
|
|
508
|
+
--request-id req-ticket-9 >/dev/null 2>&1 || true
|
|
509
|
+
BODY=$(capture "/api/task-pool/add")
|
|
510
|
+
if [ -z "$BODY" ]; then
|
|
511
|
+
FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for decompose-goal --request-id"
|
|
512
|
+
else
|
|
513
|
+
assert_add_contract "decompose-goal(ticket)" "$BODY"
|
|
514
|
+
assert_jq "decompose-goal: --request-id forwarded as requestId" '.requestId == "req-ticket-9"' "$BODY"
|
|
515
|
+
fi
|
|
516
|
+
|
|
517
|
+
: > "$LOG"
|
|
518
|
+
bash "${REPO_ROOT}/config/skills/team-leader/decompose-goal/execute.sh" \
|
|
519
|
+
'{"objective":"JSON ticket","projectPath":"/tmp/proj-foo","requestId":"req-json-3","tasks":[{"title":"Sub","description":"d"}]}' \
|
|
520
|
+
>/dev/null 2>&1 || true
|
|
521
|
+
BODY=$(capture "/api/task-pool/add")
|
|
522
|
+
if [ -n "$BODY" ]; then
|
|
523
|
+
assert_jq "decompose-goal: JSON requestId forwarded" '.requestId == "req-json-3"' "$BODY"
|
|
524
|
+
else
|
|
525
|
+
FAIL=$((FAIL + 1)); echo " ✗ no /task-pool/add POST captured for decompose-goal JSON requestId"
|
|
526
|
+
fi
|
|
527
|
+
|
|
468
528
|
echo ""
|
|
469
529
|
echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
|
|
470
530
|
[ "$FAIL" -eq 0 ] || exit 1
|
|
@@ -73,7 +73,22 @@ if [ -z "$TRIGGER_ID" ]; then
|
|
|
73
73
|
TEAM_ID=$(resolve_team_id || true)
|
|
74
74
|
[ -z "$TEAM_ID" ] && { echo '{"error":"Cannot resolve owning team — cannot scope name lookup"}' >&2; exit 1; }
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
# The whole trigger table is needed to resolve a name (335 rows / 233 KB on
|
|
77
|
+
# 2026-09-21 — over the skill-output cap). Plain api_call would return a
|
|
78
|
+
# {"truncated":true} envelope and every name lookup would miss. A truncated
|
|
79
|
+
# or non-array body must fail loudly, or "not found" is reported for a
|
|
80
|
+
# trigger that exists.
|
|
81
|
+
if ! LIST_RESP=$(api_call_full GET "/triggers" ""); then
|
|
82
|
+
jq -n --arg n "$TRIGGER_NAME" \
|
|
83
|
+
'{success:false, name:$n, error:"GET /triggers failed or came back as a truncated envelope; cannot resolve the trigger by name (it may well exist)"}'
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
EXAMINED=$(printf '%s' "$LIST_RESP" | jq -r 'if type == "object" then (if (.data | type) == "array" then (.data | length) else "not-an-array" end) else "not-an-object" end' 2>/dev/null || echo "unparseable")
|
|
87
|
+
if ! [ "$EXAMINED" -ge 0 ] 2>/dev/null; then
|
|
88
|
+
jq -n --arg n "$TRIGGER_NAME" --arg why "$EXAMINED" \
|
|
89
|
+
'{success:false, name:$n, error:("GET /triggers returned a body whose .data is " + $why + "; cannot resolve the trigger by name")}'
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
77
92
|
TRIGGER_ID=$(printf '%s' "$LIST_RESP" | jq -r \
|
|
78
93
|
--arg team "$TEAM_ID" \
|
|
79
94
|
--arg name "$TRIGGER_NAME" \
|
|
@@ -82,8 +97,8 @@ if [ -z "$TRIGGER_ID" ]; then
|
|
|
82
97
|
| .id) // empty' | head -1)
|
|
83
98
|
|
|
84
99
|
if [ -z "$TRIGGER_ID" ]; then
|
|
85
|
-
|
|
86
|
-
'{success:false, error:"No active trigger found with name", name:$n, teamId:$team}'
|
|
100
|
+
jq -n --arg n "$TRIGGER_NAME" --arg team "$TEAM_ID" --arg e "$EXAMINED" \
|
|
101
|
+
'{success:false, error:"No active trigger found with name", name:$n, teamId:$team, examined:($e|tonumber)}'
|
|
87
102
|
exit 0
|
|
88
103
|
fi
|
|
89
104
|
fi
|
|
@@ -37,6 +37,79 @@ OUTPUT=$(bash "$SCRIPT_DIR/execute.sh" --help 2>&1) || true
|
|
|
37
37
|
assert_contains "Help lists --id" -- "--id" "$OUTPUT"
|
|
38
38
|
assert_contains "Help lists --name" -- "--name" "$OUTPUT"
|
|
39
39
|
|
|
40
|
+
assert_eq() {
|
|
41
|
+
local test_name="$1" expected="$2" actual="$3"
|
|
42
|
+
if [ "$expected" = "$actual" ]; then
|
|
43
|
+
PASS=$((PASS + 1))
|
|
44
|
+
echo " ✓ ${test_name}"
|
|
45
|
+
else
|
|
46
|
+
FAIL=$((FAIL + 1))
|
|
47
|
+
echo " ✗ ${test_name}"
|
|
48
|
+
echo " expected: ${expected}"
|
|
49
|
+
echo " got: ${actual}"
|
|
50
|
+
fi
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
echo ""
|
|
54
|
+
echo "--- Name lookup: a truncated list must not read as 'not found' ---"
|
|
55
|
+
|
|
56
|
+
# Real skill + real lib.sh, with api_call swapped for a double: GET /triggers
|
|
57
|
+
# returns $MOCK_RESPONSE, POST .../cancel is logged and acknowledged.
|
|
58
|
+
REAL_LIB="$(cd "$SCRIPT_DIR/../../../_common" && pwd)/lib.sh"
|
|
59
|
+
TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
|
|
60
|
+
mkdir -p "$TMP/skills/agent/core/cancel-followup" "$TMP/skills/agent/_common"
|
|
61
|
+
cp "$SCRIPT_DIR/execute.sh" "$TMP/skills/agent/core/cancel-followup/execute.sh"
|
|
62
|
+
cat > "$TMP/skills/agent/_common/lib.sh" <<'STUB_EOF'
|
|
63
|
+
source "$REAL_LIB"
|
|
64
|
+
resolve_team_id() { echo "team-a"; }
|
|
65
|
+
api_call() {
|
|
66
|
+
echo "$1 $2" >> "$API_LOG"
|
|
67
|
+
case "$1 $2" in
|
|
68
|
+
"GET /triggers") printf '%s' "$MOCK_RESPONSE" ;;
|
|
69
|
+
POST\ /triggers/*/cancel) printf '{"success":true,"data":{"status":"cancelled"}}' ;;
|
|
70
|
+
*) printf '{"success":true}' ;;
|
|
71
|
+
esac
|
|
72
|
+
}
|
|
73
|
+
STUB_EOF
|
|
74
|
+
|
|
75
|
+
run() {
|
|
76
|
+
local mock="$1"; shift
|
|
77
|
+
CODE=0
|
|
78
|
+
: > "$TMP/api.log"
|
|
79
|
+
OUTPUT=$(env -u CREWLY_SESSION_NAME REAL_LIB="$REAL_LIB" API_LOG="$TMP/api.log" MOCK_RESPONSE="$mock" \
|
|
80
|
+
bash "$TMP/skills/agent/core/cancel-followup/execute.sh" "$@" 2>/dev/null) || CODE=$?
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
ENVELOPE='{"truncated":true,"bytes":233481,"file":"'"$TMP"'/nonexistent.json","head":"{\"success\":true,\"data\":[{","hint":"pass --full or read the file"}'
|
|
84
|
+
ROWS='{"success":true,"data":[
|
|
85
|
+
{"id":"t-1","teamId":"team-a","name":"followup:abc","status":"active"},
|
|
86
|
+
{"id":"t-2","teamId":"team-b","name":"followup:zzz","status":"active"},
|
|
87
|
+
{"id":"t-3","teamId":"team-a","name":"followup:old","status":"cancelled"}]}'
|
|
88
|
+
|
|
89
|
+
run "$ENVELOPE" --name followup:abc
|
|
90
|
+
assert_eq "Envelope -> non-zero exit" "1" "$CODE"
|
|
91
|
+
assert_contains "Envelope -> success:false" '"success":false' "$(printf '%s' "$OUTPUT" | jq -c .)"
|
|
92
|
+
assert_contains "Envelope -> explicit error, not 'not found'" 'truncated envelope' "$OUTPUT"
|
|
93
|
+
assert_eq "Envelope -> nothing cancelled" "" "$(grep POST "$TMP/api.log" || true)"
|
|
94
|
+
|
|
95
|
+
run "$ROWS" --name followup:abc
|
|
96
|
+
assert_eq "Match -> exit 0" "0" "$CODE"
|
|
97
|
+
assert_eq "Match -> cancels the team's trigger by id" "POST /triggers/t-1/cancel" "$(grep POST "$TMP/api.log")"
|
|
98
|
+
assert_eq "Match -> success:true" "true" "$(printf '%s' "$OUTPUT" | jq -r '.success')"
|
|
99
|
+
|
|
100
|
+
run "$ROWS" --name followup:zzz
|
|
101
|
+
assert_eq "Other team's name -> not found (team-scoped), exit 0" "0" "$CODE"
|
|
102
|
+
assert_contains "Other team's name -> not-found message" 'No active trigger found' "$OUTPUT"
|
|
103
|
+
assert_eq "Not found -> reports how many rows were examined" "3" "$(printf '%s' "$OUTPUT" | jq -r '.examined')"
|
|
104
|
+
assert_eq "Not found -> nothing cancelled" "" "$(grep POST "$TMP/api.log" || true)"
|
|
105
|
+
|
|
106
|
+
run "$ROWS" --name followup:old
|
|
107
|
+
assert_contains "Cancelled trigger -> not found (only active are cancellable)" 'No active trigger found' "$OUTPUT"
|
|
108
|
+
|
|
109
|
+
run '{"success":true,"data":"nope"}' --name followup:abc
|
|
110
|
+
assert_eq "Non-array .data -> non-zero exit" "1" "$CODE"
|
|
111
|
+
assert_contains "Non-array .data -> error says why" 'not-an-array' "$OUTPUT"
|
|
112
|
+
|
|
40
113
|
echo ""
|
|
41
114
|
echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
|
|
42
115
|
[ $FAIL -eq 0 ]
|
|
@@ -101,7 +101,7 @@ fi
|
|
|
101
101
|
# WORK_ITEM_ID was read from the input up top alongside the other params,
|
|
102
102
|
# so the identifier is known before any of the legacy path handling runs.
|
|
103
103
|
if [ -z "$WORK_ITEM_ID" ]; then
|
|
104
|
-
POOL_RESP=$(
|
|
104
|
+
POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
|
|
105
105
|
WORK_ITEM_ID=$(echo "$POOL_RESP" | jq -r '.workItems[0].id // .data[0].id // empty' 2>/dev/null || true)
|
|
106
106
|
fi
|
|
107
107
|
|
|
@@ -67,7 +67,7 @@ BODY=$(jq -n \
|
|
|
67
67
|
# ---------------------------------------------------------------------------
|
|
68
68
|
# Call backend API
|
|
69
69
|
# ---------------------------------------------------------------------------
|
|
70
|
-
CREWLY_PORT="${CREWLY_PORT:-8787}"
|
|
70
|
+
CREWLY_PORT="${CREWLY_PORT:-${WEB_PORT:-8787}}"
|
|
71
71
|
API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
|
|
72
72
|
|
|
73
73
|
RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
@@ -52,6 +52,7 @@ Create a new task via the `/api/task-management/create` endpoint. This allows te
|
|
|
52
52
|
| `--owner` | `owner` | No | Responsible role: `orchestrator`, `team_lead`, `agent` (default), `system`. A role, not a session name — use `--session` for the session |
|
|
53
53
|
| `--description` / `-d` | `description` | No | Short summary of the task |
|
|
54
54
|
| `--brief` | `briefMarkdown` | No | Long-form brief in markdown. Inline text, or `@/path/to/file.md`. Max 16384 bytes |
|
|
55
|
+
| `--request-id` / `-R` | `requestId` | No | Ticket this work is for: the id (or `TKT-123`) from the `[TICKET:TKT-123 <id>]` line of the message you are acting on. Omit it and the task is still linked when your current turn has exactly one ticket |
|
|
55
56
|
|
|
56
57
|
### Always attach a brief
|
|
57
58
|
|
|
@@ -30,6 +30,8 @@ Options:
|
|
|
30
30
|
--description | -d Short summary of the task (optional)
|
|
31
31
|
--brief Long-form brief in markdown: inline text, or @/path/to/file.md
|
|
32
32
|
Should carry Goal + Expected Outcome + Eval Criteria. Max 16384 bytes.
|
|
33
|
+
--request-id | -R Ticket this task is for: the id (or TKT-123) from the
|
|
34
|
+
[TICKET:TKT-123 <id>] line of the message you are working on
|
|
33
35
|
--json | -j Raw JSON payload (same as legacy)
|
|
34
36
|
--help | -h Show this help
|
|
35
37
|
EOF_USAGE
|
|
@@ -45,6 +47,7 @@ OUTPUT_SCHEMA=""
|
|
|
45
47
|
OWNER=""
|
|
46
48
|
DESCRIPTION=""
|
|
47
49
|
BRIEF=""
|
|
50
|
+
REQUEST_ID=""
|
|
48
51
|
|
|
49
52
|
# Detect legacy JSON argument
|
|
50
53
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -90,6 +93,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
90
93
|
BRIEF="$2"
|
|
91
94
|
shift 2
|
|
92
95
|
;;
|
|
96
|
+
--request-id|-R)
|
|
97
|
+
REQUEST_ID="$2"
|
|
98
|
+
shift 2
|
|
99
|
+
;;
|
|
93
100
|
--json|-j)
|
|
94
101
|
INPUT_JSON="$2"
|
|
95
102
|
shift 2
|
|
@@ -133,6 +140,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
133
140
|
[ -z "$OWNER" ] && OWNER=$(printf '%s' "$INPUT" | jq -r '.owner // empty')
|
|
134
141
|
[ -z "$DESCRIPTION" ] && DESCRIPTION=$(printf '%s' "$INPUT" | jq -r '.description // empty')
|
|
135
142
|
[ -z "$BRIEF" ] && BRIEF=$(printf '%s' "$INPUT" | jq -r '.briefMarkdown // .brief // empty')
|
|
143
|
+
[ -z "$REQUEST_ID" ] && REQUEST_ID=$(printf '%s' "$INPUT" | jq -r '.requestId // empty')
|
|
136
144
|
fi
|
|
137
145
|
|
|
138
146
|
# Apply defaults
|
|
@@ -203,6 +211,7 @@ WORK_ITEM=$(jq -n \
|
|
|
203
211
|
--arg priority "$PRIORITY" \
|
|
204
212
|
--arg description "$DESCRIPTION" \
|
|
205
213
|
--arg briefMarkdown "$BRIEF" \
|
|
214
|
+
--arg requestId "$REQUEST_ID" \
|
|
206
215
|
'{
|
|
207
216
|
title: $title,
|
|
208
217
|
type: "delegate",
|
|
@@ -212,6 +221,7 @@ WORK_ITEM=$(jq -n \
|
|
|
212
221
|
}
|
|
213
222
|
+ (if $description != "" then {description: $description} else {} end)
|
|
214
223
|
+ (if $briefMarkdown != "" then {briefMarkdown: $briefMarkdown} else {} end)
|
|
224
|
+
+ (if $requestId != "" then {requestId: $requestId} else {} end)
|
|
215
225
|
| with_entries(select(.value != null))')
|
|
216
226
|
|
|
217
227
|
if [ -n "$OUTPUT_SCHEMA" ] && [ "$OUTPUT_SCHEMA" != "" ]; then
|
|
@@ -82,7 +82,7 @@ fi
|
|
|
82
82
|
# ---------------------------------------------------------------------------
|
|
83
83
|
# Call backend API
|
|
84
84
|
# ---------------------------------------------------------------------------
|
|
85
|
-
CREWLY_PORT="${CREWLY_PORT:-8787}"
|
|
85
|
+
CREWLY_PORT="${CREWLY_PORT:-${WEB_PORT:-8787}}"
|
|
86
86
|
API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
|
|
87
87
|
|
|
88
88
|
RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
@@ -56,7 +56,7 @@ TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
|
56
56
|
# --- Step 0: Resolve target WorkItem if not supplied ---
|
|
57
57
|
# Resolve order: explicit workItemId > the agent's currently-running claim.
|
|
58
58
|
if [ -z "$WORK_ITEM_ID" ]; then
|
|
59
|
-
POOL_RESP=$(
|
|
59
|
+
POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
|
|
60
60
|
WORK_ITEM_ID=$(echo "$POOL_RESP" | jq -r '.workItems[0].id // .data[0].id // empty' 2>/dev/null || true)
|
|
61
61
|
fi
|
|
62
62
|
|
|
@@ -37,7 +37,7 @@ bash execute.sh --name-prefix watch:
|
|
|
37
37
|
|
|
38
38
|
## What you see
|
|
39
39
|
|
|
40
|
-
Returns `{ success, count, data: [Trigger, ...] }`. Each `Trigger` includes:
|
|
40
|
+
Returns `{ success, examined, count, data: [Trigger, ...] }` — `examined` is the number of triggers fetched before the team filter, `count` the number left after all filters. A truncated or malformed backend response exits 1 with `success:false` and an `error`; it is never reported as `count: 0`. Each `Trigger` includes:
|
|
41
41
|
- `id`, `name`, `status`
|
|
42
42
|
- `config` (cron expression / fireAt / event type)
|
|
43
43
|
- `action` (what it creates when it fires)
|