crewly 1.2.3 → 1.2.4
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/LICENSE +1 -1
- package/README.md +1 -1
- package/config/constants.ts +44 -1
- package/config/index.ts +4 -0
- package/config/roles/orchestrator/prompt.md +30 -2
- package/config/roles/team-leader/prompt.md +169 -0
- package/config/roles/team-leader/role.json +13 -0
- package/config/roles/team-leader/tl-addon.md +142 -0
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/_common/lib.sh +37 -0
- package/config/skills/agent/computer-use/execute.sh +228 -0
- package/config/skills/agent/computer-use/instructions.md +103 -0
- package/config/skills/agent/computer-use/lib/accessibility.sh +292 -0
- package/config/skills/agent/computer-use/lib/applescript.sh +117 -0
- package/config/skills/agent/computer-use/lib/discover.sh +122 -0
- package/config/skills/agent/computer-use/lib/playwright.sh +153 -0
- package/config/skills/agent/computer-use/lib/screenshot.sh +61 -0
- package/config/skills/agent/computer-use/skill.json +29 -0
- package/config/skills/agent/core/accept-task/execute.sh +7 -1
- package/config/skills/agent/core/complete-task/execute.sh +38 -1
- package/config/skills/agent/core/report-status/execute.sh +51 -2
- package/config/skills/agent/desktop-app-control/execute.sh +561 -0
- package/config/skills/agent/desktop-app-control/instructions.md +102 -0
- package/config/skills/agent/desktop-app-control/skill.json +33 -0
- package/config/skills/orchestrator/broadcast-to-org/execute.sh +88 -0
- package/config/skills/orchestrator/broadcast-to-org/instructions.md +51 -0
- package/config/skills/orchestrator/broadcast-to-org/skill.json +20 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +75 -10
- package/config/skills/orchestrator/delegate-task/instructions.md +11 -1
- package/config/skills/orchestrator/handle-agent-failure/execute.sh +45 -0
- package/config/skills/orchestrator/handle-agent-failure/instructions.md +29 -0
- package/config/skills/orchestrator/handle-agent-failure/skill.json +20 -0
- package/config/skills/orchestrator/restart-crewly/instructions.md +9 -2
- package/config/skills/team-leader/_common/lib.sh +4 -0
- package/config/skills/team-leader/aggregate-results/execute.sh +168 -0
- package/config/skills/team-leader/aggregate-results/instructions.md +89 -0
- package/config/skills/team-leader/aggregate-results/skill.json +20 -0
- package/config/skills/team-leader/decompose-goal/execute.sh +86 -0
- package/config/skills/team-leader/decompose-goal/instructions.md +84 -0
- package/config/skills/team-leader/decompose-goal/skill.json +20 -0
- package/config/skills/team-leader/delegate-task/execute.sh +142 -0
- package/config/skills/team-leader/delegate-task/instructions.md +55 -0
- package/config/skills/team-leader/delegate-task/skill.json +20 -0
- package/config/skills/team-leader/handle-failure/execute.sh +119 -0
- package/config/skills/team-leader/handle-failure/instructions.md +93 -0
- package/config/skills/team-leader/handle-failure/skill.json +20 -0
- package/config/skills/team-leader/schedule-check/execute.sh +65 -0
- package/config/skills/team-leader/schedule-check/execute.test.sh +247 -0
- package/config/skills/team-leader/schedule-check/instructions.md +49 -0
- package/config/skills/team-leader/schedule-check/skill.json +20 -0
- package/config/skills/team-leader/start-agent/execute.sh +39 -0
- package/config/skills/team-leader/start-agent/instructions.md +48 -0
- package/config/skills/team-leader/start-agent/skill.json +20 -0
- package/config/skills/team-leader/stop-agent/execute.sh +39 -0
- package/config/skills/team-leader/stop-agent/instructions.md +49 -0
- package/config/skills/team-leader/stop-agent/skill.json +20 -0
- package/config/skills/team-leader/verify-output/execute.sh +296 -0
- package/config/skills/team-leader/verify-output/instructions.md +122 -0
- package/config/skills/team-leader/verify-output/skill.json +20 -0
- package/config/templates/core-team/demo-script.md +41 -0
- package/config/templates/core-team/goals.md +20 -0
- package/config/templates/core-team/team.json +22 -0
- package/config/templates/dev-fullstack/template.json +115 -0
- package/config/templates/education-smb/README.md +27 -0
- package/config/templates/education-smb/goals.md +16 -0
- package/config/templates/education-smb/knowledge/docs/content-standards.md +24 -0
- package/config/templates/education-smb/knowledge/docs/education-industry-context.md +13 -0
- package/config/templates/education-smb/knowledge/index.json +24 -0
- package/config/templates/education-smb/learned-patterns.json +16 -0
- package/config/templates/education-smb/quality-gates.yaml +66 -0
- package/config/templates/education-smb/roles/analytics-specialist.md +6 -0
- package/config/templates/education-smb/roles/content-creator.md +6 -0
- package/config/templates/education-smb/roles/curriculum-designer.md +6 -0
- package/config/templates/education-smb/roles/engagement-manager.md +6 -0
- package/config/templates/education-smb/team.json +40 -0
- package/config/templates/education-smb/template.json +26 -0
- package/config/templates/education-smb/workflows/course-content-generation.yaml +44 -0
- package/config/templates/education-smb/workflows/reporting.yaml +31 -0
- package/config/templates/education-smb/workflows/student-communication.yaml +44 -0
- package/config/templates/education-smb/workflows.yaml +40 -0
- package/config/templates/insurance-smb/README.md +28 -0
- package/config/templates/insurance-smb/goals.md +21 -0
- package/config/templates/insurance-smb/knowledge/docs/compliance-checklist.md +28 -0
- package/config/templates/insurance-smb/knowledge/docs/insurance-industry-context.md +23 -0
- package/config/templates/insurance-smb/knowledge/index.json +24 -0
- package/config/templates/insurance-smb/learned-patterns.json +16 -0
- package/config/templates/insurance-smb/quality-gates.yaml +54 -0
- package/config/templates/insurance-smb/roles/claims-processor.md +6 -0
- package/config/templates/insurance-smb/roles/client-manager.md +6 -0
- package/config/templates/insurance-smb/roles/compliance-officer.md +6 -0
- package/config/templates/insurance-smb/roles/marketing-specialist.md +6 -0
- package/config/templates/insurance-smb/roles/policy-analyst.md +6 -0
- package/config/templates/insurance-smb/team.json +48 -0
- package/config/templates/insurance-smb/template.json +26 -0
- package/config/templates/insurance-smb/workflows/claims-processing.yaml +48 -0
- package/config/templates/insurance-smb/workflows.yaml +43 -0
- package/config/templates/research-analysis/template.json +88 -0
- package/config/templates/social-media-ops/template.json +85 -0
- package/config/templates/video-production/template.json +123 -0
- package/dist/backend/backend/src/constants.d.ts +303 -15
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +296 -15
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +69 -48
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts +81 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js +234 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js +38 -0
- package/dist/backend/backend/src/controllers/cloud/auth/auth.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts +69 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js +165 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js +32 -0
- package/dist/backend/backend/src/controllers/cloud/cloud-auth.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts +52 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +122 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +21 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +32 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts +42 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js +138 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js +34 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts +43 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js +9 -0
- package/dist/backend/backend/src/controllers/cloud/files/cloud-file.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/files/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts +47 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js +131 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js +30 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts +81 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js +85 -0
- package/dist/backend/backend/src/controllers/cloud/h5/h5-entry.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/h5/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts +14 -0
- package/dist/backend/backend/src/controllers/cloud/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/index.js +14 -0
- package/dist/backend/backend/src/controllers/cloud/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js +155 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js +32 -0
- package/dist/backend/backend/src/controllers/cloud/magic-moment/magic-moment.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +101 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js +343 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts +29 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js +44 -0
- package/dist/backend/backend/src/controllers/cloud/relay.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js +152 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js +34 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts +90 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js +48 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/cloud-task.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js +7 -0
- package/dist/backend/backend/src/controllers/cloud/tasks/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts +2 -0
- package/dist/backend/backend/src/controllers/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/index.js +3 -0
- package/dist/backend/backend/src/controllers/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts +12 -12
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js +1 -18
- package/dist/backend/backend/src/controllers/marketplace/marketplace.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js +3 -0
- package/dist/backend/backend/src/controllers/marketplace/marketplace.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts +111 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js +220 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts +33 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js +50 -0
- package/dist/backend/backend/src/controllers/marketplace/template-marketplace.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js +4 -1
- package/dist/backend/backend/src/controllers/messaging/messenger.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -2
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/payment/index.d.ts +7 -0
- package/dist/backend/backend/src/controllers/payment/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/index.js +7 -0
- package/dist/backend/backend/src/controllers/payment/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts +57 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.js +136 -0
- package/dist/backend/backend/src/controllers/payment/payment.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.js +38 -0
- package/dist/backend/backend/src/controllers/payment/payment.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts +109 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.js +54 -0
- package/dist/backend/backend/src/controllers/payment/payment.types.js.map +1 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts +34 -5
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts +14 -0
- package/dist/backend/backend/src/controllers/session/session.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.controller.js +48 -0
- package/dist/backend/backend/src/controllers/session/session.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/session/session.routes.js +3 -1
- package/dist/backend/backend/src/controllers/session/session.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js +4 -3
- package/dist/backend/backend/src/controllers/system/scheduler.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +13 -15
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/assignments.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +40 -4
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/tasks.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 +259 -13
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/template/index.d.ts +8 -0
- package/dist/backend/backend/src/controllers/template/index.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/index.js +8 -0
- package/dist/backend/backend/src/controllers/template/index.js.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts +63 -0
- package/dist/backend/backend/src/controllers/template/template.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js +112 -0
- package/dist/backend/backend/src/controllers/template/template.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/template/template.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/template/template.routes.js +33 -0
- package/dist/backend/backend/src/controllers/template/template.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +105 -13
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js +3 -3
- package/dist/backend/backend/src/middleware/agent-heartbeat.middleware.js.map +1 -1
- package/dist/backend/backend/src/models/Team.d.ts +5 -0
- package/dist/backend/backend/src/models/Team.d.ts.map +1 -1
- package/dist/backend/backend/src/models/Team.js +24 -0
- package/dist/backend/backend/src/models/Team.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 +21 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +1 -6
- 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 +211 -287
- 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 +7 -1
- 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 +11 -2
- package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +1 -0
- 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 +30 -43
- package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +496 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts +70 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.js +131 -0
- package/dist/backend/backend/src/services/agent/openhands-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts +21 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js +32 -1
- package/dist/backend/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +77 -3
- 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 +281 -30
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +49 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +124 -2
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.d.ts +10 -2
- package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat/chat.service.js +49 -8
- package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts +174 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.js +402 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts +110 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.js +54 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts +36 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.js +31 -0
- package/dist/backend/backend/src/services/cloud/auth/auth.utils.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts +47 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js +116 -0
- package/dist/backend/backend/src/services/cloud/auth/jwt-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts +61 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js +203 -0
- package/dist/backend/backend/src/services/cloud/auth/supabase-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts +46 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js +95 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.middleware.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts +136 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.js +204 -0
- package/dist/backend/backend/src/services/cloud/cloud-auth.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +179 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +237 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts +97 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.js +184 -0
- package/dist/backend/backend/src/services/cloud/cloud-file.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts +114 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js +196 -0
- package/dist/backend/backend/src/services/cloud/cloud-image-analysis.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts +118 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js +322 -0
- package/dist/backend/backend/src/services/cloud/cloud-task-processor.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts +115 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.js +265 -0
- package/dist/backend/backend/src/services/cloud/cloud-task.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts +175 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.js +392 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts +87 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.js +140 -0
- package/dist/backend/backend/src/services/cloud/relay-crypto.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts +183 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.js +523 -0
- package/dist/backend/backend/src/services/cloud/relay-server.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay.types.d.ts +170 -0
- package/dist/backend/backend/src/services/cloud/relay.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay.types.js +69 -0
- package/dist/backend/backend/src/services/cloud/relay.types.js.map +1 -0
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts +9 -1
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -1
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js +18 -4
- package/dist/backend/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -1
- package/dist/backend/backend/src/services/core/env.config.d.ts +147 -0
- package/dist/backend/backend/src/services/core/env.config.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/env.config.js +226 -0
- package/dist/backend/backend/src/services/core/env.config.js.map +1 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +5 -0
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +20 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +35 -0
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts +160 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js +261 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation.service.js.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts +161 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js +276 -0
- package/dist/backend/backend/src/services/hierarchy/hierarchy-reporting.service.js.map +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts +1 -0
- package/dist/backend/backend/src/services/marketplace/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/marketplace/index.js +2 -0
- package/dist/backend/backend/src/services/marketplace/index.js.map +1 -1
- package/dist/backend/backend/src/services/marketplace/marketplace.service.js +2 -2
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts +149 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js +500 -0
- package/dist/backend/backend/src/services/marketplace/template-marketplace.service.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.js +1 -1
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts +90 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js +233 -0
- package/dist/backend/backend/src/services/messaging/adapters/google-chat-messenger.adapter.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts +1 -1
- package/dist/backend/backend/src/services/messaging/messenger-adapter.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +3 -3
- package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js +29 -5
- package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts +69 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.js +158 -0
- package/dist/backend/backend/src/services/payment/magic-moment.service.js.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts +95 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.js +91 -0
- package/dist/backend/backend/src/services/payment/magic-moment.types.js.map +1 -0
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts +122 -0
- package/dist/backend/backend/src/services/payment/stripe.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/payment/stripe.service.js +403 -0
- package/dist/backend/backend/src/services/payment/stripe.service.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/index.d.ts +9 -0
- package/dist/backend/backend/src/services/plugin/index.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/index.js +8 -0
- package/dist/backend/backend/src/services/plugin/index.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.d.ts +102 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.js +179 -0
- package/dist/backend/backend/src/services/plugin/plugin.service.js.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.d.ts +88 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.js +17 -0
- package/dist/backend/backend/src/services/plugin/plugin.types.js.map +1 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +17 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +63 -0
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts +14 -0
- package/dist/backend/backend/src/services/session/session-command-helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/session/session-command-helper.js +54 -0
- package/dist/backend/backend/src/services/session/session-command-helper.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- 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 +15 -5
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts +153 -0
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/template/template.service.js +372 -0
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +51 -0
- package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/scheduler.service.js +118 -2
- package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
- package/dist/backend/backend/src/types/chat.types.d.ts +39 -1
- package/dist/backend/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/chat.types.js +45 -2
- package/dist/backend/backend/src/types/chat.types.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +14 -2
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js +15 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/hierarchy-message.types.d.ts +101 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.js +15 -0
- package/dist/backend/backend/src/types/hierarchy-message.types.js.map +1 -0
- package/dist/backend/backend/src/types/index.d.ts +54 -4
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/marketplace.types.d.ts +99 -0
- package/dist/backend/backend/src/types/marketplace.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +4 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts +79 -1
- package/dist/backend/backend/src/types/task-tracking.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/task-tracking.types.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +166 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/team-template.types.js +139 -0
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -0
- package/dist/backend/backend/src/utils/async-handler.d.ts +20 -0
- package/dist/backend/backend/src/utils/async-handler.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/async-handler.js +29 -0
- package/dist/backend/backend/src/utils/async-handler.js.map +1 -0
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts +4 -4
- package/dist/backend/backend/src/utils/defaultPrompts.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/defaultPrompts.js +16 -0
- package/dist/backend/backend/src/utils/defaultPrompts.js.map +1 -1
- package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.js +94 -0
- package/dist/backend/backend/src/utils/gemini-trusted-folders.js.map +1 -0
- package/dist/backend/backend/src/utils/message-serializer.d.ts +74 -0
- package/dist/backend/backend/src/utils/message-serializer.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/message-serializer.js +380 -0
- package/dist/backend/backend/src/utils/message-serializer.js.map +1 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +20 -11
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/config/constants.d.ts +40 -1
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +41 -1
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/backend/config/index.d.ts +2 -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 +303 -15
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +296 -15
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/models/Team.d.ts +5 -0
- package/dist/cli/backend/src/models/Team.d.ts.map +1 -1
- package/dist/cli/backend/src/models/Team.js +24 -0
- package/dist/cli/backend/src/models/Team.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +5 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-server.js +1 -1
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -1
- package/dist/cli/backend/src/types/chat.types.d.ts +39 -1
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/chat.types.js +45 -2
- package/dist/cli/backend/src/types/chat.types.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +54 -4
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +4 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts +43 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.js +94 -0
- package/dist/cli/backend/src/utils/gemini-trusted-folders.js.map +1 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +20 -11
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +2 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +21 -8
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/start.d.ts +1 -0
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +71 -23
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +1 -1
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +1 -1
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +1 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/project-scaffold.d.ts +109 -0
- package/dist/cli/cli/src/utils/project-scaffold.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/project-scaffold.js +346 -0
- package/dist/cli/cli/src/utils/project-scaffold.js.map +1 -0
- package/dist/cli/cli/src/utils/templates.d.ts +7 -2
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/templates.js +76 -7
- package/dist/cli/cli/src/utils/templates.js.map +1 -1
- package/dist/cli/config/constants.d.ts +40 -1
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +41 -1
- package/dist/cli/config/constants.js.map +1 -1
- package/dist/cli/config/index.d.ts +2 -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-510ab719.css +33 -0
- package/frontend/dist/assets/index-935cd846.js +4961 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +9 -4
- package/frontend/dist/assets/index-a23214ae.js +0 -4919
- package/frontend/dist/assets/index-c407fe13.css +0 -33
package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js
CHANGED
|
@@ -197,11 +197,18 @@ export class OrchestratorHeartbeatMonitorService {
|
|
|
197
197
|
}
|
|
198
198
|
const activityTracker = PtyActivityTrackerService.getInstance();
|
|
199
199
|
const idleTimeMs = activityTracker.getIdleTimeMs(ORCHESTRATOR_SESSION_NAME);
|
|
200
|
-
//
|
|
201
|
-
|
|
200
|
+
// Use API-specific idle time for heartbeat response detection.
|
|
201
|
+
// PTY activity alone is unreliable because heartbeat messages written
|
|
202
|
+
// to the PTY echo back and reset the general activity timer.
|
|
203
|
+
const apiIdleTimeMs = activityTracker.getApiIdleTimeMs(ORCHESTRATOR_SESSION_NAME);
|
|
204
|
+
// If recent API activity detected, clear any pending heartbeat request.
|
|
205
|
+
// Only API calls count as proof that the orchestrator is responsive —
|
|
206
|
+
// PTY output alone may just be echoed heartbeat messages.
|
|
207
|
+
if (apiIdleTimeMs < ORCHESTRATOR_HEARTBEAT_CONSTANTS.HEARTBEAT_REQUEST_THRESHOLD_MS) {
|
|
202
208
|
if (this.heartbeatRequestSentAt !== null) {
|
|
203
|
-
this.logger.info('Orchestrator responded to heartbeat request, clearing pending state');
|
|
209
|
+
this.logger.info('Orchestrator responded to heartbeat request (API activity detected), clearing pending state');
|
|
204
210
|
this.heartbeatRequestSentAt = null;
|
|
211
|
+
this.heartbeatRequestCount = 0;
|
|
205
212
|
}
|
|
206
213
|
// Track continuous in_progress duration. Spinner animation counts as
|
|
207
214
|
// "activity" so idleTime stays low, but the orchestrator may be stuck
|
|
@@ -230,14 +237,29 @@ export class OrchestratorHeartbeatMonitorService {
|
|
|
230
237
|
this.logger.warn('Orchestrator did not respond to heartbeat request, triggering auto-restart', {
|
|
231
238
|
timeSinceRequestMs: timeSinceRequest,
|
|
232
239
|
idleTimeMs,
|
|
240
|
+
apiIdleTimeMs,
|
|
233
241
|
heartbeatRequestCount: this.heartbeatRequestCount,
|
|
234
242
|
});
|
|
235
243
|
this.heartbeatRequestSentAt = null;
|
|
244
|
+
this.heartbeatRequestCount = 0;
|
|
236
245
|
await this.triggerAutoRestart();
|
|
237
246
|
}
|
|
238
247
|
return;
|
|
239
248
|
}
|
|
240
|
-
//
|
|
249
|
+
// Cap consecutive heartbeat requests to prevent spam when the
|
|
250
|
+
// orchestrator is stuck (e.g., ENOSPC). After MAX attempts without
|
|
251
|
+
// a real API response, trigger auto-restart instead.
|
|
252
|
+
const MAX_HEARTBEAT_REQUESTS = 3;
|
|
253
|
+
if (this.heartbeatRequestCount >= MAX_HEARTBEAT_REQUESTS) {
|
|
254
|
+
this.logger.warn('Max heartbeat requests reached without API response, triggering auto-restart', {
|
|
255
|
+
heartbeatRequestCount: this.heartbeatRequestCount,
|
|
256
|
+
apiIdleTimeMs,
|
|
257
|
+
});
|
|
258
|
+
this.heartbeatRequestCount = 0;
|
|
259
|
+
await this.triggerAutoRestart();
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// No API activity for HEARTBEAT_REQUEST_THRESHOLD_MS. If there's no queued
|
|
241
263
|
// work, skip synthetic heartbeat pings to avoid idle token burn.
|
|
242
264
|
const pendingWork = this.hasPendingWork ? this.hasPendingWork() : true;
|
|
243
265
|
if (!pendingWork) {
|
|
@@ -245,8 +267,10 @@ export class OrchestratorHeartbeatMonitorService {
|
|
|
245
267
|
return;
|
|
246
268
|
}
|
|
247
269
|
// Otherwise, send a heartbeat request.
|
|
248
|
-
this.logger.info('Orchestrator idle, sending heartbeat request', {
|
|
270
|
+
this.logger.info('Orchestrator idle (no API activity), sending heartbeat request', {
|
|
249
271
|
idleTimeMs,
|
|
272
|
+
apiIdleTimeMs,
|
|
273
|
+
heartbeatRequestCount: this.heartbeatRequestCount,
|
|
250
274
|
});
|
|
251
275
|
await this.sendHeartbeatRequest();
|
|
252
276
|
}
|
package/dist/backend/backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator-heartbeat-monitor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"orchestrator-heartbeat-monitor.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orchestrator/orchestrator-heartbeat-monitor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Moment Service
|
|
3
|
+
*
|
|
4
|
+
* Tracks anonymous free trial usage for the "Magic Moment" feature.
|
|
5
|
+
* Allows up to 3 free task submissions per device fingerprint without
|
|
6
|
+
* requiring authentication, giving users a taste of the AI employee
|
|
7
|
+
* before they sign up.
|
|
8
|
+
*
|
|
9
|
+
* Uses file-based persistence matching the cloud task service pattern.
|
|
10
|
+
*
|
|
11
|
+
* @module services/payment/magic-moment.service
|
|
12
|
+
*/
|
|
13
|
+
import { type TrialRecord, type TrialAvailability } from './magic-moment.types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Singleton service for anonymous trial tracking.
|
|
16
|
+
*
|
|
17
|
+
* Manages the trial quota per device fingerprint and persists
|
|
18
|
+
* usage to disk so limits survive server restarts.
|
|
19
|
+
*/
|
|
20
|
+
export declare class MagicMomentService {
|
|
21
|
+
private static instance;
|
|
22
|
+
private readonly logger;
|
|
23
|
+
private readonly storageDir;
|
|
24
|
+
private readonly trialsFilePath;
|
|
25
|
+
private trials;
|
|
26
|
+
private initialized;
|
|
27
|
+
private constructor();
|
|
28
|
+
/**
|
|
29
|
+
* Get or create the singleton instance.
|
|
30
|
+
*
|
|
31
|
+
* @returns MagicMomentService singleton
|
|
32
|
+
*/
|
|
33
|
+
static getInstance(): MagicMomentService;
|
|
34
|
+
/**
|
|
35
|
+
* Reset the singleton (for testing).
|
|
36
|
+
*/
|
|
37
|
+
static resetInstance(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Initialize the service — load persisted trials from disk.
|
|
40
|
+
* Idempotent: safe to call multiple times.
|
|
41
|
+
*/
|
|
42
|
+
initialize(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Check whether a device fingerprint has remaining free trials.
|
|
45
|
+
*
|
|
46
|
+
* @param fingerprint - Client device fingerprint hash
|
|
47
|
+
* @returns Trial availability info
|
|
48
|
+
*/
|
|
49
|
+
checkTrialAvailability(fingerprint: string): Promise<TrialAvailability>;
|
|
50
|
+
/**
|
|
51
|
+
* Consume one free trial for a device fingerprint.
|
|
52
|
+
*
|
|
53
|
+
* @param fingerprint - Client device fingerprint hash
|
|
54
|
+
* @returns Updated trial availability, or null if no trials remain
|
|
55
|
+
*/
|
|
56
|
+
consumeTrial(fingerprint: string): Promise<TrialAvailability | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get the trial record for a fingerprint, or null if none exists.
|
|
59
|
+
*
|
|
60
|
+
* @param fingerprint - Client device fingerprint hash
|
|
61
|
+
* @returns Trial record or null
|
|
62
|
+
*/
|
|
63
|
+
getTrialRecord(fingerprint: string): Promise<TrialRecord | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Persist trial records to disk.
|
|
66
|
+
*/
|
|
67
|
+
private persist;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=magic-moment.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-moment.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAEN,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,MAAM,yBAAyB,CAAC;AAMjC;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAE1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAMP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAQ5B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBjC;;;;;OAKG;IACG,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe7E;;;;;OAKG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgC1E;;;;;OAKG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAStE;;OAEG;YACW,OAAO;CAQrB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Moment Service
|
|
3
|
+
*
|
|
4
|
+
* Tracks anonymous free trial usage for the "Magic Moment" feature.
|
|
5
|
+
* Allows up to 3 free task submissions per device fingerprint without
|
|
6
|
+
* requiring authentication, giving users a taste of the AI employee
|
|
7
|
+
* before they sign up.
|
|
8
|
+
*
|
|
9
|
+
* Uses file-based persistence matching the cloud task service pattern.
|
|
10
|
+
*
|
|
11
|
+
* @module services/payment/magic-moment.service
|
|
12
|
+
*/
|
|
13
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
+
import { MAGIC_MOMENT_CONSTANTS, } from './magic-moment.types.js';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Service
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
/**
|
|
22
|
+
* Singleton service for anonymous trial tracking.
|
|
23
|
+
*
|
|
24
|
+
* Manages the trial quota per device fingerprint and persists
|
|
25
|
+
* usage to disk so limits survive server restarts.
|
|
26
|
+
*/
|
|
27
|
+
export class MagicMomentService {
|
|
28
|
+
static instance = null;
|
|
29
|
+
logger;
|
|
30
|
+
storageDir;
|
|
31
|
+
trialsFilePath;
|
|
32
|
+
trials = new Map();
|
|
33
|
+
initialized = false;
|
|
34
|
+
constructor() {
|
|
35
|
+
this.logger = LoggerService.getInstance().createComponentLogger('MagicMomentService');
|
|
36
|
+
this.storageDir = join(homedir(), '.crewly', MAGIC_MOMENT_CONSTANTS.STORAGE_DIR);
|
|
37
|
+
this.trialsFilePath = join(this.storageDir, MAGIC_MOMENT_CONSTANTS.TRIALS_FILE);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get or create the singleton instance.
|
|
41
|
+
*
|
|
42
|
+
* @returns MagicMomentService singleton
|
|
43
|
+
*/
|
|
44
|
+
static getInstance() {
|
|
45
|
+
if (!MagicMomentService.instance) {
|
|
46
|
+
MagicMomentService.instance = new MagicMomentService();
|
|
47
|
+
}
|
|
48
|
+
return MagicMomentService.instance;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Reset the singleton (for testing).
|
|
52
|
+
*/
|
|
53
|
+
static resetInstance() {
|
|
54
|
+
MagicMomentService.instance = null;
|
|
55
|
+
}
|
|
56
|
+
// -----------------------------------------------------------------------
|
|
57
|
+
// Initialization
|
|
58
|
+
// -----------------------------------------------------------------------
|
|
59
|
+
/**
|
|
60
|
+
* Initialize the service — load persisted trials from disk.
|
|
61
|
+
* Idempotent: safe to call multiple times.
|
|
62
|
+
*/
|
|
63
|
+
async initialize() {
|
|
64
|
+
if (this.initialized)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
await mkdir(this.storageDir, { recursive: true });
|
|
68
|
+
const raw = await readFile(this.trialsFilePath, 'utf-8').catch(() => '[]');
|
|
69
|
+
const parsed = JSON.parse(raw);
|
|
70
|
+
for (const trial of parsed) {
|
|
71
|
+
this.trials.set(trial.fingerprint, trial);
|
|
72
|
+
}
|
|
73
|
+
this.logger.info(`Loaded ${this.trials.size} trial records from disk`);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
this.trials = new Map();
|
|
77
|
+
}
|
|
78
|
+
this.initialized = true;
|
|
79
|
+
}
|
|
80
|
+
// -----------------------------------------------------------------------
|
|
81
|
+
// Trial Management
|
|
82
|
+
// -----------------------------------------------------------------------
|
|
83
|
+
/**
|
|
84
|
+
* Check whether a device fingerprint has remaining free trials.
|
|
85
|
+
*
|
|
86
|
+
* @param fingerprint - Client device fingerprint hash
|
|
87
|
+
* @returns Trial availability info
|
|
88
|
+
*/
|
|
89
|
+
async checkTrialAvailability(fingerprint) {
|
|
90
|
+
await this.initialize();
|
|
91
|
+
const record = this.trials.get(fingerprint);
|
|
92
|
+
const used = record?.trialsUsed ?? 0;
|
|
93
|
+
const remaining = Math.max(0, MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS - used);
|
|
94
|
+
return {
|
|
95
|
+
available: remaining > 0,
|
|
96
|
+
remaining,
|
|
97
|
+
used,
|
|
98
|
+
max: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Consume one free trial for a device fingerprint.
|
|
103
|
+
*
|
|
104
|
+
* @param fingerprint - Client device fingerprint hash
|
|
105
|
+
* @returns Updated trial availability, or null if no trials remain
|
|
106
|
+
*/
|
|
107
|
+
async consumeTrial(fingerprint) {
|
|
108
|
+
await this.initialize();
|
|
109
|
+
const availability = await this.checkTrialAvailability(fingerprint);
|
|
110
|
+
if (!availability.available) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const now = new Date().toISOString();
|
|
114
|
+
const existing = this.trials.get(fingerprint);
|
|
115
|
+
const record = {
|
|
116
|
+
fingerprint,
|
|
117
|
+
trialsUsed: (existing?.trialsUsed ?? 0) + 1,
|
|
118
|
+
trialTimestamps: [...(existing?.trialTimestamps ?? []), now],
|
|
119
|
+
firstTrialAt: existing?.firstTrialAt ?? now,
|
|
120
|
+
lastTrialAt: now,
|
|
121
|
+
};
|
|
122
|
+
this.trials.set(fingerprint, record);
|
|
123
|
+
await this.persist();
|
|
124
|
+
this.logger.info(`Trial consumed: fingerprint=${fingerprint.slice(0, 8)}... used=${record.trialsUsed}/${MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS}`);
|
|
125
|
+
return {
|
|
126
|
+
available: record.trialsUsed < MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
|
|
127
|
+
remaining: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS - record.trialsUsed,
|
|
128
|
+
used: record.trialsUsed,
|
|
129
|
+
max: MAGIC_MOMENT_CONSTANTS.MAX_FREE_TRIALS,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get the trial record for a fingerprint, or null if none exists.
|
|
134
|
+
*
|
|
135
|
+
* @param fingerprint - Client device fingerprint hash
|
|
136
|
+
* @returns Trial record or null
|
|
137
|
+
*/
|
|
138
|
+
async getTrialRecord(fingerprint) {
|
|
139
|
+
await this.initialize();
|
|
140
|
+
return this.trials.get(fingerprint) ?? null;
|
|
141
|
+
}
|
|
142
|
+
// -----------------------------------------------------------------------
|
|
143
|
+
// Helpers
|
|
144
|
+
// -----------------------------------------------------------------------
|
|
145
|
+
/**
|
|
146
|
+
* Persist trial records to disk.
|
|
147
|
+
*/
|
|
148
|
+
async persist() {
|
|
149
|
+
try {
|
|
150
|
+
const data = JSON.stringify(Array.from(this.trials.values()), null, 2);
|
|
151
|
+
await writeFile(this.trialsFilePath, data, 'utf-8');
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
this.logger.error('Failed to persist trial records', { error: String(err) });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=magic-moment.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-moment.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Moment Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Types for the anonymous trial system that allows up to 3 free
|
|
5
|
+
* task submissions without authentication. Trials are tracked by
|
|
6
|
+
* a client-provided device fingerprint.
|
|
7
|
+
*
|
|
8
|
+
* @module services/payment/magic-moment.types
|
|
9
|
+
*/
|
|
10
|
+
/** Magic Moment service configuration. */
|
|
11
|
+
export declare const MAGIC_MOMENT_CONSTANTS: {
|
|
12
|
+
/** Maximum free trials per device fingerprint */
|
|
13
|
+
readonly MAX_FREE_TRIALS: 3;
|
|
14
|
+
/** Storage directory under ~/.crewly/ */
|
|
15
|
+
readonly STORAGE_DIR: "cloud/magic-moment";
|
|
16
|
+
/** Trial data file */
|
|
17
|
+
readonly TRIALS_FILE: "trials.json";
|
|
18
|
+
/** Minimum fingerprint length */
|
|
19
|
+
readonly MIN_FINGERPRINT_LENGTH: 8;
|
|
20
|
+
/** Maximum fingerprint length */
|
|
21
|
+
readonly MAX_FINGERPRINT_LENGTH: 128;
|
|
22
|
+
};
|
|
23
|
+
/** A single anonymous trial record. */
|
|
24
|
+
export interface TrialRecord {
|
|
25
|
+
/** Device fingerprint hash */
|
|
26
|
+
fingerprint: string;
|
|
27
|
+
/** Number of trials used */
|
|
28
|
+
trialsUsed: number;
|
|
29
|
+
/** ISO timestamps of each trial */
|
|
30
|
+
trialTimestamps: string[];
|
|
31
|
+
/** ISO timestamp of first trial */
|
|
32
|
+
firstTrialAt: string;
|
|
33
|
+
/** ISO timestamp of most recent trial */
|
|
34
|
+
lastTrialAt: string;
|
|
35
|
+
}
|
|
36
|
+
/** Trial availability check result. */
|
|
37
|
+
export interface TrialAvailability {
|
|
38
|
+
/** Whether the device can still submit free trials */
|
|
39
|
+
available: boolean;
|
|
40
|
+
/** Number of remaining free trials */
|
|
41
|
+
remaining: number;
|
|
42
|
+
/** Total trials used */
|
|
43
|
+
used: number;
|
|
44
|
+
/** Maximum trials allowed */
|
|
45
|
+
max: number;
|
|
46
|
+
}
|
|
47
|
+
/** POST /api/magic/submit request body. */
|
|
48
|
+
export interface MagicSubmitBody {
|
|
49
|
+
/** Client-provided device fingerprint hash */
|
|
50
|
+
fingerprint: string;
|
|
51
|
+
/** User's text prompt / instruction */
|
|
52
|
+
prompt?: string;
|
|
53
|
+
/** Base64-encoded file data (optional) */
|
|
54
|
+
fileData?: string;
|
|
55
|
+
/** Original filename (required if fileData provided) */
|
|
56
|
+
fileName?: string;
|
|
57
|
+
/** MIME type of the file (required if fileData provided) */
|
|
58
|
+
fileMimeType?: string;
|
|
59
|
+
}
|
|
60
|
+
/** Successful magic submit response. */
|
|
61
|
+
export interface MagicSubmitResponse {
|
|
62
|
+
success: true;
|
|
63
|
+
data: {
|
|
64
|
+
taskId: string;
|
|
65
|
+
message: string;
|
|
66
|
+
trialsRemaining: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Magic status response. */
|
|
70
|
+
export interface MagicStatusResponse {
|
|
71
|
+
success: true;
|
|
72
|
+
data: TrialAvailability;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Checks whether a MIME type is allowed for magic moment uploads.
|
|
76
|
+
*
|
|
77
|
+
* @param mimeType - MIME type to check
|
|
78
|
+
* @returns True if allowed
|
|
79
|
+
*/
|
|
80
|
+
export declare function isAllowedMagicMimeType(mimeType: string): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Validates a device fingerprint string.
|
|
83
|
+
*
|
|
84
|
+
* @param fingerprint - Value to validate
|
|
85
|
+
* @returns Error message or null if valid
|
|
86
|
+
*/
|
|
87
|
+
export declare function validateFingerprint(fingerprint: unknown): string | null;
|
|
88
|
+
/**
|
|
89
|
+
* Validates a magic moment submit request body.
|
|
90
|
+
*
|
|
91
|
+
* @param body - Request body to validate
|
|
92
|
+
* @returns Error message or null if valid
|
|
93
|
+
*/
|
|
94
|
+
export declare function validateMagicSubmitBody(body: MagicSubmitBody): string | null;
|
|
95
|
+
//# sourceMappingURL=magic-moment.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-moment.types.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,0CAA0C;AAC1C,eAAO,MAAM,sBAAsB;IAClC,iDAAiD;;IAEjD,yCAAyC;;IAEzC,sBAAsB;;IAEtB,iCAAiC;;IAEjC,iCAAiC;;CAExB,CAAC;AAMX,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IACjC,sDAAsD;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,GAAG,EAAE,MAAM,CAAC;CACZ;AAMD,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC/B,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC;CACF;AAED,6BAA6B;AAC7B,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,iBAAiB,CAAC;CACxB;AAcD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAwB5E"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Magic Moment Type Definitions
|
|
3
|
+
*
|
|
4
|
+
* Types for the anonymous trial system that allows up to 3 free
|
|
5
|
+
* task submissions without authentication. Trials are tracked by
|
|
6
|
+
* a client-provided device fingerprint.
|
|
7
|
+
*
|
|
8
|
+
* @module services/payment/magic-moment.types
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Constants
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/** Magic Moment service configuration. */
|
|
14
|
+
export const MAGIC_MOMENT_CONSTANTS = {
|
|
15
|
+
/** Maximum free trials per device fingerprint */
|
|
16
|
+
MAX_FREE_TRIALS: 3,
|
|
17
|
+
/** Storage directory under ~/.crewly/ */
|
|
18
|
+
STORAGE_DIR: 'cloud/magic-moment',
|
|
19
|
+
/** Trial data file */
|
|
20
|
+
TRIALS_FILE: 'trials.json',
|
|
21
|
+
/** Minimum fingerprint length */
|
|
22
|
+
MIN_FINGERPRINT_LENGTH: 8,
|
|
23
|
+
/** Maximum fingerprint length */
|
|
24
|
+
MAX_FINGERPRINT_LENGTH: 128,
|
|
25
|
+
};
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Type Guards
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/** Allowed MIME types for magic moment uploads (matches H5). */
|
|
30
|
+
const ALLOWED_MAGIC_MIME_TYPES = [
|
|
31
|
+
'image/png',
|
|
32
|
+
'image/jpeg',
|
|
33
|
+
'image/gif',
|
|
34
|
+
'image/webp',
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* Checks whether a MIME type is allowed for magic moment uploads.
|
|
38
|
+
*
|
|
39
|
+
* @param mimeType - MIME type to check
|
|
40
|
+
* @returns True if allowed
|
|
41
|
+
*/
|
|
42
|
+
export function isAllowedMagicMimeType(mimeType) {
|
|
43
|
+
return ALLOWED_MAGIC_MIME_TYPES.includes(mimeType);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validates a device fingerprint string.
|
|
47
|
+
*
|
|
48
|
+
* @param fingerprint - Value to validate
|
|
49
|
+
* @returns Error message or null if valid
|
|
50
|
+
*/
|
|
51
|
+
export function validateFingerprint(fingerprint) {
|
|
52
|
+
if (!fingerprint || typeof fingerprint !== 'string') {
|
|
53
|
+
return 'fingerprint is required';
|
|
54
|
+
}
|
|
55
|
+
if (fingerprint.length < MAGIC_MOMENT_CONSTANTS.MIN_FINGERPRINT_LENGTH) {
|
|
56
|
+
return `fingerprint must be at least ${MAGIC_MOMENT_CONSTANTS.MIN_FINGERPRINT_LENGTH} characters`;
|
|
57
|
+
}
|
|
58
|
+
if (fingerprint.length > MAGIC_MOMENT_CONSTANTS.MAX_FINGERPRINT_LENGTH) {
|
|
59
|
+
return `fingerprint must be at most ${MAGIC_MOMENT_CONSTANTS.MAX_FINGERPRINT_LENGTH} characters`;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Validates a magic moment submit request body.
|
|
65
|
+
*
|
|
66
|
+
* @param body - Request body to validate
|
|
67
|
+
* @returns Error message or null if valid
|
|
68
|
+
*/
|
|
69
|
+
export function validateMagicSubmitBody(body) {
|
|
70
|
+
const fpError = validateFingerprint(body.fingerprint);
|
|
71
|
+
if (fpError)
|
|
72
|
+
return fpError;
|
|
73
|
+
const hasPrompt = body.prompt && typeof body.prompt === 'string' && body.prompt.trim().length > 0;
|
|
74
|
+
const hasFile = body.fileData && typeof body.fileData === 'string' && body.fileData.length > 0;
|
|
75
|
+
if (!hasPrompt && !hasFile) {
|
|
76
|
+
return 'At least one of prompt or file is required';
|
|
77
|
+
}
|
|
78
|
+
if (hasFile) {
|
|
79
|
+
if (!body.fileName || typeof body.fileName !== 'string' || body.fileName.trim().length === 0) {
|
|
80
|
+
return 'fileName is required when uploading a file';
|
|
81
|
+
}
|
|
82
|
+
if (!body.fileMimeType || typeof body.fileMimeType !== 'string') {
|
|
83
|
+
return 'fileMimeType is required when uploading a file';
|
|
84
|
+
}
|
|
85
|
+
if (!isAllowedMagicMimeType(body.fileMimeType)) {
|
|
86
|
+
return `Unsupported file type: ${body.fileMimeType}. Only images are allowed for free trials.`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=magic-moment.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magic-moment.types.js","sourceRoot":"","sources":["../../../../../../backend/src/services/payment/magic-moment.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,0CAA0C;AAC1C,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,iDAAiD;IACjD,eAAe,EAAE,CAAC;IAClB,yCAAyC;IACzC,WAAW,EAAE,oBAAoB;IACjC,sBAAsB;IACtB,WAAW,EAAE,aAAa;IAC1B,iCAAiC;IACjC,sBAAsB,EAAE,CAAC;IACzB,iCAAiC;IACjC,sBAAsB,EAAE,GAAG;CAClB,CAAC;AAkEX,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,gEAAgE;AAChE,MAAM,wBAAwB,GAAG;IAChC,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;CACH,CAAC;AAEX;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACtD,OAAQ,wBAA8C,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAoB;IACvD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,yBAAyB,CAAC;IAClC,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,EAAE,CAAC;QACxE,OAAO,gCAAgC,sBAAsB,CAAC,sBAAsB,aAAa,CAAC;IACnG,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,sBAAsB,EAAE,CAAC;QACxE,OAAO,+BAA+B,sBAAsB,CAAC,sBAAsB,aAAa,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAqB;IAC5D,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClG,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAE/F,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,4CAA4C,CAAC;IACrD,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9F,OAAO,4CAA4C,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACjE,OAAO,gDAAgD,CAAC;QACzD,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAChD,OAAO,0BAA0B,IAAI,CAAC,YAAY,4CAA4C,CAAC;QAChG,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stripe Payment Service
|
|
3
|
+
*
|
|
4
|
+
* Wraps the Stripe SDK for checkout session creation, subscription
|
|
5
|
+
* management, customer portal, and webhook event processing.
|
|
6
|
+
*
|
|
7
|
+
* Conditionally initialises — if STRIPE_SECRET_KEY is not set, all
|
|
8
|
+
* methods return graceful errors instead of crashing, allowing the
|
|
9
|
+
* rest of the backend to run without Stripe credentials.
|
|
10
|
+
*
|
|
11
|
+
* Subscription state is persisted locally via a file-based store so
|
|
12
|
+
* that GET /subscription queries do not require a Stripe API call.
|
|
13
|
+
*
|
|
14
|
+
* @module services/payment/stripe.service
|
|
15
|
+
*/
|
|
16
|
+
import type { PlanId, BillingInterval, SubscriptionInfo, CreateCheckoutResponse, CreatePortalResponse, WebhookEventPayload, PaymentOperationResult } from '../../controllers/payment/payment.types.js';
|
|
17
|
+
/** Persisted subscription record keyed by Supabase userId. */
|
|
18
|
+
export interface StoredSubscription {
|
|
19
|
+
/** Supabase user ID */
|
|
20
|
+
userId: string;
|
|
21
|
+
/** Stripe customer ID */
|
|
22
|
+
customerId: string;
|
|
23
|
+
/** Stripe subscription ID */
|
|
24
|
+
subscriptionId: string;
|
|
25
|
+
/** Plan the user is on */
|
|
26
|
+
planId: PlanId;
|
|
27
|
+
/** Subscription status */
|
|
28
|
+
status: SubscriptionInfo['status'];
|
|
29
|
+
/** ISO timestamp of billing period end */
|
|
30
|
+
currentPeriodEnd: string | null;
|
|
31
|
+
/** Whether subscription cancels at period end */
|
|
32
|
+
cancelAtPeriodEnd: boolean;
|
|
33
|
+
/** ISO timestamp of last update */
|
|
34
|
+
updatedAt: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Singleton service for Stripe payment operations.
|
|
38
|
+
*
|
|
39
|
+
* All methods check `isConfigured()` first and return a descriptive
|
|
40
|
+
* error when Stripe is not available rather than throwing.
|
|
41
|
+
*/
|
|
42
|
+
export declare class StripeService {
|
|
43
|
+
private static instance;
|
|
44
|
+
private readonly logger;
|
|
45
|
+
private readonly secretKey;
|
|
46
|
+
private readonly webhookSecret;
|
|
47
|
+
private stripe;
|
|
48
|
+
private subscriptions;
|
|
49
|
+
private subscriptionsLoaded;
|
|
50
|
+
private constructor();
|
|
51
|
+
/**
|
|
52
|
+
* Get or create the singleton instance.
|
|
53
|
+
*
|
|
54
|
+
* @returns StripeService singleton
|
|
55
|
+
*/
|
|
56
|
+
static getInstance(): StripeService;
|
|
57
|
+
/**
|
|
58
|
+
* Reset the singleton (for testing).
|
|
59
|
+
*/
|
|
60
|
+
static resetInstance(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Whether Stripe is configured and ready to use.
|
|
63
|
+
*
|
|
64
|
+
* @returns true if the secret key is set
|
|
65
|
+
*/
|
|
66
|
+
isConfigured(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Load subscription state from disk. Idempotent.
|
|
69
|
+
*/
|
|
70
|
+
private loadSubscriptions;
|
|
71
|
+
/**
|
|
72
|
+
* Persist subscription state to disk.
|
|
73
|
+
*/
|
|
74
|
+
private persistSubscriptions;
|
|
75
|
+
/**
|
|
76
|
+
* Update or create a subscription record from a webhook event.
|
|
77
|
+
*
|
|
78
|
+
* @param payload - Processed webhook payload
|
|
79
|
+
*/
|
|
80
|
+
upsertSubscriptionFromWebhook(payload: WebhookEventPayload): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Create a Stripe Checkout Session for a subscription.
|
|
83
|
+
*
|
|
84
|
+
* @param userId - Supabase user ID (stored in session metadata)
|
|
85
|
+
* @param planId - Plan to subscribe to
|
|
86
|
+
* @param interval - Billing interval
|
|
87
|
+
* @param successUrl - Redirect URL after successful payment
|
|
88
|
+
* @param cancelUrl - Redirect URL if user cancels
|
|
89
|
+
* @returns Result containing the checkout URL and session ID
|
|
90
|
+
*/
|
|
91
|
+
createCheckoutSession(userId: string, planId: PlanId, interval: BillingInterval, successUrl: string, cancelUrl: string): Promise<PaymentOperationResult<CreateCheckoutResponse>>;
|
|
92
|
+
/**
|
|
93
|
+
* Get the current subscription for a user.
|
|
94
|
+
*
|
|
95
|
+
* First checks local subscription store (populated by webhooks),
|
|
96
|
+
* then falls back to Stripe customer search if configured.
|
|
97
|
+
*
|
|
98
|
+
* @param userId - Supabase user ID
|
|
99
|
+
* @returns Subscription info
|
|
100
|
+
*/
|
|
101
|
+
getSubscription(userId: string): Promise<PaymentOperationResult<SubscriptionInfo>>;
|
|
102
|
+
/**
|
|
103
|
+
* Create a Stripe Customer Portal session for subscription management.
|
|
104
|
+
*
|
|
105
|
+
* @param userId - Supabase user ID
|
|
106
|
+
* @param returnUrl - URL to redirect to when the user is done
|
|
107
|
+
* @returns Portal URL
|
|
108
|
+
*/
|
|
109
|
+
createPortalSession(userId: string, returnUrl: string): Promise<PaymentOperationResult<CreatePortalResponse>>;
|
|
110
|
+
/**
|
|
111
|
+
* Verify and process a Stripe webhook event.
|
|
112
|
+
*
|
|
113
|
+
* Uses Stripe SDK signature verification when configured,
|
|
114
|
+
* then extracts relevant data from the event payload.
|
|
115
|
+
*
|
|
116
|
+
* @param rawBody - Raw request body (Buffer)
|
|
117
|
+
* @param signature - Stripe-Signature header value
|
|
118
|
+
* @returns Processed webhook event payload
|
|
119
|
+
*/
|
|
120
|
+
handleWebhookEvent(rawBody: Buffer, signature: string): Promise<PaymentOperationResult<WebhookEventPayload>>;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=stripe.service.d.ts.map
|