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.
Files changed (73) hide show
  1. package/dist/client/assets/{ModelPreview-CgadwE-X.js → ModelPreview-MUquuQ7M.js} +1 -1
  2. package/dist/client/assets/{abnfDiagram-VRR7QNED-BwzoWS84.js → abnfDiagram-VRR7QNED-bSAQDoRq.js} +1 -1
  3. package/dist/client/assets/{arc-BSXeDTtT.js → arc-CRXZasqt.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-CiktZAdt.js → architectureDiagram-ZJ3FMSHR-B5lW2XVL.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-677ZJIJ3-CcO7Gv0u.js → blockDiagram-677ZJIJ3-BnvUlbML.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-LMCZKHZV-DqSBXIs2.js → c4Diagram-LMCZKHZV-Dh43i8Od.js} +1 -1
  7. package/dist/client/assets/channel-Bm8opuca.js +1 -0
  8. package/dist/client/assets/{chunk-2Q5K7J3B-RGQqr7Wd.js → chunk-2Q5K7J3B-Br9F2z9G.js} +1 -1
  9. package/dist/client/assets/{chunk-32BRIVSS-DBskyu-m.js → chunk-32BRIVSS-CR_BEEo8.js} +1 -1
  10. package/dist/client/assets/{chunk-5VM5RSS4-CkFCVM93.js → chunk-5VM5RSS4-RSFWgHJK.js} +1 -1
  11. package/dist/client/assets/{chunk-EX3LRPZG-DpOkJyEK.js → chunk-EX3LRPZG-BojU9tp1.js} +1 -1
  12. package/dist/client/assets/{chunk-JWPE2WC7-D7tvMM1y.js → chunk-JWPE2WC7-Da5LKO28.js} +1 -1
  13. package/dist/client/assets/{chunk-MOJQB5TN-Bux1LkUq.js → chunk-MOJQB5TN-CnH9HN8z.js} +1 -1
  14. package/dist/client/assets/{chunk-RYQCIY6F-5i4ikiym.js → chunk-RYQCIY6F-OAjuTT8n.js} +1 -1
  15. package/dist/client/assets/{chunk-V7JOEXUC-B43bfTin.js → chunk-V7JOEXUC-BeH2Mdv7.js} +1 -1
  16. package/dist/client/assets/{chunk-VR4S4FIN-CD4WRjxv.js → chunk-VR4S4FIN-BK51NinF.js} +1 -1
  17. package/dist/client/assets/{chunk-XXDRQBXY-BrlHgkck.js → chunk-XXDRQBXY-Df-77sm7.js} +1 -1
  18. package/dist/client/assets/classDiagram-OUVF2IWQ-eErPtGt5.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-EOCWNBFH-eErPtGt5.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-JH36ORCC-Lvvlk7-a.js → cose-bilkent-JH36ORCC-C-FtawL2.js} +1 -1
  21. package/dist/client/assets/{cynefin-VYW2F7L2-9R5HIkEY.js → cynefin-VYW2F7L2-O7CaDQi8.js} +1 -1
  22. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-CXZG1iZX.js → cynefinDiagram-TSTJHNR4-B0fJizeX.js} +1 -1
  23. package/dist/client/assets/{dagre-VKFMJZFB-BfwBKO-b.js → dagre-VKFMJZFB-BsIwc1IF.js} +1 -1
  24. package/dist/client/assets/{diagram-FQU43EPY-PCnnSXdy.js → diagram-FQU43EPY-GDwMRBsa.js} +1 -1
  25. package/dist/client/assets/{diagram-G47NLZAW-BKrDfn5t.js → diagram-G47NLZAW-Chv4syax.js} +1 -1
  26. package/dist/client/assets/{diagram-NH7WQ7WH-DVmM7ZUm.js → diagram-NH7WQ7WH-Dh1F6AVi.js} +1 -1
  27. package/dist/client/assets/{diagram-OA4YK3LP-B5YZo9wv.js → diagram-OA4YK3LP-CU3z6ul5.js} +1 -1
  28. package/dist/client/assets/{diagram-WEI45ONY-BMSaQpt2.js → diagram-WEI45ONY-CYug818o.js} +1 -1
  29. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-CUUXzNR1.js → ebnfDiagram-CCIWWBDH-zzKMHZmD.js} +1 -1
  30. package/dist/client/assets/{erDiagram-Q63AITRT-Dro29FWF.js → erDiagram-Q63AITRT-4yv9ci2k.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-23GEKE2U--NLPfw_6.js → flowDiagram-23GEKE2U-CJj8uFtp.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BTwHdLRq.js → ganttDiagram-NO4QXBWP-WhZonF-5.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-Dn23E-JS.js → gitGraphDiagram-IHSO6WYX-DCmdLenS.js} +1 -1
  34. package/dist/client/assets/index-DnOydypX.css +1 -0
  35. package/dist/client/assets/index-ILJW_1zc.js +451 -0
  36. package/dist/client/assets/{infoDiagram-FWYZ7A6U-DbngRn-9.js → infoDiagram-FWYZ7A6U-0HrqatQe.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-CvbaO0Ju.js → ishikawaDiagram-FXEZZL3T-DCPrrLNa.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-5HDEW3XC-DTxptbBV.js → journeyDiagram-5HDEW3XC-CY0RHb4b.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-HUTT4EX6-CXaGI_k2.js → kanban-definition-HUTT4EX6-DcH2OBHS.js} +1 -1
  40. package/dist/client/assets/{linear-B0GEZWeO.js → linear-BidTRUFO.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-BPmN3s0O.js → mermaid.core-BomIvgGf.js} +4 -4
  42. package/dist/client/assets/{mindmap-definition-LN4V7U3C-BaDOqGJ0.js → mindmap-definition-LN4V7U3C-BVbGSAMP.js} +1 -1
  43. package/dist/client/assets/{pegDiagram-2B236MQR-CQk8hRGW.js → pegDiagram-2B236MQR-BPDcfuXr.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-ENE6RG2P-CO-EGZwN.js → pieDiagram-ENE6RG2P-BEl37TgF.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-BTIXISZS.js → quadrantDiagram-ABIIQ3AL-B4Jexgtq.js} +1 -1
  46. package/dist/client/assets/{railroadDiagram-RFXS5EU6-Bb_SaJhp.js → railroadDiagram-RFXS5EU6-DCf5cVwA.js} +1 -1
  47. package/dist/client/assets/{requirementDiagram-TGXJPOKE-BCZbXuhF.js → requirementDiagram-TGXJPOKE-Dutz-kps.js} +1 -1
  48. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-J7wtByga.js → sankeyDiagram-HTMAVEWB-C5B7Px5r.js} +1 -1
  49. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-DX18koCe.js → sequenceDiagram-DBY2YBRQ-BAjlNtX7.js} +1 -1
  50. package/dist/client/assets/{sizeCapture-X5ZJPWSS-Ckw-HC0v.js → sizeCapture-X5ZJPWSS-DxHVj2nI.js} +1 -1
  51. package/dist/client/assets/{stateDiagram-2N3HPSRC-CsWwRc8Z.js → stateDiagram-2N3HPSRC-h0J5lN0m.js} +1 -1
  52. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CtfvvrUK.js +1 -0
  53. package/dist/client/assets/{swimlanes-5IMT3BWC-C-9fnG6s.js → swimlanes-5IMT3BWC-BVPnl0Ka.js} +2 -2
  54. package/dist/client/assets/swimlanesDiagram-G3AALYLV-CLhM0GwF.js +8 -0
  55. package/dist/client/assets/{timeline-definition-FHXFAJF6-RR6aJx9T.js → timeline-definition-FHXFAJF6-Cn5XtHKy.js} +1 -1
  56. package/dist/client/assets/{vennDiagram-L72KCM5P-Bq70NfzM.js → vennDiagram-L72KCM5P-CwBsi2Gg.js} +1 -1
  57. package/dist/client/assets/{wardleyDiagram-EHGQE667-BExg805C.js → wardleyDiagram-EHGQE667-CZMtiWJm.js} +1 -1
  58. package/dist/client/assets/{xychartDiagram-FW5EYKEG-CAuIXNf1.js → xychartDiagram-FW5EYKEG-uGw9wOMW.js} +1 -1
  59. package/dist/client/index.html +2 -2
  60. package/dist/client/sw.js +1 -1
  61. package/dist/server/agent/autoTitle.js +15 -2
  62. package/dist/server/agent/titleNamerCatalog.js +76 -6
  63. package/dist/server/routes/terminal.js +80 -14
  64. package/dist/server/utils/settings.js +11 -0
  65. package/package.json +1 -1
  66. package/runtime-manifest.json +2 -2
  67. package/dist/client/assets/channel-CaB7X-EF.js +0 -1
  68. package/dist/client/assets/classDiagram-OUVF2IWQ-C_qGVbiI.js +0 -1
  69. package/dist/client/assets/classDiagram-v2-EOCWNBFH-C_qGVbiI.js +0 -1
  70. package/dist/client/assets/index-CB7j58QZ.js +0 -451
  71. package/dist/client/assets/index-DhfIiBLW.css +0 -1
  72. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DwkbQF8P.js +0 -1
  73. 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.75",
3
+ "version": "1.4.77",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "main": ".desktop-dist/main.js",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "packageName": "termdock",
4
- "version": "1.4.75",
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-xzvKVLcvFdBQsk4jGML445ipTKOjQeaGWTmNMudp3p0=",
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};