@anweat/dsh-browser 0.1.15 → 0.2.0-rc.1

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 (162) hide show
  1. package/README.md +272 -75
  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 +4 -0
  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 +67 -6
  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 +304 -32
  91. package/lib/browser-service.js +631 -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.js +1914 -329
  117. package/lib/client.js.map +1 -1
  118. package/lib/config.d.ts +50 -1
  119. package/lib/config.js +31 -1
  120. package/lib/config.js.map +1 -1
  121. package/lib/dialogs.d.ts +37 -0
  122. package/lib/dialogs.js +73 -0
  123. package/lib/dialogs.js.map +1 -0
  124. package/lib/freedom.d.ts +23 -7
  125. package/lib/freedom.js +48 -59
  126. package/lib/freedom.js.map +1 -1
  127. package/lib/index.d.ts +4 -4
  128. package/lib/index.js +36 -10
  129. package/lib/index.js.map +1 -1
  130. package/lib/journal.d.ts +109 -0
  131. package/lib/journal.js +238 -0
  132. package/lib/journal.js.map +1 -0
  133. package/lib/locator.d.ts +82 -0
  134. package/lib/locator.js +190 -0
  135. package/lib/locator.js.map +1 -0
  136. package/lib/observe-script.d.ts +27 -0
  137. package/lib/observe-script.js +565 -0
  138. package/lib/observe-script.js.map +1 -0
  139. package/lib/observe.d.ts +179 -0
  140. package/lib/observe.js +368 -0
  141. package/lib/observe.js.map +1 -0
  142. package/lib/policy-keys.d.ts +30 -0
  143. package/lib/policy-keys.js +34 -0
  144. package/lib/policy-keys.js.map +1 -0
  145. package/lib/prompt-limits.d.ts +30 -0
  146. package/lib/prompt-limits.js +31 -0
  147. package/lib/prompt-limits.js.map +1 -0
  148. package/lib/prompts.d.ts +131 -0
  149. package/lib/prompts.js +295 -0
  150. package/lib/prompts.js.map +1 -0
  151. package/lib/skill.d.ts +100 -0
  152. package/lib/skill.js +181 -0
  153. package/lib/skill.js.map +1 -0
  154. package/lib/tool-defs.d.ts +72 -0
  155. package/lib/tool-defs.js +67 -0
  156. package/lib/tool-defs.js.map +1 -0
  157. package/lib/tools.d.ts +19 -4
  158. package/lib/tools.js +124 -922
  159. package/lib/tools.js.map +1 -1
  160. package/package.json +35 -30
  161. package/scripts/dump-prompts.mjs +29 -0
  162. package/scripts/measure-tool-surface.mjs +190 -0
package/lib/freedom.js CHANGED
@@ -1,56 +1,9 @@
1
- /** Public automation-freedom contract and tool exposure matrix. */
1
+ /** Public automation-freedom contract and action exposure matrix. */
2
+ import { ACTIONS, CALL_TOOL, INDEX_TOOL, findAction, flatToolName, readOnlyCapable, traitsFor } from "./actions/registry.js";
2
3
  export const AUTOMATION_MODES = ['read-only', 'standard', 'autonomous', 'unrestricted'];
3
- export const ALL_BROWSER_TOOL_NAMES = [
4
- 'browser_open',
5
- 'browser_click',
6
- 'browser_type',
7
- 'browser_wait',
8
- 'browser_press',
9
- 'browser_select',
10
- 'browser_check',
11
- 'browser_hover',
12
- 'browser_set_files',
13
- 'browser_evaluate',
14
- 'browser_console',
15
- 'browser_requests',
16
- 'browser_scroll',
17
- 'browser_read',
18
- 'browser_screenshot',
19
- 'browser_close',
20
- 'browser_status',
21
- 'browser_install',
22
- 'browser_script_catalog',
23
- 'browser_script_validate',
24
- 'browser_script_run_builtin',
25
- 'browser_userscript_run',
26
- 'browser_recipe_run',
27
- 'browser_automation_search',
28
- 'browser_automation_develop',
29
- 'browser_automation_run',
30
- 'browser_opencli_status',
31
- 'browser_opencli_catalog',
32
- 'browser_opencli_run',
33
- 'browser_crawl',
34
- ];
35
- const READ_ONLY_TOOL_NAMES = new Set([
36
- 'browser_open',
37
- 'browser_wait',
38
- 'browser_read',
39
- 'browser_screenshot',
40
- 'browser_console',
41
- 'browser_requests',
42
- 'browser_close',
43
- 'browser_status',
44
- 'browser_script_catalog',
45
- 'browser_script_validate',
46
- 'browser_script_run_builtin',
47
- 'browser_recipe_run',
48
- 'browser_automation_search',
49
- 'browser_automation_develop',
50
- 'browser_opencli_status',
51
- 'browser_opencli_catalog',
52
- 'browser_crawl',
53
- ]);
4
+ export const TOOL_SURFACES = ['indexed', 'flat'];
5
+ /** Every browser action name (`group.action`), straight from the registry. */
6
+ export const ALL_BROWSER_ACTION_NAMES = ACTIONS.map(action => action.name);
54
7
  export function resolveAutomationMode(value) {
55
8
  const mode = value ?? 'standard';
56
9
  if (typeof mode !== 'string' || !AUTOMATION_MODES.includes(mode)) {
@@ -58,17 +11,53 @@ export function resolveAutomationMode(value) {
58
11
  }
59
12
  return mode;
60
13
  }
61
- export function isBrowserToolExposed(name, mode) {
62
- if (!ALL_BROWSER_TOOL_NAMES.includes(name))
14
+ export function resolveToolSurface(value) {
15
+ const surface = value ?? 'indexed';
16
+ if (typeof surface !== 'string' || !TOOL_SURFACES.includes(surface)) {
17
+ throw new Error('toolSurface must be one of: ' + TOOL_SURFACES.join(', '));
18
+ }
19
+ return surface;
20
+ }
21
+ /**
22
+ * Whether an action name is a known browser action allowed under the mode. With `args`, an action
23
+ * that bundles several operations (`automation.develop`) is judged by the operation the call selects;
24
+ * without them, by whether any operation is usable.
25
+ */
26
+ export function isBrowserActionExposed(name, mode, args) {
27
+ const action = findAction(name);
28
+ if (!action)
63
29
  return false;
64
- return mode !== 'read-only' || READ_ONLY_TOOL_NAMES.has(name);
30
+ if (mode !== 'read-only')
31
+ return true;
32
+ return args === undefined ? readOnlyCapable(action) : traitsFor(action, args).readOnly;
33
+ }
34
+ export function browserActionsForMode(mode) {
35
+ return ALL_BROWSER_ACTION_NAMES.filter(name => isBrowserActionExposed(name, mode));
36
+ }
37
+ /** Actions the model may use under this configuration. */
38
+ export function configuredBrowserActions(mode, options, enabled = true) {
39
+ if (!enabled)
40
+ return [];
41
+ return browserActionsForMode(mode).filter(name => name !== 'automation.develop' || options.modelDevelopmentEnabled);
65
42
  }
66
- export function browserToolsForMode(mode) {
67
- return ALL_BROWSER_TOOL_NAMES.filter(name => isBrowserToolExposed(name, mode));
43
+ /** Why an action cannot run now, or undefined when it can. */
44
+ export function actionUnavailableReason(action, mode, options, enabled = true, args) {
45
+ if (!enabled)
46
+ return 'browser service is disabled (enabled=false)';
47
+ if (mode === 'read-only' && !(args === undefined ? readOnlyCapable(action) : traitsFor(action, args).readOnly)) {
48
+ return args !== undefined && action.subActions && readOnlyCapable(action) ? `disabled by automationMode=${mode} for ${action.subActions.key}=${String(args[action.subActions.key])}` : `disabled by automationMode=${mode}`;
49
+ }
50
+ if (action.name === 'automation.develop' && !options.modelDevelopmentEnabled)
51
+ return 'disabled by automationAssets.modelDevelopmentEnabled=false';
52
+ return undefined;
68
53
  }
69
- export function configuredBrowserTools(mode, options, enabled = true) {
54
+ /** Tool names the plugin registers for a surface (empty when the service is disabled). */
55
+ export function configuredBrowserTools(mode, options, enabled = true, surface = 'indexed') {
70
56
  if (!enabled)
71
57
  return [];
72
- return browserToolsForMode(mode).filter(name => name !== 'browser_automation_develop' || options.modelDevelopmentEnabled);
58
+ if (surface === 'indexed')
59
+ return [INDEX_TOOL, CALL_TOOL];
60
+ const exposed = new Set(configuredBrowserActions(mode, options, enabled));
61
+ return ACTIONS.filter(action => exposed.has(action.name)).map(flatToolName);
73
62
  }
74
63
  //# sourceMappingURL=freedom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"freedom.js","sourceRoot":"","sources":["../src/freedom.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAU,CAAA;AAGhG,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,eAAe;IACf,cAAc;IACd,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,mBAAmB;IACnB,kBAAkB;IAClB,iBAAiB;IACjB,kBAAkB;IAClB,gBAAgB;IAChB,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,wBAAwB;IACxB,yBAAyB;IACzB,4BAA4B;IAC5B,wBAAwB;IACxB,oBAAoB;IACpB,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,qBAAqB;IACrB,eAAe;CACP,CAAA;AAIV,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAkB;IACpD,cAAc;IACd,cAAc;IACd,cAAc;IACd,oBAAoB;IACpB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;IACf,gBAAgB;IAChB,wBAAwB;IACxB,yBAAyB;IACzB,4BAA4B;IAC5B,oBAAoB;IACpB,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,eAAe;CAChB,CAAC,CAAA;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,IAAI,GAAG,KAAK,IAAI,UAAU,CAAA;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAsB,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,IAAsB,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAoB;IACrE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAuB,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3E,OAAO,IAAI,KAAK,WAAW,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAuB,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,OAAO,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAoB,EAAE,OAA6C,EAAE,OAAO,GAAG,IAAI;IACxH,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAA;IACvB,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,4BAA4B,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAA;AAC3H,CAAC"}
1
+ {"version":3,"file":"freedom.js","sourceRoot":"","sources":["../src/freedom.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -38,14 +38,14 @@ declare const plugin: {
38
38
  export default plugin;
39
39
  export { Config };
40
40
  export type { Config as BrowserConfig } from './config.ts';
41
- export type { BrowserService, RenderRule, RenderResult, SnapshotResult, PlatformSpec, SearchItem, InteractiveState, RecipeRunResult, ScriptRunResult, EvaluateResult, FileUploadResult } from './browser-service.ts';
41
+ export type { BrowserService, RenderRule, RenderResult, SnapshotResult, PlatformSpec, SearchItem, InteractiveState, RecipeServiceResult, ScriptRunResult, EvaluateResult, FileUploadResult } from './browser-service.ts';
42
42
  export type { AuthProfileConfig, ResolvedAuthProfile } from './auth-profiles.ts';
43
43
  export type { RulePackConfig, RuleStep, ResolvedRulePack } from './rule-packs.ts';
44
- export type { BrowserRecipeStep, RecipeStepResult } from './automation.ts';
44
+ export type { BrowserRecipeStep, RecipeStepResult, RecipeRunResult, RecipeExecutionStatus, RecipeValidationStatus, RecipeEffects, RecipeFailedStep, RecipeOutput } from './automation.ts';
45
45
  export type { UserscriptMetadata, UserscriptValidation, BuiltinScript } from './scripts.ts';
46
46
  export { BUILTIN_SCRIPTS, validateUserscript } from './scripts.ts';
47
- export type { AutomationMode, BrowserToolName } from './freedom.ts';
48
- export { AUTOMATION_MODES, ALL_BROWSER_TOOL_NAMES, browserToolsForMode, configuredBrowserTools } from './freedom.ts';
47
+ export type { AutomationMode, ToolSurface, BrowserActionName } from './freedom.ts';
48
+ export { AUTOMATION_MODES, TOOL_SURFACES, ALL_BROWSER_ACTION_NAMES, browserActionsForMode, configuredBrowserActions, configuredBrowserTools } from './freedom.ts';
49
49
  export type { AutomationAssetPolicy, AutomationAssetPolicyInput, AutomationAsset, AutomationAssetSummary, AutomationCandidate, AutomationCandidateSummary, AssetPersistenceMode, AssetActivationMode } from './automation-assets.ts';
50
50
  export { ASSET_PERSISTENCE_MODES, ASSET_ACTIVATION_MODES, resolveAutomationAssetPolicy, AutomationAssetStore } from './automation-assets.ts';
51
51
  export declare function apply(ctx: Context, config: Config): void;
package/lib/index.js CHANGED
@@ -13,6 +13,10 @@ import { resolveSettingsScope } from "./settings-scope.js";
13
13
  import { BrowserService } from "./browser-service.js";
14
14
  import { registerTools } from "./tools.js";
15
15
  import { browserPolicyDecision } from "./approval-policy.js";
16
+ import { resolveBrowserCall } from "./actions/surface.js";
17
+ import { registerSkillWhenAvailable } from "./skill.js";
18
+ import { installErrorHints } from "./actions/errors.js";
19
+ import { describePrompts } from "./prompts.js";
16
20
  import { AutomationAssetStore } from "./automation-assets.js";
17
21
  import { registerAutomationAssetRpc } from "./automation-assets-rpc.js";
18
22
  export const name = 'dsh-browser';
@@ -40,7 +44,7 @@ const plugin = { name: 'dsh-browser', inject: ['tools', 'settings'], apply, Conf
40
44
  export default plugin;
41
45
  export { Config };
42
46
  export { BUILTIN_SCRIPTS, validateUserscript } from "./scripts.js";
43
- export { AUTOMATION_MODES, ALL_BROWSER_TOOL_NAMES, browserToolsForMode, configuredBrowserTools } from "./freedom.js";
47
+ export { AUTOMATION_MODES, TOOL_SURFACES, ALL_BROWSER_ACTION_NAMES, browserActionsForMode, configuredBrowserActions, configuredBrowserTools } from "./freedom.js";
44
48
  export { ASSET_PERSISTENCE_MODES, ASSET_ACTIVATION_MODES, resolveAutomationAssetPolicy, AutomationAssetStore } from "./automation-assets.js";
45
49
  export function apply(ctx, config) {
46
50
  // Browser processes, tool exposure, and approval hooks are deliberately
@@ -55,24 +59,45 @@ export function apply(ctx, config) {
55
59
  fs.mkdirSync(resolved.snapshotDir, { recursive: true });
56
60
  const service = new BrowserService(resolved);
57
61
  const assets = new AutomationAssetStore(resolved.automationAssets);
58
- // Apply the configured exposure/approval mode before every browser tool.
59
- // Validation remains active even when unrestricted mode skips approvals.
62
+ // Apply the configured exposure/approval mode before every browser call.
63
+ // Approval is decided per ACTION: browser_call (and each flat tool) is
64
+ // resolved to its action and arguments first, so the user is asked about
65
+ // `act.click #submit`, not about a generic dispatcher. browser_index only
66
+ // reads the catalog and is let through. Validation remains active even when
67
+ // unrestricted mode skips approvals.
60
68
  ctx.on('tools/pre-execute', async (exec, next) => {
61
69
  const downstream = await next();
62
70
  if (downstream.kind !== 'allow')
63
71
  return downstream;
64
- const assetId = exec.arguments?.id;
65
- const assetKind = exec.name === 'browser_automation_run' && typeof assetId === 'string'
66
- ? assets.get(assetId)?.kind : undefined;
67
- return browserPolicyDecision(exec.name, exec.arguments, resolved.automationMode, assetKind);
72
+ const call = resolveBrowserCall(exec.name, exec.arguments);
73
+ // `unresolved` is a browser_call naming no known action: it runs no
74
+ // action and returns a structured UNKNOWN_ACTION error, so nothing to approve.
75
+ if (call?.kind === 'index' || call?.kind === 'unresolved')
76
+ return downstream;
77
+ if (call?.kind === 'action') {
78
+ // automation.run and automation.develop test act on a stored asset: the policy needs to know what kind it is,
79
+ // and for a recipe draft which steps it would replay.
80
+ const callArgs = (call.args ?? {});
81
+ const replaysAsset = call.action === 'automation.run' || (call.action === 'automation.develop' && callArgs.action === 'test');
82
+ const target = replaysAsset && typeof callArgs.id === 'string' ? assets.get(callArgs.id) : undefined;
83
+ return browserPolicyDecision(call.action, call.args, resolved.automationMode, target?.kind, call.action === 'automation.develop' ? target?.recipe : undefined, target ? { id: target.id, name: target.name, revision: target.revision } : undefined);
84
+ }
85
+ return browserPolicyDecision(exec.name, exec.arguments, resolved.automationMode);
68
86
  });
69
87
  // Provide the `browser` service so consumers (web-search-pro) can inject it.
70
88
  // ctx.provide is scoped to this plugin's fiber; the browser instance itself
71
89
  // is closed via the effect disposer below.
72
90
  ctx.provide('browser', service);
73
91
  ctx.effect(() => () => void service.close());
74
- registerTools(ctx, resolved, service, assets);
75
- registerAutomationAssetRpc(ctx, assets, service);
92
+ // Optional: the `dsh-browser` skill is registered only when the Host has a
93
+ // skill registry. It must not be a declared `inject` (Cordis 4.0.4 would
94
+ // hang the plugin without it); this opens a scoped, optional dependency.
95
+ // `prompts.skill` is read live: the skill is registered, withdrawn or invalidated when it changes.
96
+ const skill = registerSkillWhenAvailable(ctx, undefined, resolved.prompts);
97
+ // `prompts.errorHints` replace the by-code hints wherever an error is built; read per call.
98
+ ctx.effect(() => installErrorHints(() => resolved.prompts.current().errorHints));
99
+ registerTools(ctx, resolved, service, assets, { skillAvailable: skill.isAvailable, refreshSkill: skill.refresh });
100
+ registerAutomationAssetRpc(ctx, assets, service, () => describePrompts({ prompts: resolved.prompts, mode: resolved.automationMode, options: resolved.automationAssets, enabled: resolved.enabled }));
76
101
  if (resolved.verbose) {
77
102
  try {
78
103
  const markerPath = path.join(resolved.snapshotDir, 'apply.log');
@@ -83,11 +108,12 @@ export function apply(ctx, config) {
83
108
  headless: resolved.headless,
84
109
  opencliEnabled: resolved.opencliEnabled,
85
110
  automationMode: resolved.automationMode,
111
+ toolSurface: resolved.toolSurface,
86
112
  snapshotDir: resolved.snapshotDir,
87
113
  }) + '\n', 'utf8');
88
114
  }
89
115
  catch { /* marker is best-effort */ }
90
116
  }
91
- ctx.logger?.(name).info('dsh-browser loaded: channel=' + resolved.channel + ' headless=' + resolved.headless + ' opencli=' + resolved.opencliEnabled + ' automation=' + resolved.automationMode);
117
+ ctx.logger?.(name).info('dsh-browser loaded: channel=' + resolved.channel + ' headless=' + resolved.headless + ' opencli=' + resolved.opencliEnabled + ' automation=' + resolved.automationMode + ' surface=' + resolved.toolSurface);
92
118
  }
93
119
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The exploration journal: a bounded, in-memory record of what one session did through `browser_call`.
3
+ *
4
+ * It is evidence for turning an exploration into a draft (`automation.develop` draft_from_journal), not a
5
+ * log of the page. Entries hold the action, the page generation before and after, the locator, scrubbed
6
+ * parameters, and the outcome. Typed text never appears in an entry: fill/type text is a reference
7
+ * `{ref:'v<seq>', length, sensitive?}`. The text itself is kept in memory only when it is short (at most
8
+ * {@link RAW_TEXT_MAX} characters) and does not look secret (see {@link looksSecret}), and only so a draft
9
+ * can use it as a literal or an example; it is released together with its entry, and nothing is written to disk.
10
+ * @module dsh-browser/journal
11
+ */
12
+ import type { BrowserLocatorSpec } from './locator.ts';
13
+ import type { ErrorCode, ExecutionStatus } from './actions/types.ts';
14
+ /** Default number of entries a session keeps; the oldest are dropped first. */
15
+ export declare const JOURNAL_LIMIT = 200;
16
+ /** Typed text longer than this is never retained, only its length. */
17
+ export declare const RAW_TEXT_MAX = 200;
18
+ /** A scrubbed stand-in for a value that is not stored in the entry. */
19
+ export interface ValueRef {
20
+ ref: string;
21
+ length: number;
22
+ sensitive?: true;
23
+ }
24
+ export type JournalEffects = 'none' | 'observed' | 'unknown';
25
+ export interface JournalEntry {
26
+ seq: number;
27
+ /** `group.action`, e.g. `act.fill`. */
28
+ action: string;
29
+ /** The page the call ran on (`t1`...). */
30
+ targetId?: string;
31
+ generationBefore?: number;
32
+ generationAfter?: number;
33
+ /** The element the call acted on, as a LocatorSpec (a CSS `selector` argument becomes `{css}`). */
34
+ locator?: BrowserLocatorSpec;
35
+ /** The call's arguments with values scrubbed; see the module comment. */
36
+ params: Record<string, unknown>;
37
+ outcome: {
38
+ ok: boolean;
39
+ executionStatus: ExecutionStatus;
40
+ errorCode?: ErrorCode;
41
+ };
42
+ /** Whether the call changed anything: `none`, `observed` (it ran and changed state), `unknown` (it may have). */
43
+ effects: JournalEffects;
44
+ /** One short line about the result: page title/path or the error. */
45
+ summary: string;
46
+ /** A read-only observation: it never becomes a step. */
47
+ observation?: true;
48
+ /** The page URL after the call, secret query values redacted. */
49
+ url?: string;
50
+ /** For observations: characters of text read. */
51
+ size?: number;
52
+ }
53
+ /** Field names that suggest a secret; the same list `observe.read` uses for controls. */
54
+ export declare const SENSITIVE_NAME: RegExp;
55
+ export declare function cardLike(value: string): boolean;
56
+ export declare function tokenLike(value: string): boolean;
57
+ /** A value that looks like a token, a JWT or a card number. */
58
+ export declare function looksSecret(value: string): boolean;
59
+ /** A locator that names a password-like field (its label, name, css...). */
60
+ export declare function locatorSuggestsSecret(locator: BrowserLocatorSpec | undefined): boolean;
61
+ /** `https://u:p@host/path?token=x` -> secret query values and userinfo removed. Returns the cleaned URL and whether anything was removed. */
62
+ export declare function redactUrl(value: string): {
63
+ url: string;
64
+ redacted: boolean;
65
+ };
66
+ export interface ScrubbedCall {
67
+ params: Record<string, unknown>;
68
+ locator?: BrowserLocatorSpec;
69
+ /** The typed text, only when it may be retained. */
70
+ raw?: string;
71
+ }
72
+ /**
73
+ * Scrub the arguments of one call. `sensitiveControl` is true when the page itself says the target is a
74
+ * password-like control (type=password, autocomplete one-time-code, ...).
75
+ */
76
+ export declare function scrubCall(action: string, args: Record<string, unknown>, seq: number, sensitiveControl?: boolean): ScrubbedCall;
77
+ /** Whether a call goes into the journal. Lists, inspection, searches and drafting are not exploration. */
78
+ export declare function isJournaled(action: string): boolean;
79
+ export declare function isObservation(action: string): boolean;
80
+ /** What a finished call changed, from what it is and how it ended. */
81
+ export declare function effectsOf(mutating: boolean, outcome: JournalEntry['outcome']): JournalEffects;
82
+ export declare class SessionJournal {
83
+ readonly limit: number;
84
+ private nextSeq;
85
+ private items;
86
+ private readonly raws;
87
+ /** How many entries fell off the front because of the limit. */
88
+ dropped: number;
89
+ constructor(limit?: number);
90
+ /** Reserve the sequence number of a call that is about to run. */
91
+ allocate(): number;
92
+ add(entry: JournalEntry, raw?: string): void;
93
+ entries(): readonly JournalEntry[];
94
+ /** The retained typed text of an entry, if it was short and not secret. Internal: never part of an entry. */
95
+ rawText(seq: number): string | undefined;
96
+ get firstSeq(): number | undefined;
97
+ get lastSeq(): number | undefined;
98
+ get size(): number;
99
+ clear(): void;
100
+ }
101
+ /** The one-line summary of a finished call, with no secret query values. */
102
+ export declare function summarize(action: string, envelope: {
103
+ ok: boolean;
104
+ result?: Record<string, unknown>;
105
+ error?: {
106
+ code: string;
107
+ message: string;
108
+ };
109
+ }): string;
package/lib/journal.js ADDED
@@ -0,0 +1,238 @@
1
+ /**
2
+ * The exploration journal: a bounded, in-memory record of what one session did through `browser_call`.
3
+ *
4
+ * It is evidence for turning an exploration into a draft (`automation.develop` draft_from_journal), not a
5
+ * log of the page. Entries hold the action, the page generation before and after, the locator, scrubbed
6
+ * parameters, and the outcome. Typed text never appears in an entry: fill/type text is a reference
7
+ * `{ref:'v<seq>', length, sensitive?}`. The text itself is kept in memory only when it is short (at most
8
+ * {@link RAW_TEXT_MAX} characters) and does not look secret (see {@link looksSecret}), and only so a draft
9
+ * can use it as a literal or an example; it is released together with its entry, and nothing is written to disk.
10
+ * @module dsh-browser/journal
11
+ */
12
+ /** Default number of entries a session keeps; the oldest are dropped first. */
13
+ export const JOURNAL_LIMIT = 200;
14
+ /** Typed text longer than this is never retained, only its length. */
15
+ export const RAW_TEXT_MAX = 200;
16
+ // --- what counts as secret -----------------------------------------------------
17
+ /** Field names that suggest a secret; the same list `observe.read` uses for controls. */
18
+ export const SENSITIVE_NAME = /(^|[^a-z])(pass(word|wd|phrase|code)?|pwd|secret|token|api[-_ ]?key|credential|bearer|jwt|otp|csrf|xsrf|session[-_ ]?(id|key)?|ssn|cvv|cvc|private[-_ ]?key|authori[sz]ation|auth[-_ ]?(token|key|code)|one[-_ ]?time[-_ ]?code|card[-_ ]?(number|num|no)|cc[-_ ]?(number|num|csc|exp)|iban|account[-_ ]?(number|num))([^a-z]|$)/i;
19
+ function camel(value) { return value.replace(/([a-z])([A-Z])/g, '$1 $2'); }
20
+ export function cardLike(value) {
21
+ const digits = value.replace(/[ -]/g, '');
22
+ if (!/^\d{13,19}$/.test(digits))
23
+ return false;
24
+ let sum = 0;
25
+ for (let i = 0; i < digits.length; i++) {
26
+ let digit = Number(digits[digits.length - 1 - i]);
27
+ if (i % 2 === 1) {
28
+ digit *= 2;
29
+ if (digit > 9)
30
+ digit -= 9;
31
+ }
32
+ sum += digit;
33
+ }
34
+ return sum % 10 === 0;
35
+ }
36
+ export function tokenLike(value) {
37
+ if (cardLike(value))
38
+ return true;
39
+ if (value.length < 20 || /\s/.test(value))
40
+ return false;
41
+ if (/^eyJ[\w-]+\.[\w-]+\.[\w-]*$/.test(value))
42
+ return true;
43
+ return /^[A-Za-z0-9_\-+/=.~]+$/.test(value) && /\d/.test(value) && /[A-Za-z]/.test(value);
44
+ }
45
+ /** A value that looks like a token, a JWT or a card number. */
46
+ export function looksSecret(value) {
47
+ return tokenLike(value);
48
+ }
49
+ /** A locator that names a password-like field (its label, name, css...). */
50
+ export function locatorSuggestsSecret(locator) {
51
+ if (!locator)
52
+ return false;
53
+ const parts = [locator.name, locator.label, locator.text, locator.testId, locator.selector, locator.css].filter((part) => typeof part === 'string');
54
+ return parts.some(part => SENSITIVE_NAME.test(camel(part)));
55
+ }
56
+ /** `https://u:p@host/path?token=x` -> secret query values and userinfo removed. Returns the cleaned URL and whether anything was removed. */
57
+ export function redactUrl(value) {
58
+ try {
59
+ const parsed = new URL(value);
60
+ let redacted = false;
61
+ if (parsed.username || parsed.password) {
62
+ parsed.username = '';
63
+ parsed.password = '';
64
+ redacted = true;
65
+ }
66
+ for (const key of [...parsed.searchParams.keys()]) {
67
+ const raw = parsed.searchParams.get(key) ?? '';
68
+ if (SENSITIVE_NAME.test(camel(key)) || /token|key|auth|session|cookie|password|secret/i.test(key) || tokenLike(raw)) {
69
+ parsed.searchParams.set(key, '[redacted]');
70
+ redacted = true;
71
+ }
72
+ }
73
+ return { url: parsed.toString().slice(0, 2_000), redacted };
74
+ }
75
+ catch {
76
+ return { url: value.slice(0, 200), redacted: false };
77
+ }
78
+ }
79
+ // --- scrubbing a call's arguments ---------------------------------------------
80
+ /** Arguments that steer a call but carry no value worth keeping. */
81
+ const SKIP = new Set(['locator', 'selector', 'expectGeneration']);
82
+ /** Text typed into a control: always a reference. */
83
+ const TYPED = new Set(['act.fill', 'act.type']);
84
+ function clip(value, max = 200) { return value.length > max ? value.slice(0, max) + '…' : value; }
85
+ function normalizeLocator(args) {
86
+ const given = args.locator;
87
+ if (typeof args.selector === 'string' && given === undefined)
88
+ return { css: clip(args.selector, 500) };
89
+ if (!given || typeof given !== 'object' || Array.isArray(given))
90
+ return undefined;
91
+ const copy = {};
92
+ for (const [key, value] of Object.entries(given)) {
93
+ if (typeof value === 'string')
94
+ copy[key === 'selector' ? 'css' : key] = clip(value, 500);
95
+ else
96
+ copy[key] = value;
97
+ }
98
+ return copy;
99
+ }
100
+ /** A short plain value kept as is; anything long or secret-looking becomes a reference. */
101
+ function scrubValue(value, seq, index = 0) {
102
+ if (typeof value !== 'string')
103
+ return value;
104
+ if (value.length > RAW_TEXT_MAX || looksSecret(value))
105
+ return { ref: `v${seq}${index ? '.' + index : ''}`, length: value.length, ...looksSecret(value) ? { sensitive: true } : {} };
106
+ return value;
107
+ }
108
+ /**
109
+ * Scrub the arguments of one call. `sensitiveControl` is true when the page itself says the target is a
110
+ * password-like control (type=password, autocomplete one-time-code, ...).
111
+ */
112
+ export function scrubCall(action, args, seq, sensitiveControl = false) {
113
+ const locator = normalizeLocator(args);
114
+ const params = {};
115
+ let raw;
116
+ for (const [key, value] of Object.entries(args)) {
117
+ if (SKIP.has(key) || value === undefined)
118
+ continue;
119
+ if (typeof value === 'string') {
120
+ if (TYPED.has(action) && key === 'text') {
121
+ const sensitive = sensitiveControl || locatorSuggestsSecret(locator) || looksSecret(value);
122
+ params[key] = { ref: `v${seq}`, length: value.length, ...sensitive ? { sensitive: true } : {} };
123
+ if (!sensitive && value.length <= RAW_TEXT_MAX)
124
+ raw = value;
125
+ }
126
+ else if (key === 'url')
127
+ params[key] = redactUrl(value).url;
128
+ else if (['expression', 'source', 'code', 'script'].includes(key))
129
+ params[key] = { ref: `v${seq}`, length: value.length };
130
+ else
131
+ params[key] = scrubValue(value, seq);
132
+ }
133
+ else if (Array.isArray(value)) {
134
+ if (key === 'files')
135
+ params.files = { count: value.length, names: value.slice(0, 5).map(file => clip(String(file).split(/[\\/]/).pop() ?? '', 80)) };
136
+ else if (['steps', 'recipe'].includes(key))
137
+ params[key] = { count: value.length };
138
+ else
139
+ params[key] = value.slice(0, 20).map((entry, index) => scrubValue(entry, seq, index + 1));
140
+ }
141
+ else if (value && typeof value === 'object') {
142
+ // inputs and the like: only the names, never the values.
143
+ params[key] = { keys: Object.keys(value).slice(0, 10) };
144
+ }
145
+ else
146
+ params[key] = value;
147
+ }
148
+ return { params, ...locator ? { locator } : {}, ...raw !== undefined ? { raw } : {} };
149
+ }
150
+ // --- which calls are journaled -------------------------------------------------
151
+ const JOURNALED_GROUPS = new Set(['target', 'observe', 'act', 'script']);
152
+ const JOURNALED_EXTRA = new Set(['automation.run_recipe', 'automation.run']);
153
+ /** Calls that only read the page: observation points, never steps. */
154
+ const OBSERVATIONS = new Set(['observe.read', 'observe.screenshot']);
155
+ /** Whether a call goes into the journal. Lists, inspection, searches and drafting are not exploration. */
156
+ export function isJournaled(action) {
157
+ if (action === 'target.list')
158
+ return false;
159
+ return JOURNALED_GROUPS.has(action.split('.')[0]) || JOURNALED_EXTRA.has(action);
160
+ }
161
+ export function isObservation(action) {
162
+ return OBSERVATIONS.has(action);
163
+ }
164
+ /** What a finished call changed, from what it is and how it ended. */
165
+ export function effectsOf(mutating, outcome) {
166
+ if (!mutating)
167
+ return 'none';
168
+ if (outcome.ok)
169
+ return 'observed';
170
+ if (outcome.executionStatus === 'outcome_unknown')
171
+ return 'unknown';
172
+ const never = ['LOCATOR_NOT_FOUND', 'LOCATOR_AMBIGUOUS', 'NOT_ACTIONABLE', 'TARGET_STALE', 'INVALID_ARGS', 'TARGET_CLOSED', 'POLICY_DENIED', 'INVALID_RECIPE'];
173
+ return outcome.errorCode && never.includes(outcome.errorCode) ? 'none' : 'unknown';
174
+ }
175
+ // --- the journal itself --------------------------------------------------------
176
+ export class SessionJournal {
177
+ limit;
178
+ nextSeq = 1;
179
+ items = [];
180
+ raws = new Map();
181
+ /** How many entries fell off the front because of the limit. */
182
+ dropped = 0;
183
+ constructor(limit = JOURNAL_LIMIT) {
184
+ this.limit = limit;
185
+ }
186
+ /** Reserve the sequence number of a call that is about to run. */
187
+ allocate() {
188
+ return this.nextSeq++;
189
+ }
190
+ add(entry, raw) {
191
+ this.items.push(entry);
192
+ if (this.items.length > 1 && this.items[this.items.length - 2].seq > entry.seq)
193
+ this.items.sort((a, b) => a.seq - b.seq);
194
+ if (raw !== undefined)
195
+ this.raws.set(entry.seq, raw);
196
+ while (this.items.length > this.limit) {
197
+ const gone = this.items.shift();
198
+ this.raws.delete(gone.seq);
199
+ this.dropped += 1;
200
+ }
201
+ }
202
+ entries() {
203
+ return this.items;
204
+ }
205
+ /** The retained typed text of an entry, if it was short and not secret. Internal: never part of an entry. */
206
+ rawText(seq) {
207
+ return this.raws.get(seq);
208
+ }
209
+ get firstSeq() { return this.items[0]?.seq; }
210
+ get lastSeq() { return this.items[this.items.length - 1]?.seq; }
211
+ get size() { return this.items.length; }
212
+ clear() {
213
+ this.items = [];
214
+ this.raws.clear();
215
+ }
216
+ }
217
+ /** The one-line summary of a finished call, with no secret query values. */
218
+ export function summarize(action, envelope) {
219
+ if (!envelope.ok)
220
+ return clip(`${envelope.error?.code ?? 'FAILED'}: ${String(envelope.error?.message ?? '').split('\n')[0]}`, 140);
221
+ const result = envelope.result ?? {};
222
+ const parts = [];
223
+ if (typeof result.title === 'string' && result.title)
224
+ parts.push(clip(result.title, 60));
225
+ if (typeof result.url === 'string' && result.url) {
226
+ try {
227
+ const parsed = new URL(redactUrl(result.url).url);
228
+ parts.push(parsed.pathname + parsed.search);
229
+ }
230
+ catch {
231
+ parts.push(clip(result.url, 80));
232
+ }
233
+ }
234
+ if (typeof result.text === 'string' && isObservation(action))
235
+ parts.push(`${result.text.length} chars`);
236
+ return clip(parts.join(' | ') || 'ok', 140);
237
+ }
238
+ //# sourceMappingURL=journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"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"}