@bridge_gpt/mcp-server 0.2.23 → 0.2.24

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.
@@ -0,0 +1,140 @@
1
+ # Installing the SFCC Integration (OCAPI)
2
+
3
+ Bridge's Salesforce B2C Commerce (SFCC) tools give an AI coding agent read access to
4
+ a sandbox's object model, custom object definitions, and site preferences — plus a
5
+ small set of sandbox-only writes — through the **OCAPI Data API**. This guide covers
6
+ setting up the OCAPI client that those tools authenticate against.
7
+
8
+ > **Sandbox / local development only.** This integration is intended for a **developer
9
+ > sandbox**. The tools reject non-sandbox instances, and the permissions grant below is
10
+ > deliberately broad (all methods, all resources) — appropriate for a throwaway dev
11
+ > sandbox, **never** for staging or production. Do not configure this grant on any
12
+ > instance that holds real data. Credentials stay local (in `dw.json` or `SFCC_*` env
13
+ > vars) and are never sent to Bridge.
14
+
15
+ For the full per-tool list and what each SFCC tool depends on, see
16
+ [MCP Tool Integration Dependencies](./mcp-tool-integrations.md). For the tool reference
17
+ and the `BRIDGE_MCP_PROFILE` gating, see the SFCC section of the
18
+ [package README](../../README.md).
19
+
20
+ ## Prerequisites
21
+
22
+ - A running SFCC **developer sandbox** and its hostname
23
+ (e.g. `zzzz-001.sandbox.us01.dx.commercecloud.salesforce.com`).
24
+ - An **Account Manager API client** — a `client-id` and `client-secret`. This is the
25
+ OCAPI client the tools use to obtain an OAuth token. Create one in Account Manager
26
+ (**API Client** → *Add API Client*) if you don't already have it, and note its
27
+ `client_id`.
28
+ - Business Manager access to the sandbox with permission to edit **Open Commerce API
29
+ Settings**.
30
+
31
+ ## 1. Grant the OCAPI client access in Business Manager
32
+
33
+ In Business Manager for the sandbox:
34
+
35
+ **Administration → Site Development → Open Commerce API Settings → Data API** tab.
36
+
37
+ Add the following client entry to the `clients` array of the Data API settings, then
38
+ **Save**. This grants the client full read/write access to every Data API resource —
39
+ acceptable only on a developer sandbox:
40
+
41
+ ```json
42
+ {
43
+ "client_id": "<your-client-id-here>",
44
+ "resources": [
45
+ {
46
+ "methods": ["get", "post", "put", "patch", "delete"],
47
+ "read_attributes": "(**)",
48
+ "write_attributes": "(**)",
49
+ "resource_id": "/**"
50
+ }
51
+ ]
52
+ }
53
+ ```
54
+
55
+ Notes:
56
+
57
+ - The `client_id` **must match** the Account Manager API client whose credentials you
58
+ put in `dw.json` / `SFCC_*` below. Replace the value above with your own client id if
59
+ it differs.
60
+ - If the Data API settings are empty, wrap the entry in the standard settings envelope:
61
+
62
+ ```json
63
+ {
64
+ "_v": "23.2",
65
+ "clients": [
66
+ {
67
+ "client_id": "<your-client-id-here>",
68
+ "resources": [
69
+ {
70
+ "methods": ["get", "post", "put", "patch", "delete"],
71
+ "read_attributes": "(**)",
72
+ "write_attributes": "(**)",
73
+ "resource_id": "/**"
74
+ }
75
+ ]
76
+ }
77
+ ]
78
+ }
79
+ ```
80
+
81
+ - `check_permissions` (below) prints a ready-to-paste grant JSON on a 401/403, so you can
82
+ also let the tool tell you exactly what to add.
83
+
84
+ ## 2. Provide credentials locally
85
+
86
+ Create a `dw.json` in your project root (auto-added to git exclude — never commit it):
87
+
88
+ ```json
89
+ {
90
+ "hostname": "zzzz-001.sandbox.us01.dx.commercecloud.salesforce.com",
91
+ "client-id": "<your-client-id-here>",
92
+ "client-secret": "<account-manager-client-secret>"
93
+ }
94
+ ```
95
+
96
+ Accepted key spellings: `hostname`/`host`, `client-id`/`clientId`/`client_id`,
97
+ `client-secret`/`clientSecret`/`client_secret`. Prefer a single config — a multi-entry
98
+ `configs[]` array forces an explicit `instance` on every call. Alternatively, export
99
+ `SFCC_HOSTNAME` / `SFCC_CLIENT_ID` / `SFCC_CLIENT_SECRET` in the MCP server environment.
100
+
101
+ ## 3. Set the repo `version` config field
102
+
103
+ Set the repo's `version` config to your SFCC project type — one of
104
+ `sfra | pwakit | sitegenesis | storefrontnext | hybrid`. The call-time gate reads this;
105
+ a non-SFCC value blocks every SFCC tool except `sfcc_setup_status`. Set it via your
106
+ normal config path, the `config_field` MCP tool (operation `update`, field `version`),
107
+ or the `/teach-bridge` skill.
108
+
109
+ ## 4. Enable the SFCC tools
110
+
111
+ The two diagnostic tools (`sfcc_setup_status`, `check_permissions`) are always
112
+ registered. The read tools, write tools, and `sfcc_log_query` are gated behind the
113
+ `sfcc` profile. Add `sfcc` to `BRIDGE_MCP_PROFILE` in the MCP server `env` block (it is
114
+ comma-separated; `full` also works), then **restart the MCP client**:
115
+
116
+ ```json
117
+ "env": { "BRIDGE_MCP_PROFILE": "sfcc" }
118
+ ```
119
+
120
+ ## 5. Verify
121
+
122
+ Ask your agent to run:
123
+
124
+ 1. `sfcc_setup_status` — expect all prerequisite checks ✓ (Bridge API key, repo name,
125
+ `version` config, `dw.json` presence/uniqueness, AM/OCAPI token acquisition).
126
+ 2. `check_permissions` — probes OCAPI via `GET /system_object_definitions`. A 200 (with
127
+ the OCAPI version) confirms the grant. On 401/403 it prints the exact grant JSON to
128
+ paste back in step 1.
129
+
130
+ Restart the MCP client after any credential, grant, or env change — a running session
131
+ does not pick them up.
132
+
133
+ ## Notes
134
+
135
+ - **WebDAV logs are separate.** `sfcc_log_query` authenticates with a Business Manager
136
+ username + a 40-character **WebDAV access key** over HTTP Basic auth — *not* the OCAPI
137
+ OAuth token configured here. `sfcc_setup_status` reports OCAPI (step 5) and WebDAV
138
+ (step 6) independently; one can be green while the other is not.
139
+ - **Writes are sandbox-only.** The write tools (attribute/preference create/update) target
140
+ a developer sandbox and echo a paste-ready grant JSON on a 403.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bridge_gpt/mcp-server",
3
- "version": "0.2.23",
3
+ "version": "0.2.24",
4
4
  "description": "Bridge API MCP server — exposes Jira endpoints as MCP tools for Claude Code agents",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -19,16 +19,16 @@
19
19
  "design-assets/",
20
20
  "public/",
21
21
  "README.md",
22
- "CONDUCTOR.md",
22
+ "docs/",
23
23
  "LICENSE"
24
24
  ],
25
25
  "scripts": {
26
- "build": "node scripts/bundle-version.js && node scripts/bundle-readme.js && node scripts/bundle-pipelines.js && node scripts/bundle-commands.js && node scripts/bundle-agents.js && tsc && node scripts/bundle-esbuild.js",
26
+ "build": "node scripts/bundle-version.js && node scripts/bundle-readme.js && node scripts/bundle-pipelines.js && node scripts/bundle-commands.js && node scripts/bundle-agents.js && node scripts/bundle-docs.js && tsc && node scripts/bundle-esbuild.js",
27
27
  "check:version-generated": "node scripts/bundle-version.js && node scripts/check-version-generated.js",
28
28
  "postbuild": "node scripts/prepend-shebang.cjs",
29
29
  "start": "node build/index.js",
30
- "test": "node --test --test-force-exit build/pipeline-utils.test.js build/backend-warnings.test.js build/update-check.test.js build/cli-upgrade.test.js build/decision-page-schema.test.js build/decision-page-template.test.js build/bundle-pipelines.test.js build/instructions-contract.test.js build/pipeline-orchestrator-persistence.test.js build/pipeline-orchestrator-execution.test.js build/pipeline-orchestrator-integration.test.js build/index-static.test.js build/config-fields.static.test.js build/execute-plan-instructions.static.test.js build/index-resolvers.test.js build/index-project-root.test.js build/index-pipelines.test.js build/index.test.js build/bridge-config.test.js build/credential-store.test.js build/agent-config-credential-migration.test.js build/mcp-invoke.test.js build/mcp-provisioning.test.js build/mcp-server-invocation.test.js build/third-party-mcp-targets.test.js build/git-ignore-utils.test.js build/credential-materialization.test.js build/mcp-registration-doctor.test.js build/secret-safety.test.js build/base-ref.test.js build/pr-base-contract.test.js build/start-tickets.test.js build/review-tickets.test.js build/start-tickets-base-branch.test.js build/agent-registry.test.js build/agent-registry.model-routing.test.js build/start-tickets.shell-model-routing.test.js build/start-tickets.bridge-api-model-routing.test.js build/start-tickets.tier-fetch-model-routing.test.js build/start-tickets.resolve-model-routing.test.js build/start-tickets.orchestrate-model-routing.test.js build/start-tickets.routing-diagnostics.test.js build/start-tickets-repo.test.js build/start-tickets-credential-invariants.static.test.js build/credentials-cli.test.js build/start-tickets-prereqs.test.js build/regression-check.test.js build/doctor.test.js build/install-doctor.test.js build/install-bridge.test.js build/install-bridge-invite.test.js build/install-bridge-prompt.test.js build/init.test.js build/resolveUploadAttachment.test.js build/package-static.test.js build/chain-utils.test.js build/chain-orchestrator.test.js build/scheduler-backends/types.test.js build/scheduler-backends/escaping.test.js build/scheduler-backends/launchd.test.js build/scheduler-backends/task-scheduler.test.js build/scheduler-backends/systemd-user.test.js build/scheduler-backends/at-fallback.test.js build/scheduler-backends/index.test.js build/command-catalog.test.js build/scheduled-prompt.test.js build/agent-launchers/claude.test.js build/agent-launchers/cursor.test.js build/agent-launchers/index.test.js build/schedule-store.test.js build/schedule-run.test.js build/setup-epic.test.js build/agent-capabilities/cli.test.js build/agent-capabilities/runner.test.js build/agent-capabilities/probes.test.js build/agent-capabilities/probe-context.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/github-mergeability.test.js build/conductor/merge-conflict-routing.test.js build/conductor/redaction-normalization.test.js build/conductor/claude-hook.test.js build/conductor/git-ci-types.test.js build/conductor/done-gate.test.js build/conductor/git-ci-taxonomy-payload.test.js build/conductor/bridge-api-client.test.js build/conductor/plan.test.js build/conductor/producer-ledger.test.js build/conductor/spec-review-producer.test.js build/conductor/git-producer.test.js build/conductor/git-hooks.test.js build/conductor/store-migration.test.js build/conductor/pr-discovery.test.js build/conductor/pr-ci-producer.test.js build/conductor/pr-review-producer.test.js build/conductor/doctor.test.js build/conductor/deny-enforcement-preflight.test.js build/conductor/errors.test.js build/conductor/store.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/start-tickets-conductor-node-propagation.test.js build/start-tickets.non-mutating-base.test.js build/start-tickets-live-source-guard.test.js build/conductor/worker-ledger-cli.test.js build/conductor/supervisor-config.test.js build/conductor/supervisor-ledger.test.js build/conductor/supervisor-state-reducer.test.js build/conductor/supervisor-housekeeping-projection.test.js build/conductor/supervisor-escalation.test.js build/conductor/supervisor-retired-judgment.static.test.js build/conductor/supervisor-runtime.test.js build/conductor/supervisor-store-projection.test.js build/conductor/supervisor-cli.test.js build/conductor/supervisor-start-tickets.test.js build/conductor/supervisor-message-relay.test.js build/conductor/supervisor-state-message-events.test.js build/conductor/store-message-relay.test.js build/start-tickets-message-relay.test.js build/conductor/event-accessors.test.js build/conductor/merge-ledger.test.js build/conductor/deterministic-completion.static.test.js build/conductor/deterministic-completion.integration.test.js build/conductor/local-merge.test.js build/conductor/local-merge.static.test.js build/conductor/supervisor-merge.test.js build/conductor/bridge-api-merge-client.test.js build/conductor/bridge-api-epic-client.test.js build/conductor/supervisor-merge-runtime-state.test.js build/conductor/epic-state.test.js build/executor/claude-settings.test.js build/executor/cli.test.js build/executor/credentials.test.js build/executor/echo-acceptance.test.js build/executor/env.test.js build/executor/base-branch.test.js build/executor/heartbeat.test.js build/executor/http-client.test.js build/executor/job-runner.test.js build/executor/job-runner.payload-timeout.test.js build/executor/worker-finalization.test.js build/executor/job-runner.static.test.js build/executor/prompt-spec.test.js build/executor/job-types.test.js build/executor/recovery-job.static.test.js build/executor/observation.test.js build/executor/permissions.test.js build/executor/preflight.test.js build/executor/process.test.js build/executor/results.test.js build/executor/runner.test.js build/executor/terminal-mutation.test.js build/executor/worker-command.test.js build/executor/worktree-core.test.js build/executor/worktree.test.js build/executor/job-errors.test.js build/executor/worktree-inspection.test.js build/executor/resume-pre-spawn.test.js build/executor/verdict-artifact.test.js build/executor/worker-log.test.js build/executor/job-log-registry.test.js build/executor/viewer-tabs.test.js build/executor/watch-cli.test.js build/executor/merge-job.test.js build/executor/job-runner.merge.test.js build/executor/worktree-gc.test.js build/executor/runner.job-behaviors.test.js build/conductor/cli-freeze.test.js build/conductor/epic-reconcile.test.js build/conductor/epic-runtime.test.js build/conductor/epic-tick-sequence.test.js build/conductor/epic-runtime-post-action.test.js build/conductor/file-scope-guard.test.js build/conductor/file-scope-guard.integration.test.js build/mcp-profile.test.js build/mcp-profile-registration.test.js build/tools-budget.test.js build/visual-diff-worker.test.js build/visual-diff.test.js build/estimate-epic.test.js build/integration/measure-tools.test.js build/sfcc/config.test.js build/sfcc/ocapi-shape.test.js build/sfcc/output.test.js build/sfcc/credentials.test.js build/sfcc/ocapi-write-faults.test.js build/sfcc/write-guard.test.js build/sfcc/write-grants.test.js build/sfcc/write-result.test.js build/sfcc/writes.test.js build/sfcc/writes-system-object-payloads.test.js build/sfcc/writes-payloads.test.js && node --experimental-test-module-mocks --test --test-force-exit build/index-heavy-read-truncation.test.js build/index-artifacts.test.js build/index.review-rounds.test.js build/index-brainstorm-filenames.test.js build/index-output-path.test.js build/index-generate-decision-page.test.js build/index-generate-decision-page.integration.test.js build/visual-diff.registration.test.js build/visual-diff.attachment-adapter.test.js build/attachment-download.test.js build/attachment-upload.test.js build/conductor/paths.test.js build/conductor/store-lifecycle.test.js build/conductor/store-queries.test.js build/conductor/tools.test.js build/conductor/cli.test.js build/conductor/security-regressions.test.js build/conductor/git-inspection.test.js build/conductor/tools-done-gate.test.js build/conductor/pr-ci-producer-emit-seam.test.js build/conductor/cli-git-hooks.test.js build/sfcc/client.test.js build/sfcc/tool-wrapper.test.js build/sfcc/setup-status.test.js build/sfcc/permissions.test.js build/sfcc/register.test.js build/sfcc/reads-system-object.test.js build/sfcc/reads-custom-object-def.test.js build/sfcc/reads-site-preference.test.js build/sfcc/writes-system-object.test.js build/sfcc/writes-custom-object-def.test.js build/sfcc/writes-site-preference.test.js",
31
- "test:integration": "node --test build/integration/refresh-main.integration.test.js build/integration/start-tickets.integration.test.js build/integration/doctor.integration.test.js build/integration/agent-capabilities.integration.test.js build/integration/conductor-producer.integration.test.js build/integration/conductor-message-relay.integration.test.js build/integration/executor-http-runner.integration.test.js build/integration/executor-job-behaviors.integration.test.js build/integration/executor-recovery-jobs.integration.test.js build/integration/executor-spec-review-prompt.integration.test.js build/integration/resume-pre-spawn.git.integration.test.js build/integration/worker-finalization-origin.integration.test.js build/integration/post-remediation-merge-ci-wait.integration.test.js build/integration/executor-merge-supervision.integration.test.js build/integration/attachment-binary-roundtrip.integration.test.js build/integration/dependent-ticket-fresh-base.integration.test.js build/integration/execute-plan-instructions.integration.test.js",
30
+ "test": "node --test --test-force-exit build/pipeline-utils.test.js build/backend-warnings.test.js build/update-check.test.js build/cli-upgrade.test.js build/decision-page-schema.test.js build/decision-page-template.test.js build/bundle-pipelines.test.js build/instructions-contract.test.js build/pipeline-orchestrator-persistence.test.js build/pipeline-orchestrator-execution.test.js build/pipeline-orchestrator-integration.test.js build/index-static.test.js build/config-fields.static.test.js build/execute-plan-instructions.static.test.js build/index-resolvers.test.js build/index-project-root.test.js build/index-pipelines.test.js build/index.test.js build/bridge-config.test.js build/credential-store.test.js build/agent-config-credential-migration.test.js build/mcp-invoke.test.js build/mcp-provisioning.test.js build/mcp-server-invocation.test.js build/third-party-mcp-targets.test.js build/git-ignore-utils.test.js build/credential-materialization.test.js build/mcp-registration-doctor.test.js build/secret-safety.test.js build/base-ref.test.js build/pr-base-contract.test.js build/start-tickets.test.js build/review-tickets.test.js build/start-tickets-base-branch.test.js build/agent-registry.test.js build/agent-registry.model-routing.test.js build/start-tickets.shell-model-routing.test.js build/start-tickets.bridge-api-model-routing.test.js build/start-tickets.tier-fetch-model-routing.test.js build/start-tickets.resolve-model-routing.test.js build/start-tickets.orchestrate-model-routing.test.js build/start-tickets.routing-diagnostics.test.js build/start-tickets-repo.test.js build/start-tickets-credential-invariants.static.test.js build/credentials-cli.test.js build/start-tickets-prereqs.test.js build/regression-check.test.js build/doctor.test.js build/install-doctor.test.js build/install-bridge.test.js build/install-bridge-invite.test.js build/install-bridge-prompt.test.js build/init.test.js build/resolveUploadAttachment.test.js build/package-static.test.js build/chain-utils.test.js build/chain-orchestrator.test.js build/scheduler-backends/types.test.js build/scheduler-backends/escaping.test.js build/scheduler-backends/launchd.test.js build/scheduler-backends/task-scheduler.test.js build/scheduler-backends/systemd-user.test.js build/scheduler-backends/at-fallback.test.js build/scheduler-backends/index.test.js build/command-catalog.test.js build/scheduled-prompt.test.js build/agent-launchers/claude.test.js build/agent-launchers/cursor.test.js build/agent-launchers/index.test.js build/schedule-store.test.js build/schedule-run.test.js build/setup-epic.test.js build/agent-capabilities/cli.test.js build/agent-capabilities/runner.test.js build/agent-capabilities/probes.test.js build/agent-capabilities/probe-context.test.js build/agent-capabilities/reporter.test.js build/conductor/taxonomy-and-errors.test.js build/conductor/github-mergeability.test.js build/conductor/merge-conflict-routing.test.js build/conductor/redaction-normalization.test.js build/conductor/claude-hook.test.js build/conductor/git-ci-types.test.js build/conductor/done-gate.test.js build/conductor/git-ci-taxonomy-payload.test.js build/conductor/bridge-api-client.test.js build/conductor/plan.test.js build/conductor/producer-ledger.test.js build/conductor/spec-review-producer.test.js build/conductor/git-producer.test.js build/conductor/git-hooks.test.js build/conductor/store-migration.test.js build/conductor/pr-discovery.test.js build/conductor/pr-ci-producer.test.js build/conductor/pr-review-producer.test.js build/conductor/doctor.test.js build/conductor/deny-enforcement-preflight.test.js build/conductor/errors.test.js build/conductor/store.test.js build/conductor/index-poll-ci-producer.test.js build/start-tickets-conductor.test.js build/start-tickets-conductor.spawn.test.js build/start-tickets-conductor-node-propagation.test.js build/start-tickets.non-mutating-base.test.js build/start-tickets-live-source-guard.test.js build/conductor/worker-ledger-cli.test.js build/conductor/supervisor-config.test.js build/conductor/supervisor-ledger.test.js build/conductor/supervisor-state-reducer.test.js build/conductor/supervisor-housekeeping-projection.test.js build/conductor/supervisor-escalation.test.js build/conductor/supervisor-retired-judgment.static.test.js build/conductor/supervisor-runtime.test.js build/conductor/supervisor-store-projection.test.js build/conductor/supervisor-cli.test.js build/conductor/supervisor-start-tickets.test.js build/conductor/supervisor-message-relay.test.js build/conductor/supervisor-state-message-events.test.js build/conductor/store-message-relay.test.js build/start-tickets-message-relay.test.js build/conductor/event-accessors.test.js build/conductor/merge-ledger.test.js build/conductor/deterministic-completion.static.test.js build/conductor/deterministic-completion.integration.test.js build/conductor/local-merge.test.js build/conductor/local-merge.static.test.js build/conductor/supervisor-merge.test.js build/conductor/bridge-api-merge-client.test.js build/conductor/bridge-api-epic-client.test.js build/conductor/supervisor-merge-runtime-state.test.js build/conductor/epic-state.test.js build/executor/claude-settings.test.js build/executor/cli.test.js build/executor/credentials.test.js build/executor/echo-acceptance.test.js build/executor/env.test.js build/executor/base-branch.test.js build/executor/heartbeat.test.js build/executor/http-client.test.js build/executor/job-runner.test.js build/executor/job-runner.payload-timeout.test.js build/executor/worker-finalization.test.js build/executor/job-runner.static.test.js build/executor/prompt-spec.test.js build/executor/job-types.test.js build/executor/recovery-job.static.test.js build/executor/observation.test.js build/executor/permissions.test.js build/executor/preflight.test.js build/executor/process.test.js build/executor/results.test.js build/executor/runner.test.js build/executor/terminal-mutation.test.js build/executor/worker-command.test.js build/executor/worktree-core.test.js build/executor/worktree.test.js build/executor/job-errors.test.js build/executor/worktree-inspection.test.js build/executor/resume-pre-spawn.test.js build/executor/verdict-artifact.test.js build/executor/worker-log.test.js build/executor/job-log-registry.test.js build/executor/viewer-tabs.test.js build/executor/watch-cli.test.js build/executor/merge-job.test.js build/executor/job-runner.merge.test.js build/executor/worktree-gc.test.js build/executor/runner.job-behaviors.test.js build/conductor/cli-freeze.test.js build/conductor/epic-reconcile.test.js build/conductor/epic-runtime.test.js build/conductor/epic-tick-sequence.test.js build/conductor/epic-runtime-post-action.test.js build/conductor/file-scope-guard.test.js build/conductor/file-scope-guard.integration.test.js build/mcp-profile.test.js build/mcp-profile-registration.test.js build/tools-budget.test.js build/visual-diff-worker.test.js build/visual-diff.test.js build/estimate-epic.test.js build/integration/measure-tools.test.js build/sfcc/config.test.js build/sfcc/ocapi-shape.test.js build/sfcc/output.test.js build/sfcc/credentials.test.js build/sfcc/ocapi-write-faults.test.js build/sfcc/write-guard.test.js build/sfcc/write-grants.test.js build/sfcc/write-result.test.js build/sfcc/writes.test.js build/sfcc/writes-system-object-payloads.test.js build/sfcc/writes-payloads.test.js build/sfcc/log-gate.test.js build/sfcc/log-query.test.js && node --experimental-test-module-mocks --test --test-force-exit build/index-heavy-read-truncation.test.js build/index-artifacts.test.js build/index.review-rounds.test.js build/index-brainstorm-filenames.test.js build/index-output-path.test.js build/index-generate-decision-page.test.js build/index-generate-decision-page.integration.test.js build/visual-diff.registration.test.js build/visual-diff.attachment-adapter.test.js build/attachment-download.test.js build/attachment-upload.test.js build/conductor/paths.test.js build/conductor/store-lifecycle.test.js build/conductor/store-queries.test.js build/conductor/tools.test.js build/conductor/cli.test.js build/conductor/security-regressions.test.js build/conductor/git-inspection.test.js build/conductor/tools-done-gate.test.js build/conductor/pr-ci-producer-emit-seam.test.js build/conductor/cli-git-hooks.test.js build/sfcc/client.test.js build/sfcc/tool-wrapper.test.js build/sfcc/setup-status.test.js build/sfcc/permissions.test.js build/sfcc/register.test.js build/sfcc/reads-system-object.test.js build/sfcc/reads-custom-object-def.test.js build/sfcc/reads-site-preference.test.js build/sfcc/writes-system-object.test.js build/sfcc/writes-custom-object-def.test.js build/sfcc/writes-site-preference.test.js",
31
+ "test:integration": "node --test build/integration/refresh-main.integration.test.js build/integration/start-tickets.integration.test.js build/integration/doctor.integration.test.js build/integration/agent-capabilities.integration.test.js build/integration/conductor-producer.integration.test.js build/integration/conductor-message-relay.integration.test.js build/integration/executor-http-runner.integration.test.js build/integration/executor-job-behaviors.integration.test.js build/integration/executor-recovery-jobs.integration.test.js build/integration/executor-spec-review-prompt.integration.test.js build/integration/resume-pre-spawn.git.integration.test.js build/integration/worker-finalization-origin.integration.test.js build/integration/post-remediation-merge-ci-wait.integration.test.js build/integration/executor-merge-supervision.integration.test.js build/integration/attachment-binary-roundtrip.integration.test.js build/integration/dependent-ticket-fresh-base.integration.test.js build/integration/execute-plan-instructions.integration.test.js build/integration/install-bridge-repo-resolution.integration.test.js",
32
32
  "test:smoke": "node --test build/integration/packaged-cli-smoke.test.js",
33
33
  "prepublishOnly": "node scripts/bundle-assets.js && npm run build && node scripts/verify-shebang.cjs"
34
34
  },
@@ -3496,7 +3496,9 @@ __webpack_require__.r(__webpack_exports__);
3496
3496
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3497
3497
  /* harmony export */ hideModal: () => (/* binding */ hideModal),
3498
3498
  /* harmony export */ initModal: () => (/* binding */ initModal),
3499
- /* harmony export */ showModal: () => (/* binding */ showModal)
3499
+ /* harmony export */ replaceModalBody: () => (/* binding */ replaceModalBody),
3500
+ /* harmony export */ showModal: () => (/* binding */ showModal),
3501
+ /* harmony export */ showModalNode: () => (/* binding */ showModalNode)
3500
3502
  /* harmony export */ });
3501
3503
  // src/js/modal.js
3502
3504
 
@@ -3550,6 +3552,49 @@ function showModal(title, message, onConfirm = null, showCancel = false, onClose
3550
3552
  }
3551
3553
  }
3552
3554
 
3555
+ /**
3556
+ * Show the modal with a caller-built DOM node as its body.
3557
+ *
3558
+ * Additive companion to {@link showModal} for rich, structured content (e.g. the
3559
+ * SFCC ticket preview). The node is appended directly — never serialized through
3560
+ * innerHTML — so untrusted values built with textContent stay safe. The caller
3561
+ * supplies its own action controls inside `contentEl`, so the shared
3562
+ * confirm/cancel actions are hidden. `onClose` runs when the modal is dismissed,
3563
+ * letting the caller restore focus to the invoking element.
3564
+ *
3565
+ * @param {string} title - Modal header text.
3566
+ * @param {HTMLElement} contentEl - Caller-created body node.
3567
+ * @param {Function|null} onClose - Optional callback fired on dismiss.
3568
+ */
3569
+ function showModalNode(title, contentEl, onClose = null) {
3570
+ if (pageModalTitle) pageModalTitle.textContent = title;
3571
+ replaceModalBody(contentEl);
3572
+
3573
+ currentConfirmCallback = null;
3574
+ currentCloseCallback = onClose;
3575
+
3576
+ if (pageModalActions) pageModalActions.classList.add('hidden');
3577
+ if (pageModal) {
3578
+ pageModal.style.display = 'block';
3579
+ } else {
3580
+ console.error('Modal element not found.');
3581
+ }
3582
+ }
3583
+
3584
+ /**
3585
+ * Replace the modal body with a caller-built DOM node without re-showing it.
3586
+ *
3587
+ * Used to transition the same open modal between states (processing → preview →
3588
+ * success/error). Clears the previous content with textContent then appends the
3589
+ * node — never innerHTML.
3590
+ * @param {HTMLElement} contentEl
3591
+ */
3592
+ function replaceModalBody(contentEl) {
3593
+ if (!pageModalBody) return;
3594
+ pageModalBody.textContent = '';
3595
+ if (contentEl) pageModalBody.appendChild(contentEl);
3596
+ }
3597
+
3553
3598
  /**
3554
3599
  * Hides the modal dialog.
3555
3600
  */