nomoreide 0.1.27 → 0.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/core/config-store.d.ts +4 -1
  2. package/dist/core/config-store.js +85 -0
  3. package/dist/core/config-store.js.map +1 -1
  4. package/dist/core/log-sources.d.ts +21 -0
  5. package/dist/core/log-sources.js +219 -0
  6. package/dist/core/log-sources.js.map +1 -0
  7. package/dist/core/service-log-source.d.ts +9 -0
  8. package/dist/core/service-log-source.js +49 -0
  9. package/dist/core/service-log-source.js.map +1 -0
  10. package/dist/core/terminal-manager.d.ts +40 -0
  11. package/dist/core/terminal-manager.js +64 -0
  12. package/dist/core/terminal-manager.js.map +1 -0
  13. package/dist/core/terminal-session.d.ts +91 -0
  14. package/dist/core/terminal-session.js +159 -0
  15. package/dist/core/terminal-session.js.map +1 -0
  16. package/dist/core/types.d.ts +59 -0
  17. package/dist/web/client/assets/index-0aS5yzpo.js +40 -0
  18. package/dist/web/client/assets/index-DIpnQDCK.css +1 -0
  19. package/dist/web/client/index.html +2 -2
  20. package/dist/web/routes/context.d.ts +2 -0
  21. package/dist/web/routes/context.js.map +1 -1
  22. package/dist/web/routes/git-routes.js +9 -1
  23. package/dist/web/routes/git-routes.js.map +1 -1
  24. package/dist/web/routes/index.js +4 -0
  25. package/dist/web/routes/index.js.map +1 -1
  26. package/dist/web/routes/log-sources-routes.d.ts +6 -0
  27. package/dist/web/routes/log-sources-routes.js +102 -0
  28. package/dist/web/routes/log-sources-routes.js.map +1 -0
  29. package/dist/web/routes/service-routes.js +24 -2
  30. package/dist/web/routes/service-routes.js.map +1 -1
  31. package/dist/web/routes/shell-routes.js +8 -1
  32. package/dist/web/routes/shell-routes.js.map +1 -1
  33. package/dist/web/routes/terminal-routes.d.ts +7 -0
  34. package/dist/web/routes/terminal-routes.js +25 -0
  35. package/dist/web/routes/terminal-routes.js.map +1 -0
  36. package/dist/web/server.d.ts +2 -0
  37. package/dist/web/server.js +104 -0
  38. package/dist/web/server.js.map +1 -1
  39. package/package.json +6 -1
  40. package/dist/web/client/assets/index-BSh_mD42.css +0 -1
  41. package/dist/web/client/assets/index-CD6SvvAp.js +0 -26
@@ -1,4 +1,4 @@
1
- import type { BundleDefinition, DatabaseConnection, NoMoreIdeConfig, GitRepositoryDefinition, ServiceDefinition } from "./types.js";
1
+ import type { BundleDefinition, DatabaseConnection, LogSourceDefinition, NoMoreIdeConfig, GitRepositoryDefinition, ServiceDefinition } from "./types.js";
2
2
  export declare function defaultGlobalConfigPath(): string;
3
3
  export declare class ConfigStore {
4
4
  private readonly configPath;
@@ -8,9 +8,12 @@ export declare class ConfigStore {
8
8
  registerService(service: ServiceDefinition): Promise<NoMoreIdeConfig>;
9
9
  registerBundle(bundle: BundleDefinition, previousName?: string): Promise<NoMoreIdeConfig>;
10
10
  registerGitRepository(repository: GitRepositoryDefinition): Promise<NoMoreIdeConfig>;
11
+ removeGitRepository(name: string): Promise<NoMoreIdeConfig>;
11
12
  selectGitRepository(name: string): Promise<NoMoreIdeConfig>;
12
13
  registerDatabase(database: DatabaseConnection): Promise<NoMoreIdeConfig>;
13
14
  removeDatabase(name: string): Promise<NoMoreIdeConfig>;
15
+ registerLogSource(source: LogSourceDefinition): Promise<NoMoreIdeConfig>;
16
+ removeLogSource(name: string): Promise<NoMoreIdeConfig>;
14
17
  }
15
18
  export declare class ConfigValidationError extends Error {
16
19
  }
@@ -1,7 +1,10 @@
1
+ import { execFile } from "node:child_process";
1
2
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
3
  import { homedir } from "node:os";
3
4
  import { dirname, isAbsolute, join } from "node:path";
5
+ import { promisify } from "node:util";
4
6
  import { z } from "zod";
7
+ const execFileAsync = promisify(execFile);
5
8
  const baseServiceSchema = z.object({
6
9
  name: z.string().min(1),
7
10
  port: z.number().int().positive().max(65535).optional(),
@@ -51,6 +54,41 @@ const databaseSchema = z.object({
51
54
  engine: z.enum(["postgres", "mysql", "sqlite"]),
52
55
  url: z.string().min(1),
53
56
  });
57
+ const logSourceSchema = z
58
+ .object({
59
+ name: z.string().min(1),
60
+ kind: z.enum(["file", "ssh", "command"]),
61
+ path: z.string().min(1).optional(),
62
+ host: z.string().min(1).optional(),
63
+ command: z.string().min(1).optional(),
64
+ cwd: z.string().min(1).optional(),
65
+ driver: z.enum(["journald", "docker"]).optional(),
66
+ unit: z.string().min(1).optional(),
67
+ container: z.string().min(1).optional(),
68
+ })
69
+ .superRefine((source, ctx) => {
70
+ if (source.driver === "journald") {
71
+ if (!source.unit) {
72
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "journald log source requires a unit." });
73
+ }
74
+ return; // driver sources build their own query; kind-based paths don't apply.
75
+ }
76
+ if (source.driver === "docker") {
77
+ if (!source.container) {
78
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "docker log source requires a container." });
79
+ }
80
+ return;
81
+ }
82
+ if (source.kind === "file" && !source.path) {
83
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "File log source requires a path." });
84
+ }
85
+ if (source.kind === "ssh" && (!source.host || !source.path)) {
86
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "SSH log source requires host and path." });
87
+ }
88
+ if (source.kind === "command" && !source.command) {
89
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Command log source requires a command." });
90
+ }
91
+ });
54
92
  const configSchema = z.object({
55
93
  version: z.literal(1),
56
94
  services: z.array(serviceSchema),
@@ -58,6 +96,7 @@ const configSchema = z.object({
58
96
  gitRepositories: z.array(gitRepositorySchema).default([]),
59
97
  selectedGitRepository: z.string().min(1).optional(),
60
98
  databases: z.array(databaseSchema).default([]),
99
+ logSources: z.array(logSourceSchema).default([]),
61
100
  });
62
101
  const defaultConfig = {
63
102
  version: 1,
@@ -65,6 +104,7 @@ const defaultConfig = {
65
104
  bundles: [],
66
105
  gitRepositories: [],
67
106
  databases: [],
107
+ logSources: [],
68
108
  };
69
109
  export function defaultGlobalConfigPath() {
70
110
  const base = process.env.XDG_CONFIG_HOME?.trim();
@@ -116,6 +156,7 @@ export class ConfigStore {
116
156
  async registerGitRepository(repository) {
117
157
  const parsedRepository = gitRepositorySchema.parse(repository);
118
158
  requireAbsolutePath(parsedRepository.path);
159
+ await requireGitWorktree(parsedRepository.path);
119
160
  const config = await this.load();
120
161
  config.gitRepositories = [
121
162
  ...config.gitRepositories.filter((item) => item.name !== parsedRepository.name),
@@ -125,6 +166,23 @@ export class ConfigStore {
125
166
  await this.save(config);
126
167
  return config;
127
168
  }
169
+ async removeGitRepository(name) {
170
+ const repositoryName = name.trim();
171
+ if (!repositoryName) {
172
+ throw new ConfigValidationError("repository name is required");
173
+ }
174
+ const config = await this.load();
175
+ const nextRepositories = config.gitRepositories.filter((repository) => repository.name !== repositoryName);
176
+ if (nextRepositories.length === config.gitRepositories.length) {
177
+ throw new Error(`Git repository "${repositoryName}" is not registered.`);
178
+ }
179
+ config.gitRepositories = nextRepositories;
180
+ if (config.selectedGitRepository === repositoryName) {
181
+ delete config.selectedGitRepository;
182
+ }
183
+ await this.save(config);
184
+ return config;
185
+ }
128
186
  async selectGitRepository(name) {
129
187
  const config = await this.load();
130
188
  if (!config.gitRepositories.some((repository) => repository.name === name)) {
@@ -150,6 +208,22 @@ export class ConfigStore {
150
208
  await this.save(config);
151
209
  return config;
152
210
  }
211
+ async registerLogSource(source) {
212
+ const parsed = logSourceSchema.parse(source);
213
+ const config = await this.load();
214
+ config.logSources = [
215
+ ...config.logSources.filter((item) => item.name !== parsed.name),
216
+ parsed,
217
+ ];
218
+ await this.save(config);
219
+ return config;
220
+ }
221
+ async removeLogSource(name) {
222
+ const config = await this.load();
223
+ config.logSources = config.logSources.filter((item) => item.name !== name);
224
+ await this.save(config);
225
+ return config;
226
+ }
153
227
  }
154
228
  export class ConfigValidationError extends Error {
155
229
  }
@@ -158,6 +232,17 @@ function requireAbsolutePath(path) {
158
232
  throw new ConfigValidationError("Please add an absolute path. Paths beginning with ~ are not expanded here.");
159
233
  }
160
234
  }
235
+ async function requireGitWorktree(path) {
236
+ try {
237
+ const { stdout } = await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], { cwd: path });
238
+ if (stdout.trim() === "true")
239
+ return;
240
+ }
241
+ catch {
242
+ // Re-throw a user-facing validation error below.
243
+ }
244
+ throw new ConfigValidationError("Not a Git repository. Choose a folder inside a Git worktree.");
245
+ }
161
246
  function isMissingFileError(error) {
162
247
  return (error instanceof Error &&
163
248
  "code" in error &&
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/core/config-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../src/core/config-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,2EAA2E;IAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAClD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACjC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAClC,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAChD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACxC,OAAO,EAAE,yCAAyC;KACnD,CAAC;IACJ,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC;IAC5B,kBAAkB;IAClB,mBAAmB;IACnB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,WAAW,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,CAAC,sEAAsE;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;IACnG,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;IAC9B,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnD,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,aAAa,GAAoB;IACrC,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,OAAO,WAAW;IACO;IAA7B,YAA6B,aAAa,uBAAuB,EAAE;QAAtC,eAAU,GAAV,UAAU,CAA4B;IAAG,CAAC;IAEvE,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,eAAe,CAAC,aAAa,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAuB;QAChC,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAA0B;QAC9C,MAAM,aAAa,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,CAAC,QAAQ,GAAG;YAChB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,CAAC;YACrE,aAAa;SACd,CAAC;QAEF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAAwB,EACxB,YAAqB;QAErB,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,CAAC,OAAO,GAAG;YACf,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CACxE;YACD,YAAY;SACb,CAAC;QAEF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,UAAmC;QAEnC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/D,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,CAAC,eAAe,GAAG;YACvB,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAC9B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAC9C;YACD,gBAAgB;SACjB,CAAC;QACF,MAAM,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAErD,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY;QACpC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,qBAAqB,CAAC,6BAA6B,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CACpD,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,cAAc,CACnD,CAAC;QACF,IAAI,gBAAgB,CAAC,MAAM,KAAK,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,mBAAmB,cAAc,sBAAsB,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,CAAC,eAAe,GAAG,gBAAgB,CAAC;QAC1C,IAAI,MAAM,CAAC,qBAAqB,KAAK,cAAc,EAAE,CAAC;YACpD,OAAO,MAAM,CAAC,qBAAqB,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,IAAY;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,sBAAsB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACpC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,QAA4B;QAE5B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,CAAC,SAAS,GAAG;YACjB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;YAC/D,MAAM;SACP,CAAC;QAEF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzE,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA2B;QACjD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,CAAC,UAAU,GAAG;YAClB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;YAChE,MAAM;SACP,CAAC;QAEF,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC3E,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,qBAAqB,CAC7B,4EAA4E,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,WAAW,EAAE,uBAAuB,CAAC,EACtC,EAAE,GAAG,EAAE,IAAI,EAAE,CACd,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM;YAAE,OAAO;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,MAAM,IAAI,qBAAqB,CAC7B,8DAA8D,CAC/D,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACd,KAA+B,CAAC,IAAI,KAAK,QAAQ,CACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { LogEntry, LogQuery, LogSourceDefinition } from "./types.js";
2
+ export declare class LogSourceError extends Error {
3
+ }
4
+ /**
5
+ * Reads a slice of a log source on demand. Never spawns a long-lived process —
6
+ * each call is a one-shot read, so it works for files written out-of-band
7
+ * (UAT/PROD) rather than streamed through a managed service.
8
+ *
9
+ * When the source has a `driver`, the query (time range, text, level) is pushed
10
+ * down to the host; otherwise it tails and filters client-side.
11
+ */
12
+ export declare function readLogSource(source: LogSourceDefinition, query?: LogQuery): Promise<LogEntry[]>;
13
+ /**
14
+ * Builds the journalctl argv for a unit + query. JSON output carries real
15
+ * timestamps, priority, and cursors so we don't have to guess severity.
16
+ */
17
+ export declare function buildJournaldArgs(unit: string, query: LogQuery, count: number): string[];
18
+ /** Builds the `docker logs` argv for a container + query (time window only). */
19
+ export declare function buildDockerArgs(container: string, query: LogQuery, count: number): string[];
20
+ /** Applies `grep`/`level` to already-fetched entries (for non-journald sources). */
21
+ export declare function applyClientFilters(entries: LogEntry[], query: LogQuery): LogEntry[];
@@ -0,0 +1,219 @@
1
+ import { execFile } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { promisify } from "node:util";
4
+ const execFileAsync = promisify(execFile);
5
+ const DEFAULT_LINES = 500;
6
+ const MAX_LINES = 5000;
7
+ const MAX_BUFFER = 8 * 1024 * 1024; // 8 MB ceiling on a single read
8
+ const READ_TIMEOUT_MS = 15_000;
9
+ /** Heuristic: lines that look like errors render red and survive the "errors only" filter. */
10
+ const ERROR_PATTERN = /\b(error|fatal|exception|panic|traceback|fail(?:ed|ure)?)\b/i;
11
+ const WARN_PATTERN = /\b(warn|warning|deprecated)\b/i;
12
+ export class LogSourceError extends Error {
13
+ }
14
+ /**
15
+ * Reads a slice of a log source on demand. Never spawns a long-lived process —
16
+ * each call is a one-shot read, so it works for files written out-of-band
17
+ * (UAT/PROD) rather than streamed through a managed service.
18
+ *
19
+ * When the source has a `driver`, the query (time range, text, level) is pushed
20
+ * down to the host; otherwise it tails and filters client-side.
21
+ */
22
+ export async function readLogSource(source, query = {}) {
23
+ const count = clampLines(query.lines ?? DEFAULT_LINES);
24
+ if (source.driver === "journald") {
25
+ if (!source.unit)
26
+ throw new LogSourceError("journald log source is missing a unit.");
27
+ const argv = buildJournaldArgs(source.unit, query, count);
28
+ const { stdout } = await runInvocation(argv, source.host);
29
+ // journald filtered server-side already; just parse structured output.
30
+ let entries = parseJournaldJson(source.name, stdout);
31
+ if (query.before) {
32
+ // `--reverse` returned newest-first and includes the boundary cursor;
33
+ // restore chronological order and drop the (inclusive) boundary entry.
34
+ entries = entries.reverse().filter((entry) => entry.cursor !== query.before);
35
+ }
36
+ return entries;
37
+ }
38
+ if (source.driver === "docker") {
39
+ if (!source.container)
40
+ throw new LogSourceError("docker log source is missing a container.");
41
+ const argv = buildDockerArgs(source.container, query, count);
42
+ const { stdout, stderr } = await runInvocation(argv, source.host);
43
+ // docker logs has no native text/level filter, so apply those client-side.
44
+ const entries = [
45
+ ...toEntries(source.name, stdout, "stdout"),
46
+ ...toEntries(source.name, stderr, "stderr"),
47
+ ];
48
+ return applyClientFilters(entries, query).slice(-count);
49
+ }
50
+ if (source.kind === "file") {
51
+ if (!source.path)
52
+ throw new LogSourceError("File log source is missing a path.");
53
+ return applyClientFilters(await tailLocalFile(source.name, source.path, count), query);
54
+ }
55
+ if (source.kind === "ssh") {
56
+ if (!source.host || !source.path) {
57
+ throw new LogSourceError("SSH log source is missing host or path.");
58
+ }
59
+ const { stdout } = await execFileAsync("ssh", [source.host, "tail", "-n", String(count), source.path], { maxBuffer: MAX_BUFFER, timeout: READ_TIMEOUT_MS });
60
+ return applyClientFilters(toEntries(source.name, stdout, "stdout"), query);
61
+ }
62
+ // command
63
+ if (!source.command)
64
+ throw new LogSourceError("Command log source is missing a command.");
65
+ const { stdout, stderr } = await execFileAsync("sh", ["-c", source.command], {
66
+ cwd: source.cwd,
67
+ maxBuffer: MAX_BUFFER,
68
+ timeout: READ_TIMEOUT_MS,
69
+ });
70
+ const entries = [
71
+ ...toEntries(source.name, stdout, "stdout"),
72
+ ...toEntries(source.name, stderr, "stderr"),
73
+ ];
74
+ return applyClientFilters(entries, query).slice(-count);
75
+ }
76
+ /**
77
+ * Builds the journalctl argv for a unit + query. JSON output carries real
78
+ * timestamps, priority, and cursors so we don't have to guess severity.
79
+ */
80
+ export function buildJournaldArgs(unit, query, count) {
81
+ const args = ["journalctl", "-u", unit, "--no-pager", "-o", "json"];
82
+ if (query.since)
83
+ args.push("--since", query.since);
84
+ if (query.until)
85
+ args.push("--until", query.until);
86
+ if (query.grep)
87
+ args.push("--grep", query.grep);
88
+ if (query.level === "error")
89
+ args.push("-p", "err");
90
+ else if (query.level === "warn")
91
+ args.push("-p", "warning");
92
+ if (query.before) {
93
+ // Page older: start at the cursor and walk backwards `count` lines.
94
+ args.push("--cursor", query.before, "--reverse", "-n", String(count));
95
+ }
96
+ else if (query.cursor) {
97
+ // Page newer: everything after the cursor.
98
+ args.push("--after-cursor", query.cursor, "-n", String(count));
99
+ }
100
+ else {
101
+ args.push("-n", String(count));
102
+ }
103
+ return args;
104
+ }
105
+ /** Builds the `docker logs` argv for a container + query (time window only). */
106
+ export function buildDockerArgs(container, query, count) {
107
+ const args = ["docker", "logs", "--tail", String(count), "--timestamps"];
108
+ if (query.since)
109
+ args.push("--since", query.since);
110
+ if (query.until)
111
+ args.push("--until", query.until);
112
+ args.push(container);
113
+ return args;
114
+ }
115
+ /**
116
+ * Runs an argv locally, or over ssh when `host` is set. For ssh the argv is
117
+ * escaped and joined into a single remote command so values with spaces
118
+ * (e.g. --since "1 hour ago") survive the remote shell.
119
+ */
120
+ function runInvocation(argv, host) {
121
+ const [file, args] = host
122
+ ? ["ssh", [host, argv.map(shellEscape).join(" ")]]
123
+ : [argv[0], argv.slice(1)];
124
+ return execFileAsync(file, args, { maxBuffer: MAX_BUFFER, timeout: READ_TIMEOUT_MS });
125
+ }
126
+ function shellEscape(value) {
127
+ return `'${value.replace(/'/g, "'\\''")}'`;
128
+ }
129
+ /** Parses journalctl `-o json` lines into entries with real timestamps + levels. */
130
+ function parseJournaldJson(service, stdout) {
131
+ const entries = [];
132
+ for (const line of stdout.split("\n")) {
133
+ if (!line.trim())
134
+ continue;
135
+ let record;
136
+ try {
137
+ record = JSON.parse(line);
138
+ }
139
+ catch {
140
+ continue; // tolerate the occasional non-JSON line
141
+ }
142
+ const text = decodeJournaldMessage(record.MESSAGE);
143
+ const priority = Number(record.PRIORITY);
144
+ // syslog priority: 0-3 = err/crit/alert/emerg → render as error (red).
145
+ const stream = Number.isFinite(priority) && priority <= 3 ? "stderr" : "stdout";
146
+ const micros = Number(record.__REALTIME_TIMESTAMP);
147
+ const timestamp = Number.isFinite(micros) ? new Date(micros / 1000).toISOString() : "";
148
+ const cursor = typeof record.__CURSOR === "string" ? record.__CURSOR : undefined;
149
+ entries.push({ service, stream, text, timestamp, cursor });
150
+ }
151
+ return entries;
152
+ }
153
+ /** journald MESSAGE is usually a string, but a byte array for non-UTF8 payloads. */
154
+ function decodeJournaldMessage(message) {
155
+ if (typeof message === "string")
156
+ return message;
157
+ if (Array.isArray(message)) {
158
+ return String.fromCharCode(...message.filter((b) => typeof b === "number"));
159
+ }
160
+ return message == null ? "" : String(message);
161
+ }
162
+ /** Applies `grep`/`level` to already-fetched entries (for non-journald sources). */
163
+ export function applyClientFilters(entries, query) {
164
+ let result = entries;
165
+ if (query.grep) {
166
+ const matcher = compileGrep(query.grep);
167
+ result = result.filter((entry) => matcher.test(entry.text));
168
+ }
169
+ if (query.level === "error") {
170
+ result = result.filter((entry) => entry.stream === "stderr" || ERROR_PATTERN.test(entry.text));
171
+ }
172
+ else if (query.level === "warn") {
173
+ result = result.filter((entry) => entry.stream === "stderr" || ERROR_PATTERN.test(entry.text) || WARN_PATTERN.test(entry.text));
174
+ }
175
+ return result;
176
+ }
177
+ /** Treats the term as a regex, falling back to a literal match if it's invalid. */
178
+ function compileGrep(term) {
179
+ try {
180
+ return new RegExp(term, "i");
181
+ }
182
+ catch {
183
+ return new RegExp(term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i");
184
+ }
185
+ }
186
+ async function tailLocalFile(name, path, count) {
187
+ let contents;
188
+ try {
189
+ contents = await readFile(path, "utf8");
190
+ }
191
+ catch (error) {
192
+ const code = error.code;
193
+ if (code === "ENOENT")
194
+ throw new LogSourceError(`File not found: ${path}`);
195
+ if (code === "EACCES")
196
+ throw new LogSourceError(`Permission denied: ${path}`);
197
+ throw error;
198
+ }
199
+ return toEntries(name, contents, "stdout").slice(-count);
200
+ }
201
+ function toEntries(service, output, defaultStream) {
202
+ const text = output.replace(/\n$/, "");
203
+ if (!text)
204
+ return [];
205
+ return text.split("\n").map((line) => ({
206
+ service,
207
+ // File/ssh tails arrive as one stream; flag error-looking lines so they
208
+ // still render red and survive the "errors only" filter.
209
+ stream: defaultStream === "stdout" && ERROR_PATTERN.test(line) ? "stderr" : defaultStream,
210
+ text: line,
211
+ timestamp: "",
212
+ }));
213
+ }
214
+ function clampLines(lines) {
215
+ if (!Number.isFinite(lines) || lines <= 0)
216
+ return DEFAULT_LINES;
217
+ return Math.min(Math.floor(lines), MAX_LINES);
218
+ }
219
+ //# sourceMappingURL=log-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-sources.js","sourceRoot":"","sources":["../../src/core/log-sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { LogSourceDefinition, ServiceDefinition } from "./types.js";
2
+ /**
3
+ * Derives a queryable log source from a service that streams its logs over ssh
4
+ * (journald or docker). This lets a managed service's log view re-query the host
5
+ * for full history — search, time range, paging — instead of being limited to
6
+ * its live in-memory buffer. Returns null when the service has no remote,
7
+ * queryable backend (e.g. a local `npm run dev`).
8
+ */
9
+ export declare function deriveServiceLogSource(service: ServiceDefinition): LogSourceDefinition | null;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Derives a queryable log source from a service that streams its logs over ssh
3
+ * (journald or docker). This lets a managed service's log view re-query the host
4
+ * for full history — search, time range, paging — instead of being limited to
5
+ * its live in-memory buffer. Returns null when the service has no remote,
6
+ * queryable backend (e.g. a local `npm run dev`).
7
+ */
8
+ export function deriveServiceLogSource(service) {
9
+ if (service.kind !== "ssh" || !service.host || !service.command)
10
+ return null;
11
+ const unit = matchJournaldUnit(service.command);
12
+ if (unit) {
13
+ return { name: service.name, kind: "command", driver: "journald", unit, host: service.host };
14
+ }
15
+ const container = matchDockerContainer(service.command);
16
+ if (container) {
17
+ return { name: service.name, kind: "command", driver: "docker", container, host: service.host };
18
+ }
19
+ return null;
20
+ }
21
+ /** Pulls the unit out of a `journalctl … -u <unit>` / `--unit <unit>` command. */
22
+ function matchJournaldUnit(command) {
23
+ if (!/\bjournalctl\b/.test(command))
24
+ return null;
25
+ const match = command.match(/(?:-u|--unit)[=\s]+(\S+)/);
26
+ return match ? stripQuotes(match[1]) : null;
27
+ }
28
+ /** Pulls the container out of a `docker logs [flags] <container>` command. */
29
+ function matchDockerContainer(command) {
30
+ const parts = command.split(/\bdocker\s+logs\b/);
31
+ if (parts.length < 2)
32
+ return null;
33
+ const tokens = parts[1].trim().split(/\s+/).filter(Boolean);
34
+ const flagsTakingValue = new Set(["--tail", "--since", "--until", "-n"]);
35
+ for (let i = 0; i < tokens.length; i++) {
36
+ const token = tokens[i];
37
+ if (token.startsWith("-")) {
38
+ if (flagsTakingValue.has(token))
39
+ i++; // skip the flag's value
40
+ continue;
41
+ }
42
+ return stripQuotes(token); // first bare token is the container
43
+ }
44
+ return null;
45
+ }
46
+ function stripQuotes(value) {
47
+ return value.replace(/^['"]|['"]$/g, "");
48
+ }
49
+ //# sourceMappingURL=service-log-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-log-source.js","sourceRoot":"","sources":["../../src/core/service-log-source.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAA0B;IAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE7E,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kFAAkF;AAClF,SAAS,iBAAiB,CAAC,OAAe;IACxC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,8EAA8E;AAC9E,SAAS,oBAAoB,CAAC,OAAe;IAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,CAAC,EAAE,CAAC,CAAC,wBAAwB;YAC9D,SAAS;QACX,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,oCAAoC;IACjE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { type PtyAdapter, type TerminalSessionLike, type TerminalSize, type TerminalSnapshot } from "./terminal-session.js";
2
+ /** A session's snapshot plus the id the manager tracks it under. */
3
+ export interface TerminalSessionInfo extends TerminalSnapshot {
4
+ id: string;
5
+ }
6
+ /** The subset of the manager the web layer depends on (so tests can fake it). */
7
+ export interface TerminalSessionManagerLike {
8
+ list(): TerminalSessionInfo[];
9
+ create(size?: Partial<TerminalSize>): TerminalSessionInfo;
10
+ get(id: string): TerminalSessionLike | undefined;
11
+ ensure(id: string, size?: Partial<TerminalSize>): TerminalSessionLike;
12
+ close(id: string): boolean;
13
+ disposeAll(): void;
14
+ }
15
+ export interface TerminalSessionManagerOptions {
16
+ cwd: string;
17
+ env?: NodeJS.ProcessEnv;
18
+ shell?: string;
19
+ /** Injectable per-session adapter factory; defaults to the real node-pty adapter. */
20
+ adapterFactory?: () => PtyAdapter | undefined;
21
+ }
22
+ /**
23
+ * Owns the live terminal sessions keyed by id so the web UI can run several
24
+ * tabs at once. The PTY lifecycle stays in {@link TerminalSession}; this layer
25
+ * only adds the keyed map, id generation, and fan-out helpers.
26
+ */
27
+ export declare class TerminalSessionManager implements TerminalSessionManagerLike {
28
+ private readonly options;
29
+ private readonly sessions;
30
+ private counter;
31
+ constructor(options: TerminalSessionManagerOptions);
32
+ list(): TerminalSessionInfo[];
33
+ create(size?: Partial<TerminalSize>): TerminalSessionInfo;
34
+ get(id: string): TerminalSessionLike | undefined;
35
+ /** Returns the session for `id`, creating and starting one if it is unknown. */
36
+ ensure(id: string, size?: Partial<TerminalSize>): TerminalSessionLike;
37
+ close(id: string): boolean;
38
+ disposeAll(): void;
39
+ private spawn;
40
+ }
@@ -0,0 +1,64 @@
1
+ import { TerminalSession, } from "./terminal-session.js";
2
+ /**
3
+ * Owns the live terminal sessions keyed by id so the web UI can run several
4
+ * tabs at once. The PTY lifecycle stays in {@link TerminalSession}; this layer
5
+ * only adds the keyed map, id generation, and fan-out helpers.
6
+ */
7
+ export class TerminalSessionManager {
8
+ options;
9
+ sessions = new Map();
10
+ counter = 0;
11
+ constructor(options) {
12
+ this.options = options;
13
+ }
14
+ list() {
15
+ return [...this.sessions.entries()].map(([id, session]) => ({
16
+ id,
17
+ ...session.snapshot(),
18
+ }));
19
+ }
20
+ create(size = {}) {
21
+ const id = `term_${++this.counter}`;
22
+ const session = this.spawn(size);
23
+ this.sessions.set(id, session);
24
+ return { id, ...session.snapshot() };
25
+ }
26
+ get(id) {
27
+ return this.sessions.get(id);
28
+ }
29
+ /** Returns the session for `id`, creating and starting one if it is unknown. */
30
+ ensure(id, size = {}) {
31
+ const existing = this.sessions.get(id);
32
+ if (existing) {
33
+ existing.start(size);
34
+ return existing;
35
+ }
36
+ const session = this.spawn(size);
37
+ this.sessions.set(id, session);
38
+ return session;
39
+ }
40
+ close(id) {
41
+ const session = this.sessions.get(id);
42
+ if (!session)
43
+ return false;
44
+ session.dispose();
45
+ this.sessions.delete(id);
46
+ return true;
47
+ }
48
+ disposeAll() {
49
+ for (const session of this.sessions.values())
50
+ session.dispose();
51
+ this.sessions.clear();
52
+ }
53
+ spawn(size) {
54
+ const session = new TerminalSession({
55
+ adapter: this.options.adapterFactory?.(),
56
+ cwd: this.options.cwd,
57
+ env: this.options.env,
58
+ shell: this.options.shell,
59
+ });
60
+ session.start(size);
61
+ return session;
62
+ }
63
+ }
64
+ //# sourceMappingURL=terminal-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-manager.js","sourceRoot":"","sources":["../../src/core/terminal-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,GAIhB,MAAM,uBAAuB,CAAC;AAyB/B;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IAChB,OAAO,CAAgC;IACvC,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC3D,OAAO,GAAG,CAAC,CAAC;IAEpB,YAAY,OAAsC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,EAAE;YACF,GAAG,OAAO,CAAC,QAAQ,EAAE;SACtB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,CAAC,OAA8B,EAAE;QACrC,MAAM,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,EAAU,EAAE,OAA8B,EAAE;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,EAAU;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAC3B,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU;QACR,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,OAAO,EAAE,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,IAA2B;QACvC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE;YACxC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}