@nexface/agent 0.1.4 → 0.1.6
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/dist/agent.d.ts +6 -0
- package/dist/agent.js +450 -73
- package/dist/agent.js.map +1 -1
- package/dist/browser-policy/gpt.d.ts +7 -0
- package/dist/browser-policy/gpt.js +51 -0
- package/dist/browser-policy/gpt.js.map +1 -0
- package/dist/browser-policy/jev.d.ts +7 -0
- package/dist/browser-policy/jev.js +29 -0
- package/dist/browser-policy/jev.js.map +1 -0
- package/dist/browser-policy/response-error.d.ts +1 -0
- package/dist/browser-policy/response-error.js +38 -0
- package/dist/browser-policy/response-error.js.map +1 -0
- package/dist/browser-policy/shared.d.ts +45 -0
- package/dist/browser-policy/shared.js +57 -0
- package/dist/browser-policy/shared.js.map +1 -0
- package/dist/browser-prompt.d.ts +1 -1
- package/dist/browser-prompt.generated.d.ts +1 -1
- package/dist/browser-prompt.generated.js +9 -2
- package/dist/browser-prompt.generated.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/history-compaction.d.ts +7 -3
- package/dist/history-compaction.js +54 -9
- package/dist/history-compaction.js.map +1 -1
- package/dist/history-version.d.ts +4 -0
- package/dist/history-version.js +10 -0
- package/dist/history-version.js.map +1 -0
- package/dist/model/binding.d.ts +1 -0
- package/dist/model/binding.js.map +1 -1
- package/dist/models/39.js +85 -11
- package/dist/page-decision.d.ts +142 -0
- package/dist/page-decision.js +120 -0
- package/dist/page-decision.js.map +1 -0
- package/dist/page-decisions/gpt.d.ts +7 -0
- package/dist/page-decisions/gpt.js +9 -0
- package/dist/page-decisions/gpt.js.map +1 -0
- package/dist/page-decisions/jev.d.ts +7 -0
- package/dist/page-decisions/jev.js +7 -0
- package/dist/page-decisions/jev.js.map +1 -0
- package/dist/page-decisions/shared.d.ts +9 -0
- package/dist/page-decisions/shared.js +29 -0
- package/dist/page-decisions/shared.js.map +1 -0
- package/dist/page-diagnostics.d.ts +1 -0
- package/dist/page-diagnostics.js +10 -0
- package/dist/page-diagnostics.js.map +1 -0
- package/dist/page-observation.d.ts +6 -0
- package/dist/page-observation.js +39 -0
- package/dist/page-observation.js.map +1 -0
- package/dist/request.d.ts +3 -1
- package/dist/request.js +10 -5
- package/dist/request.js.map +1 -1
- package/dist/tool-catalog.d.ts +9 -0
- package/dist/{tool-bridge.js → tool-catalog.js} +24 -84
- package/dist/tool-catalog.js.map +1 -0
- package/package.json +10 -2
- package/dist/tool-bridge.d.ts +0 -36
- package/dist/tool-bridge.js.map +0 -1
package/dist/models/39.js
CHANGED
|
@@ -155,8 +155,24 @@ function lazyApi(load, capabilities) {
|
|
|
155
155
|
return api;
|
|
156
156
|
}
|
|
157
157
|
//# sourceMappingURL=lazy.js.map
|
|
158
|
+
const LEGACY_TOOL_NAMES = new Set([
|
|
159
|
+
"callAppTool",
|
|
160
|
+
"getSnapshot",
|
|
161
|
+
"executeCode",
|
|
162
|
+
"loadSkill",
|
|
163
|
+
"finish",
|
|
164
|
+
"nxf_executeCode"
|
|
165
|
+
]);
|
|
166
|
+
const HISTORY_VERSION_ERROR = "Unsupported Nexface history version. Upgrade client and server together and start a new conversation.";
|
|
167
|
+
function assertCurrentHistory(messages) {
|
|
168
|
+
for (const message of messages){
|
|
169
|
+
if (message.role === "assistant" && message.toolCalls.some((call)=>LEGACY_TOOL_NAMES.has(call.name)) || message.role === "tool" && LEGACY_TOOL_NAMES.has(message.name)) throw new Error(HISTORY_VERSION_ERROR);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
158
173
|
|
|
159
174
|
const AGENT_ERROR_CODES = [
|
|
175
|
+
"EXECUTION_OUTCOME_UNKNOWN",
|
|
160
176
|
"AGENT_RUN_ACTIVE",
|
|
161
177
|
"AGENT_REQUEST_REQUIRES_NEW_AGENT",
|
|
162
178
|
"AGENT_INTERRUPT_PENDING",
|
|
@@ -214,6 +230,44 @@ class AgentModelError extends AgentError {
|
|
|
214
230
|
}
|
|
215
231
|
}
|
|
216
232
|
|
|
233
|
+
const HOST_PAGE_TOOLS = new Set([
|
|
234
|
+
"nxf_getSnapshot",
|
|
235
|
+
"nxf_applyAction",
|
|
236
|
+
"nxf_executeAction"
|
|
237
|
+
]);
|
|
238
|
+
function hideHostPageToolNames(content) {
|
|
239
|
+
return content.replaceAll("nxf_getSnapshot", "internal page observation").replaceAll("nxf_applyAction", "internal page action").replaceAll("nxf_executeAction", "internal page code action");
|
|
240
|
+
}
|
|
241
|
+
function projectPageDelegationHistory(entries) {
|
|
242
|
+
const hiddenCallIds = new Set();
|
|
243
|
+
for (const { message } of entries){
|
|
244
|
+
if (message.role !== "assistant") continue;
|
|
245
|
+
for (const call of message.toolCalls)if (HOST_PAGE_TOOLS.has(call.name)) hiddenCallIds.add(call.id);
|
|
246
|
+
}
|
|
247
|
+
const visible = [];
|
|
248
|
+
for (const entry of entries){
|
|
249
|
+
const { message, index } = entry;
|
|
250
|
+
if (message.role === "assistant") {
|
|
251
|
+
const toolCalls = message.toolCalls.filter((call)=>!HOST_PAGE_TOOLS.has(call.name));
|
|
252
|
+
const removedPageCall = toolCalls.length !== message.toolCalls.length;
|
|
253
|
+
const content = typeof message.content === "string" && index < 0 ? hideHostPageToolNames(message.content) : message.content;
|
|
254
|
+
if (removedPageCall && !toolCalls.length && !content) continue;
|
|
255
|
+
if (removedPageCall || content !== message.content) {
|
|
256
|
+
visible.push({
|
|
257
|
+
message: {
|
|
258
|
+
...message,
|
|
259
|
+
content,
|
|
260
|
+
toolCalls
|
|
261
|
+
},
|
|
262
|
+
index: -1
|
|
263
|
+
});
|
|
264
|
+
} else visible.push(entry);
|
|
265
|
+
} else if (message.role !== "tool" || !hiddenCallIds.has(message.toolCallId) && !HOST_PAGE_TOOLS.has(message.name)) {
|
|
266
|
+
visible.push(entry);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return visible;
|
|
270
|
+
}
|
|
217
271
|
const HISTORY_COMPACTION_TRIGGER_BYTES = (/* unused pure expression or super */ null && (128 * 1024));
|
|
218
272
|
const HISTORY_COMPACTION_MIN_NEW_BYTES = (/* unused pure expression or super */ null && (32 * 1024));
|
|
219
273
|
const HISTORY_COMPACTION_MIN_SAVINGS_BYTES = (/* unused pure expression or super */ null && (16 * 1024));
|
|
@@ -228,6 +282,7 @@ function historyLayout(messages) {
|
|
|
228
282
|
let valid = true;
|
|
229
283
|
let latestUser = -1;
|
|
230
284
|
let latestBrowserBatch;
|
|
285
|
+
let latestDelegationBatch;
|
|
231
286
|
const settle = ()=>{
|
|
232
287
|
if (current) {
|
|
233
288
|
current.complete = valid && pending.size === 0;
|
|
@@ -262,7 +317,8 @@ function historyLayout(messages) {
|
|
|
262
317
|
current.indices.push(index);
|
|
263
318
|
if (pending.get(message.toolCallId) !== message.name) valid = false;
|
|
264
319
|
pending.delete(message.toolCallId);
|
|
265
|
-
if (message.name === "nxf_getSnapshot" || message.name === "nxf_executeAction") latestBrowserBatch = current;
|
|
320
|
+
if (message.name === "nxf_getSnapshot" || message.name === "nxf_executeAction" || message.name === "nxf_applyAction") latestBrowserBatch = current;
|
|
321
|
+
if (message.name === "nxf_delegatePageTask") latestDelegationBatch = current;
|
|
266
322
|
}
|
|
267
323
|
}
|
|
268
324
|
settle();
|
|
@@ -270,10 +326,14 @@ function historyLayout(messages) {
|
|
|
270
326
|
latestUser
|
|
271
327
|
]);
|
|
272
328
|
const recent = batches.filter((batch)=>batch.complete).slice(-RECENT_BATCHES);
|
|
329
|
+
// A page stage updates its original delegation receipt after internal steps finish.
|
|
273
330
|
for (const batch of [
|
|
274
331
|
...recent,
|
|
275
332
|
...latestBrowserBatch ? [
|
|
276
333
|
latestBrowserBatch
|
|
334
|
+
] : [],
|
|
335
|
+
...latestDelegationBatch ? [
|
|
336
|
+
latestDelegationBatch
|
|
277
337
|
] : []
|
|
278
338
|
]){
|
|
279
339
|
for (const index of batch.indices)protectedIndices.add(index);
|
|
@@ -340,7 +400,7 @@ function validateCompactionAttempt(value, messages, summary) {
|
|
|
340
400
|
}
|
|
341
401
|
return value;
|
|
342
402
|
}
|
|
343
|
-
function selectModelHistory(messages, summary) {
|
|
403
|
+
function selectModelHistory(messages, summary, options) {
|
|
344
404
|
const layout = historyLayout(messages);
|
|
345
405
|
const boundary = summary ? boundaryIndex(messages, summary.beforeMessageId, layout) : 0;
|
|
346
406
|
const contextIndex = latestContextIndex(messages);
|
|
@@ -361,15 +421,15 @@ function selectModelHistory(messages, summary) {
|
|
|
361
421
|
index
|
|
362
422
|
});
|
|
363
423
|
}
|
|
364
|
-
return entries;
|
|
424
|
+
return options?.pageDelegation ? projectPageDelegationHistory(entries) : entries;
|
|
365
425
|
}
|
|
366
426
|
function serializedBytes(messages) {
|
|
367
427
|
return encoder.encode(JSON.stringify(messages)).byteLength;
|
|
368
428
|
}
|
|
369
|
-
function modelHistoryBytes(messages, summary) {
|
|
370
|
-
return serializedBytes(selectModelHistory(messages, summary).map((entry)=>entry.message));
|
|
429
|
+
function modelHistoryBytes(messages, summary, options) {
|
|
430
|
+
return serializedBytes(selectModelHistory(messages, summary, options).map((entry)=>entry.message));
|
|
371
431
|
}
|
|
372
|
-
function getHistoryCompactionInput(messages, previous, attemptBeforeMessageId) {
|
|
432
|
+
function getHistoryCompactionInput(messages, previous, attemptBeforeMessageId, options) {
|
|
373
433
|
const layout = historyLayout(messages);
|
|
374
434
|
// A pending or malformed tool batch must be settled before choosing any new cut.
|
|
375
435
|
if (layout.unsafeIndices.length || layout.batches.length <= RECENT_BATCHES) return undefined;
|
|
@@ -377,9 +437,13 @@ function getHistoryCompactionInput(messages, previous, attemptBeforeMessageId) {
|
|
|
377
437
|
const beforeMessageId = messages[boundary].id;
|
|
378
438
|
const start = previous ? boundaryIndex(messages, previous.beforeMessageId, layout) : 0;
|
|
379
439
|
const attemptStart = attemptBeforeMessageId ? boundaryIndex(messages, attemptBeforeMessageId, layout) : start;
|
|
380
|
-
if (!beforeMessageId || boundary <= Math.max(start, attemptStart) || modelHistoryBytes(messages, previous) <= HISTORY_COMPACTION_TRIGGER_BYTES) return undefined;
|
|
440
|
+
if (!beforeMessageId || boundary <= Math.max(start, attemptStart) || modelHistoryBytes(messages, previous, options) <= HISTORY_COMPACTION_TRIGGER_BYTES) return undefined;
|
|
381
441
|
const removable = messages.slice(attemptStart, boundary).filter((message, offset)=>message.role !== "system" && message.role !== "application_context" && !layout.protectedIndices.has(offset + attemptStart));
|
|
382
|
-
|
|
442
|
+
const visibleRemovable = options?.pageDelegation ? projectPageDelegationHistory(removable.map((message, index)=>({
|
|
443
|
+
message,
|
|
444
|
+
index
|
|
445
|
+
}))).map(({ message })=>message) : removable;
|
|
446
|
+
if (serializedBytes(visibleRemovable) < HISTORY_COMPACTION_MIN_NEW_BYTES) return undefined;
|
|
383
447
|
const prefix = previous ? [
|
|
384
448
|
summaryMessage(previous, messages, start)
|
|
385
449
|
] : [];
|
|
@@ -452,12 +516,14 @@ function toolIsError(content) {
|
|
|
452
516
|
return false;
|
|
453
517
|
}
|
|
454
518
|
}
|
|
455
|
-
function createPiContext(messages, tools, model, replay, historySummary) {
|
|
519
|
+
function createPiContext(messages, tools, model, replay, historySummary, pageDelegationHistory = false) {
|
|
456
520
|
// pi-ai exposes one trusted systemPrompt rather than chronological system messages.
|
|
457
521
|
// Keep canonical checkpoints append-only, then consolidate them in their original order.
|
|
458
522
|
const system = [];
|
|
459
523
|
const piMessages = [];
|
|
460
|
-
selectModelHistory(messages, historySummary
|
|
524
|
+
selectModelHistory(messages, historySummary, {
|
|
525
|
+
pageDelegation: pageDelegationHistory
|
|
526
|
+
}).forEach(({ message, index })=>{
|
|
461
527
|
if (message.role === "system" || message.role === "application_context") {
|
|
462
528
|
system.push(message.content);
|
|
463
529
|
return;
|
|
@@ -535,6 +601,7 @@ function fromPiAssistant(message) {
|
|
|
535
601
|
|
|
536
602
|
|
|
537
603
|
|
|
604
|
+
|
|
538
605
|
const DEFAULT_CAPABILITIES = {
|
|
539
606
|
reasoning: false,
|
|
540
607
|
input: [
|
|
@@ -686,6 +753,13 @@ class PiModelBinding {
|
|
|
686
753
|
const raw = entry?.message;
|
|
687
754
|
if (canonical?.role !== "assistant" || raw?.role !== "assistant" || !Array.isArray(raw.content)) throw new Error("Invalid replay message association.");
|
|
688
755
|
const converted = fromPiAssistant(raw);
|
|
756
|
+
assertCurrentHistory([
|
|
757
|
+
{
|
|
758
|
+
role: "assistant",
|
|
759
|
+
content: converted.content,
|
|
760
|
+
toolCalls: converted.toolCalls
|
|
761
|
+
}
|
|
762
|
+
]);
|
|
689
763
|
const finish = converted.toolCalls.length === 1 && converted.toolCalls[0]?.name === "nxf_finish" ? JSON.parse(converted.toolCalls[0].arguments) : undefined;
|
|
690
764
|
const expectedContent = finish?.status === "completed" && typeof finish.output === "string" ? finish.output.trim() : converted.content;
|
|
691
765
|
if (JSON.stringify(converted.toolCalls) !== JSON.stringify(canonical.toolCalls) || expectedContent !== canonical.content) throw new Error("Replay does not match its assistant message.");
|
|
@@ -693,7 +767,7 @@ class PiModelBinding {
|
|
|
693
767
|
}
|
|
694
768
|
}
|
|
695
769
|
async complete(request) {
|
|
696
|
-
const raw = await consumeStream(this.#stream.streamSimple(this.#model, createPiContext(request.messages, request.tools, this.#model, this.#replay, request.historySummary), {
|
|
770
|
+
const raw = await consumeStream(this.#stream.streamSimple(this.#model, createPiContext(request.messages, request.tools, this.#model, this.#replay, request.historySummary, request.pageDelegationHistory), {
|
|
697
771
|
...this.#options,
|
|
698
772
|
signal: request.signal,
|
|
699
773
|
sessionId: request.agentId
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
declare const pageDecisionConfigBrand: unique symbol;
|
|
2
|
+
export interface PageDecisionConfig {
|
|
3
|
+
readonly [pageDecisionConfigBrand]: true;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @experimental Page decisions may change in future releases.
|
|
7
|
+
* @beta
|
|
8
|
+
*/
|
|
9
|
+
export interface PageDecisionModel {
|
|
10
|
+
decide(input: PageDecisionInput): Promise<PageDecisionResult>;
|
|
11
|
+
}
|
|
12
|
+
/** @experimental @beta */
|
|
13
|
+
export interface PageDecisionInput {
|
|
14
|
+
goal: string;
|
|
15
|
+
observation: PageDecisionObservation;
|
|
16
|
+
recentActions: readonly Readonly<PageDecisionRecentAction>[];
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
}
|
|
19
|
+
/** @experimental @beta */
|
|
20
|
+
export type PageDecisionResult = {
|
|
21
|
+
status: "action";
|
|
22
|
+
actionId: string;
|
|
23
|
+
usage?: PageDecisionUsage;
|
|
24
|
+
} | {
|
|
25
|
+
status: "done";
|
|
26
|
+
usage?: PageDecisionUsage;
|
|
27
|
+
} | {
|
|
28
|
+
status: "blocked";
|
|
29
|
+
reason?: string;
|
|
30
|
+
usage?: PageDecisionUsage;
|
|
31
|
+
};
|
|
32
|
+
export interface PageTaskState {
|
|
33
|
+
goal: string;
|
|
34
|
+
stages?: PageTaskStage[];
|
|
35
|
+
}
|
|
36
|
+
export interface PageTaskStage {
|
|
37
|
+
goal: string;
|
|
38
|
+
}
|
|
39
|
+
export interface CompletedPageStage {
|
|
40
|
+
stageIndex: number;
|
|
41
|
+
lastObservedUrl: string;
|
|
42
|
+
lastObservedPage: {
|
|
43
|
+
url: string;
|
|
44
|
+
title: string;
|
|
45
|
+
content: string;
|
|
46
|
+
truncated: boolean;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** @experimental @beta */
|
|
50
|
+
export interface PageDecisionUsage {
|
|
51
|
+
inputTokens?: number;
|
|
52
|
+
outputTokens?: number;
|
|
53
|
+
}
|
|
54
|
+
/** @experimental @beta */
|
|
55
|
+
export interface PageDecisionCandidate {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly operation: "click" | "fill" | "check" | "uncheck" | "select" | "scrollUp" | "scrollDown" | "wait";
|
|
58
|
+
readonly ref?: string;
|
|
59
|
+
readonly role: string;
|
|
60
|
+
readonly label: string;
|
|
61
|
+
readonly option?: string;
|
|
62
|
+
readonly state: {
|
|
63
|
+
readonly checked?: boolean;
|
|
64
|
+
readonly disabled?: boolean;
|
|
65
|
+
readonly expanded?: boolean;
|
|
66
|
+
readonly focused?: boolean;
|
|
67
|
+
readonly invalid?: boolean;
|
|
68
|
+
readonly required?: boolean;
|
|
69
|
+
readonly selected?: boolean;
|
|
70
|
+
readonly selectedOption?: string;
|
|
71
|
+
readonly multiple?: boolean;
|
|
72
|
+
readonly selectedOptions?: readonly {
|
|
73
|
+
readonly value: string;
|
|
74
|
+
readonly label: string;
|
|
75
|
+
}[];
|
|
76
|
+
readonly value?: string;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** @experimental @beta */
|
|
80
|
+
export interface PageDecisionObservation {
|
|
81
|
+
readonly snapshotId: string;
|
|
82
|
+
readonly url: string;
|
|
83
|
+
readonly title: string;
|
|
84
|
+
readonly content: string;
|
|
85
|
+
readonly truncated: boolean;
|
|
86
|
+
readonly actions: readonly PageDecisionCandidate[];
|
|
87
|
+
}
|
|
88
|
+
export declare function readPageDecisionUsage(value: unknown): PageDecisionUsage | undefined;
|
|
89
|
+
export declare function validatePageDecisionObservation(value: unknown): PageDecisionObservation;
|
|
90
|
+
export declare function definePageDecision(model: PageDecisionModel): PageDecisionConfig;
|
|
91
|
+
export declare function resolvePageDecision(config: PageDecisionConfig): PageDecisionModel;
|
|
92
|
+
export declare function validatePageDecisionResult(value: unknown, observation: PageDecisionObservation): {
|
|
93
|
+
reason?: string;
|
|
94
|
+
status: "done" | "blocked";
|
|
95
|
+
usage: PageDecisionUsage | undefined;
|
|
96
|
+
action?: never;
|
|
97
|
+
} | {
|
|
98
|
+
status: undefined;
|
|
99
|
+
reason: undefined;
|
|
100
|
+
action: PageDecisionCandidate;
|
|
101
|
+
usage: PageDecisionUsage | undefined;
|
|
102
|
+
};
|
|
103
|
+
export declare function validatePageTask(value: unknown): PageTaskState;
|
|
104
|
+
/** @experimental @beta */
|
|
105
|
+
export interface PageDecisionRecentAction {
|
|
106
|
+
actionId: string;
|
|
107
|
+
operation: string;
|
|
108
|
+
label: string;
|
|
109
|
+
text?: string;
|
|
110
|
+
fromUrl?: string;
|
|
111
|
+
toUrl?: string;
|
|
112
|
+
outcome: "executed" | "failed" | "unknown";
|
|
113
|
+
observationChanged?: boolean;
|
|
114
|
+
}
|
|
115
|
+
export interface PageTransition {
|
|
116
|
+
from: string;
|
|
117
|
+
to: string;
|
|
118
|
+
operation: string;
|
|
119
|
+
label: string;
|
|
120
|
+
}
|
|
121
|
+
export interface PageActionReceipt {
|
|
122
|
+
operation: string;
|
|
123
|
+
label: string;
|
|
124
|
+
outcome: "executed" | "partial" | "failed" | "unknown";
|
|
125
|
+
fromUrl?: string;
|
|
126
|
+
toUrl?: string;
|
|
127
|
+
text?: string;
|
|
128
|
+
completedActions: number;
|
|
129
|
+
errorCode?: string;
|
|
130
|
+
}
|
|
131
|
+
export interface PageTaskProgress extends PageTaskState {
|
|
132
|
+
stage: "observe" | "decide";
|
|
133
|
+
stageIndex?: number;
|
|
134
|
+
completedStages?: CompletedPageStage[];
|
|
135
|
+
blockedRecheckUsed?: boolean;
|
|
136
|
+
recentActions: PageDecisionRecentAction[];
|
|
137
|
+
actionHistory?: PageActionReceipt[];
|
|
138
|
+
actionHistoryTruncated?: boolean;
|
|
139
|
+
transitions?: PageTransition[];
|
|
140
|
+
}
|
|
141
|
+
export declare function validatePageProgress(value: unknown): PageTaskProgress;
|
|
142
|
+
export {};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export function readPageDecisionUsage(value) {
|
|
2
|
+
if (!value || typeof value !== "object")
|
|
3
|
+
return;
|
|
4
|
+
const raw = value;
|
|
5
|
+
const usage = {};
|
|
6
|
+
for (const [key, source] of [["inputTokens", raw.input_tokens ?? raw.prompt_tokens], ["outputTokens", raw.output_tokens ?? raw.completion_tokens]]) {
|
|
7
|
+
if (typeof source === "number" && Number.isSafeInteger(source) && source >= 0)
|
|
8
|
+
usage[key] = source;
|
|
9
|
+
}
|
|
10
|
+
return Object.keys(usage).length ? usage : undefined;
|
|
11
|
+
}
|
|
12
|
+
const OPERATIONS = new Set(["click", "fill", "check", "uncheck", "select", "scrollUp", "scrollDown", "wait"]);
|
|
13
|
+
export function validatePageDecisionObservation(value) {
|
|
14
|
+
const page = value;
|
|
15
|
+
if (!page || typeof page !== "object" || typeof page.snapshotId !== "string" || !page.snapshotId
|
|
16
|
+
|| typeof page.url !== "string" || typeof page.title !== "string" || typeof page.content !== "string"
|
|
17
|
+
|| typeof page.truncated !== "boolean" || !Array.isArray(page.actions) || page.actions.length > 250 || page.content.length > 100_000)
|
|
18
|
+
throw new Error("Invalid actions observation.");
|
|
19
|
+
const ids = new Set();
|
|
20
|
+
for (const action of page.actions) {
|
|
21
|
+
if (!action || typeof action.id !== "string" || !action.id || ids.has(action.id) || !OPERATIONS.has(action.operation)
|
|
22
|
+
|| typeof action.label !== "string" || typeof action.role !== "string" || !action.state || typeof action.state !== "object")
|
|
23
|
+
throw new Error("Invalid action candidate.");
|
|
24
|
+
ids.add(action.id);
|
|
25
|
+
}
|
|
26
|
+
return page;
|
|
27
|
+
}
|
|
28
|
+
const models = new WeakMap();
|
|
29
|
+
export function definePageDecision(model) {
|
|
30
|
+
const config = Object.freeze({});
|
|
31
|
+
models.set(config, model);
|
|
32
|
+
return config;
|
|
33
|
+
}
|
|
34
|
+
export function resolvePageDecision(config) {
|
|
35
|
+
const model = config && typeof config === "object" ? models.get(config) : undefined;
|
|
36
|
+
if (!model)
|
|
37
|
+
throw new Error("pageDecision must be created by createJevPageDecision or createGptPageDecision.");
|
|
38
|
+
return model;
|
|
39
|
+
}
|
|
40
|
+
export function validatePageDecisionResult(value, observation) {
|
|
41
|
+
const result = value;
|
|
42
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
43
|
+
throw new Error("Invalid page decision result.");
|
|
44
|
+
if (result.usage !== undefined && (!result.usage || typeof result.usage !== "object" || Array.isArray(result.usage)
|
|
45
|
+
|| Object.entries(result.usage).some(([key, value]) => !["inputTokens", "outputTokens"].includes(key) || typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)))
|
|
46
|
+
throw new Error("Invalid page decision usage.");
|
|
47
|
+
if (result.status === "done" || result.status === "blocked") {
|
|
48
|
+
if ("actionId" in result)
|
|
49
|
+
throw new Error("Invalid page decision result.");
|
|
50
|
+
if (result.status === "blocked" && result.reason !== undefined && (typeof result.reason !== "string" || result.reason.length > 2000))
|
|
51
|
+
throw new Error("Invalid page decision reason.");
|
|
52
|
+
return { status: result.status, usage: result.usage, ...(result.status === "blocked" && result.reason !== undefined ? { reason: result.reason } : {}) };
|
|
53
|
+
}
|
|
54
|
+
if (result.status !== "action" || typeof result.actionId !== "string")
|
|
55
|
+
throw new Error("Invalid page decision result.");
|
|
56
|
+
const action = observation.actions?.find((candidate) => candidate.id === result.actionId);
|
|
57
|
+
if (!action)
|
|
58
|
+
throw new Error("Page decision selected an unobserved action.");
|
|
59
|
+
return { status: undefined, reason: undefined, action, usage: result.usage };
|
|
60
|
+
}
|
|
61
|
+
export function validatePageTask(value) {
|
|
62
|
+
const task = value;
|
|
63
|
+
const validStage = (stage, maxLength) => stage && typeof stage === "object" && !Array.isArray(stage)
|
|
64
|
+
&& Object.keys(stage).every((key) => key === "goal")
|
|
65
|
+
&& typeof stage.goal === "string" && stage.goal.trim() && stage.goal.length <= maxLength;
|
|
66
|
+
if (!task || typeof task !== "object" || Array.isArray(task) || Object.keys(task).some((key) => !["goal", "stages"].includes(key))
|
|
67
|
+
|| !validStage({ goal: task.goal }, 8000)
|
|
68
|
+
|| (task.stages !== undefined && (!Array.isArray(task.stages) || task.stages.length < 1 || task.stages.length > 8 || !task.stages.every((stage) => validStage(stage, 2000))))) {
|
|
69
|
+
throw new Error("Invalid page task state.");
|
|
70
|
+
}
|
|
71
|
+
return { goal: task.goal, ...(task.stages ? { stages: structuredClone(task.stages) } : {}) };
|
|
72
|
+
}
|
|
73
|
+
export function validatePageProgress(value) {
|
|
74
|
+
const progress = value;
|
|
75
|
+
const stageCount = progress?.stages?.length ?? 1;
|
|
76
|
+
const validCompletedStages = progress?.completedStages === undefined || (Array.isArray(progress.completedStages)
|
|
77
|
+
&& progress.completedStages.length <= 8
|
|
78
|
+
&& progress.completedStages.every((item, index) => item && typeof item === "object" && !Array.isArray(item)
|
|
79
|
+
&& Object.keys(item).every((key) => ["stageIndex", "lastObservedUrl", "lastObservedPage"].includes(key))
|
|
80
|
+
&& item.stageIndex === index && item.stageIndex < stageCount
|
|
81
|
+
&& typeof item.lastObservedUrl === "string" && item.lastObservedUrl.length <= 2000
|
|
82
|
+
&& item.lastObservedPage && typeof item.lastObservedPage === "object" && !Array.isArray(item.lastObservedPage)
|
|
83
|
+
&& Object.keys(item.lastObservedPage).every((key) => ["url", "title", "content", "truncated"].includes(key))
|
|
84
|
+
&& typeof item.lastObservedPage.url === "string" && item.lastObservedPage.url.length <= 2000
|
|
85
|
+
&& typeof item.lastObservedPage.title === "string" && item.lastObservedPage.title.length <= 2000
|
|
86
|
+
&& typeof item.lastObservedPage.content === "string" && item.lastObservedPage.content.length <= 2000
|
|
87
|
+
&& typeof item.lastObservedPage.truncated === "boolean"));
|
|
88
|
+
const validTransitions = progress?.transitions === undefined || (Array.isArray(progress.transitions)
|
|
89
|
+
&& progress.transitions.length <= 24 && progress.transitions.every((transition) => transition
|
|
90
|
+
&& Object.keys(transition).length === 4 && ["from", "to", "operation", "label"].every((key) => typeof transition[key] === "string" && transition[key].length <= 200)));
|
|
91
|
+
const validHistory = progress?.actionHistory === undefined || (Array.isArray(progress.actionHistory)
|
|
92
|
+
&& progress.actionHistory.length <= 64
|
|
93
|
+
&& progress.actionHistory.every((action) => action && typeof action === "object"
|
|
94
|
+
&& Object.keys(action).every((key) => ["operation", "label", "outcome", "fromUrl", "toUrl", "text", "completedActions", "errorCode"].includes(key))
|
|
95
|
+
&& typeof action.operation === "string" && action.operation.length <= 100
|
|
96
|
+
&& typeof action.label === "string" && action.label.length <= 200
|
|
97
|
+
&& ["executed", "partial", "failed", "unknown"].includes(action.outcome)
|
|
98
|
+
&& Number.isInteger(action.completedActions) && action.completedActions >= 0 && action.completedActions <= 30
|
|
99
|
+
&& (action.text === undefined || (typeof action.text === "string" && action.text.length <= 200))
|
|
100
|
+
&& (action.errorCode === undefined || (typeof action.errorCode === "string" && action.errorCode.length <= 100))
|
|
101
|
+
&& [action.fromUrl, action.toUrl].every((url) => url === undefined || (typeof url === "string" && url.length <= 2000))));
|
|
102
|
+
if (!progress || Object.keys(progress).some((key) => !["goal", "stages", "stageIndex", "completedStages", "stage", "recentActions", "blockedRecheckUsed", "actionHistory", "actionHistoryTruncated", "transitions"].includes(key))
|
|
103
|
+
|| !Number.isInteger(progress.stageIndex ?? 0) || (progress.stageIndex ?? 0) < 0 || (progress.stageIndex ?? 0) >= stageCount
|
|
104
|
+
|| !validCompletedStages || (progress.completedStages?.length ?? 0) !== (progress.stageIndex ?? 0)
|
|
105
|
+
|| (progress.blockedRecheckUsed !== undefined && typeof progress.blockedRecheckUsed !== "boolean")
|
|
106
|
+
|| (progress.actionHistoryTruncated !== undefined && typeof progress.actionHistoryTruncated !== "boolean")
|
|
107
|
+
|| !["observe", "decide"].includes(progress.stage) || !Array.isArray(progress.recentActions) || progress.recentActions.length > 6
|
|
108
|
+
|| !validHistory || !validTransitions
|
|
109
|
+
|| progress.recentActions.some((action) => !action || Object.keys(action).some((key) => !["actionId", "operation", "label", "text", "outcome", "fromUrl", "toUrl", "observationChanged"].includes(key))
|
|
110
|
+
|| [action.actionId, action.operation, action.label].some((v) => typeof v !== "string" || v.length > 2000)
|
|
111
|
+
|| (action.text !== undefined && (typeof action.text !== "string" || action.text.length > 2000))
|
|
112
|
+
|| (action.observationChanged !== undefined && typeof action.observationChanged !== "boolean")
|
|
113
|
+
|| [action.fromUrl, action.toUrl].some((url) => url !== undefined && (typeof url !== "string" || url.length > 16000))
|
|
114
|
+
|| !["executed", "failed", "unknown"].includes(action.outcome)))
|
|
115
|
+
throw new Error("Invalid page progress.");
|
|
116
|
+
if (progress.recentActions.some((action) => action.outcome === "unknown") || progress.actionHistory?.some((action) => action.outcome === "unknown"))
|
|
117
|
+
throw new Error("Cannot resume an unknown page outcome.");
|
|
118
|
+
return { ...validatePageTask({ goal: progress.goal, ...(progress.stages ? { stages: progress.stages } : {}) }), stage: progress.stage, ...(progress.stageIndex === undefined ? {} : { stageIndex: progress.stageIndex }), ...(progress.completedStages === undefined ? {} : { completedStages: structuredClone(progress.completedStages) }), ...(progress.blockedRecheckUsed === undefined ? {} : { blockedRecheckUsed: progress.blockedRecheckUsed }), recentActions: structuredClone(progress.recentActions), ...(progress.actionHistory === undefined ? {} : { actionHistory: structuredClone(progress.actionHistory) }), ...(progress.actionHistoryTruncated === undefined ? {} : { actionHistoryTruncated: progress.actionHistoryTruncated }), ...(progress.transitions === undefined ? {} : { transitions: structuredClone(progress.transitions) }) };
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=page-decision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-decision.js","sourceRoot":"","sources":["../src/page-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { decidePage } from "../browser-policy/gpt.js";
|
|
2
|
+
import { createHttpPageDecision } from "./shared.js";
|
|
3
|
+
/** @experimental @beta */
|
|
4
|
+
export function createGptPageDecision(options) {
|
|
5
|
+
if (options?.model !== undefined && options.model !== "gpt-6-luna")
|
|
6
|
+
throw new Error("GPT page decisions require model gpt-6-luna; configure channel aliases on the server.");
|
|
7
|
+
return createHttpPageDecision(options, decidePage);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=gpt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gpt.js","sourceRoot":"","sources":["../../src/page-decisions/gpt.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,0BAA0B;AAC1B,MAAM,UAAU,qBAAqB,CAAC,OAIrC;IACC,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC7K,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { decidePage } from "../browser-policy/jev.js";
|
|
2
|
+
import { createHttpPageDecision } from "./shared.js";
|
|
3
|
+
/** @experimental @beta */
|
|
4
|
+
export function createJevPageDecision(options) {
|
|
5
|
+
return createHttpPageDecision(options, decidePage);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=jev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/page-decisions/jev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,0BAA0B;AAC1B,MAAM,UAAU,qBAAqB,CAAC,OAIrC;IACC,OAAO,sBAAsB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type PageDecisionConfig, type PageDecisionObservation, type PageTaskStage } from "../page-decision.js";
|
|
2
|
+
import type { selectPageDecision } from "../browser-policy/shared.js";
|
|
3
|
+
/** @experimental @beta */
|
|
4
|
+
export interface PageDecisionHttpOptions {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export declare function createHttpPageDecision(options: PageDecisionHttpOptions, decide: (options: PageDecisionHttpOptions, task: PageTaskStage, observation: PageDecisionObservation, recentActions: unknown[], signal: AbortSignal) => Promise<ReturnType<typeof selectPageDecision>>): PageDecisionConfig;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { definePageDecision, readPageDecisionUsage } from "../page-decision.js";
|
|
2
|
+
export function createHttpPageDecision(options, decide) {
|
|
3
|
+
if (!options || typeof options !== "object" || typeof options.endpoint !== "string" || !options.endpoint.trim()
|
|
4
|
+
|| Object.keys(options).some((key) => !["endpoint", "model", "headers"].includes(key))
|
|
5
|
+
|| (options.model !== undefined && (typeof options.model !== "string" || !options.model.trim()))
|
|
6
|
+
|| (options.headers !== undefined && (!options.headers || typeof options.headers !== "object" || Array.isArray(options.headers) || Object.values(options.headers).some((v) => typeof v !== "string")))) {
|
|
7
|
+
throw new Error("Invalid page decision HTTP options.");
|
|
8
|
+
}
|
|
9
|
+
let endpoint;
|
|
10
|
+
try {
|
|
11
|
+
endpoint = new URL(options.endpoint, globalThis.location?.origin);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
throw new Error("Page decision endpoint must be an HTTP URL (or a relative URL in a browser).");
|
|
15
|
+
}
|
|
16
|
+
if (!["http:", "https:"].includes(endpoint.protocol) || endpoint.username || endpoint.password || endpoint.hash)
|
|
17
|
+
throw new Error("Invalid page decision endpoint.");
|
|
18
|
+
const config = Object.freeze({ ...options, endpoint: endpoint.href, ...(options.headers ? { headers: Object.freeze({ ...options.headers }) } : {}) });
|
|
19
|
+
return definePageDecision({
|
|
20
|
+
async decide({ goal, observation, recentActions, signal }) {
|
|
21
|
+
const result = await decide(config, { goal }, observation, [...recentActions], signal);
|
|
22
|
+
const usage = readPageDecisionUsage(result.usage);
|
|
23
|
+
return result.status
|
|
24
|
+
? { status: result.status, ...(usage === undefined ? {} : { usage }) }
|
|
25
|
+
: { status: "action", actionId: result.action.id, ...(usage === undefined ? {} : { usage }) };
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/page-decisions/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function recordPageDiagnostic(kind: string, detail?: Record<string, unknown>): void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Internal User Timing entries contain decisions, never task text or credentials.
|
|
2
|
+
export function recordPageDiagnostic(kind, detail = {}) {
|
|
3
|
+
try {
|
|
4
|
+
const now = performance.now();
|
|
5
|
+
performance.measure("nexface.page.event", { start: now, end: now, detail: { kind, ...detail } });
|
|
6
|
+
performance.clearMeasures("nexface.page.event");
|
|
7
|
+
}
|
|
8
|
+
catch { /* Diagnostics must never interrupt a Run. */ }
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=page-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-diagnostics.js","sourceRoot":"","sources":["../src/page-diagnostics.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,SAAkC,EAAE;IACrF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,WAAW,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;QACjG,WAAW,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC,CAAC,6CAA6C,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PageSnapshot } from "@nexface/tools/internal";
|
|
2
|
+
import type { PageActionReceipt } from "./page-decision.js";
|
|
3
|
+
export declare function pageFingerprint(page: PageSnapshot): string;
|
|
4
|
+
export declare function isPendingPage(page: PageSnapshot): boolean;
|
|
5
|
+
export declare function isNavigationLoadingPage(page: PageSnapshot): boolean;
|
|
6
|
+
export declare function navigationLoadingWaits(history: readonly PageActionReceipt[], url: string): number | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export function pageFingerprint(page) {
|
|
2
|
+
const text = `${page.url}\n${page.content.replaceAll(/\[ref=@\d+\]/g, "[ref]").replaceAll(" [focused]", "")}`;
|
|
3
|
+
let first = 0x811c9dc5;
|
|
4
|
+
let second = 5381;
|
|
5
|
+
for (let index = 0; index < text.length; index++) {
|
|
6
|
+
const code = text.charCodeAt(index);
|
|
7
|
+
first = Math.imul(first ^ code, 0x01000193);
|
|
8
|
+
second = Math.imul(second, 33) ^ code;
|
|
9
|
+
}
|
|
10
|
+
return `${text.length}:${(first >>> 0).toString(16)}:${(second >>> 0).toString(16)}`;
|
|
11
|
+
}
|
|
12
|
+
export function isPendingPage(page) {
|
|
13
|
+
if (!page.actions?.some((action) => action.operation === "wait"))
|
|
14
|
+
return false;
|
|
15
|
+
if (page.actions.every((action) => action.operation === "wait"))
|
|
16
|
+
return true;
|
|
17
|
+
return /(?:^|\n)\s*- status(?:\s|$)/m.test(page.content)
|
|
18
|
+
&& page.actions.every((action) => action.operation === "wait" || (action.operation === "click" && action.role === "link"));
|
|
19
|
+
}
|
|
20
|
+
export function isNavigationLoadingPage(page) {
|
|
21
|
+
return isPendingPage(page) && /(?:^|\n)\s*- status(?:\s|$)/m.test(page.content);
|
|
22
|
+
}
|
|
23
|
+
export function navigationLoadingWaits(history, url) {
|
|
24
|
+
let index = history.length - 1;
|
|
25
|
+
let waits = 0;
|
|
26
|
+
while (index >= 0) {
|
|
27
|
+
const action = history[index];
|
|
28
|
+
if (action.operation !== "wait" || action.outcome !== "executed" || action.fromUrl !== url || action.toUrl !== url)
|
|
29
|
+
break;
|
|
30
|
+
waits++;
|
|
31
|
+
index--;
|
|
32
|
+
}
|
|
33
|
+
const navigation = history[index];
|
|
34
|
+
if (navigation?.operation !== "click" || navigation.outcome !== "executed"
|
|
35
|
+
|| !navigation.fromUrl || navigation.fromUrl === url || navigation.toUrl !== url)
|
|
36
|
+
return undefined;
|
|
37
|
+
return waits;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=page-observation.js.map
|