diff --git a/frontend/pages/policies/ManagePoliciesPage/components/InstallSoftwareModal/InstallSoftwareModal.tsx b/frontend/pages/policies/ManagePoliciesPage/components/InstallSoftwareModal/InstallSoftwareModal.tsx index 106dd3b64019..90c16e9e5454 100644 --- a/frontend/pages/policies/ManagePoliciesPage/components/InstallSoftwareModal/InstallSoftwareModal.tsx +++ b/frontend/pages/policies/ManagePoliciesPage/components/InstallSoftwareModal/InstallSoftwareModal.tsx @@ -284,8 +284,11 @@ const InstallSoftwareModal = ({ )} - Selected software, if compatible with the host, will be installed - when hosts fail the chosen policy.{" "} + If compatible with the host, the selected software will be installed + when hosts fail the policy. App Store apps will not be installed if + hosts are not enrolled in MDM, or if no VPP licenses are available + for the app. If custom targets are enabled and a host with a failing + policy is not targeted, installation will be skipped.{" "} - Selected script, if{" "} + If{" "} compatible {" "} - with the host, will run when hosts fail the policy. Host counts will - reset when a new script is selected.{" "} + with the host, the selected script will run when hosts fail the + policy. The script will not run on hosts with scripts disabled, or + on hosts with too many pending scripts. Host counts will reset when + new scripts are selected.{" "} Ask questions about your servers, containers, and laptops running Linux, Windows, and macOS -As we use sentence case, only the first word is capitalized. But, if a word would normally be capitalized in the sentence (e.g., a proper noun, an acronym, or a stylization) it should remain capitalized. User roles (e.g., "observer" or "maintainer") and features (e.g. "automations") in the Fleet product aren't treated as proper nouns and shouldn't be capitalized. Words/phrases that follow steps numbers (e.g. "Step 1: create") in the documentation shouldn't be capitalized. +As we use sentence case, only the first word is capitalized. But, if a word would normally be capitalized in the sentence (e.g., a proper noun, an acronym, or a stylization) it should remain capitalized. User roles (e.g., "observer" or "maintainer") and features (e.g. "automations") in the Fleet product aren't treated as proper nouns and shouldn't be capitalized. However, words/phrases that follow step numbers in the documentation _should_ be capitalized (e.g. "Step 1: Create"), since the step number is merely acting as a label for the phrase that follows. The reason for sentence case at Fleet is that everyone capitalizes differently in English, and capitalization conventions have not been taught very consistently in schools. Sentence case simplifies capitalization rules so that contributors can deliver more natural, even-looking content with a voice that feels similar no matter where you're reading it. diff --git a/it-and-security/lib/ios/configuration-profiles/lock-screen-message.mobileconfig b/it-and-security/lib/ios/configuration-profiles/lock-screen-message.mobileconfig index c67876021828..93203f9b3517 100644 --- a/it-and-security/lib/ios/configuration-profiles/lock-screen-message.mobileconfig +++ b/it-and-security/lib/ios/configuration-profiles/lock-screen-message.mobileconfig @@ -6,9 +6,9 @@ AssetTagInformation - This device is owned by Fleet + IfLostReturnToMessage - Fleet Device Management Inc. + This device is property of Fleet Device Management Inc. PayloadDescription Configures ownership information for a shared device PayloadDisplayName diff --git a/website/api/controllers/deliver-contact-form-message.js b/website/api/controllers/deliver-contact-form-message.js index 3a5116528fe4..bd5b602f1795 100644 --- a/website/api/controllers/deliver-contact-form-message.js +++ b/website/api/controllers/deliver-contact-form-message.js @@ -58,7 +58,7 @@ module.exports = { } await sails.helpers.http.post(sails.config.custom.slackWebhookUrlForContactForm, { - text: `New contact form message: (cc: <@U05CS07KASK>) (Remember: we have to email back; can't just reply to this thread.)`+ + text: `New contact form message: (cc: <@U0801Q57JDU>, <@U05CS07KASK>) (Remember: we have to email back; can't just reply to this thread.)`+ `Name: ${firstName + ' ' + lastName}, Email: ${emailAddress}, Message: ${message ? message : 'No message.'}` }); diff --git a/website/api/controllers/query-generator/get-llm-generated-sql.js b/website/api/controllers/query-generator/get-llm-generated-sql.js index addb3f448eb1..4ec98c6801b8 100644 --- a/website/api/controllers/query-generator/get-llm-generated-sql.js +++ b/website/api/controllers/query-generator/get-llm-generated-sql.js @@ -25,7 +25,12 @@ module.exports = { fn: async function ({naturalLanguageQuestion}) { - + // Generate a random room name. + let roomId = await sails.helpers.strings.random(); + if(this.req.isSocket) { + // Add the requesting socket to the room. + sails.sockets.join(this.req, roomId); + } let completeTables = sails.config.builtStaticContent.schemaTables; let prunedTables = completeTables.map((table)=>{ let newTable = _.pick(table,['name','description','platforms', 'examples']); @@ -55,7 +60,12 @@ module.exports = { Please respond in JSON, with the same data shape as the provided context, but with the array filtered to include only relevant tables.`; let filteredTables = await sails.helpers.ai.prompt(schemaFiltrationPrompt, 'gpt-4o', true) .intercept((err)=>{ - return new Error(`When trying to get a subset of tables to use to generate a query for an Admin user, the Open AI API returned an error. Full error: ${require('util').inspect(err, {depth: 2})}`); + if(this.req.isSocket){ + // If this request was from a socket and an error occurs, broadcast an 'error' event and unsubscribe the socket from this room. + sails.sockets.broadcast(roomId, 'error', {error: err}); + sails.sockets.leave(this.req, roomId); + } + return new Error(`When trying to get a subset of tables to use to generate a query for an Admin user, an error occurred. Full error: ${require('util').inspect(err, {depth: 2})}`); }); @@ -95,9 +105,22 @@ module.exports = { }`; let sqlReport = await sails.helpers.ai.prompt(sqlPrompt, 'o1-preview', true) .intercept((err)=>{ - return new Error(`When trying to generate a query for an Admin user, the Open AI API returned an error. Full error: ${require('util').inspect(err, {depth: 2})}`); + if(this.req.isSocket){ + // If this request was from a socket and an error occurs, broadcast an 'error' event and unsubscribe the socket from this room. + sails.sockets.broadcast(roomId, 'error', {error: err}); + sails.sockets.leave(this.req, roomId); + } + return new Error(`When trying to generate a query for an Admin user, an error occurred. Full error: ${require('util').inspect(err, {depth: 2})}`); }); - return sqlReport; + + // If this request was from a socket, we'll broadcast a 'queryGenerated' event with the sqlReport and unsubscribe the socket + if(this.req.isSocket){ + sails.sockets.broadcast(roomId, 'queryGenerated', {result: sqlReport}); + sails.sockets.leave(this.req, roomId); + } else { + // Otherwise, return the JSON sqlReport. + return sqlReport; + } } diff --git a/website/assets/js/pages/admin/query-generator.page.js b/website/assets/js/pages/admin/query-generator.page.js index 319e923ab80e..95fc75384b96 100644 --- a/website/assets/js/pages/admin/query-generator.page.js +++ b/website/assets/js/pages/admin/query-generator.page.js @@ -36,17 +36,22 @@ parasails.registerPage('query-generator', { // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ methods: { handleSubmittingForm: async function() { - let argins = this.formData.naturalLanguageQuestion; - this.queryResult = await Cloud.getLlmGeneratedSql(argins) - .tolerate((err)=>{ - this.cloudError = err; - this.syncing = false; - }); + this.syncing = true; + io.socket.get('/api/v1/query-generator/get-llm-generated-sql', {naturalLanguageQuestion: this.formData.naturalLanguageQuestion}, ()=>{}); + io.socket.on('queryGenerated', this._onQueryResultsReturned); + io.socket.on('error', this._onQueryGenerationError); }, - submittedQueryForm: function() { - if(!this.cloudError){ - this.showGeneratedQuery = true; - } + _onQueryResultsReturned: function(response) { + this.queryResult = response.result; + this.syncing = false; + this.showGeneratedQuery = true; + // Disable the socket event listener after we display the results. + io.socket.off('queryGenerated', this._onQueryResultsReturned); + }, + _onQueryGenerationError: function(response) { + this.cloudError = response.error; + this.syncing = false; + io.socket.off('error', this._onQueryGenerationError); }, clickResetQueryGenerator: function() { this.showGeneratedQuery = false; diff --git a/website/config/routes.js b/website/config/routes.js index 715711ad3d04..77ad2517db88 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -914,5 +914,5 @@ module.exports.routes = { 'POST /api/v1/deliver-deal-registration-submission': { action: 'deliver-deal-registration-submission' }, '/api/v1/unsubscribe-from-marketing-emails': { action: 'unsubscribe-from-marketing-emails' }, 'POST /api/v1/customers/get-stripe-checkout-session-url': { action: 'customers/get-stripe-checkout-session-url' }, - 'POST /api/v1/query-generator/get-llm-generated-sql': { action: 'query-generator/get-llm-generated-sql' }, + '/api/v1/query-generator/get-llm-generated-sql': { action: 'query-generator/get-llm-generated-sql' }, }; diff --git a/website/views/pages/admin/query-generator.ejs b/website/views/pages/admin/query-generator.ejs index 9cab588f4db2..d8e1b53bc4dd 100644 --- a/website/views/pages/admin/query-generator.ejs +++ b/website/views/pages/admin/query-generator.ejs @@ -2,10 +2,10 @@
- +

Query generator

- +
Ask your question.
diff --git a/website/views/pages/app-library.ejs b/website/views/pages/app-library.ejs index 1c5501457883..e1ee79fa0708 100644 --- a/website/views/pages/app-library.ejs +++ b/website/views/pages/app-library.ejs @@ -57,7 +57,7 @@ Custom packages
-

Custom Packages

+

Custom packages

Upload any third-party software as a custom package to deploy all of the tools your end users need to work.