diff --git a/types/ncalayer-js-client/.npmignore b/types/ncalayer-js-client/.npmignore
new file mode 100644
index 00000000000000..93e307400a5456
--- /dev/null
+++ b/types/ncalayer-js-client/.npmignore
@@ -0,0 +1,5 @@
+*
+!**/*.d.ts
+!**/*.d.cts
+!**/*.d.mts
+!**/*.d.*.ts
diff --git a/types/ncalayer-js-client/index.d.ts b/types/ncalayer-js-client/index.d.ts
new file mode 100644
index 00000000000000..9c23cda89602ef
--- /dev/null
+++ b/types/ncalayer-js-client/index.d.ts
@@ -0,0 +1,207 @@
+///
+export {};
+
+/** Shape of errors thrown by client methods. */
+export type NCALayerErrorLike = Error & { canceledByUser?: boolean };
+
+export type Base64String = string;
+export type BinaryLike = ArrayBuffer | Blob | File;
+export type Signable = Base64String | BinaryLike;
+export type SignableMany = ReadonlyArray;
+
+export type StorageType = string;
+
+export interface BasicsCMSParams {
+ decode?: boolean;
+ encapsulate?: boolean;
+ digested?: boolean;
+ tsaProfile?: Record;
+ [key: string]: unknown;
+}
+
+export interface BasicsXMLParams {
+ [key: string]: unknown;
+}
+
+export interface BasicsSignerParams {
+ extKeyUsageOids: ReadonlyArray;
+ chain?: ReadonlyArray;
+ [key: string]: unknown;
+}
+
+export class NCALayerClient {
+ constructor(url?: string, allowKmdHttpApi?: boolean);
+
+ // Connection and environment
+ url: string;
+ wsConnection: unknown | null;
+ responseProcessed: boolean;
+ isKmd: boolean;
+ allowKmdHttpApi: boolean;
+ kmdHttpApiUrl: string;
+ isKmdHttpApiAvailable: boolean;
+
+ // KMD HTTP API operation state
+ KmdHTTPAPIOperationId: string | null;
+ KmdHTTPAPIOperationInBase64: boolean;
+ KmdHTTPAPIOperationTotal: number;
+ KmdHTTPAPIOperationProcessed: number;
+
+ // Branding
+ basicsLogo: Base64String | "";
+
+ // Testing hooks
+ onRequestReady: ((json: string) => void) | null;
+ onResponseReady: ((json: string) => void) | null;
+
+ /** Connects to NCALayer and resolves with its version string. */
+ connect(): Promise;
+
+ /** Whether multisign is available (always true for this API surface). */
+ readonly multisignAvailable: boolean;
+
+ // Storage type presets
+ static readonly basicsStorageKAZTOKEN: ReadonlyArray;
+ static readonly basicsStorageIDCard: ReadonlyArray;
+ static readonly basicsStorageEToken72k: ReadonlyArray;
+ static readonly basicsStorageEToken5110: ReadonlyArray;
+ static readonly basicsStorageJaCarta: ReadonlyArray;
+ static readonly basicsStorageAKey: ReadonlyArray;
+ static readonly basicsStoragePKCS12: ReadonlyArray;
+ static readonly basicsStorageJKS: ReadonlyArray;
+ static readonly basicsStorageAll: null;
+ static readonly basicsStorageHardware: ReadonlyArray;
+
+ // Signing params presets
+ static readonly basicsCMSParams: BasicsCMSParams;
+ static readonly basicsCMSParamsDetached: BasicsCMSParams;
+ static readonly basicsCMSParamsDetachedNoTSP: BasicsCMSParams;
+ static readonly basicsCMSParamsDetachedHash: BasicsCMSParams;
+ static readonly basicsCMSParamsAttached: BasicsCMSParams;
+ static readonly basicsXMLParams: BasicsXMLParams;
+
+ // Signer selection presets
+ static readonly basicsSignerAny: BasicsSignerParams;
+ static readonly basicsSignerSignAny: BasicsSignerParams;
+ static readonly basicsSignerSignPerson: BasicsSignerParams;
+ static readonly basicsSignerSignOrg: BasicsSignerParams;
+ static readonly basicsSignerSignHead: BasicsSignerParams;
+ static readonly basicsSignerSignTrusted: BasicsSignerParams;
+ static readonly basicsSignerSignEmployee: BasicsSignerParams;
+ static readonly basicsSignerAuthAny: BasicsSignerParams;
+ static readonly basicsSignerAuthPerson: BasicsSignerParams;
+ static readonly basicsSignerAuthOrg: BasicsSignerParams;
+ static readonly basicsSignerAuthHead: BasicsSignerParams;
+ static readonly basicsSignerAuthRight: BasicsSignerParams;
+ static readonly basicsSignerAuthEmployee: BasicsSignerParams;
+ static readonly basicsSignerTestAny: BasicsSignerParams;
+
+ /** Sets logo used by NCALayer Basics module UI from various sources. */
+ setLogoForBasicsSign(logo: Signable): Promise;
+
+ /** Generic Basics sign method. Overloads ensure data matches format. */
+ basicsSign(
+ allowedStorages: ReadonlyArray | null,
+ format: "cms",
+ data: Signable | SignableMany,
+ signingParams: BasicsCMSParams,
+ signerParams: BasicsSignerParams,
+ locale: string,
+ forceSingleSignature?: boolean,
+ ): Promise>;
+ basicsSign(
+ allowedStorages: ReadonlyArray | null,
+ format: "xml",
+ data: string | ReadonlyArray,
+ signingParams: BasicsXMLParams,
+ signerParams: BasicsSignerParams,
+ locale: string,
+ forceSingleSignature?: boolean,
+ ): Promise>;
+
+ /** Helper for CMS signing, supports single or multiple documents. */
+ basicsSignCMS(
+ allowedStorages: ReadonlyArray | null,
+ data: Signable | SignableMany,
+ signingParams: BasicsCMSParams,
+ signerParams: BasicsSignerParams,
+ locale?: string,
+ ): Promise>;
+
+ /** Helper for XML signing, supports single or multiple XML strings. */
+ basicsSignXML(
+ allowedStorages: ReadonlyArray | null,
+ data: string | ReadonlyArray,
+ signingParams: BasicsXMLParams,
+ signerParams: BasicsSignerParams,
+ locale?: string,
+ ): Promise>;
+
+ /** Checks KMD HTTP API multisign availability. */
+ kmdMultisignAvailable(): Promise;
+
+ /** Starts KMD HTTP API multisign operation. */
+ startKmdMultisign(numberOfDocuments: number, base64: boolean, encapsulateContent: boolean): Promise;
+
+ /** Signs next document in KMD multisign flow and returns base64 signature. */
+ kmdMultisignNext(data: Signable): Promise;
+
+ /** Returns active token storage types. */
+ getActiveTokens(): Promise>;
+
+ /** Returns info about one key pair (record) from given storage. */
+ getKeyInfo(storageType: StorageType): Promise>;
+
+ /** Creates CMS (CAdES) from data. */
+ createCAdESFromBase64(
+ storageType: StorageType,
+ data: Signable | SignableMany,
+ keyType?: "SIGNATURE" | "AUTHENTICATION" | string,
+ attach?: boolean,
+ ): Promise;
+
+ /** Creates CMS (CAdES) from data hash. */
+ createCAdESFromBase64Hash(
+ storageType: StorageType,
+ hash: Signable | SignableMany,
+ keyType?: "SIGNATURE" | "AUTHENTICATION" | string,
+ ): Promise;
+
+ /** Creates deprecated CMS with integrated TSP. */
+ createCMSSignatureFromBase64(
+ storageType: StorageType,
+ data: Signable | SignableMany,
+ keyType?: "SIGNATURE" | "AUTHENTICATION" | string,
+ attach?: boolean,
+ ): Promise;
+
+ /** Signs XML and returns signed XML document. */
+ signXml(
+ storageType: StorageType,
+ xml: string,
+ keyType?: "SIGNATURE" | "AUTHENTICATION" | string,
+ tbsElementXPath?: string,
+ signatureParentElementXPath?: string,
+ ): Promise;
+
+ /** Signs multiple XML documents and returns array of signed XML. */
+ signXmls(
+ storageType: StorageType,
+ xmls: ReadonlyArray,
+ keyType?: "SIGNATURE" | "AUTHENTICATION" | string,
+ tbsElementXPath?: string,
+ signatureParentElementXPath?: string,
+ ): Promise>;
+
+ /** Changes NCALayer UI locale. */
+ changeLocale(localeId: string): Promise;
+
+ /** Name of file storage type ('PKCS12'). */
+ static readonly fileStorageType: string;
+
+ /** Utilities exposed by original class. */
+ static arrayBufferToB64(arrayBuffer: ArrayBuffer): string;
+ static normalizeDataToSign(data: Signable | SignableMany): Promise>;
+}
+
+export {};
diff --git a/types/ncalayer-js-client/ncalayer-js-client-tests.ts b/types/ncalayer-js-client/ncalayer-js-client-tests.ts
new file mode 100644
index 00000000000000..dc216890f295f0
--- /dev/null
+++ b/types/ncalayer-js-client/ncalayer-js-client-tests.ts
@@ -0,0 +1,111 @@
+import { NCALayerClient } from "ncalayer-js-client";
+
+const client = new NCALayerClient();
+
+// Connection and basic props
+// $ExpectType Promise
+client.connect();
+
+// $ExpectType boolean
+client.multisignAvailable;
+
+// $ExpectType string
+client.url;
+
+// Static presets and utilities
+// $ExpectType ReadonlyArray
+NCALayerClient.basicsStorageKAZTOKEN;
+// $ExpectType null
+NCALayerClient.basicsStorageAll;
+// Presets are available as static fields
+NCALayerClient.basicsCMSParams;
+NCALayerClient.basicsXMLParams;
+NCALayerClient.basicsSignerAny;
+// $ExpectType string
+NCALayerClient.fileStorageType;
+
+// $ExpectType string
+NCALayerClient.arrayBufferToB64(new ArrayBuffer(8));
+// $ExpectType Promise>
+NCALayerClient.normalizeDataToSign("aGVsbG8=");
+
+// Basics sign helpers
+// $ExpectType Promise>
+client.basicsSign(
+ null,
+ "cms",
+ "aGVsbG8=",
+ NCALayerClient.basicsCMSParams,
+ NCALayerClient.basicsSignerAny,
+ "ru",
+);
+
+// $ExpectType Promise>
+client.basicsSignCMS(
+ null,
+ "aGVsbG8=",
+ NCALayerClient.basicsCMSParams,
+ NCALayerClient.basicsSignerAny,
+);
+
+// $ExpectType Promise>
+client.basicsSignXML(
+ null,
+ "",
+ NCALayerClient.basicsXMLParams,
+ NCALayerClient.basicsSignerAny,
+);
+
+// Invalid basics format
+client.basicsSign(
+ null,
+ // @ts-expect-error
+ "pdf",
+ "a",
+ NCALayerClient.basicsCMSParams,
+ NCALayerClient.basicsSignerAny,
+ "ru",
+);
+
+// Logo setting accepts various inputs
+// $ExpectType Promise
+client.setLogoForBasicsSign("aGVsbG8=");
+client.setLogoForBasicsSign(
+ // @ts-expect-error
+ 123,
+);
+
+// KMD HTTP API helpers
+// $ExpectType Promise
+client.kmdMultisignAvailable();
+// $ExpectType Promise
+client.startKmdMultisign(2, true, true);
+// $ExpectType Promise
+client.kmdMultisignNext("aGVsbG8=");
+
+// Token and key info
+// $ExpectType Promise>
+client.getActiveTokens();
+// $ExpectType Promise>
+client.getKeyInfo("PKCS12");
+
+// CMS creation APIs
+// $ExpectType Promise
+client.createCAdESFromBase64("PKCS12", "aGVsbG8=");
+// $ExpectType Promise
+client.createCAdESFromBase64Hash("PKCS12", "aGVsbG8=");
+client.createCAdESFromBase64(
+ "PKCS12",
+ // @ts-expect-error
+ 42,
+);
+
+// XML signing APIs
+// $ExpectType Promise
+client.signXml("PKCS12", "");
+// $ExpectType Promise>
+client.signXmls("PKCS12", ["", ""]);
+
+// Locale
+// $ExpectType Promise
+client.changeLocale("kk");
diff --git a/types/ncalayer-js-client/package.json b/types/ncalayer-js-client/package.json
new file mode 100644
index 00000000000000..9bf70f4ba5bef2
--- /dev/null
+++ b/types/ncalayer-js-client/package.json
@@ -0,0 +1,17 @@
+{
+ "private": true,
+ "name": "@types/ncalayer-js-client",
+ "version": "1.5.9999",
+ "projects": [
+ "https://github.com/sigex-kz/ncalayer-js-client#readme"
+ ],
+ "devDependencies": {
+ "@types/ncalayer-js-client": "workspace:."
+ },
+ "owners": [
+ {
+ "name": "Kenny Romanov",
+ "githubUsername": "kennyromanov"
+ }
+ ]
+}
diff --git a/types/ncalayer-js-client/tsconfig.json b/types/ncalayer-js-client/tsconfig.json
new file mode 100644
index 00000000000000..3d62d8e0a9d43a
--- /dev/null
+++ b/types/ncalayer-js-client/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "module": "node16",
+ "lib": [
+ "es6"
+ ],
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "strictFunctionTypes": true,
+ "strictNullChecks": true,
+ "types": [],
+ "noEmit": true,
+ "forceConsistentCasingInFileNames": true
+ },
+ "files": [
+ "index.d.ts",
+ "ncalayer-js-client-tests.ts"
+ ]
+}
diff --git a/types/vscode/index.d.ts b/types/vscode/index.d.ts
index 25fef02385cf2d..3c17c514bcfe87 100644
--- a/types/vscode/index.d.ts
+++ b/types/vscode/index.d.ts
@@ -5,7 +5,7 @@
*--------------------------------------------------------------------------------------------*/
/**
- * Type Definition for Visual Studio Code 1.103 Extension API
+ * Type Definition for Visual Studio Code 1.104 Extension API
* See https://code.visualstudio.com/api for more information
*/
@@ -12470,6 +12470,20 @@ declare module 'vscode' {
* This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled.
*/
isTransient?: boolean;
+
+ /**
+ * The nonce to use to verify shell integration sequences are coming from a trusted source.
+ * An example impact of UX of this is if the command line is reported with a nonce, it will
+ * not need to verify with the user that the command line is correct before rerunning it
+ * via the [shell integration command decoration](https://code.visualstudio.com/docs/terminal/shell-integration#_command-decorations-and-the-overview-ruler).
+ *
+ * This should be used if the terminal includes [custom shell integration support](https://code.visualstudio.com/docs/terminal/shell-integration#_supported-escape-sequences).
+ * It should be set to a random GUID which will then set the `VSCODE_NONCE` environment
+ * variable. Inside the shell, this should then be removed from the environment so as to
+ * protect it from general access. Once that is done it can be passed through in the
+ * relevant sequences to make them trusted.
+ */
+ shellIntegrationNonce?: string;
}
/**
@@ -12509,6 +12523,18 @@ declare module 'vscode' {
* This will only take effect when `terminal.integrated.enablePersistentSessions` is enabled.
*/
isTransient?: boolean;
+
+ /**
+ * The nonce to use to verify shell integration sequences are coming from a trusted source.
+ * An example impact of UX of this is if the command line is reported with a nonce, it will
+ * not need to verify with the user that the command line is correct before rerunning it
+ * via the [shell integration command decoration](https://code.visualstudio.com/docs/terminal/shell-integration#_command-decorations-and-the-overview-ruler).
+ *
+ * This should be used if the terminal includes [custom shell integration support](https://code.visualstudio.com/docs/terminal/shell-integration#_supported-escape-sequences).
+ * It should be set to a random GUID. Inside the {@link Pseudoterminal} implementation, this value
+ * can be passed through in the relevant sequences to make them trusted.
+ */
+ shellIntegrationNonce?: string;
}
/**
@@ -13863,6 +13889,9 @@ declare module 'vscode' {
* In the same way, symbolic links are preserved, i.e. the file event will report the path of the
* symbolic link as it was provided for watching and not the target.
*
+ * *Note* that file events from deleting a folder may not include events for contained files. If possible
+ * events will be aggregated to reduce the overal number of emitted events.
+ *
* ### Examples
*
* The basic anatomy of a file watcher is as follows:
@@ -19972,7 +20001,7 @@ declare module 'vscode' {
* A string or heterogeneous array of things that a message can contain as content. Some parts may be message-type
* specific for some models.
*/
- content: Array;
+ content: Array;
/**
* The optional name of a user for this message.
@@ -19986,7 +20015,7 @@ declare module 'vscode' {
* @param content The content of the message.
* @param name The optional name of a user for the message.
*/
- constructor(role: LanguageModelChatMessageRole, content: string | Array, name?: string);
+ constructor(role: LanguageModelChatMessageRole, content: string | Array, name?: string);
}
/**
@@ -20352,6 +20381,184 @@ declare module 'vscode' {
resolveMcpServerDefinition?(server: T, token: CancellationToken): ProviderResult;
}
+ /**
+ * The provider version of {@linkcode LanguageModelChatRequestOptions}
+ */
+ export interface ProvideLanguageModelChatResponseOptions {
+ /**
+ * A set of options that control the behavior of the language model. These options are specific to the language model.
+ */
+ readonly modelOptions?: { readonly [name: string]: any };
+
+ /**
+ * An optional list of tools that are available to the language model. These could be registered tools available via
+ * {@link lm.tools}, or private tools that are just implemented within the calling extension.
+ *
+ * If the LLM requests to call one of these tools, it will return a {@link LanguageModelToolCallPart} in
+ * {@link LanguageModelChatResponse.stream}. It's the caller's responsibility to invoke the tool. If it's a tool
+ * registered in {@link lm.tools}, that means calling {@link lm.invokeTool}.
+ *
+ * Then, the tool result can be provided to the LLM by creating an Assistant-type {@link LanguageModelChatMessage} with a
+ * {@link LanguageModelToolCallPart}, followed by a User-type message with a {@link LanguageModelToolResultPart}.
+ */
+ readonly tools?: readonly LanguageModelChatTool[];
+
+ /**
+ * The tool-selecting mode to use. The provider must implement respecting this.
+ */
+ readonly toolMode: LanguageModelChatToolMode;
+ }
+
+ /**
+ * Represents a language model provided by a {@linkcode LanguageModelChatProvider}.
+ */
+ export interface LanguageModelChatInformation {
+
+ /**
+ * Unique identifier for the language model. Must be unique per provider, but not required to be globally unique.
+ */
+ readonly id: string;
+
+ /**
+ * Human-readable name of the language model.
+ */
+ readonly name: string;
+
+ /**
+ * Opaque family-name of the language model. Values might be `gpt-3.5-turbo`, `gpt4`, `phi2`, or `llama`
+ */
+ readonly family: string;
+
+ /**
+ * The tooltip to render when hovering the model. Used to provide more information about the model.
+ */
+ readonly tooltip?: string;
+
+ /**
+ * An optional, human-readable string which will be rendered alongside the model.
+ * Useful for distinguishing models of the same name in the UI.
+ */
+ readonly detail?: string;
+
+ /**
+ * Opaque version string of the model.
+ * This is used as a lookup value in {@linkcode LanguageModelChatSelector.version}
+ * An example is how GPT 4o has multiple versions like 2024-11-20 and 2024-08-06
+ */
+ readonly version: string;
+
+ /**
+ * The maximum number of tokens the model can accept as input.
+ */
+ readonly maxInputTokens: number;
+
+ /**
+ * The maximum number of tokens the model is capable of producing.
+ */
+ readonly maxOutputTokens: number;
+
+ /**
+ * Various features that the model supports such as tool calling or image input.
+ */
+ readonly capabilities: {
+
+ /**
+ * Whether image input is supported by the model.
+ * Common supported images are jpg and png, but each model will vary in supported mimetypes.
+ */
+ readonly imageInput?: boolean;
+
+ /**
+ * Whether tool calling is supported by the model.
+ * If a number is provided, that is the maximum number of tools that can be provided in a request to the model.
+ */
+ readonly toolCalling?: boolean | number;
+ };
+ }
+
+ /**
+ * The provider version of {@linkcode LanguageModelChatMessage}.
+ */
+ export interface LanguageModelChatRequestMessage {
+ /**
+ * The role of this message.
+ */
+ readonly role: LanguageModelChatMessageRole;
+
+ /**
+ * A heterogeneous array of things that a message can contain as content. Some parts may be message-type
+ * specific for some models.
+ */
+ readonly content: ReadonlyArray;
+
+ /**
+ * The optional name of a user for this message.
+ */
+ readonly name: string | undefined;
+ }
+
+ /**
+ * The various message types which a {@linkcode LanguageModelChatProvider} can emit in the chat response stream
+ */
+ export type LanguageModelResponsePart = LanguageModelTextPart | LanguageModelToolResultPart | LanguageModelToolCallPart;
+
+ /**
+ * The various message types which can be sent via {@linkcode LanguageModelChat.sendRequest } and processed by a {@linkcode LanguageModelChatProvider}
+ */
+ export type LanguageModelInputPart = LanguageModelTextPart | LanguageModelToolResultPart | LanguageModelToolCallPart;
+
+ /**
+ * A LanguageModelChatProvider implements access to language models, which users can then use through the chat view, or through extension API by acquiring a LanguageModelChat.
+ * An example of this would be an OpenAI provider that provides models like gpt-5, o3, etc.
+ */
+ export interface LanguageModelChatProvider {
+
+ /**
+ * An optional event fired when the available set of language models changes.
+ */
+ readonly onDidChangeLanguageModelChatInformation?: Event;
+
+ /**
+ * Get the list of available language models provided by this provider
+ * @param options Options which specify the calling context of this function
+ * @param token A cancellation token
+ * @returns The list of available language models
+ */
+ provideLanguageModelChatInformation(options: PrepareLanguageModelChatModelOptions, token: CancellationToken): ProviderResult;
+
+ /**
+ * Returns the response for a chat request, passing the results to the progress callback.
+ * The {@linkcode LanguageModelChatProvider} must emit the response parts to the progress callback as they are received from the language model.
+ * @param model The language model to use
+ * @param messages The messages to include in the request
+ * @param options Options for the request
+ * @param progress The progress to emit the streamed response chunks to
+ * @param token A cancellation token
+ * @returns A promise that resolves when the response is complete. Results are actually passed to the progress callback.
+ */
+ provideLanguageModelChatResponse(model: T, messages: readonly LanguageModelChatRequestMessage[], options: ProvideLanguageModelChatResponseOptions, progress: Progress, token: CancellationToken): Thenable;
+
+ /**
+ * Returns the number of tokens for a given text using the model-specific tokenizer logic
+ * @param model The language model to use
+ * @param text The text to count tokens for
+ * @param token A cancellation token
+ * @returns The number of tokens
+ */
+ provideTokenCount(model: T, text: string | LanguageModelChatRequestMessage, token: CancellationToken): Thenable;
+ }
+
+ /**
+ * The list of options passed into {@linkcode LanguageModelChatProvider.provideLanguageModelChatInformation}
+ */
+ export interface PrepareLanguageModelChatModelOptions {
+ /**
+ * Whether or not the user should be prompted via some UI flow, or if models should be attempted to be resolved silently.
+ * If silent is true, all models may not be resolved due to lack of info such as API keys.
+ */
+ readonly silent: boolean;
+ }
+
/**
* Namespace for language model related functionality.
*/
@@ -20458,6 +20665,15 @@ declare module 'vscode' {
* @returns A disposable that unregisters the provider when disposed.
*/
export function registerMcpServerDefinitionProvider(id: string, provider: McpServerDefinitionProvider): Disposable;
+
+ /**
+ * Registers a {@linkcode LanguageModelChatProvider}
+ * Note: You must also define the language model chat provider via the `languageModelChatProviders` contribution point in package.json
+ * @param vendor The vendor for this provider. Must be globally unique. An example is `copilot` or `openai`.
+ * @param provider The provider to register
+ * @returns A disposable that unregisters the provider when disposed
+ */
+ export function registerLanguageModelChatProvider(vendor: string, provider: LanguageModelChatProvider): Disposable;
}
/**
diff --git a/types/vscode/package.json b/types/vscode/package.json
index 241a7e0405ecdc..2d5644c4f0c5e1 100644
--- a/types/vscode/package.json
+++ b/types/vscode/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"name": "@types/vscode",
- "version": "1.103.9999",
+ "version": "1.104.9999",
"projects": [
"https://github.com/microsoft/vscode"
],