@hover-dev/core 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/engine.d.ts +14 -39
  2. package/dist/engine.d.ts.map +1 -1
  3. package/dist/engine.js +16 -67
  4. package/dist/specs/pageObjectManifest.d.ts.map +1 -1
  5. package/dist/specs/pageObjectManifest.js +11 -10
  6. package/dist/specs/replayGrounded.d.ts.map +1 -1
  7. package/package.json +5 -22
  8. package/dist/agents/argv.d.ts +0 -11
  9. package/dist/agents/argv.d.ts.map +0 -1
  10. package/dist/agents/argv.js +0 -23
  11. package/dist/agents/claude.d.ts +0 -3
  12. package/dist/agents/claude.d.ts.map +0 -1
  13. package/dist/agents/claude.js +0 -220
  14. package/dist/agents/codex.d.ts +0 -19
  15. package/dist/agents/codex.d.ts.map +0 -1
  16. package/dist/agents/codex.js +0 -231
  17. package/dist/agents/detect.d.ts +0 -46
  18. package/dist/agents/detect.d.ts.map +0 -1
  19. package/dist/agents/detect.js +0 -80
  20. package/dist/agents/gemini.d.ts +0 -17
  21. package/dist/agents/gemini.d.ts.map +0 -1
  22. package/dist/agents/gemini.js +0 -186
  23. package/dist/agents/index.d.ts +0 -6
  24. package/dist/agents/index.d.ts.map +0 -1
  25. package/dist/agents/index.js +0 -5
  26. package/dist/agents/invoke.d.ts +0 -12
  27. package/dist/agents/invoke.d.ts.map +0 -1
  28. package/dist/agents/invoke.js +0 -93
  29. package/dist/agents/qwen.d.ts +0 -17
  30. package/dist/agents/qwen.d.ts.map +0 -1
  31. package/dist/agents/qwen.js +0 -172
  32. package/dist/agents/registry.d.ts +0 -19
  33. package/dist/agents/registry.d.ts.map +0 -1
  34. package/dist/agents/registry.js +0 -30
  35. package/dist/agents/shared.d.ts +0 -28
  36. package/dist/agents/shared.d.ts.map +0 -1
  37. package/dist/agents/shared.js +0 -35
  38. package/dist/agents/types.d.ts +0 -194
  39. package/dist/agents/types.d.ts.map +0 -1
  40. package/dist/agents/types.js +0 -23
  41. package/dist/index.d.ts +0 -3
  42. package/dist/index.d.ts.map +0 -1
  43. package/dist/index.js +0 -2
  44. package/dist/mcp/actuateServer.d.ts +0 -3
  45. package/dist/mcp/actuateServer.d.ts.map +0 -1
  46. package/dist/mcp/actuateServer.js +0 -594
  47. package/dist/mcp/sourceFence.d.ts +0 -23
  48. package/dist/mcp/sourceFence.d.ts.map +0 -1
  49. package/dist/mcp/sourceFence.js +0 -79
  50. package/dist/mcp/sourceServer.d.ts +0 -3
  51. package/dist/mcp/sourceServer.d.ts.map +0 -1
  52. package/dist/mcp/sourceServer.js +0 -191
  53. package/dist/modes.d.ts +0 -39
  54. package/dist/modes.d.ts.map +0 -1
  55. package/dist/modes.js +0 -34
  56. package/dist/playwright/cdpStatus.d.ts +0 -14
  57. package/dist/playwright/cdpStatus.d.ts.map +0 -1
  58. package/dist/playwright/cdpStatus.js +0 -52
  59. package/dist/playwright/preflight.d.ts +0 -31
  60. package/dist/playwright/preflight.d.ts.map +0 -1
  61. package/dist/playwright/preflight.js +0 -82
  62. package/dist/playwright/preflightCache.d.ts +0 -27
  63. package/dist/playwright/preflightCache.d.ts.map +0 -1
  64. package/dist/playwright/preflightCache.js +0 -21
  65. package/dist/playwright/resolveMcpConfig.d.ts +0 -61
  66. package/dist/playwright/resolveMcpConfig.d.ts.map +0 -1
  67. package/dist/playwright/resolveMcpConfig.js +0 -84
  68. package/dist/plugin-api.d.ts +0 -237
  69. package/dist/plugin-api.d.ts.map +0 -1
  70. package/dist/plugin-api.js +0 -52
  71. package/dist/qa/classify.d.ts +0 -38
  72. package/dist/qa/classify.d.ts.map +0 -1
  73. package/dist/qa/classify.js +0 -138
  74. package/dist/runSession.d.ts +0 -53
  75. package/dist/runSession.d.ts.map +0 -1
  76. package/dist/runSession.js +0 -96
  77. package/dist/service/cdpHandlers.d.ts +0 -24
  78. package/dist/service/cdpHandlers.d.ts.map +0 -1
  79. package/dist/service/cdpHandlers.js +0 -50
  80. package/dist/service/cdpHint.d.ts +0 -41
  81. package/dist/service/cdpHint.d.ts.map +0 -1
  82. package/dist/service/cdpHint.js +0 -158
  83. package/dist/service/conventions.d.ts +0 -8
  84. package/dist/service/conventions.d.ts.map +0 -1
  85. package/dist/service/conventions.js +0 -42
  86. package/dist/service/relayHandlers.d.ts +0 -28
  87. package/dist/service/relayHandlers.d.ts.map +0 -1
  88. package/dist/service/relayHandlers.js +0 -105
  89. package/dist/service/saveHandlers.d.ts +0 -50
  90. package/dist/service/saveHandlers.d.ts.map +0 -1
  91. package/dist/service/saveHandlers.js +0 -77
  92. package/dist/service/types.d.ts +0 -158
  93. package/dist/service/types.d.ts.map +0 -1
  94. package/dist/service/types.js +0 -26
  95. package/dist/service.d.ts +0 -54
  96. package/dist/service.d.ts.map +0 -1
  97. package/dist/service.js +0 -1772
  98. package/dist/specs/businessMap.d.ts +0 -29
  99. package/dist/specs/businessMap.d.ts.map +0 -1
  100. package/dist/specs/businessMap.js +0 -95
  101. package/dist/specs/extractPageObjects.d.ts +0 -18
  102. package/dist/specs/extractPageObjects.d.ts.map +0 -1
  103. package/dist/specs/extractPageObjects.js +0 -98
  104. package/dist/specs/optimizeSpecWithAgent.d.ts +0 -9
  105. package/dist/specs/optimizeSpecWithAgent.d.ts.map +0 -1
  106. package/dist/specs/optimizeSpecWithAgent.js +0 -39
package/dist/engine.d.ts CHANGED
@@ -1,11 +1,22 @@
1
- export { runSession } from './runSession.js';
2
- export type { RunSessionOptions, RunSessionResult } from './runSession.js';
1
+ /**
2
+ * In-process engine surface for the `@hover-dev/mcp` server (and any other
3
+ * standalone consumer). The MCP server drives the debug Chrome directly via
4
+ * `playwright-core` and buffers grounded steps, then crystallizes them with
5
+ * `writeSpec` — no WebSocket service, no agent spawning. This barrel re-exports
6
+ * exactly those building blocks.
7
+ *
8
+ * (The old staged-engine surface — `runSession`, the WS `service`, the
9
+ * Playwright-MCP config in `resolveMcpConfig` / `buildGroundedMcpConfig`, and
10
+ * the `mcp/actuateServer` + `mcp/sourceServer` relays — has been removed. The
11
+ * MCP-first path doesn't spawn Playwright's MCP; it actuates through
12
+ * `playwright-core` and `groundedLocate` below, which is what keeps
13
+ * record == replay.)
14
+ */
3
15
  export { writeSpec } from './specs/writeSpec.js';
4
16
  export type { WriteSpecOptions, WriteSpecResult, Redaction } from './specs/writeSpec.js';
5
17
  export type { SkillStep } from './specs/specStep.js';
6
18
  export { replayGroundedSteps, replayOnPage, applyGroundedStep, groundedLocate } from './specs/replayGrounded.js';
7
19
  export type { ReplayResult, ReplayFailure, ReplayStep, GroundedTarget } from './specs/replayGrounded.js';
8
- export { resolveMcpConfig, mcpToolPrefix } from './playwright/resolveMcpConfig.js';
9
20
  export { launchDebugChrome, closeDebugChrome, findChromeBinary } from './playwright/launchChrome.js';
10
21
  export type { LaunchOptions, LaunchResult } from './playwright/launchChrome.js';
11
22
  export { GROUNDED_ACTUATION_DENY, GROUNDED_ACTUATION_DIRECTIVE } from './agentDirectives.js';
@@ -14,40 +25,4 @@ export type { BusinessFact } from './memory/businessMemory.js';
14
25
  export { RECON_DIRECTIVE, QA_EXPLORATION_DIRECTIVE } from './agentDirectives.js';
15
26
  export { QA_INTENSITY, DEFAULT_QA_INTENSITY, asQaIntensity, qaBudgetDirective } from './qa/intensity.js';
16
27
  export type { QaIntensity, QaIntensitySpec } from './qa/intensity.js';
17
- /**
18
- * The always-on control-actuation MCP server id. Alphanumeric on purpose — a
19
- * hyphen would make the hard-sandbox allow prefix (`mcp__hovercontrol`) fail to
20
- * match the tool names (`mcp__hovercontrol__click_control`), so every grounded
21
- * actuation would be denied. (Same constant + reasoning as service.ts.)
22
- */
23
- export declare const CONTROL_MCP_ID = "hovercontrol";
24
- /** The hard-sandbox allow prefix for the control server — pass in
25
- * `runSession({ allowedToolsExtra: [CONTROL_MCP_TOOL_PREFIX] })`. */
26
- export declare const CONTROL_MCP_TOOL_PREFIX: string;
27
- export interface GroundedMcpOptions {
28
- /** CDP endpoint of the debug Chrome the agent drives. */
29
- cdpUrl: string;
30
- /** Port used only to namespace the generated config filename. */
31
- port: number;
32
- /** Project root — where the control server resolves relative paths / writes
33
- * its placeholder upload fixture, and where `@playwright/mcp` resolves from. */
34
- devRoot: string;
35
- /** The dev-server origin the run targets (defaults to `cdpUrl`). */
36
- devUrl?: string;
37
- /** WS port the control server's back-channel (`ask_user` / `record_*`)
38
- * connects to. Omit when there's no listener — actuation still works; the
39
- * back-channel features silently no-op (actuateServer fails soft). */
40
- approvalPort?: number;
41
- /** Directory the Playwright MCP + control screenshots write into. */
42
- outputDir?: string;
43
- }
44
- /**
45
- * Build an MCP config mirroring the service's grounded/normal mode: the
46
- * Playwright MCP over CDP PLUS the hover-control actuation server. Pair it in
47
- * `runSession` with `allowedToolsExtra: [CONTROL_MCP_TOOL_PREFIX]`,
48
- * `disallowedToolsExtra: GROUNDED_ACTUATION_DENY`, and append
49
- * `GROUNDED_ACTUATION_DIRECTIVE` to the system prompt — then the selectors the
50
- * agent actuates with are the ones crystallized (record==replay).
51
- */
52
- export declare function buildGroundedMcpConfig(opts: GroundedMcpOptions): string;
53
28
  //# sourceMappingURL=engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjH,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGzG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGhF,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAG7F,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACrG,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM/D,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzG,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,iBAAiB,CAAC;AAE7C;sEACsE;AACtE,eAAO,MAAM,uBAAuB,QAAgC,CAAC;AAMrE,MAAM,WAAW,kBAAkB;IACjC,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb;qFACiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;2EAEuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAqBvE"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACjH,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGzG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGhF,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAG7F,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACrG,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzG,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/engine.js CHANGED
@@ -1,78 +1,27 @@
1
1
  /**
2
- * In-process engine surface for non-service consumers — the `hover` CLI and the
3
- * `@hover-dev/mcp` server. The VS Code extension drives core through the WS
4
- * service (`./service`); a standalone process instead calls `runSession`
5
- * directly. This barrel exposes the same building blocks the service composes —
6
- * the session run, the GROUNDED MCP config (so a CLI-authored spec gets the
7
- * record==replay fidelity the extension does), and spec crystallization —
8
- * without the WebSocket layer.
2
+ * In-process engine surface for the `@hover-dev/mcp` server (and any other
3
+ * standalone consumer). The MCP server drives the debug Chrome directly via
4
+ * `playwright-core` and buffers grounded steps, then crystallizes them with
5
+ * `writeSpec` no WebSocket service, no agent spawning. This barrel re-exports
6
+ * exactly those building blocks.
9
7
  *
10
- * Keep this a thin re-export + the one `buildGroundedMcpConfig` helper. The
11
- * grounded path here MUST stay in lock-step with `service.ts`'s normal-mode
12
- * assembly (the control-actuation server + `GROUNDED_ACTUATION_DENY` /
13
- * `GROUNDED_ACTUATION_DIRECTIVE`), or CLI specs would drift from extension specs.
8
+ * (The old staged-engine surface `runSession`, the WS `service`, the
9
+ * Playwright-MCP config in `resolveMcpConfig` / `buildGroundedMcpConfig`, and
10
+ * the `mcp/actuateServer` + `mcp/sourceServer` relays — has been removed. The
11
+ * MCP-first path doesn't spawn Playwright's MCP; it actuates through
12
+ * `playwright-core` and `groundedLocate` below, which is what keeps
13
+ * record == replay.)
14
14
  */
15
- import { resolve, dirname } from 'node:path';
16
- import { fileURLToPath } from 'node:url';
17
- import { resolveMcpConfig, mcpToolPrefix } from './playwright/resolveMcpConfig.js';
18
- // ── in-process session + crystallization ─────────────────────────────────────
19
- export { runSession } from './runSession.js';
15
+ // ── crystallization + grounded replay ────────────────────────────────────────
20
16
  export { writeSpec } from './specs/writeSpec.js';
21
17
  // Creation-verification: replay a flow's grounded steps over CDP (no playwright test).
22
18
  export { replayGroundedSteps, replayOnPage, applyGroundedStep, groundedLocate } from './specs/replayGrounded.js';
23
- // ── browser / MCP plumbing ───────────────────────────────────────────────────
24
- export { resolveMcpConfig, mcpToolPrefix } from './playwright/resolveMcpConfig.js';
19
+ // ── debug-Chrome lifecycle ───────────────────────────────────────────────────
25
20
  export { launchDebugChrome, closeDebugChrome, findChromeBinary } from './playwright/launchChrome.js';
26
- // ── grounded-actuation knobs (must match service.ts) ─────────────────────────
21
+ // ── grounded-actuation knobs (the deny-list + directive the agent runs under)
27
22
  export { GROUNDED_ACTUATION_DENY, GROUNDED_ACTUATION_DIRECTIVE } from './agentDirectives.js';
28
- // ── business memory (ask → remember loop; shared with the extension's QA mode)
23
+ // ── business memory (ask → remember loop) ────────────────────────────────────
29
24
  export { loadMemory, formatMemoryForPrompt, writeFact, memoryDir } from './memory/businessMemory.js';
30
- // ── autonomous-exploration directives (QA mode reuse) ────────────────────────
31
- // The CLI's "explore → discover business flows → record_candidate" loop is the
32
- // same mechanism QA mode drives the agent with; reuse the directives verbatim
33
- // so behaviour stays in lock-step.
25
+ // ── autonomous-exploration directives + intensity (the test_app workflow) ─────
34
26
  export { RECON_DIRECTIVE, QA_EXPLORATION_DIRECTIVE } from './agentDirectives.js';
35
27
  export { QA_INTENSITY, DEFAULT_QA_INTENSITY, asQaIntensity, qaBudgetDirective } from './qa/intensity.js';
36
- /**
37
- * The always-on control-actuation MCP server id. Alphanumeric on purpose — a
38
- * hyphen would make the hard-sandbox allow prefix (`mcp__hovercontrol`) fail to
39
- * match the tool names (`mcp__hovercontrol__click_control`), so every grounded
40
- * actuation would be denied. (Same constant + reasoning as service.ts.)
41
- */
42
- export const CONTROL_MCP_ID = 'hovercontrol';
43
- /** The hard-sandbox allow prefix for the control server — pass in
44
- * `runSession({ allowedToolsExtra: [CONTROL_MCP_TOOL_PREFIX] })`. */
45
- export const CONTROL_MCP_TOOL_PREFIX = mcpToolPrefix(CONTROL_MCP_ID);
46
- // dist/engine.js sits beside dist/service.js, so mcp/actuateServer.js resolves
47
- // the same way it does from service.ts.
48
- const CONTROL_MCP_SCRIPT = resolve(dirname(fileURLToPath(import.meta.url)), 'mcp', 'actuateServer.js');
49
- /**
50
- * Build an MCP config mirroring the service's grounded/normal mode: the
51
- * Playwright MCP over CDP PLUS the hover-control actuation server. Pair it in
52
- * `runSession` with `allowedToolsExtra: [CONTROL_MCP_TOOL_PREFIX]`,
53
- * `disallowedToolsExtra: GROUNDED_ACTUATION_DENY`, and append
54
- * `GROUNDED_ACTUATION_DIRECTIVE` to the system prompt — then the selectors the
55
- * agent actuates with are the ones crystallized (record==replay).
56
- */
57
- export function buildGroundedMcpConfig(opts) {
58
- return resolveMcpConfig({
59
- cdpUrl: opts.cdpUrl,
60
- port: opts.port,
61
- cwd: opts.devRoot,
62
- outputDir: opts.outputDir,
63
- extra: [
64
- {
65
- id: CONTROL_MCP_ID,
66
- command: process.execPath,
67
- args: [CONTROL_MCP_SCRIPT],
68
- env: {
69
- HOVER_CDP_URL: opts.cdpUrl,
70
- HOVER_DEV_URL: opts.devUrl ?? opts.cdpUrl,
71
- HOVER_PROJECT_ROOT: opts.devRoot,
72
- ...(opts.approvalPort ? { HOVER_APPROVAL_PORT: String(opts.approvalPort) } : {}),
73
- ...(opts.outputDir ? { HOVER_SHOT_DIR: opts.outputDir } : {}),
74
- },
75
- },
76
- ],
77
- });
78
- }
@@ -1 +1 @@
1
- {"version":3,"file":"pageObjectManifest.d.ts","sourceRoot":"","sources":["../../src/specs/pageObjectManifest.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;wDAEwD;AACxD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAUhG"}
1
+ {"version":3,"file":"pageObjectManifest.d.ts","sourceRoot":"","sources":["../../src/specs/pageObjectManifest.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAMD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,eAAe,EAAE,GACvB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;wDAEwD;AACxD,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAUhG"}
@@ -1,15 +1,16 @@
1
1
  /**
2
- * Page Object manifest — the link between extraction (Stage 3b) and
3
- * consumption (Stage 3c).
2
+ * Page Object manifest — `.hover/page-objects.json` describing each emitted
3
+ * Page Object (class/method/fixture names + the signature prefix it replays).
4
+ * writeSpec reads it (`readPageObjectManifest`) to decide whether a freshly-saved
5
+ * spec's prefix matches an existing Page Object — if so it consumes
6
+ * `await loginPage.login(…)` and imports from `./fixtures` instead of re-emitting
7
+ * the steps inline.
4
8
  *
5
- * extractPageObjects writes `.hover/page-objects.json` describing each emitted
6
- * Page Object: its class/method/fixture names and the signature prefix it
7
- * replays. writeSpec reads it to decide whether a freshly-saved spec's prefix
8
- * matches a Page Object if so it consumes `await loginPage.login(…)` and
9
- * imports from `./fixtures` instead of re-emitting the steps inline.
10
- *
11
- * Kept separate from extractPageObjects so writeSpec can read the manifest
12
- * without importing the detection/generation chain.
9
+ * NOTE: cross-spec reuse is currently DORMANT — the manifest writer
10
+ * (`writePageObjectManifest`) has no caller since the standalone extraction stage
11
+ * was removed, so the read path returns null and writeSpec emits Page Objects
12
+ * inline. Kept as the seam for when cross-spec Page Object reuse is wired into
13
+ * the MCP-first flow.
13
14
  */
14
15
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
15
16
  import { join } from 'node:path';
@@ -1 +1 @@
1
- {"version":3,"file":"replayGrounded.d.ts","sourceRoot":"","sources":["../../src/specs/replayGrounded.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAkBlF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AA+BD,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,GAAG,IAAI,CAS5E;AAED;yEACyE;AACzE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CA4B/F;AAED;;qEAEqE;AACrE,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBzG;AAuBD,+EAA+E;AAC/E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAoB9H"}
1
+ {"version":3,"file":"replayGrounded.d.ts","sourceRoot":"","sources":["../../src/specs/replayGrounded.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAiBlF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AA+BD,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,GAAG,IAAI,CAS5E;AAED;yEACyE;AACzE,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,CA4B/F;AAED;;qEAEqE;AACrE,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAqBzG;AAuBD,+EAA+E;AAC/E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAoB9H"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hover-dev/core",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Hover's local Node service: agent invocation, Playwright CDP preflight, WebSocket bridge.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Hyperyond",
@@ -20,32 +20,16 @@
20
20
  "claude"
21
21
  ],
22
22
  "type": "module",
23
- "main": "dist/index.js",
24
- "types": "dist/index.d.ts",
23
+ "main": "dist/engine.js",
24
+ "types": "dist/engine.d.ts",
25
25
  "exports": {
26
26
  ".": {
27
- "types": "./dist/index.d.ts",
28
- "import": "./dist/index.js"
29
- },
30
- "./agents": {
31
- "types": "./dist/agents/index.d.ts",
32
- "import": "./dist/agents/index.js"
33
- },
34
- "./service": {
35
- "types": "./dist/service.d.ts",
36
- "import": "./dist/service.js"
27
+ "types": "./dist/engine.d.ts",
28
+ "import": "./dist/engine.js"
37
29
  },
38
30
  "./engine": {
39
31
  "types": "./dist/engine.d.ts",
40
32
  "import": "./dist/engine.js"
41
- },
42
- "./launch-chrome": {
43
- "types": "./dist/playwright/launchChrome.d.ts",
44
- "import": "./dist/playwright/launchChrome.js"
45
- },
46
- "./plugin-api": {
47
- "types": "./dist/plugin-api.d.ts",
48
- "import": "./dist/plugin-api.js"
49
33
  }
50
34
  },
51
35
  "files": [
@@ -55,7 +39,6 @@
55
39
  ],
56
40
  "dependencies": {
57
41
  "@modelcontextprotocol/sdk": "^1.29.0",
58
- "@playwright/mcp": "0.0.75",
59
42
  "cross-spawn": "^7.0.6",
60
43
  "playwright-core": "^1.50.0",
61
44
  "ts-morph": "^28.0.0",
@@ -1,11 +0,0 @@
1
- import type { AgentDescriptor, InvokeOptions } from './types.js';
2
- /**
3
- * Build argv for spawning an agent.
4
- *
5
- * Per-agent argument logic lives on the descriptor (e.g. claude.ts owns its
6
- * own `--mcp-config`, `--permission-mode` etc.). This dispatcher only
7
- * gates by protocol — `acp` and `pi-rpc` are not yet implemented because
8
- * they require a long-lived bidirectional channel rather than argv.
9
- */
10
- export declare function buildArgv(descriptor: AgentDescriptor, opts: InvokeOptions): string[];
11
- //# sourceMappingURL=argv.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"argv.d.ts","sourceRoot":"","sources":["../../src/agents/argv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGjE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,EAAE,CAepF"}
@@ -1,23 +0,0 @@
1
- import { UnsupportedAgentProtocolError } from './types.js';
2
- /**
3
- * Build argv for spawning an agent.
4
- *
5
- * Per-agent argument logic lives on the descriptor (e.g. claude.ts owns its
6
- * own `--mcp-config`, `--permission-mode` etc.). This dispatcher only
7
- * gates by protocol — `acp` and `pi-rpc` are not yet implemented because
8
- * they require a long-lived bidirectional channel rather than argv.
9
- */
10
- export function buildArgv(descriptor, opts) {
11
- switch (descriptor.protocol) {
12
- case 'argv':
13
- case 'stdin':
14
- return descriptor.buildArgs(opts);
15
- case 'acp':
16
- case 'pi-rpc':
17
- throw new UnsupportedAgentProtocolError(`Agent protocol "${descriptor.protocol}" is not yet implemented (agent: ${descriptor.id})`);
18
- default: {
19
- const exhaustive = descriptor.protocol;
20
- throw new UnsupportedAgentProtocolError(`Unknown protocol: ${String(exhaustive)}`);
21
- }
22
- }
23
- }
@@ -1,3 +0,0 @@
1
- import type { AgentDescriptor } from './types.js';
2
- export declare const claudeAgent: AgentDescriptor;
3
- //# sourceMappingURL=claude.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/agents/claude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA2C,MAAM,YAAY,CAAC;AAiI3F,eAAO,MAAM,WAAW,EAAE,eA8IzB,CAAC"}
@@ -1,220 +0,0 @@
1
- /**
2
- * Running-cost accumulator across one parser lifecycle. Claude Code's
3
- * stream-json sometimes carries `total_cost_usd` on intermediate events; when
4
- * it does we just forward it. When it doesn't, we estimate from token usage
5
- * using public per-million pricing. Hardcoded rates because they change
6
- * rarely and we'd rather not network-fetch a price table from a sandbox.
7
- *
8
- * The estimate is empirically about 1.5–2× the authoritative
9
- * `total_cost_usd` that arrives on the final `result` event (overhead from
10
- * tool-definition tokens we don't see + Claude's actual cache hit ratios
11
- * vs. our pessimistic accounting). That's fine for the widget's purpose:
12
- * give the user a signal of cost direction and order-of-magnitude so they
13
- * know when to hit Stop. The done card displays the final authoritative
14
- * number from `total_cost_usd`, so the user always sees the ground truth.
15
- */
16
- const PRICE_PER_M_USD = {
17
- // claude-sonnet-4 / 4.5 / 4.6 / 4.7 — all priced the same as of 2026
18
- sonnet: { in: 3, out: 15, cacheCreate: 3.75, cacheRead: 0.3 },
19
- opus: { in: 15, out: 75, cacheCreate: 18.75, cacheRead: 1.5 },
20
- haiku: { in: 1, out: 5, cacheCreate: 1.25, cacheRead: 0.1 },
21
- };
22
- function estimateCostUsd(modelHint, usage) {
23
- // Match the most specific tier by substring. e.g. 'claude-sonnet-4-6' → sonnet.
24
- const m = (modelHint ?? 'sonnet').toLowerCase();
25
- const tier = m.includes('opus') ? PRICE_PER_M_USD.opus :
26
- m.includes('haiku') ? PRICE_PER_M_USD.haiku :
27
- PRICE_PER_M_USD.sonnet;
28
- return ((usage.input_tokens ?? 0) * tier.in +
29
- (usage.output_tokens ?? 0) * tier.out +
30
- (usage.cache_creation_input_tokens ?? 0) * tier.cacheCreate +
31
- (usage.cache_read_input_tokens ?? 0) * tier.cacheRead) / 1_000_000;
32
- }
33
- function claudeState(state) {
34
- // First touch on this state object — seed the keys we read below.
35
- if (typeof state.runningCost !== 'number') {
36
- state.runningCost = 0;
37
- state.runningTurns = 0;
38
- state.runningTokens = 0;
39
- state.runningModel = undefined;
40
- }
41
- return state;
42
- }
43
- /** Every built-in claude-code tool that has nothing to do with driving a
44
- * browser. Combined with `--strict-mcp-config` + an allow-list of mcp__*
45
- * ids, this leaves Claude with only the Playwright MCP (plus any
46
- * plugin-contributed MCPs) as a usable tool surface. */
47
- const CLAUDE_DEFAULT_DISALLOWED_TOOLS = [
48
- // file / shell / data access — never appropriate for browser driving
49
- 'Bash', 'BashOutput', 'KillBash',
50
- 'Edit', 'MultiEdit', 'Write', 'Read', 'NotebookEdit',
51
- // `Task` was renamed `Agent` in newer Claude Code — it spawns a subagent with
52
- // the full tool surface (Bash/Write/…), a real sandbox escape, so deny BOTH
53
- // the current and legacy name. (Only this one targeted name was added; do NOT
54
- // add MCP-machinery tools like WaitForMcpServers here — denying those breaks
55
- // the MCP tool path and the agent loses its real browser tools.)
56
- 'Grep', 'Glob', 'Task', 'Agent', 'TodoWrite',
57
- 'WebFetch', 'WebSearch',
58
- // plan / worktree / cron / notification — irrelevant in -p mode
59
- 'EnterPlanMode', 'ExitPlanMode',
60
- 'EnterWorktree', 'ExitWorktree',
61
- 'CronCreate', 'CronDelete', 'CronList',
62
- 'PushNotification', 'RemoteTrigger',
63
- // task & tool introspection added in claude 2.1.x — let through and
64
- // the agent will burn turns exploring instead of executing
65
- 'ToolSearch',
66
- 'Monitor', 'TaskOutput', 'TaskStop',
67
- 'AskUserQuestion',
68
- 'ShareOnboardingGuide',
69
- // Skills are loaded independently of the --allowedTools allow-list, so an
70
- // allow-list of `mcp__playwright` does NOT block the `Skill` tool. Left
71
- // through, the agent burns a turn "checking for a project skill first" and
72
- // pollutes the crystallized spec with a junk `When · Skill` step. Deny it.
73
- 'Skill',
74
- // Playwright MCP's arbitrary-JS tools. browser_run_code_unsafe /
75
- // browser_evaluate run any JS in the page — a real prompt-injection exfil
76
- // path (fetch a token out, read localStorage) that punches through the
77
- // "Playwright MCP only" sandbox, and their output can't be translated into
78
- // a deterministic Playwright spec anyway (it lands as a `// TODO`). Agents
79
- // drive via click/fill/select and read state via snapshot instead.
80
- 'mcp__playwright__browser_run_code_unsafe',
81
- 'mcp__playwright__browser_evaluate',
82
- ];
83
- export const claudeAgent = {
84
- id: 'claude',
85
- binName: 'claude',
86
- protocol: 'argv',
87
- streamFormat: 'stream-json',
88
- sandboxStrength: 'hard',
89
- defaultDisallowedTools: CLAUDE_DEFAULT_DISALLOWED_TOOLS,
90
- // F7 optimize is text-in/text-out refinement — haiku is plenty and ~cheap.
91
- cheapModel: 'haiku',
92
- display: {
93
- label: 'Claude Code',
94
- tagline: 'Anthropic — best-in-class browser driving, hard tool sandbox',
95
- homepage: 'https://docs.claude.com/claude-code',
96
- installHint: 'npm install -g @anthropic-ai/claude-code',
97
- },
98
- buildArgs(opts) {
99
- const args = ['-p', opts.prompt];
100
- args.push('--output-format', 'stream-json', '--verbose');
101
- args.push('--permission-mode', 'dontAsk');
102
- if (opts.mcpConfig) {
103
- args.push('--mcp-config', opts.mcpConfig, '--strict-mcp-config');
104
- }
105
- if (opts.allowedTools?.length) {
106
- args.push('--allowedTools', ...opts.allowedTools);
107
- }
108
- if (opts.disallowedTools?.length) {
109
- args.push('--disallowedTools', ...opts.disallowedTools);
110
- }
111
- if (opts.maxBudgetUsd != null) {
112
- args.push('--max-budget-usd', String(opts.maxBudgetUsd));
113
- }
114
- if (opts.maxTurns != null) {
115
- args.push('--max-turns', String(opts.maxTurns));
116
- }
117
- if (opts.model) {
118
- args.push('--model', opts.model);
119
- }
120
- if (opts.effort) {
121
- args.push('--effort', opts.effort);
122
- }
123
- if (opts.sessionId) {
124
- args.push('--resume', opts.sessionId);
125
- }
126
- if (opts.appendSystemPrompt && opts.appendSystemPrompt.trim().length > 0) {
127
- args.push('--append-system-prompt', opts.appendSystemPrompt);
128
- }
129
- return args;
130
- },
131
- parseEvent(line, state = {}) {
132
- if (!line.trim())
133
- return [];
134
- let ev;
135
- try {
136
- ev = JSON.parse(line);
137
- }
138
- catch {
139
- return [{ kind: 'raw', line }];
140
- }
141
- const s = claudeState(state);
142
- const out = [];
143
- if (ev.type === 'system' && ev.subtype === 'init') {
144
- // Fresh session — reset the cost/turn accumulator.
145
- s.runningCost = 0;
146
- s.runningTurns = 0;
147
- s.runningTokens = 0;
148
- s.runningModel = ev.model;
149
- if (ev.session_id) {
150
- out.push({ kind: 'session_start', sessionId: ev.session_id, model: ev.model });
151
- }
152
- for (const server of ev.mcp_servers ?? []) {
153
- out.push({ kind: 'mcp_status', server: server.name, status: server.status });
154
- }
155
- return out;
156
- }
157
- if (ev.type === 'assistant') {
158
- s.runningTurns += 1;
159
- // Claude Code sometimes carries `total_cost_usd` on intermediate events;
160
- // when present it's authoritative (server-computed, includes anything
161
- // we'd miss). When absent, estimate from this turn's usage so the widget
162
- // still shows a growing $ counter on long runs.
163
- if (typeof ev.total_cost_usd === 'number') {
164
- s.runningCost = ev.total_cost_usd;
165
- }
166
- else if (ev.message?.usage) {
167
- s.runningCost += estimateCostUsd(s.runningModel ?? ev.message.model, ev.message.usage);
168
- }
169
- // Token consumption = fresh input + output only. We deliberately EXCLUDE
170
- // cache_read (and cache_creation): Claude re-reads ~the whole context from
171
- // cache every turn, so summing cache_read across turns inflates the total
172
- // ~5-10× and diverges from what Claude Code reports. input+output tracks
173
- // the new tokens processed, matching the user's mental model + CC's number.
174
- if (ev.message?.usage) {
175
- const u = ev.message.usage;
176
- s.runningTokens += (u.input_tokens ?? 0) + (u.output_tokens ?? 0);
177
- }
178
- out.push({ kind: 'usage', costUsd: s.runningCost, turns: s.runningTurns, tokens: s.runningTokens });
179
- for (const block of ev.message?.content ?? []) {
180
- if (block.type === 'tool_use') {
181
- const name = block.name ?? '';
182
- const tool = name.replace(/^mcp__playwright__/, '');
183
- out.push({
184
- kind: 'tool_use',
185
- tool,
186
- input: block.input,
187
- costUsdSnapshot: s.runningCost,
188
- tokensSnapshot: s.runningTokens,
189
- });
190
- }
191
- else if (block.type === 'text') {
192
- const text = block.text?.trim();
193
- if (text)
194
- out.push({ kind: 'text', text });
195
- }
196
- }
197
- return out;
198
- }
199
- if (ev.type === 'user') {
200
- for (const block of ev.message?.content ?? []) {
201
- if (block.type === 'tool_result') {
202
- out.push({ kind: 'tool_result', isError: block.is_error });
203
- }
204
- }
205
- return out;
206
- }
207
- if (ev.type === 'result') {
208
- out.push({
209
- kind: 'session_end',
210
- turns: ev.num_turns,
211
- costUsd: ev.total_cost_usd,
212
- tokens: s.runningTokens,
213
- isError: ev.is_error,
214
- summary: ev.result,
215
- });
216
- return out;
217
- }
218
- return [];
219
- },
220
- };
@@ -1,19 +0,0 @@
1
- import type { AgentDescriptor, ParserState } from './types.js';
2
- export declare const codexAgent: AgentDescriptor;
3
- /**
4
- * Test-only escape hatches. Tests pass a state object in and get the
5
- * accumulated counters back — same shape as the parser sees during a real
6
- * invocation, just driven by the test instead of by invokeAgent.
7
- */
8
- export declare const __testing: {
9
- freshState: () => ParserState;
10
- resetCounters: (state: ParserState) => void;
11
- getState: (state: ParserState) => {
12
- runningCost: number;
13
- runningTurns: number;
14
- runningSessionId: string | undefined;
15
- lastAgentMessage: string | undefined;
16
- sawErrorEvent: boolean;
17
- };
18
- };
19
- //# sourceMappingURL=codex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAA8B,WAAW,EAAE,MAAM,YAAY,CAAC;AA6K3F,eAAO,MAAM,UAAU,EAAE,eAoKxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS;sBACJ,WAAW;2BACJ,WAAW;sBAChB,WAAW;;;;;;;CAU9B,CAAC"}