crewly 1.0.6 → 1.0.8
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 +146 -40
- package/config/roles/architect/prompt.md +11 -0
- package/config/roles/backend-developer/prompt.md +11 -0
- package/config/roles/designer/prompt.md +11 -0
- package/config/roles/developer/prompt.md +18 -4
- package/config/roles/frontend-developer/prompt.md +11 -0
- package/config/roles/fullstack-dev/prompt.md +11 -0
- package/config/roles/generalist/prompt.md +11 -0
- package/config/roles/orchestrator/prompt.md +53 -10
- package/config/roles/product-manager/prompt.md +18 -4
- package/config/roles/qa/prompt.md +11 -0
- package/config/roles/qa-engineer/prompt.md +11 -0
- package/config/roles/sales/prompt.md +11 -0
- package/config/roles/support/prompt.md +11 -0
- package/config/roles/tpm/prompt.md +11 -0
- package/config/skills/orchestrator/complete-task/execute.sh +1 -0
- package/config/templates/agent-claude-md.md +16 -0
- package/config/templates/research-team.json +22 -0
- package/config/templates/startup-team.json +22 -0
- package/config/templates/web-dev-team.json +22 -0
- package/dist/backend/backend/src/constants.d.ts +61 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +65 -7
- package/dist/backend/backend/src/constants.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 +7 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +7 -0
- 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 +174 -4
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +34 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/task-management.routes.js +2 -0
- package/dist/backend/backend/src/routes/modules/task-management.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +8 -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 +75 -17
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts +222 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js +621 -0
- package/dist/backend/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
- package/dist/backend/backend/src/services/index.d.ts +3 -0
- package/dist/backend/backend/src/services/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/index.js +5 -0
- package/dist/backend/backend/src/services/index.js.map +1 -1
- package/dist/backend/backend/src/services/mcp-client.d.ts +233 -0
- package/dist/backend/backend/src/services/mcp-client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/mcp-client.js +297 -0
- package/dist/backend/backend/src/services/mcp-client.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.d.ts +167 -0
- package/dist/backend/backend/src/services/mcp-server.d.ts.map +1 -0
- package/dist/backend/backend/src/services/mcp-server.js +586 -0
- package/dist/backend/backend/src/services/mcp-server.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +2 -0
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +6 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +10 -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 +94 -38
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/quality/index.d.ts +1 -0
- package/dist/backend/backend/src/services/quality/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/quality/index.js +1 -0
- package/dist/backend/backend/src/services/quality/index.js.map +1 -1
- package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts +84 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.js +163 -0
- package/dist/backend/backend/src/services/quality/task-output-validator.service.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +234 -0
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-adapter.js +180 -0
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-credentials.service.d.ts +33 -0
- package/dist/backend/backend/src/services/slack/slack-credentials.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-credentials.service.js +103 -0
- package/dist/backend/backend/src/services/slack/slack-credentials.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +9 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +31 -2
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +2 -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 +2 -0
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +1 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js +2 -0
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.d.ts +9 -6
- package/dist/backend/backend/src/types/messaging.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/messaging.types.js +10 -3
- package/dist/backend/backend/src/types/messaging.types.js.map +1 -1
- package/dist/backend/backend/src/types/task-output.types.d.ts +78 -0
- package/dist/backend/backend/src/types/task-output.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/task-output.types.js +27 -0
- package/dist/backend/backend/src/types/task-output.types.js.map +1 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts +13 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.d.ts.map +1 -1
- package/dist/backend/backend/src/websocket/terminal.gateway.js +12 -0
- package/dist/backend/backend/src/websocket/terminal.gateway.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +751 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -0
- package/dist/cli/backend/src/constants.js +550 -0
- package/dist/cli/backend/src/constants.js.map +1 -0
- package/dist/cli/backend/src/models/Project.d.ts +18 -0
- package/dist/cli/backend/src/models/Project.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Project.js +70 -0
- package/dist/cli/backend/src/models/Project.js.map +1 -0
- package/dist/cli/backend/src/models/ScheduledMessage.d.ts +27 -0
- package/dist/cli/backend/src/models/ScheduledMessage.d.ts.map +1 -0
- package/dist/cli/backend/src/models/ScheduledMessage.js +50 -0
- package/dist/cli/backend/src/models/ScheduledMessage.js.map +1 -0
- package/dist/cli/backend/src/models/Team.d.ts +20 -0
- package/dist/cli/backend/src/models/Team.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Team.js +120 -0
- package/dist/cli/backend/src/models/Team.js.map +1 -0
- package/dist/cli/backend/src/models/Ticket.d.ts +24 -0
- package/dist/cli/backend/src/models/Ticket.d.ts.map +1 -0
- package/dist/cli/backend/src/models/Ticket.js +102 -0
- package/dist/cli/backend/src/models/Ticket.js.map +1 -0
- package/dist/cli/backend/src/models/index.d.ts +5 -0
- package/dist/cli/backend/src/models/index.d.ts.map +1 -0
- package/dist/cli/backend/src/models/index.js +5 -0
- package/dist/cli/backend/src/models/index.js.map +1 -0
- package/dist/cli/backend/src/services/core/config.service.d.ts +91 -0
- package/dist/cli/backend/src/services/core/config.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/config.service.js +246 -0
- package/dist/cli/backend/src/services/core/config.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts +70 -0
- package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/logger.service.js +350 -0
- package/dist/cli/backend/src/services/core/logger.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts +269 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.js +1406 -0
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts +92 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.js +120 -0
- package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +125 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +247 -0
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +153 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js +409 -0
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +1 -0
- package/dist/cli/backend/src/services/mcp-server.d.ts +167 -0
- package/dist/cli/backend/src/services/mcp-server.d.ts.map +1 -0
- package/dist/cli/backend/src/services/mcp-server.js +586 -0
- package/dist/cli/backend/src/services/mcp-server.js.map +1 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts +259 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.js +539 -0
- package/dist/cli/backend/src/services/memory/agent-memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts +306 -0
- package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/memory.service.js +517 -0
- package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +252 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.js +600 -0
- package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
- package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
- package/dist/cli/backend/src/types/budget.types.d.ts +217 -0
- package/dist/cli/backend/src/types/budget.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/budget.types.js +82 -0
- package/dist/cli/backend/src/types/budget.types.js.map +1 -0
- package/dist/cli/backend/src/types/chat.types.d.ts +550 -0
- package/dist/cli/backend/src/types/chat.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/chat.types.js +743 -0
- package/dist/cli/backend/src/types/chat.types.js.map +1 -0
- package/dist/cli/backend/src/types/continuation.types.d.ts +237 -0
- package/dist/cli/backend/src/types/continuation.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/continuation.types.js +10 -0
- package/dist/cli/backend/src/types/continuation.types.js.map +1 -0
- package/dist/cli/backend/src/types/index.d.ts +164 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -0
- package/dist/cli/backend/src/types/index.js +25 -0
- package/dist/cli/backend/src/types/index.js.map +1 -0
- package/dist/cli/backend/src/types/knowledge.types.d.ts +195 -0
- package/dist/cli/backend/src/types/knowledge.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/knowledge.types.js +38 -0
- package/dist/cli/backend/src/types/knowledge.types.js.map +1 -0
- package/dist/cli/backend/src/types/memory.types.d.ts +587 -0
- package/dist/cli/backend/src/types/memory.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/memory.types.js +47 -0
- package/dist/cli/backend/src/types/memory.types.js.map +1 -0
- package/dist/cli/backend/src/types/quality-gate.types.d.ts +171 -0
- package/dist/cli/backend/src/types/quality-gate.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/quality-gate.types.js +42 -0
- package/dist/cli/backend/src/types/quality-gate.types.js.map +1 -0
- package/dist/cli/backend/src/types/role.types.d.ts +260 -0
- package/dist/cli/backend/src/types/role.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/role.types.js +238 -0
- package/dist/cli/backend/src/types/role.types.js.map +1 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts +254 -0
- package/dist/cli/backend/src/types/scheduler.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/scheduler.types.js +32 -0
- package/dist/cli/backend/src/types/scheduler.types.js.map +1 -0
- package/dist/cli/backend/src/types/settings.types.d.ts +178 -0
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/settings.types.js +206 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -0
- package/dist/cli/backend/src/types/skill.types.d.ts +515 -0
- package/dist/cli/backend/src/types/skill.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/skill.types.js +481 -0
- package/dist/cli/backend/src/types/skill.types.js.map +1 -0
- package/dist/cli/backend/src/types/sop.types.d.ts +224 -0
- package/dist/cli/backend/src/types/sop.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/sop.types.js +85 -0
- package/dist/cli/backend/src/types/sop.types.js.map +1 -0
- package/dist/cli/backend/src/types/task-output.types.d.ts +78 -0
- package/dist/cli/backend/src/types/task-output.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/task-output.types.js +27 -0
- package/dist/cli/backend/src/types/task-output.types.js.map +1 -0
- package/dist/cli/backend/src/utils/file-io.utils.d.ts +102 -0
- package/dist/cli/backend/src/utils/file-io.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/file-io.utils.js +214 -0
- package/dist/cli/backend/src/utils/file-io.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.d.ts +54 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.js +97 -0
- package/dist/cli/backend/src/utils/terminal-output.utils.js.map +1 -0
- package/dist/cli/cli/src/commands/mcp-server.d.ts +38 -0
- package/dist/cli/cli/src/commands/mcp-server.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/mcp-server.js +49 -0
- package/dist/cli/cli/src/commands/mcp-server.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +61 -7
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +192 -19
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/commands/publish.d.ts +27 -0
- package/dist/cli/cli/src/commands/publish.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/publish.js +69 -0
- package/dist/cli/cli/src/commands/publish.js.map +1 -0
- package/dist/cli/cli/src/commands/start.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/start.js +12 -2
- package/dist/cli/cli/src/commands/start.js.map +1 -1
- package/dist/cli/cli/src/index.js +14 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/archive-creator.d.ts +82 -0
- package/dist/cli/cli/src/utils/archive-creator.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/archive-creator.js +105 -0
- package/dist/cli/cli/src/utils/archive-creator.js.map +1 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts +62 -0
- package/dist/cli/cli/src/utils/package-validator.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/package-validator.js +122 -0
- package/dist/cli/cli/src/utils/package-validator.js.map +1 -0
- package/dist/cli/cli/src/utils/process-cleanup.d.ts +15 -0
- package/dist/cli/cli/src/utils/process-cleanup.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/process-cleanup.js +76 -0
- package/dist/cli/cli/src/utils/process-cleanup.js.map +1 -0
- package/dist/cli/cli/src/utils/templates.d.ts +71 -0
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/templates.js +91 -0
- package/dist/cli/cli/src/utils/templates.js.map +1 -0
- package/frontend/dist/assets/{index-523c7fce.js → index-68d1eb5a.js} +71 -71
- package/frontend/dist/assets/{index-4c050f52.css → index-c5043a83.css} +1 -1
- package/frontend/dist/assets/nunito-cyrillic-400-normal-e44e669f.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-400-normal-ff8e8bdd.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-500-normal-2159679b.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-500-normal-61a3b80e.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-600-normal-ac046097.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-600-normal-e61eb97b.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-700-normal-8fcefcc9.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-700-normal-b9684104.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-800-normal-40253beb.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-800-normal-d80292de.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-20d73ae7.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-400-normal-d48c37c9.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-16197abd.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-500-normal-9dcfe9b5.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-d53e9851.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-600-normal-e3d0201f.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-5936f6ac.woff2 +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-700-normal-c8c02775.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-217b8f51.woff +0 -0
- package/frontend/dist/assets/nunito-cyrillic-ext-800-normal-796cf7bd.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-400-normal-a5906e15.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-400-normal-b51e7635.woff +0 -0
- package/frontend/dist/assets/nunito-latin-500-normal-23ae3083.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-500-normal-be14dbc6.woff +0 -0
- package/frontend/dist/assets/nunito-latin-600-normal-06a9c8b3.woff +0 -0
- package/frontend/dist/assets/nunito-latin-600-normal-45f437de.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-700-normal-ce9107dc.woff +0 -0
- package/frontend/dist/assets/nunito-latin-700-normal-fa89300b.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-800-normal-0ca02785.woff +0 -0
- package/frontend/dist/assets/nunito-latin-800-normal-2363d3ed.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-400-normal-67250a41.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-400-normal-d7e2415e.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-500-normal-06f35d1c.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-500-normal-343e7adc.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-600-normal-5a8efd17.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-600-normal-a7ba5f4f.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-700-normal-0a4e4a02.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-700-normal-0c607961.woff +0 -0
- package/frontend/dist/assets/nunito-latin-ext-800-normal-39f54b55.woff2 +0 -0
- package/frontend/dist/assets/nunito-latin-ext-800-normal-466d0211.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-400-normal-2a755616.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-400-normal-9c01ea9f.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-500-normal-452e5e08.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-500-normal-dc98d965.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-600-normal-2ffbb85f.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-600-normal-cf95b95d.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-700-normal-0e29c28c.woff2 +0 -0
- package/frontend/dist/assets/nunito-vietnamese-700-normal-7793b75e.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-800-normal-5baf507e.woff +0 -0
- package/frontend/dist/assets/nunito-vietnamese-800-normal-fac6740e.woff2 +0 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +15 -5
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Adapter Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified, pluggable interface for managing AI runtime sessions.
|
|
5
|
+
* Each adapter encapsulates the full lifecycle of a specific runtime (Claude Code,
|
|
6
|
+
* Gemini CLI, Codex): starting a session, writing input, reading output, and stopping.
|
|
7
|
+
*
|
|
8
|
+
* This replaces the need to coordinate between ISessionBackend, SessionCommandHelper,
|
|
9
|
+
* and RuntimeAgentService manually — the adapter handles it all.
|
|
10
|
+
*
|
|
11
|
+
* @module services/runtime-adapter
|
|
12
|
+
*/
|
|
13
|
+
import { type RuntimeType } from '../constants.js';
|
|
14
|
+
import { RuntimeAgentService } from './agent/runtime-agent.service.abstract.js';
|
|
15
|
+
import { type ISessionBackend, type SessionCommandHelper } from './session/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for starting a new agent session via a runtime adapter.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const config: RuntimeAdapterConfig = {
|
|
22
|
+
* sessionName: 'dev-agent-1',
|
|
23
|
+
* projectPath: '/home/user/my-project',
|
|
24
|
+
* runtimeFlags: ['--chrome'],
|
|
25
|
+
* promptFilePath: '/tmp/prompt.md',
|
|
26
|
+
* };
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export interface RuntimeAdapterConfig {
|
|
30
|
+
/** Unique name for the PTY session */
|
|
31
|
+
sessionName: string;
|
|
32
|
+
/** Working directory for the agent */
|
|
33
|
+
projectPath: string;
|
|
34
|
+
/** Optional CLI flags injected before --dangerously-skip-permissions */
|
|
35
|
+
runtimeFlags?: string[];
|
|
36
|
+
/** Optional path to a system prompt file */
|
|
37
|
+
promptFilePath?: string;
|
|
38
|
+
/** Optional environment variables to set in the session shell */
|
|
39
|
+
env?: Record<string, string>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Unified interface for AI runtime adapters.
|
|
43
|
+
*
|
|
44
|
+
* Each implementation wraps a specific runtime CLI (Claude Code, Gemini CLI, Codex)
|
|
45
|
+
* and provides a consistent API for managing agent sessions. Adapters handle the
|
|
46
|
+
* full lifecycle: session creation, runtime initialization, I/O, and teardown.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const adapter = getRuntimeAdapter('claude-code');
|
|
51
|
+
*
|
|
52
|
+
* await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
|
|
53
|
+
* await adapter.write('agent-1', 'Hello, build a REST API');
|
|
54
|
+
* const output = await adapter.getOutput('agent-1');
|
|
55
|
+
* await adapter.stop('agent-1');
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export interface RuntimeAdapter {
|
|
59
|
+
/** The runtime type this adapter handles */
|
|
60
|
+
readonly runtimeType: RuntimeType;
|
|
61
|
+
/** Human-readable display name for this runtime */
|
|
62
|
+
readonly displayName: string;
|
|
63
|
+
/**
|
|
64
|
+
* Start a new agent session.
|
|
65
|
+
*
|
|
66
|
+
* Creates a PTY session, sets environment variables, and launches the
|
|
67
|
+
* runtime CLI with the specified configuration.
|
|
68
|
+
*
|
|
69
|
+
* @param config - Session configuration
|
|
70
|
+
* @throws Error if session creation or runtime initialization fails
|
|
71
|
+
*/
|
|
72
|
+
start(config: RuntimeAdapterConfig): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Stop an agent session and clean up resources.
|
|
75
|
+
*
|
|
76
|
+
* @param sessionName - Name of the session to stop
|
|
77
|
+
* @throws Error if session does not exist
|
|
78
|
+
*/
|
|
79
|
+
stop(sessionName: string): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Write data to an agent session's stdin.
|
|
82
|
+
*
|
|
83
|
+
* @param sessionName - Name of the target session
|
|
84
|
+
* @param data - Data to write (sent via the session's shell)
|
|
85
|
+
* @throws Error if session does not exist
|
|
86
|
+
*/
|
|
87
|
+
write(sessionName: string, data: string): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Get recent output from an agent session.
|
|
90
|
+
*
|
|
91
|
+
* @param sessionName - Name of the target session
|
|
92
|
+
* @param lines - Number of recent lines to capture (default: 50)
|
|
93
|
+
* @returns Captured terminal output as a string
|
|
94
|
+
* @throws Error if session does not exist
|
|
95
|
+
*/
|
|
96
|
+
getOutput(sessionName: string, lines?: number): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Check if a session is currently running.
|
|
99
|
+
*
|
|
100
|
+
* @param sessionName - Name of the session to check
|
|
101
|
+
* @returns True if the session exists and is active
|
|
102
|
+
*/
|
|
103
|
+
isRunning(sessionName: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Wait for the runtime CLI to become ready after initialization.
|
|
106
|
+
*
|
|
107
|
+
* Polls the session output for runtime-specific ready patterns.
|
|
108
|
+
*
|
|
109
|
+
* @param sessionName - Name of the session to monitor
|
|
110
|
+
* @param timeout - Maximum wait time in milliseconds (default: 60000)
|
|
111
|
+
* @returns True if runtime became ready within timeout, false otherwise
|
|
112
|
+
*/
|
|
113
|
+
waitForReady(sessionName: string, timeout?: number): Promise<boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Detect if the runtime CLI is currently active in a session.
|
|
116
|
+
*
|
|
117
|
+
* Uses runtime-specific detection strategies (e.g., sending '/' to trigger
|
|
118
|
+
* a command palette and checking for output changes).
|
|
119
|
+
*
|
|
120
|
+
* @param sessionName - Name of the session to check
|
|
121
|
+
* @returns True if the runtime is detected as running
|
|
122
|
+
*/
|
|
123
|
+
detectRuntime(sessionName: string): Promise<boolean>;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Base adapter that delegates to the existing RuntimeAgentService and ISessionBackend.
|
|
127
|
+
*
|
|
128
|
+
* Concrete adapters extend this class and provide their runtime type.
|
|
129
|
+
* The base handles all common operations — subclasses only need to override
|
|
130
|
+
* behavior that differs from the default.
|
|
131
|
+
*/
|
|
132
|
+
declare abstract class BaseRuntimeAdapter implements RuntimeAdapter {
|
|
133
|
+
abstract readonly runtimeType: RuntimeType;
|
|
134
|
+
abstract readonly displayName: string;
|
|
135
|
+
protected sessionBackend: ISessionBackend;
|
|
136
|
+
protected sessionHelper: SessionCommandHelper;
|
|
137
|
+
protected runtimeService: RuntimeAgentService;
|
|
138
|
+
constructor(sessionBackend: ISessionBackend, sessionHelper: SessionCommandHelper, runtimeService: RuntimeAgentService);
|
|
139
|
+
/**
|
|
140
|
+
* Start a new agent session with the runtime CLI.
|
|
141
|
+
*
|
|
142
|
+
* Creates a PTY shell, sets environment variables, and executes the
|
|
143
|
+
* runtime initialization script.
|
|
144
|
+
*
|
|
145
|
+
* @param config - Session start configuration
|
|
146
|
+
*/
|
|
147
|
+
start(config: RuntimeAdapterConfig): Promise<void>;
|
|
148
|
+
/** @inheritdoc */
|
|
149
|
+
stop(sessionName: string): Promise<void>;
|
|
150
|
+
/** @inheritdoc */
|
|
151
|
+
write(sessionName: string, data: string): Promise<void>;
|
|
152
|
+
/** @inheritdoc */
|
|
153
|
+
getOutput(sessionName: string, lines?: number): Promise<string>;
|
|
154
|
+
/** @inheritdoc */
|
|
155
|
+
isRunning(sessionName: string): boolean;
|
|
156
|
+
/** @inheritdoc */
|
|
157
|
+
waitForReady(sessionName: string, timeout?: number): Promise<boolean>;
|
|
158
|
+
/** @inheritdoc */
|
|
159
|
+
detectRuntime(sessionName: string): Promise<boolean>;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Adapter for Anthropic's Claude Code CLI.
|
|
163
|
+
*
|
|
164
|
+
* Full implementation — Claude Code is the default runtime.
|
|
165
|
+
* Handles Claude-specific initialization, detection (slash command palette),
|
|
166
|
+
* and MCP configuration.
|
|
167
|
+
*/
|
|
168
|
+
export declare class ClaudeCodeAdapter extends BaseRuntimeAdapter {
|
|
169
|
+
readonly runtimeType: "claude-code";
|
|
170
|
+
readonly displayName = "Claude Code";
|
|
171
|
+
/**
|
|
172
|
+
* Start a Claude Code session.
|
|
173
|
+
*
|
|
174
|
+
* Extends the base start with Claude-specific post-initialization
|
|
175
|
+
* (MCP server configuration).
|
|
176
|
+
*
|
|
177
|
+
* @param config - Session start configuration
|
|
178
|
+
*/
|
|
179
|
+
start(config: RuntimeAdapterConfig): Promise<void>;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Adapter for Google's Gemini CLI.
|
|
183
|
+
*
|
|
184
|
+
* Stub implementation — basic structure in place for future development.
|
|
185
|
+
* Uses the base adapter behavior which delegates to GeminiRuntimeService.
|
|
186
|
+
*/
|
|
187
|
+
export declare class GeminiCliAdapter extends BaseRuntimeAdapter {
|
|
188
|
+
readonly runtimeType: "gemini-cli";
|
|
189
|
+
readonly displayName = "Gemini CLI";
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Adapter for OpenAI's Codex CLI.
|
|
193
|
+
*
|
|
194
|
+
* Stub implementation — basic structure in place for future development.
|
|
195
|
+
* Uses the base adapter behavior which delegates to CodexRuntimeService.
|
|
196
|
+
*/
|
|
197
|
+
export declare class CodexAdapter extends BaseRuntimeAdapter {
|
|
198
|
+
readonly runtimeType: "codex-cli";
|
|
199
|
+
readonly displayName = "OpenAI Codex";
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Creates a RuntimeAdapter for the specified runtime type.
|
|
203
|
+
*
|
|
204
|
+
* Uses the existing RuntimeServiceFactory and session backend to construct
|
|
205
|
+
* the appropriate adapter. Requires the session backend to be initialized
|
|
206
|
+
* first (via createSessionBackend()).
|
|
207
|
+
*
|
|
208
|
+
* @param runtimeType - The runtime type ('claude-code', 'gemini-cli', 'codex-cli')
|
|
209
|
+
* @param projectRoot - The project root directory (for runtime config resolution)
|
|
210
|
+
* @returns A RuntimeAdapter instance for the specified runtime
|
|
211
|
+
* @throws Error if session backend is not initialized or runtime type is unknown
|
|
212
|
+
*
|
|
213
|
+
* @example
|
|
214
|
+
* ```typescript
|
|
215
|
+
* const adapter = getRuntimeAdapter('claude-code', '/home/user/project');
|
|
216
|
+
* await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
|
|
217
|
+
* ```
|
|
218
|
+
*/
|
|
219
|
+
export declare function getRuntimeAdapter(runtimeType: RuntimeType, projectRoot: string): RuntimeAdapter;
|
|
220
|
+
/**
|
|
221
|
+
* Returns the list of all supported runtime types.
|
|
222
|
+
*
|
|
223
|
+
* @returns Array of RuntimeType values
|
|
224
|
+
*/
|
|
225
|
+
export declare function getSupportedRuntimeTypes(): RuntimeType[];
|
|
226
|
+
/**
|
|
227
|
+
* Checks whether a given string is a supported runtime type.
|
|
228
|
+
*
|
|
229
|
+
* @param value - The string to check
|
|
230
|
+
* @returns True if the value is a valid RuntimeType
|
|
231
|
+
*/
|
|
232
|
+
export declare function isSupportedRuntime(value: string): value is RuntimeType;
|
|
233
|
+
export {};
|
|
234
|
+
//# sourceMappingURL=runtime-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapter.d.ts","sourceRoot":"","sources":["../../../../../backend/src/services/runtime-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Adapter Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified, pluggable interface for managing AI runtime sessions.
|
|
5
|
+
* Each adapter encapsulates the full lifecycle of a specific runtime (Claude Code,
|
|
6
|
+
* Gemini CLI, Codex): starting a session, writing input, reading output, and stopping.
|
|
7
|
+
*
|
|
8
|
+
* This replaces the need to coordinate between ISessionBackend, SessionCommandHelper,
|
|
9
|
+
* and RuntimeAgentService manually — the adapter handles it all.
|
|
10
|
+
*
|
|
11
|
+
* @module services/runtime-adapter
|
|
12
|
+
*/
|
|
13
|
+
import { RUNTIME_TYPES } from '../constants.js';
|
|
14
|
+
import { RuntimeServiceFactory } from './agent/runtime-service.factory.js';
|
|
15
|
+
import { getSessionBackendSync, createSessionCommandHelper, } from './session/index.js';
|
|
16
|
+
// ========================= Base Adapter =========================
|
|
17
|
+
/**
|
|
18
|
+
* Base adapter that delegates to the existing RuntimeAgentService and ISessionBackend.
|
|
19
|
+
*
|
|
20
|
+
* Concrete adapters extend this class and provide their runtime type.
|
|
21
|
+
* The base handles all common operations — subclasses only need to override
|
|
22
|
+
* behavior that differs from the default.
|
|
23
|
+
*/
|
|
24
|
+
class BaseRuntimeAdapter {
|
|
25
|
+
sessionBackend;
|
|
26
|
+
sessionHelper;
|
|
27
|
+
runtimeService;
|
|
28
|
+
constructor(sessionBackend, sessionHelper, runtimeService) {
|
|
29
|
+
this.sessionBackend = sessionBackend;
|
|
30
|
+
this.sessionHelper = sessionHelper;
|
|
31
|
+
this.runtimeService = runtimeService;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Start a new agent session with the runtime CLI.
|
|
35
|
+
*
|
|
36
|
+
* Creates a PTY shell, sets environment variables, and executes the
|
|
37
|
+
* runtime initialization script.
|
|
38
|
+
*
|
|
39
|
+
* @param config - Session start configuration
|
|
40
|
+
*/
|
|
41
|
+
async start(config) {
|
|
42
|
+
const { sessionName, projectPath, runtimeFlags, promptFilePath, env } = config;
|
|
43
|
+
// Create PTY session
|
|
44
|
+
await this.sessionHelper.createSession(sessionName, projectPath);
|
|
45
|
+
// Set environment variables
|
|
46
|
+
if (env) {
|
|
47
|
+
for (const [key, value] of Object.entries(env)) {
|
|
48
|
+
await this.sessionHelper.setEnvironmentVariable(sessionName, key, value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Execute runtime-specific initialization
|
|
52
|
+
await this.runtimeService.executeRuntimeInitScript(sessionName, projectPath, runtimeFlags, promptFilePath);
|
|
53
|
+
}
|
|
54
|
+
/** @inheritdoc */
|
|
55
|
+
async stop(sessionName) {
|
|
56
|
+
await this.sessionBackend.killSession(sessionName);
|
|
57
|
+
}
|
|
58
|
+
/** @inheritdoc */
|
|
59
|
+
async write(sessionName, data) {
|
|
60
|
+
await this.sessionHelper.sendMessage(sessionName, data);
|
|
61
|
+
}
|
|
62
|
+
/** @inheritdoc */
|
|
63
|
+
async getOutput(sessionName, lines) {
|
|
64
|
+
return this.sessionHelper.capturePane(sessionName, lines);
|
|
65
|
+
}
|
|
66
|
+
/** @inheritdoc */
|
|
67
|
+
isRunning(sessionName) {
|
|
68
|
+
return this.sessionBackend.sessionExists(sessionName);
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
async waitForReady(sessionName, timeout = 60000) {
|
|
72
|
+
return this.runtimeService.waitForRuntimeReady(sessionName, timeout);
|
|
73
|
+
}
|
|
74
|
+
/** @inheritdoc */
|
|
75
|
+
async detectRuntime(sessionName) {
|
|
76
|
+
return this.runtimeService.detectRuntimeWithCommand(sessionName, true);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ========================= Concrete Adapters =========================
|
|
80
|
+
/**
|
|
81
|
+
* Adapter for Anthropic's Claude Code CLI.
|
|
82
|
+
*
|
|
83
|
+
* Full implementation — Claude Code is the default runtime.
|
|
84
|
+
* Handles Claude-specific initialization, detection (slash command palette),
|
|
85
|
+
* and MCP configuration.
|
|
86
|
+
*/
|
|
87
|
+
export class ClaudeCodeAdapter extends BaseRuntimeAdapter {
|
|
88
|
+
runtimeType = RUNTIME_TYPES.CLAUDE_CODE;
|
|
89
|
+
displayName = 'Claude Code';
|
|
90
|
+
/**
|
|
91
|
+
* Start a Claude Code session.
|
|
92
|
+
*
|
|
93
|
+
* Extends the base start with Claude-specific post-initialization
|
|
94
|
+
* (MCP server configuration).
|
|
95
|
+
*
|
|
96
|
+
* @param config - Session start configuration
|
|
97
|
+
*/
|
|
98
|
+
async start(config) {
|
|
99
|
+
await super.start(config);
|
|
100
|
+
await this.runtimeService.postInitialize(config.sessionName, config.projectPath);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Adapter for Google's Gemini CLI.
|
|
105
|
+
*
|
|
106
|
+
* Stub implementation — basic structure in place for future development.
|
|
107
|
+
* Uses the base adapter behavior which delegates to GeminiRuntimeService.
|
|
108
|
+
*/
|
|
109
|
+
export class GeminiCliAdapter extends BaseRuntimeAdapter {
|
|
110
|
+
runtimeType = RUNTIME_TYPES.GEMINI_CLI;
|
|
111
|
+
displayName = 'Gemini CLI';
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Adapter for OpenAI's Codex CLI.
|
|
115
|
+
*
|
|
116
|
+
* Stub implementation — basic structure in place for future development.
|
|
117
|
+
* Uses the base adapter behavior which delegates to CodexRuntimeService.
|
|
118
|
+
*/
|
|
119
|
+
export class CodexAdapter extends BaseRuntimeAdapter {
|
|
120
|
+
runtimeType = RUNTIME_TYPES.CODEX_CLI;
|
|
121
|
+
displayName = 'OpenAI Codex';
|
|
122
|
+
}
|
|
123
|
+
// ========================= Factory =========================
|
|
124
|
+
/**
|
|
125
|
+
* Creates a RuntimeAdapter for the specified runtime type.
|
|
126
|
+
*
|
|
127
|
+
* Uses the existing RuntimeServiceFactory and session backend to construct
|
|
128
|
+
* the appropriate adapter. Requires the session backend to be initialized
|
|
129
|
+
* first (via createSessionBackend()).
|
|
130
|
+
*
|
|
131
|
+
* @param runtimeType - The runtime type ('claude-code', 'gemini-cli', 'codex-cli')
|
|
132
|
+
* @param projectRoot - The project root directory (for runtime config resolution)
|
|
133
|
+
* @returns A RuntimeAdapter instance for the specified runtime
|
|
134
|
+
* @throws Error if session backend is not initialized or runtime type is unknown
|
|
135
|
+
*
|
|
136
|
+
* @example
|
|
137
|
+
* ```typescript
|
|
138
|
+
* const adapter = getRuntimeAdapter('claude-code', '/home/user/project');
|
|
139
|
+
* await adapter.start({ sessionName: 'agent-1', projectPath: '/project' });
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function getRuntimeAdapter(runtimeType, projectRoot) {
|
|
143
|
+
const backend = getSessionBackendSync();
|
|
144
|
+
if (!backend) {
|
|
145
|
+
throw new Error('Session backend not initialized. Call createSessionBackend() before getRuntimeAdapter().');
|
|
146
|
+
}
|
|
147
|
+
const sessionHelper = createSessionCommandHelper(backend);
|
|
148
|
+
const runtimeService = RuntimeServiceFactory.createWithHelper(runtimeType, sessionHelper, projectRoot);
|
|
149
|
+
switch (runtimeType) {
|
|
150
|
+
case RUNTIME_TYPES.CLAUDE_CODE:
|
|
151
|
+
return new ClaudeCodeAdapter(backend, sessionHelper, runtimeService);
|
|
152
|
+
case RUNTIME_TYPES.GEMINI_CLI:
|
|
153
|
+
return new GeminiCliAdapter(backend, sessionHelper, runtimeService);
|
|
154
|
+
case RUNTIME_TYPES.CODEX_CLI:
|
|
155
|
+
return new CodexAdapter(backend, sessionHelper, runtimeService);
|
|
156
|
+
default: {
|
|
157
|
+
// Fallback to Claude Code for unrecognized types
|
|
158
|
+
const fallbackService = RuntimeServiceFactory.createWithHelper(RUNTIME_TYPES.CLAUDE_CODE, sessionHelper, projectRoot);
|
|
159
|
+
return new ClaudeCodeAdapter(backend, sessionHelper, fallbackService);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Returns the list of all supported runtime types.
|
|
165
|
+
*
|
|
166
|
+
* @returns Array of RuntimeType values
|
|
167
|
+
*/
|
|
168
|
+
export function getSupportedRuntimeTypes() {
|
|
169
|
+
return RuntimeServiceFactory.getAvailableRuntimeTypes();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Checks whether a given string is a supported runtime type.
|
|
173
|
+
*
|
|
174
|
+
* @param value - The string to check
|
|
175
|
+
* @returns True if the value is a valid RuntimeType
|
|
176
|
+
*/
|
|
177
|
+
export function isSupportedRuntime(value) {
|
|
178
|
+
return RuntimeServiceFactory.isRuntimeTypeSupported(value);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=runtime-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-adapter.js","sourceRoot":"","sources":["../../../../../backend/src/services/runtime-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Credentials Persistence Service
|
|
3
|
+
*
|
|
4
|
+
* Persists Slack tokens to ~/.crewly/slack-credentials.json so that
|
|
5
|
+
* tokens configured via the /settings UI survive server restarts.
|
|
6
|
+
* The file is written with 0600 permissions to protect secrets.
|
|
7
|
+
*
|
|
8
|
+
* @module services/slack/slack-credentials
|
|
9
|
+
*/
|
|
10
|
+
import { SlackConfig } from '../../types/slack.types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Save Slack credentials to disk with restricted file permissions (0600).
|
|
13
|
+
*
|
|
14
|
+
* @param config - The SlackConfig to persist.
|
|
15
|
+
*/
|
|
16
|
+
export declare function saveSlackCredentials(config: SlackConfig): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Load saved Slack credentials from disk.
|
|
19
|
+
*
|
|
20
|
+
* @returns SlackConfig if credentials file exists and is valid, null otherwise.
|
|
21
|
+
*/
|
|
22
|
+
export declare function loadSlackCredentials(): Promise<SlackConfig | null>;
|
|
23
|
+
/**
|
|
24
|
+
* Delete saved Slack credentials from disk.
|
|
25
|
+
*/
|
|
26
|
+
export declare function deleteSlackCredentials(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Check if saved Slack credentials exist on disk.
|
|
29
|
+
*
|
|
30
|
+
* @returns True if the credentials file exists.
|
|
31
|
+
*/
|
|
32
|
+
export declare function hasSavedCredentials(): Promise<boolean>;
|
|
33
|
+
//# sourceMappingURL=slack-credentials.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-credentials.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-credentials.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AA6BzD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB7E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBxE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,CAS5D"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Credentials Persistence Service
|
|
3
|
+
*
|
|
4
|
+
* Persists Slack tokens to ~/.crewly/slack-credentials.json so that
|
|
5
|
+
* tokens configured via the /settings UI survive server restarts.
|
|
6
|
+
* The file is written with 0600 permissions to protect secrets.
|
|
7
|
+
*
|
|
8
|
+
* @module services/slack/slack-credentials
|
|
9
|
+
*/
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as fs from 'fs/promises';
|
|
12
|
+
import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
|
|
13
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
14
|
+
const logger = LoggerService.getInstance().createComponentLogger('SlackCredentials');
|
|
15
|
+
const CREDENTIALS_FILE = 'slack-credentials.json';
|
|
16
|
+
/**
|
|
17
|
+
* Get the path to the Slack credentials file.
|
|
18
|
+
*
|
|
19
|
+
* @returns Absolute path to ~/.crewly/slack-credentials.json
|
|
20
|
+
*/
|
|
21
|
+
function getCredentialsPath() {
|
|
22
|
+
const crewlyHome = path.join(process.env.HOME || '~', '.crewly');
|
|
23
|
+
return path.join(crewlyHome, CREDENTIALS_FILE);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Save Slack credentials to disk with restricted file permissions (0600).
|
|
27
|
+
*
|
|
28
|
+
* @param config - The SlackConfig to persist.
|
|
29
|
+
*/
|
|
30
|
+
export async function saveSlackCredentials(config) {
|
|
31
|
+
const filePath = getCredentialsPath();
|
|
32
|
+
const credentials = {
|
|
33
|
+
botToken: config.botToken,
|
|
34
|
+
appToken: config.appToken,
|
|
35
|
+
signingSecret: config.signingSecret,
|
|
36
|
+
defaultChannelId: config.defaultChannelId,
|
|
37
|
+
allowedUserIds: config.allowedUserIds,
|
|
38
|
+
};
|
|
39
|
+
await atomicWriteJson(filePath, credentials);
|
|
40
|
+
// Restrict permissions to owner-only (0600)
|
|
41
|
+
try {
|
|
42
|
+
await fs.chmod(filePath, 0o600);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.warn('Failed to set credentials file permissions', {
|
|
46
|
+
error: error instanceof Error ? error.message : String(error),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
logger.info('Slack credentials saved to disk');
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Load saved Slack credentials from disk.
|
|
53
|
+
*
|
|
54
|
+
* @returns SlackConfig if credentials file exists and is valid, null otherwise.
|
|
55
|
+
*/
|
|
56
|
+
export async function loadSlackCredentials() {
|
|
57
|
+
const filePath = getCredentialsPath();
|
|
58
|
+
const credentials = await safeReadJson(filePath, null, logger);
|
|
59
|
+
if (!credentials || !credentials.botToken || !credentials.appToken || !credentials.signingSecret) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
botToken: credentials.botToken,
|
|
64
|
+
appToken: credentials.appToken,
|
|
65
|
+
signingSecret: credentials.signingSecret,
|
|
66
|
+
defaultChannelId: credentials.defaultChannelId,
|
|
67
|
+
allowedUserIds: credentials.allowedUserIds,
|
|
68
|
+
socketMode: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Delete saved Slack credentials from disk.
|
|
73
|
+
*/
|
|
74
|
+
export async function deleteSlackCredentials() {
|
|
75
|
+
const filePath = getCredentialsPath();
|
|
76
|
+
try {
|
|
77
|
+
await fs.unlink(filePath);
|
|
78
|
+
logger.info('Slack credentials removed from disk');
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error.code !== 'ENOENT') {
|
|
82
|
+
logger.warn('Failed to delete credentials file', {
|
|
83
|
+
error: error instanceof Error ? error.message : String(error),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Check if saved Slack credentials exist on disk.
|
|
90
|
+
*
|
|
91
|
+
* @returns True if the credentials file exists.
|
|
92
|
+
*/
|
|
93
|
+
export async function hasSavedCredentials() {
|
|
94
|
+
const filePath = getCredentialsPath();
|
|
95
|
+
try {
|
|
96
|
+
await fs.access(filePath);
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=slack-credentials.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-credentials.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-credentials.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AAErF,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD;;;;GAIG;AACH,SAAS,kBAAkB;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAChD,CAAC;AAaD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAmB;IAC7D,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,MAAM,WAAW,GAA8B;QAC9C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,cAAc,EAAE,MAAM,CAAC,cAAc;KACrC,CAAC;IAEF,MAAM,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE7C,4CAA4C;IAC5C,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE;YACzD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACzC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,MAAM,WAAW,GAAG,MAAM,YAAY,CACrC,QAAQ,EACR,IAAI,EACJ,MAAM,CACN,CAAC;IAEF,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO;QACN,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,aAAa,EAAE,WAAW,CAAC,aAAa;QACxC,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;QAC9C,cAAc,EAAE,WAAW,CAAC,cAAc;QAC1C,UAAU,EAAE,IAAI;KAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC3C,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAChD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACxC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IAEtC,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC"}
|
|
@@ -31,6 +31,13 @@ export declare function isSlackConfigured(): boolean;
|
|
|
31
31
|
* @returns SlackConfig object or null if not configured
|
|
32
32
|
*/
|
|
33
33
|
export declare function getSlackConfigFromEnv(): SlackConfig | null;
|
|
34
|
+
/**
|
|
35
|
+
* Get Slack configuration from environment variables or saved credentials.
|
|
36
|
+
* Environment variables take priority over saved credentials.
|
|
37
|
+
*
|
|
38
|
+
* @returns SlackConfig object or null if not configured
|
|
39
|
+
*/
|
|
40
|
+
export declare function getSlackConfig(): Promise<SlackConfig | null>;
|
|
34
41
|
/**
|
|
35
42
|
* Options for Slack initialization
|
|
36
43
|
*/
|
|
@@ -39,7 +46,8 @@ export interface SlackInitOptions {
|
|
|
39
46
|
messageQueueService?: MessageQueueService;
|
|
40
47
|
}
|
|
41
48
|
/**
|
|
42
|
-
* Initialize Slack integration if environment variables
|
|
49
|
+
* Initialize Slack integration if configured via environment variables
|
|
50
|
+
* or saved credentials.
|
|
43
51
|
*
|
|
44
52
|
* This function is designed to be called during application startup.
|
|
45
53
|
* It safely handles cases where Slack is not configured.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"slack-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAKjF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAM3C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,GAAG,IAAI,CAiB1D;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBlE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,CA4B1B;AAED;;;;GAIG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { getSlackService } from './slack.service.js';
|
|
10
10
|
import { getSlackOrchestratorBridge } from './slack-orchestrator-bridge.js';
|
|
11
|
+
import { loadSlackCredentials } from './slack-credentials.service.js';
|
|
11
12
|
import { LoggerService } from '../core/logger.service.js';
|
|
12
13
|
const logger = LoggerService.getInstance().createComponentLogger('SlackInitializer');
|
|
13
14
|
/**
|
|
@@ -42,7 +43,35 @@ export function getSlackConfigFromEnv() {
|
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
|
-
*
|
|
46
|
+
* Get Slack configuration from environment variables or saved credentials.
|
|
47
|
+
* Environment variables take priority over saved credentials.
|
|
48
|
+
*
|
|
49
|
+
* @returns SlackConfig object or null if not configured
|
|
50
|
+
*/
|
|
51
|
+
export async function getSlackConfig() {
|
|
52
|
+
// Env vars take priority
|
|
53
|
+
const envConfig = getSlackConfigFromEnv();
|
|
54
|
+
if (envConfig) {
|
|
55
|
+
return envConfig;
|
|
56
|
+
}
|
|
57
|
+
// Fall back to saved credentials
|
|
58
|
+
try {
|
|
59
|
+
const savedConfig = await loadSlackCredentials();
|
|
60
|
+
if (savedConfig) {
|
|
61
|
+
logger.info('Loaded Slack credentials from saved config');
|
|
62
|
+
return savedConfig;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
logger.warn('Failed to load saved Slack credentials', {
|
|
67
|
+
error: error instanceof Error ? error.message : String(error),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Initialize Slack integration if configured via environment variables
|
|
74
|
+
* or saved credentials.
|
|
46
75
|
*
|
|
47
76
|
* This function is designed to be called during application startup.
|
|
48
77
|
* It safely handles cases where Slack is not configured.
|
|
@@ -65,7 +94,7 @@ export function getSlackConfigFromEnv() {
|
|
|
65
94
|
* ```
|
|
66
95
|
*/
|
|
67
96
|
export async function initializeSlackIfConfigured(options) {
|
|
68
|
-
const config =
|
|
97
|
+
const config = await getSlackConfig();
|
|
69
98
|
if (!config) {
|
|
70
99
|
logger.info('Not configured - skipping initialization');
|
|
71
100
|
return { attempted: false, success: false };
|