crewly 1.20.105 → 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/todo-add/SKILL.md +64 -0
- package/config/skills/agent/core/todo-add/execute.sh +84 -0
- package/config/skills/agent/core/todo-add/execute.test.sh +76 -0
- package/config/skills/agent/core/todo-lists/SKILL.md +58 -0
- package/config/skills/agent/core/todo-lists/execute.sh +70 -0
- package/config/skills/agent/core/todo-lists/execute.test.sh +77 -0
- package/config/skills/agent/core/todo-tasks/SKILL.md +59 -0
- package/config/skills/agent/core/todo-tasks/execute.sh +78 -0
- package/config/skills/agent/core/todo-tasks/execute.test.sh +74 -0
- package/config/skills/agent/core/todo-update/SKILL.md +63 -0
- package/config/skills/agent/core/todo-update/execute.sh +115 -0
- package/config/skills/agent/core/todo-update/execute.test.sh +82 -0
- 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 +264 -2
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +255 -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/microsoft/microsoft-todo.controller.d.ts +51 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js +223 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +42 -0
- package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -0
- 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 +6 -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/connector/connector-access.service.d.ts +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/connector/connector-access.service.js +2 -2
- package/dist/backend/backend/src/services/connector/connector-access.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/microsoft/microsoft-todo.service.d.ts +250 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js +367 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-todo.service.js.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts +116 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js +220 -0
- package/dist/backend/backend/src/services/microsoft/microsoft-token.service.js.map +1 -0
- 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 +264 -2
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +255 -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-1fd45a2a.js → index-f7b99e81.js} +262 -262
- 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
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: To Do Add
|
|
3
|
+
description: Add a task to one of the owner's Microsoft To Do lists — title, optional due date, note and importance (via the Microsoft grant held by Crewly Cloud).
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: productivity
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
- team-leader
|
|
10
|
+
- developer
|
|
11
|
+
- operations
|
|
12
|
+
- ops
|
|
13
|
+
- sales
|
|
14
|
+
- support
|
|
15
|
+
- generalist
|
|
16
|
+
triggers:
|
|
17
|
+
- add to my to do list
|
|
18
|
+
- add a microsoft to do task
|
|
19
|
+
- remind me in to do
|
|
20
|
+
- create an outlook task
|
|
21
|
+
tags:
|
|
22
|
+
- microsoft
|
|
23
|
+
- todo
|
|
24
|
+
- tasks
|
|
25
|
+
execution:
|
|
26
|
+
type: script
|
|
27
|
+
script:
|
|
28
|
+
file: execute.sh
|
|
29
|
+
interpreter: bash
|
|
30
|
+
timeoutMs: 60000
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
# To Do Add
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
bash execute.sh --title "Buy milk" # default list ("Tasks")
|
|
37
|
+
bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 is in Drive"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
| Flag | Meaning |
|
|
41
|
+
|---|---|
|
|
42
|
+
| `--title` | Task title (required) |
|
|
43
|
+
| `--list` | List name (case-insensitive) or id; default list when omitted |
|
|
44
|
+
| `--due` | Due date `YYYY-MM-DD` |
|
|
45
|
+
| `--note` | Note shown under the task |
|
|
46
|
+
| `--importance` | `low` \| `normal` \| `high` |
|
|
47
|
+
|
|
48
|
+
## Output
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{"success":true,"list":"Work","task":{"id":"AAMk…","title":"Send deck to Ann","status":"notStarted","importance":"high","due":"2026-10-01","note":"v3 is in Drive"}}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
A list that does not exist is not created — make it with todo-lists
|
|
55
|
+
`--create` first.
|
|
56
|
+
|
|
57
|
+
## Failures
|
|
58
|
+
|
|
59
|
+
`{"success":false,"reason":"not_connected","hint":"<connect URL>"}` (exit 1)
|
|
60
|
+
when the owner has not connected Microsoft To Do (Connections → Microsoft To Do).
|
|
61
|
+
Other reasons: `not_found` (unknown list / task — the message lists the
|
|
62
|
+
available lists), `forbidden` (the account has no Exchange Online mailbox, or
|
|
63
|
+
the organisation blocks the app), `rate_limited` (with `retryAfter` seconds),
|
|
64
|
+
`validation`, `connector_forbidden` (the owner has not allowed your role).
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# todo-add — Add a task to a Microsoft To Do list
|
|
4
|
+
#
|
|
5
|
+
# Backed by POST /api/microsoft-todo/tasks.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# bash execute.sh --title "Buy milk" # default list
|
|
9
|
+
# bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
|
|
10
|
+
# bash execute.sh '{"list":"Groceries","title":"Eggs"}'
|
|
11
|
+
# =============================================================================
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
15
|
+
|
|
16
|
+
print_usage() {
|
|
17
|
+
cat <<'EOF_USAGE'
|
|
18
|
+
Usage:
|
|
19
|
+
bash execute.sh --title "Buy milk" # default list
|
|
20
|
+
bash execute.sh --list Work --title "Send deck to Ann" --due 2026-10-01 --importance high --note "v3 in Drive"
|
|
21
|
+
bash execute.sh '{"list":"Groceries","title":"Eggs"}'
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--title, -t Task title (required)
|
|
25
|
+
--list, -l List name (case-insensitive) or id; default: the owner's default list
|
|
26
|
+
--due Due date, YYYY-MM-DD
|
|
27
|
+
--note Note text shown under the task
|
|
28
|
+
--importance low | normal | high
|
|
29
|
+
--help | -h Show this help
|
|
30
|
+
EOF_USAGE
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fail_from() {
|
|
34
|
+
printf '%s' "$1" | jq -c '{success: false, reason: (.details.error // .details // .error // "unknown"), hint: (.details.hint // ""), message: (.details.message // "")} + (if (.details | type) == "object" and .details.retryAfter then {retryAfter: .details.retryAfter} else {} end)' 2>/dev/null \
|
|
35
|
+
|| jq -n --arg r "$1" '{success: false, reason: $r}'
|
|
36
|
+
exit 1
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
uri() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
40
|
+
|
|
41
|
+
# api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
|
|
42
|
+
# the backend answer is always the last line. On failure print the mapped
|
|
43
|
+
# failure JSON (fail_from) and return 1.
|
|
44
|
+
call() {
|
|
45
|
+
local out
|
|
46
|
+
out=$(api_call "$@" 2>&1) || { fail_from "$(printf '%s\n' "$out" | tail -n 1)"; }
|
|
47
|
+
printf '%s\n' "$out" | tail -n 1
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
INPUT_JSON=""
|
|
51
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
52
|
+
INPUT_JSON="$1"
|
|
53
|
+
shift || true
|
|
54
|
+
fi
|
|
55
|
+
TITLE=""; LIST=""; DUE=""; NOTE=""; IMPORTANCE=""
|
|
56
|
+
while [[ $# -gt 0 ]]; do
|
|
57
|
+
case "$1" in
|
|
58
|
+
--title|-t) [ $# -ge 2 ] || error_exit "--title requires a value"; TITLE="$2"; shift 2 ;;
|
|
59
|
+
--list|-l) [ $# -ge 2 ] || error_exit "--list requires a value"; LIST="$2"; shift 2 ;;
|
|
60
|
+
--due) [ $# -ge 2 ] || error_exit "--due requires a value"; DUE="$2"; shift 2 ;;
|
|
61
|
+
--note) [ $# -ge 2 ] || error_exit "--note requires a value"; NOTE="$2"; shift 2 ;;
|
|
62
|
+
--importance) [ $# -ge 2 ] || error_exit "--importance requires a value"; IMPORTANCE="$2"; shift 2 ;;
|
|
63
|
+
--help|-h) print_usage; exit 0 ;;
|
|
64
|
+
*) error_exit "Unknown option: $1" ;;
|
|
65
|
+
esac
|
|
66
|
+
done
|
|
67
|
+
if [ -n "$INPUT_JSON" ]; then
|
|
68
|
+
INPUT=$(read_json_input "$INPUT_JSON")
|
|
69
|
+
[ -z "$TITLE" ] && TITLE=$(printf '%s' "$INPUT" | jq -r '.title // empty')
|
|
70
|
+
[ -z "$LIST" ] && LIST=$(printf '%s' "$INPUT" | jq -r '.list // empty')
|
|
71
|
+
[ -z "$DUE" ] && DUE=$(printf '%s' "$INPUT" | jq -r '.due // empty')
|
|
72
|
+
[ -z "$NOTE" ] && NOTE=$(printf '%s' "$INPUT" | jq -r '.note // empty')
|
|
73
|
+
[ -z "$IMPORTANCE" ] && IMPORTANCE=$(printf '%s' "$INPUT" | jq -r '.importance // empty')
|
|
74
|
+
fi
|
|
75
|
+
[ -n "$TITLE" ] || error_exit "--title is required"
|
|
76
|
+
if [ -n "$DUE" ] && ! [[ "$DUE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then error_exit "--due must look like 2026-10-01"; fi
|
|
77
|
+
BODY=$(jq -cn --arg title "$TITLE" --arg list "$LIST" --arg due "$DUE" --arg note "$NOTE" --arg imp "$IMPORTANCE" \
|
|
78
|
+
'{title: $title}
|
|
79
|
+
+ (if $list != "" then {list: $list} else {} end)
|
|
80
|
+
+ (if $due != "" then {due: $due} else {} end)
|
|
81
|
+
+ (if $note != "" then {note: $note} else {} end)
|
|
82
|
+
+ (if $imp != "" then {importance: $imp} else {} end)')
|
|
83
|
+
RESPONSE=$(call POST "/microsoft-todo/tasks" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
|
|
84
|
+
printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data.list.name, task: .data.task}'
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for todo-add — run with: bash execute.test.sh
|
|
3
|
+
# Python HTTP stub as the backend; asserts the request the skill sends and
|
|
4
|
+
# the JSON it prints. Exit 0 on pass.
|
|
5
|
+
set -u
|
|
6
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
EXEC="$HERE/execute.sh"
|
|
8
|
+
PASS=0; FAIL=0
|
|
9
|
+
check() {
|
|
10
|
+
local name="$1"; local got="$2"; local want="$3"
|
|
11
|
+
if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
PORT=18832
|
|
15
|
+
STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
|
|
16
|
+
python3 -u <<'PY' >/dev/null 2>&1 &
|
|
17
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
18
|
+
import json, os
|
|
19
|
+
LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
|
|
20
|
+
LIST = {'id': 'L1', 'name': 'Groceries'}
|
|
21
|
+
class H(BaseHTTPRequestHandler):
|
|
22
|
+
def _reply(self, method, data=None):
|
|
23
|
+
open(LOG, 'w').write(json.dumps({'method': method, 'path': self.path, 'body': data}))
|
|
24
|
+
if 'no-grant' in self.path or 'no-grant' in json.dumps(data or {}):
|
|
25
|
+
self.send_response(409); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
26
|
+
self.wfile.write(json.dumps({'success': False, 'error': 'not_connected', 'message': 'no grant', 'hint': 'https://cloud/start?token=j'}).encode()); return
|
|
27
|
+
path = self.path.split('?')[0]
|
|
28
|
+
if path == '/api/microsoft-todo/lists' and method == 'GET':
|
|
29
|
+
out = {'count': 2, 'lists': [{'id': 'L0', 'name': 'Tasks', 'isDefault': True}, LIST]}
|
|
30
|
+
elif path == '/api/microsoft-todo/lists':
|
|
31
|
+
out = {'id': 'L9', 'name': (data or {}).get('name')}
|
|
32
|
+
elif path == '/api/microsoft-todo/tasks' and method == 'GET':
|
|
33
|
+
out = {'list': LIST, 'count': 1, 'tasks': [{'id': 'T1', 'title': 'Milk', 'status': 'notStarted', 'due': '2026-10-01'}]}
|
|
34
|
+
elif path == '/api/microsoft-todo/tasks':
|
|
35
|
+
out = {'list': LIST, 'task': {'id': 'T2', 'title': (data or {}).get('title'), 'status': 'notStarted'}}
|
|
36
|
+
elif method == 'PATCH':
|
|
37
|
+
out = {'list': LIST, 'task': {'id': path.rsplit('/', 1)[1], 'title': 'Milk', 'status': 'completed'}}
|
|
38
|
+
elif method == 'DELETE':
|
|
39
|
+
out = {'list': LIST, 'taskId': path.rsplit('/', 1)[1], 'deleted': True}
|
|
40
|
+
else:
|
|
41
|
+
out = {}
|
|
42
|
+
self.send_response(200); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
43
|
+
self.wfile.write(json.dumps({'success': True, 'data': out}).encode())
|
|
44
|
+
def _body(self):
|
|
45
|
+
n = int(self.headers.get('content-length', '0')); body = self.rfile.read(n).decode() if n else ''
|
|
46
|
+
return json.loads(body or '{}')
|
|
47
|
+
def do_GET(self): self._reply('GET')
|
|
48
|
+
def do_DELETE(self): self._reply('DELETE')
|
|
49
|
+
def do_POST(self): self._reply('POST', self._body())
|
|
50
|
+
def do_PATCH(self): self._reply('PATCH', self._body())
|
|
51
|
+
def log_message(self, *a, **k): pass
|
|
52
|
+
HTTPServer(('127.0.0.1', PORT), H).serve_forever()
|
|
53
|
+
PY
|
|
54
|
+
STUB_PID=$!
|
|
55
|
+
disown "$STUB_PID" 2>/dev/null || true
|
|
56
|
+
trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
|
|
57
|
+
for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
|
|
58
|
+
|
|
59
|
+
run() { CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>/dev/null; }
|
|
60
|
+
run_err() { CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>&1 >/dev/null; }
|
|
61
|
+
last() { jq -c "$1" "$STUB_LOG"; }
|
|
62
|
+
|
|
63
|
+
OUT=$(run --list Work --title "Send deck" --due 2026-10-01 --importance high --note "v3 in Drive")
|
|
64
|
+
check "add: output" "$OUT" '{"success":true,"list":"Groceries","task":{"id":"T2","title":"Send deck","status":"notStarted"}}'
|
|
65
|
+
check "add: request" "$(last '[.method,.path,.body]')" '["POST","/api/microsoft-todo/tasks",{"title":"Send deck","list":"Work","due":"2026-10-01","note":"v3 in Drive","importance":"high"}]'
|
|
66
|
+
run --title "Buy milk" >/dev/null
|
|
67
|
+
check "add: default list omits list" "$(last '.body')" '{"title":"Buy milk"}'
|
|
68
|
+
run '{"list":"Groceries","title":"Eggs"}' >/dev/null
|
|
69
|
+
check "json input" "$(last '.body')" '{"title":"Eggs","list":"Groceries"}'
|
|
70
|
+
check "title required" "$(run_err --list Work | jq -r .error)" "--title is required"
|
|
71
|
+
check "bad due" "$(run_err --title x --due tomorrow | jq -r .error)" "--due must look like 2026-10-01"
|
|
72
|
+
OUT=$(run --title no-grant || true)
|
|
73
|
+
check "not connected" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
|
|
74
|
+
|
|
75
|
+
echo "todo-add: $PASS passed, $FAIL failed"
|
|
76
|
+
[ "$FAIL" -eq 0 ]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: To Do Lists
|
|
3
|
+
description: List the owner's Microsoft To Do task lists, or create a new list (via the Microsoft grant held by Crewly Cloud).
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: productivity
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- orchestrator
|
|
9
|
+
- team-leader
|
|
10
|
+
- developer
|
|
11
|
+
- operations
|
|
12
|
+
- ops
|
|
13
|
+
- sales
|
|
14
|
+
- support
|
|
15
|
+
- generalist
|
|
16
|
+
triggers:
|
|
17
|
+
- microsoft to do lists
|
|
18
|
+
- which to do lists
|
|
19
|
+
- create a to do list
|
|
20
|
+
- outlook tasks lists
|
|
21
|
+
tags:
|
|
22
|
+
- microsoft
|
|
23
|
+
- todo
|
|
24
|
+
- tasks
|
|
25
|
+
execution:
|
|
26
|
+
type: script
|
|
27
|
+
script:
|
|
28
|
+
file: execute.sh
|
|
29
|
+
interpreter: bash
|
|
30
|
+
timeoutMs: 60000
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
# To Do Lists
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
bash execute.sh
|
|
37
|
+
bash execute.sh --create "Trip to Lisbon"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{"count":2,"lists":[{"id":"AAMk…","name":"Tasks","isDefault":true},{"id":"AAMk…","name":"Groceries","isShared":true}]}
|
|
44
|
+
{"success":true,"list":{"id":"AAMk…","name":"Trip to Lisbon"}}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The other todo-* skills take a list **name** (case-insensitive) or id, so
|
|
48
|
+
you rarely need the id. `isDefault` marks the list that answers when no
|
|
49
|
+
list is named.
|
|
50
|
+
|
|
51
|
+
## Failures
|
|
52
|
+
|
|
53
|
+
`{"success":false,"reason":"not_connected","hint":"<connect URL>"}` (exit 1)
|
|
54
|
+
when the owner has not connected Microsoft To Do (Connections → Microsoft To Do).
|
|
55
|
+
Other reasons: `not_found` (unknown list / task — the message lists the
|
|
56
|
+
available lists), `forbidden` (the account has no Exchange Online mailbox, or
|
|
57
|
+
the organisation blocks the app), `rate_limited` (with `retryAfter` seconds),
|
|
58
|
+
`validation`, `connector_forbidden` (the owner has not allowed your role).
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# todo-lists — List the owner's Microsoft To Do lists, or create one
|
|
4
|
+
#
|
|
5
|
+
# Backed by GET / POST /api/microsoft-todo/lists.
|
|
6
|
+
#
|
|
7
|
+
# Usage:
|
|
8
|
+
# bash execute.sh
|
|
9
|
+
# bash execute.sh --create "Trip to Lisbon"
|
|
10
|
+
# bash execute.sh '{"create":"Trip to Lisbon"}'
|
|
11
|
+
# =============================================================================
|
|
12
|
+
set -euo pipefail
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
15
|
+
|
|
16
|
+
print_usage() {
|
|
17
|
+
cat <<'EOF_USAGE'
|
|
18
|
+
Usage:
|
|
19
|
+
bash execute.sh
|
|
20
|
+
bash execute.sh --create "Trip to Lisbon"
|
|
21
|
+
bash execute.sh '{"create":"Trip to Lisbon"}'
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--create Create a list with this name instead of listing
|
|
25
|
+
--help | -h Show this help
|
|
26
|
+
EOF_USAGE
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fail_from() {
|
|
30
|
+
printf '%s' "$1" | jq -c '{success: false, reason: (.details.error // .details // .error // "unknown"), hint: (.details.hint // ""), message: (.details.message // "")} + (if (.details | type) == "object" and .details.retryAfter then {retryAfter: .details.retryAfter} else {} end)' 2>/dev/null \
|
|
31
|
+
|| jq -n --arg r "$1" '{success: false, reason: $r}'
|
|
32
|
+
exit 1
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
uri() { jq -rn --arg v "$1" '$v|@uri'; }
|
|
36
|
+
|
|
37
|
+
# api_call may print a one-line warning to stderr (no CREWLY_SESSION_NAME);
|
|
38
|
+
# the backend answer is always the last line. On failure print the mapped
|
|
39
|
+
# failure JSON (fail_from) and return 1.
|
|
40
|
+
call() {
|
|
41
|
+
local out
|
|
42
|
+
out=$(api_call "$@" 2>&1) || { fail_from "$(printf '%s\n' "$out" | tail -n 1)"; }
|
|
43
|
+
printf '%s\n' "$out" | tail -n 1
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
INPUT_JSON=""
|
|
47
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
48
|
+
INPUT_JSON="$1"
|
|
49
|
+
shift || true
|
|
50
|
+
fi
|
|
51
|
+
CREATE=""
|
|
52
|
+
while [[ $# -gt 0 ]]; do
|
|
53
|
+
case "$1" in
|
|
54
|
+
--create) [ $# -ge 2 ] || error_exit "--create requires a value"; CREATE="$2"; shift 2 ;;
|
|
55
|
+
--help|-h) print_usage; exit 0 ;;
|
|
56
|
+
*) error_exit "Unknown option: $1" ;;
|
|
57
|
+
esac
|
|
58
|
+
done
|
|
59
|
+
if [ -n "$INPUT_JSON" ]; then
|
|
60
|
+
INPUT=$(read_json_input "$INPUT_JSON")
|
|
61
|
+
[ -z "$CREATE" ] && CREATE=$(printf '%s' "$INPUT" | jq -r '.create // .name // empty')
|
|
62
|
+
fi
|
|
63
|
+
if [ -n "$CREATE" ]; then
|
|
64
|
+
BODY=$(jq -cn --arg name "$CREATE" '{name: $name}')
|
|
65
|
+
RESPONSE=$(call POST "/microsoft-todo/lists" "$BODY") || { printf '%s\n' "$RESPONSE"; exit 1; }
|
|
66
|
+
printf '%s' "$RESPONSE" | jq -c '{success: true, list: .data}'
|
|
67
|
+
exit 0
|
|
68
|
+
fi
|
|
69
|
+
RESPONSE=$(call GET "/microsoft-todo/lists") || { printf '%s\n' "$RESPONSE"; exit 1; }
|
|
70
|
+
printf '%s' "$RESPONSE" | jq -c '{count: .data.count, lists: .data.lists}'
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Tests for todo-lists — run with: bash execute.test.sh
|
|
3
|
+
# Python HTTP stub as the backend; asserts the request the skill sends and
|
|
4
|
+
# the JSON it prints. Exit 0 on pass.
|
|
5
|
+
set -u
|
|
6
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
EXEC="$HERE/execute.sh"
|
|
8
|
+
PASS=0; FAIL=0
|
|
9
|
+
check() {
|
|
10
|
+
local name="$1"; local got="$2"; local want="$3"
|
|
11
|
+
if [ "$got" = "$want" ]; then PASS=$((PASS+1)); else FAIL=$((FAIL+1)); echo "FAIL: $name"; echo " want: $want"; echo " got: $got"; fi
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
PORT=18830
|
|
15
|
+
STUB_LOG="$(mktemp)"; export STUB_LOG; export STUB_PORT="$PORT"
|
|
16
|
+
python3 -u <<'PY' >/dev/null 2>&1 &
|
|
17
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
18
|
+
import json, os
|
|
19
|
+
LOG = os.environ['STUB_LOG']; PORT = int(os.environ['STUB_PORT'])
|
|
20
|
+
LIST = {'id': 'L1', 'name': 'Groceries'}
|
|
21
|
+
class H(BaseHTTPRequestHandler):
|
|
22
|
+
def _reply(self, method, data=None):
|
|
23
|
+
open(LOG, 'w').write(json.dumps({'method': method, 'path': self.path, 'body': data}))
|
|
24
|
+
if 'no-grant' in self.path or 'no-grant' in json.dumps(data or {}):
|
|
25
|
+
self.send_response(409); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
26
|
+
self.wfile.write(json.dumps({'success': False, 'error': 'not_connected', 'message': 'no grant', 'hint': 'https://cloud/start?token=j'}).encode()); return
|
|
27
|
+
path = self.path.split('?')[0]
|
|
28
|
+
if path == '/api/microsoft-todo/lists' and method == 'GET':
|
|
29
|
+
out = {'count': 2, 'lists': [{'id': 'L0', 'name': 'Tasks', 'isDefault': True}, LIST]}
|
|
30
|
+
elif path == '/api/microsoft-todo/lists':
|
|
31
|
+
out = {'id': 'L9', 'name': (data or {}).get('name')}
|
|
32
|
+
elif path == '/api/microsoft-todo/tasks' and method == 'GET':
|
|
33
|
+
out = {'list': LIST, 'count': 1, 'tasks': [{'id': 'T1', 'title': 'Milk', 'status': 'notStarted', 'due': '2026-10-01'}]}
|
|
34
|
+
elif path == '/api/microsoft-todo/tasks':
|
|
35
|
+
out = {'list': LIST, 'task': {'id': 'T2', 'title': (data or {}).get('title'), 'status': 'notStarted'}}
|
|
36
|
+
elif method == 'PATCH':
|
|
37
|
+
out = {'list': LIST, 'task': {'id': path.rsplit('/', 1)[1], 'title': 'Milk', 'status': 'completed'}}
|
|
38
|
+
elif method == 'DELETE':
|
|
39
|
+
out = {'list': LIST, 'taskId': path.rsplit('/', 1)[1], 'deleted': True}
|
|
40
|
+
else:
|
|
41
|
+
out = {}
|
|
42
|
+
self.send_response(200); self.send_header('Content-Type', 'application/json'); self.end_headers()
|
|
43
|
+
self.wfile.write(json.dumps({'success': True, 'data': out}).encode())
|
|
44
|
+
def _body(self):
|
|
45
|
+
n = int(self.headers.get('content-length', '0')); body = self.rfile.read(n).decode() if n else ''
|
|
46
|
+
return json.loads(body or '{}')
|
|
47
|
+
def do_GET(self): self._reply('GET')
|
|
48
|
+
def do_DELETE(self): self._reply('DELETE')
|
|
49
|
+
def do_POST(self): self._reply('POST', self._body())
|
|
50
|
+
def do_PATCH(self): self._reply('PATCH', self._body())
|
|
51
|
+
def log_message(self, *a, **k): pass
|
|
52
|
+
HTTPServer(('127.0.0.1', PORT), H).serve_forever()
|
|
53
|
+
PY
|
|
54
|
+
STUB_PID=$!
|
|
55
|
+
disown "$STUB_PID" 2>/dev/null || true
|
|
56
|
+
trap 'kill "$STUB_PID" >/dev/null 2>&1; rm -f "$STUB_LOG"' EXIT
|
|
57
|
+
for i in $(seq 1 30); do curl -s -o /dev/null -m 0.2 "http://127.0.0.1:${PORT}/" 2>/dev/null && break; sleep 0.1; done
|
|
58
|
+
|
|
59
|
+
run() { CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>/dev/null; }
|
|
60
|
+
run_err() { CREWLY_API_URL="http://127.0.0.1:${PORT}" bash "$EXEC" "$@" 2>&1 >/dev/null; }
|
|
61
|
+
last() { jq -c "$1" "$STUB_LOG"; }
|
|
62
|
+
|
|
63
|
+
OUT=$(run)
|
|
64
|
+
check "list: output" "$OUT" '{"count":2,"lists":[{"id":"L0","name":"Tasks","isDefault":true},{"id":"L1","name":"Groceries"}]}'
|
|
65
|
+
check "list: request" "$(last '[.method,.path]')" '["GET","/api/microsoft-todo/lists"]'
|
|
66
|
+
OUT=$(run --create "Trip to Lisbon")
|
|
67
|
+
check "create: output" "$OUT" '{"success":true,"list":{"id":"L9","name":"Trip to Lisbon"}}'
|
|
68
|
+
check "create: request" "$(last '[.method,.path,.body]')" '["POST","/api/microsoft-todo/lists",{"name":"Trip to Lisbon"}]'
|
|
69
|
+
run '{"create":"Holiday"}' >/dev/null
|
|
70
|
+
check "json create" "$(last '.body.name')" '"Holiday"'
|
|
71
|
+
OUT=$(run --create no-grant || true)
|
|
72
|
+
check "not connected: reason" "$(printf '%s' "$OUT" | jq -r .reason)" "not_connected"
|
|
73
|
+
check "not connected: hint" "$(printf '%s' "$OUT" | jq -r .hint)" "https://cloud/start?token=j"
|
|
74
|
+
check "unknown flag" "$(run_err --bogus | jq -r .error)" "Unknown option: --bogus"
|
|
75
|
+
|
|
76
|
+
echo "todo-lists: $PASS passed, $FAIL failed"
|
|
77
|
+
[ "$FAIL" -eq 0 ]
|