Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
08d8819
docs(qwenpaw-data): align .env/Configure promises with datasource design
cyruszhang Aug 27, 2026
b5d2df7
Merge branch 'main' into dev/qwenpaw-data-app
cyruszhang Aug 28, 2026
aca354a
feat(qwenpaw-data): drive the chat workspace on the engine runtime
cyruszhang Sep 2, 2026
e29cdfd
feat(qwenpaw-data): render plan, milestones and artifacts in the chat
cyruszhang Sep 2, 2026
84325b9
fix(qwenpaw-data): stream chat events over GET and provision the engi…
cyruszhang Sep 3, 2026
d2d3ff4
feat(qwenpaw-data): settlement cards and scheduled analyses in the app
cyruszhang Sep 3, 2026
71b447c
feat(qwenpaw-data): console-grade segment cards, artifact previews, t…
cyruszhang Sep 3, 2026
38bc658
feat(qwenpaw-data): embed the full engine console for console-grade UX
cyruszhang Sep 3, 2026
7cb05f8
fix(qwenpaw-data): stage the vendored engine console in dev installs
cyruszhang Sep 3, 2026
cf58069
feat(qwenpaw-data): let the engine console own the app surface
cyruszhang Sep 3, 2026
71614cc
refactor(qwenpaw-data): blank the banner and drop the embedded Contex…
cyruszhang Sep 4, 2026
16abe59
fix(qwenpaw-data): hide the account menu when the host owns authentic…
cyruszhang Sep 4, 2026
1ec53ce
feat(qwenpaw-data): retire the shell topbar; console owns the surface
cyruszhang Sep 4, 2026
c76ded9
refactor(qwenpaw-data): move DataBridge settings into the console
cyruszhang Sep 4, 2026
8e91dbc
style: apply pre-commit auto-fixes (black, trailing commas, whitespace)
cyruszhang Sep 4, 2026
a1b2404
style: settle add-trailing-comma/black fixpoint on engine_gateway
cyruszhang Sep 4, 2026
299611a
feat(qwenpaw-data): bridge QwenPaw channels to the analysis engine
cyruszhang Sep 4, 2026
9390756
fix(qwenpaw-data): stage the backend/bridge package in dev.sh
cyruszhang Sep 4, 2026
8a34679
fix(qwenpaw-data): allow long engine stop unwinds in the bridge
cyruszhang Sep 4, 2026
cba4467
Merge pull request #17 from cyruszhang/feat/engine-native-chat
cyruszhang Sep 5, 2026
a718f85
feat(qwenpaw-data): vendor the reviewed Data console snapshot
cyruszhang Sep 6, 2026
4556844
chore(qwenpaw-data): prepare PawApp 0.1.2
cyruszhang Sep 6, 2026
f1251ba
docs(qwenpaw-data): design ecosystem interoperability
cyruszhang Sep 6, 2026
d039750
fix(qwenpaw-data): require the QPD 0.3 runtime
cyruszhang Sep 7, 2026
d2c2827
fix(qwenpaw-data): connect the demo context stack
cyruszhang Sep 8, 2026
f04c6f5
fix(qwenpaw-data): satisfy console verification checks
cyruszhang Sep 8, 2026
7cce73e
Merge pull request #18 from cyruszhang/feat/engine-native-chat
cyruszhang Sep 8, 2026
fb2a286
Merge upstream main into dev/qwenpaw-data-app
cyruszhang Sep 8, 2026
0f0e7da
fix(qwenpaw-data): harden gateway input validation
cyruszhang Sep 9, 2026
94044c0
fix(qwenpaw-data): forward only validated engine paths
cyruszhang Sep 9, 2026
f84b871
refactor(qwenpaw-data): reuse host SDK contract
cyruszhang Sep 9, 2026
25b0ab3
feat(qwenpaw-data): preview generated reports inline
cyruszhang Sep 10, 2026
4b4220b
fix(plugins): make slash commands owner-aware
cyruszhang Sep 10, 2026
c6e9faf
fix(qwenpaw-data): harden bridge lifecycle
cyruszhang Sep 10, 2026
4be5b4d
Merge branch 'main' into dev/qwenpaw-data-app
cyruszhang Sep 10, 2026
0b64503
docs(qwenpaw-data): align configuration guidance with 0.3
cyruszhang Sep 14, 2026
024fb9c
fix(ci): preserve whitespace in diff files
cyruszhang Sep 15, 2026
9dfe2e0
docs(pawapp): establish vNext design baseline
cyruszhang Sep 15, 2026
47ebabc
feat(pawapp): isolate managed service environments
cyruszhang Sep 16, 2026
c9e44e2
feat(pawapp): persist task dispatch and recovery state
cyruszhang Sep 16, 2026
2020fa1
feat(pawapp): connect Data adapter to durable Engine tasks
cyruszhang Sep 16, 2026
4962803
feat(pawapp): wire scoped task dispatch and Host recovery lifecycle
cyruszhang Sep 16, 2026
8ae24c4
feat(pawapp): connect Main Chat task tools and progress cards
cyruszhang Sep 16, 2026
62a1d1a
feat(pawapp): deliver durable task summaries to Main Chat
cyruszhang Sep 16, 2026
d7d5b2c
feat(pawapp): add durable answer and cancel commands
cyruszhang Sep 16, 2026
0f64674
feat(pawapp): bridge scoped tools and skills
cyruszhang Sep 16, 2026
251d749
feat(pawapp): publish durable task artifacts
cyruszhang Sep 16, 2026
f74dde0
feat(pawapp): open durable task projects
cyruszhang Sep 16, 2026
03adee1
feat(pawapp): separate install from activation
cyruszhang Sep 16, 2026
9b2ab19
feat(pawapp): add typed setup readiness
cyruszhang Sep 16, 2026
d57d50a
feat(pawapp): persist setup request lifecycle
cyruszhang Sep 16, 2026
5f4f112
fix(creator): keep provider credentials server-side
cyruszhang Sep 16, 2026
09c8370
feat(creator): add typed model setup flow
cyruszhang Sep 16, 2026
39953a2
feat(creator): register durable video action
cyruszhang Sep 16, 2026
db2203b
fix(creator): preserve media call budget
cyruszhang Sep 16, 2026
7bf1845
feat(creator): add durable image dispatch
cyruszhang Sep 16, 2026
b072c22
feat(creator): register durable storyboard action
cyruszhang Sep 16, 2026
7904750
feat(pawapp): add scoped task grant controls
cyruszhang Sep 16, 2026
797a31b
feat(pawapp): resume main agent after tasks
cyruszhang Sep 16, 2026
bd60436
feat(creator): publish durable media artifacts
cyruszhang Sep 16, 2026
d688620
feat(pawapp): add durable file browser
cyruszhang Sep 16, 2026
ff10fbd
test(creator): bound real provider acceptance
cyruszhang Sep 17, 2026
80f0053
Merge main into dev/pawapp-vnext
cyruszhang Sep 18, 2026
4e5b879
feat(creator): add delegated create-video workflow
cyruszhang Sep 19, 2026
dff65a3
feat(pawapp): add capability access panels and artifacts
cyruszhang Sep 21, 2026
8ca993b
feat(pawapp): declare app capability bundles
cyruszhang Sep 21, 2026
c801925
fix(pawapp): isolate data tools and restore chat handoffs
cyruszhang Sep 22, 2026
39cc1f6
feat(pawapp): add governed task experiences
cyruszhang Sep 22, 2026
559a285
Merge branch 'main' into dev/pawapp-vnext
cyruszhang Sep 22, 2026
3353ed9
feat(qwenpaw-data): refresh console session naming
cyruszhang Sep 23, 2026
156836b
Merge remote-tracking branch 'upstream/main' into dev/pawapp-vnext
cyruszhang Sep 23, 2026
6841e6e
feat(pawapp): govern native Data tasks and project explicit outcomes
cyruszhang Sep 23, 2026
0f912a1
feat(pawapp): complete managed app contract and scoped SDKs
cyruszhang Oct 15, 2026
08c6af2
fix(pawapp): initialize Host hooks before App rendering
cyruszhang Oct 15, 2026
9f696d1
test(pawapp): record browser acceptance and align final-film fixtures
cyruszhang Oct 15, 2026
d811e47
fix(config): preserve nested working-directory paths across restarts
cyruszhang Oct 15, 2026
fde5469
chore(pawapp): complete branch lint and acceptance verification
cyruszhang Oct 15, 2026
0c493f4
Merge main into dev/pawapp-vnext
cyruszhang Oct 15, 2026
b72fb47
feat(data): inherit workspace models with explicit role overrides
cyruszhang Oct 15, 2026
727bea9
fix(data): refresh model readiness after settings changes
cyruszhang Oct 15, 2026
2226502
fix(data): accept native chat without a selected datasource
cyruszhang Oct 15, 2026
e053374
fix(data): restore datasource and scoped DataBridge discovery
cyruszhang Oct 15, 2026
fbf09e3
fix(data): support dataset selection through durable native chat
cyruszhang Oct 15, 2026
2a9ce39
chore(pawapp): sync main after Data app 1.0.3 release
cyruszhang Oct 20, 2026
c083fd6
feat(creator): carry agreed stories from Main Chat into production
cyruszhang Oct 20, 2026
f287c18
fix(creator): require setup for undecryptable provider credentials
cyruszhang Oct 20, 2026
55fef74
fix(pawapp): serialize nested setup results in chat tools
cyruszhang Oct 20, 2026
81ea1c9
fix(pawapp): route blocked tasks to app-owned setup
cyruszhang Oct 20, 2026
82434fd
fix(creator): recover story production progress from persisted input
cyruszhang Oct 20, 2026
603277f
fix(creator): disable forced reasoning in planning and vision requests
cyruszhang Oct 21, 2026
07d31cb
Merge remote-tracking branch 'upstream/main' into dev/pawapp-vnext
cyruszhang Oct 21, 2026
3414dc3
fix(creator): track scheduled media work after agent completion
cyruszhang Oct 21, 2026
d6f8da2
fix(pawapp): align Creator contract tests and complete app translations
cyruszhang Oct 21, 2026
ead389a
refactor(pawapp): separate Data integration from SDK and Creator
cyruszhang Oct 21, 2026
7c1cd4e
docs(pawapp): link the separate Data integration PR
cyruszhang Oct 21, 2026
07e0f54
refactor(pawapp): extract File Browser into a separate App PR
cyruszhang Oct 21, 2026
e52390e
docs(pawapp): link the separate File Browser PR
cyruszhang Oct 21, 2026
4a20118
Merge upstream/main into dev/pawapp-vnext
cyruszhang Oct 22, 2026
a468577
refactor(pawapp): extract managed service environment construction
cyruszhang Oct 22, 2026
6ea8f7a
feat(pawapp): add user approval contract and Creator review bridge
cyruszhang Oct 22, 2026
178ce16
fix(pawapp): prevent duplicate managed execution during reattach
cyruszhang Oct 22, 2026
d505356
feat(pawapp): show approval scope, progress and precise app inspection
cyruszhang Oct 23, 2026
727ebd7
Merge upstream/main into dev/pawapp-vnext
cyruszhang Oct 26, 2026
feff934
test(plugins): isolate offline rollback from installer versions
cyruszhang Oct 26, 2026
b59f6e9
Merge upstream/main into dev/pawapp-vnext
cyruszhang Oct 27, 2026
10aa691
fix(pawapp): preserve safe task control and recovery
cyruszhang Oct 27, 2026
491baa4
Merge upstream main into PawApp branch
cyruszhang Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/pawapp-contracts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: PawApp Contract Conformance
on:
push:
branches: [dev/pawapp-vnext]
pull_request:
paths:
- 'src/qwenpaw/pawapp/**'
- 'src/qwenpaw/plugins/validation.py'
- 'src/qwenpaw/config/utils.py'
- 'plugins/apps/**'
- 'console/src/plugins/pawapp-sdk/**'
- 'console/src/plugins/usePluginLoader*'
- 'console/src/api/modules/pawappTasks*'
- 'console/src/components/Chat/ToolCards/cards/PawAppTaskCard*'
- 'tests/**'
- 'scripts/*pawapp*'
- 'docs/design/pawapp-contract*'
- '.github/workflows/pawapp-contracts.yml'
workflow_dispatch:
permissions:
contents: read
jobs:
conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: console/package-lock.json
- name: Install Host test environment
run: python -m pip install -e '.[test]'
- name: Check generated contract drift and Host conformance
run: |
python scripts/generate-pawapp-contracts.py --check
python -m pytest -q tests/unit/pawapp tests/unit/plugins/test_plugin_api_extensions.py tests/unit/cli/test_plugin_commands.py tests/unit/config/test_config_utils.py
- name: Check frontend contract clients and task cards
working-directory: console
run: |
npm ci --no-audit --no-fund
npx tsc -b --noEmit
npm run test:run -- src/plugins/pawapp-sdk src/plugins/usePluginLoader.test.ts src/api/modules/pawappTasks.test.ts src/components/Chat/ToolCards/cards/PawAppTaskCard.test.tsx
3 changes: 3 additions & 0 deletions console/.prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,6 @@ node_modules/
coverage/
.vscode/
.idea/

# Generated by scripts/generate-pawapp-contracts.py
src/plugins/pawapp-sdk/contracts.generated.ts
63 changes: 63 additions & 0 deletions console/src/api/modules/pawappGrants.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { beforeEach, describe, expect, it, vi } from "vitest";

vi.mock("../request", () => ({ request: vi.fn() }));

import { request } from "../request";
import { pawappGrantsApi } from "./pawappGrants";

describe("pawappGrantsApi", () => {
beforeEach(() => vi.mocked(request).mockResolvedValue({ actions: [] }));

it("loads the selected workspace grant catalog", async () => {
const controller = new AbortController();

await pawappGrantsApi.list("agent / one", controller.signal);

expect(request).toHaveBeenCalledWith(
"/pawapps/workspaces/agent%20%2F%20one/task-grants",
{ signal: controller.signal },
);
});

it("updates one action with the expected policy revision", async () => {
const body = {
expected_revision: 4,
enabled: true,
input_values: { datasource_id: ["sales"] },
};

await pawappGrantsApi.update(
"agent-1",
"qwenpaw-data",
"analyze records",
body,
);

expect(request).toHaveBeenCalledWith(
"/pawapps/workspaces/agent-1/task-grants/actions/qwenpaw-data/analyze%20records",
{
method: "PUT",
body: JSON.stringify(body),
},
);
});

it("updates one capability bundle atomically", async () => {
const body = { expected_revision: 4, enabled: true };

await pawappGrantsApi.updateCapability(
"agent-1",
"qwenpaw-creator",
"media_generation",
body,
);

expect(request).toHaveBeenCalledWith(
"/pawapps/workspaces/agent-1/task-grants/capabilities/qwenpaw-creator/media_generation",
{
method: "PUT",
body: JSON.stringify(body),
},
);
});
});
106 changes: 106 additions & 0 deletions console/src/api/modules/pawappGrants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import { request } from "../request";

export interface PawAppGrantAction {
app_id: string;
action_id: string;
summary: string;
descriptor_digest: string;
input_schema: {
properties?: Record<string, unknown>;
};
permissions: string[];
effects: string[];
settings_entry: string | null;
enabled: boolean;
stale: boolean;
input_values: Record<string, string[]>;
}

export interface PawAppGrantCapability {
schema_version: 1;
capability_id: string;
app_id: string;
label: string;
summary: string;
action_ids: string[];
permissions: string[];
effects: string[];
risk: "read" | "write" | "generation" | "analysis" | "other";
enabled: boolean;
partial: boolean;
stale: boolean;
}

export interface PawAppHostSkillImportStatus {
app_id: string;
skill_id: string;
description: string;
tool_refs: string[];
missing_tool_refs: string[];
installed: boolean;
enabled: boolean;
available: boolean;
status:
| "available"
| "disabled"
| "not_installed"
| "unavailable"
| "tool_dependency_unavailable";
}

export interface PawAppGrantCatalog {
revision: number;
actions: PawAppGrantAction[];
capabilities?: PawAppGrantCapability[];
host_skill_imports?: PawAppHostSkillImportStatus[];
}

export interface PawAppGrantUpdate {
expected_revision: number;
enabled: boolean;
input_values: Record<string, string[]>;
}

function catalogPath(workspaceId: string): string {
return `/pawapps/workspaces/${encodeURIComponent(workspaceId)}/task-grants`;
}

export const pawappGrantsApi = {
list(workspaceId: string, signal?: AbortSignal) {
return request<PawAppGrantCatalog>(catalogPath(workspaceId), { signal });
},

update(
workspaceId: string,
appId: string,
actionId: string,
body: PawAppGrantUpdate,
) {
return request<PawAppGrantCatalog>(
`${catalogPath(workspaceId)}/actions/${encodeURIComponent(
appId,
)}/${encodeURIComponent(actionId)}`,
{
method: "PUT",
body: JSON.stringify(body),
},
);
},

updateCapability(
workspaceId: string,
appId: string,
capabilityId: string,
body: Omit<PawAppGrantUpdate, "input_values">,
) {
return request<PawAppGrantCatalog>(
`${catalogPath(workspaceId)}/capabilities/${encodeURIComponent(
appId,
)}/${encodeURIComponent(capabilityId)}`,
{
method: "PUT",
body: JSON.stringify(body),
},
);
},
};
104 changes: 104 additions & 0 deletions console/src/api/modules/pawappTasks.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import { beforeEach, describe, expect, it, vi } from "vitest";

vi.mock("../request", () => ({ request: vi.fn() }));

import { request } from "../request";
import { answerPawAppTask, openPawAppSetup } from "./pawappTasks";

const setupAction = {
schema_version: 1 as const,
app_id: "qwenpaw-creator",
request_id: "setup/1",
entry_id: "creator.video-model-settings",
presentation: "app_entry" as const,
path: "/apps/qwenpaw-creator?setup=video&setupRequest=setup-1",
};

beforeEach(() => {
vi.mocked(request).mockReset();
});

describe("PawApp task interactions", () => {
it("opens setup through the scoped Host route", async () => {
vi.mocked(request).mockResolvedValue({ open_action: setupAction });

await expect(
openPawAppSetup("qwenpaw-creator", "main agent", "setup/1"),
).resolves.toEqual(setupAction);
expect(request).toHaveBeenCalledWith(
"/pawapps/qwenpaw-creator/workspaces/main%20agent/setup-requests/setup%2F1/open",
{ method: "POST", headers: { "X-Agent-Id": "main agent" } },
);
});

it.each([
"https://untrusted.test/apps/qwenpaw-creator",
"/apps/qwenpaw-creator/../other",
"/apps/other?setup=video",
])("rejects unsafe setup path %s", async (path) => {
vi.mocked(request).mockResolvedValue({
open_action: { ...setupAction, path },
});

await expect(
openPawAppSetup("qwenpaw-creator", "main", "setup/1"),
).rejects.toThrow("invalid_open_setup_response");
});

it("submits an exact answer command and validates its identity", async () => {
const command = {
protocol_version: 1 as const,
task_id: "task/1",
command_id: "command-1",
kind: "answer" as const,
request_id: "approval-1",
state: "accepted" as const,
reason: null,
};
const answers = [
{
question: "Run this generation?",
selected_options: ["Approve once"],
custom_text: null,
},
];
vi.mocked(request).mockResolvedValue({ command });

await expect(
answerPawAppTask(
"qwenpaw-creator",
"main agent",
"task/1",
"command-1",
"approval-1",
answers,
),
).resolves.toEqual(command);
expect(request).toHaveBeenCalledWith(
"/pawapps/qwenpaw-creator/workspaces/main%20agent/tasks/task%2F1/answer",
{
method: "POST",
headers: { "X-Agent-Id": "main agent" },
body: JSON.stringify({
command_id: "command-1",
request_id: "approval-1",
answers,
}),
},
);

vi.mocked(request).mockResolvedValue({
command: { ...command, request_id: "other" },
});
await expect(
answerPawAppTask(
"qwenpaw-creator",
"main agent",
"task/1",
"command-1",
"approval-1",
answers,
),
).rejects.toThrow("invalid_task_answer_response");
});
});
Loading
Loading