Compare commits

...
Author SHA1 Message Date
CI 2720727d5f Bump version to 0.1.0-RC.7 [skip ci] 2026-11-07 19:55:13 +00:00
james.maes 4b1c698a01 Merge pull request 'release: merge develop into release/0.1' (#35) from merge/develop-into-release-0.1 into release/0.1
build / maven (push) Successful in 1m40s
maven / build (push) Successful in 1m40s
2026-11-07 19:53:44 +00:00
James MaesandClaude Opus 5.5 1a148f6787 Merge develop into release/0.1
build / maven (push) Successful in 1m36s
maven / build (push) Successful in 1m36s
Keeps the release revision (0.1.0-RC.6) so the release build publishes the
next RC; legacy CircleCI/orb config taken from develop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:51:38 -06:00
james.maes 2508c6b93c Merge pull request 'build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)' (#34) from deps/align-gitea into develop
build / maven (push) Successful in 1m49s
maven / build (push) Successful in 1m49s
2026-11-07 19:50:51 +00:00
James MaesandClaude Opus 5.5 65f256351c refactor(delivery): adopt the core delivery SPI and classified values
build / maven (push) Successful in 1m13s
maven / build (push) Successful in 1m13s
Replace the qqq#1205 STAND-IN copy of the delivery SPI with the QQQ 4.1
core types (com.kingsrook.qqq.backend.core.delivery). The producer now
registers SlackDeliveryDestination as "slack" in the core
DeliveryDestinationsMetaData registry instead of deferring host
registration; a new test proves registration is idempotent and that core
loads the implementation from the registry.

Replace the qqq#1142 STAND-IN in SlackPayloadGuard: field classification
comes from core ClassifiedValues (honoring a host audit-value protector)
and tokenized restricted values use core ClassifiedValueTokens.changed().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:49:04 -06:00
james.maesandClaude Opus 5.5 cd3205e249 build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
build / maven (push) Failing after 4m10s
maven / build (push) Failing after 4m10s
pom.xml: parent -> 2.2.1
pom.xml: qqq.snapshot.version: 4.1.0-RC.7 -> 4.1.0-RC.26
pom.xml: qqq-frontend-next: 1.0.0-RC.19 -> 1.0.0-RC.38
pom.xml: added qqq.version=4.1.0-RC.26 (parent BOM import)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:09:23 +00:00
james.maes 26aac94b52 Merge pull request 'ci: pin shared workflow to v1' (#33) from ci/pin-v1-develop into develop
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (push) Successful in 13s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 10s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 13s
build / maven (push) Successful in 4m43s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
maven / build (push) Successful in 4m42s
2026-11-06 16:10:48 +00:00
james.maesandClaude Opus 5.5 7804c6aed7 ci: pin shared workflow to v1
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (pull_request) Successful in 8s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 7s
build / maven (push) Successful in 4m2s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 6s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
maven / build (push) Successful in 4m1s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:13:59 +00:00
james.maes e1f362b22c Merge pull request 'ci: use shared ci-workflows Maven workflow' (#32) from ci/ci-workflows into develop
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 5s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / ci-result (push) Successful in 4s
build / maven (push) Successful in 2m47s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow d20a578c7d818bc7ca32a2ac2c675da4e4f27385] (push) Successful in 5s
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
maven / build (push) Successful in 2m47s
2026-11-05 23:18:12 +00:00
CI bf57535353 ci: rerun shared workflow
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1b3648d9421543350067e95e54959dfb471b26d5] (pull_request) Failing after 3s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 1s
build / maven (push) Successful in 10m46s
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
maven / build (push) Successful in 10m46s
2026-11-05 16:27:14 -06:00
james.maesandClaude Opus 5.5 48a2387ac6 ci: use shared ci-workflows Maven workflow
build / maven (push) Failing after 1s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1b3648d9421543350067e95e54959dfb471b26d5] (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 7s
maven / build (push) Failing after 2s
QRun-IO/ci-policy: native / native-result (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
Replace the platform-ci release callers with one caller of
KofTwentyTwo/ci-workflows maven.yaml (qqq-orb port).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 22:08:36 +00:00
forge-recovery da103703aa ci: enroll shared Gitea lifecycle
QRun-IO/ci-policy: ci / ci-result (push) Successful in 4s
qrun-release / postpublish (push) Failing after 10m18s
Shared Java Maven CI / verify (push) Successful in 2m28s
QRun-IO/ci-policy: Shared Java Maven CI / verify (push) Successful in 1m52s
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
Shared Java Maven CI / secrets (push) Successful in 17s
QRun-IO/ci-policy: native / native-result (push) Successful in 6s
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
Shared Java Maven CI / gate (push) Successful in 12s
qrun-release / release (push) Successful in 33m18s
QRun-IO/ci-policy: Shared Java Maven CI / gate (push) Successful in 13s
Shared QRun source version / version (push) Failing after 10m18s
QRun-IO/ci-policy: ci / java-maven-6 (push) Successful in 33m29s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (push) Successful in 31s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
2026-11-02 22:23:52 +00:00
forge-recovery 6d4309d5a7 ci: enroll shared Gitea lifecycle
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: native / native-result (push) Successful in 10s
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (push) Successful in 2m14s
QRun-IO/ci-policy: ci / ci-result (push) Successful in 5s
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (push) Successful in 29s
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / gate (push) Successful in 18s
QRun-IO/ci-policy: ci / java-maven-6 (push) Successful in 20m31s
2026-11-02 21:34:30 +00:00
forge-recoveryandCodex d74e6a1a71 ci: enroll shared Gitea release-candidate lifecycle
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 18s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m45s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Successful in 17s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Successful in 1h6m11s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 6s
Release candidate / release-rc (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 6s
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 20:21:07 +00:00
c4312ea7a1 ci: add the isolated postpublish job to the QRun release caller
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
Shared Java Maven CI / secrets (push) Successful in 17s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 14s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
Shared Java Maven CI / verify (push) Canceled after 0s
qrun-release / postpublish (push) Canceled after 0s
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m11s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Successful in 10s
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Successful in 3h5m7s
QRun-IO/ci-policy: ci / ci-result (pull_request) Successful in 5s
Release candidate / release-rc (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 4s
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 2h26m33s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 15:53:53 +00:00
a5bae34659 ci: move the QRun release caller to the thin v2 contract
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Successful in 2m23s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Canceled after 0s
Shared Java Maven CI / verify (push) Canceled after 0s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-2 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-9 (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 4s
Shared Java Maven CI / secrets (push) Successful in 15s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Successful in 18s
QRun-IO/ci-policy: ci / java-maven-4 (pull_request) Canceled after 20m46s
Shared Java Maven CI / gate (push) Canceled after 0s
qrun-release / release (push) Canceled after 20m49s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 5s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 06:21:08 +00:00
forge-recoveryandCodex 0a03bfb501 ci: add the identical QRun release caller
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 1s
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-2 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-7 (pull_request) Skipped
QRun-IO/ci-policy: Shared Java Maven CI / verify (pull_request) Failing after 1s
QRun-IO/ci-policy: Shared Java Maven CI / secrets (pull_request) Failing after 1s
QRun-IO/ci-policy: Shared Java Maven CI / gate (pull_request) Failing after 0s
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-4 (pull_request) Failing after 1m32s
Co-Authored-By: Codex <noreply@openai.com>
2026-11-02 04:15:28 +00:00
james.maesandCodex 4745b31a05 ci: centralize release branch verification and workflows (#23)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 13:05:53 -05:00
james.maes a8c25d213e Bump version to 0.1.0-RC.6 [skip ci] 2026-10-15 00:08:42 -05:00
james.maesandClaude Opus 5.5 5d15b1f584 Merge develop into release/0.1 for 0.1.0-RC.6 (#13 unconfigured Slack health is UNKNOWN, never DOWN)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 00:00:21 -05:00
james.maes c76f1841f2 Bump version to 0.1.0-RC.5 [skip ci] 2026-10-14 21:54:03 -05:00
james.maesandClaude Opus 5.5 b873dcecc8 Merge develop into release/0.1 for 0.1.0-RC.5 (#11 help bundle)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:39:37 -05:00
james.maes 14fbe64bd4 Bump version to 0.1.0-RC.4 [skip ci] 2026-10-14 20:03:40 -05:00
james.maesandClaude Opus 5.5 fd82029453 Merge develop into release/0.1 for 0.1.0-RC.4 (#10 real Preferences SPI on RC.7)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:54:29 -05:00
james.maes e81297d6e5 Bump version to 0.1.0-RC.3 [skip ci] 2026-10-14 18:03:47 -05:00
james.maesandClaude Opus 5.5 0254d1b599 Merge develop into release/0.1 for 0.1.0-RC.3 (#9 tables work)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:47:59 -05:00
james.maesandClaude Opus 5.5 c22f8ba125 Bump version to 0.1.0-RC.2 [skip ci]
The orb published 0.1.0-RC.2 (CircleCI 22), but could not push its version commit because the CircleCI key for this repo is read-only. This commit records the published version on the release branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:09:25 -05:00
james.maesandClaude Opus 5.5 cdbfef9b4c Merge develop into release/0.1 for 0.1.0-RC.2 (#8 phase 2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 15:01:45 -05:00
james.maesandClaude Opus 5.5 92d42b3b07 Bump version to 0.1.0-RC.1 [skip ci]
The orb published 0.1.0-RC.1 (CircleCI 19), but could not push its version commit because the CircleCI key for this repo is read-only. This commit records the published version on the release branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 13:50:40 -05:00
15 changed files with 98 additions and 1710 deletions

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
name: build
on:
push:
jobs:
maven:
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1
secrets: inherit
+4
View File
@@ -6,6 +6,10 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Changed
- `SlackDeliveryDestination` now implements the QQQ 4.1 core delivery SPI (`com.kingsrook.qqq.backend.core.delivery`, qqq#1205) and the producer registers it as `slack` in the core `DeliveryDestinationsMetaData` registry; the stand-in SPI copy is removed.
- `SlackPayloadGuard` uses core `ClassifiedValues` for field classification and `ClassifiedValueTokens.changed()` for tokenized restricted values (qqq#1142), replacing its stand-in logic.
### Fixed
- QBit metadata now reports the Maven artifact version, including release versions, from a filtered properties resource.
+5 -4
View File
@@ -22,7 +22,8 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<properties>
<revision>0.1.0-SNAPSHOT</revision>
<qqq.version>4.1.0-RC.26</qqq.version> <!-- feeds qbit-build-parent's qqq-bom-pom import -->
<revision>0.1.0-RC.7</revision>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<jacoco.version>0.8.15</jacoco.version>
@@ -34,7 +35,7 @@
<parent>
<groupId>com.kingsrook</groupId>
<artifactId>qbit-build-parent</artifactId>
<version>2.1.1</version>
<version>2.2.1</version>
</parent>
<groupId>com.kingsrook.qbits</groupId>
@@ -77,7 +78,7 @@
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-frontend-next</artifactId>
<version>1.0.0-RC.19</version>
<version>1.0.0-RC.38</version>
<scope>test</scope>
</dependency>
<dependency>
@@ -241,7 +242,7 @@
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<qqq.snapshot.version>4.1.0-RC.7</qqq.snapshot.version>
<qqq.snapshot.version>4.1.0-RC.26</qqq.snapshot.version>
</properties>
<dependencyManagement>
<dependencies>
@@ -179,7 +179,7 @@ public class SlackQBitProducer implements QBitMetaDataProducer<SlackQBitConfig>
output.add(new SlackOutboxMessagingProviderMetaData().withName(qBitConfig.getBridgeProviderName()));
output.addSelfToInstance(qInstance);
com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination.register();
com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination.register(qInstance, getQBitConfig());
qInstance.addApp(com.kingsrook.qbits.slack.app.SlackApp.app(qInstance.getTables()));
com.kingsrook.qbits.slack.app.SlackApp.widgets().forEach(qInstance::addWidget);
if(isPreferencesAvailable())
@@ -26,15 +26,9 @@ import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.kingsrook.qbits.slack.SlackQBitConfig;
import com.kingsrook.qbits.slack.api.SlackApi;
import com.kingsrook.qbits.slack.api.SlackApiMessage;
import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationContext; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationInterface; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryRequest; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryResult; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryTargetOption; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryTargetStep; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.QDeliveryDestinationMetaData; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.metadata.SlackTables;
import com.kingsrook.qbits.slack.outbox.SlackSendRequest;
import com.kingsrook.qbits.slack.outbox.SlackSendResult;
@@ -45,45 +39,72 @@ import com.kingsrook.qbits.slack.support.SlackRuntime;
import com.kingsrook.qbits.slack.support.SlackStore;
import com.kingsrook.qqq.backend.core.actions.ai.DataClassification;
import com.kingsrook.qqq.backend.core.context.QContext;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationContext;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationInterface;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData;
import com.kingsrook.qqq.backend.core.delivery.DeliveryRequest;
import com.kingsrook.qqq.backend.core.delivery.DeliveryResult;
import com.kingsrook.qqq.backend.core.delivery.DeliveryTargetOption;
import com.kingsrook.qqq.backend.core.delivery.DeliveryTargetStep;
import com.kingsrook.qqq.backend.core.delivery.QDeliveryDestinationMetaData;
import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
import com.kingsrook.qqq.backend.core.model.session.QSystemUserSession;
/*******************************************************************************
** Host-callable Slack output destination until core's delivery SPI is released.
** Targets are workspaceId and where (me or a channel address from SlackApi).
** Slack output destination for the QQQ core delivery SPI
** (DeliveryDestinationInterface). The producer registers it in the core
** DeliveryDestinationsMetaData registry, so hosts that install core delivery
** offer it in their pickers. Targets are workspaceId and where (me or a
** channel address from SlackApi).
*******************************************************************************/
public class SlackDeliveryDestination implements DeliveryDestinationInterface
{
public static final String NAME = "slack";
/*******************************************************************************
** Describe the policy hosts must apply before invoking this destination.
** Describe the policy core applies before invoking this destination, using
** the Slack config of the current instance.
*******************************************************************************/
public QDeliveryDestinationMetaData metadata()
{
return (new QDeliveryDestinationMetaData().withName("slack").withLabel("Slack")
return (metadata(SlackRuntime.config()));
}
/*******************************************************************************
** Describe the policy core applies before invoking this destination.
*******************************************************************************/
public static QDeliveryDestinationMetaData metadata(SlackQBitConfig config)
{
return (new QDeliveryDestinationMetaData().withName(NAME).withLabel("Slack")
.withPermissionName("slack.send").withCodeReference(new QCodeReference(SlackDeliveryDestination.class))
.withMaxClassification(DataClassification.CONFIDENTIAL)
.withAboveMaxClassification(QDeliveryDestinationMetaData.AboveMaxClassification.REFUSE)
.withMaxAttachmentBytes(SlackRuntime.config().getMaxAttachmentBytes()).withAllowBearerLinks(false));
.withMaxAttachmentBytes(config.getMaxAttachmentBytes()).withAllowBearerLinks(false));
}
/*******************************************************************************
** Detect the real SPI without registering an incompatible temporary instance.
** Register with the core delivery registry; production may run repeatedly,
** and a destination already registered under this name is kept.
*******************************************************************************/
public static void register()
public static void register(QInstance instance, SlackQBitConfig config)
{
try
DeliveryDestinationsMetaData registry = DeliveryDestinationsMetaData.ofOrWithNew(instance);
if(registry.getDestinations().stream().noneMatch(destination -> NAME.equals(destination.getName())))
{
Class.forName("com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData");
com.kingsrook.qqq.backend.core.logging.QLogger.getLogger(SlackDeliveryDestination.class)
.info("Slack delivery stand-in will be replaced after RC.8; host registration is deferred"); // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
}
catch(ClassNotFoundException e)
{
// RC.6 hosts use this destination directly.
registry.withDestination(metadata(config));
}
}
/*******************************************************************************
** Offer only active connections and membership-checked targets of this user.
*******************************************************************************/
@@ -1,193 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
/*******************************************************************************
** DeliveryAttachment.
*******************************************************************************/
public class DeliveryAttachment implements java.io.Serializable
{
private String fileName;
private String mimeType;
private Long size;
private String storageTableName;
private String storageReference;
/*******************************************************************************
** Get fileName.
*******************************************************************************/
public String getFileName()
{
return (fileName);
}
/*******************************************************************************
** Set fileName.
*******************************************************************************/
public void setFileName(String fileName)
{
this.fileName = fileName;
}
/*******************************************************************************
** With fileName.
*******************************************************************************/
public DeliveryAttachment withFileName(String fileName)
{
this.fileName = fileName;
return (this);
}
/*******************************************************************************
** Get mimeType.
*******************************************************************************/
public String getMimeType()
{
return (mimeType);
}
/*******************************************************************************
** Set mimeType.
*******************************************************************************/
public void setMimeType(String mimeType)
{
this.mimeType = mimeType;
}
/*******************************************************************************
** With mimeType.
*******************************************************************************/
public DeliveryAttachment withMimeType(String mimeType)
{
this.mimeType = mimeType;
return (this);
}
/*******************************************************************************
** Get size.
*******************************************************************************/
public Long getSize()
{
return (size);
}
/*******************************************************************************
** Set size.
*******************************************************************************/
public void setSize(Long size)
{
this.size = size;
}
/*******************************************************************************
** With size.
*******************************************************************************/
public DeliveryAttachment withSize(Long size)
{
this.size = size;
return (this);
}
/*******************************************************************************
** Get storageTableName.
*******************************************************************************/
public String getStorageTableName()
{
return (storageTableName);
}
/*******************************************************************************
** Set storageTableName.
*******************************************************************************/
public void setStorageTableName(String storageTableName)
{
this.storageTableName = storageTableName;
}
/*******************************************************************************
** With storageTableName.
*******************************************************************************/
public DeliveryAttachment withStorageTableName(String storageTableName)
{
this.storageTableName = storageTableName;
return (this);
}
/*******************************************************************************
** Get storageReference.
*******************************************************************************/
public String getStorageReference()
{
return (storageReference);
}
/*******************************************************************************
** Set storageReference.
*******************************************************************************/
public void setStorageReference(String storageReference)
{
this.storageReference = storageReference;
}
/*******************************************************************************
** With storageReference.
*******************************************************************************/
public DeliveryAttachment withStorageReference(String storageReference)
{
this.storageReference = storageReference;
return (this);
}
}
@@ -1,65 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
/*******************************************************************************
** DeliveryDestinationContext.
*******************************************************************************/
public class DeliveryDestinationContext implements java.io.Serializable
{
private QDeliveryDestinationMetaData destination;
/*******************************************************************************
** Get destination.
*******************************************************************************/
public QDeliveryDestinationMetaData getDestination()
{
return (destination);
}
/*******************************************************************************
** Set destination.
*******************************************************************************/
public void setDestination(QDeliveryDestinationMetaData destination)
{
this.destination = destination;
}
/*******************************************************************************
** With destination.
*******************************************************************************/
public DeliveryDestinationContext withDestination(QDeliveryDestinationMetaData destination)
{
this.destination = destination;
return (this);
}
}
@@ -1,69 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.kingsrook.qqq.backend.core.exceptions.QException;
/*******************************************************************************
** Owner-scoped output delivery provider.
*******************************************************************************/
public interface DeliveryDestinationInterface
{
/*******************************************************************************
** Describe the next target in the current owner session.
*******************************************************************************/
DeliveryTargetStep describeTargets(DeliveryDestinationContext context, Map<String, Serializable> chosen) throws QException;
/*******************************************************************************
** Validate a complete target before sending.
*******************************************************************************/
default List<String> validate(DeliveryRequest request) throws QException
{
return (List.of());
}
/*******************************************************************************
** Deliver idempotently using the request key.
*******************************************************************************/
DeliveryResult deliver(DeliveryRequest request) throws QException;
/*******************************************************************************
** Reconcile a previous delivery when supported.
*******************************************************************************/
default Optional<DeliveryResult> lookup(String idempotencyKey) throws QException
{
return (Optional.empty());
}
}
@@ -1,453 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.kingsrook.qqq.backend.core.actions.ai.DataClassification;
/*******************************************************************************
** DeliveryRequest.
*******************************************************************************/
public class DeliveryRequest implements java.io.Serializable
{
private String destinationName;
private String ownerUserId;
private String sourceType;
private String sourceKey;
private String title;
private String summary;
private String link;
private String idempotencyKey;
private Map<String, Serializable> targetValues = Map.of();
private List<DeliveryAttachment> attachments = List.of();
private DataClassification contentClassification;
private List<String> restrictedFieldLabels = List.of();
private boolean leaveOutRestricted;
/*******************************************************************************
** Get destinationName.
*******************************************************************************/
public String getDestinationName()
{
return (destinationName);
}
/*******************************************************************************
** Set destinationName.
*******************************************************************************/
public void setDestinationName(String destinationName)
{
this.destinationName = destinationName;
}
/*******************************************************************************
** With destinationName.
*******************************************************************************/
public DeliveryRequest withDestinationName(String destinationName)
{
this.destinationName = destinationName;
return (this);
}
/*******************************************************************************
** Get ownerUserId.
*******************************************************************************/
public String getOwnerUserId()
{
return (ownerUserId);
}
/*******************************************************************************
** Set ownerUserId.
*******************************************************************************/
public void setOwnerUserId(String ownerUserId)
{
this.ownerUserId = ownerUserId;
}
/*******************************************************************************
** With ownerUserId.
*******************************************************************************/
public DeliveryRequest withOwnerUserId(String ownerUserId)
{
this.ownerUserId = ownerUserId;
return (this);
}
/*******************************************************************************
** Get sourceType.
*******************************************************************************/
public String getSourceType()
{
return (sourceType);
}
/*******************************************************************************
** Set sourceType.
*******************************************************************************/
public void setSourceType(String sourceType)
{
this.sourceType = sourceType;
}
/*******************************************************************************
** With sourceType.
*******************************************************************************/
public DeliveryRequest withSourceType(String sourceType)
{
this.sourceType = sourceType;
return (this);
}
/*******************************************************************************
** Get sourceKey.
*******************************************************************************/
public String getSourceKey()
{
return (sourceKey);
}
/*******************************************************************************
** Set sourceKey.
*******************************************************************************/
public void setSourceKey(String sourceKey)
{
this.sourceKey = sourceKey;
}
/*******************************************************************************
** With sourceKey.
*******************************************************************************/
public DeliveryRequest withSourceKey(String sourceKey)
{
this.sourceKey = sourceKey;
return (this);
}
/*******************************************************************************
** Get title.
*******************************************************************************/
public String getTitle()
{
return (title);
}
/*******************************************************************************
** Set title.
*******************************************************************************/
public void setTitle(String title)
{
this.title = title;
}
/*******************************************************************************
** With title.
*******************************************************************************/
public DeliveryRequest withTitle(String title)
{
this.title = title;
return (this);
}
/*******************************************************************************
** Get summary.
*******************************************************************************/
public String getSummary()
{
return (summary);
}
/*******************************************************************************
** Set summary.
*******************************************************************************/
public void setSummary(String summary)
{
this.summary = summary;
}
/*******************************************************************************
** With summary.
*******************************************************************************/
public DeliveryRequest withSummary(String summary)
{
this.summary = summary;
return (this);
}
/*******************************************************************************
** Get link.
*******************************************************************************/
public String getLink()
{
return (link);
}
/*******************************************************************************
** Set link.
*******************************************************************************/
public void setLink(String link)
{
this.link = link;
}
/*******************************************************************************
** With link.
*******************************************************************************/
public DeliveryRequest withLink(String link)
{
this.link = link;
return (this);
}
/*******************************************************************************
** Get idempotencyKey.
*******************************************************************************/
public String getIdempotencyKey()
{
return (idempotencyKey);
}
/*******************************************************************************
** Set idempotencyKey.
*******************************************************************************/
public void setIdempotencyKey(String idempotencyKey)
{
this.idempotencyKey = idempotencyKey;
}
/*******************************************************************************
** With idempotencyKey.
*******************************************************************************/
public DeliveryRequest withIdempotencyKey(String idempotencyKey)
{
this.idempotencyKey = idempotencyKey;
return (this);
}
/*******************************************************************************
** Get targetValues.
*******************************************************************************/
public Map<String, Serializable> getTargetValues()
{
return (targetValues);
}
/*******************************************************************************
** Set targetValues.
*******************************************************************************/
public void setTargetValues(Map<String, Serializable> targetValues)
{
this.targetValues = targetValues;
}
/*******************************************************************************
** With targetValues.
*******************************************************************************/
public DeliveryRequest withTargetValues(Map<String, Serializable> targetValues)
{
this.targetValues = targetValues;
return (this);
}
/*******************************************************************************
** Get attachments.
*******************************************************************************/
public List<DeliveryAttachment> getAttachments()
{
return (attachments);
}
/*******************************************************************************
** Set attachments.
*******************************************************************************/
public void setAttachments(List<DeliveryAttachment> attachments)
{
this.attachments = attachments;
}
/*******************************************************************************
** With attachments.
*******************************************************************************/
public DeliveryRequest withAttachments(List<DeliveryAttachment> attachments)
{
this.attachments = attachments;
return (this);
}
/*******************************************************************************
** Get contentClassification.
*******************************************************************************/
public DataClassification getContentClassification()
{
return (contentClassification);
}
/*******************************************************************************
** Set contentClassification.
*******************************************************************************/
public void setContentClassification(DataClassification contentClassification)
{
this.contentClassification = contentClassification;
}
/*******************************************************************************
** With contentClassification.
*******************************************************************************/
public DeliveryRequest withContentClassification(DataClassification contentClassification)
{
this.contentClassification = contentClassification;
return (this);
}
/*******************************************************************************
** Get restrictedFieldLabels.
*******************************************************************************/
public List<String> getRestrictedFieldLabels()
{
return (restrictedFieldLabels);
}
/*******************************************************************************
** Set restrictedFieldLabels.
*******************************************************************************/
public void setRestrictedFieldLabels(List<String> restrictedFieldLabels)
{
this.restrictedFieldLabels = restrictedFieldLabels;
}
/*******************************************************************************
** With restrictedFieldLabels.
*******************************************************************************/
public DeliveryRequest withRestrictedFieldLabels(List<String> restrictedFieldLabels)
{
this.restrictedFieldLabels = restrictedFieldLabels;
return (this);
}
/*******************************************************************************
** Get leaveOutRestricted.
*******************************************************************************/
public boolean getLeaveOutRestricted()
{
return (leaveOutRestricted);
}
/*******************************************************************************
** Set leaveOutRestricted.
*******************************************************************************/
public void setLeaveOutRestricted(boolean leaveOutRestricted)
{
this.leaveOutRestricted = leaveOutRestricted;
}
/*******************************************************************************
** With leaveOutRestricted.
*******************************************************************************/
public DeliveryRequest withLeaveOutRestricted(boolean leaveOutRestricted)
{
this.leaveOutRestricted = leaveOutRestricted;
return (this);
}
}
@@ -1,139 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import java.util.List;
/*******************************************************************************
** DeliveryResult.
*******************************************************************************/
public class DeliveryResult implements java.io.Serializable
{
/*******************************************************************************
** Recorded delivery outcome.
*******************************************************************************/
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
public enum Status
{
DELIVERED, QUEUED, REFUSED, FAILED_RETRYABLE, FAILED, UNAUTHORIZED
}
private Status status;
private String externalReference;
private List<String> reasons = List.of();
/*******************************************************************************
** Get status.
*******************************************************************************/
public Status getStatus()
{
return (status);
}
/*******************************************************************************
** Set status.
*******************************************************************************/
public void setStatus(Status status)
{
this.status = status;
}
/*******************************************************************************
** With status.
*******************************************************************************/
public DeliveryResult withStatus(Status status)
{
this.status = status;
return (this);
}
/*******************************************************************************
** Get externalReference.
*******************************************************************************/
public String getExternalReference()
{
return (externalReference);
}
/*******************************************************************************
** Set externalReference.
*******************************************************************************/
public void setExternalReference(String externalReference)
{
this.externalReference = externalReference;
}
/*******************************************************************************
** With externalReference.
*******************************************************************************/
public DeliveryResult withExternalReference(String externalReference)
{
this.externalReference = externalReference;
return (this);
}
/*******************************************************************************
** Get reasons.
*******************************************************************************/
public List<String> getReasons()
{
return (reasons);
}
/*******************************************************************************
** Set reasons.
*******************************************************************************/
public void setReasons(List<String> reasons)
{
this.reasons = reasons;
}
/*******************************************************************************
** With reasons.
*******************************************************************************/
public DeliveryResult withReasons(List<String> reasons)
{
this.reasons = reasons;
return (this);
}
}
@@ -1,129 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
/*******************************************************************************
** DeliveryTargetOption.
*******************************************************************************/
public class DeliveryTargetOption implements java.io.Serializable
{
private String value;
private String label;
private String description;
/*******************************************************************************
** Get value.
*******************************************************************************/
public String getValue()
{
return (value);
}
/*******************************************************************************
** Set value.
*******************************************************************************/
public void setValue(String value)
{
this.value = value;
}
/*******************************************************************************
** With value.
*******************************************************************************/
public DeliveryTargetOption withValue(String value)
{
this.value = value;
return (this);
}
/*******************************************************************************
** Get label.
*******************************************************************************/
public String getLabel()
{
return (label);
}
/*******************************************************************************
** Set label.
*******************************************************************************/
public void setLabel(String label)
{
this.label = label;
}
/*******************************************************************************
** With label.
*******************************************************************************/
public DeliveryTargetOption withLabel(String label)
{
this.label = label;
return (this);
}
/*******************************************************************************
** Get description.
*******************************************************************************/
public String getDescription()
{
return (description);
}
/*******************************************************************************
** Set description.
*******************************************************************************/
public void setDescription(String description)
{
this.description = description;
}
/*******************************************************************************
** With description.
*******************************************************************************/
public DeliveryTargetOption withDescription(String description)
{
this.description = description;
return (this);
}
}
@@ -1,226 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import java.util.List;
/*******************************************************************************
** DeliveryTargetStep.
*******************************************************************************/
public class DeliveryTargetStep implements java.io.Serializable
{
private String name;
private String label;
private List<DeliveryTargetOption> options = List.of();
private boolean freeText;
private boolean complete;
private String summary;
/*******************************************************************************
** Get name.
*******************************************************************************/
public String getName()
{
return (name);
}
/*******************************************************************************
** Set name.
*******************************************************************************/
public void setName(String name)
{
this.name = name;
}
/*******************************************************************************
** With name.
*******************************************************************************/
public DeliveryTargetStep withName(String name)
{
this.name = name;
return (this);
}
/*******************************************************************************
** Get label.
*******************************************************************************/
public String getLabel()
{
return (label);
}
/*******************************************************************************
** Set label.
*******************************************************************************/
public void setLabel(String label)
{
this.label = label;
}
/*******************************************************************************
** With label.
*******************************************************************************/
public DeliveryTargetStep withLabel(String label)
{
this.label = label;
return (this);
}
/*******************************************************************************
** Get options.
*******************************************************************************/
public List<DeliveryTargetOption> getOptions()
{
return (options);
}
/*******************************************************************************
** Set options.
*******************************************************************************/
public void setOptions(List<DeliveryTargetOption> options)
{
this.options = options;
}
/*******************************************************************************
** With options.
*******************************************************************************/
public DeliveryTargetStep withOptions(List<DeliveryTargetOption> options)
{
this.options = options;
return (this);
}
/*******************************************************************************
** Get freeText.
*******************************************************************************/
public boolean getFreeText()
{
return (freeText);
}
/*******************************************************************************
** Set freeText.
*******************************************************************************/
public void setFreeText(boolean freeText)
{
this.freeText = freeText;
}
/*******************************************************************************
** With freeText.
*******************************************************************************/
public DeliveryTargetStep withFreeText(boolean freeText)
{
this.freeText = freeText;
return (this);
}
/*******************************************************************************
** Get complete.
*******************************************************************************/
public boolean getComplete()
{
return (complete);
}
/*******************************************************************************
** Set complete.
*******************************************************************************/
public void setComplete(boolean complete)
{
this.complete = complete;
}
/*******************************************************************************
** With complete.
*******************************************************************************/
public DeliveryTargetStep withComplete(boolean complete)
{
this.complete = complete;
return (this);
}
/*******************************************************************************
** Get summary.
*******************************************************************************/
public String getSummary()
{
return (summary);
}
/*******************************************************************************
** Set summary.
*******************************************************************************/
public void setSummary(String summary)
{
this.summary = summary;
}
/*******************************************************************************
** With summary.
*******************************************************************************/
public DeliveryTargetStep withSummary(String summary)
{
this.summary = summary;
return (this);
}
}
@@ -1,396 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2026. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kingsrook.qbits.slack.delivery.standin; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qqq.backend.core.actions.ai.DataClassification;
import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference;
/*******************************************************************************
** QDeliveryDestinationMetaData.
*******************************************************************************/
public class QDeliveryDestinationMetaData implements java.io.Serializable
{
/*******************************************************************************
** Policy for content above the destination ceiling.
*******************************************************************************/
// STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
public enum AboveMaxClassification
{
REFUSE, LINK_ONLY
}
private String name;
private String label;
private String icon;
private String permissionName;
private String emailProviderName;
private Integer order = 0;
private QCodeReference codeReference;
private DataClassification maxClassification = DataClassification.PUBLIC;
private Long maxAttachmentBytes;
private boolean allowBearerLinks;
private AboveMaxClassification aboveMaxClassification = AboveMaxClassification.REFUSE;
/*******************************************************************************
** Get name.
*******************************************************************************/
public String getName()
{
return (name);
}
/*******************************************************************************
** Set name.
*******************************************************************************/
public void setName(String name)
{
this.name = name;
}
/*******************************************************************************
** With name.
*******************************************************************************/
public QDeliveryDestinationMetaData withName(String name)
{
this.name = name;
return (this);
}
/*******************************************************************************
** Get label.
*******************************************************************************/
public String getLabel()
{
return (label);
}
/*******************************************************************************
** Set label.
*******************************************************************************/
public void setLabel(String label)
{
this.label = label;
}
/*******************************************************************************
** With label.
*******************************************************************************/
public QDeliveryDestinationMetaData withLabel(String label)
{
this.label = label;
return (this);
}
/*******************************************************************************
** Get icon.
*******************************************************************************/
public String getIcon()
{
return (icon);
}
/*******************************************************************************
** Set icon.
*******************************************************************************/
public void setIcon(String icon)
{
this.icon = icon;
}
/*******************************************************************************
** With icon.
*******************************************************************************/
public QDeliveryDestinationMetaData withIcon(String icon)
{
this.icon = icon;
return (this);
}
/*******************************************************************************
** Get permissionName.
*******************************************************************************/
public String getPermissionName()
{
return (permissionName);
}
/*******************************************************************************
** Set permissionName.
*******************************************************************************/
public void setPermissionName(String permissionName)
{
this.permissionName = permissionName;
}
/*******************************************************************************
** With permissionName.
*******************************************************************************/
public QDeliveryDestinationMetaData withPermissionName(String permissionName)
{
this.permissionName = permissionName;
return (this);
}
/*******************************************************************************
** Get emailProviderName.
*******************************************************************************/
public String getEmailProviderName()
{
return (emailProviderName);
}
/*******************************************************************************
** Set emailProviderName.
*******************************************************************************/
public void setEmailProviderName(String emailProviderName)
{
this.emailProviderName = emailProviderName;
}
/*******************************************************************************
** With emailProviderName.
*******************************************************************************/
public QDeliveryDestinationMetaData withEmailProviderName(String emailProviderName)
{
this.emailProviderName = emailProviderName;
return (this);
}
/*******************************************************************************
** Get order.
*******************************************************************************/
public Integer getOrder()
{
return (order);
}
/*******************************************************************************
** Set order.
*******************************************************************************/
public void setOrder(Integer order)
{
this.order = order;
}
/*******************************************************************************
** With order.
*******************************************************************************/
public QDeliveryDestinationMetaData withOrder(Integer order)
{
this.order = order;
return (this);
}
/*******************************************************************************
** Get codeReference.
*******************************************************************************/
public QCodeReference getCodeReference()
{
return (codeReference);
}
/*******************************************************************************
** Set codeReference.
*******************************************************************************/
public void setCodeReference(QCodeReference codeReference)
{
this.codeReference = codeReference;
}
/*******************************************************************************
** With codeReference.
*******************************************************************************/
public QDeliveryDestinationMetaData withCodeReference(QCodeReference codeReference)
{
this.codeReference = codeReference;
return (this);
}
/*******************************************************************************
** Get maxClassification.
*******************************************************************************/
public DataClassification getMaxClassification()
{
return (maxClassification);
}
/*******************************************************************************
** Set maxClassification.
*******************************************************************************/
public void setMaxClassification(DataClassification maxClassification)
{
this.maxClassification = maxClassification;
}
/*******************************************************************************
** With maxClassification.
*******************************************************************************/
public QDeliveryDestinationMetaData withMaxClassification(DataClassification maxClassification)
{
this.maxClassification = maxClassification;
return (this);
}
/*******************************************************************************
** Get maxAttachmentBytes.
*******************************************************************************/
public Long getMaxAttachmentBytes()
{
return (maxAttachmentBytes);
}
/*******************************************************************************
** Set maxAttachmentBytes.
*******************************************************************************/
public void setMaxAttachmentBytes(Long maxAttachmentBytes)
{
this.maxAttachmentBytes = maxAttachmentBytes;
}
/*******************************************************************************
** With maxAttachmentBytes.
*******************************************************************************/
public QDeliveryDestinationMetaData withMaxAttachmentBytes(Long maxAttachmentBytes)
{
this.maxAttachmentBytes = maxAttachmentBytes;
return (this);
}
/*******************************************************************************
** Get allowBearerLinks.
*******************************************************************************/
public boolean getAllowBearerLinks()
{
return (allowBearerLinks);
}
/*******************************************************************************
** Set allowBearerLinks.
*******************************************************************************/
public void setAllowBearerLinks(boolean allowBearerLinks)
{
this.allowBearerLinks = allowBearerLinks;
}
/*******************************************************************************
** With allowBearerLinks.
*******************************************************************************/
public QDeliveryDestinationMetaData withAllowBearerLinks(boolean allowBearerLinks)
{
this.allowBearerLinks = allowBearerLinks;
return (this);
}
/*******************************************************************************
** Get aboveMaxClassification.
*******************************************************************************/
public AboveMaxClassification getAboveMaxClassification()
{
return (aboveMaxClassification);
}
/*******************************************************************************
** Set aboveMaxClassification.
*******************************************************************************/
public void setAboveMaxClassification(AboveMaxClassification aboveMaxClassification)
{
this.aboveMaxClassification = aboveMaxClassification;
}
/*******************************************************************************
** With aboveMaxClassification.
*******************************************************************************/
public QDeliveryDestinationMetaData withAboveMaxClassification(AboveMaxClassification aboveMaxClassification)
{
this.aboveMaxClassification = aboveMaxClassification;
return (this);
}
}
@@ -27,15 +27,16 @@ import java.util.Map;
import java.util.regex.Pattern;
import com.kingsrook.qbits.slack.support.SlackRuntime;
import com.kingsrook.qbits.slack.template.VariableSchema;
import com.kingsrook.qqq.backend.core.actions.ai.AiDataClassifications;
import com.kingsrook.qqq.backend.core.actions.ai.DataClassification;
import com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.ClassifiedValueTokens;
import com.kingsrook.qqq.backend.core.actions.permissions.fieldaccess.ClassifiedValues;
import com.kingsrook.qqq.backend.core.context.QContext;
/*******************************************************************************
** Refuse restricted content before persistence. Uses RC.6 field classifications.
** STAND-IN(core=QRun-IO/qqq#1142, removeBy=4.1.0-RC.8): ClassifiedValues and
** ClassifiedValueTokens are absent in RC.6. Restricted tokens use changed:v1,
** a deliberately non-reversible marker, never a hash of a low-entropy value.
** Refuse restricted content before persistence. Field classification comes
** from core ClassifiedValues (which honors a host's audit-value protector);
** tokenized restricted values become core ClassifiedValueTokens.changed(), a
** deliberately non-reversible marker, never a hash of a low-entropy value.
*******************************************************************************/
public final class SlackPayloadGuard
{
@@ -88,7 +89,10 @@ public final class SlackPayloadGuard
{
throw (new IllegalArgumentException("Unknown classified field"));
}
classification = DataClassification.max(classification, AiDataClassifications.ofField(table, field));
if(ClassifiedValues.isClassified(table, field))
{
return (true);
}
}
return (classification != null && classification.isAtLeast(DataClassification.PII));
}
@@ -123,7 +127,7 @@ public final class SlackPayloadGuard
{
throw (new RestrictedVariableException(declaration.name()));
}
safe.put(entry.getKey(), "changed:v1");
safe.put(entry.getKey(), ClassifiedValueTokens.changed());
}
else
{
@@ -145,7 +149,7 @@ public final class SlackPayloadGuard
{
throw (new RestrictedVariableException(declaration.name()));
}
safe.put(declaration.name(), "changed:v1");
safe.put(declaration.name(), ClassifiedValueTokens.changed());
}
}
return (safe);
@@ -168,7 +172,7 @@ public final class SlackPayloadGuard
{
throw (new IllegalArgumentException("Restricted template variable"));
}
return ("changed:v1");
return (ClassifiedValueTokens.changed());
}
return (sanitize(classified.value(), tokenize));
}
@@ -25,16 +25,18 @@ import java.util.Map;
import com.kingsrook.qbits.slack.api.SlackApi;
import com.kingsrook.qbits.slack.delivery.SlackDeliveryDestination;
import com.kingsrook.qbits.slack.delivery.SlackDispatcher;
import com.kingsrook.qbits.slack.delivery.standin.DeliveryAttachment; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryDestinationContext; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryRequest; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.delivery.standin.DeliveryResult; // STAND-IN(core=QRun-IO/qqq#1205, removeBy=4.1.0-RC.8)
import com.kingsrook.qbits.slack.metadata.SlackTables;
import com.kingsrook.qbits.slack.security.SlackSecurity;
import com.kingsrook.qbits.slack.support.SlackStore;
import com.kingsrook.qbits.slack.template.SlackTemplates;
import com.kingsrook.qqq.backend.core.actions.ai.DataClassification;
import com.kingsrook.qqq.backend.core.actions.tables.StorageAction;
import com.kingsrook.qqq.backend.core.delivery.DeliveryAttachment;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationContext;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinations;
import com.kingsrook.qqq.backend.core.delivery.DeliveryDestinationsMetaData;
import com.kingsrook.qqq.backend.core.delivery.DeliveryRequest;
import com.kingsrook.qqq.backend.core.delivery.DeliveryResult;
import com.kingsrook.qqq.backend.core.model.actions.tables.storage.StorageInput;
import com.kingsrook.qqq.backend.core.model.data.QRecord;
import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
@@ -126,6 +128,25 @@ class SlackDeliveryDestinationTest
assertThat(context.getDestination().getMaxAttachmentBytes()).isEqualTo(env.config().getMaxAttachmentBytes());
}
/*******************************************************************************
** The producer registers Slack once in the core delivery registry, and core
** loads this implementation from it.
*******************************************************************************/
@Test
void registeredWithCoreDelivery() throws Exception
{
var registry = DeliveryDestinationsMetaData.of(env.instance());
assertThat(registry).isNotNull();
SlackDeliveryDestination.register(env.instance(), env.config());
var registered = registry.getDestinations().stream().filter(d -> SlackDeliveryDestination.NAME.equals(d.getName())).toList();
assertThat(registered).singleElement().satisfies(d ->
{
assertThat(d.getPermissionName()).isEqualTo("slack.send");
assertThat(d.getMaxAttachmentBytes()).isEqualTo(env.config().getMaxAttachmentBytes());
});
assertThat(DeliveryDestinations.implementation(registered.getFirst())).isInstanceOf(SlackDeliveryDestination.class);
}
/*******************************************************************************
** DM and channel use the delivery template and preserve the idempotency key.
*******************************************************************************/