History

Carry integration mode through the builder types

integration(slug).array() previously typed the handler context field as a single client because the declaration interface fixed mode to the union. A Mode type parameter narrows it, so fan-out fields type as client arrays.

Rhys Sullivan committed 4 months ago

Commit 1aa1ab41 parent 5d5bd561 file · +18 −12Browse files

Unified · Split

packages/plugins/apps/src/authoring.ts+18−12
@@ -14,18 +14,21 @@ export type AppIntegrationClient = { · 13 unmodified lines
1414
1515 export type IntegrationMode = "one" | "many";
1616
17−export interface IntegrationDeclaration<Slug extends string = string> {
17+export interface IntegrationDeclaration<
18+ Slug extends string = string,
19+ Mode extends IntegrationMode = IntegrationMode,
20+> {
1821 readonly kind: "integration";
1922 readonly slug: Slug;
20− readonly mode: IntegrationMode;
23+ readonly mode: Mode;
2124 readonly description?: string;
2225 /**
2326 * Ask the caller to choose a set of connections. Future author-chosen binding modes should not
2427 * project optional caller fields: optional fields are suggestions, and model callers under-fill
2528 * them.
2629 */
27− readonly array: () => IntegrationDeclaration<Slug>;
28− readonly describe: (text: string) => IntegrationDeclaration<Slug>;
30+ readonly array: () => IntegrationDeclaration<Slug, "many">;
31+ readonly describe: (text: string) => IntegrationDeclaration<Slug, Mode>;
2932 }
3033
3134 export type IntegrationClients<TIntegrations> =
@@ -41,9 +44,12 @@ export type IntegrationClients<TIntegrations> = · 9 unmodified lines
4144
4245 export type IntegrationDeclarations = Readonly<Record<string, IntegrationDeclaration>>;
4346
44−interface IntegrationDeclarationState<Slug extends string = string> {
47+interface IntegrationDeclarationState<
48+ Slug extends string = string,
49+ Mode extends IntegrationMode = IntegrationMode,
50+> {
4551 readonly slug: Slug;
46− readonly mode: IntegrationMode;
52+ readonly mode: Mode;
4753 readonly description?: string;
4854 }
4955
@@ -53,15 +59,15 @@ export interface SerializedIntegrationDeclaration { · 3 unmodified lines
5359 readonly description?: string;
5460 }
5561
56−const makeIntegrationDeclaration = <Slug extends string>(
57− state: IntegrationDeclarationState<Slug>,
58−): IntegrationDeclaration<Slug> => {
62+const makeIntegrationDeclaration = <Slug extends string, Mode extends IntegrationMode>(
63+ state: IntegrationDeclarationState<Slug, Mode>,
64+): IntegrationDeclaration<Slug, Mode> => {
5965 const declaration = {
6066 kind: "integration" as const,
6167 slug: state.slug,
6268 mode: state.mode,
6369 ...(state.description !== undefined ? { description: state.description } : {}),
64− array: () => makeIntegrationDeclaration({ ...state, mode: "many" }),
70+ array: () => makeIntegrationDeclaration({ ...state, mode: "many" as const }),
6571 describe: (text: string) => makeIntegrationDeclaration({ ...state, description: text }),
6672 };
6773 return Object.freeze(declaration);
@@ -105,8 +111,8 @@ export interface DefinedTool< · 37 unmodified lines
105111 readonly "~executorAppTool": true;
106112 }
107113
108−export const integration = <Slug extends string>(slug: Slug): IntegrationDeclaration<Slug> =>
109− makeIntegrationDeclaration({ slug, mode: "one" });
114+export const integration = <Slug extends string>(slug: Slug): IntegrationDeclaration<Slug, "one"> =>
115+ makeIntegrationDeclaration({ slug, mode: "one" as const });
110116
111117 export const defineTool = <
112118 TInputSchema extends ToolSchema,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t