You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,7 +27,7 @@ Atmosphere is built for teams that need AI agents to behave like production serv
27
27
| Stream to real clients | WebSocket, SSE, long-polling, and gRPC run through one broadcaster pipeline as always-on defaults; WebTransport over HTTP/3 is optional (needs `jetty-http3-server` or `reactor-netty-http` on the classpath plus a dev cert) |
28
28
| Swap AI integrations | One `AgentRuntime` SPI with twelve runtime adapters and contract-tested capability flags |
29
29
| Govern execution | Policy admission, `@AgentScope`, human approval, plan-and-verify, cost ceilings, PII rewriting, and admin kill switches |
30
-
| Pause for humans | Durable HITL approvals park virtual threads, persist workflow state, and resume through REST approval surfaces |
30
+
| Pause for humans | Durable HITL approvals hibernate without holding a thread, persist workflow state, and resume through REST approval surfaces |
31
31
| Resume long runs | Durable sessions, run IDs, replay buffers, checkpoints, and reconnect-safe continuation |
32
32
| Expose the same agent everywhere | Browser endpoints plus MCP (stateless **2026-07-28** RC + sessions back to 2024-11-05), A2A, AG-UI, Slack, Telegram, Discord, WhatsApp, and Messenger modules |
33
33
@@ -242,7 +242,6 @@ For Java/Kotlin clients, use [wAsync](modules/wasync/) for async WebSocket, SSE,
242
242
|[startup team](samples/spring-boot-multi-agent-startup-team/)|`@Coordinator` with A2A specialists, governance, checkpoints, skills, admin control plane |
243
243
|[ai-chat](samples/spring-boot-ai-chat/)| Streaming AI chat with auth, caching, and runtime adapter portability |
244
244
|[ai-tools](samples/spring-boot-ai-tools/)| Framework-agnostic `@AiTool` methods and approval gates |
245
-
|[durable-hitl](samples/spring-boot-durable-hitl/)| Human approval gates that persist, resume, and replay across reconnects |
246
245
|[checkpoint-agent](samples/spring-boot-checkpoint-agent/)| Checkpointed `@Coordinator` workflow with REST approval/resume |
247
246
|[ai-classroom](samples/spring-boot-ai-classroom/)| Multi-room collaborative AI with React Native / Expo client |
248
247
|[guarded-email-agent](samples/spring-boot-guarded-email-agent/)| Plan-and-verify taint protection before any email tool fires |
Copy file name to clipboardExpand all lines: docs/governance-policy-plane.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -87,10 +87,10 @@ Implementations must be thread-safe, side-effect-free (except for metrics/loggin
87
87
`org.atmosphere.ai.governance.PolicyParser` — parse a declarative artifact into `List<GovernancePolicy>`. The SPI contract supports `java.util.ServiceLoader` discovery; three implementations ship in-tree:
88
88
89
89
-**`YamlPolicyParser`** (`format() = "yaml"`, `modules/ai`) — SnakeYAML `SafeConstructor` (no arbitrary class instantiation). Auto-detects Atmosphere-native vs Microsoft Agent Governance Toolkit schema by inspecting the root keys. Registered via `META-INF/services/org.atmosphere.ai.governance.PolicyParser`, so adding `atmosphere-ai` to the classpath is enough to wire it up.
90
-
-**`RegoPolicyParser`** (`modules/ai-policy-rego`) — wraps an external OPA process via `RegoEvaluator`. **Wired programmatically**: instantiate with `new RegoPolicyParser(registry)` and pass it where you'd otherwise consume a `YamlPolicyParser`. No `META-INF/services` entry ships today, so adding the dependency alone does not auto-discover it.
91
-
-**`CedarPolicyParser`** (`modules/ai-policy-cedar`) — Cedar policy text via `CedarAuthorizer` / `CedarCliAuthorizer`. Same posture as Rego: programmatic wiring, no `META-INF/services` entry.
90
+
-**`RegoPolicyParser`** (`modules/ai-policy-rego`) — wraps an external OPA process via `RegoEvaluator`. Registered via `META-INF/services/org.atmosphere.ai.governance.PolicyParser` (same as `YamlPolicyParser`), so adding `atmosphere-ai-policy-rego` to the classpath is enough to auto-discover it. Programmatic wiring (`new RegoPolicyParser(registry)`) remains available for callers who want explicit control.
91
+
-**`CedarPolicyParser`** (`modules/ai-policy-cedar`) — Cedar policy text via `CedarAuthorizer` / `CedarCliAuthorizer`. Same posture as Rego: ships a `META-INF/services/org.atmosphere.ai.governance.PolicyParser` entry, so adding `atmosphere-ai-policy-cedar` to the classpath auto-discovers it.
92
92
93
-
Third-party parsers can register either path. ServiceLoader auto-discovery is the SPI-level recipe (ship a `PolicyParser` impl plus a `META-INF/services/org.atmosphere.ai.governance.PolicyParser` entry); programmatic wiring is the recipe the in-tree Rego/Cedar adapters use today.
93
+
Third-party parsers can register either path. ServiceLoader auto-discovery is the SPI-level recipe (ship a `PolicyParser` impl plus a `META-INF/services/org.atmosphere.ai.governance.PolicyParser` entry); all three in-tree adapters (Yaml/Rego/Cedar) ship such an entry, so they auto-discover from the classpath. Programmatic wiring remains available for callers who want explicit control.
94
94
95
95
The audit-sink family follows the same posture: `AsyncAuditSink` ships in `modules/ai`; `KafkaAuditSink` (`modules/ai-audit-kafka`) and `JdbcAuditSink` (`modules/ai-audit-postgres`) are wired programmatically as well — no `META-INF/services` entries.
Every runtime emits `TokenUsage` via `StreamingSession.usage()` when the underlying API provides token counts, feeding `ai.tokens.*` metadata into `MetricsCapturingSession` and `MicrometerAiMetrics`. Capability declarations are pinned in each runtime's contract test (`AbstractAgentRuntimeContractTest.expectedCapabilities()`), so the table above cannot drift from the running code without breaking the build. The aggregate counts ("12 runtimes") and the per-row capability lists are additionally pinned against `.harness/capabilities.snapshot.json` by `CapabilitySnapshotTest` and `scripts/validate-capability-claims.sh` (run from pre-push), so prose claims about the matrix break the build alongside code drift.
52
+
Every runtime emits `TokenUsage` via `StreamingSession.usage()` when the underlying API provides token counts, feeding `ai.tokens.*` metadata into `MetricsCapturingSession` and `MicrometerAiMetrics`. Capability declarations are pinned in each runtime's contract test (`AbstractAgentRuntimeContractTest.expectedCapabilities()`), so the table above cannot drift from the running code without breaking the build. The aggregate counts ("12 runtimes") and the per-row capability lists are additionally pinned against `.harness/capabilities.snapshot.json` by `CapabilitySnapshotTest` and `scripts/validate-capability-claims.sh` (run from pre-push). That enforcement covers the structured table rows and the tight count claims (`All N runtimes`, `N AiCapability`/`N capabilities total`) only; free-form per-runtime narrative below is **not** machine-checked, so keep that prose in sync with the table by hand.
53
53
54
54
Each runtime additionally ships a portable signed manifest at `modules/<X>/SKILLCARD.yaml` (and `SKILLCARD.yaml.sig` after a tagged release). `scripts/regen-skillcards.sh` emits the YAML from the snapshot + module `pom.xml`; `.github/workflows/sign-skillcards.yml` signs every card on tag push via OpenSSF Model Signing (Sigstore keyless OIDC — short-lived Fulcio cert + Rekor transparency-log entry, OIDC identity bound to the workflow path). Both the card and its `.sig` bundle are packaged into each runtime jar at `META-INF/atmosphere/` so a downstream consumer can verify integrity without unpacking the source tree. `SkillCardSnapshotTest` enforces drift detection, shape conformance, and signature verification when a `.sig` is present; verify locally with `./scripts/verify-skillcards.sh --identity https://github.com/Atmosphere/atmosphere/.github/workflows/sign-skillcards.yml@refs/tags/<TAG> --identity-provider https://token.actions.githubusercontent.com`. Cards on `main` between releases are unsigned by design — the workflow runs at tag time.
55
55
@@ -1090,26 +1090,34 @@ prevention, dynamic routing, and long-pause human-in-the-loop:
1090
1090
is called per request, and `assembleMessages` also threads a
1091
1091
`SystemMessage`into the `List<Message>` dispatched to `call(...)`.
1092
1092
`CONVERSATION_MEMORY`is honored because the same message list carries
1093
-
`context.history()`. `TOKEN_USAGE` is **not** declared because
0 commit comments