@kkeve/suite 0.0.15 → 0.0.18

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 (115) hide show
  1. package/dist/bin/keve.js +2 -1
  2. package/dist/commands/clean.js +2 -2
  3. package/dist/commands/config.js +7 -7
  4. package/dist/commands/init.js +2 -2
  5. package/dist/commands/report.js +7 -7
  6. package/dist/commands/run.js +12 -11
  7. package/dist/commands/test.js +7 -7
  8. package/dist/config.js +7 -7
  9. package/dist/core/action-log-writer.js +4 -1
  10. package/dist/core/decorator/keve-decorators.d.ts +128 -0
  11. package/dist/core/decorator/keve-decorators.js +254 -0
  12. package/dist/core/decorator/keve-host.d.ts +40 -0
  13. package/dist/core/decorator/keve-host.js +33 -0
  14. package/dist/core/{keve-registry.d.ts → decorator/keve-registry.d.ts} +19 -0
  15. package/dist/core/{keve-registry.js → decorator/keve-registry.js} +13 -1
  16. package/dist/core/generateReport/report.d.ts +1 -1
  17. package/dist/core/generateReport/report.js +2 -2
  18. package/dist/core/generateReport/reportData.d.ts +3 -0
  19. package/dist/core/generateReport/reportData.js +49 -15
  20. package/dist/core/judge/confidence.d.ts +119 -0
  21. package/dist/core/judge/confidence.js +295 -0
  22. package/dist/core/judge/goal-heuristics.d.ts +32 -0
  23. package/dist/core/judge/goal-heuristics.js +128 -0
  24. package/dist/core/judge/pngCodec.d.ts +23 -0
  25. package/dist/core/judge/pngCodec.js +215 -0
  26. package/dist/core/judge/screenshotDiff.d.ts +112 -0
  27. package/dist/core/judge/screenshotDiff.js +420 -0
  28. package/dist/core/page-object/definePage.d.ts +95 -0
  29. package/dist/core/page-object/definePage.js +62 -0
  30. package/dist/core/page-object/elementResolver.d.ts +32 -0
  31. package/dist/core/page-object/elementResolver.js +236 -0
  32. package/dist/core/page-object/engine-types.d.ts +140 -0
  33. package/dist/core/page-object/engine-types.js +34 -0
  34. package/dist/core/sso-cookie.d.ts +18 -0
  35. package/dist/core/sso-cookie.js +10 -0
  36. package/dist/dsl/index.d.ts +15 -0
  37. package/dist/dsl/index.js +29 -0
  38. package/dist/dsl/locatorSource.d.ts +25 -0
  39. package/dist/dsl/locatorSource.js +323 -0
  40. package/dist/dsl/ops.d.ts +46 -0
  41. package/dist/dsl/ops.js +95 -0
  42. package/dist/dsl/toDecorator.d.ts +98 -0
  43. package/dist/dsl/toDecorator.js +747 -0
  44. package/dist/engine-cypress/adapter.d.ts +108 -0
  45. package/dist/engine-cypress/adapter.js +514 -0
  46. package/dist/engine-cypress/agent-page.d.ts +159 -0
  47. package/dist/engine-cypress/agent-page.js +566 -0
  48. package/dist/engine-cypress/agentDom.d.ts +22 -0
  49. package/dist/engine-cypress/agentDom.js +590 -0
  50. package/dist/engine-cypress/bridge.d.ts +39 -0
  51. package/dist/engine-cypress/bridge.js +598 -0
  52. package/dist/engine-cypress/cdp.d.ts +78 -0
  53. package/dist/engine-cypress/cdp.js +339 -0
  54. package/dist/engine-cypress/host.d.ts +22 -0
  55. package/dist/engine-cypress/host.js +480 -0
  56. package/dist/engine-cypress/index.d.ts +26 -0
  57. package/dist/engine-cypress/index.js +58 -0
  58. package/dist/engine-cypress/keveGoal.d.ts +43 -0
  59. package/dist/engine-cypress/keveGoal.js +265 -0
  60. package/dist/engine-cypress/pageOps.d.ts +41 -0
  61. package/dist/engine-cypress/pageOps.js +439 -0
  62. package/dist/engine-cypress/reporter.d.ts +20 -0
  63. package/dist/engine-cypress/reporter.js +128 -0
  64. package/dist/engine-cypress/setup.d.ts +21 -0
  65. package/dist/engine-cypress/setup.js +27 -0
  66. package/dist/engine-cypress/shotBuffer.d.ts +40 -0
  67. package/dist/engine-cypress/shotBuffer.js +41 -0
  68. package/dist/engine-cypress/state.d.ts +56 -0
  69. package/dist/engine-cypress/state.js +81 -0
  70. package/dist/engine-playwright/engineAdapter.d.ts +78 -0
  71. package/dist/engine-playwright/engineAdapter.js +371 -0
  72. package/dist/engine-playwright/global-setup.d.ts +28 -0
  73. package/dist/engine-playwright/global-setup.js +142 -0
  74. package/dist/{core → engine-playwright}/keve-report.d.ts +0 -1
  75. package/dist/engine-playwright/keve-report.js +137 -0
  76. package/dist/{core → engine-playwright}/keve-test.d.ts +10 -8
  77. package/dist/{core → engine-playwright}/keve-test.js +204 -200
  78. package/dist/{core → engine-playwright}/pw-config.js +8 -7
  79. package/dist/index.d.ts +13 -8
  80. package/dist/index.js +43 -28
  81. package/dist/page-agent/agent.d.ts +82 -7
  82. package/dist/page-agent/agent.js +252 -88
  83. package/dist/page-agent/diagnostics.d.ts +184 -0
  84. package/dist/page-agent/diagnostics.js +377 -0
  85. package/dist/page-agent/hooks.d.ts +3 -2
  86. package/dist/page-agent/hooks.js +4 -3
  87. package/dist/page-agent/page-like.d.ts +116 -0
  88. package/dist/page-agent/page-like.js +14 -0
  89. package/dist/page-agent/playwright-page.d.ts +20 -0
  90. package/dist/page-agent/playwright-page.js +98 -0
  91. package/dist/page-agent/system-prompt.d.ts +7 -0
  92. package/dist/page-agent/system-prompt.js +10 -0
  93. package/dist/page-agent/tools.d.ts +1 -1
  94. package/dist/page-agent/tools.js +144 -8
  95. package/package.json +24 -11
  96. package/scripts/gen-system-prompt.mjs +36 -0
  97. package/scripts/run-dsl-task.mjs +652 -0
  98. package/scripts/runtime/cypress-preprocessor.mjs +44 -0
  99. package/scripts/runtime/cypress.config.mjs +35 -0
  100. package/scripts/runtime/playwright.config.mjs +41 -0
  101. package/scripts/verify-shot-diff.mjs +243 -0
  102. package/dist/commands/auth-update.d.ts +0 -16
  103. package/dist/commands/auth-update.js +0 -88
  104. package/dist/core/auth.d.ts +0 -17
  105. package/dist/core/auth.js +0 -224
  106. package/dist/core/cdp-resolver.d.ts +0 -5
  107. package/dist/core/cdp-resolver.js +0 -93
  108. package/dist/core/global-setup.d.ts +0 -6
  109. package/dist/core/global-setup.js +0 -123
  110. package/dist/core/keve-decorators.d.ts +0 -51
  111. package/dist/core/keve-decorators.js +0 -95
  112. package/dist/core/keve-report.js +0 -376
  113. /package/dist/core/{keve-aspect.d.ts → decorator/keve-aspect.d.ts} +0 -0
  114. /package/dist/core/{keve-aspect.js → decorator/keve-aspect.js} +0 -0
  115. /package/dist/{core → engine-playwright}/pw-config.d.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -1,8 +1,13 @@
1
- export { generateReportData, type ReportDataOptions, parseCaseIdFromTitle, extractAllSpecs, buildCaseResultMap, parseYamlSimple } from './core/generateReport/reportData';
2
- export { KevePageAgent, reactLoop, type AgentResult, type AgentStepEvent, type AgentEvent, type AgentOptions, type AgentHooks } from './page-agent/agent';
3
- export { tools, packMacroToolSchema, type PageAgentTool, type MacroToolInput, type ToolContext } from './page-agent/tools';
4
- export { keveAspect, KeveAspectRegistry, type AspectPhase, type AspectDefinition, type GoalContext, type GoalResult } from './core/keve-aspect';
5
- export { ActionLogWriter, type ActionLogRecord } from './core/action-log-writer';
6
- export { learnedActions, LearnedActions } from './core/learned-actions';
7
- export { generatePwConfig, resolveConfigOutputPath, findExistingConfig, type PwConfigOptions } from './core/pw-config';
8
- export { run, KeveRunError, type RunOptions, type RunResult } from './commands/run';
1
+ export { generateReportData, type ReportDataOptions, parseCaseIdFromTitle, extractAllSpecs, buildCaseResultMap, parseYamlSimple } from './core/generateReport/reportData.js';
2
+ export { KevePageAgent, reactLoop, type AgentResult, type AgentStepEvent, type AgentEvent, type AgentOptions, type AgentHooks } from './page-agent/agent.js';
3
+ export { tools, packMacroToolSchema, type PageAgentTool, type MacroToolInput, type ToolContext } from './page-agent/tools.js';
4
+ export { keveAspect, KeveAspectRegistry, type AspectPhase, type AspectDefinition, type GoalContext, type GoalResult } from './core/decorator/keve-aspect.js';
5
+ export { ActionLogWriter, type ActionLogRecord } from './core/action-log-writer.js';
6
+ export { learnedActions, LearnedActions } from './core/learned-actions.js';
7
+ export { generatePwConfig, resolveConfigOutputPath, findExistingConfig, type PwConfigOptions } from './engine-playwright/pw-config.js';
8
+ export { run, KeveRunError, type RunOptions, type RunResult } from './commands/run.js';
9
+ export { definePage, type ElementRef, type ElementFactory, type ElementEntry, type ElementRegistry, type PageDefinition, type DefinedPage, type WaitForReady, isElementFactory, getElement } from './core/page-object/definePage.js';
10
+ export { resolveElement, resolveChain, resolveFromPage } from './core/page-object/elementResolver.js';
11
+ export { PlaywrightEngine, createEngine, type EngineAdapter } from './engine-playwright/engineAdapter.js';
12
+ export { toDecorator, generateDecoratorSpec, type ToDecoratorOptions, type DslStep, type DslExpectation } from './dsl/index.js';
13
+ export type { SsoCookie } from './core/sso-cookie.js';
package/dist/index.js CHANGED
@@ -1,38 +1,53 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.KeveRunError = exports.run = exports.findExistingConfig = exports.resolveConfigOutputPath = exports.generatePwConfig = exports.LearnedActions = exports.learnedActions = exports.ActionLogWriter = exports.KeveAspectRegistry = exports.keveAspect = exports.packMacroToolSchema = exports.tools = exports.reactLoop = exports.KevePageAgent = exports.parseYamlSimple = exports.buildCaseResultMap = exports.extractAllSpecs = exports.parseCaseIdFromTitle = exports.generateReportData = void 0;
4
- var reportData_1 = require("./core/generateReport/reportData");
5
- Object.defineProperty(exports, "generateReportData", { enumerable: true, get: function () { return reportData_1.generateReportData; } });
6
- Object.defineProperty(exports, "parseCaseIdFromTitle", { enumerable: true, get: function () { return reportData_1.parseCaseIdFromTitle; } });
7
- Object.defineProperty(exports, "extractAllSpecs", { enumerable: true, get: function () { return reportData_1.extractAllSpecs; } });
8
- Object.defineProperty(exports, "buildCaseResultMap", { enumerable: true, get: function () { return reportData_1.buildCaseResultMap; } });
9
- Object.defineProperty(exports, "parseYamlSimple", { enumerable: true, get: function () { return reportData_1.parseYamlSimple; } });
3
+ exports.generateDecoratorSpec = exports.toDecorator = exports.createEngine = exports.PlaywrightEngine = exports.resolveFromPage = exports.resolveChain = exports.resolveElement = exports.getElement = exports.isElementFactory = exports.definePage = exports.KeveRunError = exports.run = exports.findExistingConfig = exports.resolveConfigOutputPath = exports.generatePwConfig = exports.LearnedActions = exports.learnedActions = exports.ActionLogWriter = exports.KeveAspectRegistry = exports.keveAspect = exports.packMacroToolSchema = exports.tools = exports.reactLoop = exports.KevePageAgent = exports.parseYamlSimple = exports.buildCaseResultMap = exports.extractAllSpecs = exports.parseCaseIdFromTitle = exports.generateReportData = void 0;
4
+ var reportData_js_1 = require("./core/generateReport/reportData.js");
5
+ Object.defineProperty(exports, "generateReportData", { enumerable: true, get: function () { return reportData_js_1.generateReportData; } });
6
+ Object.defineProperty(exports, "parseCaseIdFromTitle", { enumerable: true, get: function () { return reportData_js_1.parseCaseIdFromTitle; } });
7
+ Object.defineProperty(exports, "extractAllSpecs", { enumerable: true, get: function () { return reportData_js_1.extractAllSpecs; } });
8
+ Object.defineProperty(exports, "buildCaseResultMap", { enumerable: true, get: function () { return reportData_js_1.buildCaseResultMap; } });
9
+ Object.defineProperty(exports, "parseYamlSimple", { enumerable: true, get: function () { return reportData_js_1.parseYamlSimple; } });
10
10
  // Re-Act loop (refactored to page-agent)
11
- var agent_1 = require("./page-agent/agent");
12
- Object.defineProperty(exports, "KevePageAgent", { enumerable: true, get: function () { return agent_1.KevePageAgent; } });
13
- Object.defineProperty(exports, "reactLoop", { enumerable: true, get: function () { return agent_1.reactLoop; } });
14
- var tools_1 = require("./page-agent/tools");
15
- Object.defineProperty(exports, "tools", { enumerable: true, get: function () { return tools_1.tools; } });
16
- Object.defineProperty(exports, "packMacroToolSchema", { enumerable: true, get: function () { return tools_1.packMacroToolSchema; } });
11
+ var agent_js_1 = require("./page-agent/agent.js");
12
+ Object.defineProperty(exports, "KevePageAgent", { enumerable: true, get: function () { return agent_js_1.KevePageAgent; } });
13
+ Object.defineProperty(exports, "reactLoop", { enumerable: true, get: function () { return agent_js_1.reactLoop; } });
14
+ var tools_js_1 = require("./page-agent/tools.js");
15
+ Object.defineProperty(exports, "tools", { enumerable: true, get: function () { return tools_js_1.tools; } });
16
+ Object.defineProperty(exports, "packMacroToolSchema", { enumerable: true, get: function () { return tools_js_1.packMacroToolSchema; } });
17
17
  // Aspect registry (new)
18
- var keve_aspect_1 = require("./core/keve-aspect");
19
- Object.defineProperty(exports, "keveAspect", { enumerable: true, get: function () { return keve_aspect_1.keveAspect; } });
20
- Object.defineProperty(exports, "KeveAspectRegistry", { enumerable: true, get: function () { return keve_aspect_1.KeveAspectRegistry; } });
18
+ var keve_aspect_js_1 = require("./core/decorator/keve-aspect.js");
19
+ Object.defineProperty(exports, "keveAspect", { enumerable: true, get: function () { return keve_aspect_js_1.keveAspect; } });
20
+ Object.defineProperty(exports, "KeveAspectRegistry", { enumerable: true, get: function () { return keve_aspect_js_1.KeveAspectRegistry; } });
21
21
  // Action log (new)
22
- var action_log_writer_1 = require("./core/action-log-writer");
23
- Object.defineProperty(exports, "ActionLogWriter", { enumerable: true, get: function () { return action_log_writer_1.ActionLogWriter; } });
22
+ var action_log_writer_js_1 = require("./core/action-log-writer.js");
23
+ Object.defineProperty(exports, "ActionLogWriter", { enumerable: true, get: function () { return action_log_writer_js_1.ActionLogWriter; } });
24
24
  // Learned actions (new)
25
- var learned_actions_1 = require("./core/learned-actions");
26
- Object.defineProperty(exports, "learnedActions", { enumerable: true, get: function () { return learned_actions_1.learnedActions; } });
27
- Object.defineProperty(exports, "LearnedActions", { enumerable: true, get: function () { return learned_actions_1.LearnedActions; } });
25
+ var learned_actions_js_1 = require("./core/learned-actions.js");
26
+ Object.defineProperty(exports, "learnedActions", { enumerable: true, get: function () { return learned_actions_js_1.learnedActions; } });
27
+ Object.defineProperty(exports, "LearnedActions", { enumerable: true, get: function () { return learned_actions_js_1.LearnedActions; } });
28
28
  // Playwright config generator
29
- var pw_config_1 = require("./core/pw-config");
30
- Object.defineProperty(exports, "generatePwConfig", { enumerable: true, get: function () { return pw_config_1.generatePwConfig; } });
31
- Object.defineProperty(exports, "resolveConfigOutputPath", { enumerable: true, get: function () { return pw_config_1.resolveConfigOutputPath; } });
32
- Object.defineProperty(exports, "findExistingConfig", { enumerable: true, get: function () { return pw_config_1.findExistingConfig; } });
29
+ var pw_config_js_1 = require("./engine-playwright/pw-config.js");
30
+ Object.defineProperty(exports, "generatePwConfig", { enumerable: true, get: function () { return pw_config_js_1.generatePwConfig; } });
31
+ Object.defineProperty(exports, "resolveConfigOutputPath", { enumerable: true, get: function () { return pw_config_js_1.resolveConfigOutputPath; } });
32
+ Object.defineProperty(exports, "findExistingConfig", { enumerable: true, get: function () { return pw_config_js_1.findExistingConfig; } });
33
33
  // Run API
34
- var run_1 = require("./commands/run");
35
- Object.defineProperty(exports, "run", { enumerable: true, get: function () { return run_1.run; } });
36
- Object.defineProperty(exports, "KeveRunError", { enumerable: true, get: function () { return run_1.KeveRunError; } });
34
+ var run_js_1 = require("./commands/run.js");
35
+ Object.defineProperty(exports, "run", { enumerable: true, get: function () { return run_js_1.run; } });
36
+ Object.defineProperty(exports, "KeveRunError", { enumerable: true, get: function () { return run_js_1.KeveRunError; } });
37
37
  // Script refine (new)
38
38
  // script-refine is now part of page-agent/tools
39
+ // ─── Code-based Element Management (P0) ──────────────────────────────
40
+ var definePage_js_1 = require("./core/page-object/definePage.js");
41
+ Object.defineProperty(exports, "definePage", { enumerable: true, get: function () { return definePage_js_1.definePage; } });
42
+ Object.defineProperty(exports, "isElementFactory", { enumerable: true, get: function () { return definePage_js_1.isElementFactory; } });
43
+ Object.defineProperty(exports, "getElement", { enumerable: true, get: function () { return definePage_js_1.getElement; } });
44
+ var elementResolver_js_1 = require("./core/page-object/elementResolver.js");
45
+ Object.defineProperty(exports, "resolveElement", { enumerable: true, get: function () { return elementResolver_js_1.resolveElement; } });
46
+ Object.defineProperty(exports, "resolveChain", { enumerable: true, get: function () { return elementResolver_js_1.resolveChain; } });
47
+ Object.defineProperty(exports, "resolveFromPage", { enumerable: true, get: function () { return elementResolver_js_1.resolveFromPage; } });
48
+ var engineAdapter_js_1 = require("./engine-playwright/engineAdapter.js");
49
+ Object.defineProperty(exports, "PlaywrightEngine", { enumerable: true, get: function () { return engineAdapter_js_1.PlaywrightEngine; } });
50
+ Object.defineProperty(exports, "createEngine", { enumerable: true, get: function () { return engineAdapter_js_1.createEngine; } });
51
+ var index_js_1 = require("./dsl/index.js");
52
+ Object.defineProperty(exports, "toDecorator", { enumerable: true, get: function () { return index_js_1.toDecorator; } });
53
+ Object.defineProperty(exports, "generateDecoratorSpec", { enumerable: true, get: function () { return index_js_1.generateDecoratorSpec; } });
@@ -15,8 +15,10 @@
15
15
  * const agent = new KevePageAgent(page, { maxSteps: 5 });
16
16
  * const result = await agent.execute(step, expected, { learnedActionsHint, fnResult });
17
17
  */
18
- import type { Page } from '@playwright/test';
19
18
  import { LLM } from '@kkeve/core/llm';
19
+ import type { AgentInitialImageLoader, AgentPage, AgentScreenshotSaver } from './page-like.js';
20
+ import { toAgentPage } from './playwright-page.js';
21
+ import { type RawAiUsageRecord, type RawConsoleRecord, type RawNetworkRecord, type RuntimeDiagnostics } from './diagnostics.js';
20
22
  export interface AgentStepEvent {
21
23
  type: 'step';
22
24
  stepIndex: number;
@@ -29,6 +31,8 @@ export interface AgentStepEvent {
29
31
  toolError?: string;
30
32
  snapshot: string;
31
33
  screenshotPath?: string;
34
+ /** 工具执行耗时(ms);LLM 调度异常时缺省 */
35
+ duration?: number;
32
36
  }
33
37
  export interface AgentObservationEvent {
34
38
  type: 'observation';
@@ -44,6 +48,8 @@ export interface AgentResult {
44
48
  data: string;
45
49
  events: AgentEvent[];
46
50
  finalSnapshot: string;
51
+ /** 运行诊断:性能、网络、浏览器错误与质量信号 */
52
+ diagnostics?: RuntimeDiagnostics;
47
53
  agentScreenshots?: string[];
48
54
  diagnosticHints?: string[];
49
55
  }
@@ -75,13 +81,48 @@ export interface AgentOptions {
75
81
  /** fn-after 截图路径(相对 taskDir)— fn 执行后的页面状态 */
76
82
  fnAfterScreenshot?: string;
77
83
  }
84
+ /**
85
+ * Agent 的宿主能力注入点。
86
+ *
87
+ * `page-agent` 现在同时服务 Playwright 与 Cypress(浏览器 bundle),因此不能再
88
+ * 直接持有 Node API。所有原本写死的 Node 能力(读 prompt / 落盘截图 / 读本地
89
+ * 图片 / 读环境变量 / LLM 传输)都改为构造时注入;Playwright 侧给 Node 实现,
90
+ * Cypress 侧给 HTTP 桥实现。
91
+ */
92
+ export interface AgentHostOptions {
93
+ /** system prompt 文本(缺省用编译期内联的 SYSTEM_PROMPT) */
94
+ systemPrompt?: string;
95
+ /** 目标应用 URL(原 process.env.KEVE_TARGET_URL) */
96
+ targetUrl?: string;
97
+ /** 环境变量读取(原 process.env.X),缺省返回空串 */
98
+ getEnv?: (name: string) => string;
99
+ /** 截图落盘,返回相对 taskDir 的路径(原 saveScreenshotBuffer 的 fs 部分) */
100
+ saveScreenshot?: AgentScreenshotSaver;
101
+ /** 读取初始多模态截图(原 loadInitialScreenshots 的 fs 部分) */
102
+ loadInitialImages?: AgentInitialImageLoader;
103
+ /** LLM 配置;缺省从注入的环境变量拼装 */
104
+ llm?: {
105
+ baseURL: string;
106
+ model: string;
107
+ apiKey?: string;
108
+ temperature?: number;
109
+ maxRetries?: number;
110
+ /** 浏览器侧经桥转发;Node 侧缺省走原生 fetch */
111
+ customFetch?: typeof globalThis.fetch;
112
+ };
113
+ }
78
114
  export declare class KevePageAgent {
79
- readonly page: Page;
115
+ readonly page: AgentPage;
80
116
  readonly maxSteps: number;
81
117
  readonly llm: LLM;
82
118
  events: AgentEvent[];
83
119
  private abortController;
84
120
  private systemPrompt;
121
+ /** 目标应用 URL(原 process.env.KEVE_TARGET_URL) */
122
+ readonly targetUrl: string;
123
+ private getEnvFn;
124
+ private saveScreenshotFn?;
125
+ private loadInitialImagesFn?;
85
126
  /** Current execute options (set at start of execute(), accessible from hooks) */
86
127
  options?: AgentOptions;
87
128
  private hooks?;
@@ -97,12 +138,26 @@ export declare class KevePageAgent {
97
138
  _pendingFileChooser: any;
98
139
  _consoleMessages: any[];
99
140
  _networkRequests: any[];
141
+ _browserDiagnostics: RawConsoleRecord[];
142
+ _networkDiagnostics: RawNetworkRecord[];
143
+ /** 本次 execute 内 LLM 推理累计耗时(ms) */
144
+ _aiReasoningMs: number;
145
+ /** 本次 execute 内 LLM token 累计用量 */
146
+ _aiUsage: RawAiUsageRecord;
147
+ /** 本次 execute 内工具操作累计耗时(ms) */
148
+ _actionMs: number;
149
+ /** 本次 execute 起始时间,用于总耗时诊断 */
150
+ _executeStartedAt: number;
100
151
  _pageListenersSetup: boolean;
101
- constructor(page: Page, options?: {
152
+ /** 页面级性能指标(execute 结束时一次性读取;读取失败则留空) */
153
+ private _lastPageMetrics?;
154
+ constructor(page: AgentPage, options?: {
102
155
  maxSteps?: number;
103
156
  customSystemPrompt?: string;
104
157
  hooks?: AgentHooks;
105
- });
158
+ } & AgentHostOptions);
159
+ /** 读取宿主注入的环境变量(Cypress 侧由 cy.env 转发,Playwright 侧即 process.env) */
160
+ getEnv(name: string): string;
106
161
  /** Stop the current execution */
107
162
  stop(): void;
108
163
  /** Set up page event listeners for dialog, console, network, and file chooser capture.
@@ -111,9 +166,28 @@ export declare class KevePageAgent {
111
166
  /** Main Re-Act execute loop */
112
167
  execute(step: string, expected: string, options?: AgentOptions): Promise<AgentResult>;
113
168
  private pushObservation;
169
+ /**
170
+ * 读取页面级性能指标。
171
+ *
172
+ * Playwright 与 Cypress 都走同一段探针源码:Playwright 在真实页面上下文,
173
+ * Cypress 在 AUT 的 isolated world(navigation timing / performance entries
174
+ * 与主世界共享同一份 Performance 数据)。
175
+ */
176
+ private capturePageMetrics;
177
+ /**
178
+ * 汇总当前执行期的运行诊断(含页面性能与质量信号)。
179
+ * 公开给 reactLoop 的异常兜底分支复用,避免中断时丢失已采集数据。
180
+ */
181
+ buildDiagnostics(): RuntimeDiagnostics;
182
+ /** 累加单次 LLM 调用的 token 用量(重试中的失败请求不在返回结果里,无法计量) */
183
+ private recordAiUsage;
114
184
  private assembleUserPrompt;
115
185
  private buildMacroTool;
116
- /** Save screenshot buffer to test artifacts (reuses already-captured buffer) */
186
+ /**
187
+ * Save screenshot base64 to test artifacts.
188
+ *
189
+ * 落盘能力由宿主注入:Playwright 侧写本地文件系统,Cypress 侧经 HTTP 桥落盘。
190
+ */
117
191
  private saveScreenshotBuffer;
118
192
  /** Load initial screenshots (goal-before + fn-after) as ContentItem[] for step 0 multimodal input */
119
193
  private loadInitialScreenshots;
@@ -139,7 +213,7 @@ export declare class KevePageAgent {
139
213
  * Drop-in replacement for the old reactLoop function.
140
214
  * Creates a KevePageAgent, runs it, and maps the result.
141
215
  */
142
- export declare function reactLoop(page: Page, step: string, expected: string, options?: {
216
+ export declare function reactLoop(page: Parameters<typeof toAgentPage>[0], step: string, expected: string, options?: {
143
217
  maxSteps?: number;
144
218
  learnedActionsHint?: string;
145
219
  specFilePath?: string;
@@ -151,10 +225,11 @@ export declare function reactLoop(page: Page, step: string, expected: string, op
151
225
  signal?: AbortSignal;
152
226
  goalScreenshotBefore?: string;
153
227
  fnAfterScreenshot?: string;
154
- }): Promise<{
228
+ } & AgentHostOptions): Promise<{
155
229
  actions: any[];
156
230
  expectedMet: boolean;
157
231
  conclusion?: 'pass' | 'fail' | 'blocked';
158
232
  finalSnapshot: string;
233
+ diagnostics?: RuntimeDiagnostics;
159
234
  agentScreenshots?: string[];
160
235
  }>;