Compare commits
	
		
			23 Commits
		
	
	
		
			v0.101.17-
			...
			v0.101.20
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7fcbe6fbd8 | ||
| 
						 | 
					0113fbc761 | ||
| 
						 | 
					95df8c1889 | ||
| 
						 | 
					819a364207 | ||
| 
						 | 
					ed2b07fb0b | ||
| 
						 | 
					64ed5e8740 | ||
| 
						 | 
					a2f472ef9c | ||
| 
						 | 
					cdeaa3d9c4 | ||
| 
						 | 
					8403ac0e93 | ||
| 
						 | 
					b7a91563b0 | ||
| 
						 | 
					ab19afca16 | ||
| 
						 | 
					f24c6a7a80 | ||
| 
						 | 
					99490bf859 | ||
| 
						 | 
					72cdeeaa6a | ||
| 
						 | 
					1eca4d605b | ||
| 
						 | 
					52ee98f6f8 | ||
| 
						 | 
					d270b877c9 | ||
| 
						 | 
					fd8b2a1d98 | ||
| 
						 | 
					f518043d8d | ||
| 
						 | 
					cc2335558d | ||
| 
						 | 
					a8a171ba2c | ||
| 
						 | 
					24a63f477e | ||
| 
						 | 
					ddeb6293a1 | 
							
								
								
									
										1274
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1274
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										24
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								package.json
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "web",
 | 
					  "name": "web",
 | 
				
			||||||
  "version": "0.101.17-dev",
 | 
					  "version": "0.101.20",
 | 
				
			||||||
  "private": true,
 | 
					  "private": true,
 | 
				
			||||||
  "productName": "Tactical RMM",
 | 
					  "productName": "Tactical RMM",
 | 
				
			||||||
  "scripts": {
 | 
					  "scripts": {
 | 
				
			||||||
@@ -10,12 +10,12 @@
 | 
				
			|||||||
    "format": "prettier --write \"**/*.{js,ts,vue,,html,md,json}\" --ignore-path .gitignore"
 | 
					    "format": "prettier --write \"**/*.{js,ts,vue,,html,md,json}\" --ignore-path .gitignore"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@quasar/extras": "1.16.2",
 | 
					    "@quasar/extras": "1.16.3",
 | 
				
			||||||
    "apexcharts": "3.37.3",
 | 
					    "apexcharts": "3.40.0",
 | 
				
			||||||
    "axios": "1.3.5",
 | 
					    "axios": "1.4.0",
 | 
				
			||||||
    "dotenv": "16.0.3",
 | 
					    "dotenv": "16.0.3",
 | 
				
			||||||
    "qrcode.vue": "3.3.4",
 | 
					    "qrcode.vue": "3.3.4",
 | 
				
			||||||
    "quasar": "2.11.10",
 | 
					    "quasar": "2.12.0",
 | 
				
			||||||
    "vue": "3.2.47",
 | 
					    "vue": "3.2.47",
 | 
				
			||||||
    "vue3-ace-editor": "2.2.2",
 | 
					    "vue3-ace-editor": "2.2.2",
 | 
				
			||||||
    "vue3-apexcharts": "1.4.1",
 | 
					    "vue3-apexcharts": "1.4.1",
 | 
				
			||||||
@@ -24,17 +24,17 @@
 | 
				
			|||||||
    "vuex": "4.1.0"
 | 
					    "vuex": "4.1.0"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@quasar/cli": "^2.0.0",
 | 
					    "@quasar/cli": "^2.1.0",
 | 
				
			||||||
    "@intlify/unplugin-vue-i18n": "^0.10.0",
 | 
					    "@intlify/unplugin-vue-i18n": "^0.10.0",
 | 
				
			||||||
    "@quasar/app-vite": "^1.2.1",
 | 
					    "@quasar/app-vite": "^1.3.0",
 | 
				
			||||||
    "@types/node": "^18.15.11",
 | 
					    "@types/node": "^18.16.5",
 | 
				
			||||||
    "@typescript-eslint/eslint-plugin": "^5.57.1",
 | 
					    "@typescript-eslint/eslint-plugin": "^5.59.2",
 | 
				
			||||||
    "@typescript-eslint/parser": "^5.57.1",
 | 
					    "@typescript-eslint/parser": "^5.59.2",
 | 
				
			||||||
    "autoprefixer": "10.4.14",
 | 
					    "autoprefixer": "10.4.14",
 | 
				
			||||||
    "eslint": "8.37.0",
 | 
					    "eslint": "8.40.0",
 | 
				
			||||||
    "eslint-config-prettier": "8.8.0",
 | 
					    "eslint-config-prettier": "8.8.0",
 | 
				
			||||||
    "eslint-plugin-vue": "8.7.1",
 | 
					    "eslint-plugin-vue": "8.7.1",
 | 
				
			||||||
    "prettier": "2.8.7",
 | 
					    "prettier": "2.8.8",
 | 
				
			||||||
    "typescript": "5.0.4"
 | 
					    "typescript": "5.0.4"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -38,3 +38,8 @@ export async function runURLAction(payload) {
 | 
				
			|||||||
    console.error(e);
 | 
					    console.error(e);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export async function generateScript(payload) {
 | 
				
			||||||
 | 
					  const { data } = await axios.post(`${baseUrl}/openai/generate/`, payload);
 | 
				
			||||||
 | 
					  return data;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@
 | 
				
			|||||||
          <q-tab name="urlactions" label="URL Actions" />
 | 
					          <q-tab name="urlactions" label="URL Actions" />
 | 
				
			||||||
          <q-tab name="retention" label="Retention" />
 | 
					          <q-tab name="retention" label="Retention" />
 | 
				
			||||||
          <q-tab name="apikeys" label="API Keys" />
 | 
					          <q-tab name="apikeys" label="API Keys" />
 | 
				
			||||||
 | 
					          <!-- <q-tab name="openai" label="Open AI" /> -->
 | 
				
			||||||
        </q-tabs>
 | 
					        </q-tabs>
 | 
				
			||||||
      </template>
 | 
					      </template>
 | 
				
			||||||
      <template v-slot:after>
 | 
					      <template v-slot:after>
 | 
				
			||||||
@@ -508,6 +509,49 @@
 | 
				
			|||||||
              <q-tab-panel name="apikeys">
 | 
					              <q-tab-panel name="apikeys">
 | 
				
			||||||
                <APIKeysTable />
 | 
					                <APIKeysTable />
 | 
				
			||||||
              </q-tab-panel>
 | 
					              </q-tab-panel>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              <!-- Open AI -->
 | 
				
			||||||
 | 
					              <!-- <q-tab-panel name="openai">
 | 
				
			||||||
 | 
					                <div class="text-subtitle2">Open AI</div>
 | 
				
			||||||
 | 
					                <q-separator />
 | 
				
			||||||
 | 
					                <q-card-section class="row">
 | 
				
			||||||
 | 
					                  <div class="col-4">API Key:</div>
 | 
				
			||||||
 | 
					                  <div class="col-2"></div>
 | 
				
			||||||
 | 
					                  <q-input
 | 
				
			||||||
 | 
					                    dense
 | 
				
			||||||
 | 
					                    outlined
 | 
				
			||||||
 | 
					                    v-model="settings.open_ai_token"
 | 
				
			||||||
 | 
					                    class="col-6"
 | 
				
			||||||
 | 
					                  />
 | 
				
			||||||
 | 
					                </q-card-section>
 | 
				
			||||||
 | 
					                <q-card-section class="row">
 | 
				
			||||||
 | 
					                  <div class="col-4">Open AI Model:</div>
 | 
				
			||||||
 | 
					                  <div class="col-2"></div>
 | 
				
			||||||
 | 
					                  <q-input
 | 
				
			||||||
 | 
					                    dense
 | 
				
			||||||
 | 
					                    outlined
 | 
				
			||||||
 | 
					                    v-model="settings.open_ai_model"
 | 
				
			||||||
 | 
					                    class="col-6"
 | 
				
			||||||
 | 
					                  >
 | 
				
			||||||
 | 
					                    <template v-slot:after>
 | 
				
			||||||
 | 
					                      <q-btn
 | 
				
			||||||
 | 
					                        round
 | 
				
			||||||
 | 
					                        dense
 | 
				
			||||||
 | 
					                        flat
 | 
				
			||||||
 | 
					                        icon="info"
 | 
				
			||||||
 | 
					                        size="sm"
 | 
				
			||||||
 | 
					                        @click="
 | 
				
			||||||
 | 
					                          openURL(
 | 
				
			||||||
 | 
					                            'https://platform.openai.com/docs/models/overview'
 | 
				
			||||||
 | 
					                          )
 | 
				
			||||||
 | 
					                        "
 | 
				
			||||||
 | 
					                      >
 | 
				
			||||||
 | 
					                        <q-tooltip>Click to see available options</q-tooltip>
 | 
				
			||||||
 | 
					                      </q-btn>
 | 
				
			||||||
 | 
					                    </template>
 | 
				
			||||||
 | 
					                  </q-input>
 | 
				
			||||||
 | 
					                </q-card-section>
 | 
				
			||||||
 | 
					              </q-tab-panel> -->
 | 
				
			||||||
            </q-tab-panels>
 | 
					            </q-tab-panels>
 | 
				
			||||||
          </q-scroll-area>
 | 
					          </q-scroll-area>
 | 
				
			||||||
          <q-card-section class="row items-center">
 | 
					          <q-card-section class="row items-center">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,17 @@
 | 
				
			|||||||
      :style="maximized ? '' : 'width: 90vw; max-width: 90vw'"
 | 
					      :style="maximized ? '' : 'width: 90vw; max-width: 90vw'"
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <q-bar>
 | 
					      <q-bar>
 | 
				
			||||||
        {{ title }}
 | 
					        <span class="q-pr-sm">{{ title }}</span>
 | 
				
			||||||
 | 
					        <q-btn
 | 
				
			||||||
 | 
					          v-if="!script && openAIEnabled"
 | 
				
			||||||
 | 
					          size="xs"
 | 
				
			||||||
 | 
					          :disable="loading"
 | 
				
			||||||
 | 
					          dense
 | 
				
			||||||
 | 
					          label="Generate Script"
 | 
				
			||||||
 | 
					          color="primary"
 | 
				
			||||||
 | 
					          no-caps
 | 
				
			||||||
 | 
					          @click="generateScriptOpenAI"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
        <q-space />
 | 
					        <q-space />
 | 
				
			||||||
        <q-btn
 | 
					        <q-btn
 | 
				
			||||||
          dense
 | 
					          dense
 | 
				
			||||||
@@ -57,116 +67,133 @@
 | 
				
			|||||||
          ><br />Add one to get rid of this warning. Ignore if windows.
 | 
					          ><br />Add one to get rid of this warning. Ignore if windows.
 | 
				
			||||||
        </q-banner>
 | 
					        </q-banner>
 | 
				
			||||||
        <div class="row q-pa-sm">
 | 
					        <div class="row q-pa-sm">
 | 
				
			||||||
          <div class="col-4 q-gutter-sm q-pr-sm">
 | 
					          <q-scroll-area
 | 
				
			||||||
            <q-input
 | 
					            :thumb-style="{
 | 
				
			||||||
              filled
 | 
					              right: '4px',
 | 
				
			||||||
              dense
 | 
					              borderRadius: '5px',
 | 
				
			||||||
              :readonly="readonly"
 | 
					              width: '5px',
 | 
				
			||||||
              v-model="formScript.name"
 | 
					              opacity: 0.75,
 | 
				
			||||||
              label="Name"
 | 
					            }"
 | 
				
			||||||
              :rules="[(val) => !!val || '*Required']"
 | 
					            :bar-style="{
 | 
				
			||||||
              hide-bottom-space
 | 
					              right: '2px',
 | 
				
			||||||
            />
 | 
					              borderRadius: '9px',
 | 
				
			||||||
            <q-input
 | 
					              width: '9px',
 | 
				
			||||||
              filled
 | 
					              opacity: 0.2,
 | 
				
			||||||
              dense
 | 
					            }"
 | 
				
			||||||
              :readonly="readonly"
 | 
					            class="col-4 q-mb-none q-pb-none"
 | 
				
			||||||
              v-model="formScript.description"
 | 
					            :style="{ height: `${maximized ? '82vh' : '64vh'}` }"
 | 
				
			||||||
              label="Description"
 | 
					          >
 | 
				
			||||||
            />
 | 
					            <div class="q-gutter-sm q-pr-sm">
 | 
				
			||||||
            <q-select
 | 
					              <q-input
 | 
				
			||||||
              :readonly="readonly"
 | 
					                filled
 | 
				
			||||||
              options-dense
 | 
					                dense
 | 
				
			||||||
              filled
 | 
					                :readonly="readonly"
 | 
				
			||||||
              dense
 | 
					                v-model="formScript.name"
 | 
				
			||||||
              v-model="formScript.shell"
 | 
					                label="Name"
 | 
				
			||||||
              :options="shellOptions"
 | 
					                :rules="[(val) => !!val || '*Required']"
 | 
				
			||||||
              emit-value
 | 
					                hide-bottom-space
 | 
				
			||||||
              map-options
 | 
					              />
 | 
				
			||||||
              label="Shell Type"
 | 
					              <q-input
 | 
				
			||||||
            />
 | 
					                filled
 | 
				
			||||||
            <tactical-dropdown
 | 
					                dense
 | 
				
			||||||
              v-model="formScript.supported_platforms"
 | 
					                :readonly="readonly"
 | 
				
			||||||
              :options="agentPlatformOptions"
 | 
					                v-model="formScript.description"
 | 
				
			||||||
              label="Supported Platforms (All supported if blank)"
 | 
					                label="Description"
 | 
				
			||||||
              clearable
 | 
					              />
 | 
				
			||||||
              mapOptions
 | 
					              <q-select
 | 
				
			||||||
              filled
 | 
					                :readonly="readonly"
 | 
				
			||||||
              multiple
 | 
					                options-dense
 | 
				
			||||||
              :readonly="readonly"
 | 
					                filled
 | 
				
			||||||
            />
 | 
					                dense
 | 
				
			||||||
            <tactical-dropdown
 | 
					                v-model="formScript.shell"
 | 
				
			||||||
              filled
 | 
					                :options="shellOptions"
 | 
				
			||||||
              v-model="formScript.category"
 | 
					                emit-value
 | 
				
			||||||
              :options="categories"
 | 
					                map-options
 | 
				
			||||||
              use-input
 | 
					                label="Shell Type"
 | 
				
			||||||
              clearable
 | 
					              />
 | 
				
			||||||
              new-value-mode="add-unique"
 | 
					              <tactical-dropdown
 | 
				
			||||||
              filterable
 | 
					                v-model="formScript.supported_platforms"
 | 
				
			||||||
              label="Category"
 | 
					                :options="agentPlatformOptions"
 | 
				
			||||||
              :readonly="readonly"
 | 
					                label="Supported Platforms (All supported if blank)"
 | 
				
			||||||
              hide-bottom-space
 | 
					                clearable
 | 
				
			||||||
            />
 | 
					                mapOptions
 | 
				
			||||||
            <tactical-dropdown
 | 
					                filled
 | 
				
			||||||
              v-model="formScript.args"
 | 
					                multiple
 | 
				
			||||||
              label="Script Arguments (press Enter after typing each argument)"
 | 
					                :readonly="readonly"
 | 
				
			||||||
              filled
 | 
					              />
 | 
				
			||||||
              use-input
 | 
					              <tactical-dropdown
 | 
				
			||||||
              multiple
 | 
					                filled
 | 
				
			||||||
              hide-dropdown-icon
 | 
					                v-model="formScript.category"
 | 
				
			||||||
              input-debounce="0"
 | 
					                :options="categories"
 | 
				
			||||||
              new-value-mode="add"
 | 
					                use-input
 | 
				
			||||||
              :readonly="readonly"
 | 
					                clearable
 | 
				
			||||||
            />
 | 
					                new-value-mode="add-unique"
 | 
				
			||||||
            <tactical-dropdown
 | 
					                filterable
 | 
				
			||||||
              v-model="formScript.env_vars"
 | 
					                label="Category"
 | 
				
			||||||
              :label="envVarsLabel"
 | 
					                :readonly="readonly"
 | 
				
			||||||
              filled
 | 
					                hide-bottom-space
 | 
				
			||||||
              use-input
 | 
					              />
 | 
				
			||||||
              multiple
 | 
					              <tactical-dropdown
 | 
				
			||||||
              hide-dropdown-icon
 | 
					                v-model="formScript.args"
 | 
				
			||||||
              input-debounce="0"
 | 
					                label="Script Arguments (press Enter after typing each argument)"
 | 
				
			||||||
              new-value-mode="add"
 | 
					                filled
 | 
				
			||||||
              :readonly="readonly"
 | 
					                use-input
 | 
				
			||||||
            />
 | 
					                multiple
 | 
				
			||||||
            <q-input
 | 
					                hide-dropdown-icon
 | 
				
			||||||
              type="number"
 | 
					                input-debounce="0"
 | 
				
			||||||
              filled
 | 
					                new-value-mode="add"
 | 
				
			||||||
              dense
 | 
					                :readonly="readonly"
 | 
				
			||||||
              :readonly="readonly"
 | 
					              />
 | 
				
			||||||
              v-model.number="formScript.default_timeout"
 | 
					              <tactical-dropdown
 | 
				
			||||||
              label="Timeout (seconds)"
 | 
					                v-model="formScript.env_vars"
 | 
				
			||||||
              :rules="[(val) => val >= 5 || 'Minimum is 5']"
 | 
					                :label="envVarsLabel"
 | 
				
			||||||
              hide-bottom-space
 | 
					                filled
 | 
				
			||||||
            />
 | 
					                use-input
 | 
				
			||||||
            <q-checkbox
 | 
					                multiple
 | 
				
			||||||
              v-model="formScript.run_as_user"
 | 
					                hide-dropdown-icon
 | 
				
			||||||
              label="Run As User (Windows only)"
 | 
					                input-debounce="0"
 | 
				
			||||||
            >
 | 
					                new-value-mode="add"
 | 
				
			||||||
              <q-tooltip
 | 
					                :readonly="readonly"
 | 
				
			||||||
                >Setting this value on the script model will always override any
 | 
					              />
 | 
				
			||||||
                'Run As User' checkboxes in the UI and force this script to
 | 
					              <q-input
 | 
				
			||||||
                always be run in the context of the logged in user. If no user
 | 
					                type="number"
 | 
				
			||||||
                is logged in, the script will not run and an error will be
 | 
					                filled
 | 
				
			||||||
                returned.
 | 
					                dense
 | 
				
			||||||
              </q-tooltip>
 | 
					                :readonly="readonly"
 | 
				
			||||||
            </q-checkbox>
 | 
					                v-model.number="formScript.default_timeout"
 | 
				
			||||||
            <q-input
 | 
					                label="Timeout (seconds)"
 | 
				
			||||||
              label="Syntax"
 | 
					                :rules="[(val) => val >= 5 || 'Minimum is 5']"
 | 
				
			||||||
              type="textarea"
 | 
					                hide-bottom-space
 | 
				
			||||||
              style="height: 150px; overflow-y: auto; resize: none"
 | 
					              />
 | 
				
			||||||
              v-model="formScript.syntax"
 | 
					              <q-checkbox
 | 
				
			||||||
              dense
 | 
					                v-model="formScript.run_as_user"
 | 
				
			||||||
              filled
 | 
					                label="Run As User (Windows only)"
 | 
				
			||||||
              :readonly="readonly"
 | 
					              >
 | 
				
			||||||
            />
 | 
					                <q-tooltip
 | 
				
			||||||
          </div>
 | 
					                  >Setting this value on the script model will always override
 | 
				
			||||||
 | 
					                  any 'Run As User' checkboxes in the UI and force this script
 | 
				
			||||||
 | 
					                  to always be run in the context of the logged in user. If no
 | 
				
			||||||
 | 
					                  user is logged in, the script will not run and an error will
 | 
				
			||||||
 | 
					                  be returned.
 | 
				
			||||||
 | 
					                </q-tooltip>
 | 
				
			||||||
 | 
					              </q-checkbox>
 | 
				
			||||||
 | 
					              <q-input
 | 
				
			||||||
 | 
					                label="Syntax"
 | 
				
			||||||
 | 
					                type="textarea"
 | 
				
			||||||
 | 
					                style="height: 150px; overflow-y: auto; resize: none"
 | 
				
			||||||
 | 
					                v-model="formScript.syntax"
 | 
				
			||||||
 | 
					                dense
 | 
				
			||||||
 | 
					                filled
 | 
				
			||||||
 | 
					                :readonly="readonly"
 | 
				
			||||||
 | 
					              />
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </q-scroll-area>
 | 
				
			||||||
          <v-ace-editor
 | 
					          <v-ace-editor
 | 
				
			||||||
            v-model:value="formScript.script_body"
 | 
					            v-model:value="formScript.script_body"
 | 
				
			||||||
            class="col-8"
 | 
					            class="col-8"
 | 
				
			||||||
            :lang="lang"
 | 
					            :lang="lang"
 | 
				
			||||||
            :theme="$q.dark.isActive ? 'tomorrow_night_eighties' : 'tomorrow'"
 | 
					            :theme="$q.dark.isActive ? 'tomorrow_night_eighties' : 'tomorrow'"
 | 
				
			||||||
            :style="{ height: `${maximized ? '87vh' : '64vh'}` }"
 | 
					            :style="{ height: `${maximized ? '82vh' : '64vh'}` }"
 | 
				
			||||||
            wrap
 | 
					            wrap
 | 
				
			||||||
            :printMargin="false"
 | 
					            :printMargin="false"
 | 
				
			||||||
            :options="{ fontSize: '14px' }"
 | 
					            :options="{ fontSize: '14px' }"
 | 
				
			||||||
@@ -220,9 +247,11 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
// composable imports
 | 
					// composable imports
 | 
				
			||||||
import { ref, computed, onMounted } from "vue";
 | 
					import { ref, computed, onMounted } from "vue";
 | 
				
			||||||
 | 
					import { useStore } from "vuex";
 | 
				
			||||||
import { useQuasar, useDialogPluginComponent } from "quasar";
 | 
					import { useQuasar, useDialogPluginComponent } from "quasar";
 | 
				
			||||||
import { saveScript, editScript, downloadScript } from "@/api/scripts";
 | 
					import { saveScript, editScript, downloadScript } from "@/api/scripts";
 | 
				
			||||||
import { useAgentDropdown, agentPlatformOptions } from "@/composables/agents";
 | 
					import { useAgentDropdown, agentPlatformOptions } from "@/composables/agents";
 | 
				
			||||||
 | 
					import { generateScript } from "@/api/core";
 | 
				
			||||||
import { notifySuccess } from "@/utils/notify";
 | 
					import { notifySuccess } from "@/utils/notify";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ui imports
 | 
					// ui imports
 | 
				
			||||||
@@ -266,6 +295,10 @@ export default {
 | 
				
			|||||||
    const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
 | 
					    const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
 | 
				
			||||||
    const $q = useQuasar();
 | 
					    const $q = useQuasar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // setup store
 | 
				
			||||||
 | 
					    const store = useStore();
 | 
				
			||||||
 | 
					    const openAIEnabled = computed(() => store.state.openAIIntegrationEnabled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // setup agent dropdown
 | 
					    // setup agent dropdown
 | 
				
			||||||
    const { agent, agentOptions, getAgentOptions } = useAgentDropdown();
 | 
					    const { agent, agentOptions, getAgentOptions } = useAgentDropdown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -355,6 +388,23 @@ export default {
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function generateScriptOpenAI() {
 | 
				
			||||||
 | 
					      $q.dialog({
 | 
				
			||||||
 | 
					        title: "Ask ChatGPT what you need!",
 | 
				
			||||||
 | 
					        prompt: {
 | 
				
			||||||
 | 
					          model: `${lang.value} code that `,
 | 
				
			||||||
 | 
					          type: "text",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        cancel: true,
 | 
				
			||||||
 | 
					        persistent: true,
 | 
				
			||||||
 | 
					      }).onOk(async (data) => {
 | 
				
			||||||
 | 
					        const completion = await generateScript({
 | 
				
			||||||
 | 
					          prompt: data,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        script.value.script_body = completion;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // component life cycle hooks
 | 
					    // component life cycle hooks
 | 
				
			||||||
    onMounted(async () => {
 | 
					    onMounted(async () => {
 | 
				
			||||||
      agentLoading.value = true;
 | 
					      agentLoading.value = true;
 | 
				
			||||||
@@ -380,10 +430,12 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      //computed
 | 
					      //computed
 | 
				
			||||||
      title,
 | 
					      title,
 | 
				
			||||||
 | 
					      openAIEnabled,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //methods
 | 
					      //methods
 | 
				
			||||||
      submitForm,
 | 
					      submitForm,
 | 
				
			||||||
      openTestScriptModal,
 | 
					      openTestScriptModal,
 | 
				
			||||||
 | 
					      generateScriptOpenAI,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // quasar dialog plugin
 | 
					      // quasar dialog plugin
 | 
				
			||||||
      dialogRef,
 | 
					      dialogRef,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,17 @@
 | 
				
			|||||||
      :style="maximized ? '' : 'width: 70vw; max-width: 90vw'"
 | 
					      :style="maximized ? '' : 'width: 70vw; max-width: 90vw'"
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <q-bar>
 | 
					      <q-bar>
 | 
				
			||||||
        {{ title }}
 | 
					        <span class="q-pr-sm">{{ title }}</span>
 | 
				
			||||||
 | 
					        <q-btn
 | 
				
			||||||
 | 
					          v-if="!snippet && openAIEnabled"
 | 
				
			||||||
 | 
					          :disable="loading"
 | 
				
			||||||
 | 
					          dense
 | 
				
			||||||
 | 
					          size="xs"
 | 
				
			||||||
 | 
					          label="Generate Script"
 | 
				
			||||||
 | 
					          color="primary"
 | 
				
			||||||
 | 
					          no-caps
 | 
				
			||||||
 | 
					          @click="generateScriptOpenAI"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
        <q-space />
 | 
					        <q-space />
 | 
				
			||||||
        <q-btn
 | 
					        <q-btn
 | 
				
			||||||
          dense
 | 
					          dense
 | 
				
			||||||
@@ -97,6 +107,9 @@
 | 
				
			|||||||
<script>
 | 
					<script>
 | 
				
			||||||
// composable imports
 | 
					// composable imports
 | 
				
			||||||
import { ref, computed } from "vue";
 | 
					import { ref, computed } from "vue";
 | 
				
			||||||
 | 
					import { useStore } from "vuex";
 | 
				
			||||||
 | 
					import { useQuasar } from "quasar";
 | 
				
			||||||
 | 
					import { generateScript } from "@/api/core";
 | 
				
			||||||
import { useDialogPluginComponent } from "quasar";
 | 
					import { useDialogPluginComponent } from "quasar";
 | 
				
			||||||
import { saveScriptSnippet, editScriptSnippet } from "@/api/scripts";
 | 
					import { saveScriptSnippet, editScriptSnippet } from "@/api/scripts";
 | 
				
			||||||
import { notifySuccess } from "@/utils/notify";
 | 
					import { notifySuccess } from "@/utils/notify";
 | 
				
			||||||
@@ -128,6 +141,13 @@ export default {
 | 
				
			|||||||
    // setup quasar plugins
 | 
					    // setup quasar plugins
 | 
				
			||||||
    const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
 | 
					    const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // setup quasar
 | 
				
			||||||
 | 
					    const $q = useQuasar();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // setup store
 | 
				
			||||||
 | 
					    const store = useStore();
 | 
				
			||||||
 | 
					    const openAIEnabled = computed(() => store.state.openAIIntegrationEnabled);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // snippet form logic
 | 
					    // snippet form logic
 | 
				
			||||||
    const snippet = props.snippet
 | 
					    const snippet = props.snippet
 | 
				
			||||||
      ? ref(Object.assign({}, props.snippet))
 | 
					      ? ref(Object.assign({}, props.snippet))
 | 
				
			||||||
@@ -167,6 +187,23 @@ export default {
 | 
				
			|||||||
      loading.value = false;
 | 
					      loading.value = false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function generateScriptOpenAI() {
 | 
				
			||||||
 | 
					      $q.dialog({
 | 
				
			||||||
 | 
					        title: "Ask ChatGPT what you need!",
 | 
				
			||||||
 | 
					        prompt: {
 | 
				
			||||||
 | 
					          model: `${lang.value} code that `,
 | 
				
			||||||
 | 
					          type: "text",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        cancel: true,
 | 
				
			||||||
 | 
					        persistent: true,
 | 
				
			||||||
 | 
					      }).onOk(async (data) => {
 | 
				
			||||||
 | 
					        const completion = await generateScript({
 | 
				
			||||||
 | 
					          prompt: data,
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        snippet.value.code = completion;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      // reactive data
 | 
					      // reactive data
 | 
				
			||||||
      formSnippet: snippet.value,
 | 
					      formSnippet: snippet.value,
 | 
				
			||||||
@@ -179,9 +216,11 @@ export default {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      //computed
 | 
					      //computed
 | 
				
			||||||
      title,
 | 
					      title,
 | 
				
			||||||
 | 
					      openAIEnabled,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      //methods
 | 
					      //methods
 | 
				
			||||||
      submitForm,
 | 
					      submitForm,
 | 
				
			||||||
 | 
					      generateScriptOpenAI,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      // quasar dialog plugin
 | 
					      // quasar dialog plugin
 | 
				
			||||||
      dialogRef,
 | 
					      dialogRef,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,7 @@ export default function () {
 | 
				
			|||||||
        currentTRMMVersion: null,
 | 
					        currentTRMMVersion: null,
 | 
				
			||||||
        latestTRMMVersion: null,
 | 
					        latestTRMMVersion: null,
 | 
				
			||||||
        dateFormat: "MMM-DD-YYYY - HH:mm",
 | 
					        dateFormat: "MMM-DD-YYYY - HH:mm",
 | 
				
			||||||
 | 
					        openAIIntegrationEnabled: false,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    getters: {
 | 
					    getters: {
 | 
				
			||||||
@@ -136,6 +137,9 @@ export default function () {
 | 
				
			|||||||
      setDateFormat(state, val) {
 | 
					      setDateFormat(state, val) {
 | 
				
			||||||
        state.dateFormat = val;
 | 
					        state.dateFormat = val;
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      setOpenAIIntegrationStatus(state, val) {
 | 
				
			||||||
 | 
					        state.openAIIntegrationEnabled = val;
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    actions: {
 | 
					    actions: {
 | 
				
			||||||
      setClientTreeSplitter(context, val) {
 | 
					      setClientTreeSplitter(context, val) {
 | 
				
			||||||
@@ -217,6 +221,10 @@ export default function () {
 | 
				
			|||||||
        context.commit("setShowCommunityScripts", data.show_community_scripts);
 | 
					        context.commit("setShowCommunityScripts", data.show_community_scripts);
 | 
				
			||||||
        context.commit("SET_HOSTED", data.hosted);
 | 
					        context.commit("SET_HOSTED", data.hosted);
 | 
				
			||||||
        context.commit("SET_TOKEN_EXPIRED", data.token_is_expired);
 | 
					        context.commit("SET_TOKEN_EXPIRED", data.token_is_expired);
 | 
				
			||||||
 | 
					        context.commit(
 | 
				
			||||||
 | 
					          "setOpenAIIntegrationStatus",
 | 
				
			||||||
 | 
					          data.open_ai_integration_enabled
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (data.date_format && data.date_format !== "")
 | 
					        if (data.date_format && data.date_format !== "")
 | 
				
			||||||
          context.commit("setDateFormat", data.date_format);
 | 
					          context.commit("setDateFormat", data.date_format);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user