UNPKG

oscript-vscode-plugin

Version:

Oscript support for writing Autonomous Agents in VS Code

156 lines (133 loc) 4.61 kB
const path = require('path') const { LanguageClient, TransportKind } = require('vscode-languageclient') const vscode = require('vscode') const oscript = require('./languages') const config = require('../config/default.json') const testing = require('./testing') // eslint-disable-next-line no-unused-vars const toRegex = require('to-regex') let client, statusBarItem const validations = {} function activate (context) { vscode.languages.registerCompletionItemProvider('oscript', { triggerCharacters: oscript.triggerCharacters, provideCompletionItems: (model, position) => { return oscript.suggestions(model, position) } }) vscode.languages.registerHoverProvider('oscript', { provideHover: (model, position) => { return oscript.hovers(model, position) } }) vscode.languages.registerCodeLensProvider('javascript', { provideCodeLenses: (document) => { return testing.provideCodeLens() } }) statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left) statusBarItem.command = 'oscript.deployAa' statusBarItem.tooltip = 'Click to deploy Autonomous Agent' let serverModule = context.asAbsolutePath( path.join('server', 'server.js') // path.join('server', 'out', 'server.js') ) let debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] } let serverOptions = { run: { module: serverModule, transport: TransportKind.ipc }, debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } } let clientOptions = { documentSelector: [{ scheme: 'file', language: 'oscript' }], synchronize: { fileEvents: vscode.workspace.createFileSystemWatcher('**/.clientrc') } } client = new LanguageClient( 'oscriptLanguageServer', 'Oscript Language Server', serverOptions, clientOptions ) client.start() client.onReady().then(() => { client.onRequest('aa-validation-success', aaValidationSuccess) client.onRequest('aa-validation-error', aaValidationError) client.onRequest('aa-validation-inprogress', aaValidationInProgress) const deployCommand = vscode.commands.registerCommand('oscript.deployAa', async () => { if (vscode.window.activeTextEditor) { const uri = vscode.window.activeTextEditor.document.uri.toString() const aaAddress = await client.sendRequest('get-aa-address', { uri }) const network = await vscode.window.showInformationMessage(`Choose a network for deployment of AA with address ${aaAddress}`, 'testnet', 'mainnet' /* 'local' */) if (network) { client.sendRequest('deploy-aa', { uri, config: config.deployment[network] }) } } }) context.subscriptions.push(deployCommand) const checkDuplicateCommand = vscode.commands.registerCommand('oscript.checkDuplicateAa', async () => { const network = await vscode.window.showInformationMessage('Choose a network for duplication check', 'testnet', 'mainnet' /* 'local' */) if (network) { if (vscode.window.activeTextEditor) { const uri = vscode.window.activeTextEditor.document.uri.toString() client.sendRequest('check-duplicate', { uri, config: config.deployment[network] }) } } }) context.subscriptions.push(checkDuplicateCommand) const testCurrentFileCommand = vscode.commands.registerCommand('oscript.test.currentFile', testing.testCurrentFile) context.subscriptions.push(testCurrentFileCommand) const testExampleFilesCommand = vscode.commands.registerCommand('oscript.test.example', testing.provideTestExample) context.subscriptions.push(testExampleFilesCommand) }) vscode.window.onDidChangeActiveTextEditor((editor) => { if (editor) { const uri = editor.document.uri.toString() if (validations[uri]) { statusBarItem.text = validations[uri] statusBarItem.show() } else { statusBarItem.hide() } } }) } function aaValidationSuccess ({ complexity, countOps, aaAddress }) { const text = `$(info) AA validated, complexity = ${complexity}, ops = ${countOps}, address = ${aaAddress}` updateValidations(text) statusBarItem.text = text statusBarItem.show() } // eslint-disable-next-line handle-callback-err function aaValidationError ({ error }) { updateValidations() statusBarItem.hide() } function aaValidationInProgress () { updateValidations() statusBarItem.hide() } function updateValidations (value) { if (vscode.window.activeTextEditor) { const uri = vscode.window.activeTextEditor.document.uri.toString() validations[uri] = value } } function deactivate () { if (!client) { return undefined } return client.stop() } exports.activate = activate module.exports = { activate, deactivate }