common-qa-mcp 0.3.0 → 0.4.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 (83) hide show
  1. package/dist/adapters/factory.d.ts +1 -1
  2. package/dist/adapters/factory.d.ts.map +1 -1
  3. package/dist/adapters/factory.js +12 -29
  4. package/dist/adapters/factory.js.map +1 -1
  5. package/dist/adapters/http.js +2 -3
  6. package/dist/adapters/http.js.map +1 -1
  7. package/dist/adapters/remoteMcp/adapter.d.ts +7 -2
  8. package/dist/adapters/remoteMcp/adapter.d.ts.map +1 -1
  9. package/dist/adapters/remoteMcp/adapter.js +9 -3
  10. package/dist/adapters/remoteMcp/adapter.js.map +1 -1
  11. package/dist/adapters/simplifyqa/adapter.d.ts +306 -23
  12. package/dist/adapters/simplifyqa/adapter.d.ts.map +1 -1
  13. package/dist/adapters/simplifyqa/adapter.js +2033 -86
  14. package/dist/adapters/simplifyqa/adapter.js.map +1 -1
  15. package/dist/adapters/simplifyqa/mapper.d.ts +43 -11
  16. package/dist/adapters/simplifyqa/mapper.d.ts.map +1 -1
  17. package/dist/adapters/simplifyqa/mapper.js +470 -21
  18. package/dist/adapters/simplifyqa/mapper.js.map +1 -1
  19. package/dist/adapters/types.d.ts +121 -5
  20. package/dist/adapters/types.d.ts.map +1 -1
  21. package/dist/adapters/walnut/adapter.d.ts +6 -2
  22. package/dist/adapters/walnut/adapter.d.ts.map +1 -1
  23. package/dist/adapters/walnut/adapter.js +33 -2
  24. package/dist/adapters/walnut/adapter.js.map +1 -1
  25. package/dist/adapters/walnut/mapper.d.ts +2 -1
  26. package/dist/adapters/walnut/mapper.d.ts.map +1 -1
  27. package/dist/adapters/walnut/mapper.js +13 -0
  28. package/dist/adapters/walnut/mapper.js.map +1 -1
  29. package/dist/config.d.ts +10 -0
  30. package/dist/config.d.ts.map +1 -1
  31. package/dist/config.js +36 -0
  32. package/dist/config.js.map +1 -1
  33. package/dist/connection.d.ts.map +1 -1
  34. package/dist/connection.js +15 -7
  35. package/dist/connection.js.map +1 -1
  36. package/dist/domain/types.d.ts +485 -4
  37. package/dist/domain/types.d.ts.map +1 -1
  38. package/dist/initAgents.d.ts.map +1 -1
  39. package/dist/initAgents.js +22 -9
  40. package/dist/initAgents.js.map +1 -1
  41. package/dist/server.d.ts.map +1 -1
  42. package/dist/server.js +23 -1
  43. package/dist/server.js.map +1 -1
  44. package/dist/tools/backlog.tools.d.ts +13 -0
  45. package/dist/tools/backlog.tools.d.ts.map +1 -0
  46. package/dist/tools/backlog.tools.js +399 -0
  47. package/dist/tools/backlog.tools.js.map +1 -0
  48. package/dist/tools/defects.tools.d.ts +7 -0
  49. package/dist/tools/defects.tools.d.ts.map +1 -0
  50. package/dist/tools/defects.tools.js +82 -0
  51. package/dist/tools/defects.tools.js.map +1 -0
  52. package/dist/tools/discovery.tools.d.ts.map +1 -1
  53. package/dist/tools/discovery.tools.js +871 -55
  54. package/dist/tools/discovery.tools.js.map +1 -1
  55. package/dist/tools/markdown.d.ts +3 -3
  56. package/dist/tools/markdown.d.ts.map +1 -1
  57. package/dist/tools/markdown.js +89 -18
  58. package/dist/tools/markdown.js.map +1 -1
  59. package/dist/tools/objects.tools.d.ts +7 -0
  60. package/dist/tools/objects.tools.d.ts.map +1 -0
  61. package/dist/tools/objects.tools.js +201 -0
  62. package/dist/tools/objects.tools.js.map +1 -0
  63. package/dist/tools/recording.tools.d.ts.map +1 -1
  64. package/dist/tools/recording.tools.js +64 -5
  65. package/dist/tools/recording.tools.js.map +1 -1
  66. package/dist/tools/run.tools.d.ts.map +1 -1
  67. package/dist/tools/run.tools.js +102 -18
  68. package/dist/tools/run.tools.js.map +1 -1
  69. package/dist/tools/schemas.d.ts +21 -4
  70. package/dist/tools/schemas.d.ts.map +1 -1
  71. package/dist/tools/schemas.js +14 -1
  72. package/dist/tools/schemas.js.map +1 -1
  73. package/dist/tools/tasks.tools.d.ts +7 -0
  74. package/dist/tools/tasks.tools.d.ts.map +1 -0
  75. package/dist/tools/tasks.tools.js +75 -0
  76. package/dist/tools/tasks.tools.js.map +1 -0
  77. package/dist/tools/testcase.tools.d.ts.map +1 -1
  78. package/dist/tools/testcase.tools.js +146 -100
  79. package/dist/tools/testcase.tools.js.map +1 -1
  80. package/dist/tools/testdata.tools.d.ts.map +1 -1
  81. package/dist/tools/testdata.tools.js +99 -11
  82. package/dist/tools/testdata.tools.js.map +1 -1
  83. package/package.json +3 -3
@@ -1,13 +1,13 @@
1
1
  import type { ConnectedQaConfig } from '../../config.js';
2
2
  import type { MakeClientOptions } from '../http.js';
3
- import type { ProjectInfo } from '../types.js';
4
- import type { ActionDef, CloudRunner, DatasetInfo, DefaultIteration, EntityRef, EnvInfo, Formula, FormulaCall, JournalOp, JournalView, LocalAgent, MemberOp, ModuleSummary, ObjectQuery, ProjectSummary, QaObject, ReleaseQuery, ReleaseSummary, RunOptions, RunRef, RunStatus, RunTarget, SaveGeneratedIterations, SaveGeneratedIterationsResult, SavedRef, SprintQuery, SprintSummary, Story, StoryQuery, StorySummary, Suite, SuiteSummary, TcQuery, TcSummary, TestCase } from '../../domain/types.js';
3
+ import type { ListResult, ProjectInfo } from '../types.js';
4
+ import type { ActionDef, CloudRunner, DatasetInfo, DefaultIteration, DefectQuery, DefectSummary, EntityRef, EnvInfo, Epic, EpicInput, EpicQuery, EpicSummary, EpicUpdate, Feature, FeatureInput, FeatureQuery, FeatureSummary, FeatureUpdate, Formula, FormulaCall, FunctionQuery, FunctionSummary, QaFunction, JournalOp, JournalView, LocalAgent, Locator, MemberOp, ModuleCreateInput, ModuleDeleteResult, ModuleDetail, ModuleSummary, ObjectQuery, ProjectSummary, QaObject, ReleaseQuery, ReleaseSummary, RunOptions, RunRef, RunStatus, RunTarget, SaveGeneratedIterations, SaveGeneratedIterationsResult, SavedRef, SprintQuery, SprintSummary, Story, StoryInput, StoryQuery, StorySummary, StoryUpdate, Suite, SuiteSummary, TaskQuery, TaskSummary, TcQuery, TcSummary, TestCase, UserQuery, UserSummary, VersionDeleteInput, VersionDeleteResult } from '../../domain/types.js';
5
5
  /** Test seam identical to WalnutAdapter's — swap transport, keep real headers. */
6
6
  export type SimplifyQaTransport = Pick<MakeClientOptions, 'fetchImpl' | 'FormDataImpl' | 'BlobImpl'>;
7
7
  /**
8
8
  * SimplifyQaAdapter — DIRECT-to-backend REST driver for SimplifyQA, mirroring WalnutAdapter's
9
9
  * design. Reads (list/get for projects/testcases/suites/stories/modules/releases/sprints/objects)
10
- * hit the SQA TM backend REST directly via a `QaHttp` bound to `cfg.baseUrl`. Anything not yet
10
+ * hit the SimplifyQA backend REST directly via a `QaHttp` bound to `cfg.baseUrl`. Anything not yet
11
11
  * ported (writes, testdata, run dispatch, marketplace, and the recording surface) delegates to
12
12
  * the LOCAL AGENT's `/mcp` (`cfg.url`) via a lazily-built RemoteMcpAdapter — same "graceful hop"
13
13
  * pattern walnut uses for recording. When the hop is not configured, unported ops surface a clear
@@ -27,25 +27,114 @@ export declare class SimplifyQaAdapter {
27
27
  private requireProjectId;
28
28
  private searchBody;
29
29
  /** Validates baseUrl + token + (optional) project by running the same list_projects search the
30
- * Java `infoResult` uses to resolve the project name — no separate /info endpoint on SQA. */
30
+ * Java `infoResult` uses to resolve the project name — no separate /info endpoint on SQA.
31
+ * `counts` is a best-effort row count per entity type (test cases/suites/stories/objects), read
32
+ * from each `/search` endpoint's own `totalCount` (see searchTotalCount) — mirrors what Walnut's
33
+ * info() already returns via its own `counts`. */
31
34
  info(): Promise<ProjectInfo>;
32
- /** `POST /pm/project/search` — projects the token can see. NOT project-scoped. */
33
- listProjects(): Promise<ProjectSummary[]>;
34
- listTestCases(q: TcQuery): Promise<TcSummary[]>;
35
- /** Neutral test case, steps included. Accepts numeric id or business code (`TC_123`). */
36
- getTestCase(id: string): Promise<TestCase>;
35
+ /** Projects the caller can access. Three code paths in priority order:
36
+ *
37
+ * 1. Config-supplied `QA_MCP_USER_ID` (needed for API-key auth — SQA keys are encrypted JWTs
38
+ * with no client-decryptable userId, and no whoami endpoint exists yet) → user-scoped
39
+ * two-step via `/pm/projectuserrole`.
40
+ * 2. Session JWT with `userId` claim → same two-step.
41
+ * 3. Neither → direct `/pm/project/search`; the backend scopes by the token owner where it
42
+ * can (may return tenant-wide for API keys). `totalCount` uses `rows.length` (backend's
43
+ * top-level `totalCount` is unreliable — counts pre-filter, includes deleted).
44
+ *
45
+ * The two-step avoids both problems: correct user scoping AND an accurate count. */
46
+ listProjects(): Promise<ListResult<ProjectSummary>>;
47
+ private listProjectsForUser;
48
+ /** Best-effort row count for an entity `/search` endpoint — posts a minimal (limit 1) project-scoped
49
+ * search and reads the `totalCount` the backend returns alongside `data` (the same envelope shape
50
+ * every /search endpoint in this codebase uses, confirmed via the real sqa-ui
51
+ * `{ totalCount: number, data: [...] }` response typing). Never throws — counts are a nice-to-have
52
+ * for project_info, not worth failing the whole call over; any failure (or a missing totalCount)
53
+ * falls back to 0 / the returned row count. */
54
+ private searchTotalCount;
55
+ private listProjectsDirect;
56
+ /** Decode the `userId` claim from the SQA JWT payload WITHOUT verifying the signature. Backend
57
+ * re-verifies on every call; this only needs the id for `/pm/projectuserrole`. Returns undefined
58
+ * on any parse failure or when the token isn't a JWT. */
59
+ private jwtUserId;
60
+ listTestCases(q: TcQuery): Promise<ListResult<TcSummary>>;
61
+ /** "me" → cfg.userId (numeric); numeric string → number; anything else → undefined. Callers
62
+ * should have resolved a name to a numeric id via `list_users` first. */
63
+ private resolveUserFilter;
64
+ /** Neutral test case, steps included. Accepts numeric id or business code (`TC_123`).
65
+ * `versionId` overrides which version's steps to load — omit to accept the TC's currently-
66
+ * selected version. When the resolved version differs from the doc's current selection, we
67
+ * also patch `currentVersionId` on the returned tc so callers can render "showing version X". */
68
+ getTestCase(id: string, versionId?: string): Promise<TestCase>;
37
69
  private fetchRawTestcase;
38
70
  private fetchStepsCollection;
39
- listSuites(): Promise<SuiteSummary[]>;
71
+ /** For every FUNCTION step, resolve the referenced function's code + name via /tm/function search
72
+ * (batched by distinct functionId). Mutates `tc.steps[i].functionCall` in place with
73
+ * `testCaseCode`/`testCaseName`. Non-fatal on failure — the raw id still renders. Mirrors the
74
+ * Excel export builder in tcfn.service.js:2696-2703. */
75
+ private hydrateFunctionNames;
76
+ /** For every step with an objectRef, resolve the object's display name (`disname`) via
77
+ * /tm/object/search (batched by distinct objectId). Mutates `objectRef.name` in place. Non-fatal
78
+ * on failure — the bare id still renders. Mirrors the FE's `defaultFieldsMap.get('objectId').map`
79
+ * behavior used by the Excel export (tcfn.service.js:2876) so the tool surface matches the UI. */
80
+ private hydrateObjectNames;
81
+ listSuites(): Promise<ListResult<SuiteSummary>>;
40
82
  getSuite(id: string): Promise<Suite>;
41
- listStories(q: StoryQuery): Promise<StorySummary[]>;
83
+ listStories(q: StoryQuery): Promise<ListResult<StorySummary>>;
42
84
  getStory(id: string): Promise<Story>;
43
85
  /** A US_XXX business key → the numeric userstoryId via `/pm/userstory/search`. Numeric passes
44
86
  * through. SQA's GET-by-id parseInts the path, so a raw key would 404. */
45
87
  private resolveStoryNumericId;
46
- listModules(): Promise<ModuleSummary[]>;
47
- listReleases(q: ReleaseQuery): Promise<ReleaseSummary[]>;
48
- listSprints(q: SprintQuery): Promise<SprintSummary[]>;
88
+ /** `POST /pm/defect/search` — same searchFields protocol as userstory/testcase search. */
89
+ listDefects(q: DefectQuery): Promise<ListResult<DefectSummary>>;
90
+ /** `POST /pm/task/search` — same searchFields protocol as defect/userstory search. */
91
+ listTasks(q: TaskQuery): Promise<ListResult<TaskSummary>>;
92
+ createStory(input: StoryInput): Promise<SavedRef>;
93
+ updateStory(id: string, patch: StoryUpdate): Promise<SavedRef>;
94
+ listEpics(q: EpicQuery): Promise<ListResult<EpicSummary>>;
95
+ getEpic(id: string): Promise<Epic>;
96
+ createEpic(input: EpicInput): Promise<SavedRef>;
97
+ updateEpic(id: string, patch: EpicUpdate): Promise<SavedRef>;
98
+ /** EP_XXX business key → numeric epic id via `/pm/epic/search`. Numeric passes through. */
99
+ private resolveEpicNumericId;
100
+ listFeatures(q: FeatureQuery): Promise<ListResult<FeatureSummary>>;
101
+ getFeature(id: string): Promise<Feature>;
102
+ createFeature(input: FeatureInput): Promise<SavedRef>;
103
+ updateFeature(id: string, patch: FeatureUpdate): Promise<SavedRef>;
104
+ /** FT_XXX business key → numeric feature id via `/pm/feature/search`. Numeric passes through. */
105
+ private resolveFeatureNumericId;
106
+ listModules(): Promise<ListResult<ModuleSummary>>;
107
+ /** GET /pm/module/:id — server returns an array; empty array → NotFound. */
108
+ getModule(id: string): Promise<ModuleDetail>;
109
+ /** POST /pm/module — server validates: name+isRoot+projectId required; parentId ignored when
110
+ * isRoot:true. Duplicate name per project is rejected server-side. */
111
+ createModule(input: ModuleCreateInput): Promise<SavedRef>;
112
+ /** PATCH /pm/module — two-phase per module.controller.js:94. `confirm:false` returns the per-id
113
+ * dependency footprint (test cases, functions, params, objects, defects, user stories). `confirm:true`
114
+ * triggers the actual delete: server drops only ids with EMPTY dependencies; ids with references are
115
+ * silently skipped — we still return that list so the caller can act on it.
116
+ * ponytail: one method, `confirm` flag; mirrors the backend's two-call contract. */
117
+ deleteModule(input: {
118
+ ids: string[];
119
+ projectId: string;
120
+ confirm?: boolean;
121
+ }): Promise<ModuleDeleteResult>;
122
+ /** PUT /tm/tcfnversion/delete — soft-delete ONE version of a TC or FN. Two-phase per
123
+ * tcfnversion.service.js:30 — `isDelete:false` (or `isDelete:true` with non-empty deps) →
124
+ * returns the dependency array unchanged; `isDelete:true` with EMPTY deps → soft-deletes the
125
+ * tcfn_version row + its steps + testdata + testdata iterations.
126
+ *
127
+ * ponytail: one method, `confirm` flag. Response shape decides `deleted`: if every dep row is
128
+ * fully empty (all `*Arr` are `{}` maps), the server actually deleted; otherwise it refused
129
+ * and just handed back the deps. We do not assume — we inspect. */
130
+ deleteVersion(input: VersionDeleteInput): Promise<VersionDeleteResult>;
131
+ listReleases(q: ReleaseQuery): Promise<ListResult<ReleaseSummary>>;
132
+ listSprints(q: SprintQuery): Promise<ListResult<SprintSummary>>;
133
+ /** POST /pm/users/search — the customer's users (router mounted at `/pm/users`, plural — see
134
+ * project-management/express-app.js:181). Backend auto-scopes non-admin callers to users in
135
+ * their assigned projects. Optional `projectId` narrows to that project's members; optional
136
+ * `search` is a case-insensitive regex over `name`. */
137
+ listUsers(q: UserQuery): Promise<ListResult<UserSummary>>;
49
138
  getObject(id: string): Promise<QaObject>;
50
139
  productUrlFor(entity: EntityRef): string;
51
140
  private hop;
@@ -60,18 +149,154 @@ export declare class SimplifyQaAdapter {
60
149
  /** Forward a recording-tool call to the agent /mcp. Same behavior as walnut. */
61
150
  callRaw(name: string, args: Record<string, unknown>): Promise<unknown>;
62
151
  /** Two-step create: (1) resolve every `${name}` token in the steps to a project-scoped parameter id
63
- * (get-or-create), (2) POST /tm/testcase multipart with the assembled `testcaseObj`. */
152
+ * (get-or-create) plus, for AUTOMATION, each step's actionId + objectId, (2) POST /tm/testcase
153
+ * multipart with the assembled `testcaseObj`. */
64
154
  createTestCase(tc: TestCase): Promise<SavedRef>;
65
- /** Same shape as create, but with `tcfnObj.id` set and operation:'UPDATE'. */
155
+ /** Same shape as create, but with `tcfnObj.id` set. */
66
156
  updateTestCase(id: string, tc: TestCase): Promise<SavedRef>;
67
- /** Soft-delete (recoverable via recycle bin). `isDelete:true` = delete; `false` = restore. */
157
+ /** Snapshot the CURRENT server state of a testcase under a NEW version name — same TC id,
158
+ * new `tcfn_version` row with cloned steps. Backed by `PUT /tm/testcase` with
159
+ * `operation:"SAVENEWVERSION"` (see tcfn.service.js:115/242/355 for the branches). The steps
160
+ * we fetch from the collection are re-POSTed with their `id` stripped so the backend inserts
161
+ * fresh rows attached to the new version. When `tdCopy` is true, the source version's
162
+ * testdata iterations are cloned across environments via `verData.selVersionId`.
163
+ *
164
+ * Not a mapper roundtrip: we resend the raw tcfnObj/steps we just fetched, so any fields the
165
+ * neutral `TestCase` type doesn't carry (custom fields, mailers, exec platform, ...) are
166
+ * preserved verbatim — the point of a version is "freeze what's there now". */
167
+ saveAsNewVersion(id: string, opts: {
168
+ versionName: string;
169
+ tdCopy?: boolean;
170
+ sourceVersionId?: string;
171
+ }): Promise<SavedRef>;
172
+ /** STEPSTOFN — mirrors the FE "Save as function" flow (create-new-fn-modal.component.ts:88-197):
173
+ * pick a subset of the TC's steps, retype to FN, POST /tm/function multipart with the
174
+ * `functionObj` payload. Backend re-assigns step ids/versionId under the newly created FN version.
175
+ *
176
+ * ponytail: file attachments (STEP_ATTACMENTS / STEP_COMAPAREFILES multipart entries) are NOT
177
+ * forwarded — MCP callers don't ship blobs. Add if a real caller needs them.
178
+ * ponytail: sub-step flattening (FE lines 124-127) is skipped — `/tm/testcase/steps` returns
179
+ * flat top-level rows; nested FN expansions aren't in that read. Handle if that changes. */
180
+ saveStepsAsFunction(tcId: string, opts: {
181
+ stepSeqs: number[];
182
+ name: string;
183
+ moduleId: number;
184
+ copyTestData?: boolean;
185
+ executionType?: 'AUTOMATION' | 'MANUAL';
186
+ }): Promise<SavedRef>;
187
+ /** Look up the freshly-created FN's version id — STEPSTOFN's response inlines the FN but not its
188
+ * version, and the replace-in-TC step needs `fnVersionId`. Mirrors the FE
189
+ * (`create-new-fn-modal.component.ts:getFnVersion`): search `tcfnversion` by parentType=FN
190
+ * ordered by createdAt asc, take the first. */
191
+ private fetchFnVersionId;
192
+ /** Second half of extract-to-function-and-replace-in-source (FE
193
+ * `testcase.component.ts:createNewFns → onSave`): after the FN exists, PUT the source TC with the
194
+ * extracted step rows marked `deleted:true` and a synthetic FUNCTION + FUNCTION_END pair inserted
195
+ * at the first extracted position. The backend automatically:
196
+ * - drops testdata columns for params only the deleted steps referenced (allParameters skips
197
+ * `step.deleted:true` at tcfn.service.js:411)
198
+ * - injects a per-env FN cell into every TC iteration row using the FN's default iteration
199
+ * (tcfn.service.js:1032-1085) — so testdata rewiring is free.
200
+ *
201
+ * ponytail: refuses DUO / SYNCON test cases and picks that span control-flow or nested FN
202
+ * brackets. Those cases (v2) need parallel mirroring into the other execution-type array and
203
+ * bracket-aware validation — out of scope for the first pass. */
204
+ replaceStepsWithFunctionCall(tcId: string, opts: {
205
+ extractedSeqs: number[];
206
+ functionId: string;
207
+ fnVersionId: string;
208
+ fnModuleId: number;
209
+ technologyType: string;
210
+ }): Promise<SavedRef>;
211
+ /** One-shot extract-to-function-and-replace. Chains STEPSTOFN → fetch fn version id → replace in
212
+ * source TC. If step 2 or 3 fails after step 1 succeeded, the caller sees the fn id in the error
213
+ * so they can retry or clean up the phantom function. */
214
+ extractStepsAsFunctionAndReplace(tcId: string, opts: {
215
+ stepSeqs: number[];
216
+ name: string;
217
+ moduleId: number;
218
+ copyTestData?: boolean;
219
+ executionType?: 'AUTOMATION' | 'MANUAL';
220
+ }): Promise<SavedRef & {
221
+ fnId: string;
222
+ fnVersionId: string;
223
+ }>;
224
+ /** Soft-delete. `/tm/testcase/delete` returns HTTP 200 either way — its `data` is `true` on real
225
+ * delete, or an array of dependency records when the TC is still referenced by a defect, suite,
226
+ * execution plan, scenario, workflow, pipeline, or scheduler (nothing was deleted). Inspect the
227
+ * shape and throw so the tool surfaces it as a failure instead of a fake success. */
68
228
  deleteTestCase(id: string): Promise<void>;
229
+ /** Clone a testcase in place (same project + module) with all steps, versions, testdata,
230
+ * parameters, object refs, and nested function calls carried over. Backed by the SQA native
231
+ * `/tm/tcfnCopy/copytc` endpoint (see test-management/src/controllers/tcfnCopy.controller.js).
232
+ *
233
+ * Requires the `copy_testcase_across_project` privilege on the current project — enforced
234
+ * server-side regardless of whether the copy is in-project or across projects.
235
+ *
236
+ * When `newTitle` is omitted the backend auto-names the copy as `{sourceName}_copy1`,
237
+ * `_copy2`, etc. When provided, a follow-up PUT renames the freshly-created TC to that name.
238
+ *
239
+ * IMPORTANT — the copy endpoint's `selversions` and `selectedEnv` fields are FILTERS, not
240
+ * wildcards. Passing empty arrays makes the backend copy the TC shell only (no steps, no
241
+ * testdata, since both live under versions and per-env iterations). So we fetch the source
242
+ * TC's version names AND the project's environment names first and pass them explicitly. */
243
+ cloneTestCase(id: string, newTitle?: string, versions?: string[]): Promise<SavedRef>;
244
+ listFunctions(q: FunctionQuery): Promise<ListResult<FunctionSummary>>;
245
+ getFunction(id: string): Promise<QaFunction>;
246
+ /** Steps for one FN version. Unlike TC docs, the FN doc from `/tm/function/:id/:projectId`
247
+ * doesn't carry a versionId inline — callers resolve the target versionId (usually the newest,
248
+ * from `fetchFunctionVersionRows`) and pass it here. */
249
+ private fetchFunctionStepsForVersion;
250
+ /** The function's version rows, newest-first. */
251
+ private fetchFunctionVersionRows;
252
+ /** Soft-delete a function. `/tm/function/delete` returns HTTP 200 either way — its `data` is
253
+ * `true` on real delete, or an array of dependency records when the FN is still referenced by a
254
+ * TC / FN / workflow (nothing was deleted). Inspect the shape and throw so the tool surfaces it
255
+ * as a failure instead of a fake success. */
256
+ deleteFunction(id: string): Promise<void>;
257
+ /** Copy a function in place — new tcfnObj row, all versions/steps/testdata carried over. Same
258
+ * shape as `cloneTestCase`: version names + env names come from the source, then POST to
259
+ * `/tm/tcfnCopy/copytc` with `type:'FN'` (backend enforces `copy_function_across_projects`).
260
+ * When `newTitle` is omitted the backend auto-names as `{sourceName}_copy1`, etc.; when
261
+ * provided a follow-up PUT `/tm/function/:id` renames the freshly-created FN. */
262
+ cloneFunction(id: string, newTitle?: string, versions?: string[]): Promise<SavedRef>;
263
+ /** Snapshot the CURRENT server state of a function under a NEW version name — same FN id, new
264
+ * `tcfn_version` row with cloned steps. Mirrors `saveAsNewVersion` (see there for the shape
265
+ * rationale) with `type:'FN'` and the multipart route `PUT /tm/function` / key `functionObj`.
266
+ * Source-version resolution goes through the FN's `/tm/function/version/:id/:pid` list — the
267
+ * FN doc has no inline versionId. */
268
+ saveAsNewFunctionVersion(id: string, opts: {
269
+ versionName: string;
270
+ tdCopy?: boolean;
271
+ sourceVersionId?: string;
272
+ }): Promise<SavedRef>;
69
273
  /** Never throw on unresolvable storyRef — the Java code logs and moves on so the save still lands. */
70
274
  private resolveStoryNumericIdOrNull;
71
- /** Resolve every `${name}` token across every step to a SQA parameter id via get-or-create.
72
- * Name-uniqueness is project-wide on the backend; get-or-create means every TC using
73
- * `${appUrl}` links to the same parameter row. */
275
+ /** Resolve every param name referenced by the TC to a SQA parameter id via get-or-create.
276
+ * Sources: (a) `${name}` tokens in every step's description (manual + automation), and
277
+ * (b) keys of every automation step's `recordedParam` (action-argument names like
278
+ * "packageName", "activity", "keys"). Name-uniqueness is project-wide on the backend, so
279
+ * get-or-create means every TC using `${appUrl}` (or the same "packageName" recorded param)
280
+ * links to the same parameter row. */
74
281
  private resolveParamIds;
282
+ /** POST /tm/action/search → per (technology, name) → row (id + objectRequired + objectTemplate).
283
+ * Cached per adapter instance: the catalog is customer-wide and rarely changes during a session.
284
+ * Keyed by `${technologyType}::${lowerCaseName}` so the same action name across two techs
285
+ * (e.g. "click" for WEB + ANDROID) resolves to the right numeric id. */
286
+ private actionCatalogCache;
287
+ private actionCatalog;
288
+ /** POST /tm/object/createObjectSeq — get-or-create the shared object row by locator match. The
289
+ * backend does the dedup (`object.controller.js:268-370`) — same-locators reuses, same-disname-
290
+ * different-locators creates a suffixed one. Returns the numeric object id.
291
+ *
292
+ * ponytail: minimum body — no thumbnail_url / pageScreenShot_url / parameterId. The recording
293
+ * path enriches these; the tc_save path doesn't have screenshots to attach, and the object
294
+ * works for execution without them. */
295
+ private resolveObjectId;
296
+ /** For every automation step, resolve `actionId` (from action name + technology) and
297
+ * `objectId` (via createObjectSeq get-or-create) so the mapper can emit a valid step. Runs
298
+ * once per save, aligned by step index. */
299
+ private resolveAutomationSteps;
75
300
  /** Case-insensitive project-scoped exact-name lookup. Backend duplicate-name check uses Mongo
76
301
  * collation strength:2, so a case-sensitive search here misses params stored under different
77
302
  * casing — the next POST then trips "Duplicate Name Error". Returns null when not found. */
@@ -88,8 +313,61 @@ export declare class SimplifyQaAdapter {
88
313
  /** Assemble the strict allow-listed suite entry for an ADD op. Required fields per the SQA
89
314
  * validator: testcaseId, code, seq (set by the caller), version, versionId, tcType. */
90
315
  private buildSuiteEntryFromTestcase;
316
+ /** name (UPPERCASE) → objecttemplateId. Rarely changes; cached per adapter instance like
317
+ * formulaCache. Populated from `POST /tm/objectTemplate/search` (confirmed endpoint,
318
+ * api-endpoints.ts `object.search`'s sibling `objectTemplate.search`). */
319
+ private objectTemplateCache;
320
+ private resolveObjectTemplateId;
321
+ /** `POST /tm/object/search` — objects visible in the current project. `q.query` free-text searches
322
+ * `disname` — the UI's "Name" column (confirmed against the real sqa-ui Object Repository grid;
323
+ * `description` is a separate, optional field and is NOT what users mean by an object's name). */
91
324
  searchObjects(q: ObjectQuery): Promise<QaObject[]>;
325
+ /**
326
+ * Create a new object — `POST /tm/object`, plain JSON (NOT multipart, unlike testcase/suite writes;
327
+ * confirmed against the real sqa-ui ObjectService.saveNewObject). `o.objectType` is REQUIRED: it
328
+ * resolves to the object's `objecttemplateId` — structural, and (per updateObject's contract) not
329
+ * editable after creation. `moduleId` auto-resolves to the project's "Default Module" (matching the
330
+ * real UI's `object.component.ts` `openForm()`, which pre-selects it for every new object) — best
331
+ * effort, never blocks creation if no such module exists or the lookup fails.
332
+ */
92
333
  createObject(o: QaObject): Promise<QaObject>;
334
+ /** The current project's module literally named "Default Module" (case-insensitive) — mirrors the
335
+ * real sqa-ui `object.component.ts` `openForm()` auto-selection. Best-effort: returns undefined
336
+ * (never throws) when no such module exists or the lookup fails, so object creation still proceeds
337
+ * without a module rather than being blocked by this convenience. */
338
+ private resolveDefaultModuleId;
339
+ /**
340
+ * Soft-delete — `PATCH /tm/object` (NOT POST .../delete like testcase/suite; confirmed against the
341
+ * real sqa-ui ObjectService.deleteObject), body `{ids, projectId, isDelete:true}`.
342
+ *
343
+ * DEPENDENCY-CHECKED first: the SAME route with `isDelete:false` is a DRY RUN that returns, per
344
+ * object, which test cases / functions / workflows still reference it (`tcArr`/`fnArr`/`wfArr`, each
345
+ * keyed by projectId → an array of referencing ids — mirrors the real UI's
346
+ * deleteDependencyForObject flow, object.component.html/.ts). If anything still references it, the
347
+ * delete is refused rather than silently breaking those test cases; only a dependency-free object
348
+ * gets the real `isDelete:true` call.
349
+ */
350
+ deleteObject(id: string): Promise<void>;
351
+ /**
352
+ * Update an object — `PUT /tm/object/:id`, plain JSON (NOT multipart, unlike testcase/suite writes;
353
+ * confirmed against the real sqa-ui ObjectService.update). The backend expects the FULL document
354
+ * back, so this reads the current one first and echoes every field it doesn't touch
355
+ * (disname/description/objecttemplateId/parameterId/moduleId/technology/updateVersion — the
356
+ * optimistic-concurrency token the real form also round-trips).
357
+ *
358
+ * `changes.locators` UPSERTS by locator name into the existing attribute list — an entry with a
359
+ * matching name gets its value/unique updated in place, everything else on the object is left alone,
360
+ * and a name with no existing match is appended as a new locator.
361
+ *
362
+ * `technology` (object type) and `objecttemplateId` are DELIBERATELY never taken from `changes` —
363
+ * they are always echoed back from the existing doc. Both are structural (they determine which
364
+ * attribute set is even valid for this object), so editing them here — outside the create flow — is
365
+ * out of scope; changing them means creating a new object, not "updating" this one.
366
+ */
367
+ updateObject(id: string, changes: {
368
+ name?: string;
369
+ locators?: Locator[];
370
+ }): Promise<QaObject>;
93
371
  actionsCatalog(platform?: string): Promise<ActionDef[]>;
94
372
  /** Fetch the default (template) iteration row for a TC. Fills gaps from the raw TC:
95
373
  * - versionId: falls back through versionId → selectedVersionId → versionsDetails.id → versions[0].id
@@ -106,9 +384,8 @@ export declare class SimplifyQaAdapter {
106
384
  /** Environment key: caller wins; else fetch the project's configured envs and pick the first;
107
385
  * else 'general' (matches the SQA UI fallback). */
108
386
  private resolveEnvironment;
109
- /** Parameter name lookup for paramId → name enrichment. Null when the parameter is deleted or
110
- * belongs to a different project. */
111
- private fetchParameterName;
387
+ /** Parameter name + protected-flag lookup. Null when the parameter is deleted or cross-project. */
388
+ private fetchParameterMeta;
112
389
  /** List every formula the current project can use — DEFAULT (customer-wide prefabs) unioned with
113
390
  * CUSTOM entries scoped to the customer or this project. The backend endpoint already returns the
114
391
  * union when called with `projectId`; we just normalise the doc shape and derive `scope` from
@@ -124,6 +401,10 @@ export declare class SimplifyQaAdapter {
124
401
  /** Real status of a run — reads step-level results direct from SQA REST because the desktop agent's
125
402
  * get_run only returns queue state (often stale). start/stop still hop for v1. */
126
403
  getRun(runId: string): Promise<RunStatus>;
404
+ /** Targeted name lookup for a single project by numeric id — the whole-list `listProjects`
405
+ * is paged (default 100) and API-key scoping can hide the selected project, which left
406
+ * callers with an empty projectName. */
407
+ private lookupProjectName;
127
408
  startRun(target: RunTarget, opts: RunOptions): Promise<RunRef>;
128
409
  stopRun(runId: string): Promise<void>;
129
410
  listCloudRunners(): Promise<CloudRunner[]>;
@@ -146,6 +427,8 @@ export declare class SimplifyQaAdapter {
146
427
  private resolveLocalAgentId;
147
428
  private detectExecutionOS;
148
429
  private buildRunPlatform;
430
+ /** Direct REST — same endpoint `resolveEnvironment` uses. Works without an agent hop.
431
+ * `key` is what testdata iterations store as `environmentType`; `id` is the uuid used by run dispatch. */
149
432
  listEnvironments(): Promise<EnvInfo[]>;
150
433
  listDatasets(tcId?: string): Promise<DatasetInfo[]>;
151
434
  readJournal(tcId: string): Promise<JournalView>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/adapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAU,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EACV,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAC/F,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAClG,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,uBAAuB,EAC/F,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EACtF,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAChE,MAAM,uBAAuB,CAAC;AAS/B,kFAAkF;AAClF,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,iBAAiB,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,CAAC,CAAC;AAyFrG;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAiC;IAOjD,OAAO,CAAC,YAAY,CAAmC;gBAGpC,GAAG,EAAE,iBAAiB,EACvC,SAAS,CAAC,EAAE,mBAAmB;IAgBjC,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,UAAU;IAmBlB;kGAC8F;IACxF,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAWlC,kFAAkF;IAC5E,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAezC,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBrD,yFAAyF;IACnF,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAmBlC,gBAAgB;YAOhB,oBAAoB;IA0B5B,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAWrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IASpC,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgBnD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAS1C;+EAC2E;YAC7D,qBAAqB;IAY7B,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAcvC,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASxD,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAWrD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS9C,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM;IAUxC,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,UAAU;IAMlB;kFAC8E;IACxE,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAKrH,gFAAgF;IAC1E,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5E;6FACyF;IACnF,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBrD,8EAA8E;IACxE,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBjE,8FAA8F;IACxF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,sGAAsG;YACxF,2BAA2B;IAUzC;;uDAEmD;YACrC,eAAe;IAe7B;;iGAE6F;YAC/E,eAAe;YAuBf,oBAAoB;IA6C5B,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS9C;;oCAEgC;IAC1B,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAgDrE,kEAAkE;IAC5D,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,aAAa;IAO3B;4FACwF;YAC1E,2BAA2B;IAyBnC,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClD,YAAY,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAG5C,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAM7D;;;wGAGoG;IAC9F,mBAAmB,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8CvH;4FACwF;IAClF,uBAAuB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAgEvG;wDACoD;YACtC,kBAAkB;IAYhC;0CACsC;YACxB,kBAAkB;IAahC;;;2DAGuD;IACjD,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAqBxC;;kFAE8E;IACxE,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCxF;uFACmF;IAC7E,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiEzC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IA4H9D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrC,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAE1C,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAuB9C;;;;;;;;;;;;;;OAcG;YACW,mBAAmB;IAiCjC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IA8BlB,gBAAgB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAItC,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAMnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAG/C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CAIxE"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/simplifyqa/adapter.ts"],"names":[],"mappings":"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"}