Browse Source

stg-button-force-inject-next-send

master
Serge Shutov 2 weeks ago
parent
commit
7f6e41f777
  1. 7
      content/chat-logger.js
  2. 3
      content/overlay.css
  3. 20
      content/panel.js
  4. 2
      injected/chat-logger.js

7
content/chat-logger.js

@ -4,15 +4,17 @@ @@ -4,15 +4,17 @@
var TOKEN_KEY = 'dshmem-bridge-token'
var ENABLED_KEY = 'dshmem-log-enabled'
var EXEC_KEY = 'dshmem-transport'
var FORCE_KEY = 'dshmem-force-inject'
var HOOK_ID = 'dshmem-hook'
function pushConfig() {
try {
chrome.storage.local.get([TOKEN_KEY, ENABLED_KEY, EXEC_KEY], function (v) {
chrome.storage.local.get([TOKEN_KEY, ENABLED_KEY, EXEC_KEY, FORCE_KEY], function (v) {
var detail = {
token: v && v[TOKEN_KEY] ? String(v[TOKEN_KEY]) : '',
enabled: !(v && v[ENABLED_KEY] === false),
execSource: (v ? v[EXEC_KEY] === 'sse' : false) ? 'sse' : 'dom',
forceInject: (v ? v[FORCE_KEY] === true : false),
}
try {
window.dispatchEvent(new CustomEvent('dshmem:log-config', { detail: JSON.stringify(detail) }))
@ -32,11 +34,12 @@ @@ -32,11 +34,12 @@
}
window.addEventListener('dshmem:log-request', pushConfig)
window.addEventListener('dshmem:force-inject-used', function () { try { chrome.storage.local.set({ 'dshmem-force-inject': false }) } catch (e) { } })
try {
chrome.storage.onChanged.addListener(function (changes, area) {
if (area !== 'local') return
if (changes[TOKEN_KEY] || changes[ENABLED_KEY] || changes[EXEC_KEY]) pushConfig()
if (changes[TOKEN_KEY] || changes[ENABLED_KEY] || changes[EXEC_KEY] || changes[FORCE_KEY]) pushConfig()
})
} catch (e) { }

3
content/overlay.css

@ -61,6 +61,9 @@ @@ -61,6 +61,9 @@
.dshmem-btn.primary { background: #2f81f7; border-color: #2f81f7; }
.dshmem-btn.primary:hover { background: #4a93ff; }
.dshmem-btn.danger { background: #b62324; border-color: #b62324; }
.dshmem-btn.stg { background: #8fd694; border-color: #8fd694; color: #0a1a0c; }
.dshmem-btn.stg:hover { background: #a8e2ac; }
.dshmem-btn.stg.armed { background: #c9f0cc; animation: dshmem-blink 1s infinite; }
.dshmem-btn:disabled { opacity: 0.45; cursor: not-allowed; }
.dshmem-select, .dshmem-input {

20
content/panel.js

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
connected: false,
loopsLeft: 0, loopsMax: 0,
dailyCount: 0, dailyMax: 0,
resetCbs: [], stopCbs: [], saveCbs: [], startCbs: [], dotMode: null, transport: 'dom', accLimit: 900000, lastMetrics: null
resetCbs: [], stopCbs: [], saveCbs: [], startCbs: [], dotMode: null, transport: 'dom', accLimit: 900000, lastMetrics: null, forceInject: false
};
var el = {};
function byId(id) { return document.getElementById(id); }
@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
var row2 = mk('div', 'dshmem-row');
el.save = mk('button', 'dshmem-btn primary', 'Save');
el.health = mk('button', 'dshmem-btn', 'Health');
row2.appendChild(el.save); row2.appendChild(el.health); el.transportToggle = mk('button', 'dshmem-btn danger', 'DOM'); row2.appendChild(el.transportToggle); var lblAcc = mk('div', 'dshmem-label', 'Acc limit (100%)'); set.appendChild(lblAcc); el.accLimit = mk('input', 'dshmem-input'); el.accLimit.type = 'number'; el.accLimit.autocomplete = 'off'; el.accLimit.setAttribute('autocomplete', 'off'); el.accLimit.autocomplete = 'off'; el.accLimit.setAttribute('autocomplete', 'off'); el.accLimit.placeholder = '900000'; el.accLimit.value = '900000'; set.appendChild(el.accLimit);
row2.appendChild(el.save); row2.appendChild(el.health); el.stg = mk('button', 'dshmem-btn stg', 'STG'); row2.appendChild(el.stg); el.transportToggle = mk('button', 'dshmem-btn danger', 'DOM'); row2.appendChild(el.transportToggle); var lblAcc = mk('div', 'dshmem-label', 'Acc limit (100%)'); set.appendChild(lblAcc); el.accLimit = mk('input', 'dshmem-input'); el.accLimit.type = 'number'; el.accLimit.autocomplete = 'off'; el.accLimit.setAttribute('autocomplete', 'off'); el.accLimit.autocomplete = 'off'; el.accLimit.setAttribute('autocomplete', 'off'); el.accLimit.placeholder = '900000'; el.accLimit.value = '900000'; set.appendChild(el.accLimit);
set.appendChild(lbl); set.appendChild(el.token); set.appendChild(row2); set.style.display = 'none';
el.body.appendChild(set);
el.log = mk('div', 'dshmem-log');
@ -65,6 +65,7 @@ @@ -65,6 +65,7 @@
el.settingsToggle.addEventListener('click', function () { var s = el.settings; if (s) { s.style.display = s.style.display === 'none' ? '' : 'none' } }); el.transportToggle.addEventListener('click', function () { state.transport = state.transport === 'dom' ? 'sse' : 'dom'; el.transportToggle.textContent = state.transport === 'dom' ? 'DOM' : 'SSE'; try { chrome.storage.local.set({ 'dshmem-transport': state.transport }) } catch (e) { } }); el.reset.addEventListener('click', function () { el.start.disabled = false; state.resetCbs.forEach(function (cb) { try { cb(); } catch (e) {} }); });
el.stop.addEventListener('click', function () { el.start.disabled = false; state.stopCbs.forEach(function (cb) { try { cb(); } catch (e) {} }); }); el.start.addEventListener('click', function () { el.start.disabled = true; state.startCbs.forEach(function (cb) { try { cb(); } catch (e) {} }); });
el.accLimit.addEventListener('change', function () { var n = parseInt(el.accLimit.value, 10); if (!n || n < 1000) n = 900000; state.accLimit = n; try { chrome.storage.local.set({ 'dshmem-acc-limit': n }) } catch (e) { } API.setMetrics(state.lastMetrics); }); el.save.addEventListener('click', function () { var v = el.token.value || ''; if (!v) { API.log('token not changed (empty)'); return; } state.saveCbs.forEach(function (cb) { try { cb(v); } catch (e) {} }); });
el.stg.addEventListener('click', function () { API.toggleForceInject(); });
el.health.addEventListener('click', function () {
try { globalThis.DSH_BRIDGE.health().then(function (r) {
if (r && r.ok) { API.setConnected(true); API.log('health ok, bridge up'); }
@ -76,6 +77,17 @@ @@ -76,6 +77,17 @@
setPhase: function (p) { state.phase = p; if (el.phase) el.phase.textContent = p; },
setConnected: function (b) { state.connected = !!b; API._applyDot(); }, setDot: function (m) { state.dotMode = (m === 'ok') ? null : m; API._applyDot(); }, _applyDot: function () { if (!el.dot) return; var md = state.dotMode || (state.connected ? 'ok' : 'err'); var cls = 'dshmem-dot'; if (md === 'ok' || md === 'err' || md === 'busy' || md === 'ok-busy') cls += ' ' + md; el.dot.className = cls; },
setStartEnabled: function (b) { if (el.start) el.start.disabled = !b; }, setStats: function (ws, memN, skillN) { if (!el.stats) return; el.stats.textContent = 'WS: ' + (ws || '?') + ' mem: ' + (memN || 0) + ' skills: ' + (skillN || 0); }, setMetrics: function (m) { if (!el.metrics) return; if (!m) { el.metrics.textContent = 'metrics: —'; return; } state.lastMetrics = m; var __pct = 0; if (state.accLimit > 0) __pct = Math.round((m.accum || 0) * 100 / state.accLimit); var __cls = 'dshmem-acc-ok'; if (__pct > 100) __cls = 'dshmem-acc-crit'; else if (__pct >= 80) __cls = 'dshmem-acc-err'; else if (__pct >= 40) __cls = 'dshmem-acc-warn'; el.metrics.className = 'dshmem-stats ' + __cls; el.metrics.textContent = 'acc: ' + m.accum + ' · turn: ' + m.delta + ' · msg: ' + m.chars + 'ch (~' + m.est_tok + 't) ctx ' + (m.ctx_tok || 0) + 't ' + (m.ctx_pct || 0) + 'pct'; },
toggleForceInject: function () {
state.forceInject = !state.forceInject;
try { chrome.storage.local.set({ 'dshmem-force-inject': state.forceInject }) } catch (e) { }
API._applyStg();
API.log('force inject: ' + (state.forceInject ? 'ARMED - next send will inject' : 'off'));
},
_applyStg: function () {
if (!el.stg) return;
var cls = 'dshmem-btn stg' + (state.forceInject ? ' armed' : '');
el.stg.className = cls;
},
log: function (m) {
if (!el.log) return;
var t = new Date().toLocaleTimeString();
@ -120,7 +132,9 @@ @@ -120,7 +132,9 @@
el.preview.onclick = function () { cancelled = true; clearInterval(iv); el.preview.style.display = 'none'; el.preview.onclick = null; if (opt.onCancel) opt.onCancel(); };
},
hidePreview: function () { if (el.preview) el.preview.style.display = 'none'; },
init: function () { build(); wire(); try { chrome.storage.local.get('dshmem-transport', function (v) { if (v && v['dshmem-transport']) { var tv = v['dshmem-transport']; if (tv === 'msg') tv = 'dom'; if (tv === 'xhr') tv = 'sse'; API.setTransport(tv) } }) } catch (e) { } try { chrome.storage.local.get('dshmem-acc-limit', function (v) { var n = v && v['dshmem-acc-limit'] ? parseInt(v['dshmem-acc-limit'], 10) : 0; if (n && n >= 1000) { state.accLimit = n; if (el.accLimit) el.accLimit.value = String(n); API.setMetrics(state.lastMetrics); } }) } catch (e) { } }
init: function () { build(); wire(); try { chrome.storage.local.get('dshmem-transport', function (v) { if (v && v['dshmem-transport']) { var tv = v['dshmem-transport']; if (tv === 'msg') tv = 'dom'; if (tv === 'xhr') tv = 'sse'; API.setTransport(tv) } }) } catch (e) { } try { chrome.storage.local.get('dshmem-acc-limit', function (v) { var n = v && v['dshmem-acc-limit'] ? parseInt(v['dshmem-acc-limit'], 10) : 0; if (n && n >= 1000) { state.accLimit = n; if (el.accLimit) el.accLimit.value = String(n); API.setMetrics(state.lastMetrics); } }) } catch (e) { }
try { chrome.storage.local.get('dshmem-force-inject', function (v) { state.forceInject = Boolean(v && v['dshmem-force-inject']); API._applyStg(); }) } catch (e) { }
try { chrome.storage.onChanged.addListener(function (ch, area) { if (area !== 'local') return; if (ch['dshmem-force-inject']) { state.forceInject = Boolean(ch['dshmem-force-inject'].newValue); API._applyStg(); } }); } catch (e) { } }
};
globalThis.DSHMEM = API;
if (document.readyState === 'loading') {

2
injected/chat-logger.js

@ -254,7 +254,7 @@ @@ -254,7 +254,7 @@
}
XMLHttpRequest.prototype.send = function (body) {
var self = this
var bodyStr = typeof body === 'string' ? body : ''; var __didInject = false; if (self.__chatUrl && self.__chatUrl.indexOf('chat/completion') !== -1) { try { var __d = JSON.parse(bodyStr); var __pk = 'parent' + '_message' + '_id'; var __raw = (__d && __d[__pk] !== undefined) ? __d[__pk] : 'absent'; var __isFirst = (__raw === null || __raw === 'absent'); if (__isFirst && injectLoaded && injectBlock.length > 0) { if (typeof __d.prompt === 'string' && __d.prompt) { __d.prompt = injectBlock + String.fromCharCode(10) + String.fromCharCode(10) + __d.prompt; bodyStr = JSON.stringify(__d); __didInject = true } else if (Array.isArray(__d.messages) && __d.messages.length > 0) { var __last = __d.messages[__d.messages.length - 1]; if (__last && typeof __last.content === 'string') { __last.content = injectBlock + String.fromCharCode(10) + String.fromCharCode(10) + __last.content; bodyStr = JSON.stringify(__d); __didInject = true } } } if (__didInject) { __saveReg(__d) } console.log('[chat-log] send diag parent=' + String(__raw) + ' block=' + injectBlock.length + ' loaded=' + injectLoaded + ' injected=' + __didInject) } catch (e) { console.log('[chat-log] inject error ' + String(e)) } }
var bodyStr = typeof body === 'string' ? body : ''; var __didInject = false; if (self.__chatUrl && self.__chatUrl.indexOf('chat/completion') !== -1) { try { var __d = JSON.parse(bodyStr); var __pk = 'parent' + '_message' + '_id'; var __raw = (__d && __d[__pk] !== undefined) ? __d[__pk] : 'absent'; var __isFirst = (__raw === null || __raw === 'absent'); var __force = (cfg ? cfg.forceInject === true : false); if ((__isFirst || __force) && injectLoaded && injectBlock.length > 0) { if (typeof __d.prompt === 'string' && __d.prompt) { __d.prompt = injectBlock + String.fromCharCode(10) + String.fromCharCode(10) + __d.prompt; bodyStr = JSON.stringify(__d); __didInject = true } else if (Array.isArray(__d.messages) && __d.messages.length > 0) { var __last = __d.messages[__d.messages.length - 1]; if (__last && typeof __last.content === 'string') { __last.content = injectBlock + String.fromCharCode(10) + String.fromCharCode(10) + __last.content; bodyStr = JSON.stringify(__d); __didInject = true } } } if (__didInject) { __saveReg(__d); if (__force) { try { window.dispatchEvent(new CustomEvent('dshmem:force-inject-used')) } catch (e2) { } } } console.log('[chat-log] send diag parent=' + String(__raw) + ' block=' + injectBlock.length + ' loaded=' + injectLoaded + ' injected=' + __didInject + ' force=' + __force) } catch (e) { console.log('[chat-log] inject error ' + String(e)) } }
this.addEventListener('load', function () {
try {
process({ url: self.__chatUrl, body: bodyStr, resp: self.responseText || '' })

Loading…
Cancel
Save