Files
paseo/packages/app/src/stores/workspace-draft-submission-store.ts
T
Mohamed BoudraandGitHub 53c14d9855 Extract client SDK package (#1052)
* Extract client SDK package

* Polish SDK client identity defaults

* Build client before dependent CI jobs

* Restore daemon client server export

* Extract protocol and client SDK packages

* Fix provider override schema validation

* Fix app test daemon client imports

* Simplify workspace build targets

* Fix CLI test server build bootstrap

* Run SDK package tests in CI

* Fix rebase package split drift

* Restore lockfile registry metadata

* Update SDK config test for prompt default

* Move terminal stream router test to client package

* Fix rebase drift for protocol imports

* Fix SDK agent capability fixture

* Restore legacy server client exports

* Fix server export compatibility test

* Advertise custom mode icon client capability

* Remove server daemon-client exports

* Format rebased mode control import

* Fix rebase drift for protocol imports

Files added by upstream PRs (#893, #1147, #1154) referenced the pre-split
shared/ paths that this branch moves into @getpaseo/protocol. Redirect
those imports to the protocol package so typecheck stays green after the
rebase.
2026-05-28 01:58:18 +08:00

69 lines
2.0 KiB
TypeScript

import { create } from "zustand";
import type { ComposerAttachment } from "@/attachments/types";
import type { AgentProvider } from "@getpaseo/protocol/agent-types";
export interface PendingWorkspaceDraftSubmission {
serverId: string;
workspaceId: string;
draftId: string;
text: string;
attachments: ComposerAttachment[];
cwd: string;
provider: AgentProvider;
clientMessageId: string;
timestamp: number;
modeId?: string;
model?: string;
thinkingOptionId?: string;
featureValues?: Record<string, unknown>;
allowEmptyText?: boolean;
}
interface WorkspaceDraftSubmissionState {
pendingByDraftId: Record<string, PendingWorkspaceDraftSubmission>;
setPending: (submission: PendingWorkspaceDraftSubmission) => void;
consumePending: (input: {
serverId: string;
workspaceId: string;
draftId: string;
}) => PendingWorkspaceDraftSubmission | null;
}
function matchesPendingSubmission(
pending: PendingWorkspaceDraftSubmission | null | undefined,
input: { serverId: string; workspaceId: string; draftId: string },
): pending is PendingWorkspaceDraftSubmission {
return (
pending?.serverId === input.serverId &&
pending.workspaceId === input.workspaceId &&
pending.draftId === input.draftId
);
}
export const useWorkspaceDraftSubmissionStore = create<WorkspaceDraftSubmissionState>(
(set, get) => ({
pendingByDraftId: {},
setPending: (submission) =>
set((state) => ({
pendingByDraftId: {
...state.pendingByDraftId,
[submission.draftId]: submission,
},
})),
consumePending: (input) => {
const pending = get().pendingByDraftId[input.draftId];
if (!matchesPendingSubmission(pending, input)) {
return null;
}
set((state) => {
if (!matchesPendingSubmission(state.pendingByDraftId[input.draftId], input)) {
return state;
}
const { [input.draftId]: _removed, ...rest } = state.pendingByDraftId;
return { pendingByDraftId: rest };
});
return pending;
},
}),
);