@jobshimo/browser-link 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/dist/activity/db.js +18 -0
- package/dist/activity/db.js.map +1 -1
- package/dist/activity/extract.d.ts +18 -2
- package/dist/activity/extract.js +122 -1
- package/dist/activity/extract.js.map +1 -1
- package/dist/activity/queries.d.ts +1 -1
- package/dist/activity/queries.js +20 -4
- package/dist/activity/queries.js.map +1 -1
- package/dist/activity/summary.d.ts +54 -0
- package/dist/activity/summary.js +95 -0
- package/dist/activity/summary.js.map +1 -0
- package/dist/activity/types.d.ts +30 -0
- package/dist/activity/types.js +31 -1
- package/dist/activity/types.js.map +1 -1
- package/dist/cli.js +18 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/activity.d.ts +5 -0
- package/dist/commands/activity.js +92 -1
- package/dist/commands/activity.js.map +1 -1
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.js +48 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.js.map +1 -1
- package/dist/extension/manifest.json +1 -1
- package/dist/manual/topics.js +2 -2
- package/dist/manual/topics.js.map +1 -1
- package/dist/map/db.js +26 -0
- package/dist/map/db.js.map +1 -1
- package/dist/map/learning.d.ts +81 -0
- package/dist/map/learning.js +244 -0
- package/dist/map/learning.js.map +1 -0
- package/dist/map/queries.d.ts +45 -0
- package/dist/map/queries.js +108 -5
- package/dist/map/queries.js.map +1 -1
- package/dist/map/tools.js +2 -1
- package/dist/map/tools.js.map +1 -1
- package/dist/server.js +9 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/browser-definitions.js +15 -1
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.d.ts +10 -0
- package/dist/tools/browser-dispatch.js +88 -18
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -115,6 +115,22 @@ browser-link map export --out map.json # back up the map as JSON
|
|
|
115
115
|
browser-link map import map.json # restore it (merge by default, --replace to overwrite)
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
### The map learns by itself
|
|
119
|
+
|
|
120
|
+
Every click, type, press, find and wait_for an agent runs on a CSS selector
|
|
121
|
+
or a `browser.find` semantic key adds an ok or a failure (with a fixed reason
|
|
122
|
+
such as `not-found` or `retargeted`) to that target's counters, per app and
|
|
123
|
+
route. Agents see it as `learned` in `browser.map.recall` and in the
|
|
124
|
+
`list_tabs` map hint, failures first. **Targets only, never values**: typed
|
|
125
|
+
text, evaluate expressions and pressed keys are never read. At most 200
|
|
126
|
+
learned targets per app. On by default; `browser-link config set
|
|
127
|
+
map-learning off` stops it without a restart.
|
|
128
|
+
|
|
129
|
+
For what went wrong in a session, agents call `browser.activity({ summary:
|
|
130
|
+
true })` and you run `browser-link activity report [--since <duration|iso>]
|
|
131
|
+
[--agent <id>]`: errors and flagged calls by flag, by tool, the top failing
|
|
132
|
+
selectors and one line per agent session.
|
|
133
|
+
|
|
118
134
|
> **Privacy note.** An export can contain UI structure and flow steps an
|
|
119
135
|
> agent saved — selectors, page notes, multi-step recipes. Review a file
|
|
120
136
|
> before sharing it. The map is designed so agents never write real domain
|
package/dist/activity/db.js
CHANGED
|
@@ -63,6 +63,24 @@ function runMigrations(db) {
|
|
|
63
63
|
CREATE INDEX IF NOT EXISTS idx_activity_flow ON activity(flow_id);
|
|
64
64
|
CREATE INDEX IF NOT EXISTS idx_activity_agent ON activity(agent);
|
|
65
65
|
`);
|
|
66
|
+
// Columns added after the table first shipped. `ADD COLUMN` has no
|
|
67
|
+
// IF NOT EXISTS form, so each one is guarded by `table_info`: a reopen is a
|
|
68
|
+
// no-op, and an upgraded file keeps every stored row exactly as it was —
|
|
69
|
+
// the new columns read back NULL for history, never a guessed value.
|
|
70
|
+
// Nullable with no CHECK on purpose: SQLite cannot alter a CHECK later, so
|
|
71
|
+
// the closed `flag` enum is enforced by `record` (see `ACTIVITY_FLAGS`).
|
|
72
|
+
const present = new Set(db.prepare('PRAGMA table_info(activity)').all().map((c) => c.name));
|
|
73
|
+
for (const [column, ddl] of [
|
|
74
|
+
['flag', 'ALTER TABLE activity ADD COLUMN flag TEXT'],
|
|
75
|
+
['agent_id', 'ALTER TABLE activity ADD COLUMN agent_id TEXT'],
|
|
76
|
+
]) {
|
|
77
|
+
if (!present.has(column))
|
|
78
|
+
db.exec(ddl);
|
|
79
|
+
}
|
|
80
|
+
db.exec(`
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_activity_flag ON activity(flag);
|
|
82
|
+
CREATE INDEX IF NOT EXISTS idx_activity_agent_id ON activity(agent_id);
|
|
83
|
+
`);
|
|
66
84
|
}
|
|
67
85
|
/**
|
|
68
86
|
* AUTOINCREMENT on the primary key is deliberate, and it is the reason the
|
package/dist/activity/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/activity/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,IAAI,UAAU,GAA6B,IAAI,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,aAAa;IAC3B,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB;IAC1C,yEAAyE;IACzE,wEAAwE;IACxE,gCAAgC;IAChC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;GAuBP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,KAAK,GAAG,KAAK;IAC7D,iBAAiB,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,iBAAiB,GAAG,cAAc;QAAE,OAAO,CAAC,CAAC;IAC3D,iBAAiB,GAAG,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN;;aAEO,CACR;SACA,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,UAAU,GAAG,IAAI,CAAC;IAClB,iBAAiB,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/activity/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,IAAI,UAAU,GAA6B,IAAI,CAAC;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B,MAAM,UAAU,aAAa;IAC3B,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAClC,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,UAAU,GAAG,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB;IAC1C,yEAAyE;IACzE,wEAAwE;IACxE,gCAAgC;IAChC,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;GAuBP,CAAC,CAAC;IAEH,mEAAmE;IACnE,4EAA4E;IAC5E,yEAAyE;IACzE,qEAAqE;IACrE,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CACpB,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3F,CAAC;IACF,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI;QAC1B,CAAC,MAAM,EAAE,2CAA2C,CAAC;QACrD,CAAC,UAAU,EAAE,+CAA+C,CAAC;KACrD,EAAE,CAAC;QACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,EAAqB,EAAE,KAAK,GAAG,KAAK;IAC7D,iBAAiB,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,IAAI,iBAAiB,GAAG,cAAc;QAAE,OAAO,CAAC,CAAC;IAC3D,iBAAiB,GAAG,CAAC,CAAC;IACtB,MAAM,MAAM,GAAG,EAAE;SACd,OAAO,CACN;;aAEO,CACR;SACA,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;yEACyE;AACzE,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,UAAU,GAAG,IAAI,CAAC;IAClB,iBAAiB,GAAG,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActivityInput, ActivityTransport } from './types.js';
|
|
1
|
+
import type { ActivityFlag, ActivityInput, ActivityTransport } from './types.js';
|
|
2
2
|
import type { AgentCaller } from '../tools/tab-claims.js';
|
|
3
3
|
export declare function extractSelector(tool: string, args: unknown): string | null;
|
|
4
4
|
export declare function extractPayload(tool: string, args: unknown): string | null;
|
|
@@ -25,8 +25,24 @@ export interface BuildRowInput {
|
|
|
25
25
|
/** False when `activity.record-payloads` is off: the row is still written,
|
|
26
26
|
* with its shape intact, minus the free text. */
|
|
27
27
|
recordPayloads: boolean;
|
|
28
|
+
/** The resolved tool response, when the call did not throw. Read only to
|
|
29
|
+
* classify `flag`; never stored. */
|
|
30
|
+
result?: unknown;
|
|
31
|
+
/** IPC session uuid of the caller; `'primary'` when absent. */
|
|
32
|
+
agentId?: string | null;
|
|
28
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Classify one call. `error` is the thrown value (undefined on success);
|
|
36
|
+
* `result` is the resolved response — an MCP `{ content: [...] }` envelope as
|
|
37
|
+
* `dispatchBrowserTool` returns it, or a raw result object. Total and
|
|
38
|
+
* throw-free: anything unreadable is simply "no flag".
|
|
39
|
+
*/
|
|
40
|
+
export declare function classifyFlag(tool: string, _args: unknown, result: unknown, error: unknown): ActivityFlag | null;
|
|
29
41
|
/** Assemble the row. Deliberately total — every branch returns something
|
|
30
42
|
* storable, because a tool call that produced a row we could not describe is
|
|
31
43
|
* still a tool call that happened. */
|
|
32
|
-
export declare function buildRow({ tool, args, caller, durationMs, error, recordPayloads, }: BuildRowInput): ActivityInput;
|
|
44
|
+
export declare function buildRow({ tool, args, caller, durationMs, error, recordPayloads, result, agentId, }: BuildRowInput): ActivityInput;
|
|
45
|
+
/** `buildRow` with the arguments split out — the signature the dispatcher's
|
|
46
|
+
* `writeTrail` calls. `meta` is `BuildRowInput` minus `args`, so a caller on
|
|
47
|
+
* the previous shape (no `result`, no `agentId`) keeps compiling. */
|
|
48
|
+
export declare function buildActivityRow(args: unknown, meta: Omit<BuildRowInput, 'args'>): ActivityInput;
|
package/dist/activity/extract.js
CHANGED
|
@@ -96,10 +96,123 @@ export function agentNameFor(caller) {
|
|
|
96
96
|
return caller.label;
|
|
97
97
|
return caller.binary && caller.binary.length > 0 ? caller.binary : null;
|
|
98
98
|
}
|
|
99
|
+
/* ---------------------------------------------------------- flags ------
|
|
100
|
+
*
|
|
101
|
+
* A trail of bare `ok`/`error` loses the most useful evidence: calls that
|
|
102
|
+
* RESOLVED but did not do what was asked (`wait_for` matched nothing, a flow
|
|
103
|
+
* ran out of time, a click landed on another element). `classifyFlag` names
|
|
104
|
+
* that friction, and the well-known thrown failures, with a closed enum so a
|
|
105
|
+
* report can GROUP BY it instead of regexing error text.
|
|
106
|
+
*/
|
|
107
|
+
/** Thrown (or `isError`) messages, matched in order. The strings are the
|
|
108
|
+
* stable prefixes the transports emit: `ref-stale:` (`flow.ts`), the
|
|
109
|
+
* retargeted click message (`retargetedClickMessage`), `expectation not met`
|
|
110
|
+
* (`cdp/expect.ts`), the bridge's `Tool '<name>' timed out` and `Element not found:`
|
|
111
|
+
* (the same not-found rule the map learner applies, see map/learning.ts). */
|
|
112
|
+
const ERROR_FLAGS = [
|
|
113
|
+
[/\bref-stale\b/, 'ref-stale'],
|
|
114
|
+
[/\bretargeted\b|\bClick would land on\b/, 'retargeted'],
|
|
115
|
+
[/\bexpectation not met\b/, 'expect-failed'],
|
|
116
|
+
[/\bTool '[^']*' timed out\b/, 'timeout'],
|
|
117
|
+
[/^Element not found:/, 'not-found'],
|
|
118
|
+
];
|
|
119
|
+
/** Tools whose resolved result is worth parsing. Everything else (snapshots,
|
|
120
|
+
* screenshots, list_tabs) can be large and never carries a friction signal,
|
|
121
|
+
* so it is not JSON-parsed on the hot path. */
|
|
122
|
+
const RESULT_TOOLS = new Set([
|
|
123
|
+
'browser.click',
|
|
124
|
+
'browser.type',
|
|
125
|
+
'browser.press',
|
|
126
|
+
'browser.drag',
|
|
127
|
+
'browser.find',
|
|
128
|
+
'browser.wait_for',
|
|
129
|
+
'browser.flow',
|
|
130
|
+
'browser.download',
|
|
131
|
+
]);
|
|
132
|
+
function flagFromMessage(message) {
|
|
133
|
+
for (const [pattern, flag] of ERROR_FLAGS)
|
|
134
|
+
if (pattern.test(message))
|
|
135
|
+
return flag;
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
/** The first text block of an MCP response, or null when it is not one. */
|
|
139
|
+
function firstText(result) {
|
|
140
|
+
if (typeof result !== 'object' || result === null)
|
|
141
|
+
return null;
|
|
142
|
+
const content = result.content;
|
|
143
|
+
if (!Array.isArray(content))
|
|
144
|
+
return null;
|
|
145
|
+
const block = content[0];
|
|
146
|
+
if (typeof block !== 'object' || block === null)
|
|
147
|
+
return null;
|
|
148
|
+
const text = block.text;
|
|
149
|
+
return typeof text === 'string' ? text : null;
|
|
150
|
+
}
|
|
151
|
+
function isMcpResponse(result) {
|
|
152
|
+
return (typeof result === 'object' &&
|
|
153
|
+
result !== null &&
|
|
154
|
+
Array.isArray(result.content));
|
|
155
|
+
}
|
|
156
|
+
function flagFromData(tool, data) {
|
|
157
|
+
if (typeof data !== 'object' || data === null || Array.isArray(data))
|
|
158
|
+
return null;
|
|
159
|
+
const d = data;
|
|
160
|
+
if (tool === 'browser.flow' && d.stopped_by === 'timeout')
|
|
161
|
+
return 'flow-timeout';
|
|
162
|
+
if (tool === 'browser.download' && (d.state === 'timeout' || d.state === 'interrupted')) {
|
|
163
|
+
return 'download-timeout';
|
|
164
|
+
}
|
|
165
|
+
if (d.matched === false) {
|
|
166
|
+
if (d.reason === 'not-found')
|
|
167
|
+
return 'not-found';
|
|
168
|
+
if (d.reason === 'multiple-matches')
|
|
169
|
+
return 'multiple-matches';
|
|
170
|
+
if (d.reason === 'ref-stale')
|
|
171
|
+
return 'ref-stale';
|
|
172
|
+
return 'unmatched';
|
|
173
|
+
}
|
|
174
|
+
// The click builder reports `hit_element` ONLY when the click lands on an
|
|
175
|
+
// element that is neither the target nor inside it (`buildClickResolveJs`),
|
|
176
|
+
// so its presence on a resolved call is the mismatch itself.
|
|
177
|
+
if (typeof d.hit_element === 'string' && d.hit_element.length > 0)
|
|
178
|
+
return 'hit-mismatch';
|
|
179
|
+
const settle = d.settle;
|
|
180
|
+
if (typeof settle === 'object' && settle !== null) {
|
|
181
|
+
if (settle.settled === false)
|
|
182
|
+
return 'unsettled';
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Classify one call. `error` is the thrown value (undefined on success);
|
|
188
|
+
* `result` is the resolved response — an MCP `{ content: [...] }` envelope as
|
|
189
|
+
* `dispatchBrowserTool` returns it, or a raw result object. Total and
|
|
190
|
+
* throw-free: anything unreadable is simply "no flag".
|
|
191
|
+
*/
|
|
192
|
+
export function classifyFlag(tool, _args, result, error) {
|
|
193
|
+
try {
|
|
194
|
+
if (error !== undefined)
|
|
195
|
+
return flagFromMessage(errorMessage(error));
|
|
196
|
+
if (isMcpResponse(result)) {
|
|
197
|
+
const text = firstText(result);
|
|
198
|
+
if (text === null)
|
|
199
|
+
return null;
|
|
200
|
+
if (result.isError === true)
|
|
201
|
+
return flagFromMessage(text);
|
|
202
|
+
if (!RESULT_TOOLS.has(tool))
|
|
203
|
+
return null;
|
|
204
|
+
return flagFromData(tool, JSON.parse(text));
|
|
205
|
+
}
|
|
206
|
+
return flagFromData(tool, result);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
99
212
|
/** Assemble the row. Deliberately total — every branch returns something
|
|
100
213
|
* storable, because a tool call that produced a row we could not describe is
|
|
101
214
|
* still a tool call that happened. */
|
|
102
|
-
export function buildRow({ tool, args, caller, durationMs, error, recordPayloads, }) {
|
|
215
|
+
export function buildRow({ tool, args, caller, durationMs, error, recordPayloads, result, agentId, }) {
|
|
103
216
|
const tabId = extractTabId(args);
|
|
104
217
|
return {
|
|
105
218
|
tool,
|
|
@@ -117,8 +230,16 @@ export function buildRow({ tool, args, caller, durationMs, error, recordPayloads
|
|
|
117
230
|
error: error === undefined ? null : errorMessage(error),
|
|
118
231
|
durationMs,
|
|
119
232
|
flowId: extractFlowId(args),
|
|
233
|
+
flag: classifyFlag(tool, args, result, error),
|
|
234
|
+
agentId: agentId ?? 'primary',
|
|
120
235
|
};
|
|
121
236
|
}
|
|
237
|
+
/** `buildRow` with the arguments split out — the signature the dispatcher's
|
|
238
|
+
* `writeTrail` calls. `meta` is `BuildRowInput` minus `args`, so a caller on
|
|
239
|
+
* the previous shape (no `result`, no `agentId`) keeps compiling. */
|
|
240
|
+
export function buildActivityRow(args, meta) {
|
|
241
|
+
return buildRow({ ...meta, args });
|
|
242
|
+
}
|
|
122
243
|
function errorMessage(error) {
|
|
123
244
|
if (error instanceof Error)
|
|
124
245
|
return error.message;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/activity/extract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/activity/extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Database from 'better-sqlite3';
|
|
2
|
-
import type
|
|
2
|
+
import { type ActivityInput, type ActivityPage, type ActivityQuery, type ActivityRecord } from './types.js';
|
|
3
3
|
/** Hard ceiling on rows a single read can return, whatever `limit` asks for.
|
|
4
4
|
* The panel pages; nothing needs ten thousand rows in one response, and an
|
|
5
5
|
* unbounded read is how a renderer freezes a browser. */
|
package/dist/activity/queries.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { statSync } from 'node:fs';
|
|
2
2
|
import { getActivityDb, MAX_ACTIVITY_ROWS, pruneIfDue } from './db.js';
|
|
3
3
|
import { getActivityDbPath } from './paths.js';
|
|
4
|
+
import { isActivityFlag, } from './types.js';
|
|
4
5
|
/** Hard ceiling on rows a single read can return, whatever `limit` asks for.
|
|
5
6
|
* The panel pages; nothing needs ten thousand rows in one response, and an
|
|
6
7
|
* unbounded read is how a renderer freezes a browser. */
|
|
@@ -37,6 +38,8 @@ function toRecord(row) {
|
|
|
37
38
|
error: row.error,
|
|
38
39
|
durationMs: row.duration_ms,
|
|
39
40
|
flowId: row.flow_id,
|
|
41
|
+
flag: isActivityFlag(row.flag) ? row.flag : null,
|
|
42
|
+
agentId: row.agent_id,
|
|
40
43
|
};
|
|
41
44
|
}
|
|
42
45
|
/**
|
|
@@ -51,14 +54,19 @@ export function record(input, db) {
|
|
|
51
54
|
try {
|
|
52
55
|
const handle = db ?? getActivityDb();
|
|
53
56
|
const at = new Date().toISOString();
|
|
57
|
+
// The flag column is a closed enum enforced here, not by a CHECK: an
|
|
58
|
+
// unknown value is stored as null rather than as free text.
|
|
59
|
+
const flag = isActivityFlag(input.flag) ? input.flag : null;
|
|
60
|
+
const agentId = truncate(input.agentId ?? null, 200);
|
|
54
61
|
const result = handle
|
|
55
62
|
.prepare(`INSERT INTO activity
|
|
56
63
|
(at, tool, tab_id, transport, url, title, agent, agent_pid,
|
|
57
|
-
selector, payload, outcome, error, duration_ms, flow_id
|
|
58
|
-
|
|
59
|
-
|
|
64
|
+
selector, payload, outcome, error, duration_ms, flow_id,
|
|
65
|
+
flag, agent_id)
|
|
66
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
67
|
+
.run(at, input.tool, input.tabId, input.transport, truncate(input.url), truncate(input.title, 300), input.agent, input.agentPid, truncate(input.selector), truncate(input.payload), input.outcome, truncate(input.error), Math.max(0, Math.round(input.durationMs)), input.flowId, flag, agentId);
|
|
60
68
|
pruneIfDue(handle);
|
|
61
|
-
return { ...input, id: Number(result.lastInsertRowid), at };
|
|
69
|
+
return { ...input, flag, agentId, id: Number(result.lastInsertRowid), at };
|
|
62
70
|
}
|
|
63
71
|
catch {
|
|
64
72
|
return null;
|
|
@@ -98,6 +106,14 @@ function buildFilter(q) {
|
|
|
98
106
|
clauses.push('outcome = ?');
|
|
99
107
|
params.push(q.outcome);
|
|
100
108
|
}
|
|
109
|
+
if (q.flag !== undefined) {
|
|
110
|
+
clauses.push('flag = ?');
|
|
111
|
+
params.push(q.flag);
|
|
112
|
+
}
|
|
113
|
+
if (q.agentId !== undefined) {
|
|
114
|
+
clauses.push('agent_id = ?');
|
|
115
|
+
params.push(q.agentId);
|
|
116
|
+
}
|
|
101
117
|
if (q.since !== undefined) {
|
|
102
118
|
clauses.push('at >= ?');
|
|
103
119
|
params.push(q.since);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/activity/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/activity/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
|
+
import { type ActivityFlag } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The friction report: what went wrong in a stretch of the trail, and for
|
|
5
|
+
* which session, without reading every row.
|
|
6
|
+
*
|
|
7
|
+
* Everything is a GROUP BY over the stored columns (`flag`, `outcome`, `tool`,
|
|
8
|
+
* `selector`, `agent_id`), so the cost is a handful of aggregate queries
|
|
9
|
+
* regardless of how many rows matched. Consumed by `browser.activity`
|
|
10
|
+
* (`summary: true`) and by `browser-link activity report`; the field names
|
|
11
|
+
* are snake_case because the MCP result is the primary consumer.
|
|
12
|
+
*/
|
|
13
|
+
/** Rows the report reads. ANDed; absent means "the whole trail". */
|
|
14
|
+
export interface ActivitySummaryFilters {
|
|
15
|
+
/** Rows at or after this ISO timestamp. */
|
|
16
|
+
since?: string;
|
|
17
|
+
/** Rows with `id` strictly greater than this (same cursor as `query`). */
|
|
18
|
+
sinceId?: number;
|
|
19
|
+
/** Only this session (`agent_id`). */
|
|
20
|
+
agentId?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface FailingTarget {
|
|
23
|
+
selector: string;
|
|
24
|
+
tool: string;
|
|
25
|
+
/** Errored or flagged calls on this selector with this tool. */
|
|
26
|
+
n: number;
|
|
27
|
+
/** Flag of the most recent of those calls (null when it errored unflagged). */
|
|
28
|
+
last_flag: ActivityFlag | null;
|
|
29
|
+
}
|
|
30
|
+
export interface SessionSummary {
|
|
31
|
+
/** IPC session uuid, `'primary'`, or null for rows from before sessions
|
|
32
|
+
* were recorded. */
|
|
33
|
+
agent_id: string | null;
|
|
34
|
+
/** Agent label of the session's most recent row. */
|
|
35
|
+
agent: string | null;
|
|
36
|
+
records: number;
|
|
37
|
+
errors: number;
|
|
38
|
+
flags: Partial<Record<ActivityFlag, number>>;
|
|
39
|
+
}
|
|
40
|
+
export interface ActivitySummary {
|
|
41
|
+
records: number;
|
|
42
|
+
errors: number;
|
|
43
|
+
by_flag: Partial<Record<ActivityFlag, number>>;
|
|
44
|
+
by_tool_errors: Record<string, number>;
|
|
45
|
+
evaluate_calls: number;
|
|
46
|
+
/** Rows flagged `timeout`, `flow-timeout` or `download-timeout`. */
|
|
47
|
+
timeouts: number;
|
|
48
|
+
/** Most failing selector + tool pairs, at most `MAX_FAILING_TARGETS`. */
|
|
49
|
+
top_failing_targets: FailingTarget[];
|
|
50
|
+
/** Most recently active first. */
|
|
51
|
+
sessions: SessionSummary[];
|
|
52
|
+
}
|
|
53
|
+
export declare const MAX_FAILING_TARGETS = 10;
|
|
54
|
+
export declare function summarizeActivity(db?: Database.Database, filters?: ActivitySummaryFilters): ActivitySummary;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getActivityDb } from './db.js';
|
|
2
|
+
import { isActivityFlag } from './types.js';
|
|
3
|
+
export const MAX_FAILING_TARGETS = 10;
|
|
4
|
+
/** Upper bound on sessions listed. A report is read by a person or an agent's
|
|
5
|
+
* context window; a long-lived data dir can hold thousands of sessions. */
|
|
6
|
+
const MAX_SESSIONS = 50;
|
|
7
|
+
const TIMEOUT_FLAGS = ['timeout', 'flow-timeout', 'download-timeout'];
|
|
8
|
+
function buildWhere(filters) {
|
|
9
|
+
const clauses = [];
|
|
10
|
+
const params = [];
|
|
11
|
+
if (filters.sinceId !== undefined) {
|
|
12
|
+
clauses.push('id > ?');
|
|
13
|
+
params.push(filters.sinceId);
|
|
14
|
+
}
|
|
15
|
+
if (filters.since !== undefined) {
|
|
16
|
+
clauses.push('at >= ?');
|
|
17
|
+
params.push(filters.since);
|
|
18
|
+
}
|
|
19
|
+
if (filters.agentId !== undefined) {
|
|
20
|
+
clauses.push('agent_id = ?');
|
|
21
|
+
params.push(filters.agentId);
|
|
22
|
+
}
|
|
23
|
+
return { clauses, params };
|
|
24
|
+
}
|
|
25
|
+
/** `WHERE` for the base filter plus any extra clauses. */
|
|
26
|
+
function where(base, ...extra) {
|
|
27
|
+
const all = [...base, ...extra];
|
|
28
|
+
return all.length > 0 ? `WHERE ${all.join(' AND ')}` : '';
|
|
29
|
+
}
|
|
30
|
+
function flagCounts(rows) {
|
|
31
|
+
const out = {};
|
|
32
|
+
for (const row of rows)
|
|
33
|
+
if (isActivityFlag(row.flag))
|
|
34
|
+
out[row.flag] = row.n;
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
export function summarizeActivity(db = getActivityDb(), filters = {}) {
|
|
38
|
+
const { clauses, params } = buildWhere(filters);
|
|
39
|
+
const totals = db
|
|
40
|
+
.prepare(`SELECT COUNT(*) AS records,
|
|
41
|
+
COALESCE(SUM(outcome = 'error'), 0) AS errors,
|
|
42
|
+
COALESCE(SUM(tool = 'browser.evaluate'), 0) AS evaluate_calls,
|
|
43
|
+
COALESCE(SUM(flag IN (${TIMEOUT_FLAGS.map(() => '?').join(', ')})), 0) AS timeouts
|
|
44
|
+
FROM activity ${where(clauses)}`)
|
|
45
|
+
.get(...TIMEOUT_FLAGS, ...params);
|
|
46
|
+
const byFlag = db
|
|
47
|
+
.prepare(`SELECT flag, COUNT(*) AS n FROM activity ${where(clauses, 'flag IS NOT NULL')}
|
|
48
|
+
GROUP BY flag ORDER BY n DESC, flag ASC`)
|
|
49
|
+
.all(...params);
|
|
50
|
+
const byToolErrors = db
|
|
51
|
+
.prepare(`SELECT tool, COUNT(*) AS n FROM activity ${where(clauses, "outcome = 'error'")}
|
|
52
|
+
GROUP BY tool ORDER BY n DESC, tool ASC`)
|
|
53
|
+
.all(...params);
|
|
54
|
+
// SQLite returns the bare `flag` column from the row that holds MAX(id) —
|
|
55
|
+
// documented behaviour for a single MIN/MAX aggregate — which is exactly
|
|
56
|
+
// "the flag of the most recent failure" without a correlated subquery.
|
|
57
|
+
const targets = db
|
|
58
|
+
.prepare(`SELECT selector, tool, COUNT(*) AS n, MAX(id) AS last_id, flag
|
|
59
|
+
FROM activity
|
|
60
|
+
${where(clauses, 'selector IS NOT NULL', "(outcome = 'error' OR flag IS NOT NULL)")}
|
|
61
|
+
GROUP BY selector, tool ORDER BY n DESC, last_id DESC LIMIT ?`)
|
|
62
|
+
.all(...params, MAX_FAILING_TARGETS);
|
|
63
|
+
const sessions = db
|
|
64
|
+
.prepare(`SELECT agent_id, MAX(id) AS last_id, agent, COUNT(*) AS records,
|
|
65
|
+
COALESCE(SUM(outcome = 'error'), 0) AS errors
|
|
66
|
+
FROM activity ${where(clauses)}
|
|
67
|
+
GROUP BY agent_id ORDER BY last_id DESC LIMIT ?`)
|
|
68
|
+
.all(...params, MAX_SESSIONS);
|
|
69
|
+
const sessionFlags = db
|
|
70
|
+
.prepare(`SELECT agent_id, flag, COUNT(*) AS n FROM activity ${where(clauses, 'flag IS NOT NULL')}
|
|
71
|
+
GROUP BY agent_id, flag ORDER BY n DESC, flag ASC`)
|
|
72
|
+
.all(...params);
|
|
73
|
+
return {
|
|
74
|
+
records: totals.records,
|
|
75
|
+
errors: totals.errors,
|
|
76
|
+
by_flag: flagCounts(byFlag),
|
|
77
|
+
by_tool_errors: Object.fromEntries(byToolErrors.map((r) => [r.tool, r.n])),
|
|
78
|
+
evaluate_calls: totals.evaluate_calls,
|
|
79
|
+
timeouts: totals.timeouts,
|
|
80
|
+
top_failing_targets: targets.map((t) => ({
|
|
81
|
+
selector: t.selector,
|
|
82
|
+
tool: t.tool,
|
|
83
|
+
n: t.n,
|
|
84
|
+
last_flag: isActivityFlag(t.flag) ? t.flag : null,
|
|
85
|
+
})),
|
|
86
|
+
sessions: sessions.map((s) => ({
|
|
87
|
+
agent_id: s.agent_id,
|
|
88
|
+
agent: s.agent,
|
|
89
|
+
records: s.records,
|
|
90
|
+
errors: s.errors,
|
|
91
|
+
flags: flagCounts(sessionFlags.filter((f) => f.agent_id === s.agent_id)),
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/activity/summary.ts"],"names":[],"mappings":"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"}
|
package/dist/activity/types.d.ts
CHANGED
|
@@ -45,6 +45,24 @@ export type ActivityOutcome = 'ok' | 'error';
|
|
|
45
45
|
* tab (`browser.list_tabs`, `browser.my_tabs`), so the column can be read as
|
|
46
46
|
* "how this reached the page" rather than being forced to lie. */
|
|
47
47
|
export type ActivityTransport = 'extension' | 'cdp';
|
|
48
|
+
/**
|
|
49
|
+
* Why a call deserves a second look, beyond its bare `ok`/`error` outcome.
|
|
50
|
+
*
|
|
51
|
+
* Most of these are failures that RESOLVE: a `wait_for` with `matched: false`,
|
|
52
|
+
* a flow that ran out of time, a click whose settle window never went quiet.
|
|
53
|
+
* They come back `ok`, so without this column the trail would record them as
|
|
54
|
+
* successes and the evidence of friction would vanish. The rest name the
|
|
55
|
+
* well-known thrown failures, so a report can count them without regexing
|
|
56
|
+
* error text.
|
|
57
|
+
*
|
|
58
|
+
* Closed on purpose, and enforced in code rather than with a CHECK: `record`
|
|
59
|
+
* stores an unknown value as null so the report never grows a bucket per typo,
|
|
60
|
+
* and growing the list later needs no table rebuild (SQLite cannot alter a
|
|
61
|
+
* CHECK on an existing column).
|
|
62
|
+
*/
|
|
63
|
+
export declare const ACTIVITY_FLAGS: readonly ["retargeted", "ref-stale", "expect-failed", "timeout", "unmatched", "not-found", "multiple-matches", "flow-timeout", "download-timeout", "unsettled", "hit-mismatch"];
|
|
64
|
+
export type ActivityFlag = (typeof ACTIVITY_FLAGS)[number];
|
|
65
|
+
export declare function isActivityFlag(value: unknown): value is ActivityFlag;
|
|
48
66
|
/** One dispatched tool call, as stored. Field order mirrors the table. */
|
|
49
67
|
export interface ActivityRecord {
|
|
50
68
|
/** Monotonic rowid. Also the pagination cursor — see `queries.ts`. */
|
|
@@ -82,6 +100,15 @@ export interface ActivityRecord {
|
|
|
82
100
|
/** Set when this call was a step inside a `browser.flow`, so the window can
|
|
83
101
|
* group a 40-step flow under one heading instead of flooding the timeline. */
|
|
84
102
|
flowId: string | null;
|
|
103
|
+
/** Friction classification (see `ActivityFlag`), or null for a clean call
|
|
104
|
+
* and for every row recorded before the column existed. Optional so a
|
|
105
|
+
* caller built against the previous shape still compiles. */
|
|
106
|
+
flag?: ActivityFlag | null;
|
|
107
|
+
/** The IPC session uuid of the calling agent, or `'primary'` for the stdio
|
|
108
|
+
* agent. Unlike `agent` (a label two runs can share) it tells two sessions
|
|
109
|
+
* apart, which is what the per-session report groups by. Null for rows
|
|
110
|
+
* recorded before the column existed. */
|
|
111
|
+
agentId?: string | null;
|
|
85
112
|
}
|
|
86
113
|
/** What the recorder is handed. `id` and `at` are assigned on write — a
|
|
87
114
|
* caller that could choose its own id could also rewrite history. */
|
|
@@ -101,6 +128,9 @@ export interface ActivityQuery {
|
|
|
101
128
|
tool?: string;
|
|
102
129
|
flowId?: string;
|
|
103
130
|
outcome?: ActivityOutcome;
|
|
131
|
+
flag?: ActivityFlag;
|
|
132
|
+
/** Exact session id (`ActivityRecord.agentId`), not the agent label. */
|
|
133
|
+
agentId?: string;
|
|
104
134
|
/** Rows at or after this ISO timestamp. */
|
|
105
135
|
since?: string;
|
|
106
136
|
/** Hard cap on rows returned. Clamped by the query layer — an unbounded
|
package/dist/activity/types.js
CHANGED
|
@@ -37,5 +37,35 @@
|
|
|
37
37
|
* else is a decision made at export time, once, deliberately — rather
|
|
38
38
|
* than a decision made silently at record time and impossible to undo.
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
/**
|
|
41
|
+
* Why a call deserves a second look, beyond its bare `ok`/`error` outcome.
|
|
42
|
+
*
|
|
43
|
+
* Most of these are failures that RESOLVE: a `wait_for` with `matched: false`,
|
|
44
|
+
* a flow that ran out of time, a click whose settle window never went quiet.
|
|
45
|
+
* They come back `ok`, so without this column the trail would record them as
|
|
46
|
+
* successes and the evidence of friction would vanish. The rest name the
|
|
47
|
+
* well-known thrown failures, so a report can count them without regexing
|
|
48
|
+
* error text.
|
|
49
|
+
*
|
|
50
|
+
* Closed on purpose, and enforced in code rather than with a CHECK: `record`
|
|
51
|
+
* stores an unknown value as null so the report never grows a bucket per typo,
|
|
52
|
+
* and growing the list later needs no table rebuild (SQLite cannot alter a
|
|
53
|
+
* CHECK on an existing column).
|
|
54
|
+
*/
|
|
55
|
+
export const ACTIVITY_FLAGS = [
|
|
56
|
+
'retargeted',
|
|
57
|
+
'ref-stale',
|
|
58
|
+
'expect-failed',
|
|
59
|
+
'timeout',
|
|
60
|
+
'unmatched',
|
|
61
|
+
'not-found',
|
|
62
|
+
'multiple-matches',
|
|
63
|
+
'flow-timeout',
|
|
64
|
+
'download-timeout',
|
|
65
|
+
'unsettled',
|
|
66
|
+
'hit-mismatch',
|
|
67
|
+
];
|
|
68
|
+
export function isActivityFlag(value) {
|
|
69
|
+
return typeof value === 'string' && ACTIVITY_FLAGS.includes(value);
|
|
70
|
+
}
|
|
41
71
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/activity/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/activity/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAYH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,WAAW;IACX,eAAe;IACf,SAAS;IACT,WAAW;IACX,WAAW;IACX,kBAAkB;IAClB,cAAc;IACd,kBAAkB;IAClB,WAAW;IACX,cAAc;CACN,CAAC;AAIX,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC"}
|