Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
b80a742
matrixbuilder: restore portable design checkpoint inputs
fsiyavud-cisco Sep 22, 2026
c04d6e6
matrixbuilder: use supplied AI summary authority
fsiyavud-cisco Sep 22, 2026
2bd1dd0
Consolidated single AI summary timeout in requirement
fsiyavud-cisco Sep 22, 2026
d396b1c
matrixbuilder: publish design
fsiyavud-cisco Sep 22, 2026
e098b7c
matrixbuilder: publish design_fix[0]
fsiyavud-cisco Sep 23, 2026
a0300be
matrixbuilder: publish design_fix[1]
fsiyavud-cisco Sep 23, 2026
38a1e1d
matrixbuilder: publish design_fix[2]
fsiyavud-cisco Sep 23, 2026
5183f93
matrixbuilder: publish design_fix[3]
fsiyavud-cisco Sep 23, 2026
7b6d51f
matrixbuilder: publish design_fix[4]
fsiyavud-cisco Sep 23, 2026
fe8320d
matrixbuilder: publish design_fix[5]
fsiyavud-cisco Sep 23, 2026
266269b
matrixbuilder: publish design_fix[6]
fsiyavud-cisco Sep 23, 2026
04108f0
matrixbuilder: publish design_fix[7]
fsiyavud-cisco Sep 23, 2026
2d691c7
matrixbuilder: publish design_fix[8]
fsiyavud-cisco Sep 23, 2026
2fd1dbe
matrixbuilder: publish design_fix[9]
fsiyavud-cisco Sep 23, 2026
2d8c3f3
matrixbuilder: publish design_fix[10]
fsiyavud-cisco Sep 23, 2026
fa0b090
matrixbuilder: publish design_fix[11]
fsiyavud-cisco Sep 23, 2026
696646d
matrixbuilder: publish design_fix[12]
fsiyavud-cisco Sep 23, 2026
36bd2d9
matrixbuilder: publish design_fix[13]
fsiyavud-cisco Sep 23, 2026
391939e
matrixbuilder: publish design_fix[14]
fsiyavud-cisco Sep 23, 2026
caa819a
matrixbuilder: publish design_fix[15]
fsiyavud-cisco Sep 23, 2026
a492428
matrixbuilder: publish design_fix[16]
fsiyavud-cisco Sep 23, 2026
76f84b3
matrixbuilder: publish design_fix[17]
fsiyavud-cisco Sep 23, 2026
3834ab2
matrixbuilder: publish design_fix[18]
fsiyavud-cisco Sep 23, 2026
49422ce
matrixbuilder: publish design_fix[19]
fsiyavud-cisco Sep 23, 2026
c56f95a
matrixbuilder: publish design_fix[20]
fsiyavud-cisco Sep 23, 2026
933dabe
matrixbuilder: publish design_fix[21]
fsiyavud-cisco Sep 23, 2026
1983585
matrixbuilder: publish design_fix[22]
fsiyavud-cisco Sep 23, 2026
bfcfd55
matrixbuilder: publish design_fix[23]
fsiyavud-cisco Sep 23, 2026
15cab1c
matrixbuilder: publish design_fix[24]
fsiyavud-cisco Sep 23, 2026
3f66333
matrixbuilder: publish design_fix[25]
fsiyavud-cisco Sep 23, 2026
3dac56b
matrixbuilder: publish design_fix[26]
fsiyavud-cisco Sep 23, 2026
4e8dd5d
matrixbuilder: publish design_fix[27]
fsiyavud-cisco Sep 23, 2026
e17fb7b
matrixbuilder: publish design_fix[28]
fsiyavud-cisco Sep 23, 2026
6be6683
matrixbuilder: publish design_fix[29]
fsiyavud-cisco Sep 23, 2026
07f0d02
matrixbuilder: publish design_fix[30]
fsiyavud-cisco Sep 23, 2026
ab3d34b
matrixbuilder: publish design_fix[31]
fsiyavud-cisco Sep 23, 2026
bab200c
matrixbuilder: publish design_fix[32]
fsiyavud-cisco Sep 23, 2026
314c48e
matrixbuilder: publish design_fix[33]
fsiyavud-cisco Sep 23, 2026
73849ac
matrixbuilder: publish design_fix[34]
fsiyavud-cisco Sep 23, 2026
ad6f77f
matrixbuilder: publish design_fix[35]
fsiyavud-cisco Sep 23, 2026
0325e7f
matrixbuilder: publish design_fix[36]
fsiyavud-cisco Sep 23, 2026
8e661af
matrixbuilder: publish design_fix[37]
fsiyavud-cisco Sep 23, 2026
ffec485
matrixbuilder: publish design_fix[38]
fsiyavud-cisco Sep 23, 2026
0368b5e
matrixbuilder: publish design_fix[39]
fsiyavud-cisco Sep 23, 2026
f573913
matrixbuilder: publish design_fix[40]
fsiyavud-cisco Sep 24, 2026
5b0f4f0
matrixbuilder: publish design_fix[41]
fsiyavud-cisco Sep 24, 2026
458a8f1
matrixbuilder: publish design_fix[42]
fsiyavud-cisco Sep 24, 2026
9f9d3be
matrixbuilder: publish design_fix[43]
fsiyavud-cisco Sep 24, 2026
bd8a674
matrixbuilder: publish design_fix[44]
fsiyavud-cisco Sep 24, 2026
4477b39
matrixbuilder: publish design_fix[45]
fsiyavud-cisco Sep 24, 2026
766d31e
matrixbuilder: publish design_fix[46]
fsiyavud-cisco Sep 24, 2026
d117c43
matrixbuilder: publish design_fix[47]
fsiyavud-cisco Sep 24, 2026
faf021a
matrixbuilder: publish design_fix[48]
fsiyavud-cisco Sep 24, 2026
93ba11a
matrixbuilder: publish design_fix[49]
fsiyavud-cisco Sep 24, 2026
6a1bc50
matrixbuilder: publish design_fix[50]
fsiyavud-cisco Sep 24, 2026
7ddf452
matrixbuilder: publish design_fix[51]
fsiyavud-cisco Sep 24, 2026
66c56a1
matrixbuilder: publish design_fix[52]
fsiyavud-cisco Sep 24, 2026
eeac84b
matrixbuilder: publish design_fix[53]
fsiyavud-cisco Sep 24, 2026
671d476
matrixbuilder: publish design_fix[54]
fsiyavud-cisco Sep 24, 2026
f127007
matrixbuilder: publish design_fix[55]
fsiyavud-cisco Sep 24, 2026
e9a104b
matrixbuilder: publish design_fix[56]
fsiyavud-cisco Sep 24, 2026
eaad089
design spec and AGENTS.md fixes
fsiyavud-cisco Sep 24, 2026
f5774ed
Repair implementation DAG schema violations
fsiyavud-cisco Sep 24, 2026
8111826
Fixed env prerequisites in impl DAG
fsiyavud-cisco Sep 24, 2026
7b96161
feat(cc): add AI summaries across Contact Center widgets
fsiyavud-cisco Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ jobs:
run: |
echo "npmAuthToken: ${{ env.token }}" >> ~/.yarnrc.yml

- name: Assert Publishable Package Boundary
if: steps.check-changes.outputs.has_changes == 'true'
run: node tooling/src/publish.js assert-publishable

- name: Sync and Increment Package Versions
id: increment
if: steps.check-changes.outputs.has_changes == 'true'
Expand Down
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ yarn-error.log*
.node_repl_history
reports/
.generated/
.worktrees/
vendor/
!vendor/

#IDEs
.project
Expand All @@ -39,6 +42,9 @@ reports/

#Local stuff
*.json
!prog-mini-js.config.json
!playwright/visual/ai-summary-harness.json
!playwright/tsconfig.ai-summary.json
!docs/changelog/logs/*.json
!.sdd/manifest.json
.env*
Expand All @@ -54,3 +60,16 @@ node_modules/
# Playwright reports
**/test-results/
**/playwright-report

# Artificer runtime and local requirement/UX inputs
.matrix/
.prog/
requirementVersion/
.ccwidgets/

# The implementation DAG is an Artificer design deliverable, not runtime state.
!design/default/implementation_dag.json

# Reviewed AI-summary admission artifacts.
!design/default/sdk_package_lock.json
!vendor/contact-center-cc-summaries.tgz
47 changes: 47 additions & 0 deletions ai-docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,53 @@ subscribes to store observables → user action (e.g. set state, accept task)
→ SDK responds and/or emits an event → store updates observables in `runInAction()` → observing widgets
re-render. Grounded in `packages/contact-center/store/src/store.ts` and `storeEventsWrapper.ts`.

**AI Summary visual evidence:** `playwright/visual/ai-summary-harness.json` binds the
accepted UX source/state IDs to the existing Playwright project, sample-app
production-component mount, observable assertions, and 2x capture geometry.
`playwright/Utils/aiSummaryUtils.ts` runs browser assertions and writes raw
PNG/DOM/comparison records under `.matrix/results/prog-mini-js/ux-visual/<phase>/`.
These records do not assert visual fidelity; the prog-mini-js visual task must
inspect the target/render pairs and publish a separate attempt-bound handoff.
The deterministic host owns browser startup and cleanup. Do not turn a
machine-generated comparison score into a claim of model image inspection.

**UX seal revalidation:** `tooling/src/ai-summary-sdk-lock.js seal-ux` independently
reopens and hashes the admitted target files on every call. If an existing seal
matches the complete validated evidence and authority metadata, it preserves the
original lock-file bytes and `ux.sealedAt`; repeated DAG acceptance must not make
visual receipts stale merely by refreshing a timestamp. Missing, symlinked, or
changed inputs and mismatched sealed metadata fail closed without replacing the
receipt. A genuinely changed authority requires an explicit admission repair,
not an automatic reseal during acceptance. Regression coverage lives in
`tooling/tests/ai-summary-sdk-lock.test.js`.

**Local UX provenance:** `tooling/src/verify-ai-summary-release.js` checks the
harness descriptor, active visual plan/receipts, and archived JSON evidence.
The exact `figma_mcp_policy: "forbidden"` and `mcp_policy: "forbidden"` declarations
are prohibitions, not evidence of MCP use. Explicit use/transport/tool records
and remote Figma references remain rejected; ambiguous MCP policies fail closed.
Local scene-graph node/file IDs and evidence filenames alone do not establish
remote acquisition. Provenance failures identify the repository-relative file
and JSON field, without printing evidence values or remote credentials.
Regression coverage lives in `tooling/tests/verify-ai-summary-release.test.js`.

**AI summary SDK validation:** initiating/post-call requests resolve `Promise<AISummary>`;
receiver content uses `task:midCallSummaryReceived` and capability updates use
`task:featureEnablement` on the matching Task. The packed runtime and its extracted declarations
are checked together, including a TypeScript compiler probe explicitly mapped to the candidate.
Legacy seals cannot skip runtime validation or omit required source/build provenance. The combined
lock verification also packs and inspects all six AI-summary workspace boundaries in an isolated
child environment. See [`ai-summary.md`](../ai-summary.md) for the exact API and current sealed-package defect.

**Release evidence binding:** release manifests are nonempty, hash every named file, and match live
Git changes since an ancestor `baseCommit`. Verification runs on the requirement's promotion branch.
Each gate names a repository-contained receipt with an explicit passing status, matching file hash,
and matching HEAD. The D8b gate also binds the packaging receipt hash; actual tarball file lists must
match that receipt. Executable provenance scanning inspects calls rather than matching explanatory
comments, regular expressions, or test source strings. Privacy scanning permits raw-error variables
used for normalization while rejecting their use as arguments to known logging sinks. These checks
do not turn unexecuted browser/visual or failed SDK checks into passing release evidence.

## Dependencies
| Dependency | Type (internal / external / peer) | How used | Failure / version handling |
|---|---|---|---|
Expand Down
15 changes: 14 additions & 1 deletion ai-docs/CONTRACTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ The aggregator package `@webex/cc-widgets` re-exports every widget plus the `sto
| cc-widgets.store | `@webex/cc-store` | `store` | MobX singleton (`Store.getInstance()`); `init(options: InitParams, setupEventListeners): Promise<void>`; sole SDK access point via `store.cc.*` | stable semver | `packages/contact-center/store/ai-docs/store-spec.md` | `packages/contact-center/store/src/index.ts:1,4` |
| store.host-init.enableWxBetterTogether | `@webex/cc-store` | `webexConfig.cc.enableWxBetterTogether` → `store.enableWxBetterTogether` | Host init boolean (default `false`), set **before** `store.init()`: read from `webexConfig.cc` on `{ webexConfig, access_token }` init or `webex.config.cc` on `{ webex }` init; read-only observable after init (Phase 1: re-init to change). Gates wxApp Mute/Keypad visibility and wxApp mute seed; SDK owns mute/DTMF API routing. | stable semver; renaming or removing the init key or store getter is breaking | `packages/contact-center/store/ai-docs/store-spec.md` (`STORE-R-030`); `packages/contact-center/task/ai-docs/task-spec.md` (WXCC-6026) | `packages/contact-center/store/src/store.ts`, `packages/contact-center/store/src/store.types.ts` (`WebexCcInitConfig`) |
| store.types | `@webex/cc-store` | Existing queue/entry-point request, response, and entity type re-exports plus `TaskUIControls` | TypeScript exports describing the SDK-backed domain surface; established entity rows and Task destination controls pass through without a widget destination abstraction | stable semver; SDK-shaped types track SDK | `@webex/contact-center` types (`node_modules/@webex/contact-center/dist/types/index.d.ts`) (SDK source); `packages/contact-center/store/ai-docs/store-spec.md` | `packages/contact-center/store/src/store.types.ts` |
| cc-components.CallControlComponent | `@webex/cc-components` | `CallControlComponent` (`CallControlComponentProps`) | React presentation component for call controls. Public props include optional `aiSummary?: CallControlAISummaryProps`, `sendMidCallSummaryBeforeAction(actionType, expectedRevision): Promise<{outcome: 'sent' \| 'failed' \| 'blocked' \| 'stale'}>` through that prop, and `wrapupCall(wrapupReason, wrapupId): Promise<WrapupCompletionResult>`. `handleTargetSelect` waits for the mid-call summary Promise to settle before invoking `consultCall`/`transferCall` once. `handleWrapupCall` resolves a `WrapupCompletionResult` and catches callback throws/rejections into `{wrapup: 'failed'}`. | stable semver; optional `aiSummary` is additive, but the `wrapupCall` migration from synchronous `void` to `Promise<WrapupCompletionResult>` is breaking for typed consumers | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md` (`CC-COMPONENTS-R-006`) | `packages/contact-center/cc-components/src/components/task/task.types.ts`, `packages/contact-center/cc-components/src/components/task/CallControl/call-control.tsx`, `packages/contact-center/cc-components/src/components/task/CallControl/call-control.utils.ts` |
| cc-components.AIAssistantComponent | `@webex/cc-components` | `AIAssistantComponent` (`AIAssistantComponentProps`, `AIAssistantReceiverSummary`, `AdaptiveCardRendererProps`) | AI Assistant panel chrome, Real-time Assist transcript/actions, and props-only receiving-agent `View summary` branch with display-only card rendering, receiver copy, and feedback callbacks | stable semver; receiver branch prop shape is a public type surface | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md` (`CC-COMPONENTS-R-020`, `CC-COMPONENTS-R-021`) | `packages/contact-center/cc-components/src/components/AIAssistant/ai-assistant.types.ts` |
| cc-components.AISummary | `@webex/cc-components` | `AISummary`, `AISummaryProps`, `AI_SUMMARY_MESSAGES`, `COPIED_FEEDBACK_MS`, `MID_CALL_SECTION_DEFINITIONS`, `POST_CALL_SECTION_DEFINITIONS`, `POST_CALL_DISPLAY_SECTION_ORDER`, `projectPostCallDisplaySections` | SDK-free shared AI summary surface for mid-call initiator, mid-call receiver, and post-call wrap-up modes; exposes exact copy constants, ordered section key/label definitions, and post-call section projection used by components and tests | stable semver; adding optional props/values is additive, narrowing `AISummaryProps` modes/callback result types is breaking | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md` (`CC-COMPONENTS-R-002`, `CC-COMPONENTS-R-022`) | `packages/contact-center/cc-components/src/components/AISummary/index.ts` |
| cc-components.consult-transfer-lists | `@webex/cc-components` | `CallControl` consult/transfer fetch props plus `action`, `availableDestinations`, and optional list-item `presence` | `FetchPaginatedList<ContactServiceQueue>` / `FetchPaginatedList<EntryPointRecord>` and the SDK-ordered destination array from `TaskUIControls`; UI preserves list/category order, passes buddy availability to Momentum Avatar as semantic presence, shows `AddressBookEntry.number` and `EntryPointRecord.number` subtitles, and may only apply host hide overrides | stable semver; entity and control types track store/SDK contracts; optional presentation prop is additive | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md`; `ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md` | `packages/contact-center/cc-components/src/components/task/task.types.ts` |
| cc-components.TelephonyActionToast | `@webex/cc-components` | `TelephonyActionToast` (`TelephonyActionToastProps`) | wxApp thick-client telephony error toast (Momentum `Toast` `variant="error"`); consumed by `@webex/cc-task` CallControl / CallControlCAD wrappers | widget-internal / monorepo cross-package only; not a host-facing `@webex/cc-widgets` surface | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md` | `packages/contact-center/cc-components/src/components/task/TelephonyActionToast/telephony-action-toast.tsx` |
| cc-components.WxAppOfferActionError | `@webex/cc-components` | `WxAppOfferActionError` (`WxAppOfferActionErrorProps`) | Inline wxApp offer-action error as red text below Accept/Decline; store-backed per `interactionId` | widget-internal / monorepo cross-package only; not a host-facing `@webex/cc-widgets` surface | `packages/contact-center/cc-components/ai-docs/cc-components-spec.md` | `packages/contact-center/cc-components/src/components/task/WxAppOfferActionError/wxapp-offer-action-error.tsx` |
Expand All @@ -44,7 +47,17 @@ The aggregator package `@webex/cc-widgets` re-exports every widget plus the `sto
| `@r2wc/react-to-web-component` | Wraps React widgets as custom elements (`packages/contact-center/cc-widgets/src/wc.ts:1`) | r2wc docs | Bundled with `cc-widgets` | N/A | per `package.json` |

## Compatibility & Deprecation Policy
- **Breaking-change rule:** Semver. A breaking change requires a major version bump. The breaking surface is: the named **package exports** above, the **custom-element tag names** (`widget-cc-*` in `packages/contact-center/cc-widgets/src/wc.ts:68-78`), and the **declared widget event/callback prop names**. Renaming/removing any of these, or changing a callback signature, is breaking. Adding a new widget, export, or optional prop is additive (minor).

The sealed AI summary SDK contract is documented in [`ai-summary.md`](../ai-summary.md).
Initiating mid-call and post-call results resolve `Promise<AISummary>` from the Task request methods.
Receiving-agent content arrives on `TASK_EVENTS.TASK_MID_CALL_SUMMARY_RECEIVED`
(`task:midCallSummaryReceived`); capability changes arrive on `TASK_EVENTS.TASK_FEATURE_ENABLEMENT`
(`task:featureEnablement`). The store owns subscriptions and response sends. The previous
three summary-event names and separate event-payload type exports are not part of this SDK.
`tooling/src/ai-summary-sdk-lock.js verify-sdk` always validates extracted candidate declarations
and runs the packed runtime suite, including legacy seals without a recorded harness marker.
Admission does not silently convert a failed probe into a successful receipt.
- **Breaking-change rule:** Semver. A breaking change requires a major version bump. The breaking surface is: the named **package exports** above, the **custom-element tag names** (`widget-cc-*` in `packages/contact-center/cc-widgets/src/wc.ts:68-78`, `component-cc-*` in `packages/contact-center/cc-components/src/wc.ts`), and the **declared widget/component event/callback prop names**. Renaming/removing any of these, narrowing a callback signature, or changing a required callback return type is breaking; `CallControlComponentProps.wrapupCall` changing from synchronous `void` to `Promise<WrapupCompletionResult>` is such a breaking migration. Adding a new widget, export, or optional prop is additive (minor).
- **Deprecation:** Releases are cut by `semantic-release` (`package.json`, `.releaserc`); commit type drives the version bump (`fix` → patch, `feat` → minor, breaking footer → major). Deprecated surfaces are kept for at least one minor release with a JSDoc `@deprecated` note before removal in a major.

## Maintenance
Expand Down
Loading
Loading