3 Commits

Author SHA1 Message Date
31e99f351e fixed issue with config 2026-01-19 18:34:46 -05:00
4a44fac8cf updated version number 2026-01-18 17:36:45 -05:00
5d3c76853b added URL support 2026-01-18 17:36:24 -05:00
4 changed files with 52 additions and 22 deletions

View File

@@ -1,7 +1,7 @@
{
"manifest_version": 3,
"name": "WWCompanion",
"version": "0.3.1",
"version": "0.3.2",
"description": "AI companion for WaterlooWorks job postings.",
"permissions": ["storage", "activeTab"],
"host_permissions": ["https://waterlooworks.uwaterloo.ca/*"],

View File

@@ -54,7 +54,7 @@
<button id="copyRawBtn" class="ghost" type="button">Copy Markdown</button>
<button id="clearOutputBtn" class="ghost" type="button">Clear</button>
</div>
<button id="settingsBtn" class="link">Open Settings</button>
<button id="settingsBtn" class="link">Settings</button>
</footer>
<script src="popup.js"></script>

View File

@@ -84,6 +84,20 @@ function applyInline(text) {
)}" target="_blank" rel="noreferrer">${label}</a>`;
});
output = output.replace(/https?:\/\/[^\s<]+/g, (match) => {
let url = match;
let suffix = "";
while (/[),.;!?]$/.test(url)) {
suffix = url.slice(-1) + suffix;
url = url.slice(0, -1);
}
const safeUrl = sanitizeUrl(url);
if (!safeUrl) return match;
return `<a href="${escapeAttribute(
safeUrl
)}" target="_blank" rel="noreferrer">${safeUrl}</a>${suffix}`;
});
output = output.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
output = output.replace(/\*([^*]+)\*/g, "<em>$1</em>");
output = output.replace(/_([^_]+)_/g, "<em>$1</em>");

View File

@@ -609,7 +609,9 @@ function updateApiConfigKeyOptions() {
const keys = collectApiKeys();
const selects = apiConfigsContainer.querySelectorAll(".api-config-key-select");
selects.forEach((select) => {
const preferred = select.dataset.preferred || select.value;
const preferred = select.dataset.preferred || "";
const currentValue = select.value || "";
const candidate = preferred || currentValue;
select.innerHTML = "";
if (!keys.length) {
const option = document.createElement("option");
@@ -628,13 +630,15 @@ function updateApiConfigKeyOptions() {
select.appendChild(option);
}
if (preferred && keys.some((key) => key.id === preferred)) {
select.value = preferred;
if (candidate && keys.some((key) => key.id === candidate)) {
select.value = candidate;
select.dataset.preferred = candidate;
} else {
select.value = keys[0].id;
if (!preferred) {
select.dataset.preferred = select.value;
}
}
select.dataset.preferred = select.value;
});
}
@@ -803,7 +807,9 @@ function updateTaskEnvOptions() {
const envs = collectEnvConfigs();
const selects = tasksContainer.querySelectorAll(".task-env-select");
selects.forEach((select) => {
const preferred = select.dataset.preferred || select.value;
const preferred = select.dataset.preferred || "";
const currentValue = select.value || "";
const candidate = preferred || currentValue;
select.innerHTML = "";
if (!envs.length) {
const option = document.createElement("option");
@@ -822,13 +828,15 @@ function updateTaskEnvOptions() {
select.appendChild(option);
}
if (preferred && envs.some((env) => env.id === preferred)) {
select.value = preferred;
if (candidate && envs.some((env) => env.id === candidate)) {
select.value = candidate;
select.dataset.preferred = candidate;
} else {
select.value = envs[0].id;
if (!preferred) {
select.dataset.preferred = select.value;
}
}
select.dataset.preferred = select.value;
});
scheduleSidebarErrors();
}
@@ -1034,7 +1042,9 @@ function updateTaskProfileOptions() {
const profiles = collectProfiles();
const selects = tasksContainer.querySelectorAll(".task-profile-select");
selects.forEach((select) => {
const preferred = select.dataset.preferred || select.value;
const preferred = select.dataset.preferred || "";
const currentValue = select.value || "";
const candidate = preferred || currentValue;
select.innerHTML = "";
if (!profiles.length) {
const option = document.createElement("option");
@@ -1053,13 +1063,15 @@ function updateTaskProfileOptions() {
select.appendChild(option);
}
if (preferred && profiles.some((profile) => profile.id === preferred)) {
select.value = preferred;
if (candidate && profiles.some((profile) => profile.id === candidate)) {
select.value = candidate;
select.dataset.preferred = candidate;
} else {
select.value = profiles[0].id;
if (!preferred) {
select.dataset.preferred = select.value;
}
}
select.dataset.preferred = select.value;
});
scheduleSidebarErrors();
}
@@ -1068,7 +1080,9 @@ function updateEnvApiOptions() {
const apiConfigs = collectApiConfigs();
const selects = envConfigsContainer.querySelectorAll(".env-config-api-select");
selects.forEach((select) => {
const preferred = select.dataset.preferred || select.value;
const preferred = select.dataset.preferred || "";
const currentValue = select.value || "";
const candidate = preferred || currentValue;
select.innerHTML = "";
if (!apiConfigs.length) {
const option = document.createElement("option");
@@ -1087,13 +1101,15 @@ function updateEnvApiOptions() {
select.appendChild(option);
}
if (preferred && apiConfigs.some((config) => config.id === preferred)) {
select.value = preferred;
if (candidate && apiConfigs.some((config) => config.id === candidate)) {
select.value = candidate;
select.dataset.preferred = candidate;
} else {
select.value = apiConfigs[0].id;
if (!preferred) {
select.dataset.preferred = select.value;
}
}
select.dataset.preferred = select.value;
});
updateTaskEnvOptions();
}