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
|
@@ -21,7 +21,10 @@ Options:
|
|
|
21
21
|
--json -j Raw JSON payload (legacy)
|
|
22
22
|
--help -h Show this help
|
|
23
23
|
|
|
24
|
-
Output: JSON object { success, count, data: [Trigger, ...] }
|
|
24
|
+
Output: JSON object { success, examined, count, data: [Trigger, ...] }
|
|
25
|
+
examined = triggers received from the backend BEFORE the team filter;
|
|
26
|
+
count = triggers left after the team/status/prefix filters.
|
|
27
|
+
A truncated or malformed response is an error (exit 1), never count 0.
|
|
25
28
|
EOF_USAGE
|
|
26
29
|
}
|
|
27
30
|
|
|
@@ -60,7 +63,25 @@ fi
|
|
|
60
63
|
TEAM_ID=$(resolve_team_id || true)
|
|
61
64
|
[ -z "$TEAM_ID" ] && { echo '{"error":"Cannot resolve owning team from CREWLY_SESSION_NAME"}' >&2; exit 1; }
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
# GET /triggers is the whole trigger table (335 rows / 233 KB on 2026-09-21),
|
|
67
|
+
# well over the skill-output cap. Plain api_call would hand back a
|
|
68
|
+
# {"truncated":true} envelope and `.data // []` would turn that into an empty
|
|
69
|
+
# list with success:true. api_call_full returns the real body or fails.
|
|
70
|
+
if ! LIST_RESP=$(api_call_full GET "/triggers" ""); then
|
|
71
|
+
jq -n '{success:false, examined:0, error:"GET /triggers failed or came back as a truncated envelope; refusing to report an empty follow-up list"}'
|
|
72
|
+
exit 1
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# A guard must report what it examined, not just its verdict. `.data` has to be
|
|
76
|
+
# an array; an envelope, an error object or anything else is an UNKNOWN result,
|
|
77
|
+
# not "no triggers" — refuse rather than print success with count 0.
|
|
78
|
+
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")
|
|
79
|
+
if ! [ "$EXAMINED" -ge 0 ] 2>/dev/null; then
|
|
80
|
+
jq -n --arg why "$EXAMINED" --arg head "${LIST_RESP:0:200}" \
|
|
81
|
+
'{success:false, examined:0, error:("GET /triggers returned a body whose .data is " + $why + "; refusing to report an empty follow-up list"), head:$head}'
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
|
|
64
85
|
FILTERED=$(printf '%s' "$LIST_RESP" | jq \
|
|
65
86
|
--arg team "$TEAM_ID" \
|
|
66
87
|
--arg status "$STATUS_FILTER" \
|
|
@@ -71,4 +92,5 @@ FILTERED=$(printf '%s' "$LIST_RESP" | jq \
|
|
|
71
92
|
| (if $prefix != "" then map(select(.name != null and (.name | startswith($prefix)))) else . end)')
|
|
72
93
|
|
|
73
94
|
COUNT=$(printf '%s' "$FILTERED" | jq 'length')
|
|
74
|
-
printf '%s' "$FILTERED" | jq --arg c "$COUNT"
|
|
95
|
+
printf '%s' "$FILTERED" | jq --arg c "$COUNT" --arg e "$EXAMINED" \
|
|
96
|
+
'{success:true, examined:($e|tonumber), count:($c|tonumber), data:.}'
|
|
@@ -36,6 +36,78 @@ echo "--- Team resolution ---"
|
|
|
36
36
|
OUTPUT=$(env -u CREWLY_SESSION_NAME bash "$SCRIPT_DIR/execute.sh" 2>&1) || true
|
|
37
37
|
assert_contains "No session → team-resolve error" "Cannot resolve owning team" "$OUTPUT"
|
|
38
38
|
|
|
39
|
+
assert_eq() {
|
|
40
|
+
local test_name="$1" expected="$2" actual="$3"
|
|
41
|
+
if [ "$expected" = "$actual" ]; then
|
|
42
|
+
PASS=$((PASS + 1))
|
|
43
|
+
echo " ✓ ${test_name}"
|
|
44
|
+
else
|
|
45
|
+
FAIL=$((FAIL + 1))
|
|
46
|
+
echo " ✗ ${test_name}"
|
|
47
|
+
echo " expected: ${expected}"
|
|
48
|
+
echo " got: ${actual}"
|
|
49
|
+
fi
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
echo ""
|
|
53
|
+
echo "--- Response shape: a guard must report what it examined ---"
|
|
54
|
+
|
|
55
|
+
# Run the real skill against a lib.sh double: the REAL library plus an
|
|
56
|
+
# api_call override, so the real api_call_full is what the skill exercises.
|
|
57
|
+
# The double returns whatever $MOCK_RESPONSE holds, for any request.
|
|
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/list-my-followups" "$TMP/skills/agent/_common"
|
|
61
|
+
cp "$SCRIPT_DIR/execute.sh" "$TMP/skills/agent/core/list-my-followups/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() { printf '%s' "$MOCK_RESPONSE"; }
|
|
66
|
+
STUB_EOF
|
|
67
|
+
|
|
68
|
+
# run <mock-response> [skill args...] -> sets CODE and OUTPUT (stdout only)
|
|
69
|
+
run() {
|
|
70
|
+
local mock="$1"; shift
|
|
71
|
+
CODE=0
|
|
72
|
+
OUTPUT=$(env -u CREWLY_SESSION_NAME REAL_LIB="$REAL_LIB" MOCK_RESPONSE="$mock" \
|
|
73
|
+
bash "$TMP/skills/agent/core/list-my-followups/execute.sh" "$@" 2>/dev/null) || CODE=$?
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
# What api_call hands back when GET /triggers is over the output cap (233 KB /
|
|
77
|
+
# 335 rows on 2026-09-21). The parked file deliberately does not exist.
|
|
78
|
+
ENVELOPE='{"truncated":true,"bytes":233481,"file":"'"$TMP"'/nonexistent.json","head":"{\"success\":true,\"data\":[{\"id\":\"4bc7","hint":"pass --full or read the file"}'
|
|
79
|
+
ROWS='{"success":true,"data":[
|
|
80
|
+
{"id":"t-1","teamId":"team-a","name":"followup:abc","status":"paused"},
|
|
81
|
+
{"id":"t-2","teamId":"team-b","name":"followup:abc","status":"active"},
|
|
82
|
+
{"id":"t-3","teamId":"team-b","name":"watch:x","status":"active"}]}'
|
|
83
|
+
|
|
84
|
+
run "$ENVELOPE"
|
|
85
|
+
assert_eq "Envelope -> non-zero exit" "1" "$CODE"
|
|
86
|
+
assert_contains "Envelope -> success:false" '"success":false' "$(printf '%s' "$OUTPUT" | jq -c .)"
|
|
87
|
+
assert_contains "Envelope -> explicit error field" 'truncated envelope' "$OUTPUT"
|
|
88
|
+
assert_eq "Envelope -> never count 0" "" "$(printf '%s' "$OUTPUT" | jq -r '.count // empty')"
|
|
89
|
+
|
|
90
|
+
run "$ROWS"
|
|
91
|
+
assert_eq "Rows -> exit 0" "0" "$CODE"
|
|
92
|
+
assert_eq "Rows -> examined counts every row before the team filter" "3" "$(printf '%s' "$OUTPUT" | jq -r '.examined')"
|
|
93
|
+
assert_eq "Rows -> count is the team's rows" "1" "$(printf '%s' "$OUTPUT" | jq -r '.count')"
|
|
94
|
+
assert_eq "Rows -> the team's trigger is returned" "t-1" "$(printf '%s' "$OUTPUT" | jq -r '.data[0].id')"
|
|
95
|
+
|
|
96
|
+
run "$ROWS" --status active
|
|
97
|
+
assert_eq "--status active with none active -> legitimate count 0" "0" "$(printf '%s' "$OUTPUT" | jq -r '.count')"
|
|
98
|
+
assert_eq "--status active -> examined still 3" "3" "$(printf '%s' "$OUTPUT" | jq -r '.examined')"
|
|
99
|
+
assert_eq "--status active -> success:true (this zero is real)" "true" "$(printf '%s' "$OUTPUT" | jq -r '.success')"
|
|
100
|
+
|
|
101
|
+
run "$ROWS" --name-prefix watch:
|
|
102
|
+
assert_eq "--name-prefix scoped to team -> count 0, examined 3" "0/3" "$(printf '%s' "$OUTPUT" | jq -r '"\(.count)/\(.examined)"')"
|
|
103
|
+
|
|
104
|
+
run '{"success":true,"data":{"oops":1}}'
|
|
105
|
+
assert_eq "Non-array .data -> non-zero exit" "1" "$CODE"
|
|
106
|
+
assert_contains "Non-array .data -> error says why" 'not-an-array' "$OUTPUT"
|
|
107
|
+
|
|
108
|
+
run '{"error":true,"status":500}'
|
|
109
|
+
assert_eq "Error object without .data -> non-zero exit" "1" "$CODE"
|
|
110
|
+
|
|
39
111
|
echo ""
|
|
40
112
|
echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
|
|
41
113
|
[ $FAIL -eq 0 ]
|
|
@@ -77,9 +77,9 @@ fi
|
|
|
77
77
|
|
|
78
78
|
QUERY_PARAMS="?types=${TYPES}&owner=agent"
|
|
79
79
|
|
|
80
|
-
AVAILABLE_RESPONSE=$(
|
|
80
|
+
AVAILABLE_RESPONSE=$(api_call_full GET "/task-pool${QUERY_PARAMS}" 2>&1) || {
|
|
81
81
|
# Also try without owner filter — some items may target specific agents
|
|
82
|
-
AVAILABLE_RESPONSE=$(
|
|
82
|
+
AVAILABLE_RESPONSE=$(api_call_full GET "/task-pool?types=${TYPES}&target=${SESSION_NAME}" 2>&1) || {
|
|
83
83
|
error_exit "Failed to query Task Pool: ${AVAILABLE_RESPONSE}"
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -93,7 +93,7 @@ AVAILABLE_COUNT=$(printf '%s' "$AVAILABLE_RESPONSE" | jq -r '.count // 0')
|
|
|
93
93
|
# picker filters owner=agent and would otherwise ignore these items).
|
|
94
94
|
TARGET_PINNED_ID=""
|
|
95
95
|
if [ "$AVAILABLE_COUNT" -eq 0 ]; then
|
|
96
|
-
TARGET_RESPONSE=$(
|
|
96
|
+
TARGET_RESPONSE=$(api_call_full GET "/task-pool?types=${TYPES}&target=${SESSION_NAME}" 2>&1) || TARGET_RESPONSE=""
|
|
97
97
|
TARGET_COUNT=$(printf '%s' "$TARGET_RESPONSE" | jq -r '.count // 0' 2>/dev/null || echo 0)
|
|
98
98
|
if [ "$TARGET_COUNT" -gt 0 ]; then
|
|
99
99
|
AVAILABLE_RESPONSE="$TARGET_RESPONSE"
|
|
@@ -106,7 +106,7 @@ An unknown name returns `404` with the names that were found.
|
|
|
106
106
|
- `CREWLY_SESSION_NAME` — your agent session id. Auto-set in agent sessions.
|
|
107
107
|
The skill attaches it as `X-Agent-Session` so the backend routes the
|
|
108
108
|
reply as `senderType:"agent"`.
|
|
109
|
-
- `CREWLY_API_URL` —
|
|
109
|
+
- `CREWLY_API_URL` — set by Crewly to the running instance (e.g. `http://localhost:8797` when started with `-p 8797`); falls back to `http://localhost:${WEB_PORT:-8787}`.
|
|
110
110
|
|
|
111
111
|
## Success / failure
|
|
112
112
|
|
|
@@ -30,7 +30,7 @@ require_param "current" "$CURRENT"
|
|
|
30
30
|
|
|
31
31
|
# Resolve target WI: explicit > running claim for this agent
|
|
32
32
|
if [ -z "$WORK_ITEM_ID" ]; then
|
|
33
|
-
POOL_RESP=$(
|
|
33
|
+
POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
|
|
34
34
|
WORK_ITEM_ID=$(echo "$POOL_RESP" | jq -r '.workItems[0].id // .data[0].id // empty' 2>/dev/null || true)
|
|
35
35
|
fi
|
|
36
36
|
|
|
@@ -259,7 +259,7 @@ if [ "$STATUS" = "done" ]; then
|
|
|
259
259
|
WI_RESOLUTION="explicit"
|
|
260
260
|
|
|
261
261
|
if [ -z "$TARGET_WI_ID" ]; then
|
|
262
|
-
POOL_RESP=$(
|
|
262
|
+
POOL_RESP=$(api_call_full GET "/task-pool/items?status=running&target=${SESSION_NAME}" 2>/dev/null || echo '{}')
|
|
263
263
|
RUNNING_IDS=$(printf '%s' "$POOL_RESP" | jq -r '((.workItems // .data // []) | map(.id)) | .[]' 2>/dev/null || true)
|
|
264
264
|
RUNNING_COUNT=$(printf '%s' "$RUNNING_IDS" | grep -c . || true)
|
|
265
265
|
|
|
@@ -117,7 +117,7 @@ two are told apart. Write ids exactly as Slack shows them.
|
|
|
117
117
|
|
|
118
118
|
- `CREWLY_SESSION_NAME` — your agent session, attached automatically. The post
|
|
119
119
|
is sent under that agent's identity, so this must be set.
|
|
120
|
-
- `CREWLY_API_URL` —
|
|
120
|
+
- `CREWLY_API_URL` — set by Crewly to the running instance (e.g. `http://localhost:8797` when started with `-p 8797`); falls back to `http://localhost:${WEB_PORT:-8787}`.
|
|
121
121
|
|
|
122
122
|
## Output
|
|
123
123
|
|
|
@@ -69,7 +69,7 @@ fi
|
|
|
69
69
|
# ---------------------------------------------------------------------------
|
|
70
70
|
# Call backend API
|
|
71
71
|
# ---------------------------------------------------------------------------
|
|
72
|
-
CREWLY_PORT="${CREWLY_PORT:-8787}"
|
|
72
|
+
CREWLY_PORT="${CREWLY_PORT:-${WEB_PORT:-8787}}"
|
|
73
73
|
API_URL="${CREWLY_API_URL:-http://localhost:${CREWLY_PORT}}"
|
|
74
74
|
|
|
75
75
|
RESPONSE=$(curl -s -w "\n%{http_code}" \
|
|
@@ -27,7 +27,7 @@ OUTPUT_DIR=$(printf '%s' "$INPUT" | jq -r '.outputDir // ""')
|
|
|
27
27
|
PROJECT_PATH=$(printf '%s' "$INPUT" | jq -r '.projectPath // ""')
|
|
28
28
|
|
|
29
29
|
# Crewly API base URL
|
|
30
|
-
API_BASE="${CREWLY_API_URL:-http://localhost
|
|
30
|
+
API_BASE="${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}"
|
|
31
31
|
|
|
32
32
|
# Local storage directory
|
|
33
33
|
LOCAL_DIR="${PROJECT_PATH:-.}/.crewly/onboarding"
|
|
@@ -28,7 +28,7 @@ TEAM_ID=$(printf '%s' "$INPUT" | jq -r '.teamId // ""')
|
|
|
28
28
|
PROJECT_PATH=$(printf '%s' "$INPUT" | jq -r '.projectPath // ""')
|
|
29
29
|
|
|
30
30
|
# Crewly API base URL
|
|
31
|
-
API_BASE="${CREWLY_API_URL:-http://localhost
|
|
31
|
+
API_BASE="${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}"
|
|
32
32
|
|
|
33
33
|
case "$ACTION" in
|
|
34
34
|
submit)
|
|
@@ -131,7 +131,7 @@ bash .../remote-browser/execute.sh '{"action":"navigate","url":"https://labs.goo
|
|
|
131
131
|
|
|
132
132
|
```bash
|
|
133
133
|
# Direct API call (bypasses execute.sh):
|
|
134
|
-
curl -s -X POST
|
|
134
|
+
curl -s -X POST "$CREWLY_API_URL/api/browser/set-file-input" \
|
|
135
135
|
-H "Content-Type: application/json" \
|
|
136
136
|
-d '{"selector":"input[type=file]","filePaths":["/tmp/image.png"]}'
|
|
137
137
|
|
|
@@ -42,6 +42,11 @@
|
|
|
42
42
|
# call (drops the X-Agent-Session header).
|
|
43
43
|
# --active Only meaningful with `bind-tab`: foreground
|
|
44
44
|
# the new tab on creation.
|
|
45
|
+
# --goal <text> What you're trying to accomplish. Sent as the
|
|
46
|
+
# X-Agent-Goal header so the user's Chrome takeover
|
|
47
|
+
# banner shows your objective (e.g. "Verify DMARC
|
|
48
|
+
# setup"), not just the current tool. Overrides any
|
|
49
|
+
# inherited CREWLY_AGENT_GOAL for this call.
|
|
45
50
|
#
|
|
46
51
|
# Supported actions and their parameters:
|
|
47
52
|
# status — connection status (no params)
|
|
@@ -86,6 +91,9 @@ EXTRA_PARAMS=""
|
|
|
86
91
|
TAB_ID="" # --tab-id <N>: explicit override
|
|
87
92
|
NO_BIND="false" # --no-bind: drop X-Agent-Session for this call
|
|
88
93
|
FOREGROUND="false" # --active: only meaningful with bind-tab
|
|
94
|
+
GOAL="" # --goal <text>: what the agent is trying to accomplish
|
|
95
|
+
# (shown in the Chrome takeover banner). Overrides any
|
|
96
|
+
# inherited CREWLY_AGENT_GOAL for this call.
|
|
89
97
|
|
|
90
98
|
# Detect legacy JSON argument
|
|
91
99
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -119,6 +127,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
119
127
|
CODE="$2"
|
|
120
128
|
shift 2
|
|
121
129
|
;;
|
|
130
|
+
--goal|-g)
|
|
131
|
+
GOAL="$2"
|
|
132
|
+
shift 2
|
|
133
|
+
;;
|
|
122
134
|
--params|-P)
|
|
123
135
|
EXTRA_PARAMS="$2"
|
|
124
136
|
shift 2
|
|
@@ -142,6 +154,11 @@ while [[ $# -gt 0 ]]; do
|
|
|
142
154
|
--help|-h)
|
|
143
155
|
echo "Usage: execute.sh --action navigate --url https://example.com"
|
|
144
156
|
echo " execute.sh '{\"action\":\"screenshot\"}'"
|
|
157
|
+
echo " execute.sh --action navigate --url https://x.com --goal 'Check pricing'"
|
|
158
|
+
echo ""
|
|
159
|
+
echo " --goal <text> What you're trying to accomplish; shown in the"
|
|
160
|
+
echo " user's Chrome takeover banner. Recommended on the"
|
|
161
|
+
echo " first action of a browser task."
|
|
145
162
|
echo ""
|
|
146
163
|
echo "Actions: status, navigate, screenshot, read-text, click, fill, type,"
|
|
147
164
|
echo " scroll, hover, press-key, get-element, wait-for-selector,"
|
|
@@ -184,6 +201,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
184
201
|
[ -z "$VALUE" ] && VALUE=$(printf '%s' "$INPUT" | jq -r '.value // empty')
|
|
185
202
|
[ -z "$TEXT" ] && TEXT=$(printf '%s' "$INPUT" | jq -r '.text // empty')
|
|
186
203
|
[ -z "$CODE" ] && CODE=$(printf '%s' "$INPUT" | jq -r '.code // empty')
|
|
204
|
+
[ -z "$GOAL" ] && GOAL=$(printf '%s' "$INPUT" | jq -r '.goal // empty')
|
|
187
205
|
# Per-tab dispatch fields surfaced in JSON input. CLI flags win over JSON
|
|
188
206
|
# (CLI is more explicit). Empty string = "not provided".
|
|
189
207
|
if [ -z "$TAB_ID" ]; then
|
|
@@ -200,7 +218,7 @@ if [ -n "$INPUT_JSON" ]; then
|
|
|
200
218
|
# Capture all extra fields from JSON input as pass-through params (strip
|
|
201
219
|
# per-tab fields too — they're handled by the dedicated branches below).
|
|
202
220
|
if [ -z "$EXTRA_PARAMS" ]; then
|
|
203
|
-
EXTRA_PARAMS=$(printf '%s' "$INPUT" | jq -c 'del(.action, .url, .selector, .value, .text, .code, .tabId, .noBind, .active) | if length == 0 then empty else . end' 2>/dev/null || true)
|
|
221
|
+
EXTRA_PARAMS=$(printf '%s' "$INPUT" | jq -c 'del(.action, .url, .selector, .value, .text, .code, .goal, .tabId, .noBind, .active) | if length == 0 then empty else . end' 2>/dev/null || true)
|
|
204
222
|
fi
|
|
205
223
|
fi
|
|
206
224
|
|
|
@@ -493,6 +511,15 @@ esac
|
|
|
493
511
|
# X-Agent-Session header for this single call (api_call reads it from the
|
|
494
512
|
# env). Using a subshell to scope the unset.
|
|
495
513
|
|
|
514
|
+
# An explicit --goal (or JSON `goal`) overrides any inherited CREWLY_AGENT_GOAL
|
|
515
|
+
# for this call. lib.sh::api_call reads CREWLY_AGENT_GOAL and forwards it as the
|
|
516
|
+
# X-Agent-Goal header, which the backend stamps onto the browser command so the
|
|
517
|
+
# Chrome takeover banner shows what the agent is doing. When --goal is absent we
|
|
518
|
+
# leave CREWLY_AGENT_GOAL untouched (auto path).
|
|
519
|
+
if [ -n "$GOAL" ]; then
|
|
520
|
+
export CREWLY_AGENT_GOAL="$GOAL"
|
|
521
|
+
fi
|
|
522
|
+
|
|
496
523
|
run_api_call() {
|
|
497
524
|
if [ "$METHOD" = "GET" ]; then
|
|
498
525
|
api_call GET "$ENDPOINT"
|
|
@@ -524,7 +551,12 @@ fi
|
|
|
524
551
|
# 404 with `tab_not_found` indicates our cached tabId is stale (Extension
|
|
525
552
|
# closed the tab while we weren't looking). Purge cache and retry the call
|
|
526
553
|
# WITHOUT a cached tabId so the backend auto-binds a fresh one.
|
|
554
|
+
#
|
|
555
|
+
# Only for a CACHED tabId. A tab the caller named with --tab-id must be
|
|
556
|
+
# honoured or the call fails: retrying elsewhere would quietly answer about a
|
|
557
|
+
# different tab than the one asked about.
|
|
527
558
|
if [ "$RESPONSE_EXIT" -ne 0 ] \
|
|
559
|
+
&& [ -z "$TAB_ID" ] \
|
|
528
560
|
&& [ -n "$STDERR_CAPTURE" ] \
|
|
529
561
|
&& printf '%s' "$STDERR_CAPTURE" | grep -q '"status":404' \
|
|
530
562
|
&& printf '%s' "$STDERR_CAPTURE" | grep -q 'tab_not_found' \
|
|
@@ -318,6 +318,26 @@ assert_contains "first request had stale tabId:100" "$first_body" '"tabId":100'
|
|
|
318
318
|
|| pass "cache purged on 404"
|
|
319
319
|
scenario_teardown
|
|
320
320
|
|
|
321
|
+
# Scenario 6b: an explicit --tab-id that 404s is NOT retried on another tab
|
|
322
|
+
scenario_init "scenario 6b: explicit --tab-id 404 fails without retry"
|
|
323
|
+
mkdir -p "${RUNTIME_DIR}/agent-6b"
|
|
324
|
+
echo "55" > "${RUNTIME_DIR}/agent-6b/browser-tab-id"
|
|
325
|
+
queue_response '404|{"id":"x","success":false,"error":"Tab 100 no longer exists. Bind a new tab instead of reusing this tabId.","code":"tab_not_found"}'
|
|
326
|
+
queue_response '{"success":true,"data":{"text":"some other tab"}}'
|
|
327
|
+
start_stub
|
|
328
|
+
export CREWLY_SESSION_NAME="agent-6b"
|
|
329
|
+
set +e
|
|
330
|
+
"$SKILL" --action read-text --tab-id 100 > /dev/null 2>&1
|
|
331
|
+
rc=$?
|
|
332
|
+
set -e
|
|
333
|
+
total_reqs=$(wc -l < "$LOG_FILE")
|
|
334
|
+
assert_eq "stub received exactly 1 request" "1" "$(printf '%s' "$total_reqs" | tr -d ' ')"
|
|
335
|
+
[ "$rc" -ne 0 ] && pass "explicit --tab-id 404 exits non-zero" || fail "explicit --tab-id 404 exits non-zero" "rc=$rc"
|
|
336
|
+
[ -f "${RUNTIME_DIR}/agent-6b/browser-tab-id" ] \
|
|
337
|
+
&& pass "cached tab left alone for an explicit --tab-id failure" \
|
|
338
|
+
|| fail "cached tab left alone" "cache was purged"
|
|
339
|
+
scenario_teardown
|
|
340
|
+
|
|
321
341
|
# Scenario 7: bind-tab with --active sends active:true
|
|
322
342
|
scenario_init "scenario 7: bind-tab --active forwards foreground flag"
|
|
323
343
|
queue_response '{"success":true,"data":{"tabId":7}}'
|
|
@@ -468,6 +488,48 @@ total_reqs=$(wc -l < "$LOG_FILE" | tr -d ' ')
|
|
|
468
488
|
assert_eq "stub received 0 requests" "0" "$total_reqs"
|
|
469
489
|
scenario_teardown
|
|
470
490
|
|
|
491
|
+
# The goal header is sent as b64:<base64 of UTF-8>; decode it for comparison.
|
|
492
|
+
decode_goal() {
|
|
493
|
+
case "$1" in
|
|
494
|
+
b64:*) printf '%s' "${1#b64:}" | base64 --decode 2>/dev/null || printf '%s' "${1#b64:}" | base64 -D ;;
|
|
495
|
+
*) printf 'NOT-B64:%s' "$1" ;;
|
|
496
|
+
esac
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
# Scenario 20: --goal forwards the X-Agent-Goal header (takeover banner)
|
|
500
|
+
scenario_init "scenario 20: --goal forwards X-Agent-Goal"
|
|
501
|
+
queue_response '{"success":true,"data":{}}'
|
|
502
|
+
start_stub
|
|
503
|
+
unset CREWLY_SESSION_NAME
|
|
504
|
+
unset CREWLY_AGENT_GOAL 2>/dev/null || true
|
|
505
|
+
"$SKILL" --action navigate --url https://x.com --goal "Verify DMARC setup" > /dev/null 2>&1 || true
|
|
506
|
+
assert_eq "X-Agent-Goal from --goal" "Verify DMARC setup" "$(decode_goal "$(request_field 0 headers.X-Agent-Goal)")"
|
|
507
|
+
scenario_teardown
|
|
508
|
+
|
|
509
|
+
# Scenario 21: CREWLY_AGENT_GOAL env auto-forwards; --goal overrides it
|
|
510
|
+
scenario_init "scenario 21: CREWLY_AGENT_GOAL auto-forwards + --goal override"
|
|
511
|
+
queue_response '{"success":true,"data":{}}'
|
|
512
|
+
queue_response '{"success":true,"data":{}}'
|
|
513
|
+
start_stub
|
|
514
|
+
unset CREWLY_SESSION_NAME
|
|
515
|
+
export CREWLY_AGENT_GOAL="Goal from env"
|
|
516
|
+
"$SKILL" --action navigate --url https://x.com > /dev/null 2>&1 || true
|
|
517
|
+
assert_eq "auto X-Agent-Goal from env" "Goal from env" "$(decode_goal "$(request_field 0 headers.X-Agent-Goal)")"
|
|
518
|
+
"$SKILL" --action navigate --url https://y.com --goal "Override goal" > /dev/null 2>&1 || true
|
|
519
|
+
assert_eq "--goal overrides env" "Override goal" "$(decode_goal "$(request_field 1 headers.X-Agent-Goal)")"
|
|
520
|
+
unset CREWLY_AGENT_GOAL
|
|
521
|
+
scenario_teardown
|
|
522
|
+
|
|
523
|
+
# Scenario 22: a non-ASCII goal survives the header (base64-encoded)
|
|
524
|
+
scenario_init "scenario 22: non-ASCII --goal round-trips"
|
|
525
|
+
queue_response '{"success":true,"data":{}}'
|
|
526
|
+
start_stub
|
|
527
|
+
unset CREWLY_SESSION_NAME
|
|
528
|
+
unset CREWLY_AGENT_GOAL 2>/dev/null || true
|
|
529
|
+
"$SKILL" --action navigate --url https://x.com --goal "核对 DMARC 设置" > /dev/null 2>&1 || true
|
|
530
|
+
assert_eq "non-ASCII goal decoded" "核对 DMARC 设置" "$(decode_goal "$(request_field 0 headers.X-Agent-Goal)")"
|
|
531
|
+
scenario_teardown
|
|
532
|
+
|
|
471
533
|
# ---------------------------------------------------------------------------
|
|
472
534
|
# Summary
|
|
473
535
|
# ---------------------------------------------------------------------------
|
|
@@ -50,7 +50,7 @@ fi
|
|
|
50
50
|
# ── API key resolution ─────────────────────────────────────────────────────────
|
|
51
51
|
if [ -z "${GEMINI_API_KEY:-}" ]; then
|
|
52
52
|
# Try loading from settings via Crewly API
|
|
53
|
-
GEMINI_API_KEY=$(curl -sf "http://localhost
|
|
53
|
+
GEMINI_API_KEY=$(curl -sf "${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}/api/settings" 2>/dev/null | jq -r '.data.apiKeys.global.gemini // empty' 2>/dev/null || true)
|
|
54
54
|
fi
|
|
55
55
|
|
|
56
56
|
if [ -z "${GEMINI_API_KEY:-}" ]; then
|
|
@@ -99,7 +99,7 @@ downstream consumers have a stable shape).
|
|
|
99
99
|
- If the binary or model is missing, the skill falls back to OpenAI (or reports a clear hint when `engine:"local"` is forced).
|
|
100
100
|
- **OpenAI engine** — needs an OpenAI API key. Resolution order:
|
|
101
101
|
1. `OPENAI_API_KEY` environment variable (injected by Crewly secrets).
|
|
102
|
-
2. Crewly Settings → API Keys (`GET
|
|
102
|
+
2. Crewly Settings → API Keys (`GET $CREWLY_API_URL/api/settings` → `data.apiKeys.global.openai`).
|
|
103
103
|
No key is ever hard-coded.
|
|
104
104
|
|
|
105
105
|
## Notes
|
|
@@ -24,7 +24,7 @@ FLOPOST_WHISPER_DIR="${HOME}/.flopost/whisper"
|
|
|
24
24
|
WHISPER_CACHE_DIR="${HOME}/.cache/whisper-models"
|
|
25
25
|
OPENAI_TRANSCRIBE_URL="https://api.openai.com/v1/audio/transcriptions"
|
|
26
26
|
OPENAI_MODEL="whisper-1"
|
|
27
|
-
SETTINGS_URL="http://localhost
|
|
27
|
+
SETTINGS_URL="${CREWLY_API_URL:-http://localhost:${WEB_PORT:-8787}}/api/settings"
|
|
28
28
|
|
|
29
29
|
err_json() { printf '{"success":false,"error":%s}\n' "$(printf '%s' "$1" | jq -Rsa .)"; exit 1; }
|
|
30
30
|
|
|
@@ -81,7 +81,7 @@ downstream consumers have a stable shape).
|
|
|
81
81
|
- If the binary or model is missing, the skill falls back to OpenAI (or reports a clear hint when `engine:"local"` is forced).
|
|
82
82
|
- **OpenAI engine** — needs an OpenAI API key. Resolution order:
|
|
83
83
|
1. `OPENAI_API_KEY` environment variable (injected by Crewly secrets).
|
|
84
|
-
2. Crewly Settings → API Keys (`GET
|
|
84
|
+
2. Crewly Settings → API Keys (`GET $CREWLY_API_URL/api/settings` → `data.apiKeys.global.openai`).
|
|
85
85
|
No key is ever hard-coded.
|
|
86
86
|
|
|
87
87
|
## Notes
|
|
@@ -46,7 +46,7 @@ The script auto-resolves `config/skills/...` references to absolute paths so del
|
|
|
46
46
|
| `--team` / `-g` | `teamId` | No | Team ID for cross-team validation |
|
|
47
47
|
| `--task-type` | `taskType` | No | Task type: `general`, `technical` (default: `general`) |
|
|
48
48
|
| `--force-cross-team` | `forceCrossTeam` | No | Allow cross-team delegation |
|
|
49
|
-
| `--request-id` / `-R` | `requestId` | No |
|
|
49
|
+
| `--request-id` / `-R` | `requestId` | No | Ticket (Request) this work is for — the id or `TKT-123` from the `[TICKET:TKT-123 <id>]` line of the message you are acting on. Links the WorkItem into `Request.workItemIds[]`. Omit it and the WorkItem is still linked when your current turn has exactly one ticket |
|
|
50
50
|
| `--fallback-minutes` | — | No | Minutes until the ONE §3.0 fallback check fires for this delegation (default `120` ≈ 2× a TL milestone ETA). `0` disables it. Not cancelled on completion — keep it at 2× ETA, never a poll interval |
|
|
51
51
|
|
|
52
52
|
## Usage — CLI Flags (preferred)
|
|
@@ -50,4 +50,10 @@ The whole pool can be several MB.
|
|
|
50
50
|
|
|
51
51
|
## Output
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
`{ success, stats, examined, matched, shown, workItems, hint }`.
|
|
54
|
+
|
|
55
|
+
- `stats` — the pool's `/task-pool/stats` aggregate (totals by type/status).
|
|
56
|
+
- `examined` — number of pool rows fetched before filtering (the whole pool).
|
|
57
|
+
- `matched` / `shown` — rows that passed the filters, and how many of them are listed (`limit`).
|
|
58
|
+
- `workItems` — the compact items described above.
|
|
59
|
+
- If the item list could not be fetched or was not a list, the skill prints `success:false` with an `error` and exits 1 — an unknown list is never reported as an empty one.
|
|
@@ -23,19 +23,28 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
23
23
|
source "${SCRIPT_DIR}/../_common/lib.sh"
|
|
24
24
|
|
|
25
25
|
INPUT=$(read_json_input "${1:-}" 2>/dev/null || echo '{}')
|
|
26
|
+
# No argument and no stdin gives an empty string, not '{}'. Without this
|
|
27
|
+
# default LIMIT came out empty, `--argjson limit ""` failed, and a bare
|
|
28
|
+
# `get-tasks` reported "could not read the task pool".
|
|
29
|
+
[ -n "${INPUT//[[:space:]]/}" ] || INPUT='{}'
|
|
26
30
|
|
|
27
31
|
PROJECT_PATH=$(printf '%s' "$INPUT" | jq -r '.projectPath // empty')
|
|
28
32
|
STATUS=$(printf '%s' "$INPUT" | jq -r '.status // empty')
|
|
29
33
|
ALL=$(printf '%s' "$INPUT" | jq -r '.all // false')
|
|
30
|
-
LIMIT=$(printf '%s' "$INPUT" | jq -r '.limit // 50')
|
|
34
|
+
LIMIT=$(printf '%s' "$INPUT" | jq -r '(.limit // 50) | tonumber? // 50')
|
|
31
35
|
TARGET=$(printf '%s' "$INPUT" | jq -r '.target // empty')
|
|
32
36
|
|
|
33
37
|
STATS=$(api_call GET "/task-pool/stats" 2>/dev/null || echo '{"data":{}}')
|
|
34
38
|
|
|
35
|
-
# The item list goes through a pipe, never argv, however large the pool is
|
|
36
|
-
#
|
|
37
|
-
# truncation envelope
|
|
38
|
-
|
|
39
|
+
# The item list goes through a pipe, never argv, however large the pool is.
|
|
40
|
+
# api_call_full bypasses the skill output cap (or reads the parked body); it
|
|
41
|
+
# fails rather than hand back a truncation envelope that would read as "no
|
|
42
|
+
# work items". An unknown list is reported as success:false and exit 1.
|
|
43
|
+
if ! ITEMS=$(api_call_full GET "/task-pool/items" 2>/dev/null); then
|
|
44
|
+
ITEMS='{"data":null}'
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
OUT=$(printf '%s' "$ITEMS" \
|
|
39
48
|
| jq -c \
|
|
40
49
|
--argjson stats "$STATS" \
|
|
41
50
|
--arg projectPath "$PROJECT_PATH" \
|
|
@@ -45,26 +54,40 @@ CREWLY_SKILL_MAX_OUTPUT_BYTES=0 api_call GET "/task-pool/items" 2>/dev/null \
|
|
|
45
54
|
--argjson limit "$LIMIT" \
|
|
46
55
|
'
|
|
47
56
|
def finished: ["done","verified","cancelled","failed","rejected"];
|
|
48
|
-
(.data // .workItems
|
|
49
|
-
| ($
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
57
|
+
(.data // .workItems) as $raw
|
|
58
|
+
| if ($raw | type) != "array" then
|
|
59
|
+
{
|
|
60
|
+
success: false,
|
|
61
|
+
projectPath: (if $projectPath == "" then null else $projectPath end),
|
|
62
|
+
stats: ($stats.data // $stats),
|
|
63
|
+
examined: 0,
|
|
64
|
+
error: "GET /task-pool/items failed or did not return a list; workItems is UNKNOWN, not empty"
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
$raw as $items
|
|
68
|
+
| ($items
|
|
69
|
+
| map(select(
|
|
70
|
+
($status == "" or (.status as $s | ($status | split(",") | index($s)) != null))
|
|
71
|
+
and ($all == "true" or $status != "" or ((.status as $s | finished | index($s)) == null))
|
|
72
|
+
and ($target == "" or .target == $target)
|
|
73
|
+
))
|
|
74
|
+
| sort_by(.createdAt) | reverse) as $matched
|
|
75
|
+
| {
|
|
76
|
+
success: true,
|
|
77
|
+
projectPath: (if $projectPath == "" then null else $projectPath end),
|
|
78
|
+
stats: ($stats.data // $stats),
|
|
79
|
+
examined: ($items | length),
|
|
80
|
+
matched: ($matched | length),
|
|
81
|
+
shown: ([$matched | length, $limit] | min),
|
|
82
|
+
workItems: ($matched[:$limit] | map({
|
|
83
|
+
id, title, status, target,
|
|
84
|
+
createdAt,
|
|
85
|
+
blockedReason: (.blockedReason // null)
|
|
86
|
+
})),
|
|
87
|
+
hint: "Compact view: open items only, newest first. Finished ones: {\"all\":true}. One agent: {\"target\":\"<session>\"}."
|
|
88
|
+
}
|
|
89
|
+
end
|
|
90
|
+
') || OUT='{"success":false,"examined":0,"error":"could not read the task pool"}'
|
|
91
|
+
printf '%s\n' "$OUT"
|
|
92
|
+
# Exit non-zero when the item list is unknown, so callers cannot mistake it for empty.
|
|
93
|
+
printf '%s' "$OUT" | jq -e '.success' >/dev/null
|