@limrun/cli 0.1.0

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 (180) hide show
  1. package/README.md +670 -0
  2. package/bin/dev.js +16 -0
  3. package/bin/run.js +8 -0
  4. package/dist/base-command.d.ts +17 -0
  5. package/dist/base-command.d.ts.map +1 -0
  6. package/dist/base-command.js +111 -0
  7. package/dist/base-command.js.map +1 -0
  8. package/dist/commands/build.d.ts +20 -0
  9. package/dist/commands/build.d.ts.map +1 -0
  10. package/dist/commands/build.js +83 -0
  11. package/dist/commands/build.js.map +1 -0
  12. package/dist/commands/connect/android.d.ts +15 -0
  13. package/dist/commands/connect/android.d.ts.map +1 -0
  14. package/dist/commands/connect/android.js +80 -0
  15. package/dist/commands/connect/android.js.map +1 -0
  16. package/dist/commands/delete/android.d.ts +14 -0
  17. package/dist/commands/delete/android.d.ts.map +1 -0
  18. package/dist/commands/delete/android.js +22 -0
  19. package/dist/commands/delete/android.js.map +1 -0
  20. package/dist/commands/delete/asset.d.ts +14 -0
  21. package/dist/commands/delete/asset.d.ts.map +1 -0
  22. package/dist/commands/delete/asset.js +22 -0
  23. package/dist/commands/delete/asset.js.map +1 -0
  24. package/dist/commands/delete/index.d.ts +14 -0
  25. package/dist/commands/delete/index.d.ts.map +1 -0
  26. package/dist/commands/delete/index.js +47 -0
  27. package/dist/commands/delete/index.js.map +1 -0
  28. package/dist/commands/delete/ios.d.ts +14 -0
  29. package/dist/commands/delete/ios.d.ts.map +1 -0
  30. package/dist/commands/delete/ios.js +24 -0
  31. package/dist/commands/delete/ios.js.map +1 -0
  32. package/dist/commands/delete/xcode.d.ts +14 -0
  33. package/dist/commands/delete/xcode.d.ts.map +1 -0
  34. package/dist/commands/delete/xcode.js +22 -0
  35. package/dist/commands/delete/xcode.js.map +1 -0
  36. package/dist/commands/exec/element-tree.d.ts +14 -0
  37. package/dist/commands/exec/element-tree.d.ts.map +1 -0
  38. package/dist/commands/exec/element-tree.js +51 -0
  39. package/dist/commands/exec/element-tree.js.map +1 -0
  40. package/dist/commands/exec/install-app.d.ts +16 -0
  41. package/dist/commands/exec/install-app.d.ts.map +1 -0
  42. package/dist/commands/exec/install-app.js +75 -0
  43. package/dist/commands/exec/install-app.js.map +1 -0
  44. package/dist/commands/exec/launch-app.d.ts +16 -0
  45. package/dist/commands/exec/launch-app.d.ts.map +1 -0
  46. package/dist/commands/exec/launch-app.js +49 -0
  47. package/dist/commands/exec/launch-app.js.map +1 -0
  48. package/dist/commands/exec/list-apps.d.ts +14 -0
  49. package/dist/commands/exec/list-apps.d.ts.map +1 -0
  50. package/dist/commands/exec/list-apps.js +45 -0
  51. package/dist/commands/exec/list-apps.js.map +1 -0
  52. package/dist/commands/exec/log.d.ts +17 -0
  53. package/dist/commands/exec/log.d.ts.map +1 -0
  54. package/dist/commands/exec/log.js +80 -0
  55. package/dist/commands/exec/log.js.map +1 -0
  56. package/dist/commands/exec/open-url.d.ts +15 -0
  57. package/dist/commands/exec/open-url.d.ts.map +1 -0
  58. package/dist/commands/exec/open-url.js +35 -0
  59. package/dist/commands/exec/open-url.js.map +1 -0
  60. package/dist/commands/exec/press-key.d.ts +16 -0
  61. package/dist/commands/exec/press-key.d.ts.map +1 -0
  62. package/dist/commands/exec/press-key.js +41 -0
  63. package/dist/commands/exec/press-key.js.map +1 -0
  64. package/dist/commands/exec/record.d.ts +17 -0
  65. package/dist/commands/exec/record.d.ts.map +1 -0
  66. package/dist/commands/exec/record.js +78 -0
  67. package/dist/commands/exec/record.js.map +1 -0
  68. package/dist/commands/exec/screenshot.d.ts +15 -0
  69. package/dist/commands/exec/screenshot.d.ts.map +1 -0
  70. package/dist/commands/exec/screenshot.js +65 -0
  71. package/dist/commands/exec/screenshot.js.map +1 -0
  72. package/dist/commands/exec/scroll.d.ts +16 -0
  73. package/dist/commands/exec/scroll.d.ts.map +1 -0
  74. package/dist/commands/exec/scroll.js +50 -0
  75. package/dist/commands/exec/scroll.js.map +1 -0
  76. package/dist/commands/exec/tap-element.d.ts +18 -0
  77. package/dist/commands/exec/tap-element.d.ts.map +1 -0
  78. package/dist/commands/exec/tap-element.js +91 -0
  79. package/dist/commands/exec/tap-element.js.map +1 -0
  80. package/dist/commands/exec/tap.d.ts +22 -0
  81. package/dist/commands/exec/tap.d.ts.map +1 -0
  82. package/dist/commands/exec/tap.js +41 -0
  83. package/dist/commands/exec/tap.js.map +1 -0
  84. package/dist/commands/exec/terminate-app.d.ts +15 -0
  85. package/dist/commands/exec/terminate-app.d.ts.map +1 -0
  86. package/dist/commands/exec/terminate-app.js +39 -0
  87. package/dist/commands/exec/terminate-app.js.map +1 -0
  88. package/dist/commands/exec/type.d.ts +16 -0
  89. package/dist/commands/exec/type.d.ts.map +1 -0
  90. package/dist/commands/exec/type.js +43 -0
  91. package/dist/commands/exec/type.js.map +1 -0
  92. package/dist/commands/get/android.d.ts +19 -0
  93. package/dist/commands/get/android.d.ts.map +1 -0
  94. package/dist/commands/get/android.js +69 -0
  95. package/dist/commands/get/android.js.map +1 -0
  96. package/dist/commands/get/asset.d.ts +18 -0
  97. package/dist/commands/get/asset.d.ts.map +1 -0
  98. package/dist/commands/get/asset.js +74 -0
  99. package/dist/commands/get/asset.js.map +1 -0
  100. package/dist/commands/get/ios.d.ts +19 -0
  101. package/dist/commands/get/ios.d.ts.map +1 -0
  102. package/dist/commands/get/ios.js +69 -0
  103. package/dist/commands/get/ios.js.map +1 -0
  104. package/dist/commands/get/xcode.d.ts +17 -0
  105. package/dist/commands/get/xcode.d.ts.map +1 -0
  106. package/dist/commands/get/xcode.js +65 -0
  107. package/dist/commands/get/xcode.js.map +1 -0
  108. package/dist/commands/login.d.ts +7 -0
  109. package/dist/commands/login.d.ts.map +1 -0
  110. package/dist/commands/login.js +18 -0
  111. package/dist/commands/login.js.map +1 -0
  112. package/dist/commands/logout.d.ts +7 -0
  113. package/dist/commands/logout.d.ts.map +1 -0
  114. package/dist/commands/logout.js +14 -0
  115. package/dist/commands/logout.js.map +1 -0
  116. package/dist/commands/pull.d.ts +16 -0
  117. package/dist/commands/pull.d.ts.map +1 -0
  118. package/dist/commands/pull.js +71 -0
  119. package/dist/commands/pull.js.map +1 -0
  120. package/dist/commands/push.d.ts +15 -0
  121. package/dist/commands/push.d.ts.map +1 -0
  122. package/dist/commands/push.js +40 -0
  123. package/dist/commands/push.js.map +1 -0
  124. package/dist/commands/run/android.d.ts +24 -0
  125. package/dist/commands/run/android.d.ts.map +1 -0
  126. package/dist/commands/run/android.js +183 -0
  127. package/dist/commands/run/android.js.map +1 -0
  128. package/dist/commands/run/ios.d.ts +23 -0
  129. package/dist/commands/run/ios.d.ts.map +1 -0
  130. package/dist/commands/run/ios.js +129 -0
  131. package/dist/commands/run/ios.js.map +1 -0
  132. package/dist/commands/run/xcode.d.ts +19 -0
  133. package/dist/commands/run/xcode.d.ts.map +1 -0
  134. package/dist/commands/run/xcode.js +81 -0
  135. package/dist/commands/run/xcode.js.map +1 -0
  136. package/dist/commands/session/start.d.ts +15 -0
  137. package/dist/commands/session/start.d.ts.map +1 -0
  138. package/dist/commands/session/start.js +97 -0
  139. package/dist/commands/session/start.js.map +1 -0
  140. package/dist/commands/session/status.d.ts +11 -0
  141. package/dist/commands/session/status.d.ts.map +1 -0
  142. package/dist/commands/session/status.js +64 -0
  143. package/dist/commands/session/status.js.map +1 -0
  144. package/dist/commands/session/stop.d.ts +15 -0
  145. package/dist/commands/session/stop.d.ts.map +1 -0
  146. package/dist/commands/session/stop.js +67 -0
  147. package/dist/commands/session/stop.js.map +1 -0
  148. package/dist/commands/sync.d.ts +19 -0
  149. package/dist/commands/sync.d.ts.map +1 -0
  150. package/dist/commands/sync.js +80 -0
  151. package/dist/commands/sync.js.map +1 -0
  152. package/dist/index.d.ts +2 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +6 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/auth.d.ts +2 -0
  157. package/dist/lib/auth.d.ts.map +1 -0
  158. package/dist/lib/auth.js +60 -0
  159. package/dist/lib/auth.js.map +1 -0
  160. package/dist/lib/config.d.ts +21 -0
  161. package/dist/lib/config.d.ts.map +1 -0
  162. package/dist/lib/config.js +101 -0
  163. package/dist/lib/config.js.map +1 -0
  164. package/dist/lib/daemon-client.d.ts +9 -0
  165. package/dist/lib/daemon-client.d.ts.map +1 -0
  166. package/dist/lib/daemon-client.js +81 -0
  167. package/dist/lib/daemon-client.js.map +1 -0
  168. package/dist/lib/daemon.d.ts +40 -0
  169. package/dist/lib/daemon.d.ts.map +1 -0
  170. package/dist/lib/daemon.js +427 -0
  171. package/dist/lib/daemon.js.map +1 -0
  172. package/dist/lib/formatting.d.ts +3 -0
  173. package/dist/lib/formatting.d.ts.map +1 -0
  174. package/dist/lib/formatting.js +31 -0
  175. package/dist/lib/formatting.js.map +1 -0
  176. package/dist/lib/instance-client-factory.d.ts +23 -0
  177. package/dist/lib/instance-client-factory.d.ts.map +1 -0
  178. package/dist/lib/instance-client-factory.js +62 -0
  179. package/dist/lib/instance-client-factory.js.map +1 -0
  180. package/package.json +55 -0
@@ -0,0 +1,11 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class SessionStatus extends BaseCommand {
3
+ static summary: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
7
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ };
9
+ run(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/session/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,OAAO,SAA0B;IACxC,MAAM,CAAC,QAAQ,WAAwC;IAEvD,MAAM,CAAC,KAAK;;;MAAgC;IAEtC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqD3B"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const base_command_1 = require("../../base-command");
4
+ const daemon_1 = require("../../lib/daemon");
5
+ const daemon_client_1 = require("../../lib/daemon-client");
6
+ const config_1 = require("../../lib/config");
7
+ class SessionStatus extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { flags } = await this.parse(SessionStatus);
10
+ this.setParsedFlags(flags);
11
+ const sessions = (0, daemon_1.listActiveSessions)();
12
+ if (flags.json) {
13
+ const details = [];
14
+ for (const s of sessions) {
15
+ const state = (0, daemon_1.loadState)(s.instanceId);
16
+ const cache = (0, config_1.loadInstanceCache)(s.instanceId);
17
+ let connected = false;
18
+ try {
19
+ const status = (await (0, daemon_client_1.sendCommand)(s.instanceId, 'status'));
20
+ connected = status.connected;
21
+ }
22
+ catch { }
23
+ details.push({
24
+ instanceId: s.instanceId,
25
+ pid: s.pid,
26
+ type: state?.instanceType,
27
+ connected,
28
+ xcodeSandbox: cache?.sandboxXcodeUrl || null,
29
+ });
30
+ }
31
+ this.outputJson(details);
32
+ return;
33
+ }
34
+ if (sessions.length === 0) {
35
+ this.log('No active sessions.');
36
+ this.log('Start one with: lim session start <instance-ID>');
37
+ return;
38
+ }
39
+ this.log(`${sessions.length} active session(s):\n`);
40
+ for (const s of sessions) {
41
+ const state = (0, daemon_1.loadState)(s.instanceId);
42
+ this.log(` ${s.instanceId}`);
43
+ this.log(` PID: ${s.pid}`);
44
+ if (state) {
45
+ this.log(` Type: ${state.instanceType}`);
46
+ }
47
+ const cache = (0, config_1.loadInstanceCache)(s.instanceId);
48
+ if (cache?.sandboxXcodeUrl) {
49
+ this.log(` Xcode: ${cache.sandboxXcodeUrl}`);
50
+ }
51
+ try {
52
+ const status = (await (0, daemon_client_1.sendCommand)(s.instanceId, 'status'));
53
+ this.log(` Connected: ${status.connected}`);
54
+ }
55
+ catch { }
56
+ this.log('');
57
+ }
58
+ }
59
+ }
60
+ SessionStatus.summary = 'Show active sessions';
61
+ SessionStatus.examples = ['<%= config.bin %> session status'];
62
+ SessionStatus.flags = { ...base_command_1.BaseCommand.baseFlags };
63
+ exports.default = SessionStatus;
64
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/session/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class SessionStop extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ id: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ all: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ private stopSession;
14
+ }
15
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/commands/session/stop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,MAAM,CAAC,OAAO,SAAqC;IACnD,MAAM,CAAC,WAAW,SAA8D;IAEhF,MAAM,CAAC,QAAQ,WAAyF;IAExG,MAAM,CAAC,IAAI;;MAET;IAEF,MAAM,CAAC,KAAK;;MAEV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C1B,OAAO,CAAC,WAAW;CASpB"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const core_2 = require("@oclif/core");
5
+ const daemon_1 = require("../../lib/daemon");
6
+ class SessionStop extends core_2.Command {
7
+ async run() {
8
+ const { args, flags } = await this.parse(SessionStop);
9
+ if (flags.all) {
10
+ const sessions = (0, daemon_1.listActiveSessions)();
11
+ if (sessions.length === 0) {
12
+ this.log('No active sessions.');
13
+ return;
14
+ }
15
+ for (const s of sessions) {
16
+ this.stopSession(s.instanceId, s.pid);
17
+ }
18
+ this.log(`Stopped ${sessions.length} session(s).`);
19
+ return;
20
+ }
21
+ if (!args.id) {
22
+ // If only one session, stop it. Otherwise ask for specificity.
23
+ const sessions = (0, daemon_1.listActiveSessions)();
24
+ if (sessions.length === 0) {
25
+ this.log('No active sessions.');
26
+ return;
27
+ }
28
+ if (sessions.length === 1) {
29
+ this.stopSession(sessions[0].instanceId, sessions[0].pid);
30
+ return;
31
+ }
32
+ this.log(`Multiple sessions active. Specify which to stop:`);
33
+ for (const s of sessions) {
34
+ this.log(` ${s.instanceId} (pid ${s.pid})`);
35
+ }
36
+ this.log(`Or use --all to stop all.`);
37
+ return;
38
+ }
39
+ if (!(0, daemon_1.isDaemonRunning)(args.id)) {
40
+ this.log(`No active session for ${args.id}.`);
41
+ return;
42
+ }
43
+ const pid = (0, daemon_1.getDaemonPid)(args.id);
44
+ this.stopSession(args.id, pid);
45
+ }
46
+ stopSession(instanceId, pid) {
47
+ if (pid) {
48
+ try {
49
+ process.kill(pid, 'SIGTERM');
50
+ }
51
+ catch { }
52
+ }
53
+ (0, daemon_1.clearSession)(instanceId);
54
+ this.log(`Session stopped for ${instanceId}.`);
55
+ }
56
+ }
57
+ SessionStop.summary = 'Stop one or all active sessions';
58
+ SessionStop.description = 'Stops background daemons and disconnects from instances.';
59
+ SessionStop.examples = ['<%= config.bin %> session stop ios_abc123', '<%= config.bin %> session stop --all'];
60
+ SessionStop.args = {
61
+ id: core_1.Args.string({ description: 'Instance ID to stop session for', required: false }),
62
+ };
63
+ SessionStop.flags = {
64
+ all: core_1.Flags.boolean({ description: 'Stop all active sessions', default: false }),
65
+ };
66
+ exports.default = SessionStop;
67
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/commands/session/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { BaseCommand } from '../base-command';
2
+ export default class Sync extends BaseCommand {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static args: {
7
+ id: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ path: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ watch: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ install: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
13
+ 'api-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ private resolveXcodeClient;
18
+ }
19
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,OAAO,SAAwC;IACtD,MAAM,CAAC,WAAW,SAE0E;IAE5F,MAAM,CAAC,QAAQ,WAIb;IAEF,MAAM,CAAC,IAAI;;;MAGT;IAEF,MAAM,CAAC,KAAK;;;;;MAIV;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;YAgCZ,kBAAkB;CA+BjC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../base-command");
5
+ const instance_client_factory_1 = require("../lib/instance-client-factory");
6
+ const config_1 = require("../lib/config");
7
+ class Sync extends base_command_1.BaseCommand {
8
+ async run() {
9
+ const { args, flags } = await this.parse(Sync);
10
+ this.setParsedFlags(flags);
11
+ await this.withAuth(async () => {
12
+ const xcodeClient = await this.resolveXcodeClient(args.id);
13
+ this.log(`Syncing ${args.path} to instance ${args.id}...`);
14
+ const result = await xcodeClient.sync(args.path, {
15
+ watch: flags.watch,
16
+ install: flags.install,
17
+ });
18
+ this.log('Sync complete.');
19
+ if (flags.watch && result.stopWatching) {
20
+ this.log('Watching for changes. Press Ctrl+C to stop.');
21
+ await new Promise((resolve) => {
22
+ const keepAlive = setInterval(() => { }, 1 << 30);
23
+ const shutdown = () => {
24
+ clearInterval(keepAlive);
25
+ result.stopWatching();
26
+ resolve();
27
+ };
28
+ process.on('SIGINT', shutdown);
29
+ process.on('SIGTERM', shutdown);
30
+ });
31
+ }
32
+ });
33
+ }
34
+ async resolveXcodeClient(id) {
35
+ const type = (0, instance_client_factory_1.detectInstanceType)(id).toString();
36
+ if (type === 'ios') {
37
+ // iOS instance with Xcode sandbox
38
+ const instance = await this.client.iosInstances.get(id);
39
+ let sandboxUrl = instance.status.sandbox?.xcode?.url;
40
+ let token = instance.status.token;
41
+ // The API doesn't return sandbox URL on get — check local cache
42
+ if (!sandboxUrl) {
43
+ const cached = (0, config_1.loadInstanceCache)(id);
44
+ if (cached?.sandboxXcodeUrl) {
45
+ sandboxUrl = cached.sandboxXcodeUrl;
46
+ token = cached.token || token;
47
+ }
48
+ }
49
+ if (!sandboxUrl) {
50
+ this.error(`iOS instance ${id} does not have a Xcode sandbox. Create it with: lim run ios --xcode`);
51
+ }
52
+ return this.client.xcodeInstances.createClient({
53
+ apiUrl: sandboxUrl,
54
+ token,
55
+ });
56
+ }
57
+ // Standalone Xcode instance
58
+ const instance = await this.client.xcodeInstances.get(id);
59
+ return this.client.xcodeInstances.createClient({ instance });
60
+ }
61
+ }
62
+ Sync.summary = 'Sync local code to a Xcode sandbox';
63
+ Sync.description = 'Pushes local source code to a remote Xcode sandbox with optional watch mode. ' +
64
+ 'Works with both standalone Xcode instances and iOS instances that have --xcode enabled.';
65
+ Sync.examples = [
66
+ '<%= config.bin %> sync <xcode-instance-ID> ./MyProject',
67
+ '<%= config.bin %> sync <ios-instance-ID> ./MyProject',
68
+ '<%= config.bin %> sync <xcode-instance-ID> ./MyProject --no-watch',
69
+ ];
70
+ Sync.args = {
71
+ id: core_1.Args.string({ description: 'Xcode or iOS instance ID', required: true }),
72
+ path: core_1.Args.string({ description: 'Local project path to sync', required: true }),
73
+ };
74
+ Sync.flags = {
75
+ ...base_command_1.BaseCommand.baseFlags,
76
+ watch: core_1.Flags.boolean({ description: 'Watch for changes and re-sync', default: true, allowNo: true }),
77
+ install: core_1.Flags.boolean({ description: 'Install after syncing', default: true, allowNo: true }),
78
+ };
79
+ exports.default = Sync;
80
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":";;AAAA,sCAA0C;AAC1C,kDAA8C;AAC9C,4EAAoE;AACpE,0CAAkD;AAElD,MAAqB,IAAK,SAAQ,0BAAW;IAuB3C,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE3D,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAC/C,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YAEH,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAE3B,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACvC,IAAI,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;gBACxD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;oBACjD,MAAM,QAAQ,GAAG,GAAG,EAAE;wBACpB,aAAa,CAAC,SAAS,CAAC,CAAC;wBACzB,MAAM,CAAC,YAAa,EAAE,CAAC;wBACvB,OAAO,EAAE,CAAC;oBACZ,CAAC,CAAC;oBACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;oBAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAClC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,EAAU;QACzC,MAAM,IAAI,GAAG,IAAA,4CAAkB,EAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE/C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,kCAAkC;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;YACrD,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YAElC,gEAAgE;YAChE,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAA,0BAAiB,EAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,MAAM,EAAE,eAAe,EAAE,CAAC;oBAC5B,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC;oBACpC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,qEAAqE,CAAC,CAAC;YACtG,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC;gBAC7C,MAAM,EAAE,UAAU;gBAClB,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;;AApFM,YAAO,GAAG,oCAAoC,CAAC;AAC/C,gBAAW,GAChB,+EAA+E;IAC/E,yFAAyF,CAAC;AAErF,aAAQ,GAAG;IAChB,wDAAwD;IACxD,sDAAsD;IACtD,mEAAmE;CACpE,CAAC;AAEK,SAAI,GAAG;IACZ,EAAE,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5E,IAAI,EAAE,WAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;CACjF,CAAC;AAEK,UAAK,GAAG;IACb,GAAG,0BAAW,CAAC,SAAS;IACxB,KAAK,EAAE,YAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpG,OAAO,EAAE,YAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CAC/F,CAAC;kBArBiB,IAAI"}
@@ -0,0 +1,2 @@
1
+ export { run } from '@oclif/core';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run = void 0;
4
+ var core_1 = require("@oclif/core");
5
+ Object.defineProperty(exports, "run", { enumerable: true, get: function () { return core_1.run; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oCAAkC;AAAzB,2FAAA,GAAG,OAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function login(consoleEndpoint: string, version: string): Promise<void>;
2
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAOA,wBAAsB,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDnF"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.login = login;
7
+ const http_1 = __importDefault(require("http"));
8
+ const open_1 = __importDefault(require("open"));
9
+ const config_1 = require("./config");
10
+ const CALLBACK_PORT = 32412;
11
+ const CALLBACK_PATH = '/authn/callback';
12
+ async function login(consoleEndpoint, version) {
13
+ return new Promise((resolve, reject) => {
14
+ const server = http_1.default.createServer((req, res) => {
15
+ // CORS preflight
16
+ if (req.method === 'OPTIONS') {
17
+ res.writeHead(200, {
18
+ 'Access-Control-Allow-Origin': '*',
19
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
20
+ 'Access-Control-Allow-Headers': '*',
21
+ 'Access-Control-Max-Age': '86400',
22
+ });
23
+ res.end();
24
+ return;
25
+ }
26
+ const url = new URL(req.url || '/', `http://localhost:${CALLBACK_PORT}`);
27
+ if (url.pathname !== CALLBACK_PATH) {
28
+ res.writeHead(404);
29
+ res.end('Not found');
30
+ return;
31
+ }
32
+ res.setHeader('Access-Control-Allow-Origin', '*');
33
+ const apiKey = url.searchParams.get(config_1.CONFIG_KEYS.apiKey);
34
+ if (!apiKey) {
35
+ res.writeHead(400);
36
+ res.end('missing api-key');
37
+ server.close();
38
+ reject(new Error('Login callback received without api-key'));
39
+ return;
40
+ }
41
+ (0, config_1.writeConfig)({ [config_1.CONFIG_KEYS.apiKey]: apiKey });
42
+ res.writeHead(200);
43
+ res.end('OK');
44
+ server.close(() => {
45
+ resolve();
46
+ });
47
+ });
48
+ server.listen(CALLBACK_PORT, () => {
49
+ const loginUrl = new URL('/authn/login', consoleEndpoint);
50
+ loginUrl.searchParams.set('user-agent', `lim/${version}`);
51
+ (0, open_1.default)(loginUrl.toString()).catch(() => {
52
+ console.log(`Open this URL in your browser to log in:\n${loginUrl.toString()}`);
53
+ });
54
+ });
55
+ server.on('error', (err) => {
56
+ reject(new Error(`Failed to start login server on port ${CALLBACK_PORT}: ${err.message}`));
57
+ });
58
+ });
59
+ }
60
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":";;;;;AAOA,sBAsDC;AA7DD,gDAAwB;AACxB,gDAAwB;AACxB,qCAAoD;AAEpD,MAAM,aAAa,GAAG,KAAK,CAAC;AAC5B,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAEjC,KAAK,UAAU,KAAK,CAAC,eAAuB,EAAE,OAAe;IAClE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,cAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,iBAAiB;YACjB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;oBACjB,6BAA6B,EAAE,GAAG;oBAClC,8BAA8B,EAAE,iCAAiC;oBACjE,8BAA8B,EAAE,GAAG;oBACnC,wBAAwB,EAAE,OAAO;iBAClC,CAAC,CAAC;gBACH,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,aAAa,EAAE,CAAC,CAAC;YACzE,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;gBACnC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,oBAAW,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC3B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,IAAA,oBAAW,EAAC,EAAE,CAAC,oBAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEd,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAChB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE;YAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAC1D,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC;YAC1D,IAAA,cAAI,EAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACnC,OAAO,CAAC,GAAG,CAAC,6CAA6C,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,aAAa,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const CONFIG_KEYS: {
2
+ readonly apiKey: "api-key";
3
+ readonly apiEndpoint: "api-endpoint";
4
+ readonly consoleEndpoint: "console-endpoint";
5
+ };
6
+ export interface LimConfig {
7
+ apiKey: string;
8
+ apiEndpoint: string;
9
+ consoleEndpoint: string;
10
+ }
11
+ export declare function readConfig(): LimConfig;
12
+ export declare function writeConfig(partial: Partial<Record<string, string>>): void;
13
+ export declare function clearApiKey(): void;
14
+ export interface InstanceCache {
15
+ sandboxXcodeUrl?: string;
16
+ token?: string;
17
+ }
18
+ export declare function saveInstanceCache(instanceId: string, data: InstanceCache): void;
19
+ export declare function loadInstanceCache(instanceId: string): InstanceCache | null;
20
+ export declare function clearInstanceCache(instanceId: string): void;
21
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAOX,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AA0BD,wBAAgB,UAAU,IAAI,SAAS,CAWtC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAI1E;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAQD,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAM/E;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ1E;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAI3D"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CONFIG_KEYS = void 0;
7
+ exports.readConfig = readConfig;
8
+ exports.writeConfig = writeConfig;
9
+ exports.clearApiKey = clearApiKey;
10
+ exports.saveInstanceCache = saveInstanceCache;
11
+ exports.loadInstanceCache = loadInstanceCache;
12
+ exports.clearInstanceCache = clearInstanceCache;
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const os_1 = __importDefault(require("os"));
16
+ const js_yaml_1 = __importDefault(require("js-yaml"));
17
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.lim');
18
+ const CONFIG_FILE = path_1.default.join(CONFIG_DIR, 'config.yaml');
19
+ exports.CONFIG_KEYS = {
20
+ apiKey: 'api-key',
21
+ apiEndpoint: 'api-endpoint',
22
+ consoleEndpoint: 'console-endpoint',
23
+ };
24
+ const DEFAULTS = {
25
+ [exports.CONFIG_KEYS.apiEndpoint]: 'https://api.limrun.com',
26
+ [exports.CONFIG_KEYS.consoleEndpoint]: 'https://console.limrun.com',
27
+ };
28
+ function ensureConfigDir() {
29
+ if (!fs_1.default.existsSync(CONFIG_DIR)) {
30
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
31
+ }
32
+ }
33
+ function readRawConfig() {
34
+ ensureConfigDir();
35
+ if (!fs_1.default.existsSync(CONFIG_FILE)) {
36
+ return {};
37
+ }
38
+ const content = fs_1.default.readFileSync(CONFIG_FILE, 'utf-8');
39
+ const parsed = js_yaml_1.default.load(content);
40
+ if (typeof parsed === 'object' && parsed !== null) {
41
+ return parsed;
42
+ }
43
+ return {};
44
+ }
45
+ function writeRawConfig(config) {
46
+ ensureConfigDir();
47
+ fs_1.default.writeFileSync(CONFIG_FILE, js_yaml_1.default.dump(config), { mode: 0o600 });
48
+ }
49
+ function readConfig() {
50
+ const raw = readRawConfig();
51
+ return {
52
+ apiKey: process.env.LIM_API_KEY || raw[exports.CONFIG_KEYS.apiKey] || '',
53
+ apiEndpoint: process.env.LIM_API_ENDPOINT || raw[exports.CONFIG_KEYS.apiEndpoint] || DEFAULTS[exports.CONFIG_KEYS.apiEndpoint],
54
+ consoleEndpoint: process.env.LIM_CONSOLE_ENDPOINT ||
55
+ raw[exports.CONFIG_KEYS.consoleEndpoint] ||
56
+ DEFAULTS[exports.CONFIG_KEYS.consoleEndpoint],
57
+ };
58
+ }
59
+ function writeConfig(partial) {
60
+ const raw = readRawConfig();
61
+ Object.assign(raw, partial);
62
+ writeRawConfig(raw);
63
+ }
64
+ function clearApiKey() {
65
+ const raw = readRawConfig();
66
+ delete raw[exports.CONFIG_KEYS.apiKey];
67
+ writeRawConfig(raw);
68
+ }
69
+ // ---------- Instance metadata cache ----------
70
+ // Stores data from create responses that the API doesn't return on get
71
+ // (e.g. sandbox.xcode.url for iOS instances)
72
+ const INSTANCES_DIR = path_1.default.join(CONFIG_DIR, 'instances');
73
+ function instanceCachePath(instanceId) {
74
+ // Sanitize ID for use as filename
75
+ return path_1.default.join(INSTANCES_DIR, `${instanceId.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`);
76
+ }
77
+ function saveInstanceCache(instanceId, data) {
78
+ ensureConfigDir();
79
+ if (!fs_1.default.existsSync(INSTANCES_DIR)) {
80
+ fs_1.default.mkdirSync(INSTANCES_DIR, { recursive: true, mode: 0o700 });
81
+ }
82
+ fs_1.default.writeFileSync(instanceCachePath(instanceId), JSON.stringify(data, null, 2), { mode: 0o600 });
83
+ }
84
+ function loadInstanceCache(instanceId) {
85
+ const p = instanceCachePath(instanceId);
86
+ if (!fs_1.default.existsSync(p))
87
+ return null;
88
+ try {
89
+ return JSON.parse(fs_1.default.readFileSync(p, 'utf-8'));
90
+ }
91
+ catch {
92
+ return null;
93
+ }
94
+ }
95
+ function clearInstanceCache(instanceId) {
96
+ try {
97
+ fs_1.default.unlinkSync(instanceCachePath(instanceId));
98
+ }
99
+ catch { }
100
+ }
101
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check if a daemon session is active for the given instance ID.
3
+ */
4
+ export declare function isSessionActive(instanceId: string): boolean;
5
+ /**
6
+ * Send a command to the daemon for the given instance ID and collect the result.
7
+ */
8
+ export declare function sendCommand(instanceId: string, command: string, args?: unknown[]): Promise<unknown>;
9
+ //# sourceMappingURL=daemon-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../../src/lib/daemon-client.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,OAAO,EAAO,GACnB,OAAO,CAAC,OAAO,CAAC,CAkElB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isSessionActive = isSessionActive;
7
+ exports.sendCommand = sendCommand;
8
+ const net_1 = __importDefault(require("net"));
9
+ const daemon_1 = require("./daemon");
10
+ /**
11
+ * Check if a daemon session is active for the given instance ID.
12
+ */
13
+ function isSessionActive(instanceId) {
14
+ return (0, daemon_1.isDaemonRunning)(instanceId);
15
+ }
16
+ /**
17
+ * Send a command to the daemon for the given instance ID and collect the result.
18
+ */
19
+ async function sendCommand(instanceId, command, args = []) {
20
+ if (!(0, daemon_1.isDaemonRunning)(instanceId)) {
21
+ throw new Error(`No active session for ${instanceId}. Run \`lim session start ${instanceId}\` first.`);
22
+ }
23
+ const sock = (0, daemon_1.socketPath)(instanceId);
24
+ return new Promise((resolve, reject) => {
25
+ const socket = net_1.default.createConnection(sock);
26
+ let buffer = '';
27
+ let resultData = undefined;
28
+ let errorMsg;
29
+ socket.on('connect', () => {
30
+ const req = { command, args };
31
+ socket.write(JSON.stringify(req) + '\n');
32
+ });
33
+ socket.on('data', (chunk) => {
34
+ buffer += chunk.toString();
35
+ let idx;
36
+ while ((idx = buffer.indexOf('\n')) !== -1) {
37
+ const line = buffer.slice(0, idx).trim();
38
+ buffer = buffer.slice(idx + 1);
39
+ if (!line)
40
+ continue;
41
+ let resp;
42
+ try {
43
+ resp = JSON.parse(line);
44
+ }
45
+ catch {
46
+ continue;
47
+ }
48
+ switch (resp.type) {
49
+ case 'result':
50
+ resultData = resp.data;
51
+ break;
52
+ case 'stdout':
53
+ if (resp.data)
54
+ process.stdout.write(String(resp.data) + '\n');
55
+ break;
56
+ case 'stderr':
57
+ errorMsg = String(resp.data);
58
+ break;
59
+ case 'done':
60
+ socket.end();
61
+ if (resp.exitCode !== 0 && errorMsg) {
62
+ reject(new Error(errorMsg));
63
+ }
64
+ else {
65
+ resolve(resultData);
66
+ }
67
+ return;
68
+ }
69
+ }
70
+ });
71
+ socket.on('error', (err) => {
72
+ reject(new Error(`Failed to connect to daemon for ${instanceId}: ${err.message}`));
73
+ });
74
+ socket.on('timeout', () => {
75
+ socket.destroy();
76
+ reject(new Error('Daemon request timed out'));
77
+ });
78
+ socket.setTimeout(30000);
79
+ });
80
+ }
81
+ //# sourceMappingURL=daemon-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../../src/lib/daemon-client.ts"],"names":[],"mappings":"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"}