crewly 1.20.180 → 1.20.182
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/skills/agent/remote-browser/SKILL.md +28 -8
- package/dist/backend/backend/src/constants.d.ts +89 -1
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +99 -2
- 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/system/runtime-fallback.controller.d.ts +11 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +44 -9
- package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts +31 -0
- package/dist/backend/backend/src/controllers/system/runtime-terms.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js +99 -0
- package/dist/backend/backend/src/controllers/system/runtime-terms.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +51 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/antigravity-runtime.service.js +5 -0
- package/dist/backend/backend/src/services/agent/antigravity-runtime.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/decisions/decision-card.d.ts +23 -5
- package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision-card.js +56 -9
- package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +96 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +190 -8
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +7 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts +8 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js +5 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-availability.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts +2 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +2 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +3 -0
- package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +15 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +13 -2
- package/dist/backend/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
- package/dist/backend/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts +75 -0
- package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js +218 -0
- package/dist/backend/backend/src/services/runtime-terms/fake-agy-tui.fixture.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts +39 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js +161 -0
- package/dist/backend/backend/src/services/runtime-terms/runtime-terms.wiring.js.map +1 -0
- package/dist/backend/backend/src/types/decision.types.d.ts +55 -2
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +89 -1
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +99 -2
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js +5 -0
- package/dist/cli/backend/src/services/agent/antigravity-runtime.service.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts +165 -0
- package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-card.js +358 -0
- package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +83 -0
- package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-contract.js +226 -0
- package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-store.d.ts +80 -0
- package/dist/cli/backend/src/services/decisions/decision-store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision-store.js +151 -0
- package/dist/cli/backend/src/services/decisions/decision-store.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +376 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js +821 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts +97 -0
- package/dist/cli/backend/src/services/decisions/ticket-thread-store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/decisions/ticket-thread-store.js +137 -0
- package/dist/cli/backend/src/services/decisions/ticket-thread-store.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts +136 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js +152 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-fallback.types.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts +217 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js +430 -0
- package/dist/cli/backend/src/services/runtime-fallback/runtime-smoke-test.service.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts +92 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js +199 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-driver.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts +79 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js +145 -0
- package/dist/cli/backend/src/services/runtime-terms/antigravity-terms-screens.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts +245 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js +428 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms-consent.service.js.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts +67 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js +78 -0
- package/dist/cli/backend/src/services/runtime-terms/runtime-terms.store.js.map +1 -0
- package/dist/cli/backend/src/types/decision.types.d.ts +192 -0
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/decision.types.js +13 -0
- package/dist/cli/backend/src/types/decision.types.js.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.js +2 -2
- package/frontend/dist/assets/{index-4271e95e.js → index-9c91de50.js} +138 -138
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-fallback.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-fallback.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EAA6B,KAAK,sBAAsB,EAAE,MAAM,6DAA6D,CAAC;AAErI,OAAO,EAAiB,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-fallback.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-fallback.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EAA6B,KAAK,sBAAsB,EAAE,MAAM,6DAA6D,CAAC;AAErI,OAAO,EAAiB,uBAAuB,EAAE,MAAM,+DAA+D,CAAC;AAEvH,OAAO,EAGN,KAAK,0BAA0B,EAC/B,MAAM,+DAA+D,CAAC;AAEvE,yCAAyC;AACzC,MAAM,WAAW,6BAA6B;IAC7C,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,UAAU,GAAG,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5I,KAAK,EAAE,MAAM,IAAI,CAAC,uBAAuB,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;IAC5D,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,0BAA0B,EAAE,mBAAmB,GAAG,UAAU,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC;CAC1G;AAID;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAQpE;AA8BD;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,6BAA6C,GAAG,IAAI,CA6DvH"}
|
|
@@ -18,20 +18,51 @@ import { getRuntimeFallbackService } from '../../services/runtime-fallback/runti
|
|
|
18
18
|
import { RuntimeFallbackSettingsError } from '../../services/runtime-fallback/runtime-fallback.types.js';
|
|
19
19
|
import { LocalSmokeApi, RuntimeSmokeTestService } from '../../services/runtime-fallback/runtime-smoke-test.service.js';
|
|
20
20
|
import { getLocalApiBaseUrl } from '../../utils/local-api-url.utils.js';
|
|
21
|
+
import { getRuntimeTermsConsentService, reportRuntimeTermsScreen, } from '../../services/runtime-terms/runtime-terms-consent.service.js';
|
|
21
22
|
let smokeService = null;
|
|
23
|
+
/**
|
|
24
|
+
* The backend's smoke test service (one per process, shared with the
|
|
25
|
+
* runtime Terms consent flow).
|
|
26
|
+
*
|
|
27
|
+
* @returns The service
|
|
28
|
+
*/
|
|
29
|
+
export function getRuntimeSmokeTestService() {
|
|
30
|
+
smokeService ??= new RuntimeSmokeTestService({
|
|
31
|
+
api: new LocalSmokeApi(getLocalApiBaseUrl, getApiToken),
|
|
32
|
+
crewlyAgentModel: () => getRuntimeFallbackService()?.getSettings().crewlyAgentModel ?? RUNTIME_FALLBACK_CONSTANTS.DEFAULT_CREWLY_AGENT_MODEL,
|
|
33
|
+
// A Terms screen asks the owner with a Slack card (specs/2026-10-01-runtime-terms-consent.md).
|
|
34
|
+
onTermsScreen: (runtime, report) => reportRuntimeTermsScreen(runtime, { source: 'smoke_test', ownerInitiated: report.ownerInitiated }),
|
|
35
|
+
});
|
|
36
|
+
return smokeService;
|
|
37
|
+
}
|
|
22
38
|
/** Default dependencies: the backend's services. */
|
|
23
39
|
function defaultDeps() {
|
|
24
40
|
return {
|
|
25
41
|
fallback: () => getRuntimeFallbackService(),
|
|
26
|
-
smoke:
|
|
27
|
-
|
|
28
|
-
api: new LocalSmokeApi(getLocalApiBaseUrl, getApiToken),
|
|
29
|
-
crewlyAgentModel: () => getRuntimeFallbackService()?.getSettings().crewlyAgentModel ?? RUNTIME_FALLBACK_CONSTANTS.DEFAULT_CREWLY_AGENT_MODEL,
|
|
30
|
-
});
|
|
31
|
-
return smokeService;
|
|
32
|
-
},
|
|
42
|
+
smoke: getRuntimeSmokeTestService,
|
|
43
|
+
terms: getRuntimeTermsConsentService,
|
|
33
44
|
};
|
|
34
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* A runtime the owner re-added to a fallback order after "Don't agree" (or
|
|
48
|
+
* a failed setup): ask about its Terms again.
|
|
49
|
+
*
|
|
50
|
+
* @param deps - Dependencies
|
|
51
|
+
* @param before - Settings before the update
|
|
52
|
+
* @param after - Settings after it
|
|
53
|
+
*/
|
|
54
|
+
function askAgainForReAdded(deps, before, after) {
|
|
55
|
+
const terms = deps.terms?.();
|
|
56
|
+
if (!terms)
|
|
57
|
+
return;
|
|
58
|
+
const had = new Set([...before.chain, ...Object.values(before.memberChains).flat()]);
|
|
59
|
+
const now = new Set([...after.chain, ...Object.values(after.memberChains).flat()]);
|
|
60
|
+
for (const runtime of now) {
|
|
61
|
+
if (had.has(runtime) || !terms.supports(runtime) || !terms.blockedReason(runtime))
|
|
62
|
+
continue;
|
|
63
|
+
void terms.reportTermsScreen(runtime, { source: 'chain', ownerInitiated: true }).catch(() => undefined);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
35
66
|
/**
|
|
36
67
|
* Register the routes.
|
|
37
68
|
*
|
|
@@ -59,7 +90,10 @@ export function registerRuntimeFallbackRoutes(router, deps = defaultDeps()) {
|
|
|
59
90
|
return;
|
|
60
91
|
}
|
|
61
92
|
try {
|
|
62
|
-
fallback.
|
|
93
|
+
const before = fallback.getSettings?.();
|
|
94
|
+
const after = fallback.updateSettings(req.body);
|
|
95
|
+
if (before && after)
|
|
96
|
+
askAgainForReAdded(deps, before, after);
|
|
63
97
|
res.json({ success: true, data: await fallback.snapshot() });
|
|
64
98
|
}
|
|
65
99
|
catch (err) {
|
|
@@ -74,7 +108,8 @@ export function registerRuntimeFallbackRoutes(router, deps = defaultDeps()) {
|
|
|
74
108
|
const runtime = typeof req.body?.runtime === 'string' ? req.body.runtime : '';
|
|
75
109
|
let started;
|
|
76
110
|
try {
|
|
77
|
-
|
|
111
|
+
// The owner pressed Test: a Terms screen asks again even after "Don't agree".
|
|
112
|
+
started = deps.smoke().start(runtime, { ownerInitiated: true });
|
|
78
113
|
}
|
|
79
114
|
catch (err) {
|
|
80
115
|
res.status(400).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-fallback.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-fallback.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAA+B,MAAM,6DAA6D,CAAC;AACrI,OAAO,EAAE,4BAA4B,
|
|
1
|
+
{"version":3,"file":"runtime-fallback.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-fallback.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Terms consent endpoints (Settings → Runtimes).
|
|
3
|
+
*
|
|
4
|
+
* - `GET /api/system/runtime-terms` — every runtime with a Terms flow and its state
|
|
5
|
+
* - `POST /api/system/runtime-terms/:runtime/request` — "Accept terms…": post the
|
|
6
|
+
* Slack card (or return the open one)
|
|
7
|
+
* - `POST /api/system/runtime-terms/:runtime/probe` — launch it in a dedicated
|
|
8
|
+
* session, read the first screen (nothing is pressed); a Terms screen posts the card
|
|
9
|
+
* - `POST /api/system/runtime-terms/:runtime/answer { choice }` — answer inline
|
|
10
|
+
* (`agree_no_data` | `agree_share_data` | `decline`); goes through the card
|
|
11
|
+
* when one is open, so it updates too
|
|
12
|
+
*
|
|
13
|
+
* Owner only: a request from an agent session gets 403 — agents never accept
|
|
14
|
+
* Terms. specs/2026-10-01-runtime-terms-consent.md
|
|
15
|
+
*
|
|
16
|
+
* @module controllers/system/runtime-terms.controller
|
|
17
|
+
*/
|
|
18
|
+
import type { Router } from 'express';
|
|
19
|
+
import { type RuntimeTermsConsentService } from '../../services/runtime-terms/runtime-terms-consent.service.js';
|
|
20
|
+
/** Dependencies (tests inject fakes). */
|
|
21
|
+
export interface RuntimeTermsControllerDeps {
|
|
22
|
+
terms: () => Pick<RuntimeTermsConsentService, 'list' | 'requestConsent' | 'answer' | 'supports' | 'probe'> | null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Register the routes.
|
|
26
|
+
*
|
|
27
|
+
* @param router - The /api router
|
|
28
|
+
* @param deps - Dependencies (default: the backend's)
|
|
29
|
+
*/
|
|
30
|
+
export declare function registerRuntimeTermsRoutes(router: Router, deps?: RuntimeTermsControllerDeps): void;
|
|
31
|
+
//# sourceMappingURL=runtime-terms.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-terms.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-terms.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAGN,KAAK,0BAA0B,EAE/B,MAAM,+DAA+D,CAAC;AAEvE,yCAAyC;AACzC,MAAM,WAAW,0BAA0B;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC,0BAA0B,EAAE,MAAM,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;CAClH;AAID;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,0BAAqE,GAAG,IAAI,CAoE5I"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Terms consent endpoints (Settings → Runtimes).
|
|
3
|
+
*
|
|
4
|
+
* - `GET /api/system/runtime-terms` — every runtime with a Terms flow and its state
|
|
5
|
+
* - `POST /api/system/runtime-terms/:runtime/request` — "Accept terms…": post the
|
|
6
|
+
* Slack card (or return the open one)
|
|
7
|
+
* - `POST /api/system/runtime-terms/:runtime/probe` — launch it in a dedicated
|
|
8
|
+
* session, read the first screen (nothing is pressed); a Terms screen posts the card
|
|
9
|
+
* - `POST /api/system/runtime-terms/:runtime/answer { choice }` — answer inline
|
|
10
|
+
* (`agree_no_data` | `agree_share_data` | `decline`); goes through the card
|
|
11
|
+
* when one is open, so it updates too
|
|
12
|
+
*
|
|
13
|
+
* Owner only: a request from an agent session gets 403 — agents never accept
|
|
14
|
+
* Terms. specs/2026-10-01-runtime-terms-consent.md
|
|
15
|
+
*
|
|
16
|
+
* @module controllers/system/runtime-terms.controller
|
|
17
|
+
*/
|
|
18
|
+
import { ensureOwnerCaller } from './system-control.controller.js';
|
|
19
|
+
import { getRuntimeTermsConsentService, TERMS_CHOICE_LABELS, } from '../../services/runtime-terms/runtime-terms-consent.service.js';
|
|
20
|
+
const NOT_READY = 'Runtime Terms consent is not ready yet — Crewly is still starting.';
|
|
21
|
+
/**
|
|
22
|
+
* Register the routes.
|
|
23
|
+
*
|
|
24
|
+
* @param router - The /api router
|
|
25
|
+
* @param deps - Dependencies (default: the backend's)
|
|
26
|
+
*/
|
|
27
|
+
export function registerRuntimeTermsRoutes(router, deps = { terms: getRuntimeTermsConsentService }) {
|
|
28
|
+
router.get('/system/runtime-terms', (_req, res) => {
|
|
29
|
+
const terms = deps.terms();
|
|
30
|
+
if (!terms) {
|
|
31
|
+
res.status(503).json({ success: false, error: NOT_READY });
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
res.json({ success: true, data: terms.list() });
|
|
35
|
+
});
|
|
36
|
+
router.post('/system/runtime-terms/:runtime/request', async (req, res) => {
|
|
37
|
+
if (!ensureOwnerCaller(req, res, 'runtime-terms request'))
|
|
38
|
+
return;
|
|
39
|
+
const terms = deps.terms();
|
|
40
|
+
if (!terms) {
|
|
41
|
+
res.status(503).json({ success: false, error: NOT_READY });
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!terms.supports(req.params.runtime)) {
|
|
45
|
+
res.status(404).json({ success: false, error: `Crewly has no Terms flow for ${req.params.runtime}` });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
res.json({ success: true, data: await terms.requestConsent(req.params.runtime) });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
res.status(500).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
router.post('/system/runtime-terms/:runtime/probe', async (req, res) => {
|
|
56
|
+
if (!ensureOwnerCaller(req, res, 'runtime-terms probe'))
|
|
57
|
+
return;
|
|
58
|
+
const terms = deps.terms();
|
|
59
|
+
if (!terms) {
|
|
60
|
+
res.status(503).json({ success: false, error: NOT_READY });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (!terms.supports(req.params.runtime)) {
|
|
64
|
+
res.status(404).json({ success: false, error: `Crewly has no Terms flow for ${req.params.runtime}` });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
res.json({ success: true, data: await terms.probe(req.params.runtime) });
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
res.status(409).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
router.post('/system/runtime-terms/:runtime/answer', async (req, res) => {
|
|
75
|
+
if (!ensureOwnerCaller(req, res, 'runtime-terms answer'))
|
|
76
|
+
return;
|
|
77
|
+
const terms = deps.terms();
|
|
78
|
+
if (!terms) {
|
|
79
|
+
res.status(503).json({ success: false, error: NOT_READY });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const choice = req.body?.choice;
|
|
83
|
+
if (!Object.prototype.hasOwnProperty.call(TERMS_CHOICE_LABELS, choice)) {
|
|
84
|
+
res.status(400).json({ success: false, error: `choice must be one of ${Object.keys(TERMS_CHOICE_LABELS).join(' | ')}` });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!terms.supports(req.params.runtime)) {
|
|
88
|
+
res.status(404).json({ success: false, error: `Crewly has no Terms flow for ${req.params.runtime}` });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
res.json({ success: true, data: await terms.answer(req.params.runtime, choice) });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
res.status(409).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=runtime-terms.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-terms.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/system/runtime-terms.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":";AA2CA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAiOjD,qBAAa,YAAY;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAqE;IACnF,gFAAgF;IAChF,OAAO,CAAC,iBAAiB,CAAC,CAAyD;IAEnF,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,4BAA4B,CAAgC;IACpE,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,wBAAwB,CAA4B;IAC5D,OAAO,CAAC,eAAe,CAAmB;IAC1C,qEAAqE;IACrE,OAAO,CAAC,qBAAqB,CAAsC;IACnE,OAAO,CAAC,sBAAsB,CAAuC;IACrE,OAAO,CAAC,sBAAsB,CAAiD;IAC/E,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,kGAAkG;IAClG,OAAO,CAAC,sBAAsB,CAAuC;IAGrE,OAAO,CAAC,+BAA+B,CAAgD;IACvF,+FAA+F;IAC/F,OAAO,CAAC,oBAAoB,CAAqC;IACjE,8HAA8H;IAC9H,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,OAAO,CAAC,6BAA6B,CAA8C;IACnF,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,2BAA2B,CAA+B;IAClE,OAAO,CAAC,0BAA0B,CAA8B;IAChE,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,kBAAkB,CAA0C;IAKpE,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAET;IAGf,OAAO,CAAC,cAAc,CAAS;IAC/B,oEAAoE;IACpE,OAAO,CAAC,qBAAqB,CAA6C;IAC1E,OAAO,CAAC,qBAAqB,CAA2G;IACxI,OAAO,CAAC,gBAAgB,CAAiG;IACzH,oFAAoF;IACpF,OAAO,CAAC,oBAAoB,CAAK;IACjC,2EAA2E;IAC3E,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,wBAAwB,CAA+B;gBAEnD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAsE3C,OAAO,CAAC,kBAAkB;IA8pC1B,OAAO,CAAC,mBAAmB;IA4D3B,OAAO,CAAC,eAAe;IAoLvB,OAAO,CAAC,kBAAkB;IAwBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1975,6 +1975,44 @@ export class CrewlyServer {
|
|
|
1975
1975
|
setBrowserControlDeps({
|
|
1976
1976
|
sendMessageToAgent: (sessionName, message) => this.apiController.agentRegistrationService.sendMessageToAgent(sessionName, message),
|
|
1977
1977
|
});
|
|
1978
|
+
// Held irreversible actions: ask the owner with a Slack decision
|
|
1979
|
+
// card in the agent's work thread, persist the hold, and apply the
|
|
1980
|
+
// answer from any surface (card, reaction, reply, dashboard, portal).
|
|
1981
|
+
try {
|
|
1982
|
+
const { BrowserApprovalService } = await import('./services/browser/browser-approval.service.js');
|
|
1983
|
+
const { HeldActionStore } = await import('./services/browser/held-action-store.js');
|
|
1984
|
+
const { DecisionService } = await import('./services/decisions/decision.service.js');
|
|
1985
|
+
const approvals = new BrowserApprovalService({
|
|
1986
|
+
store: HeldActionStore.inHome(this.config.crewlyHome),
|
|
1987
|
+
sessions: browserSessions,
|
|
1988
|
+
decisions: () => DecisionService.getInstance(),
|
|
1989
|
+
canAskInSlack: () => !!DecisionService.getInstance() && getSlackService().isConnected(),
|
|
1990
|
+
tellAgent: (sessionName, message) => this.apiController.agentRegistrationService.sendMessageToAgent(sessionName, message),
|
|
1991
|
+
agentNameOf: async (sessionName) => {
|
|
1992
|
+
const teams = await this.storageService.getTeams().catch(() => []);
|
|
1993
|
+
return teams.flatMap((t) => t.members ?? []).find((m) => m.sessionName === sessionName)?.name;
|
|
1994
|
+
},
|
|
1995
|
+
boundTabOf: (sessionName) => {
|
|
1996
|
+
const binding = browserBridge.getBinding(sessionName);
|
|
1997
|
+
return binding ? { tabId: binding.tabId, ...(binding.instanceId ? { instanceId: binding.instanceId } : {}) } : undefined;
|
|
1998
|
+
},
|
|
1999
|
+
adoptTab: (sessionName, tabId, instanceId) => browserBridge.adoptTab(sessionName, tabId, instanceId),
|
|
2000
|
+
});
|
|
2001
|
+
BrowserApprovalService.setInstance(approvals);
|
|
2002
|
+
DecisionService.registerKindHandler('browser_action', approvals);
|
|
2003
|
+
browserSessions.setHoldListener(approvals);
|
|
2004
|
+
browserBridge.onTabInventory((tabs, instanceId) => approvals.onTabInventory(tabs, instanceId));
|
|
2005
|
+
// Restored holds expire through their cards, so restore once
|
|
2006
|
+
// decision cards run (startDecisionCards) — or now, if they do.
|
|
2007
|
+
if (DecisionService.getInstance())
|
|
2008
|
+
await approvals.restore();
|
|
2009
|
+
approvals.start();
|
|
2010
|
+
}
|
|
2011
|
+
catch (error) {
|
|
2012
|
+
this.logger.warn('Browser approval cards not started', {
|
|
2013
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2014
|
+
});
|
|
2015
|
+
}
|
|
1978
2016
|
this.logger.info('Live browser view started');
|
|
1979
2017
|
}
|
|
1980
2018
|
catch (error) {
|
|
@@ -4623,10 +4661,23 @@ export class CrewlyServer {
|
|
|
4623
4661
|
attachDecisionSlackListeners(decisions);
|
|
4624
4662
|
decisions.start();
|
|
4625
4663
|
this.logger.info('Decision cards started');
|
|
4664
|
+
// Runtime Terms consent (specs/2026-10-01-runtime-terms-consent.md): the
|
|
4665
|
+
// owner agrees to a runtime's first-run Terms from a Slack card.
|
|
4666
|
+
const { startRuntimeTerms } = await import('./services/runtime-terms/runtime-terms.wiring.js');
|
|
4667
|
+
startRuntimeTerms({ crewlyHome: this.config.crewlyHome, decisions, machineName: () => os.hostname().replace(/\.local$/, '') });
|
|
4626
4668
|
}
|
|
4627
4669
|
catch (error) {
|
|
4628
4670
|
this.logger.warn('Decision cards not started', { error: error instanceof Error ? error.message : String(error) });
|
|
4629
4671
|
}
|
|
4672
|
+
// Held browser actions from before the restart: re-attach or expire
|
|
4673
|
+
// (after the decision service, so expired cards are updated).
|
|
4674
|
+
try {
|
|
4675
|
+
const { BrowserApprovalService } = await import('./services/browser/browser-approval.service.js');
|
|
4676
|
+
await BrowserApprovalService.getInstance()?.restore();
|
|
4677
|
+
}
|
|
4678
|
+
catch (error) {
|
|
4679
|
+
this.logger.warn('Held browser actions not restored', { error: error instanceof Error ? error.message : String(error) });
|
|
4680
|
+
}
|
|
4630
4681
|
}
|
|
4631
4682
|
async startOwnerMessageWatchdog(chatV2) {
|
|
4632
4683
|
try {
|