termdock 1.4.75 → 1.4.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{ModelPreview-CgadwE-X.js → ModelPreview-MUquuQ7M.js} +1 -1
- package/dist/client/assets/{abnfDiagram-VRR7QNED-BwzoWS84.js → abnfDiagram-VRR7QNED-bSAQDoRq.js} +1 -1
- package/dist/client/assets/{arc-BSXeDTtT.js → arc-CRXZasqt.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-CiktZAdt.js → architectureDiagram-ZJ3FMSHR-B5lW2XVL.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-CcO7Gv0u.js → blockDiagram-677ZJIJ3-BnvUlbML.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-DqSBXIs2.js → c4Diagram-LMCZKHZV-Dh43i8Od.js} +1 -1
- package/dist/client/assets/channel-Bm8opuca.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-RGQqr7Wd.js → chunk-2Q5K7J3B-Br9F2z9G.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-DBskyu-m.js → chunk-32BRIVSS-CR_BEEo8.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CkFCVM93.js → chunk-5VM5RSS4-RSFWgHJK.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-DpOkJyEK.js → chunk-EX3LRPZG-BojU9tp1.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-D7tvMM1y.js → chunk-JWPE2WC7-Da5LKO28.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-Bux1LkUq.js → chunk-MOJQB5TN-CnH9HN8z.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-5i4ikiym.js → chunk-RYQCIY6F-OAjuTT8n.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-B43bfTin.js → chunk-V7JOEXUC-BeH2Mdv7.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-CD4WRjxv.js → chunk-VR4S4FIN-BK51NinF.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-BrlHgkck.js → chunk-XXDRQBXY-Df-77sm7.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-eErPtGt5.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-eErPtGt5.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-Lvvlk7-a.js → cose-bilkent-JH36ORCC-C-FtawL2.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-9R5HIkEY.js → cynefin-VYW2F7L2-O7CaDQi8.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-CXZG1iZX.js → cynefinDiagram-TSTJHNR4-B0fJizeX.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-BfwBKO-b.js → dagre-VKFMJZFB-BsIwc1IF.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-PCnnSXdy.js → diagram-FQU43EPY-GDwMRBsa.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-BKrDfn5t.js → diagram-G47NLZAW-Chv4syax.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-DVmM7ZUm.js → diagram-NH7WQ7WH-Dh1F6AVi.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-B5YZo9wv.js → diagram-OA4YK3LP-CU3z6ul5.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-BMSaQpt2.js → diagram-WEI45ONY-CYug818o.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-CUUXzNR1.js → ebnfDiagram-CCIWWBDH-zzKMHZmD.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-Dro29FWF.js → erDiagram-Q63AITRT-4yv9ci2k.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U--NLPfw_6.js → flowDiagram-23GEKE2U-CJj8uFtp.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-BTwHdLRq.js → ganttDiagram-NO4QXBWP-WhZonF-5.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Dn23E-JS.js → gitGraphDiagram-IHSO6WYX-DCmdLenS.js} +1 -1
- package/dist/client/assets/index-DnOydypX.css +1 -0
- package/dist/client/assets/index-ILJW_1zc.js +451 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-DbngRn-9.js → infoDiagram-FWYZ7A6U-0HrqatQe.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-CvbaO0Ju.js → ishikawaDiagram-FXEZZL3T-DCPrrLNa.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-DTxptbBV.js → journeyDiagram-5HDEW3XC-CY0RHb4b.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-CXaGI_k2.js → kanban-definition-HUTT4EX6-DcH2OBHS.js} +1 -1
- package/dist/client/assets/{linear-B0GEZWeO.js → linear-BidTRUFO.js} +1 -1
- package/dist/client/assets/{mermaid.core-BPmN3s0O.js → mermaid.core-BomIvgGf.js} +4 -4
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-BaDOqGJ0.js → mindmap-definition-LN4V7U3C-BVbGSAMP.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-CQk8hRGW.js → pegDiagram-2B236MQR-BPDcfuXr.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-CO-EGZwN.js → pieDiagram-ENE6RG2P-BEl37TgF.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-BTIXISZS.js → quadrantDiagram-ABIIQ3AL-B4Jexgtq.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-Bb_SaJhp.js → railroadDiagram-RFXS5EU6-DCf5cVwA.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-BCZbXuhF.js → requirementDiagram-TGXJPOKE-Dutz-kps.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-J7wtByga.js → sankeyDiagram-HTMAVEWB-C5B7Px5r.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-DX18koCe.js → sequenceDiagram-DBY2YBRQ-BAjlNtX7.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-Ckw-HC0v.js → sizeCapture-X5ZJPWSS-DxHVj2nI.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-CsWwRc8Z.js → stateDiagram-2N3HPSRC-h0J5lN0m.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CtfvvrUK.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-C-9fnG6s.js → swimlanes-5IMT3BWC-BVPnl0Ka.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-CLhM0GwF.js +8 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-RR6aJx9T.js → timeline-definition-FHXFAJF6-Cn5XtHKy.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-Bq70NfzM.js → vennDiagram-L72KCM5P-CwBsi2Gg.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-BExg805C.js → wardleyDiagram-EHGQE667-CZMtiWJm.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-CAuIXNf1.js → xychartDiagram-FW5EYKEG-uGw9wOMW.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/agent/autoTitle.js +15 -2
- package/dist/server/agent/titleNamerCatalog.js +76 -6
- package/dist/server/routes/terminal.js +80 -14
- package/dist/server/utils/settings.js +11 -0
- package/package.json +1 -1
- package/runtime-manifest.json +2 -2
- package/dist/client/assets/channel-CaB7X-EF.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-C_qGVbiI.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-C_qGVbiI.js +0 -1
- package/dist/client/assets/index-CB7j58QZ.js +0 -451
- package/dist/client/assets/index-DhfIiBLW.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DwkbQF8P.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-C-O52D50.js +0 -8
|
@@ -14,7 +14,7 @@ import { getPtyHostManager } from '../ptyhost/manager.js';
|
|
|
14
14
|
import { pathValidator } from '../utils/pathValidator.js';
|
|
15
15
|
import { TERMINAL, TMUX } from '../config.js';
|
|
16
16
|
import { localAccessManager } from '../utils/localAccess.js';
|
|
17
|
-
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, } from '../utils/settings.js';
|
|
17
|
+
import { normalizeLocalAccessName, getLocaleSetting, setLocaleSetting, getContextDraftHeightSetting, setContextDraftHeightSetting, getAutoRenameAgentsSetting, setAutoRenameAgentsSetting, getAutoRenameNamerSetting, setAutoRenameNamerSetting, getAutoRenameModelsSetting, setAutoRenameModelsSetting, getAutoRenameIntervalMinutesSetting, setAutoRenameIntervalMinutesSetting, getAutoRenamePromptPreferenceSetting, setAutoRenamePromptPreferenceSetting, } from '../utils/settings.js';
|
|
18
18
|
import { loadContextDraft, saveContextDraft } from '../utils/contextDraft.js';
|
|
19
19
|
import { getOnboardingServerUrl } from '../onboardingServer.js';
|
|
20
20
|
import { getFocusSequence, removeClientFocusState, scanFocusTrackingMode, setClientFocusState, } from '../utils/tmuxFocus.js';
|
|
@@ -29,7 +29,7 @@ import { notifyAgentTransition, notifyTerminalExit } from '../notifications/push
|
|
|
29
29
|
import { setClientViewingSession } from '../notifications/pushViewers.js';
|
|
30
30
|
import { getQuotaStatus, refreshQuota, startQuotaManager, } from '../quota/QuotaManager.js';
|
|
31
31
|
import { TermdockAutoUpdateManager } from '../utils/autoUpdate.js';
|
|
32
|
-
import { AUTO_TITLE_MIN_CONTEXT_CHARS, cleanTerminalContext, generateAgentTitle, isNewAgentSessionId, isAutoTitleReevaluationDue, shouldReplaceAutoTitle, } from '../agent/autoTitle.js';
|
|
32
|
+
import { AUTO_TITLE_LONG_RUNNING_DELAY_MS, AUTO_TITLE_MIN_CONTEXT_CHARS, cleanTerminalContext, generateAgentTitle, hasSubstantiveAutoTitleContext, isNewAgentSessionId, isAutoTitleReevaluationDue, shouldReplaceAutoTitle, } from '../agent/autoTitle.js';
|
|
33
33
|
import { getTitleNamerCatalog, invalidateTitleNamerCatalog, probePluginTitleNamer } from '../agent/titleNamerCatalog.js';
|
|
34
34
|
const router = express.Router();
|
|
35
35
|
const execFileAsync = promisify(execFile);
|
|
@@ -2147,26 +2147,26 @@ function clearAutoTitleForNewAgentSession(sessionId, session) {
|
|
|
2147
2147
|
broadcastClientState();
|
|
2148
2148
|
console.log(`[auto-title] cleared stale title for new agent session in ${sessionId}`);
|
|
2149
2149
|
}
|
|
2150
|
-
async function maybeAutoRenameSession(sessionId, agent, rawContext) {
|
|
2150
|
+
async function maybeAutoRenameSession(sessionId, agent, rawContext, options = {}) {
|
|
2151
2151
|
if (autoTitlePending.has(sessionId))
|
|
2152
|
-
return;
|
|
2152
|
+
return false;
|
|
2153
2153
|
if (!getAutoRenameAgentsSetting().includes(agent.slug))
|
|
2154
|
-
return;
|
|
2154
|
+
return false;
|
|
2155
2155
|
const record = globalSessionState.sessions.find((item) => item.backendSessionId === sessionId);
|
|
2156
2156
|
if (!record || (record.customName === true && !record.autoTitle))
|
|
2157
|
-
return;
|
|
2158
|
-
if (record.autoTitle && !isAutoTitleReevaluationDue(record.autoTitle.updatedAt, getAutoRenameIntervalMinutesSetting()))
|
|
2159
|
-
return;
|
|
2157
|
+
return false;
|
|
2158
|
+
if (record.autoTitle && !options.forceReevaluation && !isAutoTitleReevaluationDue(record.autoTitle.updatedAt, getAutoRenameIntervalMinutesSetting()))
|
|
2159
|
+
return false;
|
|
2160
2160
|
const context = cleanTerminalContext(rawContext);
|
|
2161
2161
|
// A new session gets one cheap attempt after its first real exchange. Short
|
|
2162
2162
|
// conversations ("hi" plus a brief reply) are still valid sessions; the
|
|
2163
2163
|
// one-hour re-evaluation guard below keeps this from becoming noisy after a
|
|
2164
2164
|
// title exists.
|
|
2165
2165
|
if (context.length < AUTO_TITLE_MIN_CONTEXT_CHARS)
|
|
2166
|
-
return;
|
|
2166
|
+
return false;
|
|
2167
2167
|
const contentHash = createHash('sha256').update(context).digest('hex');
|
|
2168
2168
|
if (record.autoTitle?.contentHash === contentHash)
|
|
2169
|
-
return;
|
|
2169
|
+
return false;
|
|
2170
2170
|
autoTitlePending.add(sessionId);
|
|
2171
2171
|
try {
|
|
2172
2172
|
const savedModels = getAutoRenameModelsSetting();
|
|
@@ -2186,13 +2186,14 @@ async function maybeAutoRenameSession(sessionId, agent, rawContext) {
|
|
|
2186
2186
|
namer: getAutoRenameNamerSetting(),
|
|
2187
2187
|
models: validModels,
|
|
2188
2188
|
currentTitle: record.autoTitle ? record.name : undefined,
|
|
2189
|
+
userPreference: getAutoRenamePromptPreferenceSetting(),
|
|
2189
2190
|
});
|
|
2190
2191
|
if (!title)
|
|
2191
|
-
return;
|
|
2192
|
+
return false;
|
|
2192
2193
|
// A manual rename performed while the namer was running always wins.
|
|
2193
2194
|
const current = globalSessionState.sessions.find((item) => item.backendSessionId === sessionId);
|
|
2194
2195
|
if (!current || (current.customName === true && !current.autoTitle))
|
|
2195
|
-
return;
|
|
2196
|
+
return false;
|
|
2196
2197
|
if (current.autoTitle && !shouldReplaceAutoTitle(current.name, title)) {
|
|
2197
2198
|
upsertGlobalSessionRecord({
|
|
2198
2199
|
...current,
|
|
@@ -2200,7 +2201,7 @@ async function maybeAutoRenameSession(sessionId, agent, rawContext) {
|
|
|
2200
2201
|
});
|
|
2201
2202
|
await persistGlobalStateNow();
|
|
2202
2203
|
console.log(`[auto-title] kept ${sessionId} title ${JSON.stringify(current.name)}`);
|
|
2203
|
-
return;
|
|
2204
|
+
return true;
|
|
2204
2205
|
}
|
|
2205
2206
|
const next = {
|
|
2206
2207
|
...current,
|
|
@@ -2215,14 +2216,61 @@ async function maybeAutoRenameSession(sessionId, agent, rawContext) {
|
|
|
2215
2216
|
await persistGlobalStateNow();
|
|
2216
2217
|
broadcastClientState();
|
|
2217
2218
|
console.log(`[auto-title] renamed ${sessionId} (${agent.slug}) to ${JSON.stringify(title)}`);
|
|
2219
|
+
return true;
|
|
2218
2220
|
}
|
|
2219
2221
|
catch (error) {
|
|
2220
2222
|
console.warn(`[auto-title] failed for ${sessionId}: ${getErrorMessage(error)}`);
|
|
2223
|
+
return false;
|
|
2221
2224
|
}
|
|
2222
2225
|
finally {
|
|
2223
2226
|
autoTitlePending.delete(sessionId);
|
|
2224
2227
|
}
|
|
2225
2228
|
}
|
|
2229
|
+
function cancelLongRunningAutoTitle(session) {
|
|
2230
|
+
if (session.autoTitleLongRunningTimer === null)
|
|
2231
|
+
return;
|
|
2232
|
+
clearTimeout(session.autoTitleLongRunningTimer);
|
|
2233
|
+
session.autoTitleLongRunningTimer = null;
|
|
2234
|
+
}
|
|
2235
|
+
function maybeScheduleLongRunningAutoTitle(sessionId, session) {
|
|
2236
|
+
if (session.autoTitleLongRunningTimer !== null || session.autoTitleGeneratedMidTurn)
|
|
2237
|
+
return;
|
|
2238
|
+
const agent = session.agent;
|
|
2239
|
+
if (!agent || !getAutoRenameAgentsSetting().includes(agent.slug))
|
|
2240
|
+
return;
|
|
2241
|
+
const phase = session.agentSession?.status;
|
|
2242
|
+
if (phase === 'done' || phase === 'idle')
|
|
2243
|
+
return;
|
|
2244
|
+
const record = globalSessionState.sessions.find((item) => item.backendSessionId === sessionId);
|
|
2245
|
+
if (!record || record.autoTitle || record.customName === true)
|
|
2246
|
+
return;
|
|
2247
|
+
if (!hasSubstantiveAutoTitleContext(session.autoTitleContext))
|
|
2248
|
+
return;
|
|
2249
|
+
session.autoTitleLongRunningTimer = setTimeout(() => {
|
|
2250
|
+
session.autoTitleLongRunningTimer = null;
|
|
2251
|
+
const liveSession = terminalSessions.get(sessionId);
|
|
2252
|
+
if (liveSession !== session || liveSession.agent?.slug !== agent.slug)
|
|
2253
|
+
return;
|
|
2254
|
+
const phase = liveSession.agentSession?.status;
|
|
2255
|
+
if (phase === 'done' || phase === 'idle')
|
|
2256
|
+
return;
|
|
2257
|
+
const current = globalSessionState.sessions.find((item) => item.backendSessionId === sessionId);
|
|
2258
|
+
if (!current || current.autoTitle || current.customName === true)
|
|
2259
|
+
return;
|
|
2260
|
+
void maybeAutoRenameSession(sessionId, agent, liveSession.autoTitleContext).then((generated) => {
|
|
2261
|
+
if (!generated || terminalSessions.get(sessionId) !== liveSession)
|
|
2262
|
+
return;
|
|
2263
|
+
const completedWhileNaming = liveSession.agentSession?.status === 'done'
|
|
2264
|
+
|| liveSession.agentSession?.status === 'idle';
|
|
2265
|
+
if (completedWhileNaming) {
|
|
2266
|
+
void maybeAutoRenameSession(sessionId, agent, liveSession.autoTitleContext, { forceReevaluation: true });
|
|
2267
|
+
return;
|
|
2268
|
+
}
|
|
2269
|
+
liveSession.autoTitleGeneratedMidTurn = true;
|
|
2270
|
+
});
|
|
2271
|
+
}, AUTO_TITLE_LONG_RUNNING_DELAY_MS);
|
|
2272
|
+
session.autoTitleLongRunningTimer.unref?.();
|
|
2273
|
+
}
|
|
2226
2274
|
/** Status → indicator glyph. Colors stay client-side (CSS theme vars) so
|
|
2227
2275
|
* dark/light themes render correctly; the wire carries semantics only. */
|
|
2228
2276
|
const AGENT_STATUS_INDICATOR = {
|
|
@@ -2407,6 +2455,8 @@ function applyAgentSignals(sessionId, session, events, notification) {
|
|
|
2407
2455
|
?? globalSessionState.sessions.find((item) => item.backendSessionId === sessionId)?.agentResume?.sessionId
|
|
2408
2456
|
?? null;
|
|
2409
2457
|
if (event.kind === 'session-start' && isNewAgentSessionId(previousNativeSessionId, event.sessionId)) {
|
|
2458
|
+
cancelLongRunningAutoTitle(session);
|
|
2459
|
+
session.autoTitleGeneratedMidTurn = false;
|
|
2410
2460
|
clearAutoTitleForNewAgentSession(sessionId, session);
|
|
2411
2461
|
}
|
|
2412
2462
|
if (event.kind === 'prompt-submit') {
|
|
@@ -2420,8 +2470,12 @@ function applyAgentSignals(sessionId, session, events, notification) {
|
|
|
2420
2470
|
}
|
|
2421
2471
|
applyAgentEvent(state, event);
|
|
2422
2472
|
if (event.kind === 'stop') {
|
|
2473
|
+
cancelLongRunningAutoTitle(session);
|
|
2423
2474
|
completedTurnAgent = event.agent ?? session.agent;
|
|
2424
2475
|
}
|
|
2476
|
+
if (event.kind === 'session-end') {
|
|
2477
|
+
cancelLongRunningAutoTitle(session);
|
|
2478
|
+
}
|
|
2425
2479
|
if (event.kind === 'session-start' || event.kind === 'session-end' || event.kind === 'stop') {
|
|
2426
2480
|
persistAgentResumeBinding(sessionId, session);
|
|
2427
2481
|
}
|
|
@@ -2455,9 +2509,11 @@ function applyAgentSignals(sessionId, session, events, notification) {
|
|
|
2455
2509
|
broadcastAgentStatus(sessionId, session, identityChanged);
|
|
2456
2510
|
if (completedTurnAgent) {
|
|
2457
2511
|
const agent = completedTurnAgent;
|
|
2512
|
+
const forceReevaluation = session.autoTitleGeneratedMidTurn;
|
|
2513
|
+
session.autoTitleGeneratedMidTurn = false;
|
|
2458
2514
|
// Let the current PTY chunk reach the rolling context before reading it.
|
|
2459
2515
|
setTimeout(() => {
|
|
2460
|
-
void maybeAutoRenameSession(sessionId, agent, session.autoTitleContext);
|
|
2516
|
+
void maybeAutoRenameSession(sessionId, agent, session.autoTitleContext, { forceReevaluation });
|
|
2461
2517
|
}, 250).unref?.();
|
|
2462
2518
|
}
|
|
2463
2519
|
}
|
|
@@ -3300,6 +3356,7 @@ function cleanupSession(sessionId, options) {
|
|
|
3300
3356
|
}
|
|
3301
3357
|
session.dataDisposable?.dispose();
|
|
3302
3358
|
session.exitDisposable?.dispose();
|
|
3359
|
+
cancelLongRunningAutoTitle(session);
|
|
3303
3360
|
lastAgentStatusSnapshots.delete(sessionId);
|
|
3304
3361
|
lastGitStatusSnapshots.delete(sessionId);
|
|
3305
3362
|
destroyTmuxControl(session.tmuxControl);
|
|
@@ -3631,6 +3688,7 @@ function processSessionOutput(sessionId, session, data, opts) {
|
|
|
3631
3688
|
catch { /* sniff failure should never block data */ }
|
|
3632
3689
|
if (opts.broadcast) {
|
|
3633
3690
|
appendAutoTitleContext(session, data);
|
|
3691
|
+
maybeScheduleLongRunningAutoTitle(sessionId, session);
|
|
3634
3692
|
broadcastEvent(sessionId, seq !== undefined ? { type: 'data', data, seq } : { type: 'data', data });
|
|
3635
3693
|
}
|
|
3636
3694
|
}
|
|
@@ -3802,6 +3860,8 @@ async function spawnTerminalSession(req, input) {
|
|
|
3802
3860
|
agent: null,
|
|
3803
3861
|
agentSession: null,
|
|
3804
3862
|
autoTitleContext: '',
|
|
3863
|
+
autoTitleLongRunningTimer: null,
|
|
3864
|
+
autoTitleGeneratedMidTurn: false,
|
|
3805
3865
|
lastAgentReviewed: null,
|
|
3806
3866
|
agentLeftAt: null,
|
|
3807
3867
|
gitStatus: null,
|
|
@@ -3884,6 +3944,8 @@ async function adoptPtyHostSessions() {
|
|
|
3884
3944
|
agent: null,
|
|
3885
3945
|
agentSession: null,
|
|
3886
3946
|
autoTitleContext: '',
|
|
3947
|
+
autoTitleLongRunningTimer: null,
|
|
3948
|
+
autoTitleGeneratedMidTurn: false,
|
|
3887
3949
|
lastAgentReviewed: null,
|
|
3888
3950
|
agentLeftAt: null,
|
|
3889
3951
|
gitStatus: null,
|
|
@@ -4429,6 +4491,7 @@ async function getSettingsPayload() {
|
|
|
4429
4491
|
autoRenameNamer: getAutoRenameNamerSetting(),
|
|
4430
4492
|
autoRenameModels: getAutoRenameModelsSetting(),
|
|
4431
4493
|
autoRenameIntervalMinutes: getAutoRenameIntervalMinutesSetting(),
|
|
4494
|
+
autoRenamePromptPreference: getAutoRenamePromptPreferenceSetting(),
|
|
4432
4495
|
localAccess: {
|
|
4433
4496
|
...localAccess,
|
|
4434
4497
|
interfaces,
|
|
@@ -4517,6 +4580,9 @@ router.put('/settings', async (req, res) => {
|
|
|
4517
4580
|
&& body.autoRenameIntervalMinutes <= 1440) {
|
|
4518
4581
|
setAutoRenameIntervalMinutesSetting(body.autoRenameIntervalMinutes);
|
|
4519
4582
|
}
|
|
4583
|
+
if (typeof body.autoRenamePromptPreference === 'string' && body.autoRenamePromptPreference.length <= 2000) {
|
|
4584
|
+
setAutoRenamePromptPreferenceSetting(body.autoRenamePromptPreference);
|
|
4585
|
+
}
|
|
4520
4586
|
if (body.localAccess && typeof body.localAccess === 'object') {
|
|
4521
4587
|
const localAccessBody = body.localAccess;
|
|
4522
4588
|
if (localAccessBody.reset === true) {
|
|
@@ -85,6 +85,9 @@ function normalizeSettings(value) {
|
|
|
85
85
|
&& raw.autoRenameIntervalMinutes <= 1440
|
|
86
86
|
? raw.autoRenameIntervalMinutes
|
|
87
87
|
: 10,
|
|
88
|
+
autoRenamePromptPreference: typeof raw.autoRenamePromptPreference === 'string'
|
|
89
|
+
? raw.autoRenamePromptPreference.trim().slice(0, 2000)
|
|
90
|
+
: '',
|
|
88
91
|
updatedAt: typeof raw.updatedAt === 'number' ? raw.updatedAt : Date.now(),
|
|
89
92
|
};
|
|
90
93
|
}
|
|
@@ -232,6 +235,14 @@ export function setAutoRenameIntervalMinutesSetting(minutes) {
|
|
|
232
235
|
settings.autoRenameIntervalMinutes = Math.max(5, Math.min(1440, Math.round(minutes)));
|
|
233
236
|
});
|
|
234
237
|
}
|
|
238
|
+
export function getAutoRenamePromptPreferenceSetting() {
|
|
239
|
+
return loadSettings().autoRenamePromptPreference;
|
|
240
|
+
}
|
|
241
|
+
export function setAutoRenamePromptPreferenceSetting(preference) {
|
|
242
|
+
return updateSettings((settings) => {
|
|
243
|
+
settings.autoRenamePromptPreference = preference.trim().slice(0, 2000);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
235
246
|
export function setAutoRenameModelsSetting(models) {
|
|
236
247
|
return updateSettings((settings) => {
|
|
237
248
|
settings.autoRenameModels = Object.fromEntries(Object.entries(models)
|
package/package.json
CHANGED
package/runtime-manifest.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "termdock",
|
|
4
|
-
"version": "1.4.
|
|
4
|
+
"version": "1.4.77",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-HxC6p3b4kFesefw+vmNYJtPtdIKJaZR1jFNb7DRJqjU=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-7ZHVVvi3v7iGa1TX0wCJrBryKQHVBvLBeyAMp5HX+Cw=",
|
|
10
10
|
"entrypoint": "dist/server/cli.js",
|
|
11
11
|
"clientEntrypoint": "dist/client/index.html"
|
|
12
12
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-BPmN3s0O.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-V7JOEXUC-B43bfTin.js";import{b as i}from"./mermaid.core-BPmN3s0O.js";import"./chunk-5VM5RSS4-CkFCVM93.js";import"./chunk-XXDRQBXY-BrlHgkck.js";import"./chunk-VR4S4FIN-CD4WRjxv.js";import"./chunk-32BRIVSS-DBskyu-m.js";import"./purify.es-CC4Brkr_.js";import"./index-CB7j58QZ.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as t,C as e}from"./chunk-V7JOEXUC-B43bfTin.js";import{b as i}from"./mermaid.core-BPmN3s0O.js";import"./chunk-5VM5RSS4-CkFCVM93.js";import"./chunk-XXDRQBXY-BrlHgkck.js";import"./chunk-VR4S4FIN-CD4WRjxv.js";import"./chunk-32BRIVSS-DBskyu-m.js";import"./purify.es-CC4Brkr_.js";import"./index-CB7j58QZ.js";import"./react-XDCjal2T.js";import"./dnd-BCFAPC0L.js";import"./terminal-C7X98Amf.js";var g={parser:t,get db(){return new e},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{g as diagram};
|