@anweat/dsh-browser 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -245
- package/cordis.patch.yml +26 -16
- package/lib/approval-policy.js +34 -0
- package/lib/approval-policy.js.map +1 -1
- package/lib/auth-profiles.js +10 -1
- package/lib/auth-profiles.js.map +1 -1
- package/lib/automation-assets-rpc.d.ts +5 -0
- package/lib/automation-assets-rpc.js +63 -0
- package/lib/automation-assets-rpc.js.map +1 -0
- package/lib/automation-assets.d.ts +139 -0
- package/lib/automation-assets.js +372 -0
- package/lib/automation-assets.js.map +1 -0
- package/lib/automation-development.d.ts +13 -0
- package/lib/automation-development.js +37 -0
- package/lib/automation-development.js.map +1 -0
- package/lib/automation-execution.d.ts +14 -0
- package/lib/automation-execution.js +55 -0
- package/lib/automation-execution.js.map +1 -0
- package/lib/browser-service.d.ts +73 -25
- package/lib/browser-service.js +286 -74
- package/lib/browser-service.js.map +1 -1
- package/lib/client/SettingsCard.d.ts +2 -0
- package/lib/client/SettingsCard.js +69 -0
- package/lib/client/SettingsCard.js.map +1 -0
- package/lib/client/automation-assets-client.d.ts +38 -0
- package/lib/client/automation-assets-client.js +83 -0
- package/lib/client/automation-assets-client.js.map +1 -0
- package/lib/client/context-types.d.ts +8 -0
- package/lib/client/context-types.js +2 -0
- package/lib/client/context-types.js.map +1 -0
- package/lib/client/form.d.ts +62 -0
- package/lib/client/form.js +224 -0
- package/lib/client/form.js.map +1 -0
- package/lib/client/index.d.ts +27 -0
- package/lib/client/index.js +28 -0
- package/lib/client/index.js.map +1 -0
- package/lib/client/locales.d.ts +86 -0
- package/lib/client/locales.js +65 -0
- package/lib/client/locales.js.map +1 -0
- package/lib/client/settings-namespace.d.ts +2 -0
- package/lib/client/settings-namespace.js +3 -0
- package/lib/client/settings-namespace.js.map +1 -0
- package/lib/client/styles.d.ts +48 -0
- package/lib/client/styles.js +28 -0
- package/lib/client/styles.js.map +1 -0
- package/lib/client.js +1282 -0
- package/lib/client.js.map +1 -0
- package/lib/config.d.ts +14 -0
- package/lib/config.js +43 -0
- package/lib/config.js.map +1 -1
- package/lib/deps.d.ts +7 -1
- package/lib/deps.js +22 -6
- package/lib/deps.js.map +1 -1
- package/lib/freedom.d.ts +4 -1
- package/lib/freedom.js +14 -0
- package/lib/freedom.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +20 -3
- package/lib/index.js.map +1 -1
- package/lib/opencli-catalog.d.ts +21 -0
- package/lib/opencli-catalog.js +49 -0
- package/lib/opencli-catalog.js.map +1 -0
- package/lib/scripts.d.ts +1 -1
- package/lib/scripts.js +30 -29
- package/lib/scripts.js.map +1 -1
- package/lib/tools.d.ts +2 -1
- package/lib/tools.js +222 -11
- package/lib/tools.js.map +1 -1
- package/lib/usage-policy.d.ts +49 -0
- package/lib/usage-policy.js +171 -0
- package/lib/usage-policy.js.map +1 -0
- package/package.json +133 -78
- package/scripts/check-client-bundle.mjs +15 -0
- package/scripts/clean-lib.mjs +3 -0
package/cordis.patch.yml
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
|
-
# dsh-browser bundle patch — installs the browser runtime as one more row over
|
|
2
|
-
# the active profile. Install with:
|
|
3
|
-
# dsh plugin --profile <name> add @anweat/dsh-browser
|
|
4
|
-
# then boot the profile (the web profile has HMR disabled, so a restart applies it).
|
|
5
|
-
#
|
|
6
|
-
# Login state: prefer named `authProfiles` with explicit `allowedDomains` (see
|
|
7
|
-
# README). `storageStatePath` remains as a legacy global fallback.
|
|
8
|
-
- insert:
|
|
9
|
-
- id: browser
|
|
10
|
-
name: '@anweat/dsh-browser'
|
|
11
|
-
config:
|
|
12
|
-
automationMode: standard
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
# dsh-browser bundle patch — installs the browser runtime as one more row over
|
|
2
|
+
# the active profile. Install with:
|
|
3
|
+
# dsh plugin --profile <name> add @anweat/dsh-browser
|
|
4
|
+
# then boot the profile (the web profile has HMR disabled, so a restart applies it).
|
|
5
|
+
#
|
|
6
|
+
# Login state: prefer named `authProfiles` with explicit `allowedDomains` (see
|
|
7
|
+
# README). `storageStatePath` remains as a legacy global fallback.
|
|
8
|
+
- insert:
|
|
9
|
+
- id: browser
|
|
10
|
+
name: '@anweat/dsh-browser'
|
|
11
|
+
config:
|
|
12
|
+
automationMode: standard
|
|
13
|
+
browserRuntime: playwright
|
|
14
|
+
channel: chromium
|
|
15
|
+
headless: true
|
|
16
|
+
opencliEnabled: true
|
|
17
|
+
usagePolicy:
|
|
18
|
+
minDelayMs: 750
|
|
19
|
+
maxConcurrency: 2
|
|
20
|
+
burst: 3
|
|
21
|
+
maxPagesPerRun: 20
|
|
22
|
+
maxDepth: 2
|
|
23
|
+
retryLimit: 2
|
|
24
|
+
backoffBaseMs: 1000
|
|
25
|
+
cooldownMs: 30000
|
|
26
|
+
verbose: false
|
package/lib/approval-policy.js
CHANGED
|
@@ -3,6 +3,7 @@ import { recipeNeedsApproval } from "./automation.js";
|
|
|
3
3
|
import { validateUserscript } from "./scripts.js";
|
|
4
4
|
import { isBrowserToolExposed } from "./freedom.js";
|
|
5
5
|
const DIRECT_INTERACTIONS = new Set(['browser_click', 'browser_type', 'browser_scroll']);
|
|
6
|
+
const WEB_LOCAL_MUTATIONS = new Set(['web_cache_clear']);
|
|
6
7
|
export function browserPolicyDecision(name, args, mode = 'standard') {
|
|
7
8
|
if (!isBrowserToolExposed(name, mode) && name.startsWith('browser_')) {
|
|
8
9
|
return { kind: 'deny', reason: `Browser tool ${name} is disabled by automationMode=${mode}` };
|
|
@@ -58,6 +59,39 @@ export function browserPolicyDecision(name, args, mode = 'standard') {
|
|
|
58
59
|
return { kind: 'ask', reason: 'Run a multi-step Playwright recipe with page mutations: ' + actions.join(', ') };
|
|
59
60
|
}
|
|
60
61
|
}
|
|
62
|
+
if (name === 'browser_automation_run') {
|
|
63
|
+
if (mode === 'read-only')
|
|
64
|
+
return { kind: 'deny', reason: `Reusable automation execution is disabled by automationMode=${mode}` };
|
|
65
|
+
if (mode === 'autonomous' || mode === 'unrestricted')
|
|
66
|
+
return { kind: 'allow' };
|
|
67
|
+
return { kind: 'ask', reason: 'Run an active reusable browser automation asset' };
|
|
68
|
+
}
|
|
69
|
+
if (name === 'browser_automation_develop') {
|
|
70
|
+
const action = String(args?.action ?? '');
|
|
71
|
+
if (['get', 'validate'].includes(action))
|
|
72
|
+
return { kind: 'allow' };
|
|
73
|
+
if (mode === 'read-only')
|
|
74
|
+
return { kind: 'deny', reason: `Automation draft writes are disabled by automationMode=${mode}` };
|
|
75
|
+
if (action === 'test' && mode !== 'unrestricted')
|
|
76
|
+
return { kind: 'ask', reason: 'Replay a reusable automation draft in a real browser context' };
|
|
77
|
+
if (mode === 'standard')
|
|
78
|
+
return { kind: 'ask', reason: 'Save a bounded local reusable automation draft' };
|
|
79
|
+
return { kind: 'allow' };
|
|
80
|
+
}
|
|
81
|
+
if (name === 'web_deps' && args?.action === 'install') {
|
|
82
|
+
if (mode === 'read-only')
|
|
83
|
+
return { kind: 'deny', reason: `Dependency installation is disabled by automationMode=${mode}` };
|
|
84
|
+
if (mode === 'unrestricted')
|
|
85
|
+
return { kind: 'allow' };
|
|
86
|
+
return { kind: 'ask', reason: 'Install an external Web Search Pro backend dependency' };
|
|
87
|
+
}
|
|
88
|
+
const webRuleAction = name === 'web_rule' ? args?.action : undefined;
|
|
89
|
+
if (WEB_LOCAL_MUTATIONS.has(name) || (name === 'web_rule' && ['upsert', 'remove', 'import'].includes(String(webRuleAction)))) {
|
|
90
|
+
if (mode === 'read-only')
|
|
91
|
+
return { kind: 'deny', reason: `Web Search Pro mutations are disabled by automationMode=${mode}` };
|
|
92
|
+
if (mode === 'standard')
|
|
93
|
+
return { kind: 'ask', reason: 'Modify Web Search Pro local state: ' + name };
|
|
94
|
+
}
|
|
61
95
|
return { kind: 'allow' };
|
|
62
96
|
}
|
|
63
97
|
//# sourceMappingURL=approval-policy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,mBAAmB,EAA0B,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAuB,MAAM,cAAc,CAAA;AAOxE,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"approval-policy.js","sourceRoot":"","sources":["../src/approval-policy.ts"],"names":[],"mappings":"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"}
|
package/lib/auth-profiles.js
CHANGED
|
@@ -19,10 +19,19 @@ export class AuthProfileStore {
|
|
|
19
19
|
throw new Error('auth profile ' + id + ' is not allowed for ' + url.hostname);
|
|
20
20
|
if (!profile.storageStatePath?.trim())
|
|
21
21
|
throw new Error('auth profile ' + id + ' has no storageStatePath');
|
|
22
|
-
|
|
22
|
+
const persistState = profile.persistState ?? false;
|
|
23
|
+
if (!fs.existsSync(profile.storageStatePath)) {
|
|
24
|
+
if (!persistState)
|
|
25
|
+
throw new Error('auth profile ' + id + ' storageState file does not exist: ' + profile.storageStatePath);
|
|
26
|
+
}
|
|
27
|
+
else if (!fs.statSync(profile.storageStatePath).isFile()) {
|
|
28
|
+
throw new Error('auth profile ' + id + ' storageState path is not a file: ' + profile.storageStatePath);
|
|
29
|
+
}
|
|
30
|
+
return { id, ...profile, persistState };
|
|
23
31
|
}
|
|
24
32
|
list() {
|
|
25
33
|
return Object.entries(this.profiles).sort(([a], [b]) => a.localeCompare(b)).map(([id, profile]) => ({ id, allowedDomains: [...(profile.allowedDomains ?? [])], persistState: profile.persistState ?? false }));
|
|
26
34
|
}
|
|
27
35
|
}
|
|
36
|
+
import fs from 'node:fs';
|
|
28
37
|
//# sourceMappingURL=auth-profiles.js.map
|
package/lib/auth-profiles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-profiles.js","sourceRoot":"","sources":["../src/auth-profiles.ts"],"names":[],"mappings":"AAYA,SAAS,WAAW,CAAC,QAAgB,EAAE,OAA0B;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAA8C,EAAE;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;IAAG,CAAC;IAEjF,OAAO,CAAC,EAAU,EAAE,SAAiB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,sBAAsB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3I,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,0BAA0B,CAAC,CAAA;QACzG,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"auth-profiles.js","sourceRoot":"","sources":["../src/auth-profiles.ts"],"names":[],"mappings":"AAYA,SAAS,WAAW,CAAC,QAAgB,EAAE,OAA0B;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACtD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACjF,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAA8C,EAAE;QAAhD,aAAQ,GAAR,QAAQ,CAAwC;IAAG,CAAC;IAEjF,OAAO,CAAC,EAAU,EAAE,SAAiB;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,sBAAsB,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC3I,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,0BAA0B,CAAC,CAAA;QACzG,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAA;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,qCAAqC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC7H,CAAC;aAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,EAAE,GAAG,oCAAoC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QACzG,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,CAAA;IACzC,CAAC;IAED,IAAI;QACF,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;IAChN,CAAC;CACF;AACD,OAAO,EAAE,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Loopback-only Host RPC for the automation asset review UI. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { AutomationAssetStore } from './automation-assets.ts';
|
|
4
|
+
import type { BrowserService } from './browser-service.ts';
|
|
5
|
+
export declare function registerAutomationAssetRpc(ctx: Context, store: AutomationAssetStore, service: BrowserService): void;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** Loopback-only Host RPC for the automation asset review UI. */
|
|
2
|
+
import { executeAutomationAsset } from "./automation-execution.js";
|
|
3
|
+
const CHANNEL = '/dsh-browser-assets';
|
|
4
|
+
function record(payload) {
|
|
5
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload))
|
|
6
|
+
throw new Error('request payload must be an object');
|
|
7
|
+
if (JSON.stringify(payload).length > 100_000)
|
|
8
|
+
throw new Error('request payload exceeds 100000 characters');
|
|
9
|
+
return payload;
|
|
10
|
+
}
|
|
11
|
+
function stringField(payload, name) {
|
|
12
|
+
const value = payload[name];
|
|
13
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > 200)
|
|
14
|
+
throw new Error(`${name} must be a non-empty string`);
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
export function registerAutomationAssetRpc(ctx, store, service) {
|
|
18
|
+
ctx.inject(['connection'], (connectionCtx) => {
|
|
19
|
+
const connection = connectionCtx.connection;
|
|
20
|
+
const dispose = connection.rpc.handle(CHANNEL, async (endpoint, rawPayload) => {
|
|
21
|
+
try {
|
|
22
|
+
const payload = record(rawPayload);
|
|
23
|
+
let value;
|
|
24
|
+
switch (endpoint) {
|
|
25
|
+
case 'snapshot':
|
|
26
|
+
value = store.snapshot();
|
|
27
|
+
break;
|
|
28
|
+
case 'get':
|
|
29
|
+
value = store.get(stringField(payload, 'id')) ?? null;
|
|
30
|
+
break;
|
|
31
|
+
case 'save':
|
|
32
|
+
value = store.saveDraft(payload.asset);
|
|
33
|
+
break;
|
|
34
|
+
case 'summarize':
|
|
35
|
+
value = store.summarizeCandidate(stringField(payload, 'id'));
|
|
36
|
+
break;
|
|
37
|
+
case 'dismiss':
|
|
38
|
+
store.dismissCandidate(stringField(payload, 'id'));
|
|
39
|
+
value = store.snapshot();
|
|
40
|
+
break;
|
|
41
|
+
case 'validate':
|
|
42
|
+
value = store.validate(stringField(payload, 'id'));
|
|
43
|
+
break;
|
|
44
|
+
case 'test': {
|
|
45
|
+
const result = await executeAutomationAsset(service, store, stringField(payload, 'id'), stringField(payload, 'url'), payload.inputs, 'draft');
|
|
46
|
+
value = result.asset;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'status':
|
|
50
|
+
value = store.setStatus(stringField(payload, 'id'), stringField(payload, 'status'));
|
|
51
|
+
break;
|
|
52
|
+
default: return { ok: false, error: { code: 'not-found', message: `unknown automation asset endpoint: ${endpoint}` } };
|
|
53
|
+
}
|
|
54
|
+
return { ok: true, value };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return { ok: false, error: { code: 'bad-request', message: String(error instanceof Error ? error.message : error).slice(0, 500) } };
|
|
58
|
+
}
|
|
59
|
+
}, { authority: 'loopback' });
|
|
60
|
+
connectionCtx.effect(() => dispose, 'dsh-browser: automation asset RPC');
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=automation-assets-rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-assets-rpc.js","sourceRoot":"","sources":["../src/automation-assets-rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/** Bounded, local automation-asset lifecycle and retrieval. */
|
|
2
|
+
import type { BrowserRecipeStep } from './automation.ts';
|
|
3
|
+
export declare const ASSET_PERSISTENCE_MODES: readonly ["off", "manual", "suggest", "auto-draft"];
|
|
4
|
+
export type AssetPersistenceMode = typeof ASSET_PERSISTENCE_MODES[number];
|
|
5
|
+
export declare const ASSET_ACTIVATION_MODES: readonly ["manual", "auto-tested"];
|
|
6
|
+
export type AssetActivationMode = typeof ASSET_ACTIVATION_MODES[number];
|
|
7
|
+
export type AutomationAssetKind = 'recipe' | 'userscript';
|
|
8
|
+
export type AutomationAssetStatus = 'draft' | 'active' | 'archived';
|
|
9
|
+
export interface AutomationAssetPolicyInput {
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
directory?: string;
|
|
12
|
+
persistenceMode?: AssetPersistenceMode;
|
|
13
|
+
activationMode?: AssetActivationMode;
|
|
14
|
+
minSuccessfulRuns?: number;
|
|
15
|
+
minDistinctSessions?: number;
|
|
16
|
+
successWindowDays?: number;
|
|
17
|
+
minSuccessRate?: number;
|
|
18
|
+
maxCandidates?: number;
|
|
19
|
+
candidateTtlDays?: number;
|
|
20
|
+
maxSuggestionsPerDay?: number;
|
|
21
|
+
maxDrafts?: number;
|
|
22
|
+
maxActiveAssets?: number;
|
|
23
|
+
retrievalTopK?: number;
|
|
24
|
+
catalogTokenBudget?: number;
|
|
25
|
+
modelDevelopmentEnabled?: boolean;
|
|
26
|
+
maxModelDraftWritesPerSession?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface AutomationAssetPolicy {
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
directory: string;
|
|
31
|
+
persistenceMode: AssetPersistenceMode;
|
|
32
|
+
activationMode: AssetActivationMode;
|
|
33
|
+
minSuccessfulRuns: number;
|
|
34
|
+
minDistinctSessions: number;
|
|
35
|
+
successWindowDays: number;
|
|
36
|
+
minSuccessRate: number;
|
|
37
|
+
maxCandidates: number;
|
|
38
|
+
candidateTtlDays: number;
|
|
39
|
+
maxSuggestionsPerDay: number;
|
|
40
|
+
maxDrafts: number;
|
|
41
|
+
maxActiveAssets: number;
|
|
42
|
+
retrievalTopK: number;
|
|
43
|
+
catalogTokenBudget: number;
|
|
44
|
+
modelDevelopmentEnabled: boolean;
|
|
45
|
+
maxModelDraftWritesPerSession: number;
|
|
46
|
+
}
|
|
47
|
+
export interface AutomationCandidate {
|
|
48
|
+
id: string;
|
|
49
|
+
fingerprint: string;
|
|
50
|
+
domain: string;
|
|
51
|
+
title: string;
|
|
52
|
+
steps: BrowserRecipeStep[];
|
|
53
|
+
successfulRuns: number;
|
|
54
|
+
failedRuns: number;
|
|
55
|
+
sessionIds: string[];
|
|
56
|
+
firstSeenAt: string;
|
|
57
|
+
lastSeenAt: string;
|
|
58
|
+
suggestedAt?: string;
|
|
59
|
+
dismissedAt?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface AutomationAsset {
|
|
62
|
+
id: string;
|
|
63
|
+
kind: AutomationAssetKind;
|
|
64
|
+
status: AutomationAssetStatus;
|
|
65
|
+
name: string;
|
|
66
|
+
description: string;
|
|
67
|
+
domains: string[];
|
|
68
|
+
tags: string[];
|
|
69
|
+
inputNames: string[];
|
|
70
|
+
recipe?: BrowserRecipeStep[];
|
|
71
|
+
source?: string;
|
|
72
|
+
revision: number;
|
|
73
|
+
testStatus: 'untested' | 'passed' | 'failed';
|
|
74
|
+
testMessage?: string;
|
|
75
|
+
successCount: number;
|
|
76
|
+
failureCount: number;
|
|
77
|
+
createdAt: string;
|
|
78
|
+
updatedAt: string;
|
|
79
|
+
lastRunAt?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface AutomationAssetSummary {
|
|
82
|
+
id: string;
|
|
83
|
+
kind: AutomationAssetKind;
|
|
84
|
+
status: AutomationAssetStatus;
|
|
85
|
+
name: string;
|
|
86
|
+
description: string;
|
|
87
|
+
domains: string[];
|
|
88
|
+
tags: string[];
|
|
89
|
+
inputNames: string[];
|
|
90
|
+
revision: number;
|
|
91
|
+
testStatus: AutomationAsset['testStatus'];
|
|
92
|
+
successCount: number;
|
|
93
|
+
failureCount: number;
|
|
94
|
+
updatedAt: string;
|
|
95
|
+
lastRunAt?: string;
|
|
96
|
+
}
|
|
97
|
+
export interface AutomationCandidateSummary {
|
|
98
|
+
id: string;
|
|
99
|
+
domain: string;
|
|
100
|
+
title: string;
|
|
101
|
+
successfulRuns: number;
|
|
102
|
+
failedRuns: number;
|
|
103
|
+
distinctSessions: number;
|
|
104
|
+
firstSeenAt: string;
|
|
105
|
+
lastSeenAt: string;
|
|
106
|
+
suggestedAt?: string;
|
|
107
|
+
dismissedAt?: string;
|
|
108
|
+
}
|
|
109
|
+
export interface AutomationAssetSnapshot {
|
|
110
|
+
policy: Omit<AutomationAssetPolicy, 'directory'>;
|
|
111
|
+
candidates: AutomationCandidateSummary[];
|
|
112
|
+
assets: AutomationAssetSummary[];
|
|
113
|
+
}
|
|
114
|
+
export declare function defaultAutomationAssetDirectory(): string;
|
|
115
|
+
export declare function resolveAutomationAssetPolicy(input?: AutomationAssetPolicyInput): AutomationAssetPolicy;
|
|
116
|
+
/** Remove concrete form values and non-semantic output from a successful recipe. */
|
|
117
|
+
export declare function normalizeRecipeForCandidate(steps: BrowserRecipeStep[]): BrowserRecipeStep[];
|
|
118
|
+
export declare class AutomationAssetStore {
|
|
119
|
+
readonly policy: AutomationAssetPolicy;
|
|
120
|
+
private readonly statePath;
|
|
121
|
+
private state;
|
|
122
|
+
constructor(policy: AutomationAssetPolicy);
|
|
123
|
+
snapshot(): AutomationAssetSnapshot;
|
|
124
|
+
get(id: string): AutomationAsset | undefined;
|
|
125
|
+
recordRecipe(url: string, steps: BrowserRecipeStep[], sessionId: string, ok: boolean, now?: number): AutomationCandidate | undefined;
|
|
126
|
+
summarizeCandidate(id: string): AutomationAsset;
|
|
127
|
+
dismissCandidate(id: string): void;
|
|
128
|
+
saveDraft(input: Partial<AutomationAsset> & Pick<AutomationAsset, 'kind' | 'name'>): AutomationAsset;
|
|
129
|
+
validate(id: string): AutomationAsset;
|
|
130
|
+
setStatus(id: string, status: AutomationAssetStatus): AutomationAsset;
|
|
131
|
+
search(query: string, domain?: string, status?: AutomationAssetStatus | 'all', kind?: AutomationAssetKind): AutomationAssetSummary[];
|
|
132
|
+
noteRun(id: string, ok: boolean): void;
|
|
133
|
+
noteTestResult(id: string, ok: boolean, url: string): void;
|
|
134
|
+
assertTarget(asset: AutomationAsset, url: string): void;
|
|
135
|
+
private requireAsset;
|
|
136
|
+
private prune;
|
|
137
|
+
private read;
|
|
138
|
+
private write;
|
|
139
|
+
}
|