@ai-support-agent/cli 0.1.7 → 0.1.8

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.
@@ -1,5 +1,54 @@
1
+ import type { ProjectRegistration } from '../../types';
2
+ import { getCliEntryPoint, getNodePath } from './node-paths';
1
3
  import type { ServiceConfig, ServiceOptions, ServiceStatus, ServiceStrategy } from './types';
4
+ export { getCliEntryPoint, getNodePath };
5
+ /** Returns the systemd unit name for a given project (without .service suffix) */
6
+ export declare function getProjectUnitName(tenantCode: string, projectCode: string): string;
7
+ /** Returns the .service file path for a given project */
8
+ export declare function getProjectUnitFilePath(tenantCode: string, projectCode: string): string;
9
+ /** Lists all per-project unit files under ~/.config/systemd/user */
10
+ export declare function getAllProjectUnits(): Array<{
11
+ unitName: string;
12
+ unitPath: string;
13
+ }>;
2
14
  export declare function generateServiceUnit(options: ServiceConfig): string;
15
+ /** Generate a systemd unit that runs a wrapper shell script for one project */
16
+ export declare function generateProjectServiceUnit(opts: {
17
+ unitName: string;
18
+ wrapperScriptPath: string;
19
+ logDir: string;
20
+ }): string;
21
+ /** Generate a bash wrapper script that runs docker for one project */
22
+ export declare function generateWrapperScript(opts: {
23
+ imageName: string;
24
+ tenantCode: string;
25
+ projectCode: string;
26
+ projectConfigHostDir: string;
27
+ projectDir?: string;
28
+ token: string;
29
+ apiUrl: string;
30
+ anthropicApiKey?: string;
31
+ claudeCodeOauthToken?: string;
32
+ verbose?: boolean;
33
+ updateScriptPath: string;
34
+ }): string;
35
+ /** Generate the update-and-restart.sh script for systemd */
36
+ export declare function generateUpdateScript(): string;
37
+ /**
38
+ * Write run.sh and systemd unit for a single project. Does NOT systemctl start.
39
+ * Returns the unit file path.
40
+ */
41
+ export declare function writeProjectServiceFiles(project: ProjectRegistration, options?: {
42
+ verbose?: boolean;
43
+ }): string;
44
+ /**
45
+ * Install service files and immediately start a single project via systemctl.
46
+ * Idempotent: stops any existing service before starting so that token/config
47
+ * updates take effect immediately.
48
+ */
49
+ export declare function installAndStartProject(project: ProjectRegistration, options?: {
50
+ verbose?: boolean;
51
+ }): void;
3
52
  export declare class LinuxServiceStrategy implements ServiceStrategy {
4
53
  install(options: ServiceOptions): void;
5
54
  uninstall(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"linux-service.d.ts","sourceRoot":"","sources":["../../../src/cli/service/linux-service.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAY5F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA4BlE;AAED,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAuCtC,SAAS,IAAI,IAAI;IAcjB,KAAK,IAAI,IAAI;IAmBb,IAAI,IAAI,IAAI;IAkBZ,OAAO,IAAI,IAAI;IAmBf,MAAM,IAAI,aAAa;CAmBxB"}
1
+ {"version":3,"file":"linux-service.d.ts","sourceRoot":"","sources":["../../../src/cli/service/linux-service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,aAAa,EACb,eAAe,EAChB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAA;AAwExC,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,IAAI,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBlF;AA6BD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CA4BlE;AAMD,+EAA+E;AAC/E,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,MAAM,CAuBT;AAaD,sEAAsE;AACtE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;CACzB,GAAG,MAAM,CAuGT;AAED,4DAA4D;AAC5D,wBAAgB,oBAAoB,IAAI,MAAM,CAoG7C;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,MAAM,CAmDR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,IAAI,CAiDN;AAMD,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAkFtC,SAAS,IAAI,IAAI;IAsBjB,KAAK,IAAI,IAAI;IAgCb,IAAI,IAAI,IAAI;IAwBZ,OAAO,IAAI,IAAI;IA8Bf,MAAM,IAAI,aAAa;CA6DxB"}
@@ -33,22 +33,141 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.LinuxServiceStrategy = void 0;
36
+ exports.LinuxServiceStrategy = exports.getNodePath = exports.getCliEntryPoint = void 0;
37
+ exports.getProjectUnitName = getProjectUnitName;
38
+ exports.getProjectUnitFilePath = getProjectUnitFilePath;
39
+ exports.getAllProjectUnits = getAllProjectUnits;
37
40
  exports.generateServiceUnit = generateServiceUnit;
41
+ exports.generateProjectServiceUnit = generateProjectServiceUnit;
42
+ exports.generateWrapperScript = generateWrapperScript;
43
+ exports.generateUpdateScript = generateUpdateScript;
44
+ exports.writeProjectServiceFiles = writeProjectServiceFiles;
45
+ exports.installAndStartProject = installAndStartProject;
38
46
  const child_process_1 = require("child_process");
39
47
  const fs = __importStar(require("fs"));
40
48
  const os = __importStar(require("os"));
41
49
  const path = __importStar(require("path"));
50
+ const config_manager_1 = require("../../config-manager");
51
+ const docker_utils_1 = require("../../docker/docker-utils");
42
52
  const i18n_1 = require("../../i18n");
43
53
  const logger_1 = require("../../logger");
44
54
  const node_paths_1 = require("./node-paths");
55
+ Object.defineProperty(exports, "getCliEntryPoint", { enumerable: true, get: function () { return node_paths_1.getCliEntryPoint; } });
56
+ Object.defineProperty(exports, "getNodePath", { enumerable: true, get: function () { return node_paths_1.getNodePath; } });
45
57
  const SERVICE_NAME = 'ai-support-agent.service';
46
- function getServiceFilePath() {
47
- return path.join(os.homedir(), '.config', 'systemd', 'user', SERVICE_NAME);
58
+ const SERVICE_PREFIX = 'ai-support-agent';
59
+ function getSystemdUserDir() {
60
+ return path.join(os.homedir(), '.config', 'systemd', 'user');
48
61
  }
49
62
  function getLogDir() {
50
63
  return path.join(os.homedir(), '.local', 'share', 'ai-support-agent', 'logs');
51
64
  }
65
+ // ---------------------------------------------------------------------------
66
+ // Per-project unit helpers
67
+ // ---------------------------------------------------------------------------
68
+ function sanitize(s) {
69
+ return s.toLowerCase().replace(/[^a-z0-9-]/g, '-');
70
+ }
71
+ /**
72
+ * POSIX shell single-quote a value so it can be safely interpolated into a
73
+ * bash script. Wraps the value in single quotes and escapes any embedded
74
+ * single quote as `'\''`. The result is always exactly one shell argument.
75
+ */
76
+ function shellQuote(value) {
77
+ return `'${value.replace(/'/g, `'\\''`)}'`;
78
+ }
79
+ /**
80
+ * Write a file with content and enforce mode. `fs.writeFileSync({ mode })`
81
+ * only applies the mode when the file is *created*; overwriting an existing
82
+ * file inherits the prior permissions, so a previously world-readable
83
+ * wrapper script (e.g. left by an older install or an out-of-band edit)
84
+ * would retain its lax mode despite containing bearer tokens. Explicit
85
+ * chmod after write guarantees the desired permissions either way.
86
+ */
87
+ function writeFileEnsuringMode(filePath, content, mode) {
88
+ fs.writeFileSync(filePath, content, { mode });
89
+ fs.chmodSync(filePath, mode);
90
+ }
91
+ /**
92
+ * Escape a value for use inside a systemd unit (ExecStart, Environment, etc.).
93
+ * Per `man 5 systemd.service`, `man 5 systemd.exec` and `man 5 systemd.unit`:
94
+ * - Backslash is the escape character; the literal backslash must be written
95
+ * as `\\`.
96
+ * - `$` in command lines triggers Environment variable expansion (`$FOO`); the
97
+ * literal dollar sign must be written as `$$`.
98
+ * - `%` triggers specifier expansion (`%h`, `%u`, etc.); the literal percent
99
+ * sign must be written as `%%`.
100
+ * - Whitespace separates argv tokens and must be escaped as `\x20`.
101
+ * - Double-quote, tab, and newline also need backslash escaping.
102
+ *
103
+ * Ordering matters: backslash MUST be doubled first so that the backslashes
104
+ * we subsequently introduce (e.g. `\"`, `\x20`) are not themselves re-doubled.
105
+ * `$` → `$$` and `%` → `%%` are independent of the backslash pass because
106
+ * they don't introduce a backslash. In JS replace strings, `$$` denotes a
107
+ * literal `$`, so `'$$$$'` produces `$$` and `'%%'` produces `%%`.
108
+ */
109
+ function systemdEscape(value) {
110
+ return value
111
+ .replace(/\\/g, '\\\\')
112
+ .replace(/\$/g, '$$$$')
113
+ .replace(/%/g, '%%')
114
+ .replace(/"/g, '\\"')
115
+ .replace(/\t/g, '\\t')
116
+ .replace(/\n/g, '\\n')
117
+ .replace(/ /g, '\\x20');
118
+ }
119
+ /** Returns the systemd unit name for a given project (without .service suffix) */
120
+ function getProjectUnitName(tenantCode, projectCode) {
121
+ return `${SERVICE_PREFIX}-${sanitize(tenantCode)}-${sanitize(projectCode)}`;
122
+ }
123
+ /** Returns the .service file path for a given project */
124
+ function getProjectUnitFilePath(tenantCode, projectCode) {
125
+ return path.join(getSystemdUserDir(), `${getProjectUnitName(tenantCode, projectCode)}.service`);
126
+ }
127
+ /** Lists all per-project unit files under ~/.config/systemd/user */
128
+ function getAllProjectUnits() {
129
+ const systemdDir = getSystemdUserDir();
130
+ const prefix = `${SERVICE_PREFIX}-`;
131
+ const results = [];
132
+ try {
133
+ const files = fs.readdirSync(systemdDir);
134
+ for (const file of files) {
135
+ if (file.startsWith(prefix) &&
136
+ file.endsWith('.service') &&
137
+ file !== SERVICE_NAME) {
138
+ const unitName = file.slice(0, -'.service'.length);
139
+ results.push({ unitName, unitPath: path.join(systemdDir, file) });
140
+ }
141
+ }
142
+ }
143
+ catch {
144
+ // systemd user dir doesn't exist yet — return empty list
145
+ }
146
+ return results;
147
+ }
148
+ /** Returns the host-side per-project config dir (mirrors what docker-runner uses) */
149
+ function getProjectConfigHostDir(tenantCode, projectCode) {
150
+ const configDir = process.env.AI_SUPPORT_AGENT_CONFIG_DIR
151
+ ? path.resolve(process.env.AI_SUPPORT_AGENT_CONFIG_DIR)
152
+ : path.join(os.homedir(), '.ai-support-agent');
153
+ return path.join(configDir, 'projects', tenantCode, projectCode, '.ai-support-agent');
154
+ }
155
+ /** Returns the services dir where wrapper scripts are stored */
156
+ function getServicesDir() {
157
+ const configDir = process.env.AI_SUPPORT_AGENT_CONFIG_DIR
158
+ ? path.resolve(process.env.AI_SUPPORT_AGENT_CONFIG_DIR)
159
+ : path.join(os.homedir(), '.ai-support-agent');
160
+ return path.join(configDir, 'services');
161
+ }
162
+ function getUpdateScriptPath() {
163
+ const configDir = process.env.AI_SUPPORT_AGENT_CONFIG_DIR
164
+ ? path.resolve(process.env.AI_SUPPORT_AGENT_CONFIG_DIR)
165
+ : path.join(os.homedir(), '.ai-support-agent');
166
+ return path.join(configDir, 'update-and-restart.sh');
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Legacy single-unit generation (kept for backward compatibility / tests)
170
+ // ---------------------------------------------------------------------------
52
171
  function generateServiceUnit(options) {
53
172
  const { nodePath, entryPoint, logDir, verbose, docker } = options;
54
173
  const execArgs = [nodePath, entryPoint, 'start'];
@@ -77,117 +196,585 @@ StandardError=append:${path.join(logDir, 'agent.err.log')}
77
196
  WantedBy=default.target
78
197
  `;
79
198
  }
199
+ // ---------------------------------------------------------------------------
200
+ // Per-project unit generation
201
+ // ---------------------------------------------------------------------------
202
+ /** Generate a systemd unit that runs a wrapper shell script for one project */
203
+ function generateProjectServiceUnit(opts) {
204
+ const escapedWrapper = systemdEscape(opts.wrapperScriptPath);
205
+ const escapedHome = systemdEscape(os.homedir());
206
+ const escapedOutLog = systemdEscape(path.join(opts.logDir, 'agent.out.log'));
207
+ const escapedErrLog = systemdEscape(path.join(opts.logDir, 'agent.err.log'));
208
+ return `[Unit]
209
+ Description=AI Support Agent (${opts.unitName})
210
+ After=network-online.target
211
+ Wants=network-online.target
212
+
213
+ [Service]
214
+ Type=simple
215
+ ExecStart=/bin/bash ${escapedWrapper}
216
+ Restart=always
217
+ RestartSec=10
218
+ Environment=PATH=/usr/local/bin:/usr/bin:/bin
219
+ Environment=HOME=${escapedHome}
220
+ StandardOutput=append:${escapedOutLog}
221
+ StandardError=append:${escapedErrLog}
222
+
223
+ [Install]
224
+ WantedBy=default.target
225
+ `;
226
+ }
227
+ /** Convert localhost/127.0.0.1 to host.docker.internal for container use */
228
+ function toContainerApiUrl(apiUrl) {
229
+ // The host portion must be terminated by `:`, `/`, or end-of-string;
230
+ // otherwise URLs like `http://localhost.example.com` would partially match
231
+ // and produce `http://host.docker.internal.example.com` (a different host).
232
+ return apiUrl.replace(/^(https?:\/\/)(localhost|127\.0\.0\.1)(?=$|[:/])/, (_, scheme) => `${scheme}host.docker.internal`);
233
+ }
234
+ /** Generate a bash wrapper script that runs docker for one project */
235
+ function generateWrapperScript(opts) {
236
+ const containerHome = '/home/node';
237
+ const containerConfigDir = `${containerHome}/.ai-support-agent`;
238
+ const homeDir = os.homedir();
239
+ const containerApiUrl = toContainerApiUrl(opts.apiUrl);
240
+ // All user-supplied values (paths, tokens, URLs, API keys) are interpolated
241
+ // into a generated bash script. Shell-quote every value to defend against
242
+ // whitespace, shell metacharacters (`$`, backticks, `"`), and outright
243
+ // injection from a malicious or malformed token / env var.
244
+ const qProjectConfig = shellQuote(opts.projectConfigHostDir);
245
+ const qContainerHome = shellQuote(containerHome);
246
+ const qContainerConfigDir = shellQuote(containerConfigDir);
247
+ const qToken = shellQuote(opts.token);
248
+ const qApiUrl = shellQuote(containerApiUrl);
249
+ const qImageName = shellQuote(opts.imageName);
250
+ const qUpdateScriptPath = shellQuote(opts.updateScriptPath);
251
+ // tenant/project are sanitized to [a-z0-9-] for container name and the
252
+ // --project value, so they're shell-safe; still quote for defense in depth.
253
+ const containerName = `ai-${sanitize(opts.tenantCode)}-${sanitize(opts.projectCode)}`;
254
+ const qContainerName = shellQuote(containerName);
255
+ const qProjectArg = shellQuote(`${opts.tenantCode}/${opts.projectCode}`);
256
+ const mountLines = [
257
+ ` -v ${shellQuote(`${homeDir}/.claude:${containerHome}/.claude:rw`)} \\`,
258
+ ` -v ${shellQuote(`${opts.projectConfigHostDir}:${containerConfigDir}:rw`)} \\`,
259
+ ` -v ${shellQuote(`${homeDir}/.claude.json:${containerHome}/.claude.json:rw`)} \\`,
260
+ ];
261
+ if (opts.projectDir) {
262
+ const containerProjectDir = `/workspace/projects/${opts.projectCode}`;
263
+ mountLines.push(` -v ${shellQuote(`${opts.projectDir}:${containerProjectDir}:rw`)} \\`);
264
+ }
265
+ const envLines = [
266
+ ` -e AI_SUPPORT_AGENT_IN_DOCKER=1 \\`,
267
+ ` -e HOME=${qContainerHome} \\`,
268
+ ` -e AI_SUPPORT_AGENT_CONFIG_DIR=${qContainerConfigDir} \\`,
269
+ ` -e AI_SUPPORT_AGENT_TOKEN=${qToken} \\`,
270
+ ` -e AI_SUPPORT_AGENT_API_URL=${qApiUrl} \\`,
271
+ ];
272
+ if (opts.anthropicApiKey) {
273
+ envLines.push(` -e ANTHROPIC_API_KEY=${shellQuote(opts.anthropicApiKey)} \\`);
274
+ }
275
+ if (opts.claudeCodeOauthToken) {
276
+ envLines.push(` -e CLAUDE_CODE_OAUTH_TOKEN=${shellQuote(opts.claudeCodeOauthToken)} \\`);
277
+ }
278
+ const containerArgs = [
279
+ 'ai-support-agent', 'start', '--no-docker',
280
+ `--project ${qProjectArg}`,
281
+ ];
282
+ if (opts.verbose)
283
+ containerArgs.push('--verbose');
284
+ return `#!/bin/bash
285
+ set -uo pipefail
286
+
287
+ # Load nvm if available so that node/npm are on PATH when launched as a systemd service
288
+ export NVM_DIR="\${HOME}/.nvm"
289
+ # shellcheck disable=SC1091
290
+ [ -s "\${NVM_DIR}/nvm.sh" ] && source "\${NVM_DIR}/nvm.sh"
291
+ # Also try common system locations as fallback
292
+ export PATH="/usr/local/bin:/usr/bin:/bin:\${PATH}"
293
+
294
+ REBUILD_MARKER=${qProjectConfig}/docker-rebuild-needed
295
+ if [ -f "$REBUILD_MARKER" ]; then
296
+ rm -f "$REBUILD_MARKER"
297
+ ai-support-agent docker-build 2>/dev/null || true
298
+ fi
299
+
300
+ # Resolve the installed version at runtime so the image stays current after npm updates
301
+ _NPM_ROOT=$(npm root -g 2>/dev/null)
302
+ _CLI_PKG_JSON="\${_NPM_ROOT}/@ai-support-agent/cli/package.json"
303
+ _INSTALLED_VERSION=$(node -p "require('\${_CLI_PKG_JSON}').version" 2>/dev/null || echo "")
304
+ if [ -z "$_INSTALLED_VERSION" ]; then
305
+ echo "ERROR: Could not determine installed version of @ai-support-agent/cli" >&2
306
+ exit 1
307
+ fi
308
+ IMAGE_TAG=${qImageName}:\${_INSTALLED_VERSION}
309
+
310
+ # Auto-build Docker image if the required version does not exist locally
311
+ if ! docker image inspect "\$IMAGE_TAG" >/dev/null 2>&1; then
312
+ echo "Docker image \$IMAGE_TAG not found — building..." >&2
313
+ ai-support-agent docker-build || { echo "ERROR: docker-build failed — cannot start container" >&2; exit 1; }
314
+ fi
315
+
316
+ # Remove stale container if it exists (e.g. from a previous crash)
317
+ docker rm -f ${qContainerName} 2>/dev/null || true
318
+
319
+ docker run --rm -i --name ${qContainerName} \\
320
+ ${mountLines.join('\n')}
321
+ ${envLines.join('\n')}
322
+ "\$IMAGE_TAG" \\
323
+ ${containerArgs.join(' ')}
324
+
325
+ EXIT_CODE=$?
326
+
327
+ if [ "$EXIT_CODE" -eq 42 ]; then
328
+ exec ${qUpdateScriptPath}
329
+ fi
330
+
331
+ exit "$EXIT_CODE"
332
+ `;
333
+ }
334
+ /** Generate the update-and-restart.sh script for systemd */
335
+ function generateUpdateScript() {
336
+ const configDir = process.env.AI_SUPPORT_AGENT_CONFIG_DIR
337
+ ? path.resolve(process.env.AI_SUPPORT_AGENT_CONFIG_DIR)
338
+ : path.join(os.homedir(), '.ai-support-agent');
339
+ // Quote interpolated paths so a HOME / config dir containing whitespace
340
+ // or shell metacharacters doesn't word-split the generated script.
341
+ const qSystemdDir = shellQuote(getSystemdUserDir());
342
+ const qVersionFile = shellQuote(path.join(configDir, 'update-version.json'));
343
+ return `#!/bin/bash
344
+ set -uo pipefail
345
+ shopt -s nullglob
346
+
347
+ # Load nvm if available so that node/npm are on PATH when launched from systemd
348
+ export NVM_DIR="\${HOME}/.nvm"
349
+ # shellcheck disable=SC1091
350
+ [ -s "\${NVM_DIR}/nvm.sh" ] && source "\${NVM_DIR}/nvm.sh"
351
+ export PATH="/usr/local/bin:/usr/bin:/bin:\${PATH}"
352
+
353
+ LOG_PREFIX="[update-and-restart $(date -u '+%Y-%m-%dT%H:%M:%SZ')]"
354
+
355
+ # Best-effort secret redaction for command output that we echo to stderr.
356
+ redact_secrets() {
357
+ sed -E \\
358
+ -e 's#(Bearer )[A-Za-z0-9._-]+#\\1***REDACTED***#gi' \\
359
+ -e 's#(authToken[[:space:]]*[:=][[:space:]]*"?)[^"[:space:]]+#\\1***REDACTED***#gi' \\
360
+ -e 's#(_authToken[[:space:]]*[:=][[:space:]]*"?)[^"[:space:]]+#\\1***REDACTED***#gi' \\
361
+ -e 's#(X-Auth-Token:[[:space:]]*)[^[:space:]]+#\\1***REDACTED***#gi' \\
362
+ -e 's#(https?://)[^/:[:space:]@]+:[^@/[:space:]]+@#\\1***REDACTED***@#gi'
363
+ }
364
+
365
+ SYSTEMD_USER_DIR=${qSystemdDir}
366
+
367
+ # 1. Stop all per-project systemd services. systemctl does not glob unit
368
+ # names itself, so expand via the shell and stop each unit individually.
369
+ for unit_path in "$SYSTEMD_USER_DIR"/${SERVICE_PREFIX}-*.service; do
370
+ [ -f "$unit_path" ] || continue
371
+ unit_name=$(basename "$unit_path")
372
+ # Skip the legacy aggregate unit if it happens to match the prefix.
373
+ if [ "$unit_name" = "${SERVICE_NAME}" ]; then
374
+ continue
375
+ fi
376
+ systemctl --user stop "$unit_name" 2>/dev/null || true
377
+ done
378
+
379
+ # 2. Install new version if update-version.json exists.
380
+ VERSION_FILE=${qVersionFile}
381
+ _INSTALL_OK=true
382
+ if [ -f "$VERSION_FILE" ]; then
383
+ # Pass the path via env var so an apostrophe (or other JS string metachar) in
384
+ # HOME or AI_SUPPORT_AGENT_CONFIG_DIR cannot break the JS string literal.
385
+ NEW_VERSION=$(VERSION_FILE="$VERSION_FILE" node -e "try{console.log(JSON.parse(require('fs').readFileSync(process.env.VERSION_FILE,'utf-8')).version||'')}catch(e){console.log('')}" 2>/dev/null || echo "")
386
+ rm -f "$VERSION_FILE"
387
+ if [ -n "$NEW_VERSION" ]; then
388
+ NPM_OUTPUT=$(npm install -g "@ai-support-agent/cli@$NEW_VERSION" --quiet 2>&1)
389
+ NPM_STATUS=$?
390
+ if [ "$NPM_STATUS" -ne 0 ]; then
391
+ echo "$LOG_PREFIX ERROR: npm install -g @ai-support-agent/cli@$NEW_VERSION failed (exit $NPM_STATUS)" >&2
392
+ printf '%s\\n' "$NPM_OUTPUT" | redact_secrets >&2
393
+ _INSTALL_OK=false
394
+ else
395
+ SI_OUTPUT=$(ai-support-agent service install 2>&1)
396
+ SI_STATUS=$?
397
+ if [ "$SI_STATUS" -ne 0 ]; then
398
+ echo "$LOG_PREFIX ERROR: ai-support-agent service install failed (exit $SI_STATUS)" >&2
399
+ printf '%s\\n' "$SI_OUTPUT" | redact_secrets >&2
400
+ _INSTALL_OK=false
401
+ fi
402
+ fi
403
+ fi
404
+ fi
405
+
406
+ # 3. Reload systemd and restart all per-project services (always, even if install failed)
407
+ systemctl --user daemon-reload || true
408
+
409
+ _RELOAD_FAILED=0
410
+ for unit_path in "$SYSTEMD_USER_DIR"/${SERVICE_PREFIX}-*.service; do
411
+ [ -f "$unit_path" ] || continue
412
+ unit_name=$(basename "$unit_path")
413
+ # Skip the legacy aggregate unit
414
+ if [ "$unit_name" = "${SERVICE_NAME}" ]; then
415
+ continue
416
+ fi
417
+ if ! systemctl --user start "$unit_name" 2>&1; then
418
+ echo "$LOG_PREFIX ERROR: systemctl --user start $unit_name failed" >&2
419
+ _RELOAD_FAILED=$((_RELOAD_FAILED + 1))
420
+ fi
421
+ done
422
+
423
+ if [ "$_RELOAD_FAILED" -gt 0 ]; then
424
+ echo "$LOG_PREFIX ERROR: $_RELOAD_FAILED systemd unit(s) failed to restart" >&2
425
+ fi
426
+
427
+ if [ "$_INSTALL_OK" = "false" ] || [ "$_RELOAD_FAILED" -gt 0 ]; then
428
+ exit 1
429
+ fi
430
+
431
+ exit 0
432
+ `;
433
+ }
434
+ // ---------------------------------------------------------------------------
435
+ // Per-project file writing
436
+ // ---------------------------------------------------------------------------
437
+ /**
438
+ * Write run.sh and systemd unit for a single project. Does NOT systemctl start.
439
+ * Returns the unit file path.
440
+ */
441
+ function writeProjectServiceFiles(project, options = {}) {
442
+ const { tenantCode, projectCode } = project;
443
+ const projectKey = `${sanitize(tenantCode)}-${sanitize(projectCode)}`;
444
+ const logDir = getLogDir();
445
+ const projectLogDir = path.join(logDir, projectKey);
446
+ if (!fs.existsSync(projectLogDir)) {
447
+ fs.mkdirSync(projectLogDir, { recursive: true, mode: 0o700 });
448
+ }
449
+ const systemdDir = getSystemdUserDir();
450
+ if (!fs.existsSync(systemdDir)) {
451
+ fs.mkdirSync(systemdDir, { recursive: true });
452
+ }
453
+ const servicesDir = getServicesDir();
454
+ const projectServiceDir = path.join(servicesDir, projectKey);
455
+ if (!fs.existsSync(projectServiceDir)) {
456
+ fs.mkdirSync(projectServiceDir, { recursive: true, mode: 0o700 });
457
+ }
458
+ const projectConfigHostDir = getProjectConfigHostDir(tenantCode, projectCode);
459
+ if (!fs.existsSync(projectConfigHostDir)) {
460
+ fs.mkdirSync(projectConfigHostDir, { recursive: true, mode: 0o700 });
461
+ }
462
+ const updateScriptPath = getUpdateScriptPath();
463
+ const wrapperScriptPath = path.join(projectServiceDir, 'run.sh');
464
+ const wrapperScript = generateWrapperScript({
465
+ imageName: docker_utils_1.IMAGE_NAME,
466
+ tenantCode,
467
+ projectCode,
468
+ projectConfigHostDir,
469
+ projectDir: project.projectDir,
470
+ token: project.token,
471
+ apiUrl: project.apiUrl,
472
+ anthropicApiKey: process.env.ANTHROPIC_API_KEY,
473
+ claudeCodeOauthToken: process.env.CLAUDE_CODE_OAUTH_TOKEN,
474
+ verbose: options.verbose,
475
+ updateScriptPath,
476
+ });
477
+ // 0o700 — wrapper embeds the agent token (and optionally ANTHROPIC_API_KEY
478
+ // / CLAUDE_CODE_OAUTH_TOKEN) as shell-quoted literals. See writeFileEnsuringMode.
479
+ writeFileEnsuringMode(wrapperScriptPath, wrapperScript, 0o700);
480
+ const unitName = getProjectUnitName(tenantCode, projectCode);
481
+ const unitPath = getProjectUnitFilePath(tenantCode, projectCode);
482
+ const unit = generateProjectServiceUnit({ unitName, wrapperScriptPath, logDir: projectLogDir });
483
+ fs.writeFileSync(unitPath, unit, 'utf-8');
484
+ return unitPath;
485
+ }
486
+ /**
487
+ * Install service files and immediately start a single project via systemctl.
488
+ * Idempotent: stops any existing service before starting so that token/config
489
+ * updates take effect immediately.
490
+ */
491
+ function installAndStartProject(project, options = {}) {
492
+ const updateScriptPath = getUpdateScriptPath();
493
+ const updateScript = generateUpdateScript();
494
+ writeFileEnsuringMode(updateScriptPath, updateScript, 0o700);
495
+ writeProjectServiceFiles(project, options);
496
+ const unitName = getProjectUnitName(project.tenantCode, project.projectCode);
497
+ const unitFile = `${unitName}.service`;
498
+ // Reload systemd so the new/updated unit is recognised. Use the same
499
+ // diagnostic key as the strategy install() so support logs can correlate.
500
+ try {
501
+ (0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'pipe' });
502
+ }
503
+ catch (error) {
504
+ const message = error instanceof Error ? error.message : String(error);
505
+ logger_1.logger.warn((0, i18n_1.t)('service.daemonReloadFailed', { message }));
506
+ return;
507
+ }
508
+ // Stop first so that updated run.sh / token changes take effect.
509
+ try {
510
+ (0, child_process_1.execSync)(`systemctl --user stop "${unitFile}"`, { stdio: 'pipe' });
511
+ }
512
+ catch { /* not running */ }
513
+ // Enable so the service starts on login. Warn (don't fail) on errors —
514
+ // common cases are missing user instance (linger off on shared hosts),
515
+ // which still allows start to succeed for the current session.
516
+ try {
517
+ (0, child_process_1.execSync)(`systemctl --user enable "${unitFile}"`, { stdio: 'pipe' });
518
+ }
519
+ catch (error) {
520
+ const message = error instanceof Error ? error.message : String(error);
521
+ logger_1.logger.warn((0, i18n_1.t)('service.enableFailed', { unit: unitFile, message }));
522
+ }
523
+ try {
524
+ (0, child_process_1.execSync)(`systemctl --user start "${unitFile}"`, { stdio: 'pipe' });
525
+ }
526
+ catch (error) {
527
+ const message = error instanceof Error ? error.message : String(error);
528
+ logger_1.logger.warn((0, i18n_1.t)('service.loadWarning', { label: `${unitName}: ${message}` }));
529
+ return;
530
+ }
531
+ // Verify the service is actually active after start.
532
+ try {
533
+ const out = (0, child_process_1.execSync)(`systemctl --user is-active "${unitFile}"`, { stdio: 'pipe' }).toString().trim();
534
+ if (out !== 'active') {
535
+ logger_1.logger.warn((0, i18n_1.t)('service.loadWarning', { label: unitName }));
536
+ }
537
+ }
538
+ catch {
539
+ logger_1.logger.warn((0, i18n_1.t)('service.loadWarning', { label: unitName }));
540
+ }
541
+ }
542
+ // ---------------------------------------------------------------------------
543
+ // LinuxServiceStrategy
544
+ // ---------------------------------------------------------------------------
80
545
  class LinuxServiceStrategy {
81
546
  install(options) {
82
- const serviceFilePath = getServiceFilePath();
83
- const logDir = getLogDir();
84
- const nodePath = (0, node_paths_1.getNodePath)();
85
- const entryPoint = (0, node_paths_1.getCliEntryPoint)();
86
- if (!fs.existsSync(entryPoint)) {
87
- logger_1.logger.error((0, i18n_1.t)('service.entryPointNotFound', { path: entryPoint }));
547
+ const config = (0, config_manager_1.loadConfig)();
548
+ const projects = config ? (0, config_manager_1.getProjectList)(config) : [];
549
+ if (projects.length === 0) {
550
+ logger_1.logger.error((0, i18n_1.t)('service.noProjectsConfigured'));
88
551
  return;
89
552
  }
553
+ const logDir = getLogDir();
90
554
  if (!fs.existsSync(logDir)) {
91
555
  fs.mkdirSync(logDir, { recursive: true });
92
556
  }
93
- const systemdDir = path.dirname(serviceFilePath);
557
+ const systemdDir = getSystemdUserDir();
94
558
  if (!fs.existsSync(systemdDir)) {
95
559
  fs.mkdirSync(systemdDir, { recursive: true });
96
560
  }
97
- if (fs.existsSync(serviceFilePath)) {
98
- logger_1.logger.info((0, i18n_1.t)('service.overwriting', { path: serviceFilePath }));
99
- }
100
- const unit = generateServiceUnit({
101
- nodePath,
102
- entryPoint,
103
- logDir,
104
- verbose: options.verbose,
105
- docker: options.docker,
106
- });
107
- fs.writeFileSync(serviceFilePath, unit, 'utf-8');
108
- logger_1.logger.success((0, i18n_1.t)('service.installed.linux', { path: serviceFilePath }));
109
- logger_1.logger.info((0, i18n_1.t)('service.loadHint.linux'));
561
+ const updateScriptPath = getUpdateScriptPath();
562
+ const updateScript = generateUpdateScript();
563
+ writeFileEnsuringMode(updateScriptPath, updateScript, 0o700);
564
+ const writtenUnits = [];
565
+ const expectedUnitNames = new Set();
566
+ for (const project of projects) {
567
+ const unitPath = writeProjectServiceFiles(project, { verbose: options.verbose });
568
+ const unitName = getProjectUnitName(project.tenantCode, project.projectCode);
569
+ expectedUnitNames.add(unitName);
570
+ writtenUnits.push({
571
+ projectCode: project.projectCode,
572
+ unitPath,
573
+ unitFile: `${unitName}.service`,
574
+ });
575
+ }
576
+ // Remove orphaned per-project units for projects that are no longer in
577
+ // config. Without this, `service start` / `status` would keep iterating
578
+ // over stale units with outdated tokens because getAllProjectUnits()
579
+ // walks the filesystem, not the config.
580
+ for (const { unitName, unitPath } of getAllProjectUnits()) {
581
+ if (expectedUnitNames.has(unitName))
582
+ continue;
583
+ const orphanUnitFile = `${unitName}.service`;
584
+ try {
585
+ (0, child_process_1.execSync)(`systemctl --user disable --now "${orphanUnitFile}"`, { stdio: 'pipe' });
586
+ }
587
+ catch { /* not loaded — ignore */ }
588
+ try {
589
+ if (fs.existsSync(unitPath))
590
+ fs.unlinkSync(unitPath);
591
+ }
592
+ catch (error) {
593
+ const message = error instanceof Error ? error.message : String(error);
594
+ logger_1.logger.warn((0, i18n_1.t)('service.orphanUnitRemoveFailed', { unit: orphanUnitFile, message }));
595
+ }
596
+ }
597
+ // Reload systemd so the new/updated units are recognised, then enable
598
+ // each so they auto-start at next login/boot. Failures to enable surface
599
+ // as warnings (lingering may not be configured) — the unit file itself
600
+ // is still on disk and a subsequent `service start` will run it for the
601
+ // current session, so we still emit the per-project "installed" line
602
+ // after attempting enable. The warning makes clear that auto-start may
603
+ // not work until linger is enabled.
604
+ try {
605
+ (0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'pipe' });
606
+ }
607
+ catch (error) {
608
+ const message = error instanceof Error ? error.message : String(error);
609
+ logger_1.logger.warn((0, i18n_1.t)('service.daemonReloadFailed', { message }));
610
+ }
611
+ for (const { projectCode, unitPath, unitFile } of writtenUnits) {
612
+ try {
613
+ (0, child_process_1.execSync)(`systemctl --user enable "${unitFile}"`, { stdio: 'pipe' });
614
+ }
615
+ catch (error) {
616
+ const message = error instanceof Error ? error.message : String(error);
617
+ logger_1.logger.warn((0, i18n_1.t)('service.enableFailed', { unit: unitFile, message }));
618
+ }
619
+ logger_1.logger.success((0, i18n_1.t)('service.projectInstalled', { projectCode, path: unitPath }));
620
+ }
621
+ logger_1.logger.info((0, i18n_1.t)('service.loadHintMulti'));
110
622
  logger_1.logger.info((0, i18n_1.t)('service.logDir', { path: logDir }));
111
623
  logger_1.logger.info((0, i18n_1.t)('service.noLogRotation'));
112
624
  }
113
625
  uninstall() {
114
- const serviceFilePath = getServiceFilePath();
115
- if (!fs.existsSync(serviceFilePath)) {
116
- logger_1.logger.warn((0, i18n_1.t)('service.notInstalled.linux'));
626
+ const projectUnits = getAllProjectUnits();
627
+ if (projectUnits.length === 0) {
628
+ logger_1.logger.warn((0, i18n_1.t)('service.notInstalled'));
117
629
  return;
118
630
  }
119
- logger_1.logger.info((0, i18n_1.t)('service.unloadHint.linux'));
120
- fs.unlinkSync(serviceFilePath);
121
- logger_1.logger.success((0, i18n_1.t)('service.uninstalled.linux'));
631
+ for (const { unitName, unitPath } of projectUnits) {
632
+ const unitFile = `${unitName}.service`;
633
+ // Stop and disable; ignore failures (may not be loaded)
634
+ try {
635
+ (0, child_process_1.execSync)(`systemctl --user disable --now "${unitFile}"`, { stdio: 'pipe' });
636
+ }
637
+ catch { /* not loaded */ }
638
+ if (fs.existsSync(unitPath)) {
639
+ fs.unlinkSync(unitPath);
640
+ }
641
+ }
642
+ try {
643
+ (0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'pipe' });
644
+ }
645
+ catch { /* tolerate */ }
646
+ logger_1.logger.success((0, i18n_1.t)('service.uninstalled'));
122
647
  }
123
648
  start() {
124
- const serviceFilePath = getServiceFilePath();
125
- if (!fs.existsSync(serviceFilePath)) {
126
- logger_1.logger.error((0, i18n_1.t)('service.notInstalled.linux'));
649
+ const projectUnits = getAllProjectUnits();
650
+ if (projectUnits.length === 0) {
651
+ logger_1.logger.error((0, i18n_1.t)('service.notInstalled'));
127
652
  return;
128
653
  }
654
+ let failed = false;
129
655
  try {
130
- const serviceName = SERVICE_NAME.replace('.service', '');
131
656
  (0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'pipe' });
132
- (0, child_process_1.execSync)(`systemctl --user start ${serviceName}`, { stdio: 'pipe' });
133
- logger_1.logger.success((0, i18n_1.t)('service.started'));
134
657
  }
135
- catch (error) {
136
- const message = error instanceof Error ? error.message : String(error);
137
- logger_1.logger.error((0, i18n_1.t)('service.startFailed', { message }));
658
+ catch {
659
+ // tolerate start may still work
660
+ }
661
+ for (const { unitName } of projectUnits) {
662
+ const unit = `${unitName}.service`;
663
+ try {
664
+ (0, child_process_1.execSync)(`systemctl --user start "${unit}"`, { stdio: 'pipe' });
665
+ }
666
+ catch (error) {
667
+ const message = error instanceof Error ? error.message : String(error);
668
+ // Include unit name so operators can identify the failing project
669
+ // when start runs over N units.
670
+ logger_1.logger.error((0, i18n_1.t)('service.unitStartFailed', { unit, message }));
671
+ failed = true;
672
+ }
673
+ }
674
+ if (!failed) {
675
+ logger_1.logger.success((0, i18n_1.t)('service.started'));
138
676
  }
139
677
  }
140
678
  stop() {
141
- const serviceFilePath = getServiceFilePath();
142
- if (!fs.existsSync(serviceFilePath)) {
143
- logger_1.logger.error((0, i18n_1.t)('service.notInstalled.linux'));
679
+ const projectUnits = getAllProjectUnits();
680
+ if (projectUnits.length === 0) {
681
+ logger_1.logger.error((0, i18n_1.t)('service.notInstalled'));
144
682
  return;
145
683
  }
146
- try {
147
- const serviceName = SERVICE_NAME.replace('.service', '');
148
- (0, child_process_1.execSync)(`systemctl --user stop ${serviceName}`, { stdio: 'pipe' });
149
- logger_1.logger.success((0, i18n_1.t)('service.stopped'));
684
+ let failed = false;
685
+ for (const { unitName } of projectUnits) {
686
+ const unit = `${unitName}.service`;
687
+ try {
688
+ (0, child_process_1.execSync)(`systemctl --user stop "${unit}"`, { stdio: 'pipe' });
689
+ }
690
+ catch (error) {
691
+ const message = error instanceof Error ? error.message : String(error);
692
+ logger_1.logger.error((0, i18n_1.t)('service.unitStopFailed', { unit, message }));
693
+ failed = true;
694
+ }
150
695
  }
151
- catch (error) {
152
- const message = error instanceof Error ? error.message : String(error);
153
- logger_1.logger.error((0, i18n_1.t)('service.stopFailed', { message }));
696
+ if (!failed) {
697
+ logger_1.logger.success((0, i18n_1.t)('service.stopped'));
154
698
  }
155
699
  }
156
700
  restart() {
157
- const serviceFilePath = getServiceFilePath();
158
- if (!fs.existsSync(serviceFilePath)) {
159
- logger_1.logger.error((0, i18n_1.t)('service.notInstalled.linux'));
701
+ const projectUnits = getAllProjectUnits();
702
+ if (projectUnits.length === 0) {
703
+ logger_1.logger.error((0, i18n_1.t)('service.notInstalled'));
160
704
  return;
161
705
  }
706
+ let failed = false;
162
707
  try {
163
708
  (0, child_process_1.execSync)('systemctl --user daemon-reload', { stdio: 'pipe' });
164
- const serviceName = SERVICE_NAME.replace('.service', '');
165
- (0, child_process_1.execSync)(`systemctl --user restart ${serviceName}`, { stdio: 'pipe' });
166
- logger_1.logger.success((0, i18n_1.t)('service.restarted'));
167
709
  }
168
- catch (error) {
169
- const message = error instanceof Error ? error.message : String(error);
170
- logger_1.logger.error((0, i18n_1.t)('service.restartFailed', { message }));
710
+ catch {
711
+ // tolerate
712
+ }
713
+ for (const { unitName } of projectUnits) {
714
+ const unit = `${unitName}.service`;
715
+ try {
716
+ (0, child_process_1.execSync)(`systemctl --user restart "${unit}"`, { stdio: 'pipe' });
717
+ }
718
+ catch (error) {
719
+ const message = error instanceof Error ? error.message : String(error);
720
+ logger_1.logger.error((0, i18n_1.t)('service.unitRestartFailed', { unit, message }));
721
+ failed = true;
722
+ }
723
+ }
724
+ if (!failed) {
725
+ logger_1.logger.success((0, i18n_1.t)('service.restarted'));
171
726
  }
172
727
  }
173
728
  status() {
174
- const serviceFilePath = getServiceFilePath();
729
+ const projectUnits = getAllProjectUnits();
175
730
  const logDir = getLogDir();
176
- if (!fs.existsSync(serviceFilePath)) {
731
+ if (projectUnits.length === 0) {
177
732
  return { installed: false, running: false };
178
733
  }
179
- try {
180
- const serviceName = SERVICE_NAME.replace('.service', '');
181
- const output = (0, child_process_1.execSync)(`systemctl --user show ${serviceName} --property=ActiveState,MainPID --no-pager`, { stdio: 'pipe' }).toString();
182
- const activeMatch = output.match(/ActiveState=(\w+)/);
183
- const pidMatch = output.match(/MainPID=(\d+)/);
184
- const active = activeMatch?.[1] === 'active';
185
- const pid = pidMatch ? parseInt(pidMatch[1], 10) : undefined;
186
- return { installed: true, running: active, pid: active ? pid : undefined, logDir };
734
+ // Build a reverse map from unit name → original projectCode using the
735
+ // user's config. sanitize() collapses `_` and other chars to `-`, so
736
+ // splitting the unit name on `-` is lossy when tenant/project codes
737
+ // contain those characters; the config is the source of truth.
738
+ const config = (0, config_manager_1.loadConfig)();
739
+ const projectByUnitName = new Map();
740
+ if (config) {
741
+ for (const project of (0, config_manager_1.getProjectList)(config)) {
742
+ projectByUnitName.set(getProjectUnitName(project.tenantCode, project.projectCode), project.projectCode);
743
+ }
187
744
  }
188
- catch {
189
- return { installed: true, running: false, logDir };
745
+ const projects = [];
746
+ let anyRunning = false;
747
+ let firstPid;
748
+ for (const { unitName } of projectUnits) {
749
+ // Prefer the canonical projectCode from config. For orphaned units no
750
+ // longer in config, fall back to the unit name with the brand prefix
751
+ // stripped so users can see something close to the original code.
752
+ const fallback = unitName.startsWith(`${SERVICE_PREFIX}-`)
753
+ ? unitName.slice(SERVICE_PREFIX.length + 1)
754
+ : unitName;
755
+ const projectCode = projectByUnitName.get(unitName) ?? fallback;
756
+ let running = false;
757
+ let pid;
758
+ try {
759
+ const output = (0, child_process_1.execSync)(`systemctl --user show "${unitName}.service" --property=ActiveState,MainPID --no-pager`, { stdio: 'pipe' }).toString();
760
+ const activeMatch = output.match(/ActiveState=(\w+)/);
761
+ const pidMatch = output.match(/MainPID=(\d+)/);
762
+ if (activeMatch?.[1] === 'active') {
763
+ running = true;
764
+ if (pidMatch && pidMatch[1] !== '0') {
765
+ pid = parseInt(pidMatch[1], 10);
766
+ if (!firstPid)
767
+ firstPid = pid;
768
+ }
769
+ anyRunning = true;
770
+ }
771
+ }
772
+ catch {
773
+ // Not loaded — running stays false
774
+ }
775
+ projects.push({ label: unitName, projectCode, running, pid });
190
776
  }
777
+ return { installed: true, running: anyRunning, pid: firstPid, logDir, projects };
191
778
  }
192
779
  }
193
780
  exports.LinuxServiceStrategy = LinuxServiceStrategy;
@@ -1 +1 @@
1
- {"version":3,"file":"linux-service.js","sourceRoot":"","sources":["../../../src/cli/service/linux-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linux-service.js","sourceRoot":"","sources":["../../../src/cli/service/linux-service.ts"],"names":[],"mappings":"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"}
@@ -17,7 +17,11 @@ export declare function registerServiceCommands(program: Command): void;
17
17
  * Install service files and immediately start a single project.
18
18
  * Called automatically after addProject() so users don't need to run
19
19
  * install-service manually after registering a token.
20
- * No-op on non-Darwin platforms where per-project LaunchAgents don't apply.
20
+ *
21
+ * Supported platforms:
22
+ * - darwin: per-project LaunchAgents
23
+ * - linux: per-project systemd --user units
24
+ * Other platforms log a hint and skip.
21
25
  */
22
26
  export declare function installAndStartProject(project: ProjectRegistration, options?: {
23
27
  verbose?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"service-command.d.ts","sourceRoot":"","sources":["../../src/cli/service-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,EAAyB,aAAa,EAA0D,MAAM,0BAA0B,CAAA;AAGvI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAgBnD,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpG;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAOvC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA6ClE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE9D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,IAAI,CAMN;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"service-command.d.ts","sourceRoot":"","sources":["../../src/cli/service-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,EAAyB,aAAa,EAA0D,MAAM,0BAA0B,CAAA;AAGvI,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAgBnD,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpG;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAOvC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAOnC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAOlC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAOrC;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CA6ClE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE9D;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,IAAI,CAUN;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
@@ -182,13 +182,21 @@ function registerServiceCommands(program) {
182
182
  * Install service files and immediately start a single project.
183
183
  * Called automatically after addProject() so users don't need to run
184
184
  * install-service manually after registering a token.
185
- * No-op on non-Darwin platforms where per-project LaunchAgents don't apply.
185
+ *
186
+ * Supported platforms:
187
+ * - darwin: per-project LaunchAgents
188
+ * - linux: per-project systemd --user units
189
+ * Other platforms log a hint and skip.
186
190
  */
187
191
  function installAndStartProject(project, options = {}) {
188
- if (process.platform !== 'darwin') {
189
- logger_1.logger.info((0, i18n_1.t)('service.autoStartNotSupported'));
192
+ if (process.platform === 'darwin') {
193
+ (0, darwin_service_1.installAndStartProject)(project, options);
190
194
  return;
191
195
  }
192
- (0, darwin_service_1.installAndStartProject)(project, options);
196
+ if (process.platform === 'linux') {
197
+ (0, linux_service_1.installAndStartProject)(project, options);
198
+ return;
199
+ }
200
+ logger_1.logger.info((0, i18n_1.t)('service.autoStartNotSupported'));
193
201
  }
194
202
  //# sourceMappingURL=service-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service-command.js","sourceRoot":"","sources":["../../src/cli/service-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-command.js","sourceRoot":"","sources":["../../src/cli/service-command.ts"],"names":[],"mappings":"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"}
@@ -174,23 +174,24 @@
174
174
  "cmd.service.status.verbose": "Show detailed status with log file paths",
175
175
  "service.unsupportedPlatform": "This command is not supported on {{platform}}.",
176
176
  "service.entryPointNotFound": "CLI entry point not found: {{path}}",
177
- "service.installed": "LaunchAgent plist created: {{path}}",
178
- "service.projectInstalled": "LaunchAgent plist created for {{projectCode}}: {{path}}",
177
+ "service.installed": "Service file created: {{path}}",
178
+ "service.projectInstalled": "Service file created for {{projectCode}}: {{path}}",
179
179
  "service.loadHint": "To start the service now, run: launchctl load {{path}}",
180
180
  "service.loadHintMulti": "To start all services, run: ai-support-agent service start",
181
181
  "service.legacyPlistFound": "Found legacy plist at {{path}}. Run 'service uninstall' to remove it.",
182
182
  "service.noProjectsConfigured": "No projects configured. Run 'ai-support-agent configure' to register a project first.",
183
183
  "service.logDir": "Logs will be written to: {{path}}",
184
- "service.notInstalled": "LaunchAgent plist not found. Service is not installed.",
185
- "service.uninstalled": "LaunchAgent plist removed.",
184
+ "service.notInstalled": "No service files found. Service is not installed.",
185
+ "service.uninstalled": "Service files removed.",
186
+ "service.daemonReloadFailed": "Warning: systemctl --user daemon-reload failed: {{message}}",
187
+ "service.enableFailed": "Warning: systemctl --user enable {{unit}} failed: {{message}}. The service will run now but may not auto-start at next login.",
188
+ "service.orphanUnitRemoveFailed": "Warning: failed to remove orphaned unit {{unit}}: {{message}}",
189
+ "service.unitStartFailed": "Failed to start {{unit}}: {{message}}",
190
+ "service.unitStopFailed": "Failed to stop {{unit}}: {{message}}",
191
+ "service.unitRestartFailed": "Failed to restart {{unit}}: {{message}}",
186
192
  "service.overwriting": "Existing service file found at {{path}}. Overwriting.",
187
193
  "service.noLogRotation": "Note: Logs are not automatically rotated.",
188
194
  "service.unloadHint": "If the service is running, stop it with: launchctl remove {{label}}",
189
- "service.installed.linux": "systemd user service created: {{path}}",
190
- "service.loadHint.linux": "To start the service now, run: systemctl --user daemon-reload && systemctl --user enable --now ai-support-agent",
191
- "service.notInstalled.linux": "systemd user service not found. Service is not installed.",
192
- "service.uninstalled.linux": "systemd user service removed.",
193
- "service.unloadHint.linux": "If the service is running, stop it with: systemctl --user disable --now ai-support-agent",
194
195
  "service.installed.win32": "Scheduled task created: {{taskName}}",
195
196
  "service.loadHint.win32": "To start the task now, run: schtasks /Run /TN \"{{taskName}}\"",
196
197
  "service.notInstalled.win32": "Scheduled task not found. Service is not installed.",
@@ -208,8 +209,8 @@
208
209
  "service.status.stopped": "Service is installed but not running.",
209
210
  "service.status.logHint": "Logs:\n stdout: {{outLog}}\n stderr: {{errLog}}",
210
211
  "service.autoStartFailed": "Warning: could not auto-start service for this project: {{message}}",
211
- "service.autoStartNotSupported": "Service auto-start is only supported on macOS. Run 'ai-support-agent service install' then 'ai-support-agent service start' to start the service manually.",
212
- "service.loadWarning": "Warning: LaunchAgent {{label}} may not have loaded correctly. Run 'ai-support-agent service start' to retry.",
212
+ "service.autoStartNotSupported": "Service auto-start is not supported on this platform. Run 'ai-support-agent service install' then 'ai-support-agent service start' to start the service manually.",
213
+ "service.loadWarning": "Warning: service {{label}} may not have loaded correctly. Run 'ai-support-agent service start' to retry.",
213
214
  "service.status.noProjects": "No projects registered. Run 'ai-support-agent configure --token <token>' to register a project.",
214
215
  "service.status.projectRunning": "✓ {{projectCode}}: running (PID: {{pid}})",
215
216
  "service.status.projectStopped": "✗ {{projectCode}}: stopped"
@@ -174,23 +174,24 @@
174
174
  "cmd.service.status.verbose": "ログファイルのパスを含む詳細情報を表示",
175
175
  "service.unsupportedPlatform": "このコマンドは {{platform}} ではサポートされていません。",
176
176
  "service.entryPointNotFound": "CLIエントリポイントが見つかりません: {{path}}",
177
- "service.installed": "LaunchAgent plist を作成しました: {{path}}",
178
- "service.projectInstalled": "{{projectCode}} LaunchAgent plist を作成しました: {{path}}",
177
+ "service.installed": "サービスファイルを作成しました: {{path}}",
178
+ "service.projectInstalled": "{{projectCode}} のサービスファイルを作成しました: {{path}}",
179
179
  "service.loadHint": "サービスを今すぐ起動するには: launchctl load {{path}}",
180
180
  "service.loadHintMulti": "全サービスを起動するには: ai-support-agent service start",
181
181
  "service.legacyPlistFound": "旧来の plist が見つかりました: {{path}}。'service uninstall' で削除してください。",
182
182
  "service.noProjectsConfigured": "プロジェクトが設定されていません。先に 'ai-support-agent configure' を実行してプロジェクトを登録してください。",
183
183
  "service.logDir": "ログ出力先: {{path}}",
184
- "service.notInstalled": "LaunchAgent plist が見つかりません。サービスはインストールされていません。",
185
- "service.uninstalled": "LaunchAgent plist を削除しました。",
184
+ "service.notInstalled": "サービスファイルが見つかりません。サービスはインストールされていません。",
185
+ "service.uninstalled": "サービスファイルを削除しました。",
186
+ "service.daemonReloadFailed": "警告: systemctl --user daemon-reload に失敗しました: {{message}}",
187
+ "service.enableFailed": "警告: systemctl --user enable {{unit}} に失敗しました: {{message}}。現在のセッションではサービスは起動しますが、次回ログイン時に自動起動しない可能性があります。",
188
+ "service.orphanUnitRemoveFailed": "警告: 残存ユニット {{unit}} の削除に失敗しました: {{message}}",
189
+ "service.unitStartFailed": "{{unit}} の起動に失敗しました: {{message}}",
190
+ "service.unitStopFailed": "{{unit}} の停止に失敗しました: {{message}}",
191
+ "service.unitRestartFailed": "{{unit}} の再起動に失敗しました: {{message}}",
186
192
  "service.overwriting": "既存のサービスファイルが見つかりました: {{path}}。上書きします。",
187
193
  "service.noLogRotation": "注意: ログは自動ローテーションされません。",
188
194
  "service.unloadHint": "サービスが実行中の場合は停止してください: launchctl remove {{label}}",
189
- "service.installed.linux": "systemd ユーザーサービスを作成しました: {{path}}",
190
- "service.loadHint.linux": "サービスを今すぐ起動するには: systemctl --user daemon-reload && systemctl --user enable --now ai-support-agent",
191
- "service.notInstalled.linux": "systemd ユーザーサービスが見つかりません。サービスはインストールされていません。",
192
- "service.uninstalled.linux": "systemd ユーザーサービスを削除しました。",
193
- "service.unloadHint.linux": "サービスが実行中の場合は停止してください: systemctl --user disable --now ai-support-agent",
194
195
  "service.installed.win32": "スケジュールタスクを作成しました: {{taskName}}",
195
196
  "service.loadHint.win32": "タスクを今すぐ実行するには: schtasks /Run /TN \"{{taskName}}\"",
196
197
  "service.notInstalled.win32": "スケジュールタスクが見つかりません。サービスはインストールされていません。",
@@ -208,8 +209,8 @@
208
209
  "service.status.stopped": "サービスはインストール済みですが停止中です。",
209
210
  "service.status.logHint": "ログ:\n stdout: {{outLog}}\n stderr: {{errLog}}",
210
211
  "service.autoStartFailed": "警告: プロジェクトのサービス自動起動に失敗しました: {{message}}",
211
- "service.autoStartNotSupported": "サービスの自動起動はmacOSのみ対応しています。'ai-support-agent service install' 後に 'ai-support-agent service start' で手動起動してください。",
212
- "service.loadWarning": "警告: LaunchAgent {{label}} が正しくロードされていない可能性があります。'ai-support-agent service start' で再試行してください。",
212
+ "service.autoStartNotSupported": "このプラットフォームではサービスの自動起動に対応していません。'ai-support-agent service install' 後に 'ai-support-agent service start' で手動起動してください。",
213
+ "service.loadWarning": "警告: サービス {{label}} が正しくロードされていない可能性があります。'ai-support-agent service start' で再試行してください。",
213
214
  "service.status.noProjects": "登録済みプロジェクトがありません。'ai-support-agent configure --token <token>' でプロジェクトを登録してください。",
214
215
  "service.status.projectRunning": "✓ {{projectCode}}: 実行中 (PID: {{pid}})",
215
216
  "service.status.projectStopped": "✗ {{projectCode}}: 停止中"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-support-agent/cli",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "AI Support Agent CLI client",
5
5
  "main": "dist/index.js",
6
6
  "bin": {