crewly 1.5.11 → 1.5.13
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/config/constants.ts +3 -3
- package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +73 -0
- package/config/roles/architect/prompt.md +9 -0
- package/config/roles/backend-developer/prompt.md +9 -0
- package/config/roles/content-strategist/prompt.md +10 -0
- package/config/roles/designer/prompt.md +9 -0
- package/config/roles/developer/prompt.md +9 -0
- package/config/roles/frontend-developer/prompt.md +9 -0
- package/config/roles/fullstack-dev/prompt.md +9 -0
- package/config/roles/generalist/prompt.md +9 -0
- package/config/roles/ops/prompt.md +9 -0
- package/config/roles/product-manager/prompt.md +9 -0
- package/config/roles/qa/prompt.md +9 -0
- package/config/roles/qa-engineer/prompt.md +9 -0
- package/config/roles/researcher/prompt.md +9 -0
- package/config/roles/sales/prompt.md +9 -0
- package/config/roles/support/prompt.md +9 -0
- package/config/roles/team-leader/prompt.md +11 -0
- package/config/roles/tpm/prompt.md +9 -0
- package/config/roles/ux-designer/prompt.md +9 -0
- package/config/skills/_common/lib.sh +31 -0
- package/config/skills/_common/lib.test.sh +164 -0
- package/config/skills/agent/core/block-task/execute.sh +3 -1
- package/config/skills/agent/core/pipe-to-sink/execute.sh +41 -0
- package/config/skills/agent/core/read-task/execute.sh +3 -1
- package/config/skills/agent/core/report-progress/execute.sh +3 -1
- package/config/skills/agent/screenshot-compare/SKILL.md +75 -0
- package/config/skills/agent/screenshot-compare/execute.sh +182 -0
- package/config/skills/agent/screenshot-compare/skill.json +10 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +85 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +306 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +10 -0
- package/config/skills/orchestrator/cancel-cron/SKILL.md +44 -0
- package/config/skills/orchestrator/create-cron/SKILL.md +58 -0
- package/config/skills/orchestrator/list-cron/SKILL.md +51 -0
- package/config/skills/orchestrator/update-cron/SKILL.md +52 -0
- package/dist/backend/backend/src/constants.d.ts +7 -4
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +6 -3
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +21 -2
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +167 -29
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.routes.js +7 -3
- package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts +47 -0
- package/dist/backend/backend/src/controllers/data/data.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js +201 -0
- package/dist/backend/backend/src/controllers/data/data.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts +18 -0
- package/dist/backend/backend/src/controllers/data/data.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js +44 -0
- package/dist/backend/backend/src/controllers/data/data.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts +3 -2
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js +5 -3
- package/dist/backend/backend/src/controllers/monitoring/token-usage.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts +4 -0
- package/dist/backend/backend/src/controllers/system/cron-task.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/cron-task.controller.js +20 -0
- package/dist/backend/backend/src/controllers/system/cron-task.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 +18 -0
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts +32 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js +61 -0
- package/dist/backend/backend/src/controllers/team/team-export.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +7 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +37 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -1
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- 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 +6 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +17 -2
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +2 -2
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts +134 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js +291 -0
- package/dist/backend/backend/src/services/agent/task-planning.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts +11 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js +47 -18
- package/dist/backend/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +14 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +47 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +13 -9
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +44 -12
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +176 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +441 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts +162 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js +350 -0
- package/dist/backend/backend/src/services/browser/browser-relay-adapter.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +27 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +2 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/team-export.service.d.ts +103 -0
- package/dist/backend/backend/src/services/core/team-export.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/team-export.service.js +182 -0
- package/dist/backend/backend/src/services/core/team-export.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts +160 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js +434 -0
- package/dist/backend/backend/src/services/data/data-object-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts +190 -0
- package/dist/backend/backend/src/services/data/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/data-object.types.js +143 -0
- package/dist/backend/backend/src/services/data/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts +108 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js +290 -0
- package/dist/backend/backend/src/services/data/schema-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts +87 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js +188 -0
- package/dist/backend/backend/src/services/data/sink-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-router.service.js +7 -0
- package/dist/backend/backend/src/services/messaging/message-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +55 -2
- package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js +89 -5
- package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js +1 -1
- package/dist/backend/backend/src/services/session/pty/pty-session-backend.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +105 -14
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +400 -123
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/cron-task.types.d.ts +1 -1
- package/dist/backend/backend/src/types/data-object.types.d.ts +117 -0
- package/dist/backend/backend/src/types/data-object.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/data-object.types.js +23 -0
- package/dist/backend/backend/src/types/data-object.types.js.map +1 -0
- package/dist/backend/backend/src/types/settings.types.js +1 -1
- package/dist/backend/config/constants.d.ts +3 -3
- package/dist/backend/config/constants.js +3 -3
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +7 -4
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +6 -3
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +1 -1
- package/dist/cli/config/constants.d.ts +3 -3
- package/dist/cli/config/constants.js +3 -3
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/index-371b68d4.css +33 -0
- package/frontend/dist/assets/{index-9af2ea40.js → index-506f70da.js} +321 -321
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-b19b2478.css +0 -33
|
@@ -46,11 +46,36 @@ export class CommunicationModule {
|
|
|
46
46
|
}
|
|
47
47
|
return this.buildWorkerComms(config);
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Build a skill call example snippet. For gemini-cli runtime, uses --file
|
|
51
|
+
* pattern to avoid shell escaping EOF errors. For other runtimes, uses
|
|
52
|
+
* inline JSON argument.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Module configuration with runtime type
|
|
55
|
+
* @param skillPath - Relative path to the skill (e.g., 'core/report-status')
|
|
56
|
+
* @param jsonExample - Example JSON string for inline mode
|
|
57
|
+
* @returns Formatted bash code block
|
|
58
|
+
*/
|
|
59
|
+
buildSkillExample(config, skillPath, jsonExample) {
|
|
60
|
+
if (config.runtimeType === 'gemini-cli') {
|
|
61
|
+
return `\`\`\`bash
|
|
62
|
+
printf '%s' '${jsonExample}' > /tmp/crewly_skill_input.json
|
|
63
|
+
bash ${config.agentSkillsPath}/${skillPath}/execute.sh --file /tmp/crewly_skill_input.json
|
|
64
|
+
\`\`\``;
|
|
65
|
+
}
|
|
66
|
+
return `\`\`\`bash
|
|
67
|
+
bash ${config.agentSkillsPath}/${skillPath}/execute.sh '${jsonExample}'
|
|
68
|
+
\`\`\``;
|
|
69
|
+
}
|
|
49
70
|
/**
|
|
50
71
|
* Full orchestrator communication spec — Slack, Chat UI, NOTIFY markers,
|
|
51
72
|
* thread management, message formatting, and notification protocol.
|
|
52
73
|
*/
|
|
53
74
|
buildOrchestratorComms(config) {
|
|
75
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
76
|
+
const sendMessageJson = '{"to":"<session>","message":"<msg>"}';
|
|
77
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
78
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
54
79
|
return `## Communication Protocol
|
|
55
80
|
|
|
56
81
|
### Message Channels
|
|
@@ -91,31 +116,35 @@ You have access to multiple communication channels:
|
|
|
91
116
|
- When switching channels, summarize context for the new channel
|
|
92
117
|
- Track channelId and threadTs for Slack thread replies
|
|
93
118
|
|
|
119
|
+
### Acknowledge-First Rule (MANDATORY)
|
|
120
|
+
When you receive a message from the user (via Slack, Chat UI, or Google Chat):
|
|
121
|
+
1. **Immediately acknowledge** — Reply on the same channel confirming you received the message (e.g., "Got it, working on this now")
|
|
122
|
+
2. **Then execute** — Start working on the task after the acknowledgment is sent
|
|
123
|
+
3. **Never work silently** — The user should always see an immediate response before you start any long-running work
|
|
124
|
+
|
|
125
|
+
This prevents the user from wondering if their message was received or if the agent is stuck.
|
|
126
|
+
|
|
94
127
|
### Communication Skills
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
\`\`\`
|
|
98
|
-
\`\`\`bash
|
|
99
|
-
bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<session>","message":"<msg>"}'
|
|
100
|
-
\`\`\``;
|
|
128
|
+
${reportExample}
|
|
129
|
+
${sendExample}`;
|
|
101
130
|
}
|
|
102
131
|
/**
|
|
103
132
|
* TL communication — delegation-focused messaging plus basic user comms.
|
|
104
133
|
*/
|
|
105
134
|
buildTLComms(config) {
|
|
135
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
136
|
+
const sendMessageJson = '{"to":"<worker-session>","message":"<task or feedback>"}';
|
|
137
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
138
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
106
139
|
return `## Communication Protocol
|
|
107
140
|
|
|
108
141
|
### Reporting to Orchestrator
|
|
109
142
|
Use \`report-status\` to keep the orchestrator informed of progress:
|
|
110
|
-
|
|
111
|
-
bash ${config.agentSkillsPath}/core/report-status/execute.sh '{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}'
|
|
112
|
-
\`\`\`
|
|
143
|
+
${reportExample}
|
|
113
144
|
|
|
114
145
|
### Messaging Workers
|
|
115
146
|
Use \`send-message\` to communicate with your subordinates:
|
|
116
|
-
|
|
117
|
-
bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<worker-session>","message":"<task or feedback>"}'
|
|
118
|
-
\`\`\`
|
|
147
|
+
${sendExample}
|
|
119
148
|
|
|
120
149
|
### Communication Rules
|
|
121
150
|
1. **Report up** — Keep orchestrator informed of progress and blockers
|
|
@@ -128,19 +157,19 @@ bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<worker-sess
|
|
|
128
157
|
* Worker communication — compact report-status and send-message only.
|
|
129
158
|
*/
|
|
130
159
|
buildWorkerComms(config) {
|
|
160
|
+
const reportStatusJson = `{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}`;
|
|
161
|
+
const sendMessageJson = '{"to":"<session>","message":"<msg>"}';
|
|
162
|
+
const reportExample = this.buildSkillExample(config, 'core/report-status', reportStatusJson);
|
|
163
|
+
const sendExample = this.buildSkillExample(config, 'core/send-message', sendMessageJson);
|
|
131
164
|
return `## Communication
|
|
132
165
|
|
|
133
166
|
### Reporting Progress
|
|
134
167
|
Use \`report-status\` to update your team leader on task progress:
|
|
135
|
-
|
|
136
|
-
bash ${config.agentSkillsPath}/core/report-status/execute.sh '{"sessionName":"${config.sessionName}","status":"<status>","summary":"<summary>","projectPath":"${config.projectPath || config.projectRoot}"}'
|
|
137
|
-
\`\`\`
|
|
168
|
+
${reportExample}
|
|
138
169
|
|
|
139
170
|
### Messaging
|
|
140
171
|
Use \`send-message\` to communicate with other agents:
|
|
141
|
-
|
|
142
|
-
bash ${config.agentSkillsPath}/core/send-message/execute.sh '{"to":"<session>","message":"<msg>"}'
|
|
143
|
-
\`\`\`
|
|
172
|
+
${sendExample}
|
|
144
173
|
|
|
145
174
|
### Rules
|
|
146
175
|
- Report progress periodically so your team leader stays informed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"communication.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE5F;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,mBAAmB;IAC/B,IAAI,GAAG,eAAe,CAAC;IACvB,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,OAAqB;QAClC,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC/B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC;QAEzC,4EAA4E;QAC5E,IAAI,cAAc,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACpF,IAAI,QAAQ,EAAE,CAAC;gBACd,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,MAAoB;QAClD,
|
|
1
|
+
{"version":3,"file":"communication.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/communication.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,20 @@ export declare class SkillsReferenceModule implements PromptModule {
|
|
|
34
34
|
* Workers get narrow read+execute scope; orchestrators get broader coordination scope.
|
|
35
35
|
*/
|
|
36
36
|
private buildCapabilities;
|
|
37
|
+
/**
|
|
38
|
+
* Build safe skill calling guide for runtimes with shell escaping issues.
|
|
39
|
+
*
|
|
40
|
+
* Gemini CLI's run_shell_command mangles JSON arguments containing quotes,
|
|
41
|
+
* backticks, and parentheses, causing "unexpected EOF" shell errors.
|
|
42
|
+
* This guide instructs the agent to write JSON to a temp file first,
|
|
43
|
+
* then pass --file <path> to avoid shell interpretation entirely.
|
|
44
|
+
*
|
|
45
|
+
* Only included for gemini-cli runtime type.
|
|
46
|
+
*
|
|
47
|
+
* @param config - Module configuration with runtime type
|
|
48
|
+
* @returns Safe calling guide markdown, or null if not needed
|
|
49
|
+
*/
|
|
50
|
+
private buildSafeCallGuide;
|
|
37
51
|
/**
|
|
38
52
|
* Build communication and memory tool instructions.
|
|
39
53
|
*/
|
package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,
|
|
1
|
+
{"version":3,"file":"skills-reference.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE1E;;;;;;;;GAQG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACzD,IAAI,SAAuB;IAC3B,QAAQ,SAAK;IACb,SAAS,SAAO;IAChB,WAAW,UAAS;IAEpB;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI7C;;;;;;OAMG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAalD;;OAEG;IACH,OAAO,CAAC,eAAe;IAoDvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAkB1B"}
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
export class SkillsReferenceModule {
|
|
11
11
|
name = 'skills_references';
|
|
12
12
|
priority = 5;
|
|
13
|
-
maxTokens =
|
|
14
|
-
compactable =
|
|
13
|
+
maxTokens = 800;
|
|
14
|
+
compactable = false;
|
|
15
15
|
/**
|
|
16
16
|
* Always included — agents need to know how to use skills.
|
|
17
17
|
*/
|
|
@@ -29,7 +29,12 @@ export class SkillsReferenceModule {
|
|
|
29
29
|
const coreSkills = this.buildCoreSkills(config);
|
|
30
30
|
const capabilities = this.buildCapabilities(config);
|
|
31
31
|
const communication = this.buildCommunication(config);
|
|
32
|
-
|
|
32
|
+
const safeCallGuide = this.buildSafeCallGuide(config);
|
|
33
|
+
const parts = [coreSkills, capabilities, communication];
|
|
34
|
+
if (safeCallGuide) {
|
|
35
|
+
parts.push(safeCallGuide);
|
|
36
|
+
}
|
|
37
|
+
return parts.join('\n\n');
|
|
33
38
|
}
|
|
34
39
|
/**
|
|
35
40
|
* Build the core skills list — available to all roles.
|
|
@@ -46,7 +51,7 @@ export class SkillsReferenceModule {
|
|
|
46
51
|
];
|
|
47
52
|
// Orchestrators and TLs get additional coordination skills
|
|
48
53
|
if (config.role === 'orchestrator') {
|
|
49
|
-
lines.push('- `core/send-message` — send messages to agents', '- `core/get-sops` — request relevant SOPs', '- Orchestrator skills at `config/skills/orchestrator/`:', ' - `schedule-check` — schedule future check-in reminders', ' - `subscribe-event` — subscribe to agent lifecycle events', ' - `reply-slack` / `reply-chat` — respond to user messages', ' - `send-to-remote` / `reply-remote` — send/reply to other Crewly machines', ' - `list-devices` — discover connected Crewly devices', ' - `delegate-task` — assign work to agents', ' - `get-team-status` / `get-agent-status` — monitor team state');
|
|
54
|
+
lines.push('- `core/send-message` — send messages to agents', '- `core/get-sops` — request relevant SOPs', '- Orchestrator skills at `config/skills/orchestrator/`:', ' - `schedule-check` — schedule future check-in reminders', ' - `subscribe-event` — subscribe to agent lifecycle events', ' - `reply-slack` / `reply-chat` — respond to user messages', ' - `reply-gchat` — respond to Google Chat messages', ' - `send-to-remote` / `reply-remote` — send/reply to other Crewly machines', ' - `list-devices` — discover connected Crewly devices', ' - `delegate-task` / `assign-task` — assign work to agents', ' - `get-team-status` / `get-agent-status` — monitor team state', ' - `create-team` / `update-team` / `start-team` / `stop-team` — team management', ' - `start-agent` / `stop-agent` / `terminate-agent` — agent lifecycle', ' - `create-cron` / `list-cron` / `update-cron` / `cancel-cron` — recurring tasks', '', '**IMPORTANT:** You have ALL skills listed above. Never say you lack a skill — if unsure, check the catalog.');
|
|
50
55
|
}
|
|
51
56
|
else if (config.canDelegate) {
|
|
52
57
|
lines.push('- `core/send-message` — communicate with subordinates and orchestrator', '- `core/get-sops` — request relevant SOPs', `- Team leader skills at \`${config.tlSkillsPath}/\`:`, ' - `delegate-task` — assign tasks to subordinates', ' - `verify-output` — check completed work quality', ' - `schedule-check` — schedule follow-up reminders');
|
|
@@ -74,6 +79,44 @@ export class SkillsReferenceModule {
|
|
|
74
79
|
}
|
|
75
80
|
return lines.join('\n');
|
|
76
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Build safe skill calling guide for runtimes with shell escaping issues.
|
|
84
|
+
*
|
|
85
|
+
* Gemini CLI's run_shell_command mangles JSON arguments containing quotes,
|
|
86
|
+
* backticks, and parentheses, causing "unexpected EOF" shell errors.
|
|
87
|
+
* This guide instructs the agent to write JSON to a temp file first,
|
|
88
|
+
* then pass --file <path> to avoid shell interpretation entirely.
|
|
89
|
+
*
|
|
90
|
+
* Only included for gemini-cli runtime type.
|
|
91
|
+
*
|
|
92
|
+
* @param config - Module configuration with runtime type
|
|
93
|
+
* @returns Safe calling guide markdown, or null if not needed
|
|
94
|
+
*/
|
|
95
|
+
buildSafeCallGuide(config) {
|
|
96
|
+
if (config.runtimeType !== 'gemini-cli') {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
return `## Safe Skill Calling (MANDATORY)
|
|
100
|
+
|
|
101
|
+
**CRITICAL:** When calling any bash skill, you MUST use the \`--file\` pattern to avoid shell escaping errors.
|
|
102
|
+
Passing JSON directly as a shell argument will cause "unexpected EOF" errors when the content contains quotes, backticks, or parentheses.
|
|
103
|
+
|
|
104
|
+
### Required Pattern
|
|
105
|
+
\`\`\`bash
|
|
106
|
+
# Step 1: Write JSON to a temp file (printf preserves all special characters)
|
|
107
|
+
printf '%s' '{"sessionName":"my-agent","status":"done","summary":"Fixed the bug"}' > /tmp/crewly_skill_input.json
|
|
108
|
+
|
|
109
|
+
# Step 2: Call the skill with --file flag
|
|
110
|
+
bash ${config.agentSkillsPath}/core/report-status/execute.sh --file /tmp/crewly_skill_input.json
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
### Rules
|
|
114
|
+
1. **ALWAYS** use \`printf '%s' '<json>' > /tmp/crewly_skill_input.json\` then \`--file\`
|
|
115
|
+
2. **NEVER** pass JSON directly as a shell argument: \`bash execute.sh '{"key":"value with 'quotes'"}'\`
|
|
116
|
+
3. Use \`/tmp/crewly_skill_input.json\` as the temp file (overwritten each call)
|
|
117
|
+
4. This applies to ALL skills: report-status, send-message, remember, recall, delegate-task, reply-slack, reply-gchat, etc.
|
|
118
|
+
5. For skills that support named flags (reply-slack, reply-gchat), you may also use \`--text-file\` for the message body`;
|
|
119
|
+
}
|
|
77
120
|
/**
|
|
78
121
|
* Build communication and memory tool instructions.
|
|
79
122
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,OAAO,qBAAqB;IACjC,IAAI,GAAG,mBAAmB,CAAC;IAC3B,QAAQ,GAAG,CAAC,CAAC;IACb,SAAS,GAAG,GAAG,CAAC;IAChB,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser Bridge Service
|
|
2
|
+
* Crewly in Chrome — Browser Bridge Service
|
|
3
3
|
*
|
|
4
|
-
* Provides a raw WebSocket server that the Crewly Chrome
|
|
4
|
+
* Provides a raw WebSocket server that the Crewly in Chrome extension connects to.
|
|
5
5
|
* Acts as a bridge between REST API calls (from remote-browser skill) and the
|
|
6
6
|
* Chrome Extension. When a REST endpoint receives a command, it forwards it to
|
|
7
7
|
* the connected Chrome Extension via WebSocket and waits for the response.
|
|
@@ -47,14 +47,18 @@ export interface BrowserCommandResponse {
|
|
|
47
47
|
/** Error message on failure */
|
|
48
48
|
error?: string;
|
|
49
49
|
}
|
|
50
|
-
/** Status information about the
|
|
50
|
+
/** Status information about the Crewly in Chrome bridge */
|
|
51
51
|
export interface BrowserBridgeStatus {
|
|
52
|
-
/** Whether
|
|
52
|
+
/** Whether a Chrome Extension is reachable (direct WS or Cloud relay) */
|
|
53
53
|
connected: boolean;
|
|
54
|
-
/** Number of connected Chrome Extension clients */
|
|
54
|
+
/** Number of directly connected Chrome Extension clients via WebSocket */
|
|
55
55
|
clientCount: number;
|
|
56
56
|
/** WebSocket server path */
|
|
57
57
|
wsPath: string;
|
|
58
|
+
/** Whether the Cloud relay path to an Extension is available */
|
|
59
|
+
relayAvailable?: boolean;
|
|
60
|
+
/** Cloud device ID of the relay-connected Extension (null if not discovered) */
|
|
61
|
+
relayDeviceId?: string | null;
|
|
58
62
|
}
|
|
59
63
|
/**
|
|
60
64
|
* BrowserBridgeService manages WebSocket connections from the Crewly Chrome
|
|
@@ -112,15 +116,15 @@ export declare class BrowserBridgeService {
|
|
|
112
116
|
*/
|
|
113
117
|
sendCommand(tool: string, params?: Record<string, unknown>, timeoutMs?: number, agentName?: string): Promise<BrowserCommandResponse>;
|
|
114
118
|
/**
|
|
115
|
-
* Get the current bridge status.
|
|
119
|
+
* Get the current bridge status, including relay availability.
|
|
116
120
|
*
|
|
117
|
-
* @returns Status information
|
|
121
|
+
* @returns Status information with direct WS and relay details
|
|
118
122
|
*/
|
|
119
123
|
getStatus(): BrowserBridgeStatus;
|
|
120
124
|
/**
|
|
121
|
-
* Check if
|
|
125
|
+
* Check if a Chrome Extension is reachable (direct WS or Cloud relay).
|
|
122
126
|
*
|
|
123
|
-
* @returns True if connected
|
|
127
|
+
* @returns True if connected via direct WS or relay is available
|
|
124
128
|
*/
|
|
125
129
|
isConnected(): boolean;
|
|
126
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAIjD,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC7B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,IAAI,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC9B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACtC,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,
|
|
1
|
+
{"version":3,"file":"browser-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAmB,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAIjD,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC7B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,EAAE,EAAE,SAAS,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,IAAI,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qDAAqD;AACrD,MAAM,WAAW,cAAc;IAC9B,yDAAyD;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,sBAAsB;IACtC,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IACnC,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,oBAAoB;IAO1C;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;;OASG;IACH,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IA0FpC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA+BrB;;;;;;;;;;OAUG;IACG,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,GAAE,MAAoD,EAC/D,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,sBAAsB,CAAC;IAsClC;;;;OAIG;IACH,SAAS,IAAI,mBAAmB;IA2BhC;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAetB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAWvB;;OAEG;IACH,IAAI,IAAI,IAAI;CA0BZ"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser Bridge Service
|
|
2
|
+
* Crewly in Chrome — Browser Bridge Service
|
|
3
3
|
*
|
|
4
|
-
* Provides a raw WebSocket server that the Crewly Chrome
|
|
4
|
+
* Provides a raw WebSocket server that the Crewly in Chrome extension connects to.
|
|
5
5
|
* Acts as a bridge between REST API calls (from remote-browser skill) and the
|
|
6
6
|
* Chrome Extension. When a REST endpoint receives a command, it forwards it to
|
|
7
7
|
* the connected Chrome Extension via WebSocket and waits for the response.
|
|
@@ -127,7 +127,7 @@ export class BrowserBridgeService {
|
|
|
127
127
|
this.wss.on('error', (err) => {
|
|
128
128
|
this.logger.error('WebSocket server error', { error: err.message });
|
|
129
129
|
});
|
|
130
|
-
this.logger.info('
|
|
130
|
+
this.logger.info('Crewly in Chrome WebSocket server attached', {
|
|
131
131
|
path: BROWSER_BRIDGE_CONSTANTS.WS_PATH,
|
|
132
132
|
});
|
|
133
133
|
}
|
|
@@ -179,8 +179,15 @@ export class BrowserBridgeService {
|
|
|
179
179
|
*/
|
|
180
180
|
async sendCommand(tool, params, timeoutMs = BROWSER_BRIDGE_CONSTANTS.COMMAND_TIMEOUT_MS, agentName) {
|
|
181
181
|
const client = this.getActiveClient();
|
|
182
|
+
// Fallback to Cloud relay if no direct WS client connected
|
|
182
183
|
if (!client) {
|
|
183
|
-
|
|
184
|
+
const { BrowserRelayAdapter } = await import('./browser-relay-adapter.service.js');
|
|
185
|
+
const relayAdapter = BrowserRelayAdapter.getInstance();
|
|
186
|
+
if (relayAdapter.isAvailable()) {
|
|
187
|
+
this.logger.info('No direct WS client, routing via Cloud relay', { tool });
|
|
188
|
+
return relayAdapter.sendViaRelay(tool, params, timeoutMs, agentName);
|
|
189
|
+
}
|
|
190
|
+
throw new Error('No Chrome Extension connected (direct WS or Cloud relay)');
|
|
184
191
|
}
|
|
185
192
|
const id = `cmd-${++this.commandCounter}-${Date.now()}`;
|
|
186
193
|
const command = { id, tool, params };
|
|
@@ -204,24 +211,49 @@ export class BrowserBridgeService {
|
|
|
204
211
|
});
|
|
205
212
|
}
|
|
206
213
|
/**
|
|
207
|
-
* Get the current bridge status.
|
|
214
|
+
* Get the current bridge status, including relay availability.
|
|
208
215
|
*
|
|
209
|
-
* @returns Status information
|
|
216
|
+
* @returns Status information with direct WS and relay details
|
|
210
217
|
*/
|
|
211
218
|
getStatus() {
|
|
219
|
+
const directConnected = this.clients.size > 0;
|
|
220
|
+
let relayAvailable = false;
|
|
221
|
+
let relayDeviceId = null;
|
|
222
|
+
try {
|
|
223
|
+
// Dynamic import avoided — use synchronous check
|
|
224
|
+
const { BrowserRelayAdapter } = require('./browser-relay-adapter.service.js');
|
|
225
|
+
const adapter = BrowserRelayAdapter.getInstance();
|
|
226
|
+
relayAvailable = adapter.isAvailable();
|
|
227
|
+
relayDeviceId = adapter.getExtensionDeviceId();
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
// Relay adapter not available
|
|
231
|
+
}
|
|
212
232
|
return {
|
|
213
|
-
connected:
|
|
233
|
+
connected: directConnected || relayAvailable,
|
|
214
234
|
clientCount: this.clients.size,
|
|
215
235
|
wsPath: BROWSER_BRIDGE_CONSTANTS.WS_PATH,
|
|
236
|
+
relayAvailable,
|
|
237
|
+
relayDeviceId,
|
|
216
238
|
};
|
|
217
239
|
}
|
|
218
240
|
/**
|
|
219
|
-
* Check if
|
|
241
|
+
* Check if a Chrome Extension is reachable (direct WS or Cloud relay).
|
|
220
242
|
*
|
|
221
|
-
* @returns True if connected
|
|
243
|
+
* @returns True if connected via direct WS or relay is available
|
|
222
244
|
*/
|
|
223
245
|
isConnected() {
|
|
224
|
-
|
|
246
|
+
if (this.clients.size > 0)
|
|
247
|
+
return true;
|
|
248
|
+
// Check relay fallback
|
|
249
|
+
try {
|
|
250
|
+
const { BrowserRelayAdapter } = require('./browser-relay-adapter.service.js');
|
|
251
|
+
const adapter = BrowserRelayAdapter.getInstance();
|
|
252
|
+
return adapter.isAvailable();
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
225
257
|
}
|
|
226
258
|
/**
|
|
227
259
|
* Get the first active (OPEN) client, cleaning up stale ones.
|
|
@@ -245,7 +277,7 @@ export class BrowserBridgeService {
|
|
|
245
277
|
// Clear all pending commands
|
|
246
278
|
for (const [id, pending] of this.pendingCommands) {
|
|
247
279
|
clearTimeout(pending.timer);
|
|
248
|
-
pending.reject(new Error('
|
|
280
|
+
pending.reject(new Error('Crewly in Chrome bridge shutting down'));
|
|
249
281
|
this.pendingCommands.delete(id);
|
|
250
282
|
}
|
|
251
283
|
// Close all client connections
|
|
@@ -263,7 +295,7 @@ export class BrowserBridgeService {
|
|
|
263
295
|
this.wss.close();
|
|
264
296
|
this.wss = null;
|
|
265
297
|
}
|
|
266
|
-
this.logger.info('
|
|
298
|
+
this.logger.info('Crewly in Chrome bridge stopped');
|
|
267
299
|
}
|
|
268
300
|
}
|
|
269
301
|
//# sourceMappingURL=browser-bridge.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-bridge.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Proxy Service
|
|
3
|
+
*
|
|
4
|
+
* Connects to the Cloud Relay as an 'agent' and provides addressed messaging
|
|
5
|
+
* to browser instances. Any Crewly agent can call browser tools through this
|
|
6
|
+
* service without needing relay pairing.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* Agent → /api/browser/* → BrowserProxyService → Cloud Relay → Extension
|
|
10
|
+
* Extension → Cloud Relay → BrowserProxyService → HTTP response → Agent
|
|
11
|
+
*
|
|
12
|
+
* @module services/browser/browser-proxy.service
|
|
13
|
+
*/
|
|
14
|
+
import type { BrowserCommandResponse } from './browser-bridge.service.js';
|
|
15
|
+
/** Minimal info about a connected browser instance. */
|
|
16
|
+
export interface BrowserInstanceInfo {
|
|
17
|
+
/** Persistent UUID of the extension install */
|
|
18
|
+
instanceId: string;
|
|
19
|
+
/** User-set friendly name */
|
|
20
|
+
instanceName: string;
|
|
21
|
+
/** Relay session ID */
|
|
22
|
+
sessionId: string;
|
|
23
|
+
}
|
|
24
|
+
/** Connection state of the proxy to the cloud relay. */
|
|
25
|
+
export type ProxyConnectionState = 'disconnected' | 'connecting' | 'connected';
|
|
26
|
+
/**
|
|
27
|
+
* BrowserProxyService connects to the Cloud Relay and routes browser commands
|
|
28
|
+
* to specific extension instances using addressed messaging (relay_to).
|
|
29
|
+
*
|
|
30
|
+
* Singleton — one relay connection per backend instance.
|
|
31
|
+
*/
|
|
32
|
+
export declare class BrowserProxyService {
|
|
33
|
+
private static instance;
|
|
34
|
+
private readonly logger;
|
|
35
|
+
/** WebSocket connection to cloud relay */
|
|
36
|
+
private ws;
|
|
37
|
+
/** Current relay session ID (assigned after registration) */
|
|
38
|
+
private sessionId;
|
|
39
|
+
/** Connection state */
|
|
40
|
+
private state;
|
|
41
|
+
/** Map of commandId → pending command awaiting response */
|
|
42
|
+
private pendingCommands;
|
|
43
|
+
/** Known browser instances from relay browser_list + browser_event */
|
|
44
|
+
private instances;
|
|
45
|
+
/** Command counter for unique IDs */
|
|
46
|
+
private commandCounter;
|
|
47
|
+
/** Heartbeat interval timer */
|
|
48
|
+
private heartbeatTimer;
|
|
49
|
+
/** Reconnect timer */
|
|
50
|
+
private reconnectTimer;
|
|
51
|
+
/** Auth token for relay registration */
|
|
52
|
+
private authToken;
|
|
53
|
+
/** Relay WebSocket URL */
|
|
54
|
+
private relayUrl;
|
|
55
|
+
/** Whether auto-reconnect is enabled */
|
|
56
|
+
private autoReconnect;
|
|
57
|
+
private constructor();
|
|
58
|
+
/**
|
|
59
|
+
* Get the singleton instance.
|
|
60
|
+
*
|
|
61
|
+
* @returns BrowserProxyService instance
|
|
62
|
+
*/
|
|
63
|
+
static getInstance(): BrowserProxyService;
|
|
64
|
+
/**
|
|
65
|
+
* Reset singleton instance (for testing).
|
|
66
|
+
*/
|
|
67
|
+
static resetInstance(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Connect to the cloud relay WebSocket server.
|
|
70
|
+
*
|
|
71
|
+
* Registers as role 'agent' with a pairing code matching the backend identity.
|
|
72
|
+
* After connection, requests the browser instance list and subscribes to events.
|
|
73
|
+
*
|
|
74
|
+
* @param token - JWT auth token for relay registration
|
|
75
|
+
* @param relayUrl - Optional relay URL override
|
|
76
|
+
*/
|
|
77
|
+
connect(token: string, relayUrl?: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Disconnect from the cloud relay.
|
|
80
|
+
*/
|
|
81
|
+
disconnect(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Check if the proxy is connected to the relay and has browser instances available.
|
|
84
|
+
*
|
|
85
|
+
* @returns True if connected and at least one browser instance is known
|
|
86
|
+
*/
|
|
87
|
+
isAvailable(): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Check if the proxy has a live relay connection (even if no browsers registered yet).
|
|
90
|
+
*
|
|
91
|
+
* @returns True if WebSocket to relay is connected
|
|
92
|
+
*/
|
|
93
|
+
isConnected(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Get the current connection state.
|
|
96
|
+
*
|
|
97
|
+
* @returns Connection state string
|
|
98
|
+
*/
|
|
99
|
+
getState(): ProxyConnectionState;
|
|
100
|
+
/**
|
|
101
|
+
* Get the list of known browser instances.
|
|
102
|
+
*
|
|
103
|
+
* @returns Array of browser instance info
|
|
104
|
+
*/
|
|
105
|
+
getInstances(): BrowserInstanceInfo[];
|
|
106
|
+
/**
|
|
107
|
+
* Send a browser command to a specific instance (or the only connected one).
|
|
108
|
+
*
|
|
109
|
+
* Routes via relay_to addressed messaging. The command is forwarded by the
|
|
110
|
+
* relay server to the matching browser extension, which executes the tool
|
|
111
|
+
* and returns the response via relay_response.
|
|
112
|
+
*
|
|
113
|
+
* @param tool - Tool name (e.g. 'navigate', 'screenshot', 'getTabs')
|
|
114
|
+
* @param params - Tool parameters
|
|
115
|
+
* @param instance - Target instance name or ID (optional if only 1 connected)
|
|
116
|
+
* @param timeoutMs - Command timeout in milliseconds
|
|
117
|
+
* @param agentName - Agent name for extension banner display
|
|
118
|
+
* @returns Response from the Chrome Extension
|
|
119
|
+
* @throws Error if no instances available, target not found, or timeout
|
|
120
|
+
*/
|
|
121
|
+
sendCommand(tool: string, params?: Record<string, unknown>, instance?: string, timeoutMs?: number, agentName?: string): Promise<BrowserCommandResponse>;
|
|
122
|
+
/**
|
|
123
|
+
* Resolve which browser instance to target.
|
|
124
|
+
*
|
|
125
|
+
* @param instance - Explicit instance name/ID, or undefined for auto-select
|
|
126
|
+
* @returns Matching BrowserInstanceInfo or null
|
|
127
|
+
*/
|
|
128
|
+
private resolveInstance;
|
|
129
|
+
/**
|
|
130
|
+
* Handle incoming WebSocket message from the relay.
|
|
131
|
+
*
|
|
132
|
+
* @param raw - Raw JSON string
|
|
133
|
+
*/
|
|
134
|
+
private handleMessage;
|
|
135
|
+
/**
|
|
136
|
+
* Handle browser_list message from relay.
|
|
137
|
+
*
|
|
138
|
+
* @param instances - Array of browser instance info from relay
|
|
139
|
+
*/
|
|
140
|
+
private handleBrowserList;
|
|
141
|
+
/**
|
|
142
|
+
* Handle browser_event (connected/disconnected/updated) from relay.
|
|
143
|
+
*
|
|
144
|
+
* @param msg - Event message
|
|
145
|
+
*/
|
|
146
|
+
private handleBrowserEvent;
|
|
147
|
+
/**
|
|
148
|
+
* Handle a relay payload (response from a browser instance).
|
|
149
|
+
*
|
|
150
|
+
* @param payload - JSON string containing the command response
|
|
151
|
+
*/
|
|
152
|
+
private handleRelayPayload;
|
|
153
|
+
/**
|
|
154
|
+
* Send a raw JSON message to the relay WebSocket.
|
|
155
|
+
*
|
|
156
|
+
* @param msg - Message object to serialize and send
|
|
157
|
+
*/
|
|
158
|
+
private sendRaw;
|
|
159
|
+
/**
|
|
160
|
+
* Start heartbeat interval to keep relay connection alive.
|
|
161
|
+
*/
|
|
162
|
+
private startHeartbeat;
|
|
163
|
+
/**
|
|
164
|
+
* Stop heartbeat interval.
|
|
165
|
+
*/
|
|
166
|
+
private stopHeartbeat;
|
|
167
|
+
/**
|
|
168
|
+
* Handle disconnection — clean up and optionally reconnect.
|
|
169
|
+
*/
|
|
170
|
+
private handleDisconnect;
|
|
171
|
+
/**
|
|
172
|
+
* Full cleanup — close WebSocket, stop timers, clear state.
|
|
173
|
+
*/
|
|
174
|
+
private cleanup;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=browser-proxy.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-proxy.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-proxy.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAG1E,uDAAuD;AACvD,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD,wDAAwD;AACxD,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAC;AAW/E;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,0CAA0C;IAC1C,OAAO,CAAC,EAAE,CAA0B;IACpC,6DAA6D;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,uBAAuB;IACvB,OAAO,CAAC,KAAK,CAAwC;IACrD,2DAA2D;IAC3D,OAAO,CAAC,eAAe,CAA+C;IACtE,sEAAsE;IACtE,OAAO,CAAC,SAAS,CAA+C;IAChE,qCAAqC;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B,+BAA+B;IAC/B,OAAO,CAAC,cAAc,CAA+C;IACrE,sBAAsB;IACtB,OAAO,CAAC,cAAc,CAA8C;IACpE,wCAAwC;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,0BAA0B;IAC1B,OAAO,CAAC,QAAQ,CAA6B;IAC7C,wCAAwC;IACxC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;OAQG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IA0C/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAKlB;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,QAAQ,IAAI,oBAAoB;IAIhC;;;;OAIG;IACH,YAAY,IAAI,mBAAmB,EAAE;IAIrC;;;;;;;;;;;;;;OAcG;IACG,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,GAAE,MAAoD,EAC/D,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC;IAkDlC;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAkBvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAyDrB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;;;OAIG;IACH,OAAO,CAAC,OAAO;IAMf;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;OAEG;IACH,OAAO,CAAC,OAAO;CA4BhB"}
|