Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/calm-workflows-arrive.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@agent-native/core": minor
---

Add a durable, actor-attributed workflow event spine with immutable subscription versions, sequence-bounded virtual defaults, execution/effect/delivery truth, and one leased scheduled-work authority for retries, delays, debounce, escalation, and access-scoped runtime pause controls.

Add evidence-aware notification outcomes and user-scoped inbox, browser, email, and personal Slack delivery routing without storing destination secrets in notification settings.
39 changes: 39 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,45 @@ jobs:
- name: Run Core integration tests
run: pnpm test:core-integration

workflow-postgres-tests:
name: Workflow Postgres tests
runs-on: ubuntu-latest
timeout-minutes: 20
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: postgres
POSTGRES_HOST_AUTH_METHOD: trust
POSTGRES_DB: workflow_test
ports:
- 5432:5432
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
DATABASE_URL: postgres://postgres@127.0.0.1:5432/workflow_test
WORKFLOW_POSTGRES_TEST_URL: postgres://postgres@127.0.0.1:5432/workflow_test
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1

- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4.4.0

- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: "22"
cache: "pnpm"

- name: Restore dist + tsBuildInfo cache
uses: ./.github/actions/restore-dist-cache

- run: pnpm install --frozen-lockfile

- name: Run workflow Postgres integration tests
run: pnpm --filter @agent-native/core exec vitest --run src/workflow/store.postgres.integration.spec.ts

plan-e2e-tests:
name: Plan E2E tests
runs-on: ubuntu-latest
Expand Down
1 change: 1 addition & 0 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
"./localization/actions/set-localization-preference": "./dist/localization/actions/set-localization-preference.js",
"./credentials": "./dist/credentials/index.js",
"./event-bus": "./dist/event-bus/index.js",
"./workflow": "./dist/workflow/index.js",
"./fetch-tool": "./dist/extensions/fetch-tool.js",
"./extensions/url-safety": "./dist/extensions/url-safety.js",
"./tools/url-safety": "./dist/extensions/url-safety.js",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { readFileSync } from "node:fs";

import { describe, expect, it } from "vitest";

const source = readFileSync(
new URL("./NotificationsBell.tsx", import.meta.url),
"utf8",
);

describe("NotificationsBell routing layout", () => {
it("progressively discloses personal routing without exposing secret values", () => {
expect(source).toContain('aria-label="Notification delivery settings"');
expect(source).toContain('label="In-app inbox"');
expect(source).toContain('label="Browser alerts"');
expect(source).toContain('label="Email"');
expect(source).toContain('label="Personal Slack"');
expect(source).toContain("Webhook secret key name");
expect(source).toContain("Store its webhook URL in Secrets");
expect(source).not.toContain("Team Slack webhook");
});

it("uses named client methods instead of route fetches", () => {
expect(source).not.toContain("fetch(");
expect(source).not.toContain("/_agent-native/notifications");
expect(source).toContain("updatePersonalNotificationRouting");
expect(source).toContain("listClientNotifications");
});

it("keeps host-specific notification settings in the bell menu", () => {
expect(source).toContain("contextualSettings?: ReactNode");
expect(source).toContain("{contextualSettings}");
expect(source.indexOf("{contextualSettings}")).toBeGreaterThan(
source.indexOf('className="max-h-96 overflow-y-auto"'),
);
});
});
Loading
Loading