crewly 1.20.179 → 1.20.181
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/roles/team-leader/prompt.md +2 -2
- package/config/roles/team-leader/tl-addon.md +2 -2
- package/config/skills/agent/core/ask-owner/SKILL.md +79 -0
- package/config/skills/agent/core/ask-owner/execute.sh +66 -0
- package/config/skills/agent/core/ask-owner/execute.test.sh +62 -0
- package/config/skills/agent/core/project-tickets/SKILL.md +21 -9
- package/config/skills/agent/core/project-tickets/execute.sh +28 -9
- package/config/skills/agent/core/project-tickets/execute.test.sh +12 -4
- package/config/skills/agent/core/reply/SKILL.md +22 -5
- package/config/skills/agent/core/reply/execute.sh +12 -5
- package/config/skills/agent/core/reply/execute.test.sh +8 -0
- package/config/skills/agent/core/schedule-followup/SKILL.md +8 -0
- package/config/skills/agent/core/schedule-followup/execute.sh +7 -0
- package/config/skills/agent/remote-browser/SKILL.md +28 -8
- package/config/slack-app-manifest.json +5 -1
- package/config/slack-master-app-manifest.json +7 -2
- package/dist/backend/backend/src/constants.d.ts +99 -5
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +106 -5
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts +2 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js +15 -1
- package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +3 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +54 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +67 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +215 -0
- package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +8 -5
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +51 -12
- package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +4 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +135 -2
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +6 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.d.ts +1 -1
- package/dist/backend/backend/src/services/boot/boot-announce.service.js +13 -13
- package/dist/backend/backend/src/services/boot/boot-announce.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts +202 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.js +533 -0
- package/dist/backend/backend/src/services/browser/browser-approval.service.js.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts +24 -0
- 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 +55 -0
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +51 -0
- package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-session.service.js +82 -3
- package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts +125 -0
- package/dist/backend/backend/src/services/browser/held-action-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/held-action-store.js +141 -0
- package/dist/backend/backend/src/services/browser/held-action-store.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js +6 -6
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts +3 -3
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js +14 -13
- package/dist/backend/backend/src/services/cloud/cloud-disconnect-notice.utils.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts +155 -0
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-card.js +337 -0
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +83 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.js +226 -0
- package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.d.ts +34 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.js +64 -0
- package/dist/backend/backend/src/services/decisions/decision-routing.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts +80 -0
- package/dist/backend/backend/src/services/decisions/decision-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision-store.js +151 -0
- package/dist/backend/backend/src/services/decisions/decision-store.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +338 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js +729 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts +70 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +172 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.js +137 -0
- package/dist/backend/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +165 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.js +239 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +134 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +217 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +1 -30
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -22
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +2 -15
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +8 -22
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +11 -12
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +27 -52
- package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +6 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +3 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +12 -12
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +16 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +56 -2
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.service.js +2 -2
- package/dist/backend/backend/src/services/system/auto-update.service.js.map +1 -1
- package/dist/backend/backend/src/services/system/auto-update.utils.js +2 -2
- package/dist/backend/backend/src/services/system/auto-update.utils.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +168 -0
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/decision.types.js +13 -0
- package/dist/backend/backend/src/types/decision.types.js.map +1 -0
- package/dist/backend/backend/src/types/slack.types.d.ts +30 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/trigger.types.d.ts +17 -0
- package/dist/backend/backend/src/types/v2/trigger.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/trigger.types.js +17 -0
- package/dist/backend/backend/src/types/v2/trigger.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +99 -5
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +106 -5
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +12 -12
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +16 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +56 -2
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/system/auto-update.utils.js +2 -2
- package/dist/cli/backend/src/services/system/auto-update.utils.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +30 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/trigger.types.d.ts +17 -0
- package/dist/cli/backend/src/types/v2/trigger.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/trigger.types.js +17 -0
- package/dist/cli/backend/src/types/v2/trigger.types.js.map +1 -1
- package/frontend/dist/assets/index-04d192f8.css +42 -0
- package/frontend/dist/assets/{index-69af46c3.js → index-4271e95e.js} +259 -259
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-cdc52122.css +0 -42
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner approval of held browser actions.
|
|
3
|
+
*
|
|
4
|
+
* When `BrowserSessionService.authorize` holds an irreversible click (send,
|
|
5
|
+
* submit, pay, delete…), this service:
|
|
6
|
+
*
|
|
7
|
+
* 1. persists the hold under CREWLY_HOME ({@link HeldActionStore});
|
|
8
|
+
* 2. asks the owner with a Slack decision card (kind `browser_action`,
|
|
9
|
+
* "Let it" / "No", never auto-approved) posted by the agent's own bot in
|
|
10
|
+
* the thread of the work item it is on;
|
|
11
|
+
* 3. applies the answer, whichever place it came from — the card's button,
|
|
12
|
+
* a reaction, a thread reply (批准 / 可以 / yes, 不行 / no), the decisions
|
|
13
|
+
* dashboard, or the Browser page of the dashboard / portal — to the one
|
|
14
|
+
* held action, and tells the agent;
|
|
15
|
+
* 4. at the deadline ({@link BROWSER_APPROVAL_CONSTANTS.DEADLINE_MS}) the
|
|
16
|
+
* answer is No;
|
|
17
|
+
* 5. after a restart, re-attaches a hold whose tab comes back in the
|
|
18
|
+
* extension's tab inventory, and expires the rest (card updated, agent
|
|
19
|
+
* told to redo the step).
|
|
20
|
+
*
|
|
21
|
+
* Approval works exactly like the dashboard's approve always has: it grants
|
|
22
|
+
* the agent ONE pass for its next attempt and tells it to go ahead. Crewly
|
|
23
|
+
* does not replay the click itself — the agent knows what it was in the
|
|
24
|
+
* middle of, and after a wait the page may have changed.
|
|
25
|
+
*
|
|
26
|
+
* Every outcome is applied in one place, {@link BrowserApprovalService.onSettled},
|
|
27
|
+
* which the decision service calls when a `browser_action` card settles.
|
|
28
|
+
* Paths without a card (no Slack, card not created yet) apply it directly.
|
|
29
|
+
*
|
|
30
|
+
* @module services/browser/browser-approval.service
|
|
31
|
+
*/
|
|
32
|
+
import { BROWSER_APPROVAL_CONSTANTS } from '../../constants.js';
|
|
33
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
34
|
+
const APPROVE_KEY = 'a';
|
|
35
|
+
const REJECT_KEY = 'b';
|
|
36
|
+
/**
|
|
37
|
+
* Strip a URL to "host/path" for the card.
|
|
38
|
+
*
|
|
39
|
+
* @param url - URL the agent targeted
|
|
40
|
+
* @returns "visa.careerengine.us/subscribe", or undefined
|
|
41
|
+
*/
|
|
42
|
+
export function placeOf(url) {
|
|
43
|
+
if (!url)
|
|
44
|
+
return undefined;
|
|
45
|
+
try {
|
|
46
|
+
const u = new URL(url);
|
|
47
|
+
const p = u.pathname.replace(/\/+$/, '');
|
|
48
|
+
return `${u.host}${p}`;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* The visible name of what a click targets, from its params: the text the
|
|
56
|
+
* agent passed, else a quoted name in the selector (`:has-text("Submit")`,
|
|
57
|
+
* `[aria-label="Send"]`, `text=Pay`), else the selector itself.
|
|
58
|
+
*
|
|
59
|
+
* @param params - Params of the call
|
|
60
|
+
* @returns Button text / selector, or undefined
|
|
61
|
+
*/
|
|
62
|
+
export function controlName(params) {
|
|
63
|
+
const text = typeof params?.text === 'string' ? params.text.trim() : '';
|
|
64
|
+
if (text)
|
|
65
|
+
return text;
|
|
66
|
+
const selector = typeof params?.selector === 'string' ? params.selector.trim() : '';
|
|
67
|
+
if (!selector)
|
|
68
|
+
return undefined;
|
|
69
|
+
const quoted = /:(?:has-text|text|contains)\(\s*["'](.+?)["']\s*\)/i.exec(selector) ??
|
|
70
|
+
/\[(?:aria-label|title|value|name)\s*[*^$~|]?=\s*["'](.+?)["']\s*\]/i.exec(selector) ??
|
|
71
|
+
/^text\s*=\s*["']?(.+?)["']?$/i.exec(selector);
|
|
72
|
+
return quoted ? quoted[1].trim() : selector;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* What the agent wants to do, in a few words: `click "Submit"`, `press Enter`.
|
|
76
|
+
*
|
|
77
|
+
* @param tool - Tool it called
|
|
78
|
+
* @param params - Params it called it with
|
|
79
|
+
* @returns Short phrase (≤ 100 characters)
|
|
80
|
+
*/
|
|
81
|
+
export function describeTarget(tool, params) {
|
|
82
|
+
const clip = (s) => (s.length > 80 ? `${s.slice(0, 79)}…` : s);
|
|
83
|
+
const name = controlName(params);
|
|
84
|
+
switch (tool) {
|
|
85
|
+
case 'click':
|
|
86
|
+
return name ? `click "${clip(name)}"` : 'click on the page';
|
|
87
|
+
case 'pressKey':
|
|
88
|
+
return `press ${clip(String(params?.key ?? 'Enter'))}`;
|
|
89
|
+
case 'selectOption':
|
|
90
|
+
return name ? `choose an option in "${clip(name)}"` : 'choose an option';
|
|
91
|
+
case 'setFileInput':
|
|
92
|
+
return 'attach a file';
|
|
93
|
+
case 'executeJs':
|
|
94
|
+
case 'executeScript':
|
|
95
|
+
return 'run a script that acts on the page';
|
|
96
|
+
default:
|
|
97
|
+
return clip(tool);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The card's question: "Vera wants to click "Submit" on visa.careerengine.us/subscribe — it looks like submitting and can't be undone."
|
|
102
|
+
*
|
|
103
|
+
* @param agentName - Agent display name
|
|
104
|
+
* @param action - Held action
|
|
105
|
+
* @returns One line (≤ 280 characters)
|
|
106
|
+
*/
|
|
107
|
+
export function approvalQuestion(agentName, action) {
|
|
108
|
+
const q = `${agentName} wants to ${action.target}${action.where ? ` on ${action.where}` : ''} — it looks like ${action.matched} and can't be undone.`;
|
|
109
|
+
return q.length > 280 ? `${q.slice(0, 279)}…` : q;
|
|
110
|
+
}
|
|
111
|
+
/** The line a held agent is given about where the owner answers. */
|
|
112
|
+
export const CARD_ASKED_LINE = `Say exactly: "${BROWSER_APPROVAL_CONSTANTS.AGENT_SAYS}" Then stop.`;
|
|
113
|
+
/**
|
|
114
|
+
* Asks the owner about held browser actions and applies the answer.
|
|
115
|
+
*/
|
|
116
|
+
export class BrowserApprovalService {
|
|
117
|
+
static instance = null;
|
|
118
|
+
deps;
|
|
119
|
+
logger;
|
|
120
|
+
now;
|
|
121
|
+
/** Holds restored from disk, waiting for their tab to come back: pendingId → since (ms) */
|
|
122
|
+
awaitingRebind = new Map();
|
|
123
|
+
/** In-flight async work started from sync hooks (tests wait on it) */
|
|
124
|
+
inflight = new Set();
|
|
125
|
+
timer = null;
|
|
126
|
+
ticking = false;
|
|
127
|
+
restored = false;
|
|
128
|
+
/**
|
|
129
|
+
* @param deps - Collaborators
|
|
130
|
+
*/
|
|
131
|
+
constructor(deps) {
|
|
132
|
+
this.deps = deps;
|
|
133
|
+
this.logger = deps.logger ?? LoggerService.getInstance().createComponentLogger('BrowserApproval');
|
|
134
|
+
this.now = deps.now ?? (() => Date.now());
|
|
135
|
+
}
|
|
136
|
+
/** @returns The process-wide instance, or null before wiring */
|
|
137
|
+
static getInstance() {
|
|
138
|
+
return BrowserApprovalService.instance;
|
|
139
|
+
}
|
|
140
|
+
/** @param service - Instance to install (null clears) */
|
|
141
|
+
static setInstance(service) {
|
|
142
|
+
BrowserApprovalService.instance = service;
|
|
143
|
+
}
|
|
144
|
+
/** Start the retry / expiry tick. */
|
|
145
|
+
start() {
|
|
146
|
+
if (this.timer)
|
|
147
|
+
return;
|
|
148
|
+
this.timer = setInterval(() => void this.tick(), BROWSER_APPROVAL_CONSTANTS.TICK_MS);
|
|
149
|
+
this.timer.unref?.();
|
|
150
|
+
}
|
|
151
|
+
/** Stop the tick. */
|
|
152
|
+
stop() {
|
|
153
|
+
if (this.timer)
|
|
154
|
+
clearInterval(this.timer);
|
|
155
|
+
this.timer = null;
|
|
156
|
+
}
|
|
157
|
+
/** Wait for work started by the sync hooks (tests). */
|
|
158
|
+
async idle() {
|
|
159
|
+
while (this.inflight.size > 0)
|
|
160
|
+
await Promise.allSettled([...this.inflight]);
|
|
161
|
+
}
|
|
162
|
+
track(p) {
|
|
163
|
+
const wrapped = p.catch((err) => this.logger.warn('Browser approval step failed', { error: errText(err) }));
|
|
164
|
+
this.inflight.add(wrapped);
|
|
165
|
+
void wrapped.finally(() => this.inflight.delete(wrapped));
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Holding
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
/**
|
|
171
|
+
* An action was held: persist it and ask the owner with a card.
|
|
172
|
+
*
|
|
173
|
+
* @param session - Session holding it (`pending` set)
|
|
174
|
+
* @param params - Params of the held call (not persisted)
|
|
175
|
+
* @returns What the agent is told about where the owner answers
|
|
176
|
+
*/
|
|
177
|
+
onHeld(session, params) {
|
|
178
|
+
const pending = session.pending;
|
|
179
|
+
if (!pending)
|
|
180
|
+
return undefined;
|
|
181
|
+
const bound = this.deps.boundTabOf?.(session.agentSession);
|
|
182
|
+
const paramTab = typeof params?.tabId === 'number' ? params.tabId : undefined;
|
|
183
|
+
const action = {
|
|
184
|
+
pendingId: pending.id,
|
|
185
|
+
agentSession: session.agentSession,
|
|
186
|
+
...(session.agentName ? { agentName: session.agentName } : {}),
|
|
187
|
+
tool: pending.tool,
|
|
188
|
+
description: pending.description,
|
|
189
|
+
matched: pending.matched,
|
|
190
|
+
target: describeTarget(pending.tool, params),
|
|
191
|
+
...(placeOf(session.url) ? { where: placeOf(session.url) } : {}),
|
|
192
|
+
...(session.url ? { url: session.url } : {}),
|
|
193
|
+
...(typeof (paramTab ?? session.tabId ?? bound?.tabId) === 'number' ? { tabId: (paramTab ?? session.tabId ?? bound?.tabId) } : {}),
|
|
194
|
+
...(bound?.instanceId ? { instanceId: bound.instanceId } : {}),
|
|
195
|
+
raisedAt: pending.raisedAt,
|
|
196
|
+
status: 'pending',
|
|
197
|
+
};
|
|
198
|
+
const asking = this.deps.canAskInSlack();
|
|
199
|
+
this.track((async () => {
|
|
200
|
+
await this.deps.store.put(action);
|
|
201
|
+
if (asking)
|
|
202
|
+
await this.createCard(action);
|
|
203
|
+
})());
|
|
204
|
+
return asking ? CARD_ASKED_LINE : undefined;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create the card for a held action.
|
|
208
|
+
*
|
|
209
|
+
* @param action - The held action
|
|
210
|
+
*/
|
|
211
|
+
async createCard(action) {
|
|
212
|
+
const decisions = this.deps.decisions();
|
|
213
|
+
if (!decisions)
|
|
214
|
+
return;
|
|
215
|
+
await this.deps.store.update(action.pendingId, () => ({ cardTriedAt: this.now() }));
|
|
216
|
+
const agentName = action.agentName ?? (await this.deps.agentNameOf?.(action.agentSession).catch(() => undefined)) ?? action.agentSession;
|
|
217
|
+
const options = [
|
|
218
|
+
{ key: APPROVE_KEY, label: BROWSER_APPROVAL_CONSTANTS.APPROVE_LABEL, detail: 'do exactly this, once' },
|
|
219
|
+
{ key: REJECT_KEY, label: BROWSER_APPROVAL_CONSTANTS.REJECT_LABEL, detail: "don't do it" },
|
|
220
|
+
];
|
|
221
|
+
const subject = {
|
|
222
|
+
agentSession: action.agentSession,
|
|
223
|
+
agentName,
|
|
224
|
+
pendingId: action.pendingId,
|
|
225
|
+
...(action.where ? { where: action.where } : {}),
|
|
226
|
+
target: action.target,
|
|
227
|
+
matched: action.matched,
|
|
228
|
+
};
|
|
229
|
+
const decision = await decisions.askPrebuilt({
|
|
230
|
+
kind: 'browser_action',
|
|
231
|
+
asker: action.agentSession,
|
|
232
|
+
question: approvalQuestion(agentName, action),
|
|
233
|
+
options,
|
|
234
|
+
defaultKey: REJECT_KEY,
|
|
235
|
+
yesKey: APPROVE_KEY,
|
|
236
|
+
deadline: new Date(action.raisedAt + BROWSER_APPROVAL_CONSTANTS.DEADLINE_MS),
|
|
237
|
+
sensitive: 'browser_action',
|
|
238
|
+
browser: subject,
|
|
239
|
+
});
|
|
240
|
+
const linked = await this.deps.store.update(action.pendingId, (a) => (a.status === 'pending' ? { decisionId: decision.id, agentName } : null));
|
|
241
|
+
if (!linked) {
|
|
242
|
+
// Answered (e.g. on the Browser page) while the card was being made.
|
|
243
|
+
await decisions.cancelWhere((d) => d.id === decision.id, 'browser action already settled');
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
this.logger.info('Asked the owner about a held browser action', { pendingId: action.pendingId, decisionId: decision.id, posted: !!decision.card });
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* A hold was dropped without an answer: withdraw its card.
|
|
250
|
+
*
|
|
251
|
+
* @param _agentSession - Agent
|
|
252
|
+
* @param pendingId - The dropped hold
|
|
253
|
+
*/
|
|
254
|
+
onDropped(_agentSession, pendingId) {
|
|
255
|
+
this.track((async () => {
|
|
256
|
+
const action = await this.deps.store.settle(pendingId, 'dropped');
|
|
257
|
+
const decisions = this.deps.decisions();
|
|
258
|
+
if (action?.decisionId && decisions)
|
|
259
|
+
await decisions.cancelWhere((d) => d.id === action.decisionId, 'browser hold dropped');
|
|
260
|
+
})());
|
|
261
|
+
}
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
// Answers
|
|
264
|
+
// ---------------------------------------------------------------------------
|
|
265
|
+
/**
|
|
266
|
+
* A `browser_action` decision settled (button, reaction, reply, decisions
|
|
267
|
+
* dashboard, Browser page via {@link answerFromBrowserPage}, deadline,
|
|
268
|
+
* expiry or withdrawal). Applies it to the held action.
|
|
269
|
+
*
|
|
270
|
+
* @param decision - The settled decision
|
|
271
|
+
* @returns Note for the agent, or null
|
|
272
|
+
*/
|
|
273
|
+
async onSettled(decision) {
|
|
274
|
+
const pendingId = decision.browser?.pendingId;
|
|
275
|
+
if (!pendingId)
|
|
276
|
+
return null;
|
|
277
|
+
const action = await this.deps.store.get(pendingId);
|
|
278
|
+
if (!action || action.status !== 'pending')
|
|
279
|
+
return null;
|
|
280
|
+
let outcome;
|
|
281
|
+
if (decision.status === 'resolved')
|
|
282
|
+
outcome = decision.chosenKey === APPROVE_KEY ? 'approve' : 'reject';
|
|
283
|
+
else if (decision.status === 'defaulted')
|
|
284
|
+
outcome = 'timeout';
|
|
285
|
+
else if (decision.status === 'expired')
|
|
286
|
+
outcome = 'expire';
|
|
287
|
+
else if (decision.status === 'cancelled')
|
|
288
|
+
outcome = 'drop';
|
|
289
|
+
else
|
|
290
|
+
return null;
|
|
291
|
+
return this.apply(action, outcome);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* The owner answered on the Browser page (dashboard or portal). With a
|
|
295
|
+
* card, the answer goes through the card so it is updated too; without
|
|
296
|
+
* one it is applied directly.
|
|
297
|
+
*
|
|
298
|
+
* @param agentSession - Session holding the action
|
|
299
|
+
* @param pendingId - The hold being answered
|
|
300
|
+
* @param answer - What the owner chose
|
|
301
|
+
* @returns The updated session, or undefined when no such hold is waiting
|
|
302
|
+
*/
|
|
303
|
+
async answerFromBrowserPage(agentSession, pendingId, answer) {
|
|
304
|
+
const held = this.deps.sessions.getSession(agentSession)?.pending;
|
|
305
|
+
if (!held || held.id !== pendingId)
|
|
306
|
+
return undefined;
|
|
307
|
+
const action = await this.deps.store.get(pendingId);
|
|
308
|
+
const decisions = this.deps.decisions();
|
|
309
|
+
if (action?.status === 'pending' && action.decisionId && decisions) {
|
|
310
|
+
try {
|
|
311
|
+
await decisions.chooseFromDashboard(action.decisionId, answer === 'approve' ? APPROVE_KEY : REJECT_KEY);
|
|
312
|
+
const after = await this.deps.store.get(pendingId);
|
|
313
|
+
if (after?.status !== 'pending')
|
|
314
|
+
return this.deps.sessions.getSession(agentSession);
|
|
315
|
+
}
|
|
316
|
+
catch (err) {
|
|
317
|
+
this.logger.warn('Could not answer the browser card from the Browser page — applying directly', { pendingId, error: errText(err) });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
const fallback = action ?? {
|
|
321
|
+
pendingId,
|
|
322
|
+
agentSession,
|
|
323
|
+
tool: held.tool,
|
|
324
|
+
description: held.description,
|
|
325
|
+
matched: held.matched,
|
|
326
|
+
target: held.description,
|
|
327
|
+
raisedAt: held.raisedAt,
|
|
328
|
+
status: 'pending',
|
|
329
|
+
};
|
|
330
|
+
if (!action)
|
|
331
|
+
await this.deps.store.put(fallback);
|
|
332
|
+
const note = await this.apply(fallback, answer);
|
|
333
|
+
if (note)
|
|
334
|
+
await this.deps.tellAgent(agentSession, note).catch(() => undefined);
|
|
335
|
+
if (fallback.decisionId && decisions)
|
|
336
|
+
await decisions.cancelWhere((d) => d.id === fallback.decisionId, 'answered on the Browser page');
|
|
337
|
+
return this.deps.sessions.getSession(agentSession);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Apply an outcome to a held action (once) and say what the agent is told.
|
|
341
|
+
*/
|
|
342
|
+
async apply(action, outcome) {
|
|
343
|
+
const status = {
|
|
344
|
+
approve: 'approved',
|
|
345
|
+
reject: 'rejected',
|
|
346
|
+
timeout: 'timed_out',
|
|
347
|
+
expire: 'expired',
|
|
348
|
+
drop: 'dropped',
|
|
349
|
+
};
|
|
350
|
+
const settled = await this.deps.store.settle(action.pendingId, status[outcome]);
|
|
351
|
+
if (!settled)
|
|
352
|
+
return null;
|
|
353
|
+
this.awaitingRebind.delete(action.pendingId);
|
|
354
|
+
const what = `${action.target}${action.where ? ` on ${action.where}` : ''}`;
|
|
355
|
+
const held = this.deps.sessions.getSession(action.agentSession)?.pending;
|
|
356
|
+
const live = held?.id === action.pendingId;
|
|
357
|
+
this.logger.info('Held browser action settled', { pendingId: action.pendingId, agentSession: action.agentSession, outcome, live });
|
|
358
|
+
if (outcome === 'approve') {
|
|
359
|
+
if (!live) {
|
|
360
|
+
return `[BROWSER] The owner said Let it to: ${what} — but Crewly restarted and that held action is no longer attached to your tab. Redo the step: look at the page again, then retry it; it will be asked again.`;
|
|
361
|
+
}
|
|
362
|
+
// Exactly the dashboard's approve: one pass for the agent's next attempt.
|
|
363
|
+
this.deps.sessions.resolvePending(action.agentSession, action.pendingId, 'approve');
|
|
364
|
+
return `[BROWSER] The owner said Let it: ${what}. Go ahead with exactly that, once — retry the same call now.`;
|
|
365
|
+
}
|
|
366
|
+
if (live)
|
|
367
|
+
this.deps.sessions.resolvePending(action.agentSession, action.pendingId, 'reject');
|
|
368
|
+
switch (outcome) {
|
|
369
|
+
case 'reject':
|
|
370
|
+
return `[BROWSER] The owner said No to: ${what}. Do not do it and do not work around it. Say in the thread what you will do instead, or ask.`;
|
|
371
|
+
case 'timeout':
|
|
372
|
+
return `[BROWSER] No answer from the owner within ${Math.round(BROWSER_APPROVAL_CONSTANTS.DEADLINE_MS / 3_600_000)} hours, so the answer is No: ${what}. Do not do it. If it is still needed later, redo the step and it will be asked again.`;
|
|
373
|
+
case 'expire':
|
|
374
|
+
return `[BROWSER] Crewly restarted and your held action (${what}) could not be re-attached to its tab, so it expired. Redo the step: look at the page again, then retry it — the owner will be asked again with a new card.`;
|
|
375
|
+
default:
|
|
376
|
+
return null;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// ---------------------------------------------------------------------------
|
|
380
|
+
// Restart
|
|
381
|
+
// ---------------------------------------------------------------------------
|
|
382
|
+
/**
|
|
383
|
+
* After a restart: wait for the tab of each pending hold to come back
|
|
384
|
+
* (tab inventory); holds without a known tab expire right away.
|
|
385
|
+
*
|
|
386
|
+
* @returns How many holds are waiting for their tab
|
|
387
|
+
*/
|
|
388
|
+
async restore() {
|
|
389
|
+
if (this.restored)
|
|
390
|
+
return this.awaitingRebind.size;
|
|
391
|
+
this.restored = true;
|
|
392
|
+
const pending = await this.deps.store.list((a) => a.status === 'pending');
|
|
393
|
+
const now = this.now();
|
|
394
|
+
for (const action of pending) {
|
|
395
|
+
if (this.deps.sessions.getSession(action.agentSession)?.pending?.id === action.pendingId)
|
|
396
|
+
continue;
|
|
397
|
+
if (typeof action.tabId !== 'number' || !this.deps.adoptTab) {
|
|
398
|
+
await this.expire(action);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
this.awaitingRebind.set(action.pendingId, now);
|
|
402
|
+
}
|
|
403
|
+
if (pending.length > 0)
|
|
404
|
+
this.logger.info('Held browser actions found after restart', { pending: pending.length, waitingForTab: this.awaitingRebind.size });
|
|
405
|
+
return this.awaitingRebind.size;
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* A tab inventory arrived: re-bind each restored hold whose tab is in it.
|
|
409
|
+
*
|
|
410
|
+
* @param tabs - Tabs the extension reports
|
|
411
|
+
* @param instanceId - Browser instance that sent it (undefined = direct WS)
|
|
412
|
+
*/
|
|
413
|
+
onTabInventory(tabs, instanceId) {
|
|
414
|
+
if (this.awaitingRebind.size === 0)
|
|
415
|
+
return;
|
|
416
|
+
const ids = new Set(tabs.map((t) => t.tabId));
|
|
417
|
+
this.track((async () => {
|
|
418
|
+
for (const pendingId of [...this.awaitingRebind.keys()]) {
|
|
419
|
+
const action = await this.deps.store.get(pendingId);
|
|
420
|
+
if (!action || action.status !== 'pending') {
|
|
421
|
+
this.awaitingRebind.delete(pendingId);
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
if ((action.instanceId ?? undefined) !== instanceId || typeof action.tabId !== 'number' || !ids.has(action.tabId))
|
|
425
|
+
continue;
|
|
426
|
+
const bound = this.deps.boundTabOf?.(action.agentSession);
|
|
427
|
+
const ok = bound ? bound.tabId === action.tabId : !!this.deps.adoptTab?.(action.agentSession, action.tabId, action.instanceId);
|
|
428
|
+
if (!ok)
|
|
429
|
+
continue;
|
|
430
|
+
this.awaitingRebind.delete(pendingId);
|
|
431
|
+
const pending = {
|
|
432
|
+
id: action.pendingId,
|
|
433
|
+
tool: action.tool,
|
|
434
|
+
description: action.description,
|
|
435
|
+
matched: action.matched,
|
|
436
|
+
raisedAt: action.raisedAt,
|
|
437
|
+
};
|
|
438
|
+
this.deps.sessions.restorePending({
|
|
439
|
+
agentSession: action.agentSession,
|
|
440
|
+
...(action.agentName ? { agentName: action.agentName } : {}),
|
|
441
|
+
...(action.url ? { url: action.url } : {}),
|
|
442
|
+
tabId: action.tabId,
|
|
443
|
+
pending,
|
|
444
|
+
...(action.decisionId ? { where: CARD_ASKED_LINE } : {}),
|
|
445
|
+
});
|
|
446
|
+
this.logger.info('Re-attached a held browser action to its tab', { pendingId, agentSession: action.agentSession, tabId: action.tabId });
|
|
447
|
+
}
|
|
448
|
+
})());
|
|
449
|
+
}
|
|
450
|
+
/** Expire a hold: through its card when it has one (the card says so), else directly. */
|
|
451
|
+
async expire(action) {
|
|
452
|
+
const decisions = this.deps.decisions();
|
|
453
|
+
if (action.decisionId && decisions) {
|
|
454
|
+
const expired = await decisions.expire(action.decisionId).catch((err) => {
|
|
455
|
+
this.logger.warn('Could not expire the browser card', { pendingId: action.pendingId, error: errText(err) });
|
|
456
|
+
return null;
|
|
457
|
+
});
|
|
458
|
+
if (expired)
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
const note = await this.apply(action, 'expire');
|
|
462
|
+
if (note)
|
|
463
|
+
await this.deps.tellAgent(action.agentSession, note).catch(() => undefined);
|
|
464
|
+
}
|
|
465
|
+
// ---------------------------------------------------------------------------
|
|
466
|
+
// Tick
|
|
467
|
+
// ---------------------------------------------------------------------------
|
|
468
|
+
/**
|
|
469
|
+
* One pass: expire restored holds whose tab never came back, create cards
|
|
470
|
+
* that could not be created, time out holds without a card, prune.
|
|
471
|
+
*
|
|
472
|
+
* @returns Ids acted on
|
|
473
|
+
*/
|
|
474
|
+
async tick() {
|
|
475
|
+
if (this.ticking)
|
|
476
|
+
return [];
|
|
477
|
+
this.ticking = true;
|
|
478
|
+
const acted = [];
|
|
479
|
+
try {
|
|
480
|
+
const now = this.now();
|
|
481
|
+
for (const [pendingId, since] of [...this.awaitingRebind]) {
|
|
482
|
+
if (now - since < BROWSER_APPROVAL_CONSTANTS.REBIND_GRACE_MS)
|
|
483
|
+
continue;
|
|
484
|
+
this.awaitingRebind.delete(pendingId);
|
|
485
|
+
const action = await this.deps.store.get(pendingId);
|
|
486
|
+
if (action?.status === 'pending') {
|
|
487
|
+
await this.expire(action);
|
|
488
|
+
acted.push(pendingId);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
for (const action of await this.deps.store.list((a) => a.status === 'pending' && !a.decisionId)) {
|
|
492
|
+
if (this.awaitingRebind.has(action.pendingId))
|
|
493
|
+
continue;
|
|
494
|
+
if (now >= action.raisedAt + BROWSER_APPROVAL_CONSTANTS.DEADLINE_MS) {
|
|
495
|
+
// No card ever made it: the deadline still applies, and the answer is No.
|
|
496
|
+
const note = await this.apply(action, 'timeout');
|
|
497
|
+
if (note)
|
|
498
|
+
await this.deps.tellAgent(action.agentSession, note).catch(() => undefined);
|
|
499
|
+
acted.push(action.pendingId);
|
|
500
|
+
continue;
|
|
501
|
+
}
|
|
502
|
+
if (!this.deps.canAskInSlack())
|
|
503
|
+
continue;
|
|
504
|
+
if (action.cardTriedAt && now - action.cardTriedAt < BROWSER_APPROVAL_CONSTANTS.CARD_RETRY_MS)
|
|
505
|
+
continue;
|
|
506
|
+
await this.createCard(action);
|
|
507
|
+
acted.push(action.pendingId);
|
|
508
|
+
}
|
|
509
|
+
await this.deps.store.prune().catch(() => 0);
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
this.logger.warn('Browser approval tick failed', { error: errText(err) });
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
this.ticking = false;
|
|
516
|
+
}
|
|
517
|
+
return acted;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Message of an unknown error.
|
|
522
|
+
*
|
|
523
|
+
* @param err - Thrown value
|
|
524
|
+
* @returns Text
|
|
525
|
+
*/
|
|
526
|
+
function errText(err) {
|
|
527
|
+
return err instanceof Error ? err.message : String(err);
|
|
528
|
+
}
|
|
529
|
+
/** @returns The process-wide approval service, or null before wiring */
|
|
530
|
+
export function getBrowserApprovals() {
|
|
531
|
+
return BrowserApprovalService.getInstance();
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=browser-approval.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-approval.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-approval.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,6 +149,11 @@ export declare class BrowserBridgeService {
|
|
|
149
149
|
* 2026-09-23). A tab we cannot attribute to this backend is left open.
|
|
150
150
|
*/
|
|
151
151
|
private ownedTabIds;
|
|
152
|
+
/**
|
|
153
|
+
* Hear every tab inventory (direct WS and relay) before reconcile runs, so
|
|
154
|
+
* a held browser action that survived a restart can re-bind its tab.
|
|
155
|
+
*/
|
|
156
|
+
private inventoryListeners;
|
|
152
157
|
/** This backend's device id, sent as `clientId` with every command. Cached once resolved. */
|
|
153
158
|
private clientId;
|
|
154
159
|
/** Periodic timer that evicts idle bindings (§4.2). Only running while attached. */
|
|
@@ -214,6 +219,25 @@ export declare class BrowserBridgeService {
|
|
|
214
219
|
* @returns The binding, or `undefined` if this agent has no bound tab.
|
|
215
220
|
*/
|
|
216
221
|
getBinding(agentSession: string): AgentTabBinding | undefined;
|
|
222
|
+
/**
|
|
223
|
+
* Subscribe to tab inventories. Listeners run before reconcile, so a tab
|
|
224
|
+
* they {@link adoptTab adopt} is kept rather than treated as an orphan.
|
|
225
|
+
*
|
|
226
|
+
* @param listener - Called with each inventory and the browser it came from
|
|
227
|
+
* @returns Unsubscribe
|
|
228
|
+
*/
|
|
229
|
+
onTabInventory(listener: (tabs: ExtensionTabDescriptor[], instanceId?: string) => void): () => void;
|
|
230
|
+
/**
|
|
231
|
+
* Re-bind an agent to a tab that already exists (after a backend restart,
|
|
232
|
+
* the binding map is empty but the agent's tab is still open in Chrome).
|
|
233
|
+
* Refused when the agent is already bound or another agent holds the tab.
|
|
234
|
+
*
|
|
235
|
+
* @param agentSession - Agent to bind
|
|
236
|
+
* @param tabId - Existing tab
|
|
237
|
+
* @param instanceId - Relay browser instance the tab lives in, if any
|
|
238
|
+
* @returns True when the binding was made
|
|
239
|
+
*/
|
|
240
|
+
adoptTab(agentSession: string, tabId: number, instanceId?: string): boolean;
|
|
217
241
|
/**
|
|
218
242
|
* Snapshot the current bindings as a plain array — used by `GET
|
|
219
243
|
* /api/browser/bindings` and by tests.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browser-bridge.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/browser/browser-bridge.service.ts"],"names":[],"mappings":"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"}
|