termdock 1.4.117 → 1.4.119
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-W7h96fo0.js → ModelPreview-6FgWt8IX.js} +1 -1
- package/dist/client/assets/{abnfDiagram-VRR7QNED-Cu52A1NO.js → abnfDiagram-VRR7QNED-C2QyQJ9F.js} +1 -1
- package/dist/client/assets/{arc-DhoedXrI.js → arc-iJl6Z0rl.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-D1HNxzqT.js → architectureDiagram-ZJ3FMSHR-B4CIf1XF.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-K3SQqeJd.js → blockDiagram-677ZJIJ3-DWWPStAh.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-MjfFtzxZ.js → c4Diagram-LMCZKHZV-B5tpwNht.js} +1 -1
- package/dist/client/assets/channel-uJbcbxEo.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Dw03ECAr.js → chunk-2Q5K7J3B-DObcmwOX.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-BNUkaz_y.js → chunk-32BRIVSS-Bw06pI_4.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-CqVqdapS.js → chunk-5VM5RSS4-JEgkxONV.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-BdcsV65P.js → chunk-EX3LRPZG-B69eFkKW.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-eaQCNWA9.js → chunk-JWPE2WC7-DYpho4KG.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-DuuCWE4b.js → chunk-MOJQB5TN-BbghBTgh.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-BV4zVsjA.js → chunk-RYQCIY6F-P6Wodw29.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-CgCvJDfW.js → chunk-V7JOEXUC-BG6B5RQU.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-BfPxfJ9d.js → chunk-VR4S4FIN-CmBwOywp.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-C64rSk_7.js → chunk-XXDRQBXY-ejYnTSZf.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-By0eEdpV.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-By0eEdpV.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-B5xp7AU3.js → cose-bilkent-JH36ORCC-Cxpor7NH.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-Dw5bR5WD.js → cynefin-VYW2F7L2-BsE69dfO.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-CeFANBHD.js → cynefinDiagram-TSTJHNR4-DIQr4U6B.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-CmPKCEuD.js → dagre-VKFMJZFB-sr8aazoR.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-Cpjl_IB3.js → diagram-FQU43EPY-xj-gNfbi.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-DaX4bvHs.js → diagram-G47NLZAW-CW4ZP_gS.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-YRncSc2p.js → diagram-NH7WQ7WH-BHNnRWoH.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-DRTRPkJu.js → diagram-OA4YK3LP-BwrIj-Al.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-bjvZGWud.js → diagram-WEI45ONY-BUWxEtEa.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-wqqFnfp_.js → ebnfDiagram-CCIWWBDH-ByqWwTZ3.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-C2pUy9lp.js → erDiagram-Q63AITRT-CHzYiy1H.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-8d0Ji6fZ.js → flowDiagram-23GEKE2U-CRS9Yclw.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-CxJ8EsFf.js → ganttDiagram-NO4QXBWP-CJhX6Y5z.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-DakFTpAa.js → gitGraphDiagram-IHSO6WYX-B-iKd6O5.js} +1 -1
- package/dist/client/assets/index-CNzYLEOc.js +457 -0
- package/dist/client/assets/index-UhZwBu7l.css +1 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-vb3vXhZo.js → infoDiagram-FWYZ7A6U-Cwfv2g5L.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-D0YW_NSE.js → ishikawaDiagram-FXEZZL3T-D0wqu-TN.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-6Vq1kXPA.js → journeyDiagram-5HDEW3XC-DnB32Wtt.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-megxRFUG.js → kanban-definition-HUTT4EX6-CgmqFP3L.js} +1 -1
- package/dist/client/assets/{linear-c9CEw62L.js → linear-BsHsyXou.js} +1 -1
- package/dist/client/assets/{mermaid.core-CA8slCHp.js → mermaid.core-Cd5etby6.js} +4 -4
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-Dt1TLZwX.js → mindmap-definition-LN4V7U3C-C49mJuNO.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-5ncHGh8h.js → pegDiagram-2B236MQR-DC3hpFeg.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-DyJnLtRW.js → pieDiagram-ENE6RG2P-CuCHUeEN.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-CSBSlSdx.js → quadrantDiagram-ABIIQ3AL-BFbvIq3M.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-BPuFl7M7.js → railroadDiagram-RFXS5EU6-5UH2vO71.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-6B48kqoE.js → requirementDiagram-TGXJPOKE-i7w0tnzq.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-CItpWYSq.js → sankeyDiagram-HTMAVEWB-CdJHakqP.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-COTh45K2.js → sequenceDiagram-DBY2YBRQ-DXZL-d3R.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-DdJ_uDyl.js → sizeCapture-X5ZJPWSS-CebVoLf1.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-Cs_fzGQx.js → stateDiagram-2N3HPSRC-C_W_t_jG.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DYldoJoy.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-ACA0ApQZ.js → swimlanes-5IMT3BWC-Bh92iW-e.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-BBQoxysd.js +8 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-DV2RVj3K.js → timeline-definition-FHXFAJF6-B73cyhmT.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-CWby1zJt.js → vennDiagram-L72KCM5P-BTcXiYmJ.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-DfydZGpy.js → wardleyDiagram-EHGQE667-D3gKXQ8G.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-CYrgADfb.js → xychartDiagram-FW5EYKEG-CVt025qS.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/agent/collaborationPrompt.js +51 -0
- package/dist/server/cli.js +89 -2
- package/dist/server/routes/terminal.js +118 -19
- package/package.json +1 -1
- package/runtime-manifest.json +2 -2
- package/dist/client/assets/channel-Dh-rQuvK.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-aSOSNXz9.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-aSOSNXz9.js +0 -1
- package/dist/client/assets/index-CpRY32uJ.js +0 -457
- package/dist/client/assets/index-CsZ9UjAY.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-rftSyqMa.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-7TuR3Wm7.js +0 -8
|
@@ -26,6 +26,7 @@ import { AgentResumeHistoryStore } from '../agent/resumeHistory.js';
|
|
|
26
26
|
import { AutomationStore, normalizeAutomationSchedule } from '../agent/automationStore.js';
|
|
27
27
|
import { buildBracketedSubmitBytes, canDeliverPromptToAgent } from '../agent/promptDelivery.js';
|
|
28
28
|
import { CollaborationStore } from '../agent/collaborationStore.js';
|
|
29
|
+
import { formatCollaborationDelivery } from '../agent/collaborationPrompt.js';
|
|
29
30
|
import { SessionSearchStore } from '../agent/sessionSearchStore.js';
|
|
30
31
|
import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
|
|
31
32
|
import { loadPlugins, savePlugin, removePlugin, readPluginIcon, validateManifest, } from '../agent/plugins.js';
|
|
@@ -1303,9 +1304,6 @@ async function runAgentAutomation(automation, req) {
|
|
|
1303
1304
|
throw error;
|
|
1304
1305
|
}
|
|
1305
1306
|
}
|
|
1306
|
-
function collaborationMessageLabel(kind) {
|
|
1307
|
-
return { message: '消息', ask: '问题', reply: '回复', task: '任务', handoff: '交接', done: '完成' }[kind];
|
|
1308
|
-
}
|
|
1309
1307
|
function resolveFrontendSessionId(input) {
|
|
1310
1308
|
const sessionId = typeof input.sessionId === 'string' ? input.sessionId.trim() : '';
|
|
1311
1309
|
if (sessionId && globalSessionState.sessions.some((record) => record.sessionId === sessionId))
|
|
@@ -1319,17 +1317,6 @@ function resolveFrontendSessionId(input) {
|
|
|
1319
1317
|
const tmuxSessionName = typeof input.tmuxSessionName === 'string' ? input.tmuxSessionName.trim() : '';
|
|
1320
1318
|
return globalSessionState.sessions.find((record) => record.tmuxSessionName === tmuxSessionName)?.sessionId ?? null;
|
|
1321
1319
|
}
|
|
1322
|
-
function formatCollaborationDelivery(targetSessionId, messages) {
|
|
1323
|
-
const targetGroups = new Map(collaborationStore.groupsForSession(targetSessionId).map((group) => [group.id, group]));
|
|
1324
|
-
const lines = messages.map((message) => {
|
|
1325
|
-
const from = message.fromSessionId
|
|
1326
|
-
? globalSessionState.sessions.find((record) => record.sessionId === message.fromSessionId)?.name ?? message.fromSessionId
|
|
1327
|
-
: '用户';
|
|
1328
|
-
const group = targetGroups.get(message.groupId)?.name ?? '协作组';
|
|
1329
|
-
return `- [${collaborationMessageLabel(message.kind)} #${message.id}] ${from} → ${group}: ${message.content}`;
|
|
1330
|
-
});
|
|
1331
|
-
return `[Termdock 协作收件箱]\n${lines.join('\n')}\n请处理这些消息。需要回复时运行:td collab reply <消息ID> "回复内容";查看成员和未读消息运行:td collab status / td collab inbox。`;
|
|
1332
|
-
}
|
|
1333
1320
|
function tryDeliverCollaborationInbox(frontendSessionId) {
|
|
1334
1321
|
const record = globalSessionState.sessions.find((candidate) => candidate.sessionId === frontendSessionId);
|
|
1335
1322
|
const session = record?.backendSessionId ? terminalSessions.get(record.backendSessionId) : null;
|
|
@@ -1339,10 +1326,60 @@ function tryDeliverCollaborationInbox(frontendSessionId) {
|
|
|
1339
1326
|
if (!session || !canDeliverPromptToAgent(session) || pending.length === 0) {
|
|
1340
1327
|
return { delivered: [], pending: pending.length };
|
|
1341
1328
|
}
|
|
1342
|
-
|
|
1329
|
+
const prompt = formatCollaborationDelivery({
|
|
1330
|
+
targetSessionId: frontendSessionId,
|
|
1331
|
+
messages: pending,
|
|
1332
|
+
groups: collaborationStore.groupsForSession(frontendSessionId),
|
|
1333
|
+
sessions: globalSessionState.sessions.map((candidate) => {
|
|
1334
|
+
const snapshot = orchestrationSessionSnapshot(candidate);
|
|
1335
|
+
return { sessionId: snapshot.sessionId, name: snapshot.name, status: snapshot.status };
|
|
1336
|
+
}),
|
|
1337
|
+
});
|
|
1338
|
+
session.ptyProcess.write(buildBracketedSubmitBytes(prompt));
|
|
1343
1339
|
collaborationStore.markDelivered(pending.map((message) => message.id));
|
|
1344
1340
|
return { delivered: pending.map((message) => message.id), pending: 0 };
|
|
1345
1341
|
}
|
|
1342
|
+
async function spawnCollaborationAgentSession(req, group, sourceSessionId, input) {
|
|
1343
|
+
const agentSlug = typeof input.agentSlug === 'string' ? input.agentSlug.trim().toLowerCase() : '';
|
|
1344
|
+
const launchers = await listDetectedAgentLaunchers();
|
|
1345
|
+
const launcher = launchers.find((candidate) => candidate.slug === agentSlug);
|
|
1346
|
+
if (!launcher)
|
|
1347
|
+
throw new HttpStatusError(400, '所选 Agent 当前不可用', 'COLLAB_AGENT_UNAVAILABLE');
|
|
1348
|
+
const sourceRecord = sourceSessionId
|
|
1349
|
+
? globalSessionState.sessions.find((candidate) => candidate.sessionId === sourceSessionId)
|
|
1350
|
+
: null;
|
|
1351
|
+
const fallbackRecord = sourceRecord
|
|
1352
|
+
?? globalSessionState.sessions.find((candidate) => group.sessionIds.includes(candidate.sessionId))
|
|
1353
|
+
?? null;
|
|
1354
|
+
const requestedName = typeof input.name === 'string' ? input.name.trim().slice(0, 120) : '';
|
|
1355
|
+
const requestedCwd = typeof input.cwd === 'string' ? input.cwd.trim() : '';
|
|
1356
|
+
const opened = await openInventorySession(req, {
|
|
1357
|
+
name: requestedName || `${launcher.displayName} · ${group.name}`,
|
|
1358
|
+
customName: true,
|
|
1359
|
+
mode: 'shell',
|
|
1360
|
+
cwd: requestedCwd || fallbackRecord?.cwd || undefined,
|
|
1361
|
+
});
|
|
1362
|
+
const frontendSessionId = opened.session.sessionId;
|
|
1363
|
+
const backend = terminalSessions.get(opened.terminalSession.sessionId);
|
|
1364
|
+
if (!backend)
|
|
1365
|
+
throw new HttpStatusError(500, 'Agent Session 创建失败', 'COLLAB_AGENT_SESSION_FAILED');
|
|
1366
|
+
const updatedGroup = collaborationStore.save({
|
|
1367
|
+
id: group.id,
|
|
1368
|
+
name: group.name,
|
|
1369
|
+
sessionIds: [...group.sessionIds, frontendSessionId],
|
|
1370
|
+
});
|
|
1371
|
+
writeTerminalInput(backend, `${launcher.command}\r`);
|
|
1372
|
+
const requestedTask = typeof input.task === 'string' ? input.task.trim().slice(0, 20_000) : '';
|
|
1373
|
+
collaborationStore.send({
|
|
1374
|
+
groupId: updatedGroup.id,
|
|
1375
|
+
fromSessionId: sourceSessionId,
|
|
1376
|
+
toSessionIds: [frontendSessionId],
|
|
1377
|
+
kind: 'handoff',
|
|
1378
|
+
content: requestedTask || `你已创建并加入协作组“${updatedGroup.name}”。请运行 td collab status 查看成员,并准备参与协作。`,
|
|
1379
|
+
});
|
|
1380
|
+
setTimeout(() => tryDeliverCollaborationInbox(frontendSessionId), 300).unref?.();
|
|
1381
|
+
return { group: updatedGroup, session: orchestrationSessionSnapshot(globalSessionState.sessions.find((candidate) => candidate.sessionId === frontendSessionId)) };
|
|
1382
|
+
}
|
|
1346
1383
|
function getTmuxBinary() {
|
|
1347
1384
|
if (process.env.TMUX_BIN)
|
|
1348
1385
|
return process.env.TMUX_BIN;
|
|
@@ -5108,6 +5145,19 @@ router.post('/operations/collaboration-groups', (req, res) => {
|
|
|
5108
5145
|
});
|
|
5109
5146
|
res.json({ group });
|
|
5110
5147
|
});
|
|
5148
|
+
router.post('/operations/collaboration-groups/:groupId/spawn', async (req, res) => {
|
|
5149
|
+
const group = collaborationStore.getGroup(req.params.groupId);
|
|
5150
|
+
if (!group)
|
|
5151
|
+
return res.status(404).json({ error: '协作组不存在' });
|
|
5152
|
+
try {
|
|
5153
|
+
res.json(await spawnCollaborationAgentSession(req, group, null, req.body ?? {}));
|
|
5154
|
+
}
|
|
5155
|
+
catch (error) {
|
|
5156
|
+
if (error instanceof HttpStatusError)
|
|
5157
|
+
return res.status(error.statusCode).json({ error: error.message, code: error.code });
|
|
5158
|
+
res.status(400).json({ error: getErrorMessage(error) });
|
|
5159
|
+
}
|
|
5160
|
+
});
|
|
5111
5161
|
router.delete('/operations/collaboration-groups/:groupId', (req, res) => {
|
|
5112
5162
|
if (!collaborationStore.remove(req.params.groupId))
|
|
5113
5163
|
return res.status(404).json({ error: '协作组不存在' });
|
|
@@ -5152,14 +5202,60 @@ router.post('/operations/collaboration-groups/:groupId/messages', (req, res) =>
|
|
|
5152
5202
|
res.status(400).json({ error: getErrorMessage(error) });
|
|
5153
5203
|
}
|
|
5154
5204
|
});
|
|
5155
|
-
router.get('/operations/orchestration/peers', (req, res) => {
|
|
5205
|
+
router.get('/operations/orchestration/peers', async (req, res) => {
|
|
5156
5206
|
const sourceSessionId = resolveFrontendSessionId(req.query);
|
|
5157
5207
|
const source = globalSessionState.sessions.find((candidate) => candidate.sessionId === sourceSessionId);
|
|
5158
5208
|
if (!source)
|
|
5159
5209
|
return res.status(404).json({ error: '会话不存在' });
|
|
5160
5210
|
const groups = collaborationStore.groupsForSession(source.sessionId);
|
|
5161
5211
|
const peerIds = new Set(groups.flatMap((group) => group.sessionIds).filter((id) => id !== source.sessionId));
|
|
5162
|
-
res.json({
|
|
5212
|
+
res.json({
|
|
5213
|
+
source: orchestrationSessionSnapshot(source),
|
|
5214
|
+
groups,
|
|
5215
|
+
peers: globalSessionState.sessions.filter((record) => peerIds.has(record.sessionId)).map(orchestrationSessionSnapshot),
|
|
5216
|
+
sessions: globalSessionState.sessions.map(orchestrationSessionSnapshot),
|
|
5217
|
+
agents: await listDetectedAgentLaunchers(),
|
|
5218
|
+
});
|
|
5219
|
+
});
|
|
5220
|
+
router.post('/operations/orchestration/members', (req, res) => {
|
|
5221
|
+
const sourceSessionId = resolveFrontendSessionId(req.body ?? {});
|
|
5222
|
+
const groupId = typeof req.body?.groupId === 'string' ? req.body.groupId.trim() : '';
|
|
5223
|
+
const targetSessionId = typeof req.body?.targetSessionId === 'string' ? req.body.targetSessionId.trim() : '';
|
|
5224
|
+
const action = req.body?.action === 'remove' ? 'remove' : req.body?.action === 'add' ? 'add' : null;
|
|
5225
|
+
const group = collaborationStore.getGroup(groupId);
|
|
5226
|
+
if (!sourceSessionId)
|
|
5227
|
+
return res.status(400).json({ error: '无法识别当前会话;请从 Termdock 会话内运行 td collab' });
|
|
5228
|
+
if (!group || !group.sessionIds.includes(sourceSessionId))
|
|
5229
|
+
return res.status(403).json({ error: '当前会话不在该协作组中' });
|
|
5230
|
+
if (!action)
|
|
5231
|
+
return res.status(400).json({ error: '成员操作无效' });
|
|
5232
|
+
if (!globalSessionState.sessions.some((candidate) => candidate.sessionId === targetSessionId)) {
|
|
5233
|
+
return res.status(404).json({ error: '目标会话不存在' });
|
|
5234
|
+
}
|
|
5235
|
+
const nextSessionIds = action === 'add'
|
|
5236
|
+
? Array.from(new Set([...group.sessionIds, targetSessionId]))
|
|
5237
|
+
: group.sessionIds.filter((sessionId) => sessionId !== targetSessionId);
|
|
5238
|
+
if (nextSessionIds.length < 2)
|
|
5239
|
+
return res.status(400).json({ error: '协作组至少需要两个会话' });
|
|
5240
|
+
const updated = collaborationStore.save({ id: group.id, name: group.name, sessionIds: nextSessionIds });
|
|
5241
|
+
res.json({ ok: true, group: updated });
|
|
5242
|
+
});
|
|
5243
|
+
router.post('/operations/orchestration/spawn', async (req, res) => {
|
|
5244
|
+
const sourceSessionId = resolveFrontendSessionId(req.body ?? {});
|
|
5245
|
+
const groupId = typeof req.body?.groupId === 'string' ? req.body.groupId.trim() : '';
|
|
5246
|
+
const group = collaborationStore.getGroup(groupId);
|
|
5247
|
+
if (!sourceSessionId)
|
|
5248
|
+
return res.status(400).json({ error: '无法识别当前会话;请从 Termdock 会话内运行 td collab' });
|
|
5249
|
+
if (!group || !group.sessionIds.includes(sourceSessionId))
|
|
5250
|
+
return res.status(403).json({ error: '当前会话不在该协作组中' });
|
|
5251
|
+
try {
|
|
5252
|
+
res.json({ ok: true, ...await spawnCollaborationAgentSession(req, group, sourceSessionId, req.body ?? {}) });
|
|
5253
|
+
}
|
|
5254
|
+
catch (error) {
|
|
5255
|
+
if (error instanceof HttpStatusError)
|
|
5256
|
+
return res.status(error.statusCode).json({ error: error.message, code: error.code });
|
|
5257
|
+
res.status(400).json({ error: getErrorMessage(error) });
|
|
5258
|
+
}
|
|
5163
5259
|
});
|
|
5164
5260
|
router.post('/operations/orchestration/send', (req, res) => {
|
|
5165
5261
|
const sourceSessionId = resolveFrontendSessionId(req.body ?? {});
|
|
@@ -5626,7 +5722,7 @@ router.put('/context-draft', (req, res) => {
|
|
|
5626
5722
|
router.get('/agent-hooks', async (_req, res) => {
|
|
5627
5723
|
res.json({ agents: await listAllHookAgents() });
|
|
5628
5724
|
});
|
|
5629
|
-
|
|
5725
|
+
async function listDetectedAgentLaunchers() {
|
|
5630
5726
|
const pathEntries = buildAugmentedPath().split(path.delimiter).filter(Boolean);
|
|
5631
5727
|
const executableExtensions = process.platform === 'win32'
|
|
5632
5728
|
? (process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';')
|
|
@@ -5665,7 +5761,10 @@ router.get('/agent-launchers', async (_req, res) => {
|
|
|
5665
5761
|
});
|
|
5666
5762
|
}
|
|
5667
5763
|
}
|
|
5668
|
-
|
|
5764
|
+
return detected;
|
|
5765
|
+
}
|
|
5766
|
+
router.get('/agent-launchers', async (_req, res) => {
|
|
5767
|
+
res.json({ agents: await listDetectedAgentLaunchers() });
|
|
5669
5768
|
});
|
|
5670
5769
|
router.get('/directory-suggestions', async (req, res) => {
|
|
5671
5770
|
const rawQuery = typeof req.query.q === 'string' ? req.query.q.trim() : '';
|
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.119",
|
|
5
5
|
"runtimeProtocolVersion": 1,
|
|
6
6
|
"minimumDesktopVersion": "1.4.46",
|
|
7
7
|
"nodeMajor": 22,
|
|
8
8
|
"dependencyHash": "sha256-3I9X7zF4J4BUYOvxi3lIuWSKfDy6S6GD61w8Ay95Ypw=",
|
|
9
|
-
"serverBundleHash": "sha256-
|
|
9
|
+
"serverBundleHash": "sha256-4DiQ+SQaI4CdpeOrKGu2FVgmff+N4IrL14Dwx+uhwXA=",
|
|
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-CA8slCHp.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-CgCvJDfW.js";import{b as i}from"./mermaid.core-CA8slCHp.js";import"./chunk-5VM5RSS4-CqVqdapS.js";import"./chunk-XXDRQBXY-C64rSk_7.js";import"./chunk-VR4S4FIN-BfPxfJ9d.js";import"./chunk-32BRIVSS-BNUkaz_y.js";import"./purify.es-CC4Brkr_.js";import"./index-CpRY32uJ.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-CgCvJDfW.js";import{b as i}from"./mermaid.core-CA8slCHp.js";import"./chunk-5VM5RSS4-CqVqdapS.js";import"./chunk-XXDRQBXY-C64rSk_7.js";import"./chunk-VR4S4FIN-BfPxfJ9d.js";import"./chunk-32BRIVSS-BNUkaz_y.js";import"./purify.es-CC4Brkr_.js";import"./index-CpRY32uJ.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};
|