termdock 1.4.0 → 1.4.2

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/{abnfDiagram-VRR7QNED-G_YxqZwv.js → abnfDiagram-VRR7QNED-DWXqvEjR.js} +1 -1
  2. package/dist/client/assets/{arc-BuvKiJCC.js → arc-B5joCHka.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-BvkwEVZw.js → architectureDiagram-ZJ3FMSHR-CJQE6w7r.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-C3bxox0Z.js → blockDiagram-677ZJIJ3-C1TGBe5x.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-DLORcr8m.js → c4Diagram-LMCZKHZV-DGd2HHf1.js} +1 -1
  6. package/dist/client/assets/channel-DTPJjYD6.js +1 -0
  7. package/dist/client/assets/{chunk-2Q5K7J3B-Dnqi-8g0.js → chunk-2Q5K7J3B-n9gfTHAy.js} +1 -1
  8. package/dist/client/assets/{chunk-32BRIVSS-D70B4HxL.js → chunk-32BRIVSS-C2hRZ-BH.js} +1 -1
  9. package/dist/client/assets/{chunk-5VM5RSS4-Cl7t39aR.js → chunk-5VM5RSS4-DSSrc2sZ.js} +1 -1
  10. package/dist/client/assets/{chunk-EX3LRPZG-DKMD4DfE.js → chunk-EX3LRPZG-DID8XrnC.js} +1 -1
  11. package/dist/client/assets/{chunk-JWPE2WC7-CsN_pMOw.js → chunk-JWPE2WC7-Da3QhSKj.js} +1 -1
  12. package/dist/client/assets/{chunk-MOJQB5TN-D8BHaQpE.js → chunk-MOJQB5TN-DXZjOrxN.js} +1 -1
  13. package/dist/client/assets/{chunk-RYQCIY6F-B8BtUiHF.js → chunk-RYQCIY6F-mrNVFK82.js} +1 -1
  14. package/dist/client/assets/{chunk-V7JOEXUC-CdN7tlvn.js → chunk-V7JOEXUC-DJR67KDW.js} +1 -1
  15. package/dist/client/assets/{chunk-VR4S4FIN-UPjL_wl4.js → chunk-VR4S4FIN-nkbsGz1_.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY--eX5Na_l.js → chunk-XXDRQBXY-j9PgGxJy.js} +1 -1
  17. package/dist/client/assets/classDiagram-OUVF2IWQ-2YuDtvgU.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-EOCWNBFH-2YuDtvgU.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-CEAcZx3N.js → cose-bilkent-JH36ORCC-Dur7GuvH.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-up8zIMDo.js → cynefin-VYW2F7L2-5FtFnipB.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-DZ2SQpCq.js → cynefinDiagram-TSTJHNR4-Bl8p8LMV.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-DOoLtq9O.js → dagre-VKFMJZFB-BlhiJve1.js} +1 -1
  23. package/dist/client/assets/{diagram-FQU43EPY-x8umATxt.js → diagram-FQU43EPY-Cvwc7nAt.js} +1 -1
  24. package/dist/client/assets/{diagram-G47NLZAW-Kle7Toxb.js → diagram-G47NLZAW-Cpi_bvL3.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-CezkkMqP.js → diagram-NH7WQ7WH-B7ariBtD.js} +1 -1
  26. package/dist/client/assets/{diagram-OA4YK3LP-CaU0u6UQ.js → diagram-OA4YK3LP-BRC3pwSV.js} +1 -1
  27. package/dist/client/assets/{diagram-WEI45ONY-B4m53TVj.js → diagram-WEI45ONY-qrT03hI1.js} +1 -1
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-Dpwjo8_v.js → ebnfDiagram-CCIWWBDH-BDwvSKrA.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-BU4R1QVk.js → erDiagram-Q63AITRT-B7sW79AM.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-BFtDsA0k.js → flowDiagram-23GEKE2U-OGMG83Xx.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-DtSEfub5.js → ganttDiagram-NO4QXBWP-DR7axkaq.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-BGukYlT3.js → gitGraphDiagram-IHSO6WYX-C_tNm0YG.js} +1 -1
  33. package/dist/client/assets/index-BktcGINa.js +408 -0
  34. package/dist/client/assets/index-DF1hQ7NF.css +1 -0
  35. package/dist/client/assets/{infoDiagram-FWYZ7A6U-Bx1NQNsL.js → infoDiagram-FWYZ7A6U-gtqUM7v8.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-DHlxYJjl.js → ishikawaDiagram-FXEZZL3T-Dt_GdmMN.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-5HDEW3XC-BOZzlR6d.js → journeyDiagram-5HDEW3XC-jb5z-0p5.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-HUTT4EX6-C2nWuUXX.js → kanban-definition-HUTT4EX6-OJixE6rE.js} +1 -1
  39. package/dist/client/assets/{linear-DtblW0g4.js → linear-BhufR60-.js} +1 -1
  40. package/dist/client/assets/{mermaid.core-BKSuG721.js → mermaid.core-BCzoNRDZ.js} +4 -4
  41. package/dist/client/assets/{mindmap-definition-LN4V7U3C-Co3LLQGt.js → mindmap-definition-LN4V7U3C-Bytw0Q4_.js} +1 -1
  42. package/dist/client/assets/{pegDiagram-2B236MQR-DSUG1nB1.js → pegDiagram-2B236MQR-3Mhqh7uj.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-ENE6RG2P-DvEr0UPf.js → pieDiagram-ENE6RG2P-CkBKIVEt.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-C2diLBZ8.js → quadrantDiagram-ABIIQ3AL-D6ogfZv2.js} +1 -1
  45. package/dist/client/assets/{railroadDiagram-RFXS5EU6-CqYZHCvf.js → railroadDiagram-RFXS5EU6-SQbw572c.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-TGXJPOKE-CFAKdPQp.js → requirementDiagram-TGXJPOKE-DO1wNYeJ.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-DV95NA9H.js → sankeyDiagram-HTMAVEWB-B-QG2oOv.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-cbv0xzG-.js → sequenceDiagram-DBY2YBRQ-gJDETC-I.js} +1 -1
  49. package/dist/client/assets/{sizeCapture-X5ZJPWSS-DpkzYB1F.js → sizeCapture-X5ZJPWSS-h3hWKe_0.js} +1 -1
  50. package/dist/client/assets/{stateDiagram-2N3HPSRC-BnAwPP0V.js → stateDiagram-2N3HPSRC-C-7j4jgP.js} +1 -1
  51. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-cGyWnCe2.js +1 -0
  52. package/dist/client/assets/{swimlanes-5IMT3BWC-kObRIKfj.js → swimlanes-5IMT3BWC-Bktms0sT.js} +2 -2
  53. package/dist/client/assets/swimlanesDiagram-G3AALYLV-BCoFgyBb.js +8 -0
  54. package/dist/client/assets/{timeline-definition-FHXFAJF6-BbnAJ8pO.js → timeline-definition-FHXFAJF6-DOScKd5g.js} +1 -1
  55. package/dist/client/assets/{vennDiagram-L72KCM5P-sIu_hWKx.js → vennDiagram-L72KCM5P-BWPRTzpI.js} +1 -1
  56. package/dist/client/assets/{wardleyDiagram-EHGQE667-DpGdJtdb.js → wardleyDiagram-EHGQE667-Dwh2JB3n.js} +1 -1
  57. package/dist/client/assets/{xychartDiagram-FW5EYKEG-C5F9faN2.js → xychartDiagram-FW5EYKEG-DmDUfhQl.js} +1 -1
  58. package/dist/client/index.html +2 -2
  59. package/dist/client/sw.js +1 -1
  60. package/dist/server/agent/installers.js +194 -3
  61. package/dist/server/agent/plugins.js +271 -0
  62. package/dist/server/agent/registry.js +82 -20
  63. package/dist/server/cli.js +122 -2
  64. package/dist/server/routes/filesystem.js +10 -8
  65. package/dist/server/routes/terminal.js +83 -6
  66. package/package.json +1 -1
  67. package/dist/client/assets/channel-BnGIwxUi.js +0 -1
  68. package/dist/client/assets/classDiagram-OUVF2IWQ-DMigd9mj.js +0 -1
  69. package/dist/client/assets/classDiagram-v2-EOCWNBFH-DMigd9mj.js +0 -1
  70. package/dist/client/assets/index-CP3_puZd.js +0 -395
  71. package/dist/client/assets/index-CxBkmASY.css +0 -1
  72. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DtPm_oHq.js +0 -1
  73. package/dist/client/assets/swimlanesDiagram-G3AALYLV-yeb4EUGj.js +0 -8
@@ -20,7 +20,9 @@ import { getFocusSequence, removeClientFocusState, scanFocusTrackingMode, setCli
20
20
  import { extractProgramLabelFromArgs, normalizeProgramName, normalizeTmuxMetadataProgram, selectTmuxForegroundProgram, tmuxMetadataChanged, } from '../utils/tmuxProgramDetection.js';
21
21
  import { agentBySlug, buildResumeCommand, detectAgentFromCommand, } from '../agent/registry.js';
22
22
  import { applyAgentEvent, defaultAgentSessionState, parseAgentEvent, } from '../agent/session.js';
23
- import { installHooks, listHookAgents, refreshStaleHooksAtLaunch, uninstallHooks, } from '../agent/installers.js';
23
+ import { listAllHookAgents, refreshStaleHooksAtLaunch, installHooksForSlug, uninstallHooksForSlug, } from '../agent/installers.js';
24
+ import { loadPlugins, savePlugin, removePlugin, readPluginIcon, } from '../agent/plugins.js';
25
+ import { registerPluginAgents } from '../agent/registry.js';
24
26
  const router = express.Router();
25
27
  const execFileAsync = promisify(execFile);
26
28
  const TERMDOCK_DIR = `${os.homedir()}/.termdock`;
@@ -2097,7 +2099,7 @@ function buildAgentStatusPayload(sessionId, session) {
2097
2099
  agentStatus: status,
2098
2100
  agentIndicator: indicator ?? null,
2099
2101
  agent: agent
2100
- ? { slug: agent.slug, displayName: agent.displayName, accentColor: agent.accentColor, icon: agent.icon }
2102
+ ? { slug: agent.slug, displayName: agent.displayName, accentColor: agent.accentColor, icon: agent.icon, isPlugin: agent.isPlugin ?? false }
2101
2103
  : null,
2102
2104
  agentMessage: state?.message ?? null,
2103
2105
  agentNativeSessionId: nativeSessionId,
@@ -2364,6 +2366,21 @@ try {
2364
2366
  refreshStaleHooksAtLaunch();
2365
2367
  }
2366
2368
  catch { /* hook refresh must never block startup */ }
2369
+ // Load user-defined agent plugins into the identity registry
2370
+ try {
2371
+ const { plugins, errors } = loadPlugins();
2372
+ const result = registerPluginAgents(plugins);
2373
+ if (result.registered > 0) {
2374
+ console.log(`[agent-plugins] loaded ${result.registered} plugin(s)`);
2375
+ }
2376
+ for (const skip of result.skipped) {
2377
+ console.warn(`[agent-plugins] skipped: ${skip}`);
2378
+ }
2379
+ for (const err of errors) {
2380
+ console.warn(`[agent-plugins] validation error in "${err.slug}": ${err.errors.join('; ')}`);
2381
+ }
2382
+ }
2383
+ catch { /* plugin loading must never block startup */ }
2367
2384
  async function resolveTmuxPaneProgram(pane) {
2368
2385
  // If pane command is a known shell, try to find a child foreground process
2369
2386
  const command = normalizeProgramName(pane.command);
@@ -4154,14 +4171,14 @@ router.put('/settings', async (req, res) => {
4154
4171
  }
4155
4172
  res.json(await getSettingsPayload());
4156
4173
  });
4157
- // ── Agent hooks API (rich status channel installers) ──
4174
+ // ── Agent hooks API (rich status channel installers, built-in + plugin) ──
4158
4175
  router.get('/agent-hooks', (_req, res) => {
4159
- res.json({ agents: listHookAgents() });
4176
+ res.json({ agents: listAllHookAgents() });
4160
4177
  });
4161
4178
  router.post('/agent-hooks/:agent/install', async (req, res) => {
4162
4179
  const agent = req.params.agent;
4163
4180
  try {
4164
- const result = await installHooks(agent);
4181
+ const result = await installHooksForSlug(agent);
4165
4182
  res.json({ agent, ...result, state: 'installed' });
4166
4183
  }
4167
4184
  catch (error) {
@@ -4171,7 +4188,7 @@ router.post('/agent-hooks/:agent/install', async (req, res) => {
4171
4188
  router.post('/agent-hooks/:agent/uninstall', async (req, res) => {
4172
4189
  const agent = req.params.agent;
4173
4190
  try {
4174
- const summary = await uninstallHooks(agent);
4191
+ const summary = await uninstallHooksForSlug(agent);
4175
4192
  res.json({ agent, summary, state: 'not-installed' });
4176
4193
  }
4177
4194
  catch (error) {
@@ -4179,6 +4196,66 @@ router.post('/agent-hooks/:agent/uninstall', async (req, res) => {
4179
4196
  }
4180
4197
  });
4181
4198
  // ── end Agent hooks API ──
4199
+ // ── Agent plugins API (user-defined agent plugins) ──
4200
+ router.get('/agent-plugins', (_req, res) => {
4201
+ const { plugins, errors } = loadPlugins();
4202
+ res.json({
4203
+ plugins: plugins.map((p) => ({
4204
+ slug: p.manifest.slug,
4205
+ displayName: p.manifest.displayName,
4206
+ aliases: p.manifest.aliases,
4207
+ accentColor: p.manifest.accentColor,
4208
+ hasHooks: p.manifest.hooks !== undefined,
4209
+ hasResume: p.manifest.resume !== undefined,
4210
+ hasIcon: p.iconPath !== null,
4211
+ })),
4212
+ errors: errors.map((e) => ({ slug: e.slug, errors: e.errors })),
4213
+ });
4214
+ });
4215
+ router.post('/agent-plugins', async (req, res) => {
4216
+ const manifest = req.body;
4217
+ if (!manifest || typeof manifest !== 'object') {
4218
+ res.status(400).json({ error: 'Request body must be a plugin manifest JSON object' });
4219
+ return;
4220
+ }
4221
+ try {
4222
+ // validate through the loader
4223
+ const { plugins } = loadPlugins();
4224
+ // Check for duplicate slug
4225
+ const existing = plugins.find((p) => p.manifest.slug === manifest.slug);
4226
+ if (existing) {
4227
+ res.status(409).json({ error: `Plugin "${existing.manifest.slug}" already exists` });
4228
+ return;
4229
+ }
4230
+ const dir = savePlugin(manifest);
4231
+ res.json({ slug: manifest.slug, dir, state: 'created' });
4232
+ }
4233
+ catch (error) {
4234
+ res.status(400).json({ error: error.message });
4235
+ }
4236
+ });
4237
+ router.delete('/agent-plugins/:slug', async (req, res) => {
4238
+ const { slug } = req.params;
4239
+ try {
4240
+ removePlugin(slug);
4241
+ res.json({ slug, state: 'removed' });
4242
+ }
4243
+ catch (error) {
4244
+ res.status(404).json({ error: error.message });
4245
+ }
4246
+ });
4247
+ router.get('/agent-plugin-icon/:slug', (req, res) => {
4248
+ const { slug } = req.params;
4249
+ const svg = readPluginIcon(slug);
4250
+ if (svg === null) {
4251
+ res.status(404).json({ error: 'No icon found' });
4252
+ return;
4253
+ }
4254
+ res.setHeader('Content-Type', 'image/svg+xml');
4255
+ res.setHeader('Cache-Control', 'public, max-age=3600');
4256
+ res.send(svg);
4257
+ });
4258
+ // ── end Agent plugins API ──
4182
4259
  // ── Program detection config API ──
4183
4260
  router.get('/program-detection', async (_req, res) => {
4184
4261
  res.json(await loadProgramDetectionFromDisk());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "termdock",
3
- "version": "1.4.0",
3
+ "version": "1.4.2",
4
4
  "description": "A complete web-based terminal application with modern UI",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-BKSuG721.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-CdN7tlvn.js";import{b as i}from"./mermaid.core-BKSuG721.js";import"./chunk-5VM5RSS4-Cl7t39aR.js";import"./chunk-XXDRQBXY--eX5Na_l.js";import"./chunk-VR4S4FIN-UPjL_wl4.js";import"./chunk-32BRIVSS-D70B4HxL.js";import"./purify.es-CC4Brkr_.js";import"./index-CP3_puZd.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-CdN7tlvn.js";import{b as i}from"./mermaid.core-BKSuG721.js";import"./chunk-5VM5RSS4-Cl7t39aR.js";import"./chunk-XXDRQBXY--eX5Na_l.js";import"./chunk-VR4S4FIN-UPjL_wl4.js";import"./chunk-32BRIVSS-D70B4HxL.js";import"./purify.es-CC4Brkr_.js";import"./index-CP3_puZd.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};