@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
|
@@ -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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"}
|