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.
- package/dist/client/assets/{abnfDiagram-VRR7QNED-G_YxqZwv.js → abnfDiagram-VRR7QNED-DWXqvEjR.js} +1 -1
- package/dist/client/assets/{arc-BuvKiJCC.js → arc-B5joCHka.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-BvkwEVZw.js → architectureDiagram-ZJ3FMSHR-CJQE6w7r.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-C3bxox0Z.js → blockDiagram-677ZJIJ3-C1TGBe5x.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-DLORcr8m.js → c4Diagram-LMCZKHZV-DGd2HHf1.js} +1 -1
- package/dist/client/assets/channel-DTPJjYD6.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Dnqi-8g0.js → chunk-2Q5K7J3B-n9gfTHAy.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-D70B4HxL.js → chunk-32BRIVSS-C2hRZ-BH.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-Cl7t39aR.js → chunk-5VM5RSS4-DSSrc2sZ.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-DKMD4DfE.js → chunk-EX3LRPZG-DID8XrnC.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-CsN_pMOw.js → chunk-JWPE2WC7-Da3QhSKj.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-D8BHaQpE.js → chunk-MOJQB5TN-DXZjOrxN.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-B8BtUiHF.js → chunk-RYQCIY6F-mrNVFK82.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-CdN7tlvn.js → chunk-V7JOEXUC-DJR67KDW.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-UPjL_wl4.js → chunk-VR4S4FIN-nkbsGz1_.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY--eX5Na_l.js → chunk-XXDRQBXY-j9PgGxJy.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-2YuDtvgU.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-2YuDtvgU.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-CEAcZx3N.js → cose-bilkent-JH36ORCC-Dur7GuvH.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-up8zIMDo.js → cynefin-VYW2F7L2-5FtFnipB.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-DZ2SQpCq.js → cynefinDiagram-TSTJHNR4-Bl8p8LMV.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-DOoLtq9O.js → dagre-VKFMJZFB-BlhiJve1.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-x8umATxt.js → diagram-FQU43EPY-Cvwc7nAt.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-Kle7Toxb.js → diagram-G47NLZAW-Cpi_bvL3.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-CezkkMqP.js → diagram-NH7WQ7WH-B7ariBtD.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-CaU0u6UQ.js → diagram-OA4YK3LP-BRC3pwSV.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-B4m53TVj.js → diagram-WEI45ONY-qrT03hI1.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-Dpwjo8_v.js → ebnfDiagram-CCIWWBDH-BDwvSKrA.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-BU4R1QVk.js → erDiagram-Q63AITRT-B7sW79AM.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-BFtDsA0k.js → flowDiagram-23GEKE2U-OGMG83Xx.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-DtSEfub5.js → ganttDiagram-NO4QXBWP-DR7axkaq.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-BGukYlT3.js → gitGraphDiagram-IHSO6WYX-C_tNm0YG.js} +1 -1
- package/dist/client/assets/index-BktcGINa.js +408 -0
- package/dist/client/assets/index-DF1hQ7NF.css +1 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-Bx1NQNsL.js → infoDiagram-FWYZ7A6U-gtqUM7v8.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-DHlxYJjl.js → ishikawaDiagram-FXEZZL3T-Dt_GdmMN.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-BOZzlR6d.js → journeyDiagram-5HDEW3XC-jb5z-0p5.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-C2nWuUXX.js → kanban-definition-HUTT4EX6-OJixE6rE.js} +1 -1
- package/dist/client/assets/{linear-DtblW0g4.js → linear-BhufR60-.js} +1 -1
- package/dist/client/assets/{mermaid.core-BKSuG721.js → mermaid.core-BCzoNRDZ.js} +4 -4
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-Co3LLQGt.js → mindmap-definition-LN4V7U3C-Bytw0Q4_.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-DSUG1nB1.js → pegDiagram-2B236MQR-3Mhqh7uj.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-DvEr0UPf.js → pieDiagram-ENE6RG2P-CkBKIVEt.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-C2diLBZ8.js → quadrantDiagram-ABIIQ3AL-D6ogfZv2.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-CqYZHCvf.js → railroadDiagram-RFXS5EU6-SQbw572c.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-CFAKdPQp.js → requirementDiagram-TGXJPOKE-DO1wNYeJ.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-DV95NA9H.js → sankeyDiagram-HTMAVEWB-B-QG2oOv.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-cbv0xzG-.js → sequenceDiagram-DBY2YBRQ-gJDETC-I.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-DpkzYB1F.js → sizeCapture-X5ZJPWSS-h3hWKe_0.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-BnAwPP0V.js → stateDiagram-2N3HPSRC-C-7j4jgP.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-cGyWnCe2.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-kObRIKfj.js → swimlanes-5IMT3BWC-Bktms0sT.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-BCoFgyBb.js +8 -0
- package/dist/client/assets/{timeline-definition-FHXFAJF6-BbnAJ8pO.js → timeline-definition-FHXFAJF6-DOScKd5g.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-sIu_hWKx.js → vennDiagram-L72KCM5P-BWPRTzpI.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-DpGdJtdb.js → wardleyDiagram-EHGQE667-Dwh2JB3n.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-C5F9faN2.js → xychartDiagram-FW5EYKEG-DmDUfhQl.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/sw.js +1 -1
- package/dist/server/agent/installers.js +194 -3
- package/dist/server/agent/plugins.js +271 -0
- package/dist/server/agent/registry.js +82 -20
- package/dist/server/cli.js +122 -2
- package/dist/server/routes/filesystem.js +10 -8
- package/dist/server/routes/terminal.js +83 -6
- package/package.json +1 -1
- package/dist/client/assets/channel-BnGIwxUi.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-DMigd9mj.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-DMigd9mj.js +0 -1
- package/dist/client/assets/index-CP3_puZd.js +0 -395
- package/dist/client/assets/index-CxBkmASY.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DtPm_oHq.js +0 -1
- 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 {
|
|
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:
|
|
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
|
|
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
|
|
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 +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};
|