termdock 1.4.118 → 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.
Files changed (72) hide show
  1. package/dist/client/assets/{ModelPreview-C0V7UIqw.js → ModelPreview-6FgWt8IX.js} +1 -1
  2. package/dist/client/assets/{abnfDiagram-VRR7QNED-DR00v-C0.js → abnfDiagram-VRR7QNED-C2QyQJ9F.js} +1 -1
  3. package/dist/client/assets/{arc-BWoOFNbA.js → arc-iJl6Z0rl.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-qhIW-Nal.js → architectureDiagram-ZJ3FMSHR-B4CIf1XF.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-677ZJIJ3-D2cWBbzI.js → blockDiagram-677ZJIJ3-DWWPStAh.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-LMCZKHZV-CC7-WYbU.js → c4Diagram-LMCZKHZV-B5tpwNht.js} +1 -1
  7. package/dist/client/assets/channel-uJbcbxEo.js +1 -0
  8. package/dist/client/assets/{chunk-2Q5K7J3B-CitpaTQx.js → chunk-2Q5K7J3B-DObcmwOX.js} +1 -1
  9. package/dist/client/assets/{chunk-32BRIVSS-DaRamqO4.js → chunk-32BRIVSS-Bw06pI_4.js} +1 -1
  10. package/dist/client/assets/{chunk-5VM5RSS4-Pgz0HVzg.js → chunk-5VM5RSS4-JEgkxONV.js} +1 -1
  11. package/dist/client/assets/{chunk-EX3LRPZG-84_pTRwW.js → chunk-EX3LRPZG-B69eFkKW.js} +1 -1
  12. package/dist/client/assets/{chunk-JWPE2WC7-BchpgeDL.js → chunk-JWPE2WC7-DYpho4KG.js} +1 -1
  13. package/dist/client/assets/{chunk-MOJQB5TN-B881nJOJ.js → chunk-MOJQB5TN-BbghBTgh.js} +1 -1
  14. package/dist/client/assets/{chunk-RYQCIY6F-ZBZkwuMa.js → chunk-RYQCIY6F-P6Wodw29.js} +1 -1
  15. package/dist/client/assets/{chunk-V7JOEXUC-DaVzPpHP.js → chunk-V7JOEXUC-BG6B5RQU.js} +1 -1
  16. package/dist/client/assets/{chunk-VR4S4FIN-BX5AcHHt.js → chunk-VR4S4FIN-CmBwOywp.js} +1 -1
  17. package/dist/client/assets/{chunk-XXDRQBXY-BNb5ydf7.js → chunk-XXDRQBXY-ejYnTSZf.js} +1 -1
  18. package/dist/client/assets/classDiagram-OUVF2IWQ-By0eEdpV.js +1 -0
  19. package/dist/client/assets/classDiagram-v2-EOCWNBFH-By0eEdpV.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-JH36ORCC-6m4nKk3t.js → cose-bilkent-JH36ORCC-Cxpor7NH.js} +1 -1
  21. package/dist/client/assets/{cynefin-VYW2F7L2-Le8gZ74w.js → cynefin-VYW2F7L2-BsE69dfO.js} +1 -1
  22. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-D_eshuz_.js → cynefinDiagram-TSTJHNR4-DIQr4U6B.js} +1 -1
  23. package/dist/client/assets/{dagre-VKFMJZFB-BzkDNTi3.js → dagre-VKFMJZFB-sr8aazoR.js} +1 -1
  24. package/dist/client/assets/{diagram-FQU43EPY-C3LRM6Te.js → diagram-FQU43EPY-xj-gNfbi.js} +1 -1
  25. package/dist/client/assets/{diagram-G47NLZAW-6FT-KWwT.js → diagram-G47NLZAW-CW4ZP_gS.js} +1 -1
  26. package/dist/client/assets/{diagram-NH7WQ7WH-D9LUZmAQ.js → diagram-NH7WQ7WH-BHNnRWoH.js} +1 -1
  27. package/dist/client/assets/{diagram-OA4YK3LP-B4-kg3Vx.js → diagram-OA4YK3LP-BwrIj-Al.js} +1 -1
  28. package/dist/client/assets/{diagram-WEI45ONY-DgXnQcsR.js → diagram-WEI45ONY-BUWxEtEa.js} +1 -1
  29. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-ZkQOIgNc.js → ebnfDiagram-CCIWWBDH-ByqWwTZ3.js} +1 -1
  30. package/dist/client/assets/{erDiagram-Q63AITRT-CfCbvQPt.js → erDiagram-Q63AITRT-CHzYiy1H.js} +1 -1
  31. package/dist/client/assets/{flowDiagram-23GEKE2U-Cl47i5oe.js → flowDiagram-23GEKE2U-CRS9Yclw.js} +1 -1
  32. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BxeZej-f.js → ganttDiagram-NO4QXBWP-CJhX6Y5z.js} +1 -1
  33. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-BXfpBtUQ.js → gitGraphDiagram-IHSO6WYX-B-iKd6O5.js} +1 -1
  34. package/dist/client/assets/index-CNzYLEOc.js +457 -0
  35. package/dist/client/assets/index-UhZwBu7l.css +1 -0
  36. package/dist/client/assets/{infoDiagram-FWYZ7A6U-Dkvr-Ms6.js → infoDiagram-FWYZ7A6U-Cwfv2g5L.js} +1 -1
  37. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-Hm-a7JTS.js → ishikawaDiagram-FXEZZL3T-D0wqu-TN.js} +1 -1
  38. package/dist/client/assets/{journeyDiagram-5HDEW3XC-B4rnyYYd.js → journeyDiagram-5HDEW3XC-DnB32Wtt.js} +1 -1
  39. package/dist/client/assets/{kanban-definition-HUTT4EX6-Ct5KJvoE.js → kanban-definition-HUTT4EX6-CgmqFP3L.js} +1 -1
  40. package/dist/client/assets/{linear-nwGt1ndP.js → linear-BsHsyXou.js} +1 -1
  41. package/dist/client/assets/{mermaid.core-BoOnnn4z.js → mermaid.core-Cd5etby6.js} +4 -4
  42. package/dist/client/assets/{mindmap-definition-LN4V7U3C-QBAil61d.js → mindmap-definition-LN4V7U3C-C49mJuNO.js} +1 -1
  43. package/dist/client/assets/{pegDiagram-2B236MQR-DHqFQhIo.js → pegDiagram-2B236MQR-DC3hpFeg.js} +1 -1
  44. package/dist/client/assets/{pieDiagram-ENE6RG2P-zO7LlZFd.js → pieDiagram-ENE6RG2P-CuCHUeEN.js} +1 -1
  45. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-DnMVRGa5.js → quadrantDiagram-ABIIQ3AL-BFbvIq3M.js} +1 -1
  46. package/dist/client/assets/{railroadDiagram-RFXS5EU6-C44spQy6.js → railroadDiagram-RFXS5EU6-5UH2vO71.js} +1 -1
  47. package/dist/client/assets/{requirementDiagram-TGXJPOKE-CZ3ji5rt.js → requirementDiagram-TGXJPOKE-i7w0tnzq.js} +1 -1
  48. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-CJcdagl1.js → sankeyDiagram-HTMAVEWB-CdJHakqP.js} +1 -1
  49. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-Dr-8JSLc.js → sequenceDiagram-DBY2YBRQ-DXZL-d3R.js} +1 -1
  50. package/dist/client/assets/{sizeCapture-X5ZJPWSS-DGcofXhU.js → sizeCapture-X5ZJPWSS-CebVoLf1.js} +1 -1
  51. package/dist/client/assets/{stateDiagram-2N3HPSRC-3MWGZXX3.js → stateDiagram-2N3HPSRC-C_W_t_jG.js} +1 -1
  52. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DYldoJoy.js +1 -0
  53. package/dist/client/assets/{swimlanes-5IMT3BWC-fr2lIJCS.js → swimlanes-5IMT3BWC-Bh92iW-e.js} +2 -2
  54. package/dist/client/assets/swimlanesDiagram-G3AALYLV-BBQoxysd.js +8 -0
  55. package/dist/client/assets/{timeline-definition-FHXFAJF6-exUG0vOT.js → timeline-definition-FHXFAJF6-B73cyhmT.js} +1 -1
  56. package/dist/client/assets/{vennDiagram-L72KCM5P-BvK2gXvL.js → vennDiagram-L72KCM5P-BTcXiYmJ.js} +1 -1
  57. package/dist/client/assets/{wardleyDiagram-EHGQE667-CHAstdN8.js → wardleyDiagram-EHGQE667-D3gKXQ8G.js} +1 -1
  58. package/dist/client/assets/{xychartDiagram-FW5EYKEG-CNu27q2i.js → xychartDiagram-FW5EYKEG-CVt025qS.js} +1 -1
  59. package/dist/client/index.html +2 -2
  60. package/dist/client/sw.js +1 -1
  61. package/dist/server/agent/collaborationPrompt.js +7 -0
  62. package/dist/server/cli.js +89 -2
  63. package/dist/server/routes/terminal.js +107 -4
  64. package/package.json +1 -1
  65. package/runtime-manifest.json +2 -2
  66. package/dist/client/assets/channel-D401CpEF.js +0 -1
  67. package/dist/client/assets/classDiagram-OUVF2IWQ-Du83g6dp.js +0 -1
  68. package/dist/client/assets/classDiagram-v2-EOCWNBFH-Du83g6dp.js +0 -1
  69. package/dist/client/assets/index-Bjfn-JvM.js +0 -457
  70. package/dist/client/assets/index-CsZ9UjAY.css +0 -1
  71. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CoZLOD2S.js +0 -1
  72. package/dist/client/assets/swimlanesDiagram-G3AALYLV-elGk84_a.js +0 -8
@@ -1339,6 +1339,47 @@ function tryDeliverCollaborationInbox(frontendSessionId) {
1339
1339
  collaborationStore.markDelivered(pending.map((message) => message.id));
1340
1340
  return { delivered: pending.map((message) => message.id), pending: 0 };
1341
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
+ }
1342
1383
  function getTmuxBinary() {
1343
1384
  if (process.env.TMUX_BIN)
1344
1385
  return process.env.TMUX_BIN;
@@ -5104,6 +5145,19 @@ router.post('/operations/collaboration-groups', (req, res) => {
5104
5145
  });
5105
5146
  res.json({ group });
5106
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
+ });
5107
5161
  router.delete('/operations/collaboration-groups/:groupId', (req, res) => {
5108
5162
  if (!collaborationStore.remove(req.params.groupId))
5109
5163
  return res.status(404).json({ error: '协作组不存在' });
@@ -5148,14 +5202,60 @@ router.post('/operations/collaboration-groups/:groupId/messages', (req, res) =>
5148
5202
  res.status(400).json({ error: getErrorMessage(error) });
5149
5203
  }
5150
5204
  });
5151
- router.get('/operations/orchestration/peers', (req, res) => {
5205
+ router.get('/operations/orchestration/peers', async (req, res) => {
5152
5206
  const sourceSessionId = resolveFrontendSessionId(req.query);
5153
5207
  const source = globalSessionState.sessions.find((candidate) => candidate.sessionId === sourceSessionId);
5154
5208
  if (!source)
5155
5209
  return res.status(404).json({ error: '会话不存在' });
5156
5210
  const groups = collaborationStore.groupsForSession(source.sessionId);
5157
5211
  const peerIds = new Set(groups.flatMap((group) => group.sessionIds).filter((id) => id !== source.sessionId));
5158
- res.json({ source: orchestrationSessionSnapshot(source), groups, peers: globalSessionState.sessions.filter((record) => peerIds.has(record.sessionId)).map(orchestrationSessionSnapshot) });
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
+ }
5159
5259
  });
5160
5260
  router.post('/operations/orchestration/send', (req, res) => {
5161
5261
  const sourceSessionId = resolveFrontendSessionId(req.body ?? {});
@@ -5622,7 +5722,7 @@ router.put('/context-draft', (req, res) => {
5622
5722
  router.get('/agent-hooks', async (_req, res) => {
5623
5723
  res.json({ agents: await listAllHookAgents() });
5624
5724
  });
5625
- router.get('/agent-launchers', async (_req, res) => {
5725
+ async function listDetectedAgentLaunchers() {
5626
5726
  const pathEntries = buildAugmentedPath().split(path.delimiter).filter(Boolean);
5627
5727
  const executableExtensions = process.platform === 'win32'
5628
5728
  ? (process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM').split(';')
@@ -5661,7 +5761,10 @@ router.get('/agent-launchers', async (_req, res) => {
5661
5761
  });
5662
5762
  }
5663
5763
  }
5664
- res.json({ agents: detected });
5764
+ return detected;
5765
+ }
5766
+ router.get('/agent-launchers', async (_req, res) => {
5767
+ res.json({ agents: await listDetectedAgentLaunchers() });
5665
5768
  });
5666
5769
  router.get('/directory-suggestions', async (req, res) => {
5667
5770
  const rawQuery = typeof req.query.q === 'string' ? req.query.q.trim() : '';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.118",
3
+ "version": "1.4.119",
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.118",
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-a/7cvqxcw0mpXgy4zl0H73BUblm8Od1E7KPs5ZpWg44=",
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-BoOnnn4z.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-DaVzPpHP.js";import{b as i}from"./mermaid.core-BoOnnn4z.js";import"./chunk-5VM5RSS4-Pgz0HVzg.js";import"./chunk-XXDRQBXY-BNb5ydf7.js";import"./chunk-VR4S4FIN-BX5AcHHt.js";import"./chunk-32BRIVSS-DaRamqO4.js";import"./purify.es-CC4Brkr_.js";import"./index-Bjfn-JvM.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-DaVzPpHP.js";import{b as i}from"./mermaid.core-BoOnnn4z.js";import"./chunk-5VM5RSS4-Pgz0HVzg.js";import"./chunk-XXDRQBXY-BNb5ydf7.js";import"./chunk-VR4S4FIN-BX5AcHHt.js";import"./chunk-32BRIVSS-DaRamqO4.js";import"./purify.es-CC4Brkr_.js";import"./index-Bjfn-JvM.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};