common-qa-mcp 0.2.0 → 0.3.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 (86) hide show
  1. package/README.md +6 -0
  2. package/dist/adapters/factory.d.ts +17 -7
  3. package/dist/adapters/factory.d.ts.map +1 -1
  4. package/dist/adapters/factory.js +61 -7
  5. package/dist/adapters/factory.js.map +1 -1
  6. package/dist/adapters/http.d.ts +50 -0
  7. package/dist/adapters/http.d.ts.map +1 -0
  8. package/dist/adapters/http.js +109 -0
  9. package/dist/adapters/http.js.map +1 -0
  10. package/dist/adapters/remoteMcp/adapter.d.ts +10 -1
  11. package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
  12. package/dist/adapters/remoteMcp/adapter.js +26 -3
  13. package/dist/adapters/remoteMcp/adapter.js.map +1 -1
  14. package/dist/adapters/simplifyqa/adapter.d.ts +154 -0
  15. package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -0
  16. package/dist/adapters/simplifyqa/adapter.js +1150 -0
  17. package/dist/adapters/simplifyqa/adapter.js.map +1 -0
  18. package/dist/adapters/simplifyqa/mapper.d.ts +63 -0
  19. package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -0
  20. package/dist/adapters/simplifyqa/mapper.js +409 -0
  21. package/dist/adapters/simplifyqa/mapper.js.map +1 -0
  22. package/dist/adapters/types.d.ts +48 -1
  23. package/dist/adapters/types.d.ts.map +1 -1
  24. package/dist/adapters/walnut/adapter.d.ts +231 -0
  25. package/dist/adapters/walnut/adapter.d.ts.map +1 -0
  26. package/dist/adapters/walnut/adapter.js +1083 -0
  27. package/dist/adapters/walnut/adapter.js.map +1 -0
  28. package/dist/adapters/walnut/mapper.d.ts +29 -9
  29. package/dist/adapters/walnut/mapper.d.ts.map +1 -1
  30. package/dist/adapters/walnut/mapper.js +136 -24
  31. package/dist/adapters/walnut/mapper.js.map +1 -1
  32. package/dist/config.d.ts +28 -14
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +37 -19
  35. package/dist/config.js.map +1 -1
  36. package/dist/connection.d.ts +3 -2
  37. package/dist/connection.d.ts.map +1 -1
  38. package/dist/connection.js +36 -15
  39. package/dist/connection.js.map +1 -1
  40. package/dist/domain/types.d.ts +195 -1
  41. package/dist/domain/types.d.ts.map +1 -1
  42. package/dist/drafts/store.d.ts +4 -1
  43. package/dist/drafts/store.d.ts.map +1 -1
  44. package/dist/drafts/store.js +7 -2
  45. package/dist/drafts/store.js.map +1 -1
  46. package/dist/initAgents.d.ts.map +1 -1
  47. package/dist/initAgents.js +29 -12
  48. package/dist/initAgents.js.map +1 -1
  49. package/dist/requestConnection.d.ts +5 -3
  50. package/dist/requestConnection.d.ts.map +1 -1
  51. package/dist/requestConnection.js +11 -5
  52. package/dist/requestConnection.js.map +1 -1
  53. package/dist/server.d.ts.map +1 -1
  54. package/dist/server.js +25 -1
  55. package/dist/server.js.map +1 -1
  56. package/dist/tools/connection.tools.js +5 -5
  57. package/dist/tools/connection.tools.js.map +1 -1
  58. package/dist/tools/discovery.tools.d.ts.map +1 -1
  59. package/dist/tools/discovery.tools.js +93 -1
  60. package/dist/tools/discovery.tools.js.map +1 -1
  61. package/dist/tools/formulas.tools.d.ts +7 -0
  62. package/dist/tools/formulas.tools.d.ts.map +1 -0
  63. package/dist/tools/formulas.tools.js +56 -0
  64. package/dist/tools/formulas.tools.js.map +1 -0
  65. package/dist/tools/heal.tools.d.ts +17 -0
  66. package/dist/tools/heal.tools.d.ts.map +1 -0
  67. package/dist/tools/heal.tools.js +76 -0
  68. package/dist/tools/heal.tools.js.map +1 -0
  69. package/dist/tools/recording.tools.d.ts.map +1 -1
  70. package/dist/tools/recording.tools.js +28 -7
  71. package/dist/tools/recording.tools.js.map +1 -1
  72. package/dist/tools/run.tools.d.ts.map +1 -1
  73. package/dist/tools/run.tools.js +378 -37
  74. package/dist/tools/run.tools.js.map +1 -1
  75. package/dist/tools/storySync.tools.d.ts +66 -0
  76. package/dist/tools/storySync.tools.d.ts.map +1 -0
  77. package/dist/tools/storySync.tools.js +213 -0
  78. package/dist/tools/storySync.tools.js.map +1 -0
  79. package/dist/tools/testcase.tools.d.ts.map +1 -1
  80. package/dist/tools/testcase.tools.js +17 -2
  81. package/dist/tools/testcase.tools.js.map +1 -1
  82. package/dist/tools/testdata.tools.d.ts +7 -0
  83. package/dist/tools/testdata.tools.d.ts.map +1 -0
  84. package/dist/tools/testdata.tools.js +161 -0
  85. package/dist/tools/testdata.tools.js.map +1 -0
  86. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import type { ActionDef, CloudRunner, DatasetInfo, EntityRef, EnvInfo, JournalOp, JournalView, MemberOp, ObjectQuery, ProjectSummary, QaObject, RunOptions, RunRef, RunStatus, RunTarget, SavedRef, Story, StoryQuery, StorySummary, Suite, SuiteSummary, TcQuery, TcSummary, TestCase } from '../domain/types.js';
1
+ import type { ActionDef, CloudRunner, DatasetInfo, DefaultIteration, Formula, FormulaCall, SaveGeneratedIterations, SaveGeneratedIterationsResult, EntityRef, EnvInfo, JournalOp, JournalView, LocalAgent, MemberOp, ModuleSummary, ObjectQuery, ProjectSummary, QaObject, ReleaseQuery, ReleaseSummary, SprintQuery, SprintSummary, RunOptions, RunRef, RunStatus, RunTarget, ScheduleAction, ScheduleInfo, ScheduleOptions, ScheduleRef, ScheduleUpdate, SavedRef, Story, StoryQuery, StorySummary, Suite, SuiteSummary, TcQuery, TcSummary, TestCase } from '../domain/types.js';
2
2
  export type ProjectInfo = {
3
3
  provider: 'walnut' | 'simplifyqa';
4
4
  projectId: string;
@@ -48,13 +48,37 @@ export interface ProviderAdapter {
48
48
  * Mongo _id or a US_/Jira business key. Optional: only products with a story backlog implement them. */
49
49
  listStories?(q: StoryQuery): Promise<StorySummary[]>;
50
50
  getStory?(id: string): Promise<Story>;
51
+ /** SimplifyQA-only: modules / folders in the test-case tree, so a draft can be filed under a
52
+ * chosen module on save. Absent on providers with no module tree (Walnut). */
53
+ listModules?(): Promise<ModuleSummary[]>;
54
+ /** RELEASES & SPRINTS — SimplifyQA project-management surface. `listReleases({scope})` returns
55
+ * releases for the current project (`scope:'project'`) or every release the token can see
56
+ * (`scope:'all'`); the tool ASKS the user which. `listSprints({releaseId?})` optionally filters
57
+ * by release. Absent on providers with no release/sprint model (Walnut). */
58
+ listReleases?(q: ReleaseQuery): Promise<ReleaseSummary[]>;
59
+ listSprints?(q: SprintQuery): Promise<SprintSummary[]>;
51
60
  startRun(target: RunTarget, opts: RunOptions): Promise<RunRef>;
61
+ /** Create a SCHEDULE (deferred / recurring run) instead of dispatching now. Optional: only products
62
+ * with a scheduler implement it; absence = "this provider cannot schedule runs". */
63
+ createSchedule?(target: RunTarget, opts: ScheduleOptions): Promise<ScheduleRef>;
64
+ /** List the project's schedules for management (find one to edit / cancel / delete). Optional. */
65
+ listSchedules?(): Promise<ScheduleInfo[]>;
66
+ /** Edit a schedule's cadence / time / browser / pinned agent. Optional. Reads the current
67
+ * update_version itself (optimistic concurrency), so the caller passes only what changes. */
68
+ updateSchedule?(scheduleId: string, changes: ScheduleUpdate): Promise<ScheduleRef>;
69
+ /** Pause / resume / cancel a schedule (reversible pause↔resume; cancel stops the pending/live run). */
70
+ controlSchedule?(scheduleId: string, action: ScheduleAction): Promise<ScheduleRef>;
71
+ /** Delete a schedule permanently (also tears down any live run it owns). Optional. */
72
+ deleteSchedule?(scheduleId: string): Promise<void>;
52
73
  /** Per-step results when terminal. */
53
74
  getRun(runId: string): Promise<RunStatus>;
54
75
  stopRun(runId: string): Promise<void>;
55
76
  /** Cloud runner VMs registered to the project, with online status. Optional: only products with a
56
77
  * cloud-execution fabric implement it; absence = "this provider has no cloud runners". */
57
78
  listCloudRunners?(): Promise<CloudRunner[]>;
79
+ /** LOCAL agents registered to the project, with online status. Optional: only products with a local
80
+ * agent fabric implement it; absence = "this provider has no local agents to pick". */
81
+ listLocalAgents?(): Promise<LocalAgent[]>;
58
82
  /** Passthrough for AGENT-BOUND tools (recording/browser) the Common MCP proxies rather than wraps.
59
83
  * Only the remote-MCP forwarder implements these; `unknown` is a CallToolResult (kept SDK-free
60
84
  * here). */
@@ -69,6 +93,29 @@ export interface ProviderAdapter {
69
93
  listEnvironments(): Promise<EnvInfo[]>;
70
94
  /** Walnut-first. */
71
95
  listDatasets?(tcId?: string): Promise<DatasetInfo[]>;
96
+ /** Fetch the default (template) iteration row for a testcase — the seed used by
97
+ * `tc_generate_testdata` to learn the paramId map and infer types. Forwards to the product MCP's
98
+ * `get_default_iteration` provider-op. Absent on providers without a testdata store. */
99
+ getDefaultIteration?(q: {
100
+ tcId: string;
101
+ versionId?: string;
102
+ environmentType?: string;
103
+ }): Promise<DefaultIteration>;
104
+ /** Persist N generated iteration rows for a testcase in one call. Forwards to the product MCP's
105
+ * `save_generated_iterations` provider-op (backed by `/tm/testdata/saveItrForDataGen`). */
106
+ saveGeneratedIterations?(payload: SaveGeneratedIterations): Promise<SaveGeneratedIterationsResult>;
107
+ /** List formulas the current project can use for testdata generation — DEFAULT prefabs (customer-
108
+ * wide) plus CUSTOM formulas (customer- or project-scoped). Powers `tc_list_formulas` and the
109
+ * per-column formula options that `tc_generate_testdata` accepts. Absent on providers with no
110
+ * formulas store. */
111
+ listFormulas?(): Promise<Formula[]>;
112
+ /** Evaluate one formula call via the product's compute endpoint. Returns the generated `value`
113
+ * string plus a canonical `expression` (`=NAME("a","b")`) suitable for stamping onto a testdata
114
+ * row cell's `formulaValue` — matching the format the UI persists. */
115
+ evaluateFormula?(call: FormulaCall): Promise<{
116
+ value: string;
117
+ expression: string;
118
+ }>;
72
119
  /** Full locator bag; needed by migration (§7A). */
73
120
  getObject?(id: string): Promise<QaObject>;
74
121
  /** Deep link into product UI. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,231 @@
1
+ import type { ConnectedQaConfig } from '../../config.js';
2
+ import type { MakeClientOptions } from '../http.js';
3
+ import type { ProjectInfo } from '../types.js';
4
+ import type { ActionDef, CloudRunner, EntityRef, JournalOp, JournalView, LocalAgent, MemberOp, ProjectSummary, RunOptions, RunRef, RunStatus, RunTarget, ScheduleAction, ScheduleInfo, ScheduleOptions, ScheduleRef, ScheduleUpdate, SavedRef, Story, StoryQuery, StorySummary, Suite, SuiteSummary, TcQuery, TcSummary, TestCase } from '../../domain/types.js';
5
+ /**
6
+ * Transport-only injection seam for tests: swap the underlying fetch implementation
7
+ * instead of mutating `globalThis`. The adapter still builds its own `QaHttp` via
8
+ * `makeClient` (so its real `headers()` logic always runs, jwt vs key mode included)
9
+ * -- only the network transport is replaceable.
10
+ */
11
+ export type WalnutTransport = Pick<MakeClientOptions, 'fetchImpl' | 'FormDataImpl' | 'BlobImpl'>;
12
+ /**
13
+ * WalnutAdapter — DIRECT-to-backend REST driver for Walnut (design note §3/§4). Every data op
14
+ * (discover / author / save / run-dispatch / triage) hits the Walnut backend REST directly via a
15
+ * `QaHttp` bound to `cfg.baseUrl` (the BACKEND base, `QA_BASE_URL`) — so a cloud editor with no local
16
+ * agent can drive the whole lifecycle. The ONLY agent-bound surface is recording + save-with-editor,
17
+ * which hops to the LOCAL AGENT's `/mcp` (`cfg.url`, `QA_MCP_URL`) via a lazily-built RemoteMcpAdapter
18
+ * (see `callRaw`/`listAgentTools`); when `cfg.url` is unset, recording is gracefully unavailable.
19
+ *
20
+ * This class deliberately does not `implements ProviderAdapter` — it ports only the direct-REST subset
21
+ * (journal, objects, environments, suite create/delete are out of scope here); the factory casts it,
22
+ * and no registered tool calls the unported methods.
23
+ */
24
+ export declare class WalnutAdapter {
25
+ private readonly cfg;
26
+ private readonly http;
27
+ /** Lazily-built hop to the LOCAL AGENT's /mcp (cfg.url) for the agent-bound recording surface. Only
28
+ * ever built when cfg.url is set; direct REST never uses it. */
29
+ private agentHop;
30
+ constructor(cfg: ConnectedQaConfig, transport?: WalnutTransport);
31
+ private headers;
32
+ /** Validates baseUrl+token+project (`GET /api/projects/:id`). */
33
+ info(): Promise<ProjectInfo>;
34
+ /** Projects visible to the token (`GET /api/projects`). Tolerant of both an array body and a
35
+ * `{ projects: [...] }` wrapper. */
36
+ listProjects(): Promise<ProjectSummary[]>;
37
+ listTestCases(q: TcQuery): Promise<TcSummary[]>;
38
+ /** Neutral, steps included. `id` accepts either a Mongo ObjectId or a `TC_xxx` business key. */
39
+ getTestCase(id: string): Promise<TestCase>;
40
+ /** List the project's test suites (`GET /api/test-suites`). `skip_filters=true` skips the faceted
41
+ * filter-metadata queries we don't need. Excludes ad-hoc suites server-side. `id` is the Mongo
42
+ * `_id` (what getSuite resolves by). */
43
+ listSuites(): Promise<SuiteSummary[]>;
44
+ /** Read one suite with its ordered members (`GET /api/test-suites/:id`). `id` is the Mongo `_id`
45
+ * (the route does NOT accept the `SU_` business key). */
46
+ getSuite(id: string): Promise<Suite>;
47
+ /** List the project's USER STORIES (`GET /api/stories?type=story`), for the story-driven authoring
48
+ * flow. `search` is a case-insensitive regex over key/title/description/AC (backend SEC-07 escaped).
49
+ * `id` on each row is the Mongo `_id` (what a test case links to via story_id). */
50
+ listStories(q: StoryQuery): Promise<StorySummary[]>;
51
+ /** Read one user story with its acceptance criteria. `GET /api/stories/:id` resolves by Mongo `_id`
52
+ * ONLY (no business-key route), so a `US_123`/Jira key is resolved first via the list `search`
53
+ * endpoint, matching key/walnut_key. */
54
+ getStory(id: string): Promise<Story>;
55
+ /** Resolve a story reference to its Mongo `_id`. A 24-hex id passes straight through; a business key
56
+ * (US_123 / an external Jira key) is looked up via `GET /api/stories?search=` and matched on
57
+ * key/walnut_key (there is no GET-by-key route). Throws a clear error when nothing matches. */
58
+ private resolveStoryMongoId;
59
+ /** Delete a test case (`DELETE /api/test-cases/:id`; recoverable via the product recycle bin). Like
60
+ * the update PUT, the route resolves ONLY by Mongo _id, so a business key is resolved first. */
61
+ deleteTestCase(id: string): Promise<void>;
62
+ /**
63
+ * Add / remove suite members (`PATCH /api/test-suites/:id/test-cases`, one action per call). The
64
+ * neutral op names a `tcId`, but the two backend actions speak different keys:
65
+ * • add → `testCaseIds[]` of MONGO _ids (the route casts them to ObjectId), so each tcId is
66
+ * resolved from a business key when needed. The backend appends with fresh instanceIds
67
+ * and rejects mixing test-case categories (manual vs automated) in one suite (409).
68
+ * • remove → a single `instanceId`. The suite stores instanceIds, not tcIds, so we map each
69
+ * requested tcId (business key OR Mongo _id) to the instanceId(s) it occupies in the
70
+ * CURRENT membership and remove each. Removing a tcId drops every instance of it.
71
+ * Returns the resulting neutral Suite. (reorder ops aren't surfaced as a tool; ignored here.)
72
+ */
73
+ updateSuiteMembers(id: string, ops: MemberOp[]): Promise<Suite>;
74
+ /**
75
+ * Persist a NEW test case (`POST /api/test-cases`). The body mirrors the product's create schema:
76
+ * the category field is `test_category` (NOT `category`); `status` defaults to 'draft' server-side
77
+ * so we omit it; steps go through `toWalnutStep`. project comes from the x-project-id header and
78
+ * the creator from the JWT, so neither is in the body.
79
+ *
80
+ * Two-step, exactly like the UI: create the test case (the backend auto-creates a dataset with a
81
+ * column per `${param}` token and an EMPTY datarow), then fill that datarow via the SAME
82
+ * /api/test-data endpoint the Test Data tab uses. This keeps web value-handling in the MCP (no
83
+ * backend change) — walnut stores web values as `${param}` + datarow, never inline on the step.
84
+ */
85
+ createTestCase(tc: TestCase): Promise<SavedRef>;
86
+ /**
87
+ * Populate the datarow(s) of the dataset Walnut auto-creates from a test case's `${param}` tokens
88
+ * — the same second step the UI's Test Data tab performs (create leaves the columns empty). Values
89
+ * are keyed by PARAM NAME (the `${...}` token), which is how walnut stores them
90
+ * (prepareRowValuesForDb). No dataset linked (the test case had no `${param}` tokens) → no-op.
91
+ * Writes every seeded row (the create route makes one per project environment), merging over
92
+ * whatever the row already holds so nothing existing is clobbered.
93
+ */
94
+ private writeDefaultTestData;
95
+ /** Update an EXISTING test case, full-document (`PUT /api/test-cases/:id`). Sends the neutral
96
+ * `version` for optimistic concurrency when present. */
97
+ updateTestCase(id: string, tc: TestCase): Promise<SavedRef>;
98
+ /** Neutral SavedRef from a create/update response, tolerant of the doc being bare or wrapped
99
+ * (`{ testCase }` / `{ data }`). Prefers the business id (`test_case_id`) for the deep link. */
100
+ private savedRefFrom;
101
+ /**
102
+ * The credential of the ONLINE local agent for this project — the SAME one the UI's Run modal
103
+ * dispatches to. Sourced from the live roster (`GET /api/agent-credentials/project-agents`). The
104
+ * roster reflects real Redis/heartbeat presence, so `is_online` always targets a live poller.
105
+ * Returns null when the acting user has no online agent, OR when the roster endpoint is unreachable
106
+ * (e.g. the `ai-agents` feature flag is off) — the caller then surfaces a clear "no local agent"
107
+ * error. (The agent's cached-credential fallback is agent-only and intentionally not ported here.)
108
+ */
109
+ private resolveLocalAgentCredential;
110
+ /**
111
+ * Persist recorded elements into the Object Repository so a saved test case is EXECUTABLE.
112
+ *
113
+ * A recorded step carries `objectRef.locators` (real captured selectors) but no `objectRef.id` —
114
+ * it's a NEW object not yet in the repository. Walnut binds a step to its element via `object_id`
115
+ * (a repository row); it does NOT store locators inline on the step. So without this, the save
116
+ * drops every locator (object_id stays null) and the test case can't find its elements at run time.
117
+ *
118
+ * For each such step we POST /api/objects (description = the element name, attributes = the recorded
119
+ * locators verbatim — the executor reads them by name: `playwright` primary, `xpath_*` fallbacks)
120
+ * and stamp the returned `_id` onto `objectRef.id` so `toWalnutStep` then emits `object_id`. Runs
121
+ * BEFORE the test-case create, so a failure aborts cleanly with nothing half-saved (any objects
122
+ * already minted are just unlinked repository rows).
123
+ */
124
+ private ensureRecordedObjects;
125
+ /** A neutral tcId may be a business key (`TC_123`) or a Mongo `_id`; the executions API wants the
126
+ * `_id`. 24-hex → pass through; otherwise resolve via the test-case read. */
127
+ private resolveTestcaseMongoId;
128
+ /**
129
+ * Start a run of ONE test case (`POST /api/executions/reserve`; reserve-first is the only path for
130
+ * cloud, and the modern path for local). mode:'local' dispatches to THIS agent's own queue (its
131
+ * cached agent credential); mode:'cloud' dispatches to the chosen online cloud runner. The backend
132
+ * mints the execution + enqueues; per-step driving happens on the agent/runner. `environment` is
133
+ * used only when it is already a Mongo id — otherwise the backend applies the project default env.
134
+ */
135
+ startRun(target: RunTarget, opts: RunOptions): Promise<RunRef>;
136
+ /**
137
+ * Start a SUITE run (`POST /api/executions/reserve` in suite mode — `testcase_ids[]` present).
138
+ * Fetches the suite's ordered members to build the parallel `testcase_ids`/`instance_ids` the
139
+ * reserve expects, then dispatches: mode:'local' → THIS agent's own queue (its online credential,
140
+ * which the backend requires for a local suite); mode:'cloud' → the chosen/auto-picked online
141
+ * runner. Returns the suite-run id (`SR_xxx`) as runId — getRun/stopRun route it back to the suite
142
+ * endpoints by that prefix.
143
+ */
144
+ private startSuiteRun;
145
+ /**
146
+ * Create a SCHEDULE — a deferred / recurring run — instead of dispatching now (`POST /api/schedules`,
147
+ * the same route the Scheduler UI uses). Maps the neutral target + ScheduleOptions to the backend's
148
+ * createScheduleSchema: schedule_target ('test_case' when a tcId is given, else 'suite'); tc_id /
149
+ * suite_id (the backend resolves a tc_id business key OR _id, but a suite_id must be a Mongo _id);
150
+ * execution_target ('local' | 'cloud_runner' from opts.mode); assigned_agent_credential_id (the
151
+ * picked local agent for local, or the picked cloud runner for cloud — omit to let the backend
152
+ * auto-pick a VM); scheduled_for (REQUIRED ISO); schedule_type (default 'once'); end_date; timezone
153
+ * (default 'UTC'); environment_id (only when a 24-hex id, mirroring startRun). MANUAL test cases are
154
+ * rejected server-side (MANUAL_NOT_SCHEDULABLE_CODE); unwrapApiError surfaces that message verbatim.
155
+ */
156
+ createSchedule(target: RunTarget, opts: ScheduleOptions): Promise<ScheduleRef>;
157
+ /** Map one raw schedule row (`GET /api/schedules`) to a neutral ScheduleInfo — human target + cadence
158
+ * + status + pinned agent NAME (never the credential_id) + the update_version an edit must echo. */
159
+ private toScheduleInfo;
160
+ /** List the project's schedules for management (`GET /api/schedules`). */
161
+ listSchedules(): Promise<ScheduleInfo[]>;
162
+ /** Fetch one raw schedule row (via the list) — needed for its update_version before an edit. */
163
+ private fetchScheduleRaw;
164
+ /** Edit a schedule (`PUT /api/schedules/:id`). Reads the current update_version itself (optimistic
165
+ * concurrency) so the caller passes only what changes. Re-pins via mode+agentId (local → also sets
166
+ * execution_mode:'manual') or mode+cloudRunnerCredentialId (cloud), mirroring createSchedule. */
167
+ updateSchedule(scheduleId: string, changes: ScheduleUpdate): Promise<ScheduleRef>;
168
+ /** Pause / resume / cancel a schedule. pause→`POST /:id/pause`, resume→`POST /:id/resume`,
169
+ * cancel→`PATCH /:id/cancel` (all bodyless). */
170
+ controlSchedule(scheduleId: string, action: ScheduleAction): Promise<ScheduleRef>;
171
+ /** Delete a schedule permanently (`DELETE /api/schedules/:id`; the backend also tears down any live run). */
172
+ deleteSchedule(scheduleId: string): Promise<void>;
173
+ /** Neutral status of a run (`GET /api/executions/:id`, id = Mongo `_id`). Progress is derived from
174
+ * the per-status step counters; a UI deep link stands in for a report URL. */
175
+ getRun(runId: string): Promise<RunStatus>;
176
+ /** Neutral status of a SUITE run (`GET /api/executions/suite/:suiteRunId/summary`). `progress`
177
+ * counts TEST CASES (not steps); `children` is the per-testcase rollup. A 404 right after reserve
178
+ * (child execution docs not materialized yet) reads as 'queued', not an error. No reportUrl: the
179
+ * `/reports/:id` deep link is keyed by a single execution's Mongo id, not a suite-run `SR_` id. */
180
+ private getSuiteRun;
181
+ /** Signal a running execution to stop. Suite runs (`SR_...`) stop via the suite endpoint
182
+ * (`POST /api/executions/suite/:id/stop`); single executions via `POST /api/executions/:id/stop`.
183
+ * No body either way. */
184
+ stopRun(runId: string): Promise<void>;
185
+ /** Cloud runner VMs registered to the project + live online status
186
+ * (`GET /api/compute-configs/runners?live=1`). `online` already folds status online|busy. */
187
+ listCloudRunners(): Promise<CloudRunner[]>;
188
+ /**
189
+ * LOCAL agents registered to the project + live online status
190
+ * (`GET /api/agent-credentials/project-agents`) — the same live roster resolveLocalAgentCredential
191
+ * reads, exposed so a client can list + pick an agent (`id` = credential_id) before a LOCAL run.
192
+ * A shared project lists EVERY member's agent; `owner`/`online` let the user pick the right one.
193
+ */
194
+ listLocalAgents(): Promise<LocalAgent[]>;
195
+ /**
196
+ * Valid action vocabulary per technology. android/api/database/mainframe always
197
+ * come from the static `WALNUT_ACTIONS` (there is no live/per-org source for
198
+ * them); `web` is replaced by the live per-org `GET /api/actions` catalog when
199
+ * that call succeeds and returns at least one action, else falls back to the
200
+ * static list. No retry, no caching.
201
+ */
202
+ actionsCatalog(platform?: string): Promise<ActionDef[]>;
203
+ /** The internal hop to the local agent's /mcp, built lazily and ONLY when cfg.url is set. */
204
+ private hop;
205
+ /** The local agent's advertised tools (web/mainframe/…), mirrored so the recording passthrough can
206
+ * register them. No agent configured (cloud editor) → `[]`, so no recording tools get registered
207
+ * and recording is gracefully unavailable. */
208
+ listAgentTools(): Promise<Array<{
209
+ name: string;
210
+ description?: string;
211
+ inputSchema?: Record<string, unknown>;
212
+ }>>;
213
+ /** Forward an agent-bound tool call (recording) to the local agent's /mcp. Without a configured
214
+ * agent /mcp (cloud editor) there is nothing to forward to, so this fails with a clear instruction. */
215
+ callRaw(name: string, args: Record<string, unknown>): Promise<unknown>;
216
+ readJournal(tcId: string): Promise<JournalView>;
217
+ editJournal(tcId: string, ops: JournalOp[]): Promise<JournalView>;
218
+ /** Deep link into the product UI (e.g. `/test-cases/:id`, `/reports/:id`). These routes are served
219
+ * by walnut-frontend, NOT the API host, so this must use the FRONTEND origin. */
220
+ productUrlFor(entity: EntityRef): string;
221
+ /** Frontend origin for deep links, resolved (and trailing-slash-trimmed) as:
222
+ * 1. `walnutUiOrigin` (env `QA_MCP_WALNUT_UI`) -- the explicit override; point it at the local
223
+ * frontend dev server now, and the deployed frontend once shipped.
224
+ * 2. else the BACKEND base (`cfg.baseUrl` / `QA_BASE_URL`) with a trailing `/api` stripped --
225
+ * correct for a single-host deploy (https://app.walnutai.ai/api -> https://app.walnutai.ai), so
226
+ * production Just Works with no override. A split local dev host (backend :8080, Vite :5173)
227
+ * can't be derived, so it needs (1). NOTE: derived from `baseUrl`, NOT `cfg.url` — `cfg.url` is
228
+ * now the agent /mcp endpoint, not a web origin. */
229
+ private resolveUiOrigin;
230
+ }
231
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/walnut/adapter.ts"],"names":[],"mappings":"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"}