@telora/mcp-products 0.22.5 → 0.22.7
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/handlers/connectorHandlers.js +22 -227
- package/dist/handlers/connectorHandlers.js.map +1 -1
- package/dist/handlers/daemonConfig.d.ts +86 -0
- package/dist/handlers/daemonConfig.js +302 -0
- package/dist/handlers/daemonConfig.js.map +1 -0
- package/dist/handlers/productHandlers.js +35 -1
- package/dist/handlers/productHandlers.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,145 +2,10 @@
|
|
|
2
2
|
// Daemon connector tool handler: telora_connector_start
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
import { join, basename } from "node:path";
|
|
5
|
-
import { existsSync, writeFileSync, mkdirSync, readFileSync
|
|
6
|
-
import { spawn, execFileSync } from "node:child_process";
|
|
7
|
-
import { homedir } from "node:os";
|
|
5
|
+
import { existsSync, writeFileSync, mkdirSync, readFileSync } from "node:fs";
|
|
8
6
|
import { z } from "zod";
|
|
9
7
|
import { callProductApi, successResult, wrapHandler, } from "../shared.js";
|
|
10
|
-
|
|
11
|
-
// Note: productId is NOT here -- it's been replaced by the products array.
|
|
12
|
-
const IDENTITY_KEYS = ["teloraUrl", "trackerId", "organizationId"];
|
|
13
|
-
/**
|
|
14
|
-
* Merge a fresh daemon config into an existing one.
|
|
15
|
-
*
|
|
16
|
-
* - Identity keys are always overwritten.
|
|
17
|
-
* - Products array: if the fresh product is already in the array, update its
|
|
18
|
-
* repoPath if different; if missing, append the new entry.
|
|
19
|
-
* - Legacy flat `productId` + `repoPath` are migrated into the products array.
|
|
20
|
-
* - Engine sections are only added if missing.
|
|
21
|
-
* - Everything else the user has customized is preserved.
|
|
22
|
-
*
|
|
23
|
-
* Returns { config, action } where action indicates what happened:
|
|
24
|
-
* 'created' -- first-time config (no existing file)
|
|
25
|
-
* 'added' -- new product appended to existing config
|
|
26
|
-
* 'updated' -- existing product's repoPath changed
|
|
27
|
-
* 'no_change' -- product already registered with same repoPath
|
|
28
|
-
*/
|
|
29
|
-
function mergeConfig(existing, freshProduct, fresh) {
|
|
30
|
-
const merged = { ...existing };
|
|
31
|
-
// Always overwrite identity keys
|
|
32
|
-
for (const key of IDENTITY_KEYS) {
|
|
33
|
-
if (key in fresh) {
|
|
34
|
-
merged[key] = fresh[key];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
// Migrate legacy flat productId + repoPath into products array
|
|
38
|
-
let products = Array.isArray(merged.products)
|
|
39
|
-
? merged.products
|
|
40
|
-
: [];
|
|
41
|
-
if (products.length === 0 && typeof merged.productId === "string" && merged.productId) {
|
|
42
|
-
// Legacy single-product config -- migrate to products array
|
|
43
|
-
const legacyRepoPath = typeof merged.repoPath === "string" ? merged.repoPath : process.cwd();
|
|
44
|
-
products = [{ id: merged.productId, repoPath: legacyRepoPath }];
|
|
45
|
-
}
|
|
46
|
-
// Remove legacy flat keys (superseded by products array)
|
|
47
|
-
delete merged.productId;
|
|
48
|
-
delete merged.repoPath;
|
|
49
|
-
// Upsert the fresh product into the array
|
|
50
|
-
let action;
|
|
51
|
-
const idx = products.findIndex((p) => p.id === freshProduct.id);
|
|
52
|
-
if (idx >= 0) {
|
|
53
|
-
if (products[idx].repoPath !== freshProduct.repoPath) {
|
|
54
|
-
products[idx] = { ...products[idx], repoPath: freshProduct.repoPath };
|
|
55
|
-
action = "updated";
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
action = "no_change";
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
products.push(freshProduct);
|
|
63
|
-
action = "added";
|
|
64
|
-
}
|
|
65
|
-
merged.products = products;
|
|
66
|
-
// Engines: add missing sections, never overwrite existing ones
|
|
67
|
-
const freshEngines = fresh.engines;
|
|
68
|
-
if (freshEngines) {
|
|
69
|
-
if (!merged.engines) {
|
|
70
|
-
merged.engines = freshEngines;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
const existingEngines = merged.engines;
|
|
74
|
-
for (const engineKey of Object.keys(freshEngines)) {
|
|
75
|
-
if (!(engineKey in existingEngines)) {
|
|
76
|
-
existingEngines[engineKey] = freshEngines[engineKey];
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return { config: merged, action };
|
|
82
|
-
}
|
|
83
|
-
/** Read the daemon PID from .telora/daemon.pid. Returns null if missing or invalid. */
|
|
84
|
-
function readPidFile(teloraDir) {
|
|
85
|
-
const pidPath = join(teloraDir, "daemon.pid");
|
|
86
|
-
try {
|
|
87
|
-
const raw = readFileSync(pidPath, "utf-8").trim();
|
|
88
|
-
const pid = parseInt(raw, 10);
|
|
89
|
-
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return null;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
/** Check if a process is alive (signal 0 existence check). */
|
|
96
|
-
function isProcessAlive(pid) {
|
|
97
|
-
try {
|
|
98
|
-
process.kill(pid, 0);
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/** Stop the daemon gracefully: SIGTERM, poll for exit, SIGKILL fallback. */
|
|
106
|
-
async function stopDaemon(teloraDir) {
|
|
107
|
-
const pid = readPidFile(teloraDir);
|
|
108
|
-
if (pid === null) {
|
|
109
|
-
return { stopped: false, message: "No PID file found" };
|
|
110
|
-
}
|
|
111
|
-
if (!isProcessAlive(pid)) {
|
|
112
|
-
return { stopped: false, pid, message: "Process not running" };
|
|
113
|
-
}
|
|
114
|
-
// Send SIGTERM
|
|
115
|
-
try {
|
|
116
|
-
process.kill(pid, "SIGTERM");
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
return { stopped: false, pid, message: "Failed to send SIGTERM" };
|
|
120
|
-
}
|
|
121
|
-
// Poll every 300ms for up to 10s
|
|
122
|
-
const deadline = Date.now() + 10_000;
|
|
123
|
-
while (Date.now() < deadline) {
|
|
124
|
-
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
125
|
-
if (!isProcessAlive(pid)) {
|
|
126
|
-
return { stopped: true, pid, message: "Stopped with SIGTERM" };
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
// SIGKILL fallback
|
|
130
|
-
try {
|
|
131
|
-
process.kill(pid, "SIGKILL");
|
|
132
|
-
}
|
|
133
|
-
catch {
|
|
134
|
-
// Process may have exited between last check and kill
|
|
135
|
-
if (!isProcessAlive(pid)) {
|
|
136
|
-
return { stopped: true, pid, message: "Stopped with SIGTERM (late exit)" };
|
|
137
|
-
}
|
|
138
|
-
return { stopped: false, pid, message: "Failed to send SIGKILL" };
|
|
139
|
-
}
|
|
140
|
-
// Brief wait after SIGKILL
|
|
141
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
142
|
-
return { stopped: true, pid, message: "Stopped with SIGKILL" };
|
|
143
|
-
}
|
|
8
|
+
import { mergeConfig, readPidFile, isProcessAlive, stopDaemon, startDaemon, resolveDaemonPaths, } from "./daemonConfig.js";
|
|
144
9
|
export function registerConnectorTools(server, getCreds, profile = 'full') {
|
|
145
10
|
// -- telora_connector_start -------------------------------------------------
|
|
146
11
|
server.tool("telora_connector_start", "Daemon automation: generate configuration and launch the Telora daemon for autonomous agent execution. " +
|
|
@@ -214,13 +79,8 @@ export function registerConnectorTools(server, getCreds, profile = 'full') {
|
|
|
214
79
|
// - Prefer global ~/.telora/daemon.json when it already exists
|
|
215
80
|
// (multi-product: one daemon config for all repos)
|
|
216
81
|
// - Fall back to repo-local .telora/daemon.json for first-time setup
|
|
217
|
-
const
|
|
218
|
-
const
|
|
219
|
-
const localTeloraDir = join(repoPath, ".telora");
|
|
220
|
-
const localConfigPath = join(localTeloraDir, "daemon.json");
|
|
221
|
-
const useGlobal = existsSync(globalConfigPath);
|
|
222
|
-
const configPath = useGlobal ? globalConfigPath : localConfigPath;
|
|
223
|
-
const teloraDir = useGlobal ? globalTeloraDir : localTeloraDir;
|
|
82
|
+
const paths = resolveDaemonPaths(repoPath);
|
|
83
|
+
const { configPath, teloraDir, globalDir: globalTeloraDir, localDir: localTeloraDir } = paths;
|
|
224
84
|
mkdirSync(teloraDir, { recursive: true });
|
|
225
85
|
// 2. Merge with existing config to preserve user customizations
|
|
226
86
|
let finalConfig;
|
|
@@ -294,87 +154,23 @@ export function registerConnectorTools(server, getCreds, profile = 'full') {
|
|
|
294
154
|
}
|
|
295
155
|
const previousPid = stopResult.stopped ? stopResult.pid : undefined;
|
|
296
156
|
// 6. Start the daemon as a detached background process.
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
const logPath = join(teloraDir, "daemon.log");
|
|
300
|
-
const logFd = openSync(logPath, "a");
|
|
301
|
-
let daemonCommand;
|
|
302
|
-
let daemonArgs;
|
|
303
|
-
let daemonSource;
|
|
304
|
-
// Pass --config when using global config so the daemon finds it
|
|
305
|
-
const configArgs = useGlobal ? ["--config", configPath] : [];
|
|
306
|
-
// Option 1: Local dev build (monorepo development)
|
|
307
|
-
const localDevPath = join(process.cwd(), "packages/daemon/dist/index.js");
|
|
308
|
-
// Option 2: Project node_modules (npm install --save-dev @telora/daemon)
|
|
309
|
-
const nodeModulesPath = join(process.cwd(), "node_modules/.bin/telora-daemon");
|
|
310
|
-
if (existsSync(localDevPath)) {
|
|
311
|
-
daemonCommand = process.execPath;
|
|
312
|
-
daemonArgs = [localDevPath, "run", "--no-auto-update", ...configArgs];
|
|
313
|
-
daemonSource = "local";
|
|
314
|
-
}
|
|
315
|
-
else if (existsSync(nodeModulesPath)) {
|
|
316
|
-
daemonCommand = nodeModulesPath;
|
|
317
|
-
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
318
|
-
daemonSource = "node_modules";
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
// Option 3: npx resolution -- resolve the cached binary path then spawn directly.
|
|
322
|
-
// npx as a detached background process doesn't work reliably, but we can
|
|
323
|
-
// use npx to resolve the cached binary path and run it with node.
|
|
324
|
-
let resolvedDaemonPath = null;
|
|
325
|
-
try {
|
|
326
|
-
resolvedDaemonPath = execFileSync("npx", ["-y", "-p", "@telora/daemon@latest", "which", "telora-daemon"], { encoding: "utf-8", timeout: 30_000 }).trim() || null;
|
|
327
|
-
}
|
|
328
|
-
catch {
|
|
329
|
-
// npx not available or package can't be resolved
|
|
330
|
-
}
|
|
331
|
-
if (!resolvedDaemonPath) {
|
|
332
|
-
return {
|
|
333
|
-
content: [{
|
|
334
|
-
type: "text",
|
|
335
|
-
text: "Could not locate telora-daemon. Install it as a dev dependency:\n" +
|
|
336
|
-
" npm install --save-dev @telora/daemon\n" +
|
|
337
|
-
"Then try again.",
|
|
338
|
-
}],
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
daemonCommand = resolvedDaemonPath;
|
|
342
|
-
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
343
|
-
daemonSource = "npx";
|
|
344
|
-
}
|
|
345
|
-
const daemonProcess = spawn(daemonCommand, daemonArgs, {
|
|
346
|
-
detached: true,
|
|
347
|
-
stdio: ["ignore", logFd, logFd],
|
|
348
|
-
env: { ...process.env, TELORA_TRACKER_ID: whoami.trackerId },
|
|
349
|
-
cwd: process.cwd(),
|
|
157
|
+
const startResult = await startDaemon(paths, {
|
|
158
|
+
extraEnv: { TELORA_TRACKER_ID: whoami.trackerId },
|
|
350
159
|
});
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
try {
|
|
359
|
-
process.kill(pid, 0); // signal 0 = existence check only
|
|
360
|
-
alive = true;
|
|
361
|
-
}
|
|
362
|
-
catch {
|
|
363
|
-
// ESRCH = no such process
|
|
160
|
+
if (startResult.status === "binary_not_found") {
|
|
161
|
+
return {
|
|
162
|
+
content: [{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: startResult.errorMessage ?? "telora-daemon not found",
|
|
165
|
+
}],
|
|
166
|
+
};
|
|
364
167
|
}
|
|
365
|
-
if (
|
|
366
|
-
let logTail = "";
|
|
367
|
-
try {
|
|
368
|
-
const logContent = readFileSync(logPath, "utf-8");
|
|
369
|
-
const lines = logContent.trim().split("\n");
|
|
370
|
-
logTail = lines.slice(-30).join("\n");
|
|
371
|
-
}
|
|
372
|
-
catch { /* ignore */ }
|
|
168
|
+
if (startResult.status === "exit_failed") {
|
|
373
169
|
return {
|
|
374
170
|
content: [{
|
|
375
171
|
type: "text",
|
|
376
|
-
text: `Daemon process (PID ${pid}) exited immediately after start.\n\n` +
|
|
377
|
-
`Last log output:\n${logTail || "(no log output — check " + logPath + ")"}`,
|
|
172
|
+
text: `Daemon process (PID ${startResult.pid}) exited immediately after start.\n\n` +
|
|
173
|
+
`Last log output:\n${startResult.logTail || "(no log output — check " + startResult.logPath + ")"}`,
|
|
378
174
|
}],
|
|
379
175
|
};
|
|
380
176
|
}
|
|
@@ -383,13 +179,13 @@ export function registerConnectorTools(server, getCreds, profile = 'full') {
|
|
|
383
179
|
configAction: mergeAction,
|
|
384
180
|
productCount,
|
|
385
181
|
configPath,
|
|
386
|
-
logPath,
|
|
387
|
-
pid,
|
|
182
|
+
logPath: startResult.logPath,
|
|
183
|
+
pid: startResult.pid,
|
|
388
184
|
previousPid,
|
|
389
185
|
gitignoreUpdated,
|
|
390
186
|
organizationId: whoami.organizationId,
|
|
391
187
|
productId,
|
|
392
|
-
daemonSource,
|
|
188
|
+
daemonSource: startResult.daemonSource,
|
|
393
189
|
autoCreatedProduct,
|
|
394
190
|
});
|
|
395
191
|
}));
|
|
@@ -397,11 +193,10 @@ export function registerConnectorTools(server, getCreds, profile = 'full') {
|
|
|
397
193
|
if (profile !== 'human') {
|
|
398
194
|
server.tool("telora_connector_stop", "Daemon lifecycle: stop the running Telora daemon gracefully (SIGTERM with SIGKILL fallback).", {}, wrapHandler(async () => {
|
|
399
195
|
// Try global config location first, fall back to repo-local
|
|
400
|
-
const
|
|
401
|
-
let result = await stopDaemon(
|
|
196
|
+
const paths = resolveDaemonPaths(process.cwd());
|
|
197
|
+
let result = await stopDaemon(paths.globalDir);
|
|
402
198
|
if (!result.stopped) {
|
|
403
|
-
|
|
404
|
-
result = await stopDaemon(localTeloraDir);
|
|
199
|
+
result = await stopDaemon(paths.localDir);
|
|
405
200
|
}
|
|
406
201
|
if (result.stopped) {
|
|
407
202
|
return successResult({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectorHandlers.js","sourceRoot":"","sources":["../../src/handlers/connectorHandlers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"connectorHandlers.js","sourceRoot":"","sources":["../../src/handlers/connectorHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export interface ProductEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
repoPath: string;
|
|
4
|
+
}
|
|
5
|
+
export interface DaemonPaths {
|
|
6
|
+
globalDir: string;
|
|
7
|
+
globalPath: string;
|
|
8
|
+
localDir: string;
|
|
9
|
+
localPath: string;
|
|
10
|
+
/** True when ~/.telora/daemon.json exists; daemon prefers global when both are present. */
|
|
11
|
+
useGlobal: boolean;
|
|
12
|
+
/** Resolved config path (global if it exists, else local). */
|
|
13
|
+
configPath: string;
|
|
14
|
+
/** Resolved .telora/ dir matching configPath. */
|
|
15
|
+
teloraDir: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveDaemonPaths(repoPath: string): DaemonPaths;
|
|
18
|
+
/**
|
|
19
|
+
* Merge a fresh daemon config into an existing one.
|
|
20
|
+
*
|
|
21
|
+
* - Identity keys are always overwritten.
|
|
22
|
+
* - Products array: if the fresh product is already in the array, update its
|
|
23
|
+
* repoPath if different; if missing, append the new entry.
|
|
24
|
+
* - Legacy flat `productId` + `repoPath` are migrated into the products array.
|
|
25
|
+
* - Engine sections are only added if missing.
|
|
26
|
+
* - Everything else the user has customized is preserved.
|
|
27
|
+
*/
|
|
28
|
+
export declare function mergeConfig(existing: Record<string, unknown>, freshProduct: ProductEntry, fresh: Record<string, unknown>): {
|
|
29
|
+
config: Record<string, unknown>;
|
|
30
|
+
action: "added" | "updated" | "no_change";
|
|
31
|
+
};
|
|
32
|
+
/** Read the daemon PID from .telora/daemon.pid. Returns null if missing or invalid. */
|
|
33
|
+
export declare function readPidFile(teloraDir: string): number | null;
|
|
34
|
+
/** Check if a process is alive (signal 0 existence check). */
|
|
35
|
+
export declare function isProcessAlive(pid: number): boolean;
|
|
36
|
+
/** Stop the daemon gracefully: SIGTERM, poll for exit, SIGKILL fallback. */
|
|
37
|
+
export declare function stopDaemon(teloraDir: string): Promise<{
|
|
38
|
+
stopped: boolean;
|
|
39
|
+
pid?: number;
|
|
40
|
+
message?: string;
|
|
41
|
+
}>;
|
|
42
|
+
export interface StartDaemonResult {
|
|
43
|
+
status: "started" | "exit_failed" | "binary_not_found";
|
|
44
|
+
pid?: number;
|
|
45
|
+
logPath: string;
|
|
46
|
+
daemonSource?: "local" | "node_modules" | "npx";
|
|
47
|
+
errorMessage?: string;
|
|
48
|
+
logTail?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Spawn the telora-daemon as a detached background process.
|
|
52
|
+
* Resolution order: local dev build > project node_modules > npx.
|
|
53
|
+
*/
|
|
54
|
+
export declare function startDaemon(paths: DaemonPaths, options?: {
|
|
55
|
+
extraEnv?: Record<string, string>;
|
|
56
|
+
}): Promise<StartDaemonResult>;
|
|
57
|
+
export interface AddProductResult {
|
|
58
|
+
written: boolean;
|
|
59
|
+
configAction?: "added" | "updated" | "no_change";
|
|
60
|
+
configPath?: string;
|
|
61
|
+
/** Reason daemon config was not written (skipped). */
|
|
62
|
+
skippedReason?: "no_config" | "repo_path_in_use";
|
|
63
|
+
/** True if a SIGHUP was successfully sent to a running daemon. */
|
|
64
|
+
reloaded: boolean;
|
|
65
|
+
/** PID that was signaled. */
|
|
66
|
+
daemonPid?: number;
|
|
67
|
+
/** Error message if SIGHUP failed. */
|
|
68
|
+
reloadError?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Register a newly created product in the daemon config and signal a hot
|
|
72
|
+
* reload if the daemon is running. Used by telora_product create.
|
|
73
|
+
*
|
|
74
|
+
* Behavior:
|
|
75
|
+
* - If no daemon config exists, skip (caller is expected to call telora_connector_start).
|
|
76
|
+
* - If repoPath is already used by another product entry, skip (one repo cannot
|
|
77
|
+
* back two products in the same daemon).
|
|
78
|
+
* - Otherwise upsert the product entry, write the config, and if the daemon is
|
|
79
|
+
* running, send SIGHUP so it re-reads the config in place. In-flight teams
|
|
80
|
+
* are NOT interrupted -- only the products array is hot-reloaded.
|
|
81
|
+
*
|
|
82
|
+
* Requires a daemon built with hot-reload support (registerHotReloadSignal).
|
|
83
|
+
* Older daemons treat SIGHUP as a terminate signal; if you're targeting a mixed
|
|
84
|
+
* environment, restart the daemon once after upgrading before relying on this.
|
|
85
|
+
*/
|
|
86
|
+
export declare function addProductToDaemonConfig(productId: string, repoPath: string): Promise<AddProductResult>;
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Shared daemon-config helpers used by telora_connector_start and
|
|
3
|
+
// telora_product create. Manages .telora/daemon.json read/merge/write,
|
|
4
|
+
// daemon PID tracking, stop/start, and product-entry registration.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, openSync, } from "node:fs";
|
|
8
|
+
import { spawn, execFileSync } from "node:child_process";
|
|
9
|
+
import { homedir } from "node:os";
|
|
10
|
+
// Identity keys are always overwritten by a fresh config (auth/identity may rotate).
|
|
11
|
+
const IDENTITY_KEYS = ["teloraUrl", "trackerId", "organizationId"];
|
|
12
|
+
export function resolveDaemonPaths(repoPath) {
|
|
13
|
+
const globalDir = join(homedir(), ".telora");
|
|
14
|
+
const globalPath = join(globalDir, "daemon.json");
|
|
15
|
+
const localDir = join(repoPath, ".telora");
|
|
16
|
+
const localPath = join(localDir, "daemon.json");
|
|
17
|
+
const useGlobal = existsSync(globalPath);
|
|
18
|
+
return {
|
|
19
|
+
globalDir,
|
|
20
|
+
globalPath,
|
|
21
|
+
localDir,
|
|
22
|
+
localPath,
|
|
23
|
+
useGlobal,
|
|
24
|
+
configPath: useGlobal ? globalPath : localPath,
|
|
25
|
+
teloraDir: useGlobal ? globalDir : localDir,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Merge a fresh daemon config into an existing one.
|
|
30
|
+
*
|
|
31
|
+
* - Identity keys are always overwritten.
|
|
32
|
+
* - Products array: if the fresh product is already in the array, update its
|
|
33
|
+
* repoPath if different; if missing, append the new entry.
|
|
34
|
+
* - Legacy flat `productId` + `repoPath` are migrated into the products array.
|
|
35
|
+
* - Engine sections are only added if missing.
|
|
36
|
+
* - Everything else the user has customized is preserved.
|
|
37
|
+
*/
|
|
38
|
+
export function mergeConfig(existing, freshProduct, fresh) {
|
|
39
|
+
const merged = { ...existing };
|
|
40
|
+
for (const key of IDENTITY_KEYS) {
|
|
41
|
+
if (key in fresh) {
|
|
42
|
+
merged[key] = fresh[key];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
let products = Array.isArray(merged.products)
|
|
46
|
+
? merged.products
|
|
47
|
+
: [];
|
|
48
|
+
if (products.length === 0 && typeof merged.productId === "string" && merged.productId) {
|
|
49
|
+
const legacyRepoPath = typeof merged.repoPath === "string" ? merged.repoPath : process.cwd();
|
|
50
|
+
products = [{ id: merged.productId, repoPath: legacyRepoPath }];
|
|
51
|
+
}
|
|
52
|
+
delete merged.productId;
|
|
53
|
+
delete merged.repoPath;
|
|
54
|
+
let action;
|
|
55
|
+
const idx = products.findIndex((p) => p.id === freshProduct.id);
|
|
56
|
+
if (idx >= 0) {
|
|
57
|
+
if (products[idx].repoPath !== freshProduct.repoPath) {
|
|
58
|
+
products[idx] = { ...products[idx], repoPath: freshProduct.repoPath };
|
|
59
|
+
action = "updated";
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
action = "no_change";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
products.push(freshProduct);
|
|
67
|
+
action = "added";
|
|
68
|
+
}
|
|
69
|
+
merged.products = products;
|
|
70
|
+
const freshEngines = fresh.engines;
|
|
71
|
+
if (freshEngines) {
|
|
72
|
+
if (!merged.engines) {
|
|
73
|
+
merged.engines = freshEngines;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const existingEngines = merged.engines;
|
|
77
|
+
for (const engineKey of Object.keys(freshEngines)) {
|
|
78
|
+
if (!(engineKey in existingEngines)) {
|
|
79
|
+
existingEngines[engineKey] = freshEngines[engineKey];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { config: merged, action };
|
|
85
|
+
}
|
|
86
|
+
/** Read the daemon PID from .telora/daemon.pid. Returns null if missing or invalid. */
|
|
87
|
+
export function readPidFile(teloraDir) {
|
|
88
|
+
const pidPath = join(teloraDir, "daemon.pid");
|
|
89
|
+
try {
|
|
90
|
+
const raw = readFileSync(pidPath, "utf-8").trim();
|
|
91
|
+
const pid = parseInt(raw, 10);
|
|
92
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Check if a process is alive (signal 0 existence check). */
|
|
99
|
+
export function isProcessAlive(pid) {
|
|
100
|
+
try {
|
|
101
|
+
process.kill(pid, 0);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Stop the daemon gracefully: SIGTERM, poll for exit, SIGKILL fallback. */
|
|
109
|
+
export async function stopDaemon(teloraDir) {
|
|
110
|
+
const pid = readPidFile(teloraDir);
|
|
111
|
+
if (pid === null) {
|
|
112
|
+
return { stopped: false, message: "No PID file found" };
|
|
113
|
+
}
|
|
114
|
+
if (!isProcessAlive(pid)) {
|
|
115
|
+
return { stopped: false, pid, message: "Process not running" };
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
process.kill(pid, "SIGTERM");
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return { stopped: false, pid, message: "Failed to send SIGTERM" };
|
|
122
|
+
}
|
|
123
|
+
const deadline = Date.now() + 10_000;
|
|
124
|
+
while (Date.now() < deadline) {
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
126
|
+
if (!isProcessAlive(pid)) {
|
|
127
|
+
return { stopped: true, pid, message: "Stopped with SIGTERM" };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
process.kill(pid, "SIGKILL");
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
if (!isProcessAlive(pid)) {
|
|
135
|
+
return { stopped: true, pid, message: "Stopped with SIGTERM (late exit)" };
|
|
136
|
+
}
|
|
137
|
+
return { stopped: false, pid, message: "Failed to send SIGKILL" };
|
|
138
|
+
}
|
|
139
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
140
|
+
return { stopped: true, pid, message: "Stopped with SIGKILL" };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Spawn the telora-daemon as a detached background process.
|
|
144
|
+
* Resolution order: local dev build > project node_modules > npx.
|
|
145
|
+
*/
|
|
146
|
+
export async function startDaemon(paths, options = {}) {
|
|
147
|
+
mkdirSync(paths.teloraDir, { recursive: true });
|
|
148
|
+
const logPath = join(paths.teloraDir, "daemon.log");
|
|
149
|
+
const logFd = openSync(logPath, "a");
|
|
150
|
+
const configArgs = paths.useGlobal ? ["--config", paths.configPath] : [];
|
|
151
|
+
const localDevPath = join(process.cwd(), "packages/daemon/dist/index.js");
|
|
152
|
+
const nodeModulesPath = join(process.cwd(), "node_modules/.bin/telora-daemon");
|
|
153
|
+
let daemonCommand;
|
|
154
|
+
let daemonArgs;
|
|
155
|
+
let daemonSource;
|
|
156
|
+
if (existsSync(localDevPath)) {
|
|
157
|
+
daemonCommand = process.execPath;
|
|
158
|
+
daemonArgs = [localDevPath, "run", "--no-auto-update", ...configArgs];
|
|
159
|
+
daemonSource = "local";
|
|
160
|
+
}
|
|
161
|
+
else if (existsSync(nodeModulesPath)) {
|
|
162
|
+
daemonCommand = nodeModulesPath;
|
|
163
|
+
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
164
|
+
daemonSource = "node_modules";
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
let resolvedDaemonPath = null;
|
|
168
|
+
try {
|
|
169
|
+
resolvedDaemonPath = execFileSync("npx", ["-y", "-p", "@telora/daemon@latest", "which", "telora-daemon"], { encoding: "utf-8", timeout: 30_000 }).trim() || null;
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// npx not available or package can't be resolved
|
|
173
|
+
}
|
|
174
|
+
if (!resolvedDaemonPath) {
|
|
175
|
+
return {
|
|
176
|
+
status: "binary_not_found",
|
|
177
|
+
logPath,
|
|
178
|
+
errorMessage: "Could not locate telora-daemon. Install it as a dev dependency:\n" +
|
|
179
|
+
" npm install --save-dev @telora/daemon\nThen try again.",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
daemonCommand = resolvedDaemonPath;
|
|
183
|
+
daemonArgs = ["run", "--no-auto-update", ...configArgs];
|
|
184
|
+
daemonSource = "npx";
|
|
185
|
+
}
|
|
186
|
+
const daemonProcess = spawn(daemonCommand, daemonArgs, {
|
|
187
|
+
detached: true,
|
|
188
|
+
stdio: ["ignore", logFd, logFd],
|
|
189
|
+
env: { ...process.env, ...(options.extraEnv ?? {}) },
|
|
190
|
+
cwd: process.cwd(),
|
|
191
|
+
});
|
|
192
|
+
const pid = daemonProcess.pid;
|
|
193
|
+
daemonProcess.unref();
|
|
194
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
195
|
+
let alive = false;
|
|
196
|
+
try {
|
|
197
|
+
process.kill(pid, 0);
|
|
198
|
+
alive = true;
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// ESRCH = no such process
|
|
202
|
+
}
|
|
203
|
+
if (!alive) {
|
|
204
|
+
let logTail = "";
|
|
205
|
+
try {
|
|
206
|
+
const logContent = readFileSync(logPath, "utf-8");
|
|
207
|
+
const lines = logContent.trim().split("\n");
|
|
208
|
+
logTail = lines.slice(-30).join("\n");
|
|
209
|
+
}
|
|
210
|
+
catch { /* ignore */ }
|
|
211
|
+
return { status: "exit_failed", pid, logPath, daemonSource, logTail };
|
|
212
|
+
}
|
|
213
|
+
return { status: "started", pid, logPath, daemonSource };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Register a newly created product in the daemon config and signal a hot
|
|
217
|
+
* reload if the daemon is running. Used by telora_product create.
|
|
218
|
+
*
|
|
219
|
+
* Behavior:
|
|
220
|
+
* - If no daemon config exists, skip (caller is expected to call telora_connector_start).
|
|
221
|
+
* - If repoPath is already used by another product entry, skip (one repo cannot
|
|
222
|
+
* back two products in the same daemon).
|
|
223
|
+
* - Otherwise upsert the product entry, write the config, and if the daemon is
|
|
224
|
+
* running, send SIGHUP so it re-reads the config in place. In-flight teams
|
|
225
|
+
* are NOT interrupted -- only the products array is hot-reloaded.
|
|
226
|
+
*
|
|
227
|
+
* Requires a daemon built with hot-reload support (registerHotReloadSignal).
|
|
228
|
+
* Older daemons treat SIGHUP as a terminate signal; if you're targeting a mixed
|
|
229
|
+
* environment, restart the daemon once after upgrading before relying on this.
|
|
230
|
+
*/
|
|
231
|
+
export async function addProductToDaemonConfig(productId, repoPath) {
|
|
232
|
+
const paths = resolveDaemonPaths(repoPath);
|
|
233
|
+
if (!existsSync(paths.configPath)) {
|
|
234
|
+
return { written: false, reloaded: false, skippedReason: "no_config" };
|
|
235
|
+
}
|
|
236
|
+
let existing;
|
|
237
|
+
try {
|
|
238
|
+
existing = JSON.parse(readFileSync(paths.configPath, "utf-8"));
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Corrupt config: don't silently overwrite. Skip and let caller decide.
|
|
242
|
+
return { written: false, reloaded: false, skippedReason: "no_config" };
|
|
243
|
+
}
|
|
244
|
+
// Detect repoPath collision with any existing product entry (excluding the
|
|
245
|
+
// product we are about to add, in case it was already registered).
|
|
246
|
+
const existingProducts = Array.isArray(existing.products)
|
|
247
|
+
? existing.products
|
|
248
|
+
: (typeof existing.productId === "string" && existing.productId)
|
|
249
|
+
? [{ id: existing.productId, repoPath: typeof existing.repoPath === "string" ? existing.repoPath : "" }]
|
|
250
|
+
: [];
|
|
251
|
+
const collision = existingProducts.find((p) => p.id !== productId && p.repoPath === repoPath);
|
|
252
|
+
if (collision) {
|
|
253
|
+
return {
|
|
254
|
+
written: false,
|
|
255
|
+
reloaded: false,
|
|
256
|
+
skippedReason: "repo_path_in_use",
|
|
257
|
+
configPath: paths.configPath,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
const freshProduct = { id: productId, repoPath };
|
|
261
|
+
const { config, action } = mergeConfig(existing, freshProduct, {});
|
|
262
|
+
writeFileSync(paths.configPath, JSON.stringify(config, null, 2) + "\n", { mode: 0o600 });
|
|
263
|
+
// Signal hot reload only if a daemon is currently alive.
|
|
264
|
+
const livePid = (() => {
|
|
265
|
+
const g = readPidFile(paths.globalDir);
|
|
266
|
+
if (g && isProcessAlive(g))
|
|
267
|
+
return g;
|
|
268
|
+
const l = readPidFile(paths.localDir);
|
|
269
|
+
if (l && isProcessAlive(l))
|
|
270
|
+
return l;
|
|
271
|
+
return null;
|
|
272
|
+
})();
|
|
273
|
+
if (livePid === null) {
|
|
274
|
+
return {
|
|
275
|
+
written: true,
|
|
276
|
+
configAction: action,
|
|
277
|
+
configPath: paths.configPath,
|
|
278
|
+
reloaded: false,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
process.kill(livePid, "SIGHUP");
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
return {
|
|
286
|
+
written: true,
|
|
287
|
+
configAction: action,
|
|
288
|
+
configPath: paths.configPath,
|
|
289
|
+
reloaded: false,
|
|
290
|
+
daemonPid: livePid,
|
|
291
|
+
reloadError: err instanceof Error ? err.message : String(err),
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
written: true,
|
|
296
|
+
configAction: action,
|
|
297
|
+
configPath: paths.configPath,
|
|
298
|
+
reloaded: true,
|
|
299
|
+
daemonPid: livePid,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=daemonConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemonConfig.js","sourceRoot":"","sources":["../../src/handlers/daemonConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { callProductApi, successResult, validationError, buildFields, wrapHandler, compactEntity, } from "../shared.js";
|
|
7
|
+
import { addProductToDaemonConfig } from "./daemonConfig.js";
|
|
7
8
|
export function registerProductTools(server, getCreds, profile = 'full') {
|
|
8
9
|
server.tool("telora_product", "Product registry: manage the portfolio of software products. Each product scopes focuses, deliveries, issues, and context documents. " +
|
|
9
10
|
"Actions: list products, create a new product (name required), get product details (by name or id), " +
|
|
@@ -62,7 +63,40 @@ export function registerProductTools(server, getCreds, profile = 'full') {
|
|
|
62
63
|
action: "create",
|
|
63
64
|
fields,
|
|
64
65
|
});
|
|
65
|
-
|
|
66
|
+
// Register the new product in the local daemon config (cwd is the
|
|
67
|
+
// repoPath). Skipped if no daemon config exists or if cwd is already
|
|
68
|
+
// bound to another product. Sends SIGHUP to the running daemon so it
|
|
69
|
+
// hot-reloads the products array without restarting -- in-flight
|
|
70
|
+
// teams keep running.
|
|
71
|
+
const productId = typeof result.product.id === "string" ? result.product.id : null;
|
|
72
|
+
let daemonRegistration;
|
|
73
|
+
if (productId) {
|
|
74
|
+
try {
|
|
75
|
+
const reg = await addProductToDaemonConfig(productId, process.cwd());
|
|
76
|
+
daemonRegistration = {
|
|
77
|
+
written: reg.written,
|
|
78
|
+
reloaded: reg.reloaded,
|
|
79
|
+
...(reg.configAction ? { configAction: reg.configAction } : {}),
|
|
80
|
+
...(reg.configPath ? { configPath: reg.configPath } : {}),
|
|
81
|
+
...(reg.skippedReason ? { skippedReason: reg.skippedReason } : {}),
|
|
82
|
+
...(reg.daemonPid ? { daemonPid: reg.daemonPid } : {}),
|
|
83
|
+
...(reg.reloadError ? { reloadError: reg.reloadError } : {}),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
// Don't fail the product creation if daemon registration errors.
|
|
88
|
+
daemonRegistration = {
|
|
89
|
+
written: false,
|
|
90
|
+
reloaded: false,
|
|
91
|
+
error: e instanceof Error ? e.message : String(e),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const compact = compactEntity(result.product, Object.keys(fields), params.returnFull);
|
|
96
|
+
const response = { ...compact };
|
|
97
|
+
if (daemonRegistration)
|
|
98
|
+
response.daemon = daemonRegistration;
|
|
99
|
+
return successResult(response);
|
|
66
100
|
}
|
|
67
101
|
case "get": {
|
|
68
102
|
if (!params.name && !params.id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"productHandlers.js","sourceRoot":"","sources":["../../src/handlers/productHandlers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,uCAAuC;AACvC,6DAA6D;AAC7D,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACX,WAAW,EACX,aAAa,GAGd,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"productHandlers.js","sourceRoot":"","sources":["../../src/handlers/productHandlers.ts"],"names":[],"mappings":"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"}
|