@nexface/agent 0.1.5 → 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.
Files changed (58) hide show
  1. package/dist/agent.d.ts +6 -0
  2. package/dist/agent.js +450 -73
  3. package/dist/agent.js.map +1 -1
  4. package/dist/browser-policy/gpt.d.ts +7 -0
  5. package/dist/browser-policy/gpt.js +51 -0
  6. package/dist/browser-policy/gpt.js.map +1 -0
  7. package/dist/browser-policy/jev.d.ts +7 -0
  8. package/dist/browser-policy/jev.js +29 -0
  9. package/dist/browser-policy/jev.js.map +1 -0
  10. package/dist/browser-policy/response-error.d.ts +1 -0
  11. package/dist/browser-policy/response-error.js +38 -0
  12. package/dist/browser-policy/response-error.js.map +1 -0
  13. package/dist/browser-policy/shared.d.ts +45 -0
  14. package/dist/browser-policy/shared.js +57 -0
  15. package/dist/browser-policy/shared.js.map +1 -0
  16. package/dist/browser-prompt.d.ts +1 -1
  17. package/dist/browser-prompt.generated.d.ts +1 -1
  18. package/dist/browser-prompt.generated.js +9 -2
  19. package/dist/browser-prompt.generated.js.map +1 -1
  20. package/dist/errors.d.ts +1 -1
  21. package/dist/errors.js +1 -0
  22. package/dist/errors.js.map +1 -1
  23. package/dist/history-compaction.d.ts +7 -3
  24. package/dist/history-compaction.js +54 -9
  25. package/dist/history-compaction.js.map +1 -1
  26. package/dist/history-version.d.ts +4 -0
  27. package/dist/history-version.js +10 -0
  28. package/dist/history-version.js.map +1 -0
  29. package/dist/model/binding.d.ts +1 -0
  30. package/dist/model/binding.js.map +1 -1
  31. package/dist/models/39.js +85 -11
  32. package/dist/page-decision.d.ts +142 -0
  33. package/dist/page-decision.js +120 -0
  34. package/dist/page-decision.js.map +1 -0
  35. package/dist/page-decisions/gpt.d.ts +7 -0
  36. package/dist/page-decisions/gpt.js +9 -0
  37. package/dist/page-decisions/gpt.js.map +1 -0
  38. package/dist/page-decisions/jev.d.ts +7 -0
  39. package/dist/page-decisions/jev.js +7 -0
  40. package/dist/page-decisions/jev.js.map +1 -0
  41. package/dist/page-decisions/shared.d.ts +9 -0
  42. package/dist/page-decisions/shared.js +29 -0
  43. package/dist/page-decisions/shared.js.map +1 -0
  44. package/dist/page-diagnostics.d.ts +1 -0
  45. package/dist/page-diagnostics.js +10 -0
  46. package/dist/page-diagnostics.js.map +1 -0
  47. package/dist/page-observation.d.ts +6 -0
  48. package/dist/page-observation.js +39 -0
  49. package/dist/page-observation.js.map +1 -0
  50. package/dist/request.d.ts +3 -1
  51. package/dist/request.js +8 -5
  52. package/dist/request.js.map +1 -1
  53. package/dist/tool-catalog.d.ts +9 -0
  54. package/dist/{tool-bridge.js → tool-catalog.js} +24 -84
  55. package/dist/tool-catalog.js.map +1 -0
  56. package/package.json +10 -2
  57. package/dist/tool-bridge.d.ts +0 -36
  58. 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
- if (serializedBytes(removable) < HISTORY_COMPACTION_MIN_NEW_BYTES) return undefined;
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).forEach(({ message, index })=>{
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,7 @@
1
+ import type { PageDecisionConfig } from "../page-decision.js";
2
+ /** @experimental @beta */
3
+ export declare function createGptPageDecision(options: {
4
+ endpoint: string;
5
+ model?: string;
6
+ headers?: Record<string, string>;
7
+ }): PageDecisionConfig;
@@ -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 type { PageDecisionConfig } from "../page-decision.js";
2
+ /** @experimental @beta */
3
+ export declare function createJevPageDecision(options: {
4
+ endpoint: string;
5
+ model?: string;
6
+ headers?: Record<string, string>;
7
+ }): PageDecisionConfig;
@@ -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