From f2e68f0bfab5f863ed2fb1db43c0a3fa8e300455 Mon Sep 17 00:00:00 2001 From: Grant Gurvis Date: Thu, 19 Dec 2024 19:08:13 -0800 Subject: [PATCH 1/2] refactor: migrate to @bufbuild/protobuf for JS protobufs --- .../api-bindings/codegen/generate-requests.ts | 97 ++- packages/api-bindings/package.json | 5 +- packages/api-bindings/src/auth.ts | 5 +- packages/api-bindings/src/core.ts | 48 +- packages/api-bindings/src/editbuffer.ts | 4 +- packages/api-bindings/src/event.ts | 5 +- packages/api-bindings/src/filesystem.ts | 29 +- packages/api-bindings/src/history.ts | 65 +- packages/api-bindings/src/install.ts | 29 +- packages/api-bindings/src/keybindings.ts | 10 +- packages/api-bindings/src/notifications.ts | 27 +- packages/api-bindings/src/position.ts | 13 +- packages/api-bindings/src/process.ts | 15 +- packages/api-bindings/src/requests.ts | 571 +++++++++++------- packages/api-bindings/src/settings.ts | 7 +- packages/api-bindings/src/shell.ts | 23 +- packages/api-bindings/src/state.ts | 7 +- packages/api-bindings/src/telemetry.ts | 10 +- packages/autocomplete-parser/src/caches.ts | 3 - .../autocomplete-parser/src/loadHelpers.ts | 3 +- packages/autocomplete/package.json | 7 +- packages/autocomplete/src/actions.ts | 29 +- packages/autocomplete/src/state/index.ts | 17 +- packages/autocomplete/src/state/types.ts | 8 - .../components/installs/modal/login/index.tsx | 4 +- packages/shared/src/errors.ts | 2 +- pnpm-lock.yaml | 202 +++++-- proto/buf.gen.yaml | 11 + proto/build-ts.sh | 28 - proto/package.json | 9 +- tests/figterm/package.json | 1 - tests/figterm/src/shell.ts | 29 +- 32 files changed, 777 insertions(+), 546 deletions(-) create mode 100644 proto/buf.gen.yaml delete mode 100755 proto/build-ts.sh diff --git a/packages/api-bindings/codegen/generate-requests.ts b/packages/api-bindings/codegen/generate-requests.ts index 22dc18a47c..114cf06df3 100644 --- a/packages/api-bindings/codegen/generate-requests.ts +++ b/packages/api-bindings/codegen/generate-requests.ts @@ -1,10 +1,5 @@ -import { - Project, - PropertySignature, - SourceFile, - CodeBlockWriter, - IndentationText, -} from "ts-morph"; +import { file_fig as file } from "@aws/amazon-q-developer-cli-proto/fig"; +import { CodeBlockWriter, IndentationText, Project } from "ts-morph"; import { readFileSync } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; @@ -30,21 +25,13 @@ const normalize = (type: string): string => { return capitalizeFirstLetter(normalized); }; -const getSubmessageTypes = (bindings: SourceFile, interfaceName: string) => { - const interfaceRef = bindings.getInterface(interfaceName)!; - const submessage = interfaceRef.getProperties()[1]; - - const submessageUnion = submessage - .getChildren() - .filter((elm) => elm.getKindName() === "UnionType")[0]; - const literals = submessageUnion - .getChildren()[0] - .getChildren() - .filter((elm) => elm.getKindName() === "TypeLiteral"); - const types = literals - .map((elm) => elm.getChildren()[1]) - .map((elm) => elm.getChildren()[1]); - return types.map((prop) => (prop as PropertySignature).getName()); +const getSubmessageTypes = (interfaceName: string) => { + const message = file.messages.find( + (message) => message.name === interfaceName, + ); + return ( + message?.fields.map((type) => type.message?.name!).filter(Boolean) ?? [] + ); }; const writeGenericSendRequestWithResponseFunction = ( @@ -54,23 +41,23 @@ const writeGenericSendRequestWithResponseFunction = ( const lowercasedEndpoint = lowercaseFirstLetter(endpoint); const template = `export async function send${endpoint}Request( -request: ${endpoint}Request +request: Omit<${endpoint}Request, "$typeName" | "$unknown"> ): Promise<${endpoint}Response> { return new Promise((resolve, reject) => { sendMessage( - { $case: "${lowercasedEndpoint}Request", ${lowercasedEndpoint}Request: request }, + { case: "${lowercasedEndpoint}Request", value: create(${endpoint}RequestSchema, request) }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "${lowercasedEndpoint}Response": - resolve(response.${lowercasedEndpoint}Response); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - \`Invalid response '\${response?.$case}' for '${endpoint}Request'\` + \`Invalid response '\${response?.case}' for '${endpoint}Request'\` ) ); } @@ -89,23 +76,23 @@ const writeGenericSendRequestFunction = ( const lowercasedEndpoint = lowercaseFirstLetter(endpoint); const template = `export async function send${endpoint}Request( - request: ${endpoint}Request + request: Omit<${endpoint}Request, "$typeName" | "$unknown"> ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "${lowercasedEndpoint}Request", ${lowercasedEndpoint}Request: request }, + { case: "${lowercasedEndpoint}Request", value: create(${endpoint}RequestSchema, request) }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - \`Invalid response '\${response?.$case}' for '${endpoint}Request'\` + \`Invalid response '\${response?.case}' for '${endpoint}Request'\` ) ); } @@ -124,20 +111,10 @@ const project = new Project({ project.addSourceFilesAtPaths(join(__dirname, "../src/*.ts")); -const text = readFileSync( - "node_modules/@aws/amazon-q-developer-cli-proto/dist/fig.pb.ts", - "utf8", -); -const protobufBindings = project.createSourceFile("fig.pb.ts", text); - -const requestTypes = getSubmessageTypes( - protobufBindings, - "ClientOriginatedMessage", +const requestTypes = getSubmessageTypes("ClientOriginatedMessage"); +const responseTypes = getSubmessageTypes("ServerOriginatedMessage").filter( + (type) => type.includes("Response"), ); -const responseTypes = getSubmessageTypes( - protobufBindings, - "ServerOriginatedMessage", -).filter((type) => type.includes("Response")); const [requestsWithMatchingResponses, otherRequests] = requestTypes .filter((request) => request !== "notificationRequest") @@ -145,7 +122,9 @@ const [requestsWithMatchingResponses, otherRequests] = requestTypes (result, request) => { const [matchingResponse, other] = result; - const endpoint = lowercaseFirstLetter(normalize(request)); + const endpoint = normalize(request); + + console.log(endpoint, requestTypes); if (responseTypes.indexOf(`${endpoint}Response`) !== -1) { return [matchingResponse.concat([request]), other]; @@ -175,15 +154,31 @@ const sourceFile = project.createSourceFile( const responses = requestsWithMatchingResponses.map((request) => request.replace("Request", "Response"), ); - const imports = requestsWithMatchingResponses - .concat(responses) - .concat(otherRequests) + const requestSchemas = requestsWithMatchingResponses.map( + (s) => `${s}Schema`, + ); + const otherRequestSchemas = otherRequests.map((s) => `${s}Schema`); + const imports = [ + requestsWithMatchingResponses, + responses, + otherRequests, + requestSchemas, + otherRequestSchemas, + ] + .flat() .sort() .map(capitalizeFirstLetter); writer.writeLine( `import { \n${imports.join(",\n")}\n } from "@aws/amazon-q-developer-cli-proto/fig";`, ); - writer.writeLine(`import { sendMessage } from "./core.js";`).blankLine(); + writer + .writeLine( + [ + 'import { sendMessage } from "./core.js";', + 'import { create } from "@bufbuild/protobuf";', + ].join("\n"), + ) + .blankLine(); requestsWithMatchingResponses.forEach((request) => writeGenericSendRequestWithResponseFunction(writer, normalize(request)), diff --git a/packages/api-bindings/package.json b/packages/api-bindings/package.json index 1ad46a2296..70df4f2b9a 100644 --- a/packages/api-bindings/package.json +++ b/packages/api-bindings/package.json @@ -22,7 +22,8 @@ "generate-requests": "tsx codegen/generate-requests.ts && prettier -w src/requests.ts" }, "dependencies": { - "@aws/amazon-q-developer-cli-proto": "workspace:^" + "@aws/amazon-q-developer-cli-proto": "workspace:^", + "@bufbuild/protobuf": "2.2.3" }, "devDependencies": { "@amzn/eslint-config": "workspace:^", @@ -34,8 +35,6 @@ "lint-staged": "^15.2.10", "prettier": "^3.4.2", "ts-morph": "^24.0.0", - "ts-proto": "~2.5.0", - "tslib": "^2.8.1", "tsx": "^4.19.2", "typescript": "^5.7.2" }, diff --git a/packages/api-bindings/src/auth.ts b/packages/api-bindings/src/auth.ts index bfab36bfa9..775459fc84 100644 --- a/packages/api-bindings/src/auth.ts +++ b/packages/api-bindings/src/auth.ts @@ -54,7 +54,10 @@ export function startPkceAuthorization({ export function finishPkceAuthorization({ authRequestId, -}: AuthFinishPkceAuthorizationRequest): Promise { +}: Omit< + AuthFinishPkceAuthorizationRequest, + "$typeName" +>): Promise { return sendAuthFinishPkceAuthorizationRequest({ authRequestId }); } diff --git a/packages/api-bindings/src/core.ts b/packages/api-bindings/src/core.ts index b901ccaeb2..a059916090 100644 --- a/packages/api-bindings/src/core.ts +++ b/packages/api-bindings/src/core.ts @@ -1,9 +1,12 @@ import { - ServerOriginatedMessage, - ClientOriginatedMessage, + type ServerOriginatedMessage, + type ClientOriginatedMessage, + ClientOriginatedMessageSchema, + ServerOriginatedMessageSchema, } from "@aws/amazon-q-developer-cli-proto/fig"; import { b64ToBytes, bytesToBase64 } from "./utils.js"; +import { create, fromBinary, toBinary } from "@bufbuild/protobuf"; interface GlobalAPIError { error: string; @@ -19,9 +22,9 @@ export type APIResponseHandler = ( ) => shouldKeepListening | void; let messageId = 0; -const handlers: Record = {}; +const handlers: Record = {}; -export function setHandlerForId(handler: APIResponseHandler, id: number) { +export function setHandlerForId(handler: APIResponseHandler, id: string) { handlers[id] = handler; } @@ -30,33 +33,37 @@ const receivedMessage = (response: ServerOriginatedMessage): void => { return; } - const handler = handlers[response.id]; + const id = response.id.toString(); + const handler = handlers[id]; if (!handler) { return; } - const keepListeningOnID = handlers[response.id](response.submessage); + const keepListeningOnID = handlers[id](response.submessage); if (!keepListeningOnID) { - delete handlers[response.id]; + delete handlers[id]; } }; export function sendMessage( - message: ClientOriginatedMessage["submessage"], + submessage: ClientOriginatedMessage["submessage"], handler?: APIResponseHandler, ) { - const request: ClientOriginatedMessage = { - id: (messageId += 1), - submessage: message, - }; + const request: ClientOriginatedMessage = create( + ClientOriginatedMessageSchema, + { + id: BigInt((messageId += 1)), + submessage, + }, + ); if (handler && request.id) { - handlers[request.id] = handler; + handlers[request.id.toString()] = handler; } - const buffer = ClientOriginatedMessage.encode(request).finish(); + const buffer = toBinary(ClientOriginatedMessageSchema, request); if ( window?.fig?.constants?.supportApiProto && @@ -64,11 +71,8 @@ export function sendMessage( ) { const url = new URL(window.fig.constants.apiProtoUrl); - if ( - request.submessage?.$case && - typeof request.submessage?.$case === "string" - ) { - url.pathname = `/${request.submessage.$case}`; + if (typeof request.submessage?.case === "string") { + url.pathname = `/${request.submessage.case}`; } else { url.pathname = "/unknown"; } @@ -81,8 +85,8 @@ export function sendMessage( body: buffer, }).then(async (res) => { const body = new Uint8Array(await res.arrayBuffer()); - const m = ServerOriginatedMessage.decode(body); - receivedMessage(m); + const message = fromBinary(ServerOriginatedMessageSchema, body); + receivedMessage(message); }); return; } @@ -115,7 +119,7 @@ const setupEventListeners = (): void => { document.addEventListener(FigProtoMessageReceived, (event: Event) => { const raw = (event as CustomEvent).detail as string; const bytes = b64ToBytes(raw); - const message = ServerOriginatedMessage.decode(bytes); + const message = fromBinary(ServerOriginatedMessageSchema, bytes); receivedMessage(message); }); }; diff --git a/packages/api-bindings/src/editbuffer.ts b/packages/api-bindings/src/editbuffer.ts index 9ec465b662..6eea74a264 100644 --- a/packages/api-bindings/src/editbuffer.ts +++ b/packages/api-bindings/src/editbuffer.ts @@ -12,9 +12,9 @@ export function subscribe( return _subscribe( { type: NotificationType.NOTIFY_ON_EDITBUFFFER_CHANGE }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "editBufferNotification": - return handler(notification.type.editBufferNotification); + return handler(notification.type.value); default: break; } diff --git a/packages/api-bindings/src/event.ts b/packages/api-bindings/src/event.ts index eb0977e3ca..0097641ccf 100644 --- a/packages/api-bindings/src/event.ts +++ b/packages/api-bindings/src/event.ts @@ -8,10 +8,9 @@ export function subscribe( return _subscribe( { type: NotificationType.NOTIFY_ON_EVENT }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "eventNotification": { - const { eventName: name, payload } = - notification.type.eventNotification; + const { eventName: name, payload } = notification.type.value; if (name === eventName) { try { return handler(payload ? JSON.parse(payload) : null); diff --git a/packages/api-bindings/src/filesystem.ts b/packages/api-bindings/src/filesystem.ts index b098e89d6a..7a079f6f7f 100644 --- a/packages/api-bindings/src/filesystem.ts +++ b/packages/api-bindings/src/filesystem.ts @@ -1,3 +1,4 @@ +import { create } from "@bufbuild/protobuf"; import { sendWriteFileRequest, sendReadFileRequest, @@ -6,48 +7,56 @@ import { sendAppendToFileRequest, sendCreateDirectoryRequest, } from "./requests.js"; +import { + type FilePath, + FilePathSchema, +} from "@aws/amazon-q-developer-cli-proto/fig"; + +function filePath(options: Omit) { + return create(FilePathSchema, options); +} export async function write(path: string, contents: string) { return sendWriteFileRequest({ - path: { path, expandTildeInPath: true }, - data: { $case: "text", text: contents }, + path: filePath({ path, expandTildeInPath: true }), + data: { case: "text", value: contents }, }); } export async function append(path: string, contents: string) { return sendAppendToFileRequest({ - path: { path, expandTildeInPath: true }, - data: { $case: "text", text: contents }, + path: filePath({ path, expandTildeInPath: true }), + data: { case: "text", value: contents }, }); } export async function read(path: string) { const response = await sendReadFileRequest({ - path: { path, expandTildeInPath: true }, + path: filePath({ path, expandTildeInPath: true }), }); - if (response.type?.$case === "text") { - return response.type.text; + if (response.type?.case === "text") { + return response.type.value; } return null; } export async function list(path: string) { const response = await sendContentsOfDirectoryRequest({ - directory: { path, expandTildeInPath: true }, + directory: filePath({ path, expandTildeInPath: true }), }); return response.fileNames; } export async function destinationOfSymbolicLink(path: string) { const response = await sendDestinationOfSymbolicLinkRequest({ - path: { path, expandTildeInPath: true }, + path: filePath({ path, expandTildeInPath: true }), }); return response.destination?.path; } export async function createDirectory(path: string, recursive: boolean) { return sendCreateDirectoryRequest({ - path: { path, expandTildeInPath: true }, + path: filePath({ path, expandTildeInPath: true }), recursive, }); } diff --git a/packages/api-bindings/src/history.ts b/packages/api-bindings/src/history.ts index 0c5ec89b60..7fb0ac30dc 100644 --- a/packages/api-bindings/src/history.ts +++ b/packages/api-bindings/src/history.ts @@ -1,54 +1,41 @@ -import { HistoryQueryRequest_Param } from "@aws/amazon-q-developer-cli-proto/fig"; +import { + HistoryQueryRequest_Param, + HistoryQueryRequest_ParamSchema, +} from "@aws/amazon-q-developer-cli-proto/fig"; import { sendHistoryQueryRequest } from "./requests.js"; +import { create } from "@bufbuild/protobuf"; +import { EmptySchema } from "@aws/amazon-q-developer-cli-proto/fig_common"; export type Param = string | number | Uint8Array | null; function mapParam(param: Param): HistoryQueryRequest_Param { - if (param === null) { - return { - type: { - $case: "null", - null: {}, - }, - }; - } + let type: HistoryQueryRequest_Param["type"] | undefined; - if (typeof param === "string") { - return { - type: { - $case: "string", - string: param, - }, + if (param === null) { + type = { + case: "null", + value: create(EmptySchema), }; - } - - if (typeof param === "number" && Number.isInteger(param)) { - return { - type: { - $case: "integer", - integer: param, - }, + } else if (typeof param === "string") { + type = { case: "string", value: param }; + } else if (typeof param === "number" && Number.isInteger(param)) { + type = { + case: "integer", + value: BigInt(param), }; - } - - if (typeof param === "number") { - return { - type: { - $case: "float", - float: param, - }, + } else if (typeof param === "number") { + type = { + case: "float", + value: param, }; - } - - if (param instanceof Uint8Array) { - return { - type: { - $case: "blob", - blob: param, - }, + } else if (param instanceof Uint8Array) { + type = { + case: "blob", + value: param, }; } + if (type) return create(HistoryQueryRequest_ParamSchema, { type }); throw new Error("Invalid param type"); } diff --git a/packages/api-bindings/src/install.ts b/packages/api-bindings/src/install.ts index 6aba1c7d51..a112770453 100644 --- a/packages/api-bindings/src/install.ts +++ b/packages/api-bindings/src/install.ts @@ -44,18 +44,18 @@ function componentToProto(component: Component) { } function handleBasicResponse(response: InstallResponse) { - switch (response.response?.$case) { + switch (response.response?.case) { case "result": - if (response.response.result.result === Result_Result.OK) { + if (response.response.value.result === Result_Result.OK) { return; } - if (response.response.result.result === Result_Result.ERROR) { - throw Error(response.response.result.error); + if (response.response.value.result === Result_Result.ERROR) { + throw Error(response.response.value.error); } else { - throw Error(`Unexpected result: ${response.response.result.result}`); + throw Error(`Unexpected result: ${response.response.value.result}`); } default: - throw Error(`Unexpected result: ${response.response?.$case}`); + throw Error(`Unexpected result: ${response.response?.case}`); } } @@ -80,24 +80,23 @@ export async function isInstalled(component: Component) { action: InstallAction.STATUS, component: componentToProto(component), }); - switch (response.response?.$case) { + switch (response.response?.case) { case "installationStatus": if ( - response.response.installationStatus === - InstallResponse_InstallationStatus.INSTALLED + response.response.value === InstallResponse_InstallationStatus.INSTALLED ) { return true; } if ( - response.response.installationStatus === + response.response.value === InstallResponse_InstallationStatus.NOT_INSTALLED ) { return false; } - throw Error(`Unexpected result: ${response.response.installationStatus}`); + throw Error(`Unexpected result: ${response.response.value}`); default: - throw Error(`Unexpected result: ${response.response?.$case}`); + throw Error(`Unexpected result: ${response.response?.case}`); } } @@ -110,11 +109,9 @@ export const installStatus = { return _subscribe( { type: NotificationType.NOTIFY_ON_ACCESSIBILITY_CHANGE }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "accessibilityChangeNotification": - return handler( - notification.type.accessibilityChangeNotification.enabled, - ); + return handler(notification.type.value.enabled); default: break; } diff --git a/packages/api-bindings/src/keybindings.ts b/packages/api-bindings/src/keybindings.ts index fa85a623ec..11e79be45a 100644 --- a/packages/api-bindings/src/keybindings.ts +++ b/packages/api-bindings/src/keybindings.ts @@ -1,10 +1,12 @@ import { Action, + ActionListSchema, KeybindingPressedNotification, NotificationType, } from "@aws/amazon-q-developer-cli-proto/fig"; import { sendUpdateApplicationPropertiesRequest } from "./requests.js"; import { _subscribe, NotificationResponse } from "./notifications.js"; +import { create } from "@bufbuild/protobuf"; export function pressed( handler: ( @@ -14,9 +16,9 @@ export function pressed( return _subscribe( { type: NotificationType.NOTIFY_ON_KEYBINDING_PRESSED }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "keybindingPressedNotification": - return handler(notification.type.keybindingPressedNotification); + return handler(notification.type.value); default: break; } @@ -27,7 +29,7 @@ export function pressed( } export function setInterceptKeystrokes( - actions: Action[], + actions: Omit[], intercept: boolean, globalIntercept?: boolean, currentTerminalSessionId?: string, @@ -35,7 +37,7 @@ export function setInterceptKeystrokes( sendUpdateApplicationPropertiesRequest({ interceptBoundKeystrokes: intercept, interceptGlobalKeystrokes: globalIntercept, - actionList: { actions }, + actionList: create(ActionListSchema, { actions }), currentTerminalSessionId, }); } diff --git a/packages/api-bindings/src/notifications.ts b/packages/api-bindings/src/notifications.ts index 235e65291a..d7d1c48469 100644 --- a/packages/api-bindings/src/notifications.ts +++ b/packages/api-bindings/src/notifications.ts @@ -1,11 +1,13 @@ import { - Notification, - ServerOriginatedMessage, - NotificationRequest, + type Notification, + type ServerOriginatedMessage, + type NotificationRequest, + NotificationRequestSchema, NotificationType, } from "@aws/amazon-q-developer-cli-proto/fig"; import { sendMessage } from "./core.js"; +import { create } from "@bufbuild/protobuf"; export type NotificationResponse = { unsubscribe: boolean; @@ -30,7 +32,7 @@ export function _unsubscribe( } export function _subscribe( - request: NotificationRequest, + request: Omit, handler: NotificationHandler, ): Promise | undefined { return new Promise((resolve, reject) => { @@ -50,9 +52,12 @@ export function _subscribe( let handlersToRemove: NotificationHandler[] | undefined; sendMessage( - { $case: "notificationRequest", notificationRequest: request }, + { + case: "notificationRequest", + value: create(NotificationRequestSchema, request), + }, (response: ServerOriginatedMessage["submessage"]) => { - switch (response?.$case) { + switch (response?.case) { case "notification": if (!handlers[type]) { return false; @@ -60,7 +65,7 @@ export function _subscribe( // call handlers and remove any that have unsubscribed (by returning false) handlersToRemove = handlers[type]?.filter((existingHandler) => { - const res = existingHandler(response.notification); + const res = existingHandler(response.value); return Boolean(res?.unsubscribe); }); @@ -74,7 +79,7 @@ export function _subscribe( addHandler(); return true; case "error": - reject(new Error(response.error)); + reject(new Error(response.value)); break; default: reject(new Error("Not a notification")); @@ -95,11 +100,11 @@ export function _subscribe( const unsubscribeFromAll = () => { sendMessage({ - $case: "notificationRequest", - notificationRequest: { + case: "notificationRequest", + value: create(NotificationRequestSchema, { subscribe: false, type: NotificationType.ALL, - }, + }), }); }; diff --git a/packages/api-bindings/src/position.ts b/packages/api-bindings/src/position.ts index 9267bd8f25..14cf7bc68b 100644 --- a/packages/api-bindings/src/position.ts +++ b/packages/api-bindings/src/position.ts @@ -1,7 +1,9 @@ +import { PointSchema, SizeSchema } from "@aws/amazon-q-developer-cli-proto/fig"; import { sendPositionWindowRequest, sendDragWindowRequest, } from "./requests.js"; +import { create } from "@bufbuild/protobuf"; // Developer Facing API export async function isValidFrame(frame: { @@ -10,8 +12,8 @@ export async function isValidFrame(frame: { anchorX: number; }) { return sendPositionWindowRequest({ - size: { width: frame.width, height: frame.height }, - anchor: { x: frame.anchorX, y: 0 }, + size: create(SizeSchema, { width: frame.width, height: frame.height }), + anchor: create(PointSchema, { x: frame.anchorX, y: 0 }), dryrun: true, }); } @@ -23,8 +25,11 @@ export async function setFrame(frame: { offsetFromBaseline: number | undefined; }) { return sendPositionWindowRequest({ - size: { width: frame.width, height: frame.height }, - anchor: { x: frame.anchorX, y: frame.offsetFromBaseline ?? 0 }, + size: create(SizeSchema, { width: frame.width, height: frame.height }), + anchor: create(PointSchema, { + x: frame.anchorX, + y: frame.offsetFromBaseline ?? 0, + }), }); } diff --git a/packages/api-bindings/src/process.ts b/packages/api-bindings/src/process.ts index 716213509e..642ab1a836 100644 --- a/packages/api-bindings/src/process.ts +++ b/packages/api-bindings/src/process.ts @@ -1,4 +1,9 @@ +import { create } from "@bufbuild/protobuf"; import { sendRunProcessRequest } from "./requests.js"; +import { + DurationSchema, + EnvironmentVariableSchema, +} from "@aws/amazon-q-developer-cli-proto/fig_common"; export async function run({ executable, @@ -19,14 +24,16 @@ export async function run({ return sendRunProcessRequest({ executable, arguments: args, - env: Object.keys(env).map((key) => ({ key, value: env[key] })), + env: Object.keys(env).map((key) => + create(EnvironmentVariableSchema, { key, value: env[key] }), + ), workingDirectory, terminalSessionId, timeout: timeout - ? { + ? create(DurationSchema, { nanos: Math.floor((timeout % 1000) * 1_000_000_000), - secs: Math.floor(timeout / 1000), - } + secs: BigInt(Math.floor(timeout / 1000)), + }) : undefined, }); } diff --git a/packages/api-bindings/src/requests.ts b/packages/api-bindings/src/requests.ts index 82fa08331a..b385510a41 100644 --- a/packages/api-bindings/src/requests.ts +++ b/packages/api-bindings/src/requests.ts @@ -4,80 +4,121 @@ import { AggregateSessionMetricActionRequest, + AggregateSessionMetricActionRequestSchema, AppendToFileRequest, + AppendToFileRequestSchema, AuthBuilderIdPollCreateTokenRequest, + AuthBuilderIdPollCreateTokenRequestSchema, AuthBuilderIdPollCreateTokenResponse, AuthBuilderIdStartDeviceAuthorizationRequest, + AuthBuilderIdStartDeviceAuthorizationRequestSchema, AuthBuilderIdStartDeviceAuthorizationResponse, AuthCancelPkceAuthorizationRequest, + AuthCancelPkceAuthorizationRequestSchema, AuthCancelPkceAuthorizationResponse, AuthFinishPkceAuthorizationRequest, + AuthFinishPkceAuthorizationRequestSchema, AuthFinishPkceAuthorizationResponse, AuthStartPkceAuthorizationRequest, + AuthStartPkceAuthorizationRequestSchema, AuthStartPkceAuthorizationResponse, AuthStatusRequest, + AuthStatusRequestSchema, AuthStatusResponse, CheckForUpdatesRequest, + CheckForUpdatesRequestSchema, CheckForUpdatesResponse, CodewhispererListCustomizationRequest, + CodewhispererListCustomizationRequestSchema, CodewhispererListCustomizationResponse, ContentsOfDirectoryRequest, + ContentsOfDirectoryRequestSchema, ContentsOfDirectoryResponse, CreateDirectoryRequest, + CreateDirectoryRequestSchema, DestinationOfSymbolicLinkRequest, + DestinationOfSymbolicLinkRequestSchema, DestinationOfSymbolicLinkResponse, DragWindowRequest, + DragWindowRequestSchema, GetLocalStateRequest, + GetLocalStateRequestSchema, GetLocalStateResponse, GetPlatformInfoRequest, + GetPlatformInfoRequestSchema, GetPlatformInfoResponse, GetSettingsPropertyRequest, + GetSettingsPropertyRequestSchema, GetSettingsPropertyResponse, HistoryQueryRequest, + HistoryQueryRequestSchema, HistoryQueryResponse, InsertTextRequest, + InsertTextRequestSchema, InstallRequest, + InstallRequestSchema, InstallResponse, + NotificationRequest, + NotificationRequestSchema, OnboardingRequest, + OnboardingRequestSchema, OpenInExternalApplicationRequest, + OpenInExternalApplicationRequestSchema, PingRequest, + PingRequestSchema, PingResponse, PositionWindowRequest, + PositionWindowRequestSchema, PositionWindowResponse, ReadFileRequest, + ReadFileRequestSchema, ReadFileResponse, RunProcessRequest, + RunProcessRequestSchema, RunProcessResponse, TelemetryPageRequest, + TelemetryPageRequestSchema, TelemetryTrackRequest, + TelemetryTrackRequestSchema, UpdateApplicationPropertiesRequest, + UpdateApplicationPropertiesRequestSchema, UpdateApplicationRequest, + UpdateApplicationRequestSchema, UpdateLocalStateRequest, + UpdateLocalStateRequestSchema, UpdateSettingsPropertyRequest, + UpdateSettingsPropertyRequestSchema, UserLogoutRequest, + UserLogoutRequestSchema, WindowFocusRequest, + WindowFocusRequestSchema, WriteFileRequest, + WriteFileRequestSchema, } from "@aws/amazon-q-developer-cli-proto/fig"; import { sendMessage } from "./core.js"; +import { create } from "@bufbuild/protobuf"; export async function sendPositionWindowRequest( - request: PositionWindowRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "positionWindowRequest", positionWindowRequest: request }, + { + case: "positionWindowRequest", + value: create(PositionWindowRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "positionWindowResponse": - resolve(response.positionWindowResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'PositionWindowRequest'`, + `Invalid response '${response?.case}' for 'PositionWindowRequest'`, ), ); } @@ -87,23 +128,26 @@ export async function sendPositionWindowRequest( } export async function sendReadFileRequest( - request: ReadFileRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "readFileRequest", readFileRequest: request }, + { + case: "readFileRequest", + value: create(ReadFileRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "readFileResponse": - resolve(response.readFileResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'ReadFileRequest'`, + `Invalid response '${response?.case}' for 'ReadFileRequest'`, ), ); } @@ -113,26 +157,26 @@ export async function sendReadFileRequest( } export async function sendContentsOfDirectoryRequest( - request: ContentsOfDirectoryRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "contentsOfDirectoryRequest", - contentsOfDirectoryRequest: request, + case: "contentsOfDirectoryRequest", + value: create(ContentsOfDirectoryRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "contentsOfDirectoryResponse": - resolve(response.contentsOfDirectoryResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'ContentsOfDirectoryRequest'`, + `Invalid response '${response?.case}' for 'ContentsOfDirectoryRequest'`, ), ); } @@ -142,26 +186,26 @@ export async function sendContentsOfDirectoryRequest( } export async function sendGetSettingsPropertyRequest( - request: GetSettingsPropertyRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "getSettingsPropertyRequest", - getSettingsPropertyRequest: request, + case: "getSettingsPropertyRequest", + value: create(GetSettingsPropertyRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "getSettingsPropertyResponse": - resolve(response.getSettingsPropertyResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'GetSettingsPropertyRequest'`, + `Invalid response '${response?.case}' for 'GetSettingsPropertyRequest'`, ), ); } @@ -171,26 +215,26 @@ export async function sendGetSettingsPropertyRequest( } export async function sendDestinationOfSymbolicLinkRequest( - request: DestinationOfSymbolicLinkRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "destinationOfSymbolicLinkRequest", - destinationOfSymbolicLinkRequest: request, + case: "destinationOfSymbolicLinkRequest", + value: create(DestinationOfSymbolicLinkRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "destinationOfSymbolicLinkResponse": - resolve(response.destinationOfSymbolicLinkResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'DestinationOfSymbolicLinkRequest'`, + `Invalid response '${response?.case}' for 'DestinationOfSymbolicLinkRequest'`, ), ); } @@ -200,23 +244,26 @@ export async function sendDestinationOfSymbolicLinkRequest( } export async function sendGetLocalStateRequest( - request: GetLocalStateRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "getLocalStateRequest", getLocalStateRequest: request }, + { + case: "getLocalStateRequest", + value: create(GetLocalStateRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "getLocalStateResponse": - resolve(response.getLocalStateResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'GetLocalStateRequest'`, + `Invalid response '${response?.case}' for 'GetLocalStateRequest'`, ), ); } @@ -226,23 +273,26 @@ export async function sendGetLocalStateRequest( } export async function sendRunProcessRequest( - request: RunProcessRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "runProcessRequest", runProcessRequest: request }, + { + case: "runProcessRequest", + value: create(RunProcessRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "runProcessResponse": - resolve(response.runProcessResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'RunProcessRequest'`, + `Invalid response '${response?.case}' for 'RunProcessRequest'`, ), ); } @@ -252,23 +302,23 @@ export async function sendRunProcessRequest( } export async function sendInstallRequest( - request: InstallRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "installRequest", installRequest: request }, + { case: "installRequest", value: create(InstallRequestSchema, request) }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "installResponse": - resolve(response.installResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'InstallRequest'`, + `Invalid response '${response?.case}' for 'InstallRequest'`, ), ); } @@ -278,23 +328,26 @@ export async function sendInstallRequest( } export async function sendCheckForUpdatesRequest( - request: CheckForUpdatesRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "checkForUpdatesRequest", checkForUpdatesRequest: request }, + { + case: "checkForUpdatesRequest", + value: create(CheckForUpdatesRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "checkForUpdatesResponse": - resolve(response.checkForUpdatesResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'CheckForUpdatesRequest'`, + `Invalid response '${response?.case}' for 'CheckForUpdatesRequest'`, ), ); } @@ -304,23 +357,26 @@ export async function sendCheckForUpdatesRequest( } export async function sendHistoryQueryRequest( - request: HistoryQueryRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "historyQueryRequest", historyQueryRequest: request }, + { + case: "historyQueryRequest", + value: create(HistoryQueryRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "historyQueryResponse": - resolve(response.historyQueryResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'HistoryQueryRequest'`, + `Invalid response '${response?.case}' for 'HistoryQueryRequest'`, ), ); } @@ -330,23 +386,26 @@ export async function sendHistoryQueryRequest( } export async function sendAuthStatusRequest( - request: AuthStatusRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "authStatusRequest", authStatusRequest: request }, + { + case: "authStatusRequest", + value: create(AuthStatusRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authStatusResponse": - resolve(response.authStatusResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthStatusRequest'`, + `Invalid response '${response?.case}' for 'AuthStatusRequest'`, ), ); } @@ -356,26 +415,32 @@ export async function sendAuthStatusRequest( } export async function sendAuthBuilderIdStartDeviceAuthorizationRequest( - request: AuthBuilderIdStartDeviceAuthorizationRequest, + request: Omit< + AuthBuilderIdStartDeviceAuthorizationRequest, + "$typeName" | "$unknown" + >, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "authBuilderIdStartDeviceAuthorizationRequest", - authBuilderIdStartDeviceAuthorizationRequest: request, + case: "authBuilderIdStartDeviceAuthorizationRequest", + value: create( + AuthBuilderIdStartDeviceAuthorizationRequestSchema, + request, + ), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authBuilderIdStartDeviceAuthorizationResponse": - resolve(response.authBuilderIdStartDeviceAuthorizationResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthBuilderIdStartDeviceAuthorizationRequest'`, + `Invalid response '${response?.case}' for 'AuthBuilderIdStartDeviceAuthorizationRequest'`, ), ); } @@ -385,26 +450,26 @@ export async function sendAuthBuilderIdStartDeviceAuthorizationRequest( } export async function sendAuthBuilderIdPollCreateTokenRequest( - request: AuthBuilderIdPollCreateTokenRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "authBuilderIdPollCreateTokenRequest", - authBuilderIdPollCreateTokenRequest: request, + case: "authBuilderIdPollCreateTokenRequest", + value: create(AuthBuilderIdPollCreateTokenRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authBuilderIdPollCreateTokenResponse": - resolve(response.authBuilderIdPollCreateTokenResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthBuilderIdPollCreateTokenRequest'`, + `Invalid response '${response?.case}' for 'AuthBuilderIdPollCreateTokenRequest'`, ), ); } @@ -414,47 +479,53 @@ export async function sendAuthBuilderIdPollCreateTokenRequest( } export async function sendPingRequest( - request: PingRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { - sendMessage({ $case: "pingRequest", pingRequest: request }, (response) => { - switch (response?.$case) { - case "pingResponse": - resolve(response.pingResponse); - break; - case "error": - reject(Error(response.error)); - break; - default: - reject( - Error(`Invalid response '${response?.$case}' for 'PingRequest'`), - ); - } - }); + sendMessage( + { case: "pingRequest", value: create(PingRequestSchema, request) }, + (response) => { + switch (response?.case) { + case "pingResponse": + resolve(response.value); + break; + case "error": + reject(Error(response.value)); + break; + default: + reject( + Error(`Invalid response '${response?.case}' for 'PingRequest'`), + ); + } + }, + ); }); } export async function sendCodewhispererListCustomizationRequest( - request: CodewhispererListCustomizationRequest, + request: Omit< + CodewhispererListCustomizationRequest, + "$typeName" | "$unknown" + >, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "codewhispererListCustomizationRequest", - codewhispererListCustomizationRequest: request, + case: "codewhispererListCustomizationRequest", + value: create(CodewhispererListCustomizationRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "codewhispererListCustomizationResponse": - resolve(response.codewhispererListCustomizationResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'CodewhispererListCustomizationRequest'`, + `Invalid response '${response?.case}' for 'CodewhispererListCustomizationRequest'`, ), ); } @@ -464,26 +535,26 @@ export async function sendCodewhispererListCustomizationRequest( } export async function sendAuthStartPkceAuthorizationRequest( - request: AuthStartPkceAuthorizationRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "authStartPkceAuthorizationRequest", - authStartPkceAuthorizationRequest: request, + case: "authStartPkceAuthorizationRequest", + value: create(AuthStartPkceAuthorizationRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authStartPkceAuthorizationResponse": - resolve(response.authStartPkceAuthorizationResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthStartPkceAuthorizationRequest'`, + `Invalid response '${response?.case}' for 'AuthStartPkceAuthorizationRequest'`, ), ); } @@ -493,26 +564,26 @@ export async function sendAuthStartPkceAuthorizationRequest( } export async function sendAuthFinishPkceAuthorizationRequest( - request: AuthFinishPkceAuthorizationRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "authFinishPkceAuthorizationRequest", - authFinishPkceAuthorizationRequest: request, + case: "authFinishPkceAuthorizationRequest", + value: create(AuthFinishPkceAuthorizationRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authFinishPkceAuthorizationResponse": - resolve(response.authFinishPkceAuthorizationResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthFinishPkceAuthorizationRequest'`, + `Invalid response '${response?.case}' for 'AuthFinishPkceAuthorizationRequest'`, ), ); } @@ -522,26 +593,26 @@ export async function sendAuthFinishPkceAuthorizationRequest( } export async function sendAuthCancelPkceAuthorizationRequest( - request: AuthCancelPkceAuthorizationRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "authCancelPkceAuthorizationRequest", - authCancelPkceAuthorizationRequest: request, + case: "authCancelPkceAuthorizationRequest", + value: create(AuthCancelPkceAuthorizationRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "authCancelPkceAuthorizationResponse": - resolve(response.authCancelPkceAuthorizationResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AuthCancelPkceAuthorizationRequest'`, + `Invalid response '${response?.case}' for 'AuthCancelPkceAuthorizationRequest'`, ), ); } @@ -551,23 +622,26 @@ export async function sendAuthCancelPkceAuthorizationRequest( } export async function sendGetPlatformInfoRequest( - request: GetPlatformInfoRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "getPlatformInfoRequest", getPlatformInfoRequest: request }, + { + case: "getPlatformInfoRequest", + value: create(GetPlatformInfoRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "getPlatformInfoResponse": - resolve(response.getPlatformInfoResponse); + resolve(response.value); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'GetPlatformInfoRequest'`, + `Invalid response '${response?.case}' for 'GetPlatformInfoRequest'`, ), ); } @@ -577,23 +651,55 @@ export async function sendGetPlatformInfoRequest( } export async function sendWriteFileRequest( - request: WriteFileRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "writeFileRequest", writeFileRequest: request }, + { + case: "writeFileRequest", + value: create(WriteFileRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'WriteFileRequest'`, + `Invalid response '${response?.case}' for 'WriteFileRequest'`, + ), + ); + } + }, + ); + }); +} + +export async function sendNotificationRequest( + request: Omit, +): Promise { + return new Promise((resolve, reject) => { + sendMessage( + { + case: "notificationRequest", + value: create(NotificationRequestSchema, request), + }, + (response) => { + switch (response?.case) { + case "success": + resolve(); + break; + case "error": + reject(Error(response.value)); + break; + default: + reject( + Error( + `Invalid response '${response?.case}' for 'NotificationRequest'`, ), ); } @@ -603,26 +709,26 @@ export async function sendWriteFileRequest( } export async function sendUpdateSettingsPropertyRequest( - request: UpdateSettingsPropertyRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "updateSettingsPropertyRequest", - updateSettingsPropertyRequest: request, + case: "updateSettingsPropertyRequest", + value: create(UpdateSettingsPropertyRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'UpdateSettingsPropertyRequest'`, + `Invalid response '${response?.case}' for 'UpdateSettingsPropertyRequest'`, ), ); } @@ -632,23 +738,26 @@ export async function sendUpdateSettingsPropertyRequest( } export async function sendInsertTextRequest( - request: InsertTextRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "insertTextRequest", insertTextRequest: request }, + { + case: "insertTextRequest", + value: create(InsertTextRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'InsertTextRequest'`, + `Invalid response '${response?.case}' for 'InsertTextRequest'`, ), ); } @@ -658,26 +767,26 @@ export async function sendInsertTextRequest( } export async function sendUpdateApplicationPropertiesRequest( - request: UpdateApplicationPropertiesRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "updateApplicationPropertiesRequest", - updateApplicationPropertiesRequest: request, + case: "updateApplicationPropertiesRequest", + value: create(UpdateApplicationPropertiesRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'UpdateApplicationPropertiesRequest'`, + `Invalid response '${response?.case}' for 'UpdateApplicationPropertiesRequest'`, ), ); } @@ -687,23 +796,26 @@ export async function sendUpdateApplicationPropertiesRequest( } export async function sendTelemetryTrackRequest( - request: TelemetryTrackRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "telemetryTrackRequest", telemetryTrackRequest: request }, + { + case: "telemetryTrackRequest", + value: create(TelemetryTrackRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'TelemetryTrackRequest'`, + `Invalid response '${response?.case}' for 'TelemetryTrackRequest'`, ), ); } @@ -713,23 +825,26 @@ export async function sendTelemetryTrackRequest( } export async function sendOnboardingRequest( - request: OnboardingRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "onboardingRequest", onboardingRequest: request }, + { + case: "onboardingRequest", + value: create(OnboardingRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'OnboardingRequest'`, + `Invalid response '${response?.case}' for 'OnboardingRequest'`, ), ); } @@ -739,23 +854,26 @@ export async function sendOnboardingRequest( } export async function sendWindowFocusRequest( - request: WindowFocusRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "windowFocusRequest", windowFocusRequest: request }, + { + case: "windowFocusRequest", + value: create(WindowFocusRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'WindowFocusRequest'`, + `Invalid response '${response?.case}' for 'WindowFocusRequest'`, ), ); } @@ -765,26 +883,26 @@ export async function sendWindowFocusRequest( } export async function sendOpenInExternalApplicationRequest( - request: OpenInExternalApplicationRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "openInExternalApplicationRequest", - openInExternalApplicationRequest: request, + case: "openInExternalApplicationRequest", + value: create(OpenInExternalApplicationRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'OpenInExternalApplicationRequest'`, + `Invalid response '${response?.case}' for 'OpenInExternalApplicationRequest'`, ), ); } @@ -794,23 +912,26 @@ export async function sendOpenInExternalApplicationRequest( } export async function sendAppendToFileRequest( - request: AppendToFileRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "appendToFileRequest", appendToFileRequest: request }, + { + case: "appendToFileRequest", + value: create(AppendToFileRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AppendToFileRequest'`, + `Invalid response '${response?.case}' for 'AppendToFileRequest'`, ), ); } @@ -820,23 +941,26 @@ export async function sendAppendToFileRequest( } export async function sendUpdateLocalStateRequest( - request: UpdateLocalStateRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "updateLocalStateRequest", updateLocalStateRequest: request }, + { + case: "updateLocalStateRequest", + value: create(UpdateLocalStateRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'UpdateLocalStateRequest'`, + `Invalid response '${response?.case}' for 'UpdateLocalStateRequest'`, ), ); } @@ -846,23 +970,26 @@ export async function sendUpdateLocalStateRequest( } export async function sendCreateDirectoryRequest( - request: CreateDirectoryRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "createDirectoryRequest", createDirectoryRequest: request }, + { + case: "createDirectoryRequest", + value: create(CreateDirectoryRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'CreateDirectoryRequest'`, + `Invalid response '${response?.case}' for 'CreateDirectoryRequest'`, ), ); } @@ -872,23 +999,26 @@ export async function sendCreateDirectoryRequest( } export async function sendTelemetryPageRequest( - request: TelemetryPageRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "telemetryPageRequest", telemetryPageRequest: request }, + { + case: "telemetryPageRequest", + value: create(TelemetryPageRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'TelemetryPageRequest'`, + `Invalid response '${response?.case}' for 'TelemetryPageRequest'`, ), ); } @@ -898,26 +1028,26 @@ export async function sendTelemetryPageRequest( } export async function sendAggregateSessionMetricActionRequest( - request: AggregateSessionMetricActionRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( { - $case: "aggregateSessionMetricActionRequest", - aggregateSessionMetricActionRequest: request, + case: "aggregateSessionMetricActionRequest", + value: create(AggregateSessionMetricActionRequestSchema, request), }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'AggregateSessionMetricActionRequest'`, + `Invalid response '${response?.case}' for 'AggregateSessionMetricActionRequest'`, ), ); } @@ -927,23 +1057,26 @@ export async function sendAggregateSessionMetricActionRequest( } export async function sendUserLogoutRequest( - request: UserLogoutRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "userLogoutRequest", userLogoutRequest: request }, + { + case: "userLogoutRequest", + value: create(UserLogoutRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'UserLogoutRequest'`, + `Invalid response '${response?.case}' for 'UserLogoutRequest'`, ), ); } @@ -953,23 +1086,26 @@ export async function sendUserLogoutRequest( } export async function sendUpdateApplicationRequest( - request: UpdateApplicationRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "updateApplicationRequest", updateApplicationRequest: request }, + { + case: "updateApplicationRequest", + value: create(UpdateApplicationRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'UpdateApplicationRequest'`, + `Invalid response '${response?.case}' for 'UpdateApplicationRequest'`, ), ); } @@ -979,23 +1115,26 @@ export async function sendUpdateApplicationRequest( } export async function sendDragWindowRequest( - request: DragWindowRequest, + request: Omit, ): Promise { return new Promise((resolve, reject) => { sendMessage( - { $case: "dragWindowRequest", dragWindowRequest: request }, + { + case: "dragWindowRequest", + value: create(DragWindowRequestSchema, request), + }, (response) => { - switch (response?.$case) { + switch (response?.case) { case "success": resolve(); break; case "error": - reject(Error(response.error)); + reject(Error(response.value)); break; default: reject( Error( - `Invalid response '${response?.$case}' for 'DragWindowRequest'`, + `Invalid response '${response?.case}' for 'DragWindowRequest'`, ), ); } diff --git a/packages/api-bindings/src/settings.ts b/packages/api-bindings/src/settings.ts index 58fcf5e880..ab0e5b63f9 100644 --- a/packages/api-bindings/src/settings.ts +++ b/packages/api-bindings/src/settings.ts @@ -18,9 +18,9 @@ export const didChange = { return _subscribe( { type: NotificationType.NOTIFY_ON_SETTINGS_CHANGE }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "settingsChangedNotification": - return handler(notification.type.settingsChangedNotification); + return handler(notification.type.value); default: break; } @@ -37,8 +37,7 @@ export async function get(key: string) { }); } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function set(key: string, value: any): Promise { +export async function set(key: string, value: unknown): Promise { return sendUpdateSettingsPropertyRequest({ key, value: JSON.stringify(value), diff --git a/packages/api-bindings/src/shell.ts b/packages/api-bindings/src/shell.ts index a7282ec269..3a5cb86a90 100644 --- a/packages/api-bindings/src/shell.ts +++ b/packages/api-bindings/src/shell.ts @@ -4,9 +4,11 @@ import { ShellPromptReturnedNotification, TextUpdate, HistoryUpdatedNotification, + TextUpdateSchema, } from "@aws/amazon-q-developer-cli-proto/fig"; import { sendInsertTextRequest } from "./requests.js"; import { _subscribe, NotificationResponse } from "./notifications.js"; +import { create } from "@bufbuild/protobuf"; export const processDidChange = { subscribe( @@ -17,9 +19,9 @@ export const processDidChange = { return _subscribe( { type: NotificationType.NOTIFY_ON_PROCESS_CHANGED }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "processChangeNotification": - return handler(notification.type.processChangeNotification); + return handler(notification.type.value); default: break; } @@ -39,9 +41,9 @@ export const promptDidReturn = { return _subscribe( { type: NotificationType.NOTIFY_ON_PROMPT }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "shellPromptReturnedNotification": - return handler(notification.type.shellPromptReturnedNotification); + return handler(notification.type.value); default: break; } @@ -61,9 +63,9 @@ export const historyUpdated = { return _subscribe( { type: NotificationType.NOTIFY_ON_HISTORY_UPDATED }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "historyUpdatedNotification": - return handler(notification.type.historyUpdatedNotification); + return handler(notification.type.value); default: break; } @@ -76,17 +78,20 @@ export const historyUpdated = { export async function insert( text: string, - request?: Omit, + request?: Omit, terminalSessionId?: string, ) { if (request) { return sendInsertTextRequest({ terminalSessionId, - type: { $case: "update", update: { ...request, insertion: text } }, + type: { + case: "update", + value: create(TextUpdateSchema, { ...request, insertion: text }), + }, }); } return sendInsertTextRequest({ terminalSessionId, - type: { $case: "text", text }, + type: { case: "text", value: text }, }); } diff --git a/packages/api-bindings/src/state.ts b/packages/api-bindings/src/state.ts index 7ca7098db6..158ca27797 100644 --- a/packages/api-bindings/src/state.ts +++ b/packages/api-bindings/src/state.ts @@ -18,9 +18,9 @@ export const didChange = { return _subscribe( { type: NotificationType.NOTIFY_ON_LOCAL_STATE_CHANGED }, (notification) => { - switch (notification?.type?.$case) { + switch (notification?.type?.case) { case "localStateChangedNotification": - return handler(notification.type.localStateChangedNotification); + return handler(notification.type.value); default: break; } @@ -36,8 +36,7 @@ export async function get(key: string) { return response.jsonBlob ? JSON.parse(response.jsonBlob) : null; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export async function set(key: string, value: any): Promise { +export async function set(key: string, value: unknown): Promise { return sendUpdateLocalStateRequest({ key, value: JSON.stringify(value), diff --git a/packages/api-bindings/src/telemetry.ts b/packages/api-bindings/src/telemetry.ts index bdbd0f73dc..2891ca71a5 100644 --- a/packages/api-bindings/src/telemetry.ts +++ b/packages/api-bindings/src/telemetry.ts @@ -1,8 +1,12 @@ -import { TelemetryProperty } from "@aws/amazon-q-developer-cli-proto/fig"; +import { + TelemetryProperty, + TelemetryPropertySchema, +} from "@aws/amazon-q-developer-cli-proto/fig"; import { sendTelemetryPageRequest, sendTelemetryTrackRequest, } from "./requests.js"; +import { create } from "@bufbuild/protobuf"; type Property = string | boolean | number | null; @@ -10,10 +14,10 @@ export function track(event: string, properties: Record) { // convert to internal type 'TelemetryProperty' const props = Object.keys(properties).reduce( (array, key) => { - const entry: TelemetryProperty = { + const entry: TelemetryProperty = create(TelemetryPropertySchema, { key, value: JSON.stringify(properties[key]), - }; + }); array.push(entry); return array; }, diff --git a/packages/autocomplete-parser/src/caches.ts b/packages/autocomplete-parser/src/caches.ts index 50cb65438a..dd358bc84a 100644 --- a/packages/autocomplete-parser/src/caches.ts +++ b/packages/autocomplete-parser/src/caches.ts @@ -1,4 +1,3 @@ -import { SpecMixin } from "@fig/autocomplete-shared"; import { Subcommand } from "@aws/amazon-q-developer-cli-shared/internal"; const allCaches: Array> = []; @@ -17,12 +16,10 @@ export const resetCaches = () => { window.resetCaches = resetCaches; -export const mixinCache = createCache(); export const specCache = createCache(); export const generateSpecCache = createCache(); window.listCache = () => { - console.log(mixinCache); console.log(specCache); console.log(generateSpecCache); }; diff --git a/packages/autocomplete-parser/src/loadHelpers.ts b/packages/autocomplete-parser/src/loadHelpers.ts index 1816ec9b92..758b6d6bc0 100644 --- a/packages/autocomplete-parser/src/loadHelpers.ts +++ b/packages/autocomplete-parser/src/loadHelpers.ts @@ -33,8 +33,7 @@ const cdnUrlFactory = makeCdnUrlFactory( "https://specs.q.us-east-1.amazonaws.com/", ); -/* eslint-disable-next-line @typescript-eslint/no-explicit-any */ -const stringImportCache = new Map(); +const stringImportCache = new Map(); export const importString = async (str: string) => { if (stringImportCache.has(str)) { diff --git a/packages/autocomplete/package.json b/packages/autocomplete/package.json index 3d1c381dc2..44154d7b97 100644 --- a/packages/autocomplete/package.json +++ b/packages/autocomplete/package.json @@ -26,6 +26,7 @@ "@aws/amazon-q-developer-cli-autocomplete-parser": "workspace:^", "@aws/amazon-q-developer-cli-proto": "workspace:^", "@aws/amazon-q-developer-cli-shell-parser": "workspace:^", + "@bufbuild/protobuf": "2.2.3", "@fig/autocomplete-helpers": "^1.0.7", "@fig/autocomplete-shared": "^1.1.2", "@juggle/resize-observer": "^3.4.0", @@ -46,17 +47,17 @@ }, "devDependencies": { "@amzn/eslint-config": "workspace:^", + "@amzn/types": "workspace:^", "@aws/amazon-q-developer-cli-fuzzysort": "workspace:^", "@aws/amazon-q-developer-cli-shared": "workspace:^", - "@amzn/types": "workspace:^", + "@types/js-yaml": "^4.0.9", "@types/node": "^22.10.1", "@types/react": "^18.3.14", "@types/react-dom": "^18.3.2", "@types/react-window": "^1.8.8", "@types/semver": "^7.5.8", - "@types/js-yaml": "^4.0.9", - "@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-legacy": "^6.0.0", + "@vitejs/plugin-react": "^4.3.4", "@withfig/autocomplete-types": "^1.31.0", "autoprefixer": "^10.4.20", "eslint": "^9.16.0", diff --git a/packages/autocomplete/src/actions.ts b/packages/autocomplete/src/actions.ts index 8a1588e817..731ab63c09 100644 --- a/packages/autocomplete/src/actions.ts +++ b/packages/autocomplete/src/actions.ts @@ -1,6 +1,10 @@ -import { Fig as FigAPI } from "@aws/amazon-q-developer-cli-api-bindings"; import { SettingsMap } from "@aws/amazon-q-developer-cli-api-bindings-wrappers"; import * as app from "./fig.json"; +import { create } from "@bufbuild/protobuf"; +import { + ActionAvailability, + ActionSchema, +} from "@aws/amazon-q-developer-cli-proto/fig"; const SELECT_SUGGESTION_ACTION_PREFIX = "selectSuggestion"; @@ -42,7 +46,28 @@ export enum AutocompleteAction { SELECT_SUGGESTION_10 = "selectSuggestion10", } -export const ACTIONS = app.contributes.actions.map(FigAPI.Action.fromJSON); +export const ACTIONS = app.contributes.actions.map((action) => { + let availability: ActionAvailability | undefined; + switch (action.availability) { + case "ALWAYS": + availability = ActionAvailability.ALWAYS; + break; + case "WHEN_FOCUSED": + availability = ActionAvailability.WHEN_FOCUSED; + break; + case "WHEN_HIDDEN": + availability = ActionAvailability.WHEN_HIDDEN; + break; + case "WHEN_VISIBLE": + availability = ActionAvailability.WHEN_VISIBLE; + break; + } + + return create(ActionSchema, { + ...action, + availability, + }); +}); const defaultSelectSuggestionKeybindings = app.contributes.actions.reduce( (p, v) => { diff --git a/packages/autocomplete/src/state/index.ts b/packages/autocomplete/src/state/index.ts index 5c0e344925..92cb2e0d5b 100644 --- a/packages/autocomplete/src/state/index.ts +++ b/packages/autocomplete/src/state/index.ts @@ -23,12 +23,7 @@ import { type Types } from "@aws/amazon-q-developer-cli-api-bindings"; import { detailedDiff } from "deep-object-diff"; import { trackEvent } from "../telemetry.js"; import { FigState, initialFigState } from "../fig/hooks"; -import { - AutocompleteState, - ComponentMap, - NamedSetState, - Visibility, -} from "./types"; +import { AutocompleteState, NamedSetState, Visibility } from "./types"; import { updatePriorities } from "../suggestions/sorting"; import { @@ -61,8 +56,6 @@ const initialState: Partial = { fuzzySearchEnabled: false, userFuzzySearchEnabled: getSetting(SETTINGS.FUZZY_SEARCH, false) as boolean, settings: {} as SettingsMap, - - components: {}, }; const getCommandMemoized = memoizeOne(getCommand); @@ -509,14 +502,6 @@ export const useAutocompleteStore = createWithEqualityFn( } }), - setComponents: (components: React.SetStateAction) => - setNamed("setComponents", (state) => ({ - components: - typeof components === "function" - ? components(state.components) - : components, - })), - error: (error: string) => setNamed("error", (state) => { logger.warn(error); diff --git a/packages/autocomplete/src/state/types.ts b/packages/autocomplete/src/state/types.ts index 6b320c4269..fcfc008bce 100644 --- a/packages/autocomplete/src/state/types.ts +++ b/packages/autocomplete/src/state/types.ts @@ -23,11 +23,6 @@ export enum Visibility { HIDDEN_BY_INSERTION = "insertion", } -export type ComponentMap = Record< - string, - React.LazyExoticComponent> ->; - type AutocompleteActions = { setParserResult: ( parserResult: ArgumentParserResult, @@ -47,7 +42,6 @@ type AutocompleteActions = { setHistoryModeEnabled: React.Dispatch>; setUserFuzzySearchEnabled: React.Dispatch>; setSettings: React.Dispatch>; - setComponents: React.Dispatch>; }; export type AutocompleteState = { @@ -75,8 +69,6 @@ export type AutocompleteState = { */ fuzzySearchEnabled: boolean; settings: SettingsMap; - - components: ComponentMap; } & AutocompleteActions; export declare type NamedSetState = { diff --git a/packages/dashboard/src/components/installs/modal/login/index.tsx b/packages/dashboard/src/components/installs/modal/login/index.tsx index 9b174b8b77..78b378ccd9 100644 --- a/packages/dashboard/src/components/installs/modal/login/index.tsx +++ b/packages/dashboard/src/components/installs/modal/login/index.tsx @@ -97,7 +97,9 @@ export default function LoginModal({ next }: { next: () => void }) { ); }); - await Auth.finishPkceAuthorization(init) + await Auth.finishPkceAuthorization({ + authRequestId: init.authRequestId, + }) .then(() => { setLoginState("logged in"); Internal.sendWindowFocusRequest({}); diff --git a/packages/shared/src/errors.ts b/packages/shared/src/errors.ts index 0e92e27e10..fea9c9f487 100644 --- a/packages/shared/src/errors.ts +++ b/packages/shared/src/errors.ts @@ -2,6 +2,6 @@ export const createErrorInstance = (name: string) => class extends Error { constructor(message?: string) { super(message); - this.name = `Q.${name}`; + this.name = `AmazonQ.${name}`; } }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 458e4523ba..05c096d03d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -123,6 +123,9 @@ importers: '@aws/amazon-q-developer-cli-proto': specifier: workspace:^ version: link:../../proto + '@bufbuild/protobuf': + specifier: 2.2.3 + version: 2.2.3 devDependencies: '@amzn/eslint-config': specifier: workspace:^ @@ -151,12 +154,6 @@ importers: ts-morph: specifier: ^24.0.0 version: 24.0.0 - ts-proto: - specifier: ~2.5.0 - version: 2.5.0 - tslib: - specifier: ^2.8.1 - version: 2.8.1 tsx: specifier: ^4.19.2 version: 4.19.2 @@ -215,6 +212,9 @@ importers: '@aws/amazon-q-developer-cli-shell-parser': specifier: workspace:^ version: link:../shell-parser + '@bufbuild/protobuf': + specifier: 2.2.3 + version: 2.2.3 '@fig/autocomplete-helpers': specifier: ^1.0.7 version: 1.0.7 @@ -624,15 +624,18 @@ importers: proto: dependencies: '@bufbuild/protobuf': - specifier: 2.2.2 - version: 2.2.2 + specifier: 2.2.3 + version: 2.2.3 devDependencies: '@amzn/tsconfig': specifier: workspace:^ version: link:../packages/tsconfig - ts-proto: - specifier: ^2.5.0 - version: 2.5.0 + '@bufbuild/buf': + specifier: ^1.47.2 + version: 1.47.2 + '@bufbuild/protoc-gen-es': + specifier: ^2.2.3 + version: 2.2.3(@bufbuild/protobuf@2.2.3) typescript: specifier: ^5.7.2 version: 5.7.2 @@ -1226,8 +1229,68 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bufbuild/protobuf@2.2.2': - resolution: {integrity: sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==} + '@bufbuild/buf-darwin-arm64@1.47.2': + resolution: {integrity: sha512-74WerFn06y+azgVfsnzhfbI5wla/OLPDnIvaNJBWHaqya/3bfascJkDylW2GVNHmwG1K/cscpmcc/RJPaO7ntQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@bufbuild/buf-darwin-x64@1.47.2': + resolution: {integrity: sha512-adAiOacOQe8Ym/YXPCEiq9mrPeKRmDtF2TgqPWTcDy6mF7TqR7hMJINkEEuMd1EeACmXnzMOnXlm9ICtvdYgPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@bufbuild/buf-linux-aarch64@1.47.2': + resolution: {integrity: sha512-52vY+Owffr5diw2PyfQJqH+Fld6zW6NhNZak4zojvc2MjZKubWM0TfNyM9jXz2YrwyB+cyxkabE60nBI80m37w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@bufbuild/buf-linux-armv7@1.47.2': + resolution: {integrity: sha512-g9KtpObDeHZ/VG/0b5ZCieOao7L/WYZ0fPqFSs4N07D3APgEDhJG6vLyUcDgJMDgyLcgkNjNz0+XdYQb/tXyQw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@bufbuild/buf-linux-x64@1.47.2': + resolution: {integrity: sha512-MODCK2BzD1Mgoyr+5Sp8xA8qMNdytj8hYheyhA5NnCGTkQf8sfqAjpBSAAmKk6Zar8HOlVXML6tzE/ioDFFGwQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@bufbuild/buf-win32-arm64@1.47.2': + resolution: {integrity: sha512-563YKYWJl3LrCY3G3+zuhb8HwOs6DzWslwGPFkKV2hwHyWyvd1DR1JjiLvw9zX64IKNctQ0HempSqc3kcboaqQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@bufbuild/buf-win32-x64@1.47.2': + resolution: {integrity: sha512-Sqcdv7La2xBDh3bTdEYb2f4UTMMqCcYe/D0RELhvQ5wDn6I35V3/2YT1OF5fRuf0BZLCo0OdO37S9L47uHSz2g==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@bufbuild/buf@1.47.2': + resolution: {integrity: sha512-glY5kCAoO4+a7HvDb+BLOdoHSdCk4mdXdkp53H8JFz7maOnkxCiHHXgRX+taFyEu25N8ybn7NjZFrZSdRwq2sA==} + engines: {node: '>=12'} + hasBin: true + + '@bufbuild/protobuf@2.2.3': + resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==} + + '@bufbuild/protoc-gen-es@2.2.3': + resolution: {integrity: sha512-hdhIV9NmwXXy24DcbnArauv6L5Dv2PjkO9gz2DUhiZ9HPRpP+rmpT8zo5LohjJiuA7YIQGGKKWSKpRg+xcdLSQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + '@bufbuild/protobuf': 2.2.3 + peerDependenciesMeta: + '@bufbuild/protobuf': + optional: true + + '@bufbuild/protoplugin@2.2.3': + resolution: {integrity: sha512-UsV7mj6NJTZrqIYJK+jNFnnj5tOS7wgNXKyMjebFEpf+OX6pfXE+nx+QPjumOfu4GxdVPfEDnKuwISgqlXSQqw==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -2641,6 +2704,11 @@ packages: resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true + '@typescript/vfs@1.6.0': + resolution: {integrity: sha512-hvJUjNVeBMp77qPINuUvYXj4FyWeeMMKZkxEATEU3hqBAQ7qdTBCUFT7Sp0Zu0faeEtFf+ldXxMEDr/bk73ISg==} + peerDependencies: + typescript: '*' + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -3026,10 +3094,6 @@ packages: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true - case-anything@2.1.13: - resolution: {integrity: sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==} - engines: {node: '>=12.13'} - ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3295,11 +3359,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -3345,9 +3404,6 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dprint-node@1.0.8: - resolution: {integrity: sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -5492,16 +5548,6 @@ packages: '@swc/wasm': optional: true - ts-poet@6.9.0: - resolution: {integrity: sha512-roe6W6MeZmCjRmppyfOURklO5tQFQ6Sg7swURKkwYJvV7dbGCrK28um5+51iW3twdPRKtwarqFAVMU6G1mvnuQ==} - - ts-proto-descriptors@2.0.0: - resolution: {integrity: sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==} - - ts-proto@2.5.0: - resolution: {integrity: sha512-QI+rFgj4Th3njPZ8a3HM56kH7S2ZU/ph8MeH8JC3ouhhVe5hVXEG0nAyeHXaOE+gi/8YwCGDORIyNAzdb7Pr4g==} - hasBin: true - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -5610,6 +5656,11 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -6780,7 +6831,54 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@bufbuild/protobuf@2.2.2': {} + '@bufbuild/buf-darwin-arm64@1.47.2': + optional: true + + '@bufbuild/buf-darwin-x64@1.47.2': + optional: true + + '@bufbuild/buf-linux-aarch64@1.47.2': + optional: true + + '@bufbuild/buf-linux-armv7@1.47.2': + optional: true + + '@bufbuild/buf-linux-x64@1.47.2': + optional: true + + '@bufbuild/buf-win32-arm64@1.47.2': + optional: true + + '@bufbuild/buf-win32-x64@1.47.2': + optional: true + + '@bufbuild/buf@1.47.2': + optionalDependencies: + '@bufbuild/buf-darwin-arm64': 1.47.2 + '@bufbuild/buf-darwin-x64': 1.47.2 + '@bufbuild/buf-linux-aarch64': 1.47.2 + '@bufbuild/buf-linux-armv7': 1.47.2 + '@bufbuild/buf-linux-x64': 1.47.2 + '@bufbuild/buf-win32-arm64': 1.47.2 + '@bufbuild/buf-win32-x64': 1.47.2 + + '@bufbuild/protobuf@2.2.3': {} + + '@bufbuild/protoc-gen-es@2.2.3(@bufbuild/protobuf@2.2.3)': + dependencies: + '@bufbuild/protoplugin': 2.2.3 + optionalDependencies: + '@bufbuild/protobuf': 2.2.3 + transitivePeerDependencies: + - supports-color + + '@bufbuild/protoplugin@2.2.3': + dependencies: + '@bufbuild/protobuf': 2.2.3 + '@typescript/vfs': 1.6.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color '@cspotcode/source-map-support@0.8.1': dependencies: @@ -8463,6 +8561,13 @@ snapshots: treeify: 1.1.0 yargs: 16.2.0 + '@typescript/vfs@1.6.0(typescript@5.4.5)': + dependencies: + debug: 4.3.7(supports-color@8.1.1) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + '@ungap/structured-clone@1.2.0': {} '@vitejs/plugin-legacy@6.0.0(terser@5.37.0)(vite@6.0.3(@types/node@22.10.1)(jiti@1.21.6)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))': @@ -8930,8 +9035,6 @@ snapshots: ansicolors: 0.3.2 redeyed: 2.1.1 - case-anything@2.1.13: {} - ccount@2.0.1: {} chai@5.1.2: @@ -9194,8 +9297,6 @@ snapshots: dequal@2.0.3: {} - detect-libc@1.0.3: {} - detect-libc@2.0.3: optional: true @@ -9239,10 +9340,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dprint-node@1.0.8: - dependencies: - detect-libc: 1.0.3 - eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -11868,21 +11965,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-poet@6.9.0: - dependencies: - dprint-node: 1.0.8 - - ts-proto-descriptors@2.0.0: - dependencies: - '@bufbuild/protobuf': 2.2.2 - - ts-proto@2.5.0: - dependencies: - '@bufbuild/protobuf': 2.2.2 - case-anything: 2.1.13 - ts-poet: 6.9.0 - ts-proto-descriptors: 2.0.0 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -11999,6 +12081,8 @@ snapshots: typescript@4.9.5: {} + typescript@5.4.5: {} + typescript@5.7.2: {} uc.micro@1.0.6: {} diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml new file mode 100644 index 0000000000..5db8d2e8a1 --- /dev/null +++ b/proto/buf.gen.yaml @@ -0,0 +1,11 @@ +version: v2 +inputs: + - directory: . +plugins: + - local: protoc-gen-es + opt: + - target=js+dts + - import_extension=js + - json_types=false + out: dist + diff --git a/proto/build-ts.sh b/proto/build-ts.sh deleted file mode 100755 index 13db6730e5..0000000000 --- a/proto/build-ts.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -set -eux - -TS_PROTO="$(pnpm bin)/protoc-gen-ts_proto" - -FLAGS="--experimental_allow_proto3_optional" -TS_FLAGS="--plugin=${TS_PROTO} \ - --ts_proto_opt=esModuleInterop=true \ - --ts_proto_opt=oneof=unions \ - --ts_proto_opt=fileSuffix=.pb \ - --ts_proto_opt=importSuffix=.js \ - --ts_proto_opt=removeEnumPrefix=true \ - --ts_proto_opt=useExactTypes=false \ - --ts_proto_opt=globalThisPolyfill=true" - -API="./fig.proto ./fig_common.proto ./figterm.proto ./remote.proto ./local.proto" - -OUT="dist" - -# clean the out dir -rm -rf "$OUT" -mkdir -p "$OUT" - -# shellcheck disable=SC2086 -protoc $FLAGS $TS_FLAGS "--ts_proto_out=$OUT" $API - -tsc diff --git a/proto/package.json b/proto/package.json index a5f50dff4b..03086e39d4 100644 --- a/proto/package.json +++ b/proto/package.json @@ -6,7 +6,7 @@ "repository": "https://github.com/aws/amazon-q-developer-cli", "type": "module", "exports": { - "./*": "./dist/*.pb.js" + "./*": "./dist/*_pb.js" }, "files": [ "dist" @@ -15,18 +15,19 @@ "node": ">=18" }, "scripts": { - "build": "./build-ts.sh", + "build": "rm -rf dist && buf generate && tsc", "lint": "buf lint && (buf format --exit-code > /dev/null || (echo 'Run `buf format -w`' && exit 1))", "lint:fix": "buf format -w", "precommit": "exit 0", "clean": "rm -rf dist" }, "dependencies": { - "@bufbuild/protobuf": "2.2.2" + "@bufbuild/protobuf": "2.2.3" }, "devDependencies": { "@amzn/tsconfig": "workspace:^", - "ts-proto": "^2.5.0", + "@bufbuild/buf": "^1.47.2", + "@bufbuild/protoc-gen-es": "^2.2.3", "typescript": "^5.7.2" } } diff --git a/tests/figterm/package.json b/tests/figterm/package.json index 8e8ed238ae..c72b1714e5 100644 --- a/tests/figterm/package.json +++ b/tests/figterm/package.json @@ -36,7 +36,6 @@ "node-pty": "^0.10.1", "protobufjs": "^7.0.0", "ts-node": "^10.4.0", - "ts-proto": "~1.159.1", "uuid": "^9.0.0" }, "devDependencies": { diff --git a/tests/figterm/src/shell.ts b/tests/figterm/src/shell.ts index 3ce82866e7..8dc353c558 100644 --- a/tests/figterm/src/shell.ts +++ b/tests/figterm/src/shell.ts @@ -68,34 +68,39 @@ class FigtermListener { const matchesSession = (context: ShellContext | undefined) => context?.sessionId === this.sessionId; - /* eslint-disable no-case-declarations */ switch (message.type?.$case) { - case 'hook': + case 'hook': { const { hook } = message.type.hook; switch (hook?.$case) { - case 'init': + case 'init': { break; - case 'prompt': + } + case 'prompt': { if (matchesSession(hook.prompt.context)) { this.onPrompt(); } break; - case 'editBuffer': + } + case 'editBuffer': { if (matchesSession(hook.editBuffer.context)) { this.buffer = hook.editBuffer.text; this.cursor = hook.editBuffer.cursor; } break; - default: + } + default: { break; + } } break; - case 'command': + } + case 'command': { break; - default: + } + default: { break; + } } - /* eslint-enable no-case-declarations */ } listen() { @@ -220,7 +225,7 @@ class Shell { ...environment, TMPDIR: '/tmp/', TERM_SESSION_ID: uuid.v4(), - FIG_SHELL_EXTRA_ARGS: Array.isArray(args) ? args.join(' ') : args ?? '', + FIG_SHELL_EXTRA_ARGS: Array.isArray(args) ? args.join(' ') : (args ?? ''), }; this.cliListener = new FigCliListener(this.initialEnv.TERM_SESSION_ID); @@ -268,8 +273,8 @@ class Shell { }); this.exitPty = (signal?: string) => { - const prom = new Promise( - (resolve) => this.pty?.onExit(() => resolve()) + const prom = new Promise((resolve) => + this.pty?.onExit(() => resolve()) ); this.pty?.kill(signal ?? 'SIGKILL'); this.pty = undefined; From 178ef358cd615a8bcb45b59ab86c35377791dc35 Mon Sep 17 00:00:00 2001 From: Grant Gurvis Date: Fri, 20 Dec 2024 12:14:32 -0800 Subject: [PATCH 2/2] bump versions --- packages/api-bindings-wrappers/package.json | 2 +- packages/api-bindings/package.json | 2 +- packages/api-bindings/src/requests.ts | 2 +- packages/autocomplete-parser/package.json | 2 +- proto/package.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/api-bindings-wrappers/package.json b/packages/api-bindings-wrappers/package.json index 8226de27cd..b3b1523049 100644 --- a/packages/api-bindings-wrappers/package.json +++ b/packages/api-bindings-wrappers/package.json @@ -1,6 +1,6 @@ { "name": "@aws/amazon-q-developer-cli-api-bindings-wrappers", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT OR Apache-2.0", "author": "Amazon Web Services", "repository": "https://github.com/aws/amazon-q-developer-cli", diff --git a/packages/api-bindings/package.json b/packages/api-bindings/package.json index 70df4f2b9a..90177b0210 100644 --- a/packages/api-bindings/package.json +++ b/packages/api-bindings/package.json @@ -1,6 +1,6 @@ { "name": "@aws/amazon-q-developer-cli-api-bindings", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT OR Apache-2.0", "author": "Amazon Web Services", "repository": "https://github.com/aws/amazon-q-developer-cli", diff --git a/packages/api-bindings/src/requests.ts b/packages/api-bindings/src/requests.ts index b385510a41..89398306ac 100644 --- a/packages/api-bindings/src/requests.ts +++ b/packages/api-bindings/src/requests.ts @@ -1,4 +1,4 @@ -/* Autogenerated by generate-requests.ts for proto v0.1.0 +/* Autogenerated by generate-requests.ts for proto v0.2.0 * Do not edit directly! Instead run 'npm run generate-requests' in typescript-api-bindings */ diff --git a/packages/autocomplete-parser/package.json b/packages/autocomplete-parser/package.json index fc4e209b4c..58898ea60f 100644 --- a/packages/autocomplete-parser/package.json +++ b/packages/autocomplete-parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws/amazon-q-developer-cli-autocomplete-parser", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT OR Apache-2.0", "author": "Amazon Web Services", "repository": "https://github.com/aws/amazon-q-developer-cli", diff --git a/proto/package.json b/proto/package.json index 03086e39d4..66f0b6b7f8 100644 --- a/proto/package.json +++ b/proto/package.json @@ -1,6 +1,6 @@ { "name": "@aws/amazon-q-developer-cli-proto", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT OR Apache-2.0", "author": "Amazon Web Services", "repository": "https://github.com/aws/amazon-q-developer-cli",