chainlesschain 0.166.13 → 0.166.14
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/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-BN25cNOD.js → AIOps-C8SyFhOo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-Da9IP-m5.js → ActionButton-Dup5gFK0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-D7hkEvQm.js → Analytics-8FyOWA7V.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-CCV4Xnbc.js → AppLayout-DBzdU9dg.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-CVSnVJeA.js → Artifacts-C_0Z8gNy.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CuYdw5Ag.js → Audit-Cf2a-58m.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DZCnK-Tf.js → BackgroundAgents-M7w-2zgB.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-cV9FdpTy.js → Backup-CCTHQXoL.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BRnv6YSp.js → BaseInput-DjXpeFwJ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-Bw5w87P4.js → Chat-cAvchsJU.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-C0GjtUAw.js → ChatBubbleRenderer-DvEvxlZv.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DaoTqcdt.js → Checkbox-DKs6qvOn.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B4dYcEIi.js → Codegen-DlkA7b9X.js} +1 -1
- package/src/assets/web-panel/assets/{Col-mAhuOeuD.js → Col-CkfdKhyJ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BK6KEdBk.js → Community-iNXMHzj6.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CCglmNu5.js → Compact-DQxPEd09.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Cm8S4of7.js → Compliance-CSKvMCjs.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Dhs1QLMe.js → Cowork-CkWqazpD.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CLlhmXWk.js → Cron-k6W8IzhB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BnHVbaNs.js → Crosschain-C8MS1OuY.js} +1 -1
- package/src/assets/web-panel/assets/{DID-UzQP9-0O.js → DID-DJuCcgiQ.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-CBdlPClz.js → Dashboard-LeThKzp3.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-axIRPdq1.js → Dropdown-BvxwgpE4.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DUalW5rx.js → EmailListRenderer-n3e_a1M3.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Bl4W9luY.js → FamilyGuardDashboard-509W6W6v.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C1yP-uEu.js → Federation-xgZReQm0.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-Xh6Ig5q8.js → FormItemContext-jZOhKcQx.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C2cz3bt2.js → GenericCardRenderer-Jo0ULzHv.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C_z63ixg.js → Git-BsRcyWQP.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BYqB33_3.js → Governance-JlpMYTAk.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CEULuArm.js → Inference-CUEz872-.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-fgMsu-0H.js → KnowledgeGraph-DgrvvEDU.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-DO9Hdcec.js → Logs-Df-KY4U3.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BEPDcSwz.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B8zyLiFe.js → Marketplace-kPZDTOeI.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BLAN2mWW.js → McpTools-CRRzPqNX.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CrQcFM7u.js → Memory-D6pNSkg9.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DVnyiiU-.js → MobileBridge-g-pvtwRC.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-qjCME5OD.js → MobileProjects-Bzayfrfe.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-4JE3C3It.js → Mtc-B7S3W-XL.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-CjBuak9I.js → MtcAudit-B8OMEWVb.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-BtPcYQcC.js → Multisig-CowRp7GH.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Cx653_Ba.js → NLProgramming-BkQNyi4c.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CkuD3YzS.js → Notes-Cm7gtkKz.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-BgNgU7HH.js → NotificationSettings-CbPTVh9m.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BTC8W0a-.js → OrderTableRenderer-Dswi26mJ.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dmd4Hjxz.js → Organization-BkjQ9yy7.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-C_5DA-G0.js → Overflow-DmRFXP7Y.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-uwslV4XC.js → P2P-DQE1toAu.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CuNgwVnX.js → PdhVaultBrowser-BujyoDRG.js} +4 -4
- package/src/assets/web-panel/assets/{Permissions-CJayVX9H.js → Permissions-xSjfOaiU.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Cb05H5go.js → PersonalDataHub-B9ICLqVP.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-BZlGKapZ.js → Pipeline-CUNwyN9E.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BIzZWYzd.js → Privacy-SOoCricX.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-vEYYyQXQ.js → ProjectInit-CSaFul0F.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-MZqTy5CC.js → ProjectSettings-CueiB_oe.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-CRARUOl8.js → Projects-BOeXvU7y.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-80VAK8PX.js → Providers-CTqf_31h.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-CzRSoIwK.js → QrScannerModal-C8ZP31E9.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BpwQ2n4C.js → QuickAsk-CPgn4713.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BC03TZ79.js → Recommend-8_e0zw0i.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DE59-jaa.js → RemoteSession-iT7lbGqw.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-DOHmeWyA.js → Reputation-B4q9SUOz.js} +1 -1
- package/src/assets/web-panel/assets/{Row-hc5RZl1D.js → Row-CA_nASyL.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-Cv5uMP7E.js → RssFeed-Cwb0E3yv.js} +3 -3
- package/src/assets/web-panel/assets/{Search-qohu7Ug0.js → Search-D9iVsOxJ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-drCPFWV5.js → Security-DPLbYchG.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BAEgUeRy.js → Services-DGMVL_LF.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CkJkKBlo.js → Skeleton-B_6kym0D.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-bMuKEpez.js → Skills-Ds6r0dXB.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DxWQVHRC.js → Sla-BLHAbBhb.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BpS8idmV.js → SpeechSettings-CZuddd14.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BPBLlW5v.js → SyncSettings-CdBq7oSl.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-C4SLEeUh.js → Tasks-DfT60Nyl.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-r-wfU39U.js → Templates-RLfsKy2V.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-C7vjRmLN.js → Tenant-Cw8xCNLE.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DdzeFCV2.js → Terminal-BOUkNu4f.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CYyWN2KD.js → TimelineRenderer-CgGZWaRm.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D8A9osUg.js → Tokens-CpwjVyir.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DBvrNlyS.js → Trigger-DL21H-eb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DBVAGc7o.js → Trust-B3ffFclW.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C1vQUCRJ.js → UkeySign-CkBeb5aI.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BKs4dah4.js → VideoEditing-U2iVaE3r.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-ByIuj3lD.js → Wallet-CQk2wzYd.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DYlAFCm9.js → WebAuthn-DYIuIYzT.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Dwyadd0c.js → WorkflowEditor-tg1c2mZQ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Bm2f3s08.js → chat-CtL61spq.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C8ORSh7V.js → colors-DKpbeo8s.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-1iVlnsM-.js → compact-item-gPZsrswt.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CmqNyUSL.js → createContext-CfHlwzVr.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DdqnMhzi.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-rUMaX3Ul.js → hasIn-MV47g_6X.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCEyz58d.js → index-6G0ETFTW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVtnizyC.js → index-BBw52sEl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIvM-uAX.js → index-BN-wxSQ8.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvedhJeM.js → index-BOyGUuBE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCOhTILd.js → index-BQp5M0s1.js} +1 -1
- package/src/assets/web-panel/assets/index-BcK8o4ke.js +1 -0
- package/src/assets/web-panel/assets/{index-DVJ1uKf4.js → index-BjlPD7GO.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQL9r73Y.js → index-C4lF-f_z.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5RfRciU.js → index-C6nC_DyY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DgUE51Pz.js → index-C9RF4ieu.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkFvuAex.js → index-C9gtY4nG.js} +3 -3
- package/src/assets/web-panel/assets/{index-C-J5-pGH.js → index-CB1HnbNK.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bf1PlIHp.js → index-CRv_uMLV.js} +1 -1
- package/src/assets/web-panel/assets/{index-tqTx5wXo.js → index-C_B9LiKs.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bgw4Y2rU.js → index-Cjv0kKCU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJxtPFOh.js → index-CmM9jqwe.js} +1 -1
- package/src/assets/web-panel/assets/{index-pHWA7bmM.js → index-CmPJpLoD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dsve5Gkv.js → index-CzfxTSPW.js} +1 -1
- package/src/assets/web-panel/assets/{index-B59OWAs7.js → index-D1XB5-t5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK-RY0-7.js → index-DGtEBodr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC32_0xT.js → index-DIeJmlAA.js} +1 -1
- package/src/assets/web-panel/assets/{index-OcbzdRpT.js → index-DMMvlLp9.js} +1 -1
- package/src/assets/web-panel/assets/{index-geQinnns.js → index-DU4rZpiK.js} +1 -1
- package/src/assets/web-panel/assets/{index-D98FXb0w.js → index-D_Pl1GnW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BC8Wb6cy.js → index-Dd19vRwy.js} +1 -1
- package/src/assets/web-panel/assets/{index-fPK6GFEg.js → index-Ddcpj1El.js} +1 -1
- package/src/assets/web-panel/assets/{index-CfiHyVyl.js → index-Df9sWKpl.js} +1 -1
- package/src/assets/web-panel/assets/{index-C-ZIHi42.js → index-DfLyHCWi.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDHk911Q.js → index-DnZ_zS1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFniLMn9.js → index-DsH-i_3d.js} +1 -1
- package/src/assets/web-panel/assets/index-DvbAjyYI.js +1 -0
- package/src/assets/web-panel/assets/{index-Dcck8QfW.js → index-ExAGPAnX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DwMdWKiF.js → index-Rb7CRMw9.js} +1 -1
- package/src/assets/web-panel/assets/{index-reUHhuz8.js → index-Zvkt9xqi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgwLNxmr.js → index-bSFrAszw.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3B1S-mW.js → index-fYcS7NS0.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTfEmKK0.js → index-srBc9U_s.js} +1 -1
- package/src/assets/web-panel/assets/{index-B53c3diB.js → index-xUlgG0Xe.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8BrB0Ls.js → index-yxxXlqBA.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CuA-cpkL.js → initDefaultProps-BeOZoSZ4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CimmE_9b.js → motion-BXE8VMKx.js} +1 -1
- package/src/assets/web-panel/assets/{move-DlGlrltz.js → move-I9sdvPGX.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CK6BJQ07.js → mtc-parser-d25zrJd0.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BKjBfZfB.js → omit-D71V_T4e.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-B2chVYw9.js → pickAttrs-BNZKpIAR.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BW8aLJJ3.js → placementArrow-jOcgxTTz.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-dXlPl66S.js → responsiveObserve-pta_O8AU.js} +1 -1
- package/src/assets/web-panel/assets/{slide-hSa89S4G.js → slide-Dlq6om7z.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DM6KLt-s.js → statusUtils-BnkO_yRv.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-C9MQAK15.js → styleChecker-p8NfWmcG.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-BpQDpP0z.js → useFlexGapSupport-KcjZZ5U7.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-C7rtRViA.js → useFs-gqonDMWB.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-Dm15xafq.js → usePersonalDataHub-jIIfE4go.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-mEiEytw4.js → vnode-Dyo7fBrM.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DzPxflhY.js → zoom-6l8BMg9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agent.js +49 -27
- package/src/commands/record-replay.js +772 -0
- package/src/commands/skill.js +3 -0
- package/src/data/changelog.json +13 -0
- package/src/lib/agent-sandbox.js +4 -8
- package/src/lib/agent-team/team-message-tools.js +23 -5
- package/src/lib/process-execution-broker/credential-transport.js +31 -0
- package/src/lib/process-execution-broker/index.js +74 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +7 -3
- package/src/lib/record-replay/browser-target-policy.js +406 -0
- package/src/lib/record-replay/index.js +4 -0
- package/src/lib/record-replay/playwright-ui-driver.js +83 -20
- package/src/lib/record-replay/playwright-ui-recorder.js +611 -0
- package/src/lib/record-replay/recorded-skill-package.js +486 -0
- package/src/lib/record-replay/recorded-skill-store.js +1166 -0
- package/src/lib/record-replay/skill-recorder.js +634 -64
- package/src/runtime/headless-runner.js +72 -51
- package/src/assets/web-panel/assets/MarkdownRenderer-BkrK04xW.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B69RCDDH.js +0 -1
- package/src/assets/web-panel/assets/index-9biMQ-tw.js +0 -1
- package/src/assets/web-panel/assets/index-COie87kl.js +0 -1
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { executionBroker } from "../process-execution-broker/index.js";
|
|
3
|
+
import {
|
|
4
|
+
createRecordedSkillNetworkPolicy,
|
|
5
|
+
navigationAllowedByRecordedSkillPolicy,
|
|
6
|
+
prepareRecordedSkillBrowserTarget,
|
|
7
|
+
requestAllowedByRecordedSkillPolicy,
|
|
8
|
+
} from "./browser-target-policy.js";
|
|
2
9
|
|
|
3
10
|
const ACTION_CAPABILITIES = Object.freeze({
|
|
4
11
|
observe: "ui.observe",
|
|
@@ -7,11 +14,7 @@ const ACTION_CAPABILITIES = Object.freeze({
|
|
|
7
14
|
type: "ui.interact",
|
|
8
15
|
select: "ui.interact",
|
|
9
16
|
});
|
|
10
|
-
const DRIVER_CAPABILITIES = Object.freeze([
|
|
11
|
-
"ui.interact",
|
|
12
|
-
"ui.observe",
|
|
13
|
-
]);
|
|
14
|
-
const DENIED_SCHEMES = new Set(["file:", "http:", "https:", "ws:", "wss:"]);
|
|
17
|
+
const DRIVER_CAPABILITIES = Object.freeze(["ui.interact", "ui.observe"]);
|
|
15
18
|
|
|
16
19
|
function driverError(code, message, details = {}) {
|
|
17
20
|
const error = new Error(message);
|
|
@@ -68,11 +71,17 @@ function requestMetadata(request) {
|
|
|
68
71
|
}
|
|
69
72
|
return Object.freeze({
|
|
70
73
|
scheme,
|
|
71
|
-
method: String(request.method?.() || "GET")
|
|
74
|
+
method: String(request.method?.() || "GET")
|
|
75
|
+
.toUpperCase()
|
|
76
|
+
.slice(0, 16),
|
|
72
77
|
});
|
|
73
78
|
}
|
|
74
79
|
|
|
75
|
-
async function locatorState(
|
|
80
|
+
async function locatorState(
|
|
81
|
+
locator,
|
|
82
|
+
timeoutMs,
|
|
83
|
+
{ allowDetached = false } = {},
|
|
84
|
+
) {
|
|
76
85
|
const count = await locator.count();
|
|
77
86
|
if (count !== 1) {
|
|
78
87
|
if (allowDetached && count === 0) {
|
|
@@ -136,12 +145,22 @@ async function assertAction(locator, action, timeoutMs) {
|
|
|
136
145
|
*/
|
|
137
146
|
export async function launchPlaywrightRecordedSkillDriver({
|
|
138
147
|
html,
|
|
148
|
+
url,
|
|
149
|
+
allowedOrigins = [],
|
|
150
|
+
storageState,
|
|
151
|
+
identity = "anonymous",
|
|
139
152
|
playwright,
|
|
140
153
|
timeoutMs = 5_000,
|
|
141
154
|
settleMs = 25,
|
|
142
155
|
viewport = { width: 960, height: 640 },
|
|
143
156
|
} = {}) {
|
|
144
|
-
const
|
|
157
|
+
const target = prepareRecordedSkillBrowserTarget({
|
|
158
|
+
html,
|
|
159
|
+
url,
|
|
160
|
+
allowedOrigins,
|
|
161
|
+
storageState,
|
|
162
|
+
identity,
|
|
163
|
+
});
|
|
145
164
|
if (!Number.isInteger(timeoutMs) || timeoutMs < 100 || timeoutMs > 30_000) {
|
|
146
165
|
throw driverError(
|
|
147
166
|
"CC_REPLAY_UI_ARGUMENT_INVALID",
|
|
@@ -163,11 +182,23 @@ export async function launchPlaywrightRecordedSkillDriver({
|
|
|
163
182
|
);
|
|
164
183
|
}
|
|
165
184
|
|
|
166
|
-
const
|
|
185
|
+
const executablePath = runtime.chromium.executablePath?.();
|
|
186
|
+
const browser = executablePath
|
|
187
|
+
? await executionBroker.runWithProcessContext(
|
|
188
|
+
{
|
|
189
|
+
origin: "record-replay:chromium-driver",
|
|
190
|
+
policy: "allow",
|
|
191
|
+
allowedCommands: [executablePath],
|
|
192
|
+
auditContext: { actor: "record-replay-driver" },
|
|
193
|
+
},
|
|
194
|
+
() => runtime.chromium.launch({ headless: true, executablePath }),
|
|
195
|
+
)
|
|
196
|
+
: await runtime.chromium.launch({ headless: true });
|
|
167
197
|
const context = await browser.newContext({
|
|
168
198
|
viewport: safeViewport,
|
|
169
199
|
acceptDownloads: false,
|
|
170
200
|
serviceWorkers: "block",
|
|
201
|
+
storageState: target.storageState || undefined,
|
|
171
202
|
});
|
|
172
203
|
const deniedRequests = [];
|
|
173
204
|
const receipts = [];
|
|
@@ -175,19 +206,32 @@ export async function launchPlaywrightRecordedSkillDriver({
|
|
|
175
206
|
try {
|
|
176
207
|
await context.route("**/*", async (route) => {
|
|
177
208
|
const metadata = requestMetadata(route.request());
|
|
178
|
-
if (
|
|
209
|
+
if (!requestAllowedByRecordedSkillPolicy(route.request().url(), target)) {
|
|
179
210
|
deniedRequests.push(metadata);
|
|
180
211
|
await route.abort("blockedbyclient");
|
|
181
212
|
return;
|
|
182
213
|
}
|
|
183
214
|
await route.continue();
|
|
184
215
|
});
|
|
185
|
-
await context.setOffline(true);
|
|
216
|
+
if (target.networkPolicy.mode === "deny") await context.setOffline(true);
|
|
186
217
|
page = await context.newPage();
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
218
|
+
if (target.adapter === "self-contained-html") {
|
|
219
|
+
await page.setContent(target.html, {
|
|
220
|
+
waitUntil: "domcontentloaded",
|
|
221
|
+
timeout: timeoutMs,
|
|
222
|
+
});
|
|
223
|
+
} else {
|
|
224
|
+
await page.goto(target.url, {
|
|
225
|
+
waitUntil: "domcontentloaded",
|
|
226
|
+
timeout: timeoutMs,
|
|
227
|
+
});
|
|
228
|
+
if (!navigationAllowedByRecordedSkillPolicy(page.url(), target)) {
|
|
229
|
+
throw driverError(
|
|
230
|
+
"CC_REPLAY_UI_NETWORK_ATTEMPT",
|
|
231
|
+
"recorded UI target redirected outside its reviewed origin policy",
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
191
235
|
} catch {
|
|
192
236
|
await browser.close();
|
|
193
237
|
throw driverError(
|
|
@@ -199,18 +243,31 @@ export async function launchPlaywrightRecordedSkillDriver({
|
|
|
199
243
|
await browser.close();
|
|
200
244
|
throw driverError(
|
|
201
245
|
"CC_REPLAY_UI_FIXTURE_NETWORKED",
|
|
202
|
-
"recorded UI
|
|
246
|
+
"recorded UI target attempted access outside its reviewed network policy while loading",
|
|
203
247
|
{ deniedRequestCount: deniedRequests.length },
|
|
204
248
|
);
|
|
205
249
|
}
|
|
206
250
|
|
|
207
251
|
const executor = Object.freeze({
|
|
208
252
|
capabilities: DRIVER_CAPABILITIES,
|
|
253
|
+
networkPolicyDigest: target.networkPolicy.digest,
|
|
209
254
|
async execute(action, { isolation, capability } = {}) {
|
|
210
|
-
|
|
255
|
+
let replayNetworkPolicy;
|
|
256
|
+
try {
|
|
257
|
+
replayNetworkPolicy = createRecordedSkillNetworkPolicy({
|
|
258
|
+
mode: isolation?.network,
|
|
259
|
+
allowedOrigins: isolation?.allowedOrigins || [],
|
|
260
|
+
});
|
|
261
|
+
} catch {
|
|
262
|
+
replayNetworkPolicy = null;
|
|
263
|
+
}
|
|
264
|
+
if (
|
|
265
|
+
isolation?.sandboxed !== true ||
|
|
266
|
+
replayNetworkPolicy?.digest !== target.networkPolicy.digest
|
|
267
|
+
) {
|
|
211
268
|
throw driverError(
|
|
212
269
|
"CC_REPLAY_UI_ISOLATION_REQUIRED",
|
|
213
|
-
"UI replay driver requires
|
|
270
|
+
"UI replay driver requires the exact reviewed browser network policy",
|
|
214
271
|
);
|
|
215
272
|
}
|
|
216
273
|
const kind = String(action?.kind || "");
|
|
@@ -278,7 +335,7 @@ export async function launchPlaywrightRecordedSkillDriver({
|
|
|
278
335
|
screenshot,
|
|
279
336
|
"cc.record-replay.ui-screenshot/v1",
|
|
280
337
|
),
|
|
281
|
-
networkPolicy:
|
|
338
|
+
networkPolicy: target.networkPolicy.mode,
|
|
282
339
|
deniedRequestCount: 0,
|
|
283
340
|
});
|
|
284
341
|
receipts.push(evidence);
|
|
@@ -297,7 +354,13 @@ export async function launchPlaywrightRecordedSkillDriver({
|
|
|
297
354
|
return Object.freeze({
|
|
298
355
|
executor,
|
|
299
356
|
browserVersion: String(browser.version?.() || "unknown").slice(0, 128),
|
|
300
|
-
|
|
357
|
+
adapter: target.adapter,
|
|
358
|
+
targetDigest: target.targetDigest,
|
|
359
|
+
fixtureDigest:
|
|
360
|
+
target.adapter === "self-contained-html" ? target.targetDigest : null,
|
|
361
|
+
storageStateDigest: target.storageStateDigest,
|
|
362
|
+
identity: target.identity,
|
|
363
|
+
networkPolicy: target.networkPolicy,
|
|
301
364
|
summary() {
|
|
302
365
|
return Object.freeze({
|
|
303
366
|
schema: "chainlesschain.recorded-skill-ui-driver-summary/v1",
|