@anweat/dsh-browser 0.1.17 → 0.2.0

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.
Files changed (169) hide show
  1. package/README.md +266 -88
  2. package/assets/skills/dsh-browser/SKILL.md +120 -0
  3. package/assets/skills/dsh-browser/references/develop.md +48 -0
  4. package/assets/skills/dsh-browser/references/observe.md +91 -0
  5. package/assets/skills/dsh-browser/references/opencli.md +25 -0
  6. package/assets/skills/dsh-browser/references/recipes.md +149 -0
  7. package/assets/skills/dsh-browser/references/userscripts.md +44 -0
  8. package/cordis.patch.yml +11 -3
  9. package/lib/actions/act.d.ts +3 -0
  10. package/lib/actions/act.js +147 -0
  11. package/lib/actions/act.js.map +1 -0
  12. package/lib/actions/automation.d.ts +3 -0
  13. package/lib/actions/automation.js +356 -0
  14. package/lib/actions/automation.js.map +1 -0
  15. package/lib/actions/crawl.d.ts +3 -0
  16. package/lib/actions/crawl.js +28 -0
  17. package/lib/actions/crawl.js.map +1 -0
  18. package/lib/actions/errors.d.ts +53 -0
  19. package/lib/actions/errors.js +178 -0
  20. package/lib/actions/errors.js.map +1 -0
  21. package/lib/actions/index-view.d.ts +42 -0
  22. package/lib/actions/index-view.js +268 -0
  23. package/lib/actions/index-view.js.map +1 -0
  24. package/lib/actions/inspect.d.ts +3 -0
  25. package/lib/actions/inspect.js +35 -0
  26. package/lib/actions/inspect.js.map +1 -0
  27. package/lib/actions/observe.d.ts +3 -0
  28. package/lib/actions/observe.js +121 -0
  29. package/lib/actions/observe.js.map +1 -0
  30. package/lib/actions/opencli.d.ts +3 -0
  31. package/lib/actions/opencli.js +51 -0
  32. package/lib/actions/opencli.js.map +1 -0
  33. package/lib/actions/registry.d.ts +35 -0
  34. package/lib/actions/registry.js +89 -0
  35. package/lib/actions/registry.js.map +1 -0
  36. package/lib/actions/run.d.ts +34 -0
  37. package/lib/actions/run.js +226 -0
  38. package/lib/actions/run.js.map +1 -0
  39. package/lib/actions/runtime.d.ts +3 -0
  40. package/lib/actions/runtime.js +33 -0
  41. package/lib/actions/runtime.js.map +1 -0
  42. package/lib/actions/schema.d.ts +31 -0
  43. package/lib/actions/schema.js +309 -0
  44. package/lib/actions/schema.js.map +1 -0
  45. package/lib/actions/script.d.ts +3 -0
  46. package/lib/actions/script.js +97 -0
  47. package/lib/actions/script.js.map +1 -0
  48. package/lib/actions/shared.d.ts +31 -0
  49. package/lib/actions/shared.js +45 -0
  50. package/lib/actions/shared.js.map +1 -0
  51. package/lib/actions/surface.d.ts +22 -0
  52. package/lib/actions/surface.js +18 -0
  53. package/lib/actions/surface.js.map +1 -0
  54. package/lib/actions/target.d.ts +3 -0
  55. package/lib/actions/target.js +66 -0
  56. package/lib/actions/target.js.map +1 -0
  57. package/lib/actions/types.d.ts +181 -0
  58. package/lib/actions/types.js +48 -0
  59. package/lib/actions/types.js.map +1 -0
  60. package/lib/activation-rules.d.ts +29 -0
  61. package/lib/activation-rules.js +33 -0
  62. package/lib/activation-rules.js.map +1 -0
  63. package/lib/approval-policy.d.ts +40 -2
  64. package/lib/approval-policy.js +184 -97
  65. package/lib/approval-policy.js.map +1 -1
  66. package/lib/automation-assets-rpc.d.ts +8 -2
  67. package/lib/automation-assets-rpc.js +68 -10
  68. package/lib/automation-assets-rpc.js.map +1 -1
  69. package/lib/automation-assets.d.ts +152 -4
  70. package/lib/automation-assets.js +255 -15
  71. package/lib/automation-assets.js.map +1 -1
  72. package/lib/automation-convert.d.ts +23 -0
  73. package/lib/automation-convert.js +110 -0
  74. package/lib/automation-convert.js.map +1 -0
  75. package/lib/automation-development.d.ts +26 -0
  76. package/lib/automation-development.js +47 -0
  77. package/lib/automation-development.js.map +1 -1
  78. package/lib/automation-execution.d.ts +57 -1
  79. package/lib/automation-execution.js +167 -11
  80. package/lib/automation-execution.js.map +1 -1
  81. package/lib/automation-journal.d.ts +92 -0
  82. package/lib/automation-journal.js +449 -0
  83. package/lib/automation-journal.js.map +1 -0
  84. package/lib/automation-v2.d.ts +138 -0
  85. package/lib/automation-v2.js +631 -0
  86. package/lib/automation-v2.js.map +1 -0
  87. package/lib/automation.d.ts +82 -5
  88. package/lib/automation.js +239 -82
  89. package/lib/automation.js.map +1 -1
  90. package/lib/browser-service.d.ts +309 -32
  91. package/lib/browser-service.js +636 -182
  92. package/lib/browser-service.js.map +1 -1
  93. package/lib/client/SettingsCard.js +95 -57
  94. package/lib/client/SettingsCard.js.map +1 -1
  95. package/lib/client/asset-editor.d.ts +55 -0
  96. package/lib/client/asset-editor.js +101 -0
  97. package/lib/client/asset-editor.js.map +1 -0
  98. package/lib/client/automation-assets-client.d.ts +99 -2
  99. package/lib/client/automation-assets-client.js +243 -10
  100. package/lib/client/automation-assets-client.js.map +1 -1
  101. package/lib/client/form.d.ts +48 -4
  102. package/lib/client/form.js +142 -29
  103. package/lib/client/form.js.map +1 -1
  104. package/lib/client/index.d.ts +25 -2
  105. package/lib/client/index.js +5 -1
  106. package/lib/client/index.js.map +1 -1
  107. package/lib/client/locales.d.ts +85 -6
  108. package/lib/client/locales.js +64 -12
  109. package/lib/client/locales.js.map +1 -1
  110. package/lib/client/prompts-form.d.ts +67 -0
  111. package/lib/client/prompts-form.js +140 -0
  112. package/lib/client/prompts-form.js.map +1 -0
  113. package/lib/client/prompts-status-client.d.ts +34 -0
  114. package/lib/client/prompts-status-client.js +53 -0
  115. package/lib/client/prompts-status-client.js.map +1 -0
  116. package/lib/client/settings-namespace.d.ts +1 -1
  117. package/lib/client/settings-namespace.js +1 -1
  118. package/lib/client/settings-namespace.js.map +1 -1
  119. package/lib/client.js +1915 -330
  120. package/lib/client.js.map +1 -1
  121. package/lib/config.d.ts +50 -1
  122. package/lib/config.js +31 -1
  123. package/lib/config.js.map +1 -1
  124. package/lib/dialogs.d.ts +37 -0
  125. package/lib/dialogs.js +73 -0
  126. package/lib/dialogs.js.map +1 -0
  127. package/lib/freedom.d.ts +23 -7
  128. package/lib/freedom.js +48 -59
  129. package/lib/freedom.js.map +1 -1
  130. package/lib/index.d.ts +5 -13
  131. package/lib/index.js +51 -30
  132. package/lib/index.js.map +1 -1
  133. package/lib/journal.d.ts +109 -0
  134. package/lib/journal.js +238 -0
  135. package/lib/journal.js.map +1 -0
  136. package/lib/locator.d.ts +82 -0
  137. package/lib/locator.js +190 -0
  138. package/lib/locator.js.map +1 -0
  139. package/lib/observe-script.d.ts +27 -0
  140. package/lib/observe-script.js +565 -0
  141. package/lib/observe-script.js.map +1 -0
  142. package/lib/observe.d.ts +179 -0
  143. package/lib/observe.js +368 -0
  144. package/lib/observe.js.map +1 -0
  145. package/lib/policy-keys.d.ts +30 -0
  146. package/lib/policy-keys.js +34 -0
  147. package/lib/policy-keys.js.map +1 -0
  148. package/lib/prompt-limits.d.ts +30 -0
  149. package/lib/prompt-limits.js +31 -0
  150. package/lib/prompt-limits.js.map +1 -0
  151. package/lib/prompts.d.ts +131 -0
  152. package/lib/prompts.js +295 -0
  153. package/lib/prompts.js.map +1 -0
  154. package/lib/skill.d.ts +100 -0
  155. package/lib/skill.js +181 -0
  156. package/lib/skill.js.map +1 -0
  157. package/lib/tool-defs.d.ts +72 -0
  158. package/lib/tool-defs.js +67 -0
  159. package/lib/tool-defs.js.map +1 -0
  160. package/lib/tools.d.ts +19 -4
  161. package/lib/tools.js +124 -922
  162. package/lib/tools.js.map +1 -1
  163. package/package.json +15 -11
  164. package/scripts/check-host-rpc.mjs +11 -4
  165. package/scripts/dump-prompts.mjs +29 -0
  166. package/scripts/measure-tool-surface.mjs +190 -0
  167. package/lib/settings-scope.d.ts +0 -56
  168. package/lib/settings-scope.js +0 -51
  169. package/lib/settings-scope.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The input-set requirement of activation, as pure functions over stored data.
3
+ *
4
+ * The store enforces it (`AutomationAssetStore.setStatus`) and the settings card explains it next to the Activate
5
+ * button; both call these, so what the card says is what the store will do. Types only, so the card can bundle it.
6
+ * @module dsh-browser/activation-rules
7
+ */
8
+ /** How many input sets one test takes. */
9
+ export const INPUT_SET_MIN = 2;
10
+ export const INPUT_SET_MAX = 5;
11
+ /**
12
+ * How many different input sets the credential's passing test covered: its passed sets, one for a plain single run,
13
+ * and enough for any requirement when it is a `legacy` credential synthesized from data written before input sets
14
+ * existed (so upgrading never strands an already-tested asset).
15
+ */
16
+ export function inputSetsCovered(credential) {
17
+ if (credential.legacy)
18
+ return Number.POSITIVE_INFINITY;
19
+ return credential.inputSets ? credential.inputSets.filter(entry => entry.passed).length : 1;
20
+ }
21
+ /** How many inputs the asset declares (typed `inputSchema` for v2, `inputNames` otherwise). Zero means the rule does not apply. */
22
+ export function declaredInputs(asset) {
23
+ return Math.max(asset.inputSchema?.length ?? 0, asset.inputNames?.length ?? 0);
24
+ }
25
+ /** What stands between this asset and activation on input sets, or undefined when nothing does. `credential` is the latest of the current revision. */
26
+ export function inputSetShortfall(asset, credential, required) {
27
+ const declared = declaredInputs(asset);
28
+ if (declared === 0)
29
+ return undefined;
30
+ const covered = credential ? inputSetsCovered(credential) : 0;
31
+ return covered < required ? { declared, required, covered } : undefined;
32
+ }
33
+ //# sourceMappingURL=activation-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activation-rules.js","sourceRoot":"","sources":["../src/activation-rules.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAE9B;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAwD;IACvF,IAAI,UAAU,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAA;IACtD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED,mIAAmI;AACnI,MAAM,UAAU,cAAc,CAAC,KAA0D;IACvF,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,CAAA;AAChF,CAAC;AAWD,uJAAuJ;AACvJ,MAAM,UAAU,iBAAiB,CAAC,KAA0D,EAAE,UAAoE,EAAE,QAAgB;IAClL,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACtC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACpC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7D,OAAO,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACzE,CAAC"}
@@ -1,4 +1,15 @@
1
- /** Approval classification for multi-action and arbitrary-code browser tools. */
1
+ /**
2
+ * Approval classification, per action.
3
+ *
4
+ * The Host hook resolves a model tool call (`browser_call`, or a flat
5
+ * per-action tool) to an action name plus its arguments and asks this module
6
+ * for a decision. Each action carries an approval class in the registry; the
7
+ * rules below interpret that class for the current automationMode. Reasons
8
+ * name the action and its key arguments, so the user sees `act.click #submit`
9
+ * rather than a generic dispatcher tool.
10
+ * @module dsh-browser/approval-policy
11
+ */
12
+ import { type AnyRecipeStep } from './automation.ts';
2
13
  import { type AutomationMode } from './freedom.ts';
3
14
  export type BrowserPolicyDecision = {
4
15
  kind: 'allow';
@@ -9,4 +20,31 @@ export type BrowserPolicyDecision = {
9
20
  kind: 'ask';
10
21
  reason: string;
11
22
  };
12
- export declare function browserPolicyDecision(name: string, args: unknown, mode?: AutomationMode, assetKind?: 'recipe' | 'userscript'): BrowserPolicyDecision;
23
+ /** An asset as the approval prompt names it: enough to recognise it without the full UUID. */
24
+ export interface AssetRef {
25
+ id: string;
26
+ name: string;
27
+ revision: number;
28
+ }
29
+ /**
30
+ * `"Host check: docs search" r1 (5fdc912d)`: the name (control characters and line breaks flattened, cut to 60 characters,
31
+ * quoted so it reads as data), the revision, and the first 8 characters of the id. The name is whatever a model saved, so
32
+ * it is never trusted to be one line.
33
+ */
34
+ export declare function assetLabel(asset: AssetRef): string;
35
+ /**
36
+ * The one rule for replaying recipe steps: read-only steps run directly; mutating steps are denied in
37
+ * read-only, asked in standard, and free in autonomous and unrestricted. `automation.run_recipe` applies
38
+ * it to the steps in the call, and `automation.develop` test applies it to the steps of the draft.
39
+ */
40
+ export declare function recipeStepsDecision(name: string, steps: readonly AnyRecipeStep[], mode: AutomationMode): BrowserPolicyDecision;
41
+ /**
42
+ * Decide whether a call may run.
43
+ * @param name - an action name (`act.click`) or one of the WebSearch tool names this policy also guards.
44
+ * @param args - the action's own arguments (never the `browser_call` wrapper).
45
+ * @param mode - the configured automationMode.
46
+ * @param assetKind - for `automation.run` and `automation.develop` test, the kind of the asset about to run.
47
+ * @param draftSteps - for `automation.develop` test of a recipe, the steps the draft would replay.
48
+ * @param asset - for the same two, the asset itself, so the approval prompt names it instead of showing a bare id.
49
+ */
50
+ export declare function browserPolicyDecision(name: string, args: unknown, mode?: AutomationMode, assetKind?: 'recipe' | 'userscript', draftSteps?: readonly AnyRecipeStep[], asset?: AssetRef): BrowserPolicyDecision;
@@ -1,107 +1,194 @@
1
- /** Approval classification for multi-action and arbitrary-code browser tools. */
2
- import { recipeNeedsApproval } from "./automation.js";
1
+ /**
2
+ * Approval classification, per action.
3
+ *
4
+ * The Host hook resolves a model tool call (`browser_call`, or a flat
5
+ * per-action tool) to an action name plus its arguments and asks this module
6
+ * for a decision. Each action carries an approval class in the registry; the
7
+ * rules below interpret that class for the current automationMode. Reasons
8
+ * name the action and its key arguments, so the user sees `act.click #submit`
9
+ * rather than a generic dispatcher tool.
10
+ * @module dsh-browser/approval-policy
11
+ */
12
+ import { READ_ONLY_ACTIONS, recipeNeedsApproval } from "./automation.js";
3
13
  import { validateUserscript } from "./scripts.js";
4
- import { isBrowserToolExposed } from "./freedom.js";
5
- const DIRECT_INTERACTIONS = new Set(['browser_click', 'browser_type', 'browser_press', 'browser_select', 'browser_check', 'browser_hover', 'browser_scroll']);
14
+ import { isBrowserActionExposed } from "./freedom.js";
15
+ import { findAction } from "./actions/registry.js";
6
16
  const WEB_LOCAL_MUTATIONS = new Set(['web_cache_clear']);
7
- export function browserPolicyDecision(name, args, mode = 'standard', assetKind) {
8
- if (!isBrowserToolExposed(name, mode) && name.startsWith('browser_')) {
9
- return { kind: 'deny', reason: `Browser tool ${name} is disabled by automationMode=${mode}` };
10
- }
11
- if (DIRECT_INTERACTIONS.has(name)) {
12
- if (mode === 'read-only')
13
- return { kind: 'deny', reason: `Page interaction is disabled by automationMode=${mode}` };
14
- if (mode === 'standard')
15
- return { kind: 'ask', reason: 'Run a direct Playwright page interaction: ' + name };
16
- }
17
- if (name === 'browser_install') {
18
- if (mode === 'read-only')
19
- return { kind: 'deny', reason: `Browser installation is disabled by automationMode=${mode}` };
20
- if (mode === 'unrestricted')
21
- return { kind: 'allow' };
22
- return { kind: 'ask', reason: 'Install Playwright Chromium into the shared browser cache' };
23
- }
24
- if (name === 'browser_set_files') {
25
- const files = Array.isArray(args?.files)
26
- ? args.files.filter(value => typeof value === 'string')
27
- : [];
28
- if (files.length === 0)
29
- return { kind: 'deny', reason: 'browser_set_files requires one or more absolute file paths' };
30
- if (mode === 'read-only')
31
- return { kind: 'deny', reason: `Local file upload is disabled by automationMode=${mode}` };
32
- if (mode === 'unrestricted')
33
- return { kind: 'allow' };
34
- return { kind: 'ask', reason: 'Read local files and expose them to the current website upload control: ' + files.slice(0, 5).join(', ') };
35
- }
36
- if (name === 'browser_evaluate') {
37
- const expression = args?.expression;
38
- if (typeof expression !== 'string' || !expression.trim())
39
- return { kind: 'deny', reason: 'browser_evaluate requires a JavaScript expression' };
40
- if (expression.length > 20_000)
41
- return { kind: 'deny', reason: 'browser_evaluate expression exceeds 20,000 characters' };
42
- if (mode === 'read-only')
43
- return { kind: 'deny', reason: `Page JavaScript execution is disabled by automationMode=${mode}` };
44
- if (mode === 'unrestricted')
45
- return { kind: 'allow' };
46
- return { kind: 'ask', reason: 'Run JavaScript with the current page origin and login state; it may access page storage, non-HttpOnly cookies, and browser-permitted network APIs' };
47
- }
48
- if (name === 'browser_userscript_run') {
49
- const input = args;
50
- if (typeof input.source !== 'string' || typeof input.url !== 'string')
51
- return { kind: 'deny', reason: 'external userscript requires source and URL' };
52
- const validation = validateUserscript(input.source, input.url);
53
- if (!validation.valid)
54
- return { kind: 'deny', reason: 'invalid external userscript: ' + validation.errors.join('; ') };
55
- if (mode === 'read-only')
56
- return { kind: 'deny', reason: `External userscripts are disabled by automationMode=${mode}` };
57
- if (mode === 'unrestricted')
58
- return { kind: 'allow' };
59
- const host = new URL(input.url).hostname;
60
- return {
61
- kind: 'ask',
62
- reason: `Run external userscript "${validation.metadata.name}" (${validation.sha256.slice(0, 12)}) on ${host}; capabilities: ${validation.capabilities.join(', ')}`,
63
- };
17
+ const clip = (text, max = 120) => text.length > max ? text.slice(0, max) + '…' : text;
18
+ /**
19
+ * `"Host check: docs search" r1 (5fdc912d)`: the name (control characters and line breaks flattened, cut to 60 characters,
20
+ * quoted so it reads as data), the revision, and the first 8 characters of the id. The name is whatever a model saved, so
21
+ * it is never trusted to be one line.
22
+ */
23
+ export function assetLabel(asset) {
24
+ const name = clip(asset.name.replace(/[\u0000-\u001f\u007f-\u009f\u2028\u2029]+/g, ' ').replace(/\s+/g, ' ').trim(), 60);
25
+ return `${JSON.stringify(name)} r${asset.revision} (${asset.id.slice(0, 8)})`;
26
+ }
27
+ /** Short, human-readable description of an action's target for approval prompts. */
28
+ function targetLabel(args) {
29
+ const input = (args && typeof args === 'object' ? args : {});
30
+ if (typeof input.selector === 'string')
31
+ return clip(input.selector);
32
+ const locator = input.locator;
33
+ if (locator && typeof locator === 'object') {
34
+ const parts = ['role', 'name', 'text', 'label', 'testId', 'selector', 'css'].filter(key => typeof locator[key] === 'string').map(key => `${key}=${JSON.stringify(clip(String(locator[key]), 60))}`);
35
+ if (parts.length)
36
+ return parts.join(' ');
64
37
  }
65
- if (name === 'browser_opencli_run') {
66
- const input = args;
67
- const argv = Array.isArray(input.args) ? input.args.filter(value => typeof value === 'string') : [];
68
- if (mode === 'read-only')
69
- return { kind: 'deny', reason: `General OpenCLI commands are disabled by automationMode=${mode}` };
70
- if (mode === 'unrestricted')
71
- return { kind: 'allow' };
72
- return { kind: 'ask', reason: 'Run a general OpenCLI command with the logged-in Chrome profile: ' + (argv.slice(0, 3).join(' ') || '(empty)') };
38
+ return '(page)';
39
+ }
40
+ /** `act.fill #q (4 chars)` style summary of a direct interaction. */
41
+ function interactionLabel(name, args) {
42
+ const input = (args && typeof args === 'object' ? args : {});
43
+ const extras = [];
44
+ if ((name === 'act.fill' || name === 'act.type') && typeof input.text === 'string')
45
+ extras.push(`${input.text.length} chars`);
46
+ if (name === 'act.press' && typeof input.key === 'string')
47
+ extras.push(`key ${clip(input.key, 40)}`);
48
+ if (name === 'act.select' && Array.isArray(input.values))
49
+ extras.push('values ' + clip(input.values.map(String).join(',')));
50
+ if (name === 'act.check')
51
+ extras.push(input.checked === false ? 'uncheck' : 'check');
52
+ if (name === 'act.scroll')
53
+ extras.push(`deltaY ${typeof input.deltaY === 'number' ? input.deltaY : 2000}`);
54
+ return `${name} ${targetLabel(args)}${extras.length ? ' (' + extras.join('; ') + ')' : ''}`;
55
+ }
56
+ /**
57
+ * The one rule for replaying recipe steps: read-only steps run directly; mutating steps are denied in
58
+ * read-only, asked in standard, and free in autonomous and unrestricted. `automation.run_recipe` applies
59
+ * it to the steps in the call, and `automation.develop` test applies it to the steps of the draft.
60
+ */
61
+ export function recipeStepsDecision(name, steps, mode) {
62
+ if (!recipeNeedsApproval(steps))
63
+ return { kind: 'allow' };
64
+ const actions = [...new Set(steps.map(step => step.type).filter(type => !READ_ONLY_ACTIONS.has(type)))];
65
+ if (mode === 'read-only')
66
+ return { kind: 'deny', reason: `Mutating recipes are disabled by automationMode=${mode}: ` + actions.join(', ') };
67
+ if (mode === 'autonomous' || mode === 'unrestricted')
68
+ return { kind: 'allow' };
69
+ return { kind: 'ask', reason: `${name}: Run a multi-step Playwright recipe with page mutations: ` + actions.join(', ') };
70
+ }
71
+ /**
72
+ * Decide whether a call may run.
73
+ * @param name - an action name (`act.click`) or one of the WebSearch tool names this policy also guards.
74
+ * @param args - the action's own arguments (never the `browser_call` wrapper).
75
+ * @param mode - the configured automationMode.
76
+ * @param assetKind - for `automation.run` and `automation.develop` test, the kind of the asset about to run.
77
+ * @param draftSteps - for `automation.develop` test of a recipe, the steps the draft would replay.
78
+ * @param asset - for the same two, the asset itself, so the approval prompt names it instead of showing a bare id.
79
+ */
80
+ export function browserPolicyDecision(name, args, mode = 'standard', assetKind, draftSteps, asset) {
81
+ const action = findAction(name);
82
+ if (!action && (name.startsWith('browser_') || /^[a-z]+\.[a-z_]+$/.test(name))) {
83
+ return { kind: 'deny', reason: `Unknown browser action ${name}; browser tools are reached through browser_index / browser_call` };
73
84
  }
74
- if (name === 'browser_recipe_run') {
75
- const input = args;
76
- const steps = Array.isArray(input.steps) ? input.steps : [];
77
- if (recipeNeedsApproval(steps)) {
78
- const actions = [...new Set(steps.map(step => step.type).filter(type => !['wait', 'extract', 'assert', 'screenshot'].includes(type)))];
79
- if (mode === 'read-only')
80
- return { kind: 'deny', reason: `Mutating recipes are disabled by automationMode=${mode}: ` + actions.join(', ') };
81
- if (mode === 'autonomous' || mode === 'unrestricted')
85
+ if (action) {
86
+ if (!isBrowserActionExposed(name, mode, args ?? {}))
87
+ return { kind: 'deny', reason: `Browser action ${name} is disabled by automationMode=${mode}` };
88
+ switch (action.approval) {
89
+ case 'interaction': {
90
+ if (mode === 'read-only')
91
+ return { kind: 'deny', reason: `Page interaction is disabled by automationMode=${mode}` };
92
+ if (mode === 'standard')
93
+ return { kind: 'ask', reason: 'Run a direct Playwright page interaction: ' + interactionLabel(name, args) };
94
+ return { kind: 'allow' };
95
+ }
96
+ case 'install': {
97
+ if (mode === 'read-only')
98
+ return { kind: 'deny', reason: `Browser installation is disabled by automationMode=${mode}` };
99
+ if (mode === 'unrestricted')
100
+ return { kind: 'allow' };
101
+ return { kind: 'ask', reason: `${name}: Install Playwright Chromium into the shared browser cache` };
102
+ }
103
+ case 'upload': {
104
+ const files = Array.isArray(args?.files)
105
+ ? args.files.filter(value => typeof value === 'string')
106
+ : [];
107
+ if (files.length === 0)
108
+ return { kind: 'deny', reason: `${name} requires one or more absolute file paths` };
109
+ if (mode === 'read-only')
110
+ return { kind: 'deny', reason: `Local file upload is disabled by automationMode=${mode}` };
111
+ if (mode === 'unrestricted')
112
+ return { kind: 'allow' };
113
+ return { kind: 'ask', reason: `${name} ${targetLabel(args)}: Read local files and expose them to the current website upload control: ` + files.slice(0, 5).join(', ') };
114
+ }
115
+ case 'evaluate': {
116
+ const expression = args?.expression;
117
+ if (typeof expression !== 'string' || !expression.trim())
118
+ return { kind: 'deny', reason: `${name} requires a JavaScript expression` };
119
+ if (expression.length > 20_000)
120
+ return { kind: 'deny', reason: `${name} expression exceeds 20,000 characters` };
121
+ if (mode === 'read-only')
122
+ return { kind: 'deny', reason: `Page JavaScript execution is disabled by automationMode=${mode}` };
123
+ if (mode === 'unrestricted')
124
+ return { kind: 'allow' };
125
+ return { kind: 'ask', reason: `${name} \`${clip(expression.replace(/\s+/g, ' '), 100)}\`: Run JavaScript with the current page origin and login state; it may access page storage, non-HttpOnly cookies, and browser-permitted network APIs` };
126
+ }
127
+ case 'userscript': {
128
+ const input = (args ?? {});
129
+ if (typeof input.source !== 'string' || typeof input.url !== 'string')
130
+ return { kind: 'deny', reason: 'external userscript requires source and URL' };
131
+ const validation = validateUserscript(input.source, input.url);
132
+ if (!validation.valid)
133
+ return { kind: 'deny', reason: 'invalid external userscript: ' + validation.errors.join('; ') };
134
+ if (mode === 'read-only')
135
+ return { kind: 'deny', reason: `External userscripts are disabled by automationMode=${mode}` };
136
+ if (mode === 'unrestricted')
137
+ return { kind: 'allow' };
138
+ const host = new URL(input.url).hostname;
139
+ return {
140
+ kind: 'ask',
141
+ reason: `${name}: Run external userscript "${validation.metadata.name}" (${validation.sha256.slice(0, 12)}) on ${host}; capabilities: ${validation.capabilities.join(', ')}`,
142
+ };
143
+ }
144
+ case 'opencli': {
145
+ const input = (args ?? {});
146
+ const argv = Array.isArray(input.args) ? input.args.filter(value => typeof value === 'string') : [];
147
+ if (mode === 'read-only')
148
+ return { kind: 'deny', reason: `General OpenCLI commands are disabled by automationMode=${mode}` };
149
+ if (mode === 'unrestricted')
150
+ return { kind: 'allow' };
151
+ return { kind: 'ask', reason: `${name}: Run a general OpenCLI command with the logged-in Chrome profile: ` + (argv.slice(0, 3).join(' ') || '(empty)') };
152
+ }
153
+ case 'recipe': {
154
+ const input = (args ?? {});
155
+ return recipeStepsDecision(name, Array.isArray(input.steps) ? input.steps : [], mode);
156
+ }
157
+ case 'asset-run': {
158
+ const id = args?.id;
159
+ const label = asset ? ` ${assetLabel(asset)}` : typeof id === 'string' ? ` ${clip(id.replace(/\s+/g, ' '), 60)}` : '';
160
+ if (mode === 'read-only')
161
+ return { kind: 'deny', reason: `Reusable automation execution is disabled by automationMode=${mode}` };
162
+ if (mode === 'unrestricted' || (mode === 'autonomous' && assetKind === 'recipe'))
163
+ return { kind: 'allow' };
164
+ return { kind: 'ask', reason: `${name}${label}: Run an active reusable browser automation asset` };
165
+ }
166
+ case 'asset-develop': {
167
+ const develop = String(args?.action ?? '');
168
+ if (['get', 'validate'].includes(develop))
169
+ return { kind: 'allow' };
170
+ if (mode === 'read-only')
171
+ return { kind: 'deny', reason: `Automation draft writes are disabled by automationMode=${mode}` };
172
+ if (develop === 'test') {
173
+ if (mode === 'unrestricted')
174
+ return { kind: 'allow' };
175
+ // Autonomous: a recipe draft is replayed under exactly the rule automation.run_recipe applies to the same steps.
176
+ // A UserScript draft, or a draft we cannot look up, still asks.
177
+ if (mode === 'autonomous' && assetKind === 'recipe' && draftSteps) {
178
+ const byRecipeRule = recipeStepsDecision(name + ' test', draftSteps, mode);
179
+ if (byRecipeRule.kind === 'allow')
180
+ return byRecipeRule;
181
+ }
182
+ return { kind: 'ask', reason: `${name} test${asset ? ' ' + assetLabel(asset) : ''}: Replay a reusable automation draft in a real browser context` };
183
+ }
184
+ if (mode === 'standard')
185
+ return { kind: 'ask', reason: `${name} ${develop || '(unspecified)'}: Save a bounded local reusable automation draft` };
186
+ return { kind: 'allow' };
187
+ }
188
+ case 'none':
82
189
  return { kind: 'allow' };
83
- return { kind: 'ask', reason: 'Run a multi-step Playwright recipe with page mutations: ' + actions.join(', ') };
84
190
  }
85
191
  }
86
- if (name === 'browser_automation_run') {
87
- if (mode === 'read-only')
88
- return { kind: 'deny', reason: `Reusable automation execution is disabled by automationMode=${mode}` };
89
- if (mode === 'unrestricted' || (mode === 'autonomous' && assetKind === 'recipe'))
90
- return { kind: 'allow' };
91
- return { kind: 'ask', reason: 'Run an active reusable browser automation asset' };
92
- }
93
- if (name === 'browser_automation_develop') {
94
- const action = String(args?.action ?? '');
95
- if (['get', 'validate'].includes(action))
96
- return { kind: 'allow' };
97
- if (mode === 'read-only')
98
- return { kind: 'deny', reason: `Automation draft writes are disabled by automationMode=${mode}` };
99
- if (action === 'test' && mode !== 'unrestricted')
100
- return { kind: 'ask', reason: 'Replay a reusable automation draft in a real browser context' };
101
- if (mode === 'standard')
102
- return { kind: 'ask', reason: 'Save a bounded local reusable automation draft' };
103
- return { kind: 'allow' };
104
- }
105
192
  if (name === 'web_deps' && args?.action === 'install') {
106
193
  if (mode === 'read-only')
107
194
  return { kind: 'deny', reason: `Dependency installation is disabled by automationMode=${mode}` };
@@ -1 +1 @@
1
- {"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  /** Loopback-only Host RPC for the automation asset review UI. */
2
2
  import type { Context } from '@deepseek-ai/cordis';
3
- import type { AutomationAssetStore } from './automation-assets.ts';
3
+ import { type AutomationAssetStore } from './automation-assets.ts';
4
4
  import type { BrowserService } from './browser-service.ts';
5
- export declare function registerAutomationAssetRpc(ctx: Context, store: AutomationAssetStore, service: BrowserService): void;
5
+ /** A failure the review UI should tell apart from a transport or storage error. `details.errorCode` names it. */
6
+ export declare class AssetRpcFailure extends Error {
7
+ readonly details: Record<string, unknown>;
8
+ constructor(message: string, details: Record<string, unknown>);
9
+ }
10
+ /** `promptsStatus` answers the settings card's "prompt text" section: the overrides in force, diagnostics and the L0 estimate. */
11
+ export declare function registerAutomationAssetRpc(ctx: Context, store: AutomationAssetStore, service: BrowserService, promptsStatus?: () => unknown): void;
@@ -1,5 +1,9 @@
1
1
  /** Loopback-only Host RPC for the automation asset review UI. */
2
- import { executeAutomationAsset } from "./automation-execution.js";
2
+ import { ActivationRefusedError } from "./automation-assets.js";
3
+ import { executeAutomationAsset, executeDraftInputSets } from "./automation-execution.js";
4
+ import { convertV1ToV2Draft } from "./automation-convert.js";
5
+ import { promptsDumpText } from "./prompts.js";
6
+ import { stripAnsi } from "./actions/errors.js";
3
7
  /**
4
8
  * This plugin's own logical RPC channel.
5
9
  *
@@ -10,8 +14,6 @@ import { executeAutomationAsset } from "./automation-execution.js";
10
14
  * A plugin that owns its endpoints registers a private channel instead.
11
15
  */
12
16
  const CHANNEL = '/dsh-browser-assets';
13
- const PREFIX = 'dsh-browser-assets';
14
- const ENDPOINTS = ['snapshot', 'get', 'save', 'summarize', 'dismiss', 'validate', 'test', 'status'];
15
17
  function record(payload) {
16
18
  if (!payload || typeof payload !== 'object' || Array.isArray(payload))
17
19
  throw new Error('request payload must be an object');
@@ -25,7 +27,25 @@ function stringField(payload, name) {
25
27
  throw new Error(`${name} must be a non-empty string`);
26
28
  return value;
27
29
  }
28
- export function registerAutomationAssetRpc(ctx, store, service) {
30
+ /** A failure the review UI should tell apart from a transport or storage error. `details.errorCode` names it. */
31
+ export class AssetRpcFailure extends Error {
32
+ details;
33
+ constructor(message, details) {
34
+ super(message);
35
+ this.details = details;
36
+ this.name = 'AssetRpcFailure';
37
+ }
38
+ }
39
+ function expectedRevision(payload) {
40
+ const value = payload.expectedRevision;
41
+ if (value === undefined || value === null)
42
+ return undefined;
43
+ if (typeof value !== 'number' || !Number.isInteger(value))
44
+ throw new Error('expectedRevision must be an integer');
45
+ return value;
46
+ }
47
+ /** `promptsStatus` answers the settings card's "prompt text" section: the overrides in force, diagnostics and the L0 estimate. */
48
+ export function registerAutomationAssetRpc(ctx, store, service, promptsStatus) {
29
49
  ctx.inject(['connection', 'webServer'], (connectionCtx) => {
30
50
  // Register the channel with the Host transport rather than hand-rolling the
31
51
  // client-request/server-response envelope on an exact Fetch route. The
@@ -39,11 +59,9 @@ export function registerAutomationAssetRpc(ctx, store, service) {
39
59
  try {
40
60
  // The transport hands the handler the endpoint relative to the channel,
41
61
  // so a request to `/dsh-browser-assets/snapshot` arrives as `snapshot`.
42
- // Accept a prefixed form too, so either address style keeps working.
43
- const leaf = endpoint.startsWith(PREFIX + '/') ? endpoint.slice(PREFIX.length + 1) : endpoint;
44
62
  const payload = record(rawPayload);
45
63
  let value;
46
- switch (leaf) {
64
+ switch (endpoint) {
47
65
  case 'snapshot':
48
66
  value = store.snapshot();
49
67
  break;
@@ -53,6 +71,9 @@ export function registerAutomationAssetRpc(ctx, store, service) {
53
71
  case 'save':
54
72
  value = store.saveDraft(payload.asset);
55
73
  break;
74
+ case 'fork':
75
+ value = store.fork(stringField(payload, 'id'));
76
+ break;
56
77
  case 'summarize':
57
78
  value = store.summarizeCandidate(stringField(payload, 'id'));
58
79
  break;
@@ -64,19 +85,56 @@ export function registerAutomationAssetRpc(ctx, store, service) {
64
85
  value = store.validate(stringField(payload, 'id'));
65
86
  break;
66
87
  case 'test': {
67
- const result = await executeAutomationAsset(service, store, stringField(payload, 'id'), stringField(payload, 'url'), payload.inputs, 'draft');
88
+ if (payload.inputSets !== undefined) {
89
+ if (payload.inputs !== undefined)
90
+ throw new Error('pass either inputs (one run) or inputSets (2 to 5 runs), not both');
91
+ // Each set runs in a fresh context; the credential the store keeps records every set (digests only), which is what the panel shows.
92
+ const replay = await executeDraftInputSets(service, store, stringField(payload, 'id'), stringField(payload, 'url'), payload.inputSets, { expectedRevision: expectedRevision(payload) });
93
+ if (!replay.succeeded) {
94
+ const failed = replay.sets.find(entry => !entry.passed);
95
+ const errorCode = replay.verifierMissing ? 'VALIDATION_MISSING' : failed?.execution.failedStep?.errorCode ?? (failed?.execution.validationStatus === 'failed' ? 'VALIDATION_FAILED' : 'ACTION_FAILED');
96
+ throw new AssetRpcFailure(replay.verifierMissing?.message ?? `Input set ${(failed?.index ?? 0) + 1} of ${replay.planned} did not pass: ${failed?.execution.failedStep?.message ?? failed?.execution.message ?? 'the replay did not complete'}`, { errorCode, failedSet: failed ? failed.index + 1 : undefined, inputSets: replay.planned, setsRun: replay.sets.length, revision: replay.asset.revision });
97
+ }
98
+ value = replay.asset;
99
+ break;
100
+ }
101
+ const result = await executeAutomationAsset(service, store, stringField(payload, 'id'), stringField(payload, 'url'), payload.inputs, 'draft', { expectedRevision: expectedRevision(payload) });
102
+ // The review UI shows a failed replay as an error, as it did when a failure threw. The errorCode lets it
103
+ // say "the result did not hold" (VALIDATION_FAILED / VALIDATION_MISSING) apart from a backend problem.
104
+ if (!result.succeeded) {
105
+ const execution = result.execution;
106
+ const errorCode = result.verifierMissing ? 'VALIDATION_MISSING' : execution.failedStep?.errorCode ?? (execution.validationStatus === 'failed' ? 'VALIDATION_FAILED' : 'ACTION_FAILED');
107
+ throw new AssetRpcFailure(result.verifierMissing?.message ?? execution.failedStep?.message ?? execution.message ?? 'Runtime replay did not complete.', { errorCode, executionStatus: execution.executionStatus, validationStatus: execution.validationStatus, effects: execution.effects, revision: result.asset.revision });
108
+ }
68
109
  value = result.asset;
69
110
  break;
70
111
  }
112
+ case 'convert': {
113
+ // Same conversion as `automation.develop convert`: the source is only read; the result is a NEW v2 draft.
114
+ const source = store.get(stringField(payload, 'id'));
115
+ if (!source)
116
+ throw new Error('automation asset not found');
117
+ const conversion = convertV1ToV2Draft(source);
118
+ value = { draft: store.saveDraft(conversion.draft), pendingDisambiguation: conversion.pendingDisambiguation, notes: conversion.notes };
119
+ break;
120
+ }
121
+ case 'prompts':
122
+ value = promptsStatus ? promptsStatus() : null;
123
+ break;
124
+ // The same JSON `prompts:dump` prints, for installs that have no script environment.
125
+ case 'promptsDefaults':
126
+ value = { json: promptsDumpText() };
127
+ break;
71
128
  case 'status':
72
- value = store.setStatus(stringField(payload, 'id'), stringField(payload, 'status'));
129
+ value = store.setStatus(stringField(payload, 'id'), stringField(payload, 'status'), { expectedRevision: expectedRevision(payload) });
73
130
  break;
74
131
  default: return { ok: false, error: { code: 'not-found', message: `unknown automation asset endpoint: ${endpoint}`, details: {} } };
75
132
  }
76
133
  return { ok: true, value };
77
134
  }
78
135
  catch (error) {
79
- return { ok: false, error: { code: 'bad-request', message: String(error instanceof Error ? error.message : error).slice(0, 500), details: {} } };
136
+ const details = error instanceof AssetRpcFailure ? error.details : error instanceof ActivationRefusedError ? { errorCode: 'ACTIVATION_REFUSED', reason: error.reason } : {};
137
+ return { ok: false, error: { code: 'bad-request', message: stripAnsi(String(error instanceof Error ? error.message : error)).slice(0, 500), details } };
80
138
  }
81
139
  };
82
140
  connectionCtx.effect(() => connection.rpc.handle(CHANNEL, handler), 'dsh-browser: automation asset RPC channel');
@@ -1 +1 @@
1
- {"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAIjE,OAAO,EAAE,sBAAsB,EAA+E,MAAM,wBAAwB,CAAA;AAE5I,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,SAAS,MAAM,CAAC,OAAgB;IAC9B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;IAC3H,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC1G,OAAO,OAAkC,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,OAAgC,EAAE,IAAY;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,6BAA6B,CAAC,CAAA;IAC9H,OAAO,KAAK,CAAA;AACd,CAAC;AAED,iHAAiH;AACjH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACF;IAAtC,YAAY,OAAe,EAAW,OAAgC;QACpE,KAAK,CAAC,OAAO,CAAC,CAAA;QADsB,YAAO,GAAP,OAAO,CAAyB;QAEpE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAA;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACjH,OAAO,KAAK,CAAA;AACd,CAAC;AAED,kIAAkI;AAClI,MAAM,UAAU,0BAA0B,CAAC,GAAY,EAAE,KAA2B,EAAE,OAAuB,EAAE,aAA6B;IAC1I,GAAG,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE;QACxD,4EAA4E;QAC5E,uEAAuE;QACvE,4EAA4E;QAC5E,yEAAyE;QACzE,wCAAwC;QACxC,wEAAwE;QACxE,6EAA6E;QAC7E,MAAM,UAAU,GAAI,aAAa,CAAC,IAOhC,CAAC,UAAU,CAAA;QACb,MAAM,OAAO,GAAyB,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE;YACnE,IAAI,CAAC;gBACH,wEAAwE;gBACxE,wEAAwE;gBACxE,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;gBAClC,IAAI,KAAc,CAAA;gBAClB,QAAQ,QAAQ,EAAE,CAAC;oBACjB,KAAK,UAAU;wBAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAAC,MAAK;oBAChD,KAAK,KAAK;wBAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;wBAAC,MAAK;oBACxE,KAAK,MAAM;wBAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,KAA0E,CAAC,CAAC;wBAAC,MAAK;oBAC/H,KAAK,MAAM;wBAAE,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;wBAAC,MAAK;oBAClE,KAAK,WAAW;wBAAE,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;wBAAC,MAAK;oBACrF,KAAK,SAAS;wBAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;wBAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;wBAAC,MAAK;oBACnG,KAAK,UAAU;wBAAE,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;wBAAC,MAAK;oBAC1E,KAAK,MAAM,CAAC,CAAC,CAAC;wBACZ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;4BACpC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;gCAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAA;4BACtH,oIAAoI;4BACpI,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;4BACvL,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gCACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gCACvD,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAA;gCACtM,MAAM,IAAI,eAAe,CACvB,MAAM,CAAC,eAAe,EAAE,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,kBAAkB,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,OAAO,IAAI,MAAM,EAAE,SAAS,CAAC,OAAO,IAAI,6BAA6B,EAAE,EACpN,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CACzJ,CAAA;4BACH,CAAC;4BACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;4BACpB,MAAK;wBACP,CAAC;wBACD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;wBAC9L,yGAAyG;wBACzG,uGAAuG;wBACvG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;4BACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;4BAClC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAA;4BACtL,MAAM,IAAI,eAAe,CACvB,MAAM,CAAC,eAAe,EAAE,OAAO,IAAI,SAAS,CAAC,UAAU,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,IAAI,kCAAkC,EAC3H,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,eAAe,EAAE,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CACrK,CAAA;wBACH,CAAC;wBACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;wBACpB,MAAK;oBACP,CAAC;oBACD,KAAK,SAAS,CAAC,CAAC,CAAC;wBACf,0GAA0G;wBAC1G,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;wBACpD,IAAI,CAAC,MAAM;4BAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;wBAC1D,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;wBAC7C,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,qBAAqB,EAAE,UAAU,CAAC,qBAAqB,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAA;wBACtI,MAAK;oBACP,CAAC;oBACD,KAAK,SAAS;wBAAE,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBAAC,MAAK;oBACrE,qFAAqF;oBACrF,KAAK,iBAAiB;wBAAE,KAAK,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC;wBAAC,MAAK;oBAClE,KAAK,QAAQ;wBAAE,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,EAAE,QAAQ,CAA0B,EAAE,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;wBAAC,MAAK;oBACnL,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,sCAAsC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAA;gBAC9I,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,sBAAsB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC3K,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAsB,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAA;YAClK,CAAC;QACH,CAAC,CAAA;QACD,aAAa,CAAC,MAAM,CAClB,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAC7C,2CAA2C,CAC5C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}