@anweat/dsh-browser 0.1.8 → 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 +56 -6
- package/lib/approval-policy.js +19 -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 +5 -0
- package/lib/browser-service.js +66 -14
- package/lib/browser-service.js.map +1 -1
- package/lib/client/SettingsCard.js +50 -2
- package/lib/client/SettingsCard.js.map +1 -1
- 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/form.d.ts +1 -1
- package/lib/client/form.js +26 -0
- package/lib/client/form.js.map +1 -1
- package/lib/client/index.d.ts +11 -0
- package/lib/client/index.js +11 -1
- package/lib/client/index.js.map +1 -1
- package/lib/client/locales.d.ts +28 -0
- package/lib/client/locales.js +10 -0
- package/lib/client/locales.js.map +1 -1
- package/lib/client/styles.d.ts +11 -0
- package/lib/client/styles.js +4 -1
- package/lib/client/styles.js.map +1 -1
- package/lib/client.js +533 -4
- package/lib/client.js.map +1 -1
- package/lib/config.d.ts +4 -0
- package/lib/config.js +21 -0
- package/lib/config.js.map +1 -1
- package/lib/freedom.d.ts +4 -1
- package/lib/freedom.js +10 -0
- package/lib/freedom.js.map +1 -1
- package/lib/index.d.ts +3 -1
- package/lib/index.js +7 -2
- package/lib/index.js.map +1 -1
- package/lib/scripts.d.ts +1 -1
- package/lib/scripts.js +3 -2
- package/lib/scripts.js.map +1 -1
- package/lib/tools.d.ts +2 -1
- package/lib/tools.js +149 -12
- package/lib/tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/** Bounded, local automation-asset lifecycle and retrieval. */
|
|
2
|
+
import crypto from 'node:crypto';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { validateUserscript } from "./scripts.js";
|
|
7
|
+
export const ASSET_PERSISTENCE_MODES = ['off', 'manual', 'suggest', 'auto-draft'];
|
|
8
|
+
export const ASSET_ACTIVATION_MODES = ['manual', 'auto-tested'];
|
|
9
|
+
const DEFAULT_STATE = { version: 1, candidates: [], assets: [] };
|
|
10
|
+
function boundedInteger(value, fallback, min, max) {
|
|
11
|
+
return typeof value === 'number' && Number.isInteger(value) ? Math.min(Math.max(value, min), max) : fallback;
|
|
12
|
+
}
|
|
13
|
+
function boundedNumber(value, fallback, min, max) {
|
|
14
|
+
return typeof value === 'number' && Number.isFinite(value) ? Math.min(Math.max(value, min), max) : fallback;
|
|
15
|
+
}
|
|
16
|
+
export function defaultAutomationAssetDirectory() {
|
|
17
|
+
const home = process.env.DSH_HOME ?? path.join(os.homedir(), '.dsh');
|
|
18
|
+
return path.join(home, 'data', 'browser', 'automations');
|
|
19
|
+
}
|
|
20
|
+
export function resolveAutomationAssetPolicy(input = {}) {
|
|
21
|
+
const persistenceMode = input.persistenceMode ?? 'suggest';
|
|
22
|
+
const activationMode = input.activationMode ?? 'manual';
|
|
23
|
+
if (!ASSET_PERSISTENCE_MODES.includes(persistenceMode))
|
|
24
|
+
throw new Error('automationAssets.persistenceMode is invalid');
|
|
25
|
+
if (!ASSET_ACTIVATION_MODES.includes(activationMode))
|
|
26
|
+
throw new Error('automationAssets.activationMode is invalid');
|
|
27
|
+
return {
|
|
28
|
+
enabled: input.enabled ?? true,
|
|
29
|
+
directory: input.directory?.trim() || defaultAutomationAssetDirectory(),
|
|
30
|
+
persistenceMode,
|
|
31
|
+
activationMode,
|
|
32
|
+
minSuccessfulRuns: boundedInteger(input.minSuccessfulRuns, 3, 2, 20),
|
|
33
|
+
minDistinctSessions: boundedInteger(input.minDistinctSessions, 2, 1, 10),
|
|
34
|
+
successWindowDays: boundedInteger(input.successWindowDays, 14, 1, 90),
|
|
35
|
+
minSuccessRate: boundedNumber(input.minSuccessRate, 0.8, 0.5, 1),
|
|
36
|
+
maxCandidates: boundedInteger(input.maxCandidates, 20, 1, 100),
|
|
37
|
+
candidateTtlDays: boundedInteger(input.candidateTtlDays, 14, 1, 90),
|
|
38
|
+
maxSuggestionsPerDay: boundedInteger(input.maxSuggestionsPerDay, 2, 0, 20),
|
|
39
|
+
maxDrafts: boundedInteger(input.maxDrafts, 10, 1, 100),
|
|
40
|
+
maxActiveAssets: boundedInteger(input.maxActiveAssets, 50, 1, 200),
|
|
41
|
+
retrievalTopK: boundedInteger(input.retrievalTopK, 5, 1, 20),
|
|
42
|
+
catalogTokenBudget: boundedInteger(input.catalogTokenBudget, 800, 100, 4_000),
|
|
43
|
+
modelDevelopmentEnabled: input.modelDevelopmentEnabled ?? true,
|
|
44
|
+
maxModelDraftWritesPerSession: boundedInteger(input.maxModelDraftWritesPerSession, 3, 1, 20),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function nowIso(now = Date.now()) { return new Date(now).toISOString(); }
|
|
48
|
+
function uid() { return crypto.randomUUID(); }
|
|
49
|
+
function hash(value) { return crypto.createHash('sha256').update(value).digest('hex'); }
|
|
50
|
+
function safeDomain(url) {
|
|
51
|
+
const parsed = new URL(url);
|
|
52
|
+
if (!['http:', 'https:'].includes(parsed.protocol))
|
|
53
|
+
throw new Error('automation assets only support HTTP(S) URLs');
|
|
54
|
+
return parsed.hostname.toLowerCase();
|
|
55
|
+
}
|
|
56
|
+
function cap(value, max) { return value.trim().slice(0, max); }
|
|
57
|
+
const SECRET_SELECTOR = /pass(word)?|token|secret|otp|one[-_ ]?time|credit|card|cvv|authorization/i;
|
|
58
|
+
function sanitizeSelector(selector) {
|
|
59
|
+
return selector.replace(/\[\s*([-\w:]+)\s*[*^$|~]?=\s*(?:"[^"]*"|'[^']*'|[^\]]+)\]/g, '[$1]').slice(0, 500);
|
|
60
|
+
}
|
|
61
|
+
function inputPlaceholder(selector, secret) {
|
|
62
|
+
if (secret)
|
|
63
|
+
return 'secret';
|
|
64
|
+
const hint = selector.match(/\[\s*name\s*=\s*["']?([^\]"']+)/i)?.[1]
|
|
65
|
+
?? selector.match(/#([\w-]+)/)?.[1]
|
|
66
|
+
?? selector.match(/\[\s*aria-label\s*=\s*["']?([^\]"']+)/i)?.[1];
|
|
67
|
+
const suffix = hint?.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '').slice(0, 24);
|
|
68
|
+
return suffix ? `input_${suffix}` : 'input';
|
|
69
|
+
}
|
|
70
|
+
function recipeInputNames(steps) {
|
|
71
|
+
return [...new Set(JSON.stringify(steps).match(/\{\{([a-zA-Z][\w-]*)\}\}/g)?.map(value => value.slice(2, -2)) ?? [])];
|
|
72
|
+
}
|
|
73
|
+
/** Remove concrete form values and non-semantic output from a successful recipe. */
|
|
74
|
+
export function normalizeRecipeForCandidate(steps) {
|
|
75
|
+
if (!Array.isArray(steps) || steps.length < 1 || steps.length > 25)
|
|
76
|
+
throw new Error('candidate recipe requires 1 to 25 steps');
|
|
77
|
+
const normalized = steps.map((step) => {
|
|
78
|
+
const clean = structuredClone(step);
|
|
79
|
+
delete clean.text;
|
|
80
|
+
if ('value' in clean) {
|
|
81
|
+
const selector = 'selector' in clean ? String(clean.selector ?? '') : '';
|
|
82
|
+
const secret = SECRET_SELECTOR.test(selector);
|
|
83
|
+
clean.value = `{{${inputPlaceholder(selector, secret)}}}`;
|
|
84
|
+
}
|
|
85
|
+
if ('selector' in clean && typeof clean.selector === 'string')
|
|
86
|
+
clean.selector = sanitizeSelector(clean.selector);
|
|
87
|
+
if ('timeoutMs' in clean && typeof clean.timeoutMs === 'number')
|
|
88
|
+
clean.timeoutMs = Math.min(Math.max(Math.round(clean.timeoutMs), 100), 60_000);
|
|
89
|
+
if ('waitMs' in clean && typeof clean.waitMs === 'number')
|
|
90
|
+
clean.waitMs = Math.min(Math.max(Math.round(clean.waitMs), 0), 10_000);
|
|
91
|
+
return clean;
|
|
92
|
+
});
|
|
93
|
+
if (recipeInputNames(normalized).length > 20)
|
|
94
|
+
throw new Error('candidate recipe exceeds 20 reusable inputs');
|
|
95
|
+
return normalized;
|
|
96
|
+
}
|
|
97
|
+
function candidateFingerprint(domain, steps) {
|
|
98
|
+
return hash(JSON.stringify({ domain, steps }));
|
|
99
|
+
}
|
|
100
|
+
function summary(asset) {
|
|
101
|
+
const { id, kind, status, name, description, domains, tags, inputNames, revision, testStatus, successCount, failureCount, updatedAt, lastRunAt } = asset;
|
|
102
|
+
return { id, kind, status, name, description, domains: [...domains], tags: [...tags], inputNames: [...inputNames], revision, testStatus, successCount, failureCount, updatedAt, ...lastRunAt ? { lastRunAt } : {} };
|
|
103
|
+
}
|
|
104
|
+
function persistedState(value) {
|
|
105
|
+
if (!value || typeof value !== 'object')
|
|
106
|
+
throw new Error('state root must be an object');
|
|
107
|
+
const state = value;
|
|
108
|
+
if (state.version !== 1 || !Array.isArray(state.candidates) || !Array.isArray(state.assets))
|
|
109
|
+
throw new Error('unsupported or malformed state');
|
|
110
|
+
if (state.candidates.length > 200 || state.assets.length > 300)
|
|
111
|
+
throw new Error('state exceeds hard item limits');
|
|
112
|
+
const malformedCandidate = state.candidates.some(candidate => !candidate || typeof candidate !== 'object'
|
|
113
|
+
|| typeof candidate.id !== 'string' || typeof candidate.fingerprint !== 'string' || typeof candidate.domain !== 'string'
|
|
114
|
+
|| !Array.isArray(candidate.steps) || candidate.steps.length < 1 || candidate.steps.length > 25
|
|
115
|
+
|| !Array.isArray(candidate.sessionIds) || candidate.sessionIds.length > 30
|
|
116
|
+
|| typeof candidate.successfulRuns !== 'number' || typeof candidate.failedRuns !== 'number'
|
|
117
|
+
|| !Number.isFinite(Date.parse(candidate.firstSeenAt)) || !Number.isFinite(Date.parse(candidate.lastSeenAt)));
|
|
118
|
+
const malformedAsset = state.assets.some(asset => !asset || typeof asset !== 'object'
|
|
119
|
+
|| typeof asset.id !== 'string' || !['recipe', 'userscript'].includes(asset.kind) || !['draft', 'active', 'archived'].includes(asset.status)
|
|
120
|
+
|| typeof asset.name !== 'string' || asset.name.length > 120 || !Array.isArray(asset.domains) || asset.domains.length > 20
|
|
121
|
+
|| !Array.isArray(asset.tags) || asset.tags.length > 20 || !Array.isArray(asset.inputNames) || asset.inputNames.length > 20
|
|
122
|
+
|| (asset.kind === 'recipe' && (!Array.isArray(asset.recipe) || asset.recipe.length < 1 || asset.recipe.length > 25))
|
|
123
|
+
|| (asset.kind === 'userscript' && (typeof asset.source !== 'string' || Buffer.byteLength(asset.source, 'utf8') > 64 * 1024))
|
|
124
|
+
|| !Number.isInteger(asset.revision) || !Number.isFinite(Date.parse(asset.createdAt)) || !Number.isFinite(Date.parse(asset.updatedAt)));
|
|
125
|
+
if (malformedCandidate || malformedAsset)
|
|
126
|
+
throw new Error('persisted asset entries are malformed');
|
|
127
|
+
return { version: 1, candidates: state.candidates, assets: state.assets };
|
|
128
|
+
}
|
|
129
|
+
export class AutomationAssetStore {
|
|
130
|
+
policy;
|
|
131
|
+
statePath;
|
|
132
|
+
state;
|
|
133
|
+
constructor(policy) {
|
|
134
|
+
this.policy = policy;
|
|
135
|
+
this.statePath = path.join(policy.directory, 'assets.json');
|
|
136
|
+
this.state = this.read();
|
|
137
|
+
this.prune();
|
|
138
|
+
}
|
|
139
|
+
snapshot() {
|
|
140
|
+
const { directory: _directory, ...publicPolicy } = this.policy;
|
|
141
|
+
return {
|
|
142
|
+
policy: publicPolicy,
|
|
143
|
+
candidates: this.state.candidates.map(({ id, domain, title, successfulRuns, failedRuns, sessionIds, firstSeenAt, lastSeenAt, suggestedAt, dismissedAt }) => ({
|
|
144
|
+
id, domain, title, successfulRuns, failedRuns, distinctSessions: sessionIds.length, firstSeenAt, lastSeenAt,
|
|
145
|
+
...suggestedAt ? { suggestedAt } : {}, ...dismissedAt ? { dismissedAt } : {},
|
|
146
|
+
})),
|
|
147
|
+
assets: this.state.assets.map(summary),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
get(id) {
|
|
151
|
+
const asset = this.state.assets.find(item => item.id === id);
|
|
152
|
+
return asset ? structuredClone(asset) : undefined;
|
|
153
|
+
}
|
|
154
|
+
recordRecipe(url, steps, sessionId, ok, now = Date.now()) {
|
|
155
|
+
if (!this.policy.enabled || !['suggest', 'auto-draft'].includes(this.policy.persistenceMode))
|
|
156
|
+
return undefined;
|
|
157
|
+
const domain = safeDomain(url);
|
|
158
|
+
const normalized = normalizeRecipeForCandidate(steps);
|
|
159
|
+
const fingerprint = candidateFingerprint(domain, normalized);
|
|
160
|
+
const timestamp = nowIso(now);
|
|
161
|
+
let candidate = this.state.candidates.find(item => item.fingerprint === fingerprint);
|
|
162
|
+
if (!candidate) {
|
|
163
|
+
candidate = { id: uid(), fingerprint, domain, title: `Reusable automation for ${domain}`, steps: normalized, successfulRuns: 0, failedRuns: 0, sessionIds: [], firstSeenAt: timestamp, lastSeenAt: timestamp };
|
|
164
|
+
this.state.candidates.push(candidate);
|
|
165
|
+
}
|
|
166
|
+
const windowStart = now - this.policy.successWindowDays * 86_400_000;
|
|
167
|
+
if (Date.parse(candidate.firstSeenAt) < windowStart) {
|
|
168
|
+
candidate.successfulRuns = 0;
|
|
169
|
+
candidate.failedRuns = 0;
|
|
170
|
+
candidate.sessionIds = [];
|
|
171
|
+
candidate.firstSeenAt = timestamp;
|
|
172
|
+
candidate.suggestedAt = undefined;
|
|
173
|
+
}
|
|
174
|
+
if (ok)
|
|
175
|
+
candidate.successfulRuns += 1;
|
|
176
|
+
else
|
|
177
|
+
candidate.failedRuns += 1;
|
|
178
|
+
candidate.lastSeenAt = timestamp;
|
|
179
|
+
const sessionKey = sessionId ? hash(sessionId).slice(0, 16) : '';
|
|
180
|
+
if (sessionKey && !candidate.sessionIds.includes(sessionKey))
|
|
181
|
+
candidate.sessionIds.push(sessionKey);
|
|
182
|
+
candidate.sessionIds = candidate.sessionIds.slice(-this.policy.minDistinctSessions * 3);
|
|
183
|
+
const total = candidate.successfulRuns + candidate.failedRuns;
|
|
184
|
+
const eligible = candidate.successfulRuns >= this.policy.minSuccessfulRuns
|
|
185
|
+
&& candidate.sessionIds.length >= this.policy.minDistinctSessions
|
|
186
|
+
&& candidate.successfulRuns / total >= this.policy.minSuccessRate;
|
|
187
|
+
const day = timestamp.slice(0, 10);
|
|
188
|
+
const suggestionsToday = this.state.candidates.filter(item => item.suggestedAt?.startsWith(day)).length;
|
|
189
|
+
if (eligible && !candidate.suggestedAt && !candidate.dismissedAt && suggestionsToday < this.policy.maxSuggestionsPerDay)
|
|
190
|
+
candidate.suggestedAt = timestamp;
|
|
191
|
+
this.prune(now);
|
|
192
|
+
this.write();
|
|
193
|
+
if (this.policy.persistenceMode === 'auto-draft' && candidate.suggestedAt && !this.state.assets.some(item => item.tags.includes(`candidate:${candidate.id}`))) {
|
|
194
|
+
this.summarizeCandidate(candidate.id);
|
|
195
|
+
}
|
|
196
|
+
return structuredClone(candidate);
|
|
197
|
+
}
|
|
198
|
+
summarizeCandidate(id) {
|
|
199
|
+
const candidate = this.state.candidates.find(item => item.id === id);
|
|
200
|
+
if (!candidate)
|
|
201
|
+
throw new Error('automation candidate not found');
|
|
202
|
+
if (this.state.assets.filter(item => item.status === 'draft').length >= this.policy.maxDrafts)
|
|
203
|
+
throw new Error('automation draft limit reached');
|
|
204
|
+
const timestamp = nowIso();
|
|
205
|
+
const asset = {
|
|
206
|
+
id: uid(), kind: 'recipe', status: 'draft', name: candidate.title, description: `Captured from ${candidate.successfulRuns} successful runs across ${candidate.sessionIds.length} sessions.`,
|
|
207
|
+
domains: [candidate.domain], tags: [`candidate:${candidate.id}`], inputNames: recipeInputNames(candidate.steps), recipe: structuredClone(candidate.steps), revision: 1,
|
|
208
|
+
testStatus: 'untested', successCount: 0, failureCount: 0, createdAt: timestamp, updatedAt: timestamp,
|
|
209
|
+
};
|
|
210
|
+
this.state.assets.push(asset);
|
|
211
|
+
candidate.dismissedAt = timestamp;
|
|
212
|
+
this.write();
|
|
213
|
+
return structuredClone(asset);
|
|
214
|
+
}
|
|
215
|
+
dismissCandidate(id) {
|
|
216
|
+
const candidate = this.state.candidates.find(item => item.id === id);
|
|
217
|
+
if (!candidate)
|
|
218
|
+
throw new Error('automation candidate not found');
|
|
219
|
+
candidate.dismissedAt = nowIso();
|
|
220
|
+
this.write();
|
|
221
|
+
}
|
|
222
|
+
saveDraft(input) {
|
|
223
|
+
if (!this.policy.enabled || this.policy.persistenceMode === 'off')
|
|
224
|
+
throw new Error('automation asset persistence is disabled');
|
|
225
|
+
const existing = input.id ? this.state.assets.find(item => item.id === input.id) : undefined;
|
|
226
|
+
if (existing?.status === 'active')
|
|
227
|
+
throw new Error('active assets must be copied to a draft before editing');
|
|
228
|
+
if (!existing && this.state.assets.filter(item => item.status === 'draft').length >= this.policy.maxDrafts)
|
|
229
|
+
throw new Error('automation draft limit reached');
|
|
230
|
+
const timestamp = nowIso();
|
|
231
|
+
const name = cap(input.name, 120);
|
|
232
|
+
if (!name)
|
|
233
|
+
throw new Error('automation asset name is required');
|
|
234
|
+
const kind = input.kind;
|
|
235
|
+
const domains = [...new Set((input.domains ?? []).map(value => cap(String(value).toLowerCase(), 255)).filter(Boolean))].slice(0, 20);
|
|
236
|
+
const tags = [...new Set((input.tags ?? []).map(value => cap(String(value), 40)).filter(Boolean))].slice(0, 20);
|
|
237
|
+
const declaredInputNames = [...new Set((input.inputNames ?? []).map(value => cap(String(value), 40)).filter(value => /^[a-zA-Z][\w-]*$/.test(value)))].slice(0, 20);
|
|
238
|
+
if (kind === 'recipe' && (!Array.isArray(input.recipe) || input.recipe.length < 1 || input.recipe.length > 25))
|
|
239
|
+
throw new Error('recipe asset requires 1 to 25 steps');
|
|
240
|
+
if (kind === 'userscript') {
|
|
241
|
+
const validation = validateUserscript(String(input.source ?? ''));
|
|
242
|
+
if (!validation.valid)
|
|
243
|
+
throw new Error('userscript is invalid: ' + validation.errors.join('; '));
|
|
244
|
+
}
|
|
245
|
+
const inputNames = kind === 'recipe' ? recipeInputNames(input.recipe) : declaredInputNames;
|
|
246
|
+
const asset = {
|
|
247
|
+
id: existing?.id ?? uid(), kind, status: 'draft', name, description: cap(String(input.description ?? ''), 500), domains, tags, inputNames,
|
|
248
|
+
...kind === 'recipe' ? { recipe: structuredClone(input.recipe) } : { source: String(input.source) },
|
|
249
|
+
revision: (existing?.revision ?? 0) + 1, testStatus: 'untested', successCount: existing?.successCount ?? 0, failureCount: existing?.failureCount ?? 0,
|
|
250
|
+
createdAt: existing?.createdAt ?? timestamp, updatedAt: timestamp, ...existing?.lastRunAt ? { lastRunAt: existing.lastRunAt } : {},
|
|
251
|
+
};
|
|
252
|
+
if (existing)
|
|
253
|
+
this.state.assets[this.state.assets.indexOf(existing)] = asset;
|
|
254
|
+
else
|
|
255
|
+
this.state.assets.push(asset);
|
|
256
|
+
this.write();
|
|
257
|
+
return structuredClone(asset);
|
|
258
|
+
}
|
|
259
|
+
validate(id) {
|
|
260
|
+
const asset = this.requireAsset(id);
|
|
261
|
+
let message = 'Recipe structure is valid; runtime replay is still required.';
|
|
262
|
+
if (asset.kind === 'recipe')
|
|
263
|
+
normalizeRecipeForCandidate(asset.recipe ?? []);
|
|
264
|
+
else {
|
|
265
|
+
const validation = validateUserscript(asset.source ?? '');
|
|
266
|
+
if (!validation.valid)
|
|
267
|
+
throw new Error(validation.errors.join('; '));
|
|
268
|
+
message = `Userscript validated (${validation.sha256.slice(0, 12)}); runtime replay is still required.`;
|
|
269
|
+
}
|
|
270
|
+
return { ...structuredClone(asset), testMessage: message };
|
|
271
|
+
}
|
|
272
|
+
setStatus(id, status) {
|
|
273
|
+
const asset = this.requireAsset(id);
|
|
274
|
+
if (!['draft', 'active', 'archived'].includes(status))
|
|
275
|
+
throw new Error('invalid automation asset status');
|
|
276
|
+
if (status === 'active') {
|
|
277
|
+
if (asset.testStatus !== 'passed')
|
|
278
|
+
throw new Error('automation asset must pass testing before activation');
|
|
279
|
+
if (asset.domains.length < 1)
|
|
280
|
+
throw new Error('automation asset must declare at least one domain before activation');
|
|
281
|
+
if (this.state.assets.filter(item => item.status === 'active' && item.id !== id).length >= this.policy.maxActiveAssets)
|
|
282
|
+
throw new Error('active automation asset limit reached');
|
|
283
|
+
}
|
|
284
|
+
asset.status = status;
|
|
285
|
+
asset.updatedAt = nowIso();
|
|
286
|
+
this.write();
|
|
287
|
+
return structuredClone(asset);
|
|
288
|
+
}
|
|
289
|
+
search(query, domain, status = 'active', kind) {
|
|
290
|
+
if (!query.trim())
|
|
291
|
+
throw new Error('automation search requires explicit keywords');
|
|
292
|
+
if (!['draft', 'active', 'archived', 'all'].includes(status))
|
|
293
|
+
throw new Error('invalid automation search status');
|
|
294
|
+
const terms = `${query} ${domain ?? ''}`.slice(0, 2_000).toLowerCase().split(/[^\p{L}\p{N}_.-]+/u).filter(Boolean).slice(0, 20);
|
|
295
|
+
const normalizedDomain = domain?.toLowerCase();
|
|
296
|
+
const scored = this.state.assets.filter(item => (status === 'all' || item.status === status) && (!kind || item.kind === kind)).map(asset => {
|
|
297
|
+
const haystack = [asset.name, asset.description, ...asset.domains, ...asset.tags, ...asset.inputNames].join(' ').toLowerCase();
|
|
298
|
+
let score = terms.reduce((sum, term) => sum + (haystack.includes(term) ? 4 : 0), 0);
|
|
299
|
+
score += terms.reduce((sum, term) => sum + (asset.tags.some(tag => tag.toLowerCase() === term) ? 6 : 0), 0);
|
|
300
|
+
if (normalizedDomain && asset.domains.some(value => normalizedDomain === value || normalizedDomain.endsWith('.' + value)))
|
|
301
|
+
score += 12;
|
|
302
|
+
score += Math.min(asset.successCount, 10) - Math.min(asset.failureCount, 5);
|
|
303
|
+
return { asset, score };
|
|
304
|
+
}).filter(item => item.score > 0 || terms.length === 0)
|
|
305
|
+
.sort((a, b) => b.score - a.score || b.asset.updatedAt.localeCompare(a.asset.updatedAt));
|
|
306
|
+
const results = [];
|
|
307
|
+
let chars = 0;
|
|
308
|
+
const charBudget = this.policy.catalogTokenBudget * 4;
|
|
309
|
+
for (const item of scored) {
|
|
310
|
+
const value = summary(item.asset);
|
|
311
|
+
const size = JSON.stringify(value).length;
|
|
312
|
+
if (results.length >= this.policy.retrievalTopK || (results.length > 0 && chars + size > charBudget))
|
|
313
|
+
break;
|
|
314
|
+
results.push(value);
|
|
315
|
+
chars += size;
|
|
316
|
+
}
|
|
317
|
+
return results;
|
|
318
|
+
}
|
|
319
|
+
noteRun(id, ok) {
|
|
320
|
+
const asset = this.requireAsset(id);
|
|
321
|
+
if (ok)
|
|
322
|
+
asset.successCount += 1;
|
|
323
|
+
else
|
|
324
|
+
asset.failureCount += 1;
|
|
325
|
+
asset.lastRunAt = nowIso();
|
|
326
|
+
asset.updatedAt = asset.lastRunAt;
|
|
327
|
+
this.write();
|
|
328
|
+
}
|
|
329
|
+
noteTestResult(id, ok, url) {
|
|
330
|
+
const asset = this.requireAsset(id);
|
|
331
|
+
if (asset.status !== 'draft')
|
|
332
|
+
throw new Error('only draft automation assets can record test results');
|
|
333
|
+
const domain = safeDomain(url);
|
|
334
|
+
asset.testStatus = ok ? 'passed' : 'failed';
|
|
335
|
+
asset.testMessage = ok ? `Runtime replay passed on ${domain}.` : `Runtime replay failed on ${domain}.`;
|
|
336
|
+
asset.updatedAt = nowIso();
|
|
337
|
+
this.write();
|
|
338
|
+
}
|
|
339
|
+
assertTarget(asset, url) {
|
|
340
|
+
const domain = safeDomain(url);
|
|
341
|
+
if (!asset.domains.some(allowed => domain === allowed || domain.endsWith('.' + allowed)))
|
|
342
|
+
throw new Error(`automation asset ${asset.id} is not allowed on ${domain}`);
|
|
343
|
+
}
|
|
344
|
+
requireAsset(id) {
|
|
345
|
+
const asset = this.state.assets.find(item => item.id === id);
|
|
346
|
+
if (!asset)
|
|
347
|
+
throw new Error('automation asset not found');
|
|
348
|
+
return asset;
|
|
349
|
+
}
|
|
350
|
+
prune(now = Date.now()) {
|
|
351
|
+
const cutoff = now - this.policy.candidateTtlDays * 86_400_000;
|
|
352
|
+
this.state.candidates = this.state.candidates.filter(item => Date.parse(item.lastSeenAt) >= cutoff)
|
|
353
|
+
.sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt)).slice(0, this.policy.maxCandidates);
|
|
354
|
+
}
|
|
355
|
+
read() {
|
|
356
|
+
if (!fs.existsSync(this.statePath))
|
|
357
|
+
return structuredClone(DEFAULT_STATE);
|
|
358
|
+
try {
|
|
359
|
+
return persistedState(JSON.parse(fs.readFileSync(this.statePath, 'utf8')));
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
throw new Error(`automation asset store is unreadable; refusing to overwrite ${this.statePath}: ${String(error)}`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
write() {
|
|
366
|
+
fs.mkdirSync(this.policy.directory, { recursive: true });
|
|
367
|
+
const temporary = this.statePath + '.tmp-' + uid().slice(0, 8);
|
|
368
|
+
fs.writeFileSync(temporary, JSON.stringify(this.state, null, 2), { encoding: 'utf8', mode: 0o600 });
|
|
369
|
+
fs.renameSync(temporary, this.statePath);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=automation-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-assets.js","sourceRoot":"","sources":["../src/automation-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Model-facing draft development core, independent of Harness tool transport. */
|
|
2
|
+
import type { AutomationAsset, AutomationAssetPolicy, AutomationAssetStore } from './automation-assets.ts';
|
|
3
|
+
export type AutomationDraftInput = Partial<AutomationAsset> & Pick<AutomationAsset, 'kind' | 'name'>;
|
|
4
|
+
export declare class AutomationDevelopmentService {
|
|
5
|
+
private readonly store;
|
|
6
|
+
private readonly policy;
|
|
7
|
+
private readonly writesBySession;
|
|
8
|
+
constructor(store: AutomationAssetStore, policy: AutomationAssetPolicy);
|
|
9
|
+
get(id: string): AutomationAsset;
|
|
10
|
+
validate(id: string): AutomationAsset;
|
|
11
|
+
save(input: AutomationDraftInput, sessionId: string): AutomationAsset;
|
|
12
|
+
private assertEnabled;
|
|
13
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Model-facing draft development core, independent of Harness tool transport. */
|
|
2
|
+
export class AutomationDevelopmentService {
|
|
3
|
+
store;
|
|
4
|
+
policy;
|
|
5
|
+
writesBySession = new Map();
|
|
6
|
+
constructor(store, policy) {
|
|
7
|
+
this.store = store;
|
|
8
|
+
this.policy = policy;
|
|
9
|
+
}
|
|
10
|
+
get(id) {
|
|
11
|
+
this.assertEnabled();
|
|
12
|
+
const asset = this.store.get(id);
|
|
13
|
+
if (!asset)
|
|
14
|
+
throw new Error('automation asset not found');
|
|
15
|
+
return asset;
|
|
16
|
+
}
|
|
17
|
+
validate(id) {
|
|
18
|
+
this.assertEnabled();
|
|
19
|
+
return this.store.validate(id);
|
|
20
|
+
}
|
|
21
|
+
save(input, sessionId) {
|
|
22
|
+
this.assertEnabled();
|
|
23
|
+
const writes = this.writesBySession.get(sessionId) ?? 0;
|
|
24
|
+
if (writes >= this.policy.maxModelDraftWritesPerSession)
|
|
25
|
+
throw new Error('model draft write limit reached for this session');
|
|
26
|
+
const asset = this.store.saveDraft(input);
|
|
27
|
+
this.writesBySession.set(sessionId, writes + 1);
|
|
28
|
+
if (this.writesBySession.size > 200)
|
|
29
|
+
this.writesBySession.delete(this.writesBySession.keys().next().value ?? '');
|
|
30
|
+
return asset;
|
|
31
|
+
}
|
|
32
|
+
assertEnabled() {
|
|
33
|
+
if (!this.policy.modelDevelopmentEnabled)
|
|
34
|
+
throw new Error('model automation development is disabled');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=automation-development.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-development.js","sourceRoot":"","sources":["../src/automation-development.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAMlF,MAAM,OAAO,4BAA4B;IAGV;IAA8C;IAF1D,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE5D,YAA6B,KAA2B,EAAmB,MAA6B;QAA3E,UAAK,GAAL,KAAK,CAAsB;QAAmB,WAAM,GAAN,MAAM,CAAuB;IAAG,CAAC;IAE5G,GAAG,CAAC,EAAU;QACZ,IAAI,CAAC,aAAa,EAAE,CAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QACzD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,IAAI,CAAC,aAAa,EAAE,CAAA;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,CAAC,KAA2B,EAAE,SAAiB;QACjD,IAAI,CAAC,aAAa,EAAE,CAAA;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACvD,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,6BAA6B;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;QAC5H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACzC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;QAC/C,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,GAAG,GAAG;YAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAChH,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;IACvG,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Shared guarded execution for active assets and draft runtime replay. */
|
|
2
|
+
import type { AutomationAsset, AutomationAssetStore } from './automation-assets.ts';
|
|
3
|
+
import type { BrowserService } from './browser-service.ts';
|
|
4
|
+
export interface AutomationExecutionOptions {
|
|
5
|
+
signal?: AbortSignal;
|
|
6
|
+
authProfile?: string;
|
|
7
|
+
rulePack?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AutomationExecutionResult {
|
|
10
|
+
asset: AutomationAsset;
|
|
11
|
+
value: unknown;
|
|
12
|
+
}
|
|
13
|
+
export declare function automationInputs(asset: AutomationAsset, raw: unknown): Record<string, string>;
|
|
14
|
+
export declare function executeAutomationAsset(service: BrowserService, store: AutomationAssetStore, id: string, url: string, rawInputs: unknown, requiredStatus: 'active' | 'draft', options?: AutomationExecutionOptions): Promise<AutomationExecutionResult>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Shared guarded execution for active assets and draft runtime replay. */
|
|
2
|
+
function materialize(value, inputs) {
|
|
3
|
+
return value.replace(/\{\{([a-zA-Z][\w-]*)\}\}/g, (_match, name) => {
|
|
4
|
+
if (!(name in inputs))
|
|
5
|
+
throw new Error(`missing automation input: ${name}`);
|
|
6
|
+
return inputs[name];
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function materializeRecipe(steps, inputs) {
|
|
10
|
+
return steps.map(step => {
|
|
11
|
+
const copy = structuredClone(step);
|
|
12
|
+
for (const key of ['value', 'text'])
|
|
13
|
+
if (typeof copy[key] === 'string')
|
|
14
|
+
copy[key] = materialize(copy[key], inputs);
|
|
15
|
+
return copy;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function automationInputs(asset, raw) {
|
|
19
|
+
const inputs = raw && typeof raw === 'object' && !Array.isArray(raw)
|
|
20
|
+
? Object.fromEntries(Object.entries(raw).map(([key, value]) => [key, String(value)])) : {};
|
|
21
|
+
if (Object.keys(inputs).length > 20 || Object.entries(inputs).some(([key, value]) => !/^[a-zA-Z][\w-]{0,39}$/.test(key) || value.length > 10_000))
|
|
22
|
+
throw new Error('automation inputs exceed key, count, or value limits');
|
|
23
|
+
const missing = asset.inputNames.filter(name => !(name in inputs));
|
|
24
|
+
const extra = Object.keys(inputs).filter(name => !asset.inputNames.includes(name));
|
|
25
|
+
if (missing.length)
|
|
26
|
+
throw new Error('missing declared automation inputs: ' + missing.join(', '));
|
|
27
|
+
if (extra.length)
|
|
28
|
+
throw new Error('undeclared automation inputs: ' + extra.join(', '));
|
|
29
|
+
return inputs;
|
|
30
|
+
}
|
|
31
|
+
export async function executeAutomationAsset(service, store, id, url, rawInputs, requiredStatus, options = {}) {
|
|
32
|
+
const asset = store.get(id);
|
|
33
|
+
if (!asset || asset.status !== requiredStatus)
|
|
34
|
+
throw new Error(`${requiredStatus} automation asset not found`);
|
|
35
|
+
const inputs = automationInputs(asset, rawInputs);
|
|
36
|
+
store.assertTarget(asset, url);
|
|
37
|
+
try {
|
|
38
|
+
const value = asset.kind === 'recipe'
|
|
39
|
+
? await service.recipe(materializeRecipe(asset.recipe ?? [], inputs), { url, signal: options.signal, ...options.authProfile ? { authProfile: options.authProfile } : {}, ...options.rulePack ? { rulePack: options.rulePack } : {} })
|
|
40
|
+
: await service.runUserscript(url, asset.source ?? '', { signal: options.signal, inputs, ...options.authProfile ? { authProfile: options.authProfile } : {}, ...options.rulePack ? { rulePack: options.rulePack } : {} });
|
|
41
|
+
if (requiredStatus === 'active')
|
|
42
|
+
store.noteRun(asset.id, true);
|
|
43
|
+
else
|
|
44
|
+
store.noteTestResult(asset.id, true, url);
|
|
45
|
+
return { asset: store.get(asset.id), value };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (requiredStatus === 'active')
|
|
49
|
+
store.noteRun(asset.id, false);
|
|
50
|
+
else
|
|
51
|
+
store.noteTestResult(asset.id, false, url);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=automation-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-execution.js","sourceRoot":"","sources":["../src/automation-execution.ts"],"names":[],"mappings":"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"}
|
package/lib/browser-service.d.ts
CHANGED
|
@@ -103,6 +103,8 @@ export interface BrowserStatus {
|
|
|
103
103
|
runtimeWarnings: string[];
|
|
104
104
|
headless: boolean;
|
|
105
105
|
opencliEnabled: boolean;
|
|
106
|
+
opencliInstalled: boolean;
|
|
107
|
+
opencliEntryPath?: string;
|
|
106
108
|
automationMode: AutomationMode;
|
|
107
109
|
exposedTools: string[];
|
|
108
110
|
directInteractionPolicy: 'deny' | 'ask' | 'allow';
|
|
@@ -110,6 +112,7 @@ export interface BrowserStatus {
|
|
|
110
112
|
externalUserscriptPolicy: 'deny' | 'ask' | 'allow';
|
|
111
113
|
opencliRunPolicy: 'deny' | 'ask' | 'allow';
|
|
112
114
|
chromiumInstalled: boolean;
|
|
115
|
+
chromiumExecutablePath?: string;
|
|
113
116
|
usagePolicy: ResolvedConfig['usagePolicy'];
|
|
114
117
|
usageGovernor: ReturnType<UsageGovernor['snapshot']>;
|
|
115
118
|
authProfiles: {
|
|
@@ -137,6 +140,7 @@ export declare class BrowserService {
|
|
|
137
140
|
private opencliCatalogCache?;
|
|
138
141
|
constructor(config: ResolvedConfig);
|
|
139
142
|
available(): boolean;
|
|
143
|
+
private assertEnabled;
|
|
140
144
|
private ensure;
|
|
141
145
|
/** Run `playwright install chromium` from the bundled playwright CLI. */
|
|
142
146
|
installChromium(): Promise<CliResult>;
|
|
@@ -204,6 +208,7 @@ export declare class BrowserService {
|
|
|
204
208
|
timeoutMs?: number;
|
|
205
209
|
authProfile?: string;
|
|
206
210
|
rulePack?: string;
|
|
211
|
+
inputs?: Record<string, string>;
|
|
207
212
|
}): Promise<ScriptRunResult>;
|
|
208
213
|
private ensureActivePage;
|
|
209
214
|
private captureScreenshot;
|