@kkeve/suite 0.0.13 → 0.0.17

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 (117) 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 +16 -12
  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 +55 -18
  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 +257 -207
  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 +98 -7
  82. package/dist/page-agent/agent.js +338 -84
  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/system_prompt.md +1 -1
  94. package/dist/page-agent/tools.d.ts +1 -1
  95. package/dist/page-agent/tools.js +441 -9
  96. package/doc/skills/keve-e2e-gen/references/script-generation-guide.md +11 -0
  97. package/package.json +24 -11
  98. package/scripts/gen-system-prompt.mjs +36 -0
  99. package/scripts/run-dsl-task.mjs +619 -0
  100. package/scripts/runtime/cypress-preprocessor.mjs +44 -0
  101. package/scripts/runtime/cypress.config.mjs +35 -0
  102. package/scripts/runtime/playwright.config.mjs +41 -0
  103. package/scripts/verify-shot-diff.mjs +243 -0
  104. package/dist/commands/auth-update.d.ts +0 -16
  105. package/dist/commands/auth-update.js +0 -88
  106. package/dist/core/auth.d.ts +0 -17
  107. package/dist/core/auth.js +0 -224
  108. package/dist/core/cdp-resolver.d.ts +0 -5
  109. package/dist/core/cdp-resolver.js +0 -93
  110. package/dist/core/global-setup.d.ts +0 -6
  111. package/dist/core/global-setup.js +0 -113
  112. package/dist/core/keve-decorators.d.ts +0 -51
  113. package/dist/core/keve-decorators.js +0 -95
  114. package/dist/core/keve-report.js +0 -376
  115. /package/dist/core/{keve-aspect.d.ts → decorator/keve-aspect.d.ts} +0 -0
  116. /package/dist/core/{keve-aspect.js → decorator/keve-aspect.js} +0 -0
  117. /package/dist/{core → engine-playwright}/pw-config.d.ts +0 -0
@@ -43,7 +43,8 @@ exports.generatePwConfig = generatePwConfig;
43
43
  exports.resolveConfigOutputPath = resolveConfigOutputPath;
44
44
  exports.findExistingConfig = findExistingConfig;
45
45
  const path = __importStar(require("node:path"));
46
- const config_1 = require("../config");
46
+ const fs = __importStar(require("node:fs"));
47
+ const config_js_1 = require("../config.js");
47
48
  function generatePwConfig(options = {}) {
48
49
  const { baseUrl, cdp = false, cdpEndpoint, webServer = !cdp, workers = 3, timeout = 1200000, retries = 0, format = 'ts', } = options;
49
50
  const baseURLLine = baseUrl
@@ -89,7 +90,7 @@ export default defineConfig({
89
90
  baseURL: ${baseURLLine},${cdp ? `\n // CDP mode: login state preserved via connected Chrome` : `\n storageState: path.resolve(projectRoot, '.auth/storage-state.json'),`}
90
91
  trace: 'on-first-retry',
91
92
  screenshot: 'off',
92
- video: 'retain-on-failure',
93
+ video: 'on',
93
94
  actionTimeout: 5000,${cdpBlock}
94
95
  },
95
96
  outputDir: path.join(resultDir, 'test-results'),${webServerBlock}
@@ -137,7 +138,7 @@ export default defineConfig({
137
138
  baseURL: ${baseURLLine},${cdp ? `\n // CDP mode: login state preserved via connected Chrome` : `\n storageState: resolve(projectRoot, '.auth', 'storage-state.json'),`}
138
139
  trace: 'on-first-retry',
139
140
  screenshot: 'off',
140
- video: 'retain-on-failure',
141
+ video: 'on',
141
142
  actionTimeout: 5000,${cdpBlock}
142
143
  },
143
144
  outputDir: join(resultDir, 'test-results'),${webServerBlock}
@@ -148,12 +149,12 @@ function resolveConfigOutputPath(explicitOutput, format = 'ts') {
148
149
  const ext = format === 'mjs' ? '.mjs' : '.ts';
149
150
  if (explicitOutput)
150
151
  return path.resolve(explicitOutput);
151
- const keveDir = (0, config_1.findKeveDir)();
152
- const taskDir = (0, config_1.resolveTaskDir)(keveDir);
152
+ const keveDir = (0, config_js_1.findKeveDir)();
153
+ const taskDir = (0, config_js_1.resolveTaskDir)(keveDir);
153
154
  if (taskDir)
154
155
  return path.join(taskDir, `keve-test.config${ext}`);
155
156
  if (keveDir) {
156
- const branchDir = (0, config_1.getBranchDir)(keveDir);
157
+ const branchDir = (0, config_js_1.getBranchDir)(keveDir);
157
158
  if (branchDir)
158
159
  return path.join(branchDir, `keve-test.config${ext}`);
159
160
  return path.join(keveDir, `keve-test.config${ext}`);
@@ -173,7 +174,7 @@ function findExistingConfig(keveDir, taskDir) {
173
174
  searchPaths.push(path.join(process.cwd(), 'keve_test_spec', 'keve-test.config.mjs'));
174
175
  searchPaths.push(path.join(process.cwd(), 'keve_test_spec', 'keve-test.config.ts'));
175
176
  for (const p of searchPaths) {
176
- if (require('fs').existsSync(p))
177
+ if (fs.existsSync(p))
177
178
  return p;
178
179
  }
179
180
  return null;
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,29 +81,113 @@ 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?;
88
- constructor(page: Page, options?: {
129
+ _dialogHandler: {
130
+ accept: boolean;
131
+ promptText?: string;
132
+ } | null;
133
+ _lastDialogInfo: {
134
+ type: string;
135
+ message: string;
136
+ accepted: boolean;
137
+ } | null;
138
+ _pendingFileChooser: any;
139
+ _consoleMessages: any[];
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;
151
+ _pageListenersSetup: boolean;
152
+ /** 页面级性能指标(execute 结束时一次性读取;读取失败则留空) */
153
+ private _lastPageMetrics?;
154
+ constructor(page: AgentPage, options?: {
89
155
  maxSteps?: number;
90
156
  customSystemPrompt?: string;
91
157
  hooks?: AgentHooks;
92
- });
158
+ } & AgentHostOptions);
159
+ /** 读取宿主注入的环境变量(Cypress 侧由 cy.env 转发,Playwright 侧即 process.env) */
160
+ getEnv(name: string): string;
93
161
  /** Stop the current execution */
94
162
  stop(): void;
163
+ /** Set up page event listeners for dialog, console, network, and file chooser capture.
164
+ * Called once per page; subsequent calls are no-ops. */
165
+ private setupPageListeners;
95
166
  /** Main Re-Act execute loop */
96
167
  execute(step: string, expected: string, options?: AgentOptions): Promise<AgentResult>;
97
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;
98
184
  private assembleUserPrompt;
99
185
  private buildMacroTool;
100
- /** Save screenshot buffer to test artifacts (reuses already-captured buffer) */
186
+ /**
187
+ * Save screenshot base64 to test artifacts.
188
+ *
189
+ * 落盘能力由宿主注入:Playwright 侧写本地文件系统,Cypress 侧经 HTTP 桥落盘。
190
+ */
101
191
  private saveScreenshotBuffer;
102
192
  /** Load initial screenshots (goal-before + fn-after) as ContentItem[] for step 0 multimodal input */
103
193
  private loadInitialScreenshots;
@@ -123,7 +213,7 @@ export declare class KevePageAgent {
123
213
  * Drop-in replacement for the old reactLoop function.
124
214
  * Creates a KevePageAgent, runs it, and maps the result.
125
215
  */
126
- 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?: {
127
217
  maxSteps?: number;
128
218
  learnedActionsHint?: string;
129
219
  specFilePath?: string;
@@ -135,10 +225,11 @@ export declare function reactLoop(page: Page, step: string, expected: string, op
135
225
  signal?: AbortSignal;
136
226
  goalScreenshotBefore?: string;
137
227
  fnAfterScreenshot?: string;
138
- }): Promise<{
228
+ } & AgentHostOptions): Promise<{
139
229
  actions: any[];
140
230
  expectedMet: boolean;
141
231
  conclusion?: 'pass' | 'fail' | 'blocked';
142
232
  finalSnapshot: string;
233
+ diagnostics?: RuntimeDiagnostics;
143
234
  agentScreenshots?: string[];
144
235
  }>;