@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,147 @@
1
+ /** `act` group: interact with the page. @module dsh-browser/actions/act */
2
+ import { EXPECT_PARAMS, TARGET_PARAMS } from "./schema.js";
3
+ import { expectOf, targetOf } from "./shared.js";
4
+ const TIMEOUT = { type: 'number', description: 'Target timeout 1-30000 ms.' };
5
+ export const ACT_ACTIONS = [
6
+ {
7
+ name: 'act.click',
8
+ group: 'act',
9
+ summary: 'Click an element (CSS selector or role/text/label locator); returns the updated page state.',
10
+ params: { ...TARGET_PARAMS, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
11
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
12
+ examples: [{ args: { locator: { role: 'button', name: 'Search' } } }, { args: { selector: '#submit' } }],
13
+ async execute(args, ctx) {
14
+ return ctx.service.click(targetOf(args), { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
15
+ },
16
+ },
17
+ {
18
+ name: 'act.fill',
19
+ group: 'act',
20
+ summary: 'Fill text into an input/textarea (replaces its value); returns the page state.',
21
+ notes: 'To empty a field use act.clear.',
22
+ params: { ...TARGET_PARAMS, text: { type: 'string', required: true, description: 'Text to enter.' }, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
23
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
24
+ examples: [{ args: { locator: { label: 'Query' }, text: 'dsh' } }],
25
+ async execute(args, ctx) {
26
+ return ctx.service.type(targetOf(args), args.text, { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
27
+ },
28
+ },
29
+ {
30
+ name: 'act.type',
31
+ group: 'act',
32
+ summary: 'Type text key by key into the located element (fires key events); use act.fill to replace a value at once.',
33
+ notes: 'Appends at the caret. Use it for inputs that react to every keystroke (autocomplete, masked fields). To empty a field use act.clear.',
34
+ params: { ...TARGET_PARAMS, text: { type: 'string', required: true, description: 'Text to type, 1-10000 characters.' }, delayMs: { type: 'number', description: 'Delay between keys, 0-1000 ms. Default 0.' }, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
35
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 60_000,
36
+ examples: [{ args: { locator: { role: 'combobox', name: 'City' }, text: 'Ams', delayMs: 50 } }],
37
+ async execute(args, ctx) {
38
+ return ctx.service.typeKeys(targetOf(args), args.text, { ...expectOf(args), ...args.delayMs !== undefined ? { delayMs: args.delayMs } : {}, ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
39
+ },
40
+ },
41
+ {
42
+ name: 'act.clear',
43
+ group: 'act',
44
+ summary: 'Empty an input/textarea (fires the input event, so controlled fields update); returns the page state.',
45
+ params: { ...TARGET_PARAMS, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
46
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
47
+ examples: [{ args: { locator: { label: 'Query' } } }],
48
+ async execute(args, ctx) {
49
+ return ctx.service.clear(targetOf(args), { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
50
+ },
51
+ },
52
+ {
53
+ name: 'act.press',
54
+ group: 'act',
55
+ summary: 'Press a key globally or on an element (Enter, ArrowDown, Control+Enter).',
56
+ params: { ...TARGET_PARAMS, key: { type: 'string', required: true, description: 'Playwright key such as Enter, ArrowDown, or Control+Enter.' }, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
57
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
58
+ examples: [{ args: { key: 'Enter' } }],
59
+ async execute(args, ctx) {
60
+ return ctx.service.press(targetOf(args, false), args.key, { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
61
+ },
62
+ },
63
+ {
64
+ name: 'act.select',
65
+ group: 'act',
66
+ summary: 'Select one or more option values in a dropdown.',
67
+ params: { ...TARGET_PARAMS, values: { type: 'array', required: true, items: { type: 'string' }, description: '1-20 option values.' }, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
68
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
69
+ examples: [{ args: { selector: '#country', values: ['NL'] } }],
70
+ async execute(args, ctx) {
71
+ return ctx.service.select(targetOf(args), args.values, { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
72
+ },
73
+ },
74
+ {
75
+ name: 'act.check',
76
+ group: 'act',
77
+ summary: 'Check or uncheck a checkbox or radio control.',
78
+ params: { ...TARGET_PARAMS, checked: { type: 'boolean', description: 'True to check, false to uncheck. Defaults to true.' }, timeoutMs: TIMEOUT, ...EXPECT_PARAMS },
79
+ approval: 'interaction', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
80
+ examples: [{ args: { locator: { role: 'checkbox', name: 'Remember me' }, checked: true } }],
81
+ async execute(args, ctx) {
82
+ return ctx.service.check(targetOf(args), args.checked ?? true, { ...expectOf(args), ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {}, session: ctx.session });
83
+ },
84
+ },
85
+ {
86
+ name: 'act.hover',
87
+ group: 'act',
88
+ summary: 'Hover an element (menus, tooltips) and return the updated page state.',
89
+ params: { ...TARGET_PARAMS, waitMs: { type: 'number', description: 'Settle time after hovering, 0 to the action timeout. Default 300 ms.' }, ...EXPECT_PARAMS },
90
+ approval: 'interaction', readOnly: false, mutating: false, concurrencySafe: false, timeoutMs: 30_000,
91
+ examples: [{ args: { selector: '#menu' } }],
92
+ async execute(args, ctx) {
93
+ return ctx.service.hover(targetOf(args), { ...expectOf(args), ...args.waitMs !== undefined ? { waitMs: args.waitMs } : {}, session: ctx.session });
94
+ },
95
+ },
96
+ {
97
+ name: 'act.scroll',
98
+ group: 'act',
99
+ summary: 'Scroll the page vertically by deltaY pixels (positive = down) to trigger lazy loading.',
100
+ params: { deltaY: { type: 'number', description: 'Pixels to scroll; positive scrolls down. Default 2000.' }, ...EXPECT_PARAMS },
101
+ approval: 'interaction', readOnly: false, mutating: false, concurrencySafe: false, timeoutMs: 20_000,
102
+ examples: [{ args: { deltaY: 1500 } }],
103
+ async execute(args, ctx) {
104
+ return ctx.service.scroll(args.deltaY ?? 2000, { ...expectOf(args), session: ctx.session });
105
+ },
106
+ },
107
+ {
108
+ name: 'act.upload',
109
+ group: 'act',
110
+ summary: 'Set existing local files on an input[type=file]. Paths must be absolute regular files (max 20, 512 MiB total).',
111
+ notes: 'The action reads the files for upload but never modifies them. Approval shows the requested paths unless automationMode=unrestricted.',
112
+ params: { ...TARGET_PARAMS, files: { type: 'array', required: true, items: { type: 'string' }, description: '1-20 absolute local file paths, at most 512 MiB total.' }, ...EXPECT_PARAMS },
113
+ approval: 'upload', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 30_000,
114
+ errors: ['POLICY_DENIED (empty or non-absolute paths)'],
115
+ examples: [{ args: { selector: 'input[type=file]', files: ['/abs/path/report.pdf'] } }],
116
+ async execute(args, ctx) {
117
+ return ctx.service.setFiles(targetOf(args), args.files, { ...expectOf(args), session: ctx.session });
118
+ },
119
+ },
120
+ {
121
+ name: 'act.wait',
122
+ group: 'act',
123
+ summary: 'Wait for exactly one of: an element state, a URL pattern, network idle, or a fixed delay.',
124
+ params: {
125
+ ...TARGET_PARAMS,
126
+ state: { type: 'string', enum: ['visible', 'hidden', 'attached', 'detached'], description: 'Element state. Defaults to visible.' },
127
+ urlPattern: { type: 'string', description: 'Playwright URL glob to wait for.' },
128
+ networkIdle: { type: 'boolean', description: 'Set true to wait for networkidle.' },
129
+ timeMs: { type: 'number', description: 'Fixed delay 0-10000 ms.' },
130
+ timeoutMs: { type: 'number', description: 'Condition timeout 0-30000 ms. Default 15000.' },
131
+ },
132
+ approval: 'none', readOnly: true, mutating: false, concurrencySafe: false, timeoutMs: 35_000,
133
+ examples: [{ args: { locator: { text: 'Results' } } }, { args: { networkIdle: true } }],
134
+ async execute(args, ctx) {
135
+ const target = targetOf(args, false);
136
+ return ctx.service.wait(target, {
137
+ ...args.state ? { state: args.state } : {},
138
+ ...args.urlPattern ? { urlPattern: args.urlPattern } : {},
139
+ ...args.networkIdle !== undefined ? { networkIdle: args.networkIdle } : {},
140
+ ...args.timeMs !== undefined ? { timeMs: args.timeMs } : {},
141
+ ...args.timeoutMs !== undefined ? { timeoutMs: args.timeoutMs } : {},
142
+ session: ctx.session,
143
+ });
144
+ },
145
+ },
146
+ ];
147
+ //# sourceMappingURL=act.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"act.js","sourceRoot":"","sources":["../../src/actions/act.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** `automation` group: reusable assets and inline recipes. @module dsh-browser/actions/automation */
2
+ import type { ActionDef } from './types.ts';
3
+ export declare const AUTOMATION_ACTIONS: ActionDef[];
@@ -0,0 +1,356 @@
1
+ /** `automation` group: reusable assets and inline recipes. @module dsh-browser/actions/automation */
2
+ import { ActionArgError, ActionUnavailableError, withOutcome } from "./types.js";
3
+ import { RecipeValidationError, hintFor } from "./errors.js";
4
+ import { normalizePostconditions } from "../automation-v2.js";
5
+ import { executeAutomationAsset, executeDraftInputSets } from "../automation-execution.js";
6
+ import { capJson, recipeOutcome } from "./shared.js";
7
+ /** After the deadline aborts a recipe, how long to wait for its in-flight step to return (a step times out within 30 s). */
8
+ const RECIPE_SETTLE_MS = 40_000;
9
+ const DEVELOP_LIMIT = 100_000;
10
+ /** Wrap an asset-development result: structured when small, truncated JSON text when large. */
11
+ function developmentResult(action, value, asset) {
12
+ const capped = capJson(value, DEVELOP_LIMIT);
13
+ return { action, ...asset ? { assetId: asset.id, status: asset.status } : {}, result: capped.value, truncated: capped.truncated };
14
+ }
15
+ export const AUTOMATION_ACTIONS = [
16
+ {
17
+ name: 'automation.search',
18
+ group: 'automation',
19
+ summary: 'Search reusable browser automations by task keywords and optional domain; compact metadata only.',
20
+ notes: 'Run this at the start of a task: a verified asset can be run with automation.run instead of re-exploring. Never returns recipe steps or userscript source.',
21
+ params: {
22
+ query: { type: 'string', required: true, description: 'Short task description.' },
23
+ domain: { type: 'string', description: 'Optional target hostname.' },
24
+ status: { type: 'string', enum: ['active', 'draft', 'archived', 'all'], description: 'Asset lifecycle scope. Defaults to active.' },
25
+ kind: { type: 'string', enum: ['recipe', 'userscript'], description: 'Optional asset kind.' },
26
+ },
27
+ approval: 'none', readOnly: true, mutating: false, concurrencySafe: true, timeoutMs: 10_000,
28
+ examples: [{ args: { query: 'search issues', domain: 'github.com' } }],
29
+ async execute(args, ctx) {
30
+ return { items: ctx.assets?.search(args.query, args.domain, args.status, args.kind) ?? [] };
31
+ },
32
+ },
33
+ {
34
+ name: 'automation.develop',
35
+ group: 'automation',
36
+ summary: 'Get, save, validate, test, convert (v1 to v2), fork (repair copy) or draft_from_journal (explored steps to a v2 draft). Never activates assets.',
37
+ notes: 'One tool, sub-actions selected by `action`; browser_index({action:"automation.develop.<sub>"}) gives one sub-action\'s full schema. Every save is a new revision; a test is bound to its revision and only the user can activate a tested revision.',
38
+ params: {
39
+ action: { type: 'string', required: true, enum: ['get', 'save', 'validate', 'test', 'convert', 'fork', 'draft_from_journal'] },
40
+ id: { type: 'string', description: 'asset id; omit on save to create' },
41
+ kind: { type: 'string', enum: ['recipe', 'userscript'], description: 'save' },
42
+ name: { type: 'string', description: 'save' },
43
+ description: { type: 'string' },
44
+ domains: { type: 'array', items: { type: 'string' } },
45
+ tags: { type: 'array', items: { type: 'string' }, description: 'retrieval keywords' },
46
+ inputNames: { type: 'array', items: { type: 'string' }, description: 'UserScript input keys' },
47
+ schemaVersion: { type: 'number', description: '1 or 2; use 2 (omitted: new=1, edit keeps)' },
48
+ recipe: { type: 'array', items: { ref: 'recipeStep' }, description: '1-25 steps.' },
49
+ inputSchema: { type: 'array', items: { ref: 'inputSpec' }, description: 'v2 typed inputs.' },
50
+ outputSchema: { type: 'array', items: { ref: 'outputSpec' }, description: 'v2 named outputs.' },
51
+ postconditions: { type: 'array', items: { ref: 'postcondition' }, description: 'v2: verified after the steps' },
52
+ requiredCapabilities: { type: 'array', items: { type: 'string' }, description: 'v2: recorded only' },
53
+ source: { type: 'string', description: 'UserScript' },
54
+ url: { type: 'string', description: 'test: inside the draft domains' },
55
+ inputs: { type: 'object', additionalProperties: true, description: 'test inputs' },
56
+ inputSets: { type: 'array', items: { type: 'object', additionalProperties: true }, description: 'test: 2-5 input objects, each replayed in a fresh browser context' },
57
+ fromSeq: { type: 'number', description: 'draft_from_journal: first journal seq (default: the first)' },
58
+ toSeq: { type: 'number', description: 'draft_from_journal: last journal seq (default: the last)' },
59
+ exclude: { type: 'array', items: { type: 'number' }, description: 'draft_from_journal: seq to leave out (failed calls and observations are left out already)' },
60
+ parameters: { type: 'array', items: { type: 'object', additionalProperties: false, properties: { seq: { type: 'number', required: true }, field: { type: 'string', required: true, enum: ['text', 'values', 'url'] }, name: { type: 'string', required: true }, type: { type: 'string', enum: ['string', 'number'] } } }, description: 'draft_from_journal: turn the typed text / chosen option / later opened url of a seq into an input' },
61
+ extract: { type: 'array', items: { type: 'object', additionalProperties: false, properties: { seq: { type: 'number', required: true }, as: { type: 'string', required: true }, mode: { type: 'string', enum: ['text', 'html', 'links'] }, limit: { type: 'number' }, dedupe: { type: 'boolean' } } }, description: 'draft_from_journal: turn an observe.read seq into a named extract output' },
62
+ authProfile: { type: 'string' },
63
+ rulePack: { type: 'string' },
64
+ },
65
+ approval: 'asset-develop', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 120_000, settleMs: RECIPE_SETTLE_MS,
66
+ errors: ['VALIDATION_FAILED', 'VALIDATION_MISSING', 'OUTCOME_UNKNOWN'],
67
+ subActions: {
68
+ key: 'action',
69
+ common: ['action', 'id'],
70
+ items: {
71
+ get: {
72
+ summary: 'Read one asset in full, steps or source included, with its revision, contentHash and test credentials.',
73
+ params: ['id'], required: ['id'], hints: { id: 'asset id' }, errors: ['NOT_FOUND'],
74
+ traits: { readOnly: true, mutating: false, concurrencySafe: true },
75
+ },
76
+ validate: {
77
+ summary: 'Static check of a stored draft (no browser): structure, domains, inputs.',
78
+ params: ['id'], required: ['id'], hints: { id: 'asset id' }, errors: ['NOT_FOUND', 'INVALID_RECIPE'],
79
+ traits: { readOnly: true, mutating: false, concurrencySafe: true },
80
+ },
81
+ save: {
82
+ summary: 'Create a draft (omit id) or replace a whole draft. Every save is a new revision and clears its test result.',
83
+ params: ['id', 'kind', 'name', 'description', 'domains', 'tags', 'inputNames', 'schemaVersion', 'recipe', 'inputSchema', 'outputSchema', 'postconditions', 'requiredCapabilities', 'source'],
84
+ required: ['kind', 'name'], hints: { id: 'existing draft to replace; omit to create', kind: '', name: '' }, errors: ['INVALID_RECIPE', 'POLICY_DENIED'],
85
+ notes: 'Send every field each time. Use schemaVersion 2: strict `locator` steps (several matches => LOCATOR_AMBIGUOUS, step not run). An active asset cannot be saved over: fork it.',
86
+ examples: [{
87
+ args: {
88
+ action: 'save', kind: 'recipe', schemaVersion: 2, name: 'Search', domains: ['example.com'],
89
+ recipe: [
90
+ { type: 'fill', locator: { label: 'Query' }, value: '{{query}}' },
91
+ { type: 'click', locator: { role: 'button', name: 'Search' } },
92
+ { type: 'extract', locator: { css: '#results' }, as: 'results' },
93
+ ],
94
+ postconditions: [{ output: 'results', nonEmpty: true }],
95
+ },
96
+ }],
97
+ },
98
+ draft_from_journal: {
99
+ summary: 'Turn the calls you explored with (this session\'s journal) into a saved v2 draft, with a map back to each call.',
100
+ params: ['id', 'name', 'description', 'domains', 'postconditions', 'fromSeq', 'toSeq', 'exclude', 'parameters', 'extract'], required: ['name'],
101
+ hints: { id: 'replace the draft of an earlier call; omit to create', name: '', description: '', domains: 'default: hosts the pages had', postconditions: 'checks the result; without them a test cannot pass' },
102
+ errors: ['INVALID_ARGS', 'INVALID_RECIPE'],
103
+ notes: 'Each browser_call reply has a seq. Failed calls and observe calls are left out; fill/type text, act.select and later target.open become inputs only via `parameters`. `extract` names the observe.read (with a locator) whose text is the result. The reply lists sourceMap (seq to step), unmapped (actions a recipe cannot express: the draft is then incomplete and cannot be activated), pendingDisambiguation, parameterCandidates, suggestedPostconditions and warnings. Then test with inputSets.',
104
+ examples: [{ args: { action: 'draft_from_journal', name: 'Keyword search', parameters: [{ seq: 3, field: 'text', name: 'keyword' }], extract: [{ seq: 6, as: 'items', dedupe: true }], postconditions: [{ output: 'items', allowEmpty: true }, { selector: '#status' }] } }],
105
+ },
106
+ test: {
107
+ summary: 'Replay a draft in a real browser. The result is recorded as a credential bound to the draft\'s current revision and content.',
108
+ params: ['id', 'url', 'inputs', 'inputSets', 'authProfile', 'rulePack'], required: ['id', 'url'], hints: { id: 'draft id', url: 'inside the draft domains', inputs: '', inputSets: '2-5 input objects; each runs in a fresh context; all must pass' },
109
+ errors: ['VALIDATION_FAILED', 'VALIDATION_MISSING', 'OUTCOME_UNKNOWN', 'LOCATOR_NOT_FOUND', 'LOCATOR_AMBIGUOUS'],
110
+ notes: 'A v2 test passes only if an assert step or a postcondition checks the result; otherwise it fails with VALIDATION_MISSING. url must be inside the draft\'s domains. A recipe draft is approved like automation.run_recipe in autonomous mode; a UserScript draft asks.',
111
+ examples: [{ args: { action: 'test', id: 'draft-id', url: 'https://example.com/search', inputs: { query: 'dsh' } } }],
112
+ },
113
+ convert: {
114
+ summary: 'Copy a v1 recipe asset (any status) into a NEW v2 draft; the original is not changed.',
115
+ params: ['id'], required: ['id'], hints: { id: 'v1 recipe asset id' }, errors: ['NOT_FOUND', 'INVALID_RECIPE'],
116
+ notes: 'The draft records sourceAssetId and sourceRevision. Steps that still take the first match are listed in pendingDisambiguation.',
117
+ },
118
+ fork: {
119
+ summary: 'Copy any asset, typically an active one that broke, into a NEW editable draft that records sourceAssetId and sourceRevision.',
120
+ params: ['id'], required: ['id'], hints: { id: 'asset to copy' }, errors: ['NOT_FOUND', 'POLICY_DENIED'],
121
+ notes: 'The source keeps running and is not touched by the draft\'s tests. When the user activates the tested draft, the source is archived.',
122
+ examples: [{ args: { action: 'fork', id: 'active-asset-id' } }],
123
+ },
124
+ },
125
+ },
126
+ examples: [
127
+ {
128
+ args: {
129
+ action: 'save', kind: 'recipe', schemaVersion: 2, name: 'Search', domains: ['example.com'],
130
+ recipe: [
131
+ { type: 'fill', locator: { label: 'Query' }, value: '{{query}}' },
132
+ { type: 'click', locator: { role: 'button', name: 'Search' } },
133
+ { type: 'extract', locator: { css: '#results' }, as: 'results' },
134
+ ],
135
+ postconditions: [{ output: 'results', nonEmpty: true }],
136
+ },
137
+ },
138
+ ],
139
+ async execute(args, ctx) {
140
+ const { assets, development } = ctx;
141
+ if (!assets || !development)
142
+ throw new ActionUnavailableError('model automation development is disabled');
143
+ if (args.action === 'get') {
144
+ if (!args.id)
145
+ throw new Error('automation development get requires id');
146
+ const asset = development.get(args.id);
147
+ return developmentResult('get', asset, asset);
148
+ }
149
+ if (args.action === 'validate') {
150
+ if (!args.id)
151
+ throw new Error('automation development validate requires id');
152
+ const asset = development.validate(args.id);
153
+ return developmentResult('validate', { id: asset.id, kind: asset.kind, status: asset.status, testStatus: asset.testStatus, testMessage: asset.testMessage }, asset);
154
+ }
155
+ if (args.action === 'test' && args.inputSets !== undefined) {
156
+ if (!args.id || !args.url)
157
+ throw new Error('automation development test requires id and url');
158
+ if (args.inputs !== undefined)
159
+ throw new ActionArgError('pass either inputs (one run in the session page) or inputSets (2-5 runs, each in a fresh context), not both');
160
+ const replay = await executeDraftInputSets(ctx.service, assets, args.id, args.url, args.inputSets, {
161
+ signal: ctx.signal,
162
+ ...args.authProfile ? { authProfile: args.authProfile } : {},
163
+ ...args.rulePack ? { rulePack: args.rulePack } : {},
164
+ session: ctx.session,
165
+ });
166
+ const shown = (entry) => {
167
+ const { completedSteps: _steps, outputs: _outputs, evidenceLevel: _level, ...run } = entry.execution;
168
+ const capped = capJson(entry.produced, 8_000);
169
+ return { set: entry.index + 1, passed: entry.passed, ...run, inputsDigest: entry.inputsDigest, outputs: capped.value, ...capped.truncated ? { outputsTruncated: true } : {} };
170
+ };
171
+ const failed = replay.sets.find(entry => !entry.passed);
172
+ const body = {
173
+ action: 'test', assetId: replay.asset.id, status: replay.asset.status,
174
+ revision: replay.asset.revision, contentHash: replay.asset.contentHash,
175
+ testStatus: replay.asset.testStatus, testMessage: replay.asset.testMessage,
176
+ inputSets: replay.planned, setsRun: replay.sets.length,
177
+ sets: replay.sets.map(shown),
178
+ ...replay.suspect ? { warnings: [{ code: 'PARAMETERIZATION_SUSPECT', sets: replay.identicalOutputs.map(pair => pair.map(index => index + 1)), message: 'different inputs produced identical outputs: the input may not really drive the result. The test still passed; check that the placeholder reaches the page.' }] } : {},
179
+ ...failed ? { failedSet: failed.index + 1 } : {},
180
+ };
181
+ if (replay.verifierMissing) {
182
+ return withOutcome(body, { ok: false, executionStatus: 'completed', error: { code: 'VALIDATION_MISSING', message: replay.verifierMissing.message, hint: hintFor('VALIDATION_MISSING') } });
183
+ }
184
+ if (failed)
185
+ return withOutcome(body, recipeOutcome(failed.execution));
186
+ return withOutcome(body, { ok: true, executionStatus: 'completed' });
187
+ }
188
+ if (args.action === 'test') {
189
+ if (!args.id || !args.url)
190
+ throw new Error('automation development test requires id and url');
191
+ const result = await executeAutomationAsset(ctx.service, assets, args.id, args.url, args.inputs, 'draft', {
192
+ signal: ctx.signal,
193
+ ...args.authProfile ? { authProfile: args.authProfile } : {},
194
+ ...args.rulePack ? { rulePack: args.rulePack } : {},
195
+ session: ctx.session,
196
+ });
197
+ const capped = capJson(result.value, 50_000);
198
+ // Flat on purpose: executionStatus, validationStatus, completedSteps, failedStep and effects sit next to testStatus.
199
+ const body = {
200
+ action: 'test', assetId: result.asset.id, status: result.asset.status,
201
+ revision: result.asset.revision, contentHash: result.asset.contentHash,
202
+ testStatus: result.asset.testStatus, testMessage: result.asset.testMessage,
203
+ ...result.execution,
204
+ result: capped.value, truncated: capped.truncated,
205
+ };
206
+ // The steps ran cleanly but nothing verifies the result: a failed test, never an ok:true that says "failed".
207
+ if (result.verifierMissing) {
208
+ return withOutcome(body, {
209
+ ok: false, executionStatus: result.execution.executionStatus,
210
+ error: { code: 'VALIDATION_MISSING', message: result.verifierMissing.message, hint: hintFor('VALIDATION_MISSING') },
211
+ });
212
+ }
213
+ return withOutcome(body, recipeOutcome(result.execution));
214
+ }
215
+ if (args.action === 'draft_from_journal') {
216
+ if (!args.name)
217
+ throw new ActionArgError('draft_from_journal requires name');
218
+ const journal = ctx.service.journalFor?.(ctx.session);
219
+ if (!journal)
220
+ throw new ActionUnavailableError('this browser service keeps no exploration journal');
221
+ const { asset: draft, report } = development.draftFromJournal(journal, {
222
+ name: args.name, ...args.id ? { id: args.id } : {},
223
+ ...args.description !== undefined ? { description: args.description } : {}, ...args.domains ? { domains: args.domains } : {},
224
+ ...args.postconditions ? { postconditions: args.postconditions } : {},
225
+ ...args.fromSeq !== undefined ? { fromSeq: args.fromSeq } : {}, ...args.toSeq !== undefined ? { toSeq: args.toSeq } : {},
226
+ ...args.exclude ? { exclude: args.exclude } : {}, ...args.parameters ? { parameters: args.parameters } : {}, ...args.extract ? { extract: args.extract } : {},
227
+ }, ctx.sessionId);
228
+ return developmentResult('draft_from_journal', {
229
+ id: draft.id, status: draft.status, revision: draft.revision, schemaVersion: 2, name: draft.name, testStatus: draft.testStatus, ...report,
230
+ }, draft);
231
+ }
232
+ if (args.action === 'fork') {
233
+ if (!args.id)
234
+ throw new Error('automation development fork requires id');
235
+ const draft = development.fork(args.id, ctx.sessionId);
236
+ return developmentResult('fork', {
237
+ id: draft.id, status: draft.status, name: draft.name, revision: draft.revision, schemaVersion: draft.schemaVersion ?? 1,
238
+ sourceAssetId: draft.sourceAssetId, sourceRevision: draft.sourceRevision, testStatus: draft.testStatus,
239
+ }, draft);
240
+ }
241
+ if (args.action === 'convert') {
242
+ if (!args.id)
243
+ throw new Error('automation development convert requires id');
244
+ const { draft, conversion } = development.convert(args.id, ctx.sessionId);
245
+ return developmentResult('convert', {
246
+ id: draft.id, status: draft.status, schemaVersion: 2, name: draft.name, revision: draft.revision,
247
+ sourceAssetId: draft.sourceAssetId, sourceRevision: draft.sourceRevision, steps: draft.recipe?.length ?? 0,
248
+ pendingDisambiguation: conversion.pendingDisambiguation, notes: conversion.notes,
249
+ }, draft);
250
+ }
251
+ if (args.action !== 'save' || !args.kind || !args.name)
252
+ throw new Error('automation development save requires kind and name');
253
+ const asset = development.save({
254
+ ...args.id ? { id: args.id } : {}, kind: args.kind, name: args.name,
255
+ ...args.description !== undefined ? { description: args.description } : {},
256
+ ...args.domains ? { domains: args.domains } : {}, ...args.tags ? { tags: args.tags } : {},
257
+ ...args.inputNames ? { inputNames: args.inputNames } : {}, ...args.recipe ? { recipe: args.recipe } : {},
258
+ ...args.schemaVersion !== undefined ? { schemaVersion: args.schemaVersion } : {},
259
+ ...args.inputSchema ? { inputSchema: args.inputSchema } : {}, ...args.outputSchema ? { outputSchema: args.outputSchema } : {},
260
+ ...args.postconditions ? { postconditions: args.postconditions } : {}, ...args.requiredCapabilities ? { requiredCapabilities: args.requiredCapabilities } : {},
261
+ ...args.source !== undefined ? { source: args.source } : {},
262
+ }, ctx.sessionId);
263
+ const compact = {
264
+ id: asset.id, kind: asset.kind, status: asset.status, name: asset.name, domains: asset.domains, tags: asset.tags, inputNames: asset.inputNames, revision: asset.revision, testStatus: asset.testStatus,
265
+ ...asset.schemaVersion === 2 ? { schemaVersion: 2, pendingDisambiguation: asset.pendingDisambiguation?.length ?? 0 } : {},
266
+ };
267
+ return developmentResult('save', compact, asset);
268
+ },
269
+ },
270
+ {
271
+ name: 'automation.run',
272
+ group: 'automation',
273
+ summary: 'Run one activated reusable automation by id with declared inputs and a target HTTP(S) URL.',
274
+ notes: 'Search first. Source and recipe internals stay Host-side.',
275
+ params: {
276
+ id: { type: 'string', required: true }, url: { type: 'string', required: true },
277
+ inputs: { type: 'object', additionalProperties: true, description: 'Declared string inputs used by named recipe placeholders.' },
278
+ authProfile: { type: 'string' }, rulePack: { type: 'string' },
279
+ },
280
+ approval: 'asset-run', readOnly: false, mutating: true, concurrencySafe: false, timeoutMs: 120_000, settleMs: RECIPE_SETTLE_MS,
281
+ errors: ['VALIDATION_FAILED', 'OUTCOME_UNKNOWN'],
282
+ examples: [{ args: { id: 'asset-id', url: 'https://example.com/search', inputs: { query: 'dsh' } } }],
283
+ async execute(args, ctx) {
284
+ if (!ctx.assets)
285
+ throw new ActionUnavailableError('automation assets are unavailable');
286
+ const result = await executeAutomationAsset(ctx.service, ctx.assets, args.id, args.url, args.inputs, 'active', {
287
+ signal: ctx.signal,
288
+ ...args.authProfile ? { authProfile: args.authProfile } : {},
289
+ ...args.rulePack ? { rulePack: args.rulePack } : {},
290
+ session: ctx.session,
291
+ });
292
+ const capped = capJson(result.value, DEVELOP_LIMIT);
293
+ return withOutcome({ assetId: result.asset.id, kind: result.asset.kind, ...result.execution, result: capped.value, truncated: capped.truncated }, recipeOutcome(result.execution));
294
+ },
295
+ },
296
+ {
297
+ name: 'automation.run_recipe',
298
+ group: 'automation',
299
+ summary: 'Run an inline Playwright recipe (max 25 named steps) on the current page or a given url.',
300
+ notes: 'Read-only steps (wait, goto, extract, assert, screenshot) run directly; mutating steps are denied in read-only, approved once in standard, and direct in autonomous/unrestricted. Prefer schemaVersion 2 (strict locators, see automation.develop for the step rules).',
301
+ params: {
302
+ url: { type: 'string', description: 'Open this URL first; omit only when target.open already established a page.' },
303
+ authProfile: { type: 'string' },
304
+ rulePack: { type: 'string' },
305
+ waitMs: { type: 'number' },
306
+ steps: { type: 'array', required: true, items: { ref: 'recipeStep' } },
307
+ schemaVersion: { type: 'number', description: '1 (default): steps use selector and take the first match. 2: steps use locator (strict), goto/clear exist, postconditions apply.' },
308
+ allowedDomains: { type: 'array', items: { type: 'string' }, description: 'v2 goto may go to these domains (and stay on the starting origin). Default: the starting origin only.' },
309
+ postconditions: { type: 'array', items: { ref: 'postcondition' }, description: 'v2: what must hold after the steps.' },
310
+ },
311
+ approval: 'recipe', readOnly: true, mutating: true, concurrencySafe: false, timeoutMs: 120_000, settleMs: RECIPE_SETTLE_MS,
312
+ errors: ['VALIDATION_FAILED', 'OUTCOME_UNKNOWN', 'INVALID_RECIPE'],
313
+ examples: [
314
+ { args: { url: 'https://example.com/', steps: [{ type: 'extract', selector: 'main', mode: 'text', limit: 5 }] } },
315
+ { args: { url: 'https://example.com/', schemaVersion: 2, steps: [{ type: 'click', locator: { role: 'link', name: 'More' } }, { type: 'extract', locator: { css: 'main' }, as: 'body' }], postconditions: [{ output: 'body', nonEmpty: true }] }, note: 'v2: strict locators' },
316
+ ],
317
+ async execute(args, ctx) {
318
+ const steps = args.steps;
319
+ const v2 = args.schemaVersion === 2;
320
+ if (args.schemaVersion !== undefined && args.schemaVersion !== 1 && !v2)
321
+ throw new RecipeValidationError('schemaVersion must be 1 or 2');
322
+ if (!v2 && (args.postconditions || args.allowedDomains))
323
+ throw new RecipeValidationError('postconditions and allowedDomains need schemaVersion 2');
324
+ let postconditions;
325
+ try {
326
+ postconditions = v2 && args.postconditions ? normalizePostconditions(args.postconditions, steps) : undefined;
327
+ }
328
+ catch (error) {
329
+ throw new RecipeValidationError(error instanceof Error ? error.message : String(error));
330
+ }
331
+ try {
332
+ const { steps: _legacy, ...result } = await ctx.service.recipe(steps, {
333
+ signal: ctx.signal,
334
+ ...args.url ? { url: args.url } : {},
335
+ ...args.waitMs !== undefined ? { waitMs: args.waitMs } : {},
336
+ ...args.authProfile ? { authProfile: args.authProfile } : {},
337
+ ...args.rulePack ? { rulePack: args.rulePack } : {},
338
+ ...v2 ? { schemaVersion: 2, gotoSameOrigin: true, ...args.allowedDomains ? { allowedDomains: args.allowedDomains } : {}, ...postconditions ? { postconditions } : {} } : {},
339
+ session: ctx.session,
340
+ });
341
+ const outcome = recipeOutcome(result);
342
+ const where = result.url || args.url;
343
+ // v2 inline recipes are not offered as reuse candidates (the candidate store normalizes v1 selectors only).
344
+ if (where && !v2)
345
+ ctx.assets?.recordRecipe(where, steps, ctx.sessionId, outcome.ok);
346
+ return withOutcome(result, outcome);
347
+ }
348
+ catch (error) {
349
+ if (args.url && !v2)
350
+ ctx.assets?.recordRecipe(args.url, steps, ctx.sessionId, false);
351
+ throw error;
352
+ }
353
+ },
354
+ },
355
+ ];
356
+ //# sourceMappingURL=automation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation.js","sourceRoot":"","sources":["../../src/actions/automation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** `crawl` group: bounded multi-page traversal. @module dsh-browser/actions/crawl */
2
+ import type { ActionDef } from './types.ts';
3
+ export declare const CRAWL_ACTIONS: ActionDef[];
@@ -0,0 +1,28 @@
1
+ /** `crawl` group: bounded multi-page traversal. @module dsh-browser/actions/crawl */
2
+ export const CRAWL_ACTIONS = [
3
+ {
4
+ name: 'crawl.crawl',
5
+ group: 'crawl',
6
+ summary: 'Crawl a bounded set of HTTP(S) pages under the configured concurrency, burst, page/depth, retry, and cooldown budgets.',
7
+ notes: 'Read-only and always buffered, even in unrestricted mode. Anonymous (no AuthProfile).',
8
+ params: {
9
+ startUrls: { type: 'array', required: true, items: { type: 'string' }, description: '1-5 starting URLs.' },
10
+ maxPages: { type: 'number', description: 'Page budget, capped by usagePolicy.maxPagesPerRun.' },
11
+ maxDepth: { type: 'number', description: 'Link depth, capped by usagePolicy.maxDepth.' },
12
+ sameOrigin: { type: 'boolean', description: 'Only follow links on starting origins. Default true.' },
13
+ maxCharsPerPage: { type: 'number', description: 'Readable text cap per page, 1000-50000.' },
14
+ },
15
+ approval: 'none', readOnly: true, mutating: false, concurrencySafe: false, timeoutMs: 300_000,
16
+ examples: [{ args: { startUrls: ['https://example.com/'], maxPages: 5, maxDepth: 1 } }],
17
+ async execute(args, ctx) {
18
+ return ctx.service.crawl(args.startUrls, {
19
+ signal: ctx.signal,
20
+ ...args.maxPages !== undefined ? { maxPages: args.maxPages } : {},
21
+ ...args.maxDepth !== undefined ? { maxDepth: args.maxDepth } : {},
22
+ ...args.sameOrigin !== undefined ? { sameOrigin: args.sameOrigin } : {},
23
+ ...args.maxCharsPerPage !== undefined ? { maxCharsPerPage: args.maxCharsPerPage } : {},
24
+ });
25
+ },
26
+ },
27
+ ];
28
+ //# sourceMappingURL=crawl.js.map