ashral 0.1.2 → 0.1.4

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.
@@ -0,0 +1,9 @@
1
+ import { BaseAdapter, type AdapterCommand } from './baseAdapter';
2
+ import type { SessionStatus } from '../types/session';
3
+ export declare class CodexAdapter extends BaseAdapter {
4
+ readonly agentName = "codex";
5
+ getCommand(passthroughArgs: string[]): AdapterCommand;
6
+ detectStatus(raw: string, currentStatus: SessionStatus): SessionStatus | null;
7
+ private matches;
8
+ }
9
+ //# sourceMappingURL=codexAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/codexAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqDtD,qBAAa,YAAa,SAAQ,WAAW;IAC3C,QAAQ,CAAC,SAAS,WAAW;IAE7B,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,cAAc;IAMrD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,aAAa,GAAG,IAAI;IAmB7E,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexAdapter = void 0;
4
+ const baseAdapter_1 = require("./baseAdapter");
5
+ const ANSI_RE = /\x1B\[[0-9;]*[A-Za-z]|\x1B[@-_][0-?]*[ -/]*[@-~]/g;
6
+ function stripAnsi(raw) {
7
+ return raw.replace(ANSI_RE, '');
8
+ }
9
+ // Codex requires the user to approve shell commands before execution
10
+ const APPROVAL_PATTERNS = [
11
+ /allow\s+(this\s+)?command/i,
12
+ /run\s+this\s+command/i,
13
+ /\(y\/n\)/i,
14
+ /\[y\/n\]/i,
15
+ /yes\/no/i,
16
+ /approve|deny/i,
17
+ /do you want to/i,
18
+ /press enter to confirm/i,
19
+ ];
20
+ // Codex is waiting for the user to type
21
+ const WAITING_PATTERNS = [
22
+ /^>\s*$/m,
23
+ /\?\s*$/m,
24
+ /^\s*>\s*\d+\./m, // numbered choice menu
25
+ /^\s*\d+\.\s+\S/m, // numbered list options
26
+ /type something/i,
27
+ /what would you like/i,
28
+ /how can i (help|assist)/i,
29
+ /what('s| is) (the |your )?next/i,
30
+ /codex[>\s]*$/im, // "codex>" style prompt
31
+ /waiting for input/i,
32
+ ];
33
+ // Codex is actively doing work
34
+ const RUNNING_PATTERNS = [
35
+ /running|executing|calling/i,
36
+ /writing|creating|updating|deleting/i,
37
+ /reading|fetching|searching/i,
38
+ /thinking|planning/i,
39
+ /applying (changes|patch)/i,
40
+ ];
41
+ const ERROR_PATTERNS = [
42
+ /^error:/im,
43
+ /fatal error/i,
44
+ /uncaught exception/i,
45
+ /command not found/i,
46
+ /permission denied/i,
47
+ /ENOENT|EACCES|ECONNREFUSED/,
48
+ /api (key|error|quota)/i,
49
+ ];
50
+ class CodexAdapter extends baseAdapter_1.BaseAdapter {
51
+ constructor() {
52
+ super(...arguments);
53
+ this.agentName = 'codex';
54
+ }
55
+ getCommand(passthroughArgs) {
56
+ // On Windows, npm CLIs are installed as .cmd wrappers
57
+ const command = process.platform === 'win32' ? 'codex.cmd' : 'codex';
58
+ return { command, args: passthroughArgs };
59
+ }
60
+ detectStatus(raw, currentStatus) {
61
+ if (currentStatus === 'completed')
62
+ return null;
63
+ const text = stripAnsi(raw);
64
+ if (this.matches(text, APPROVAL_PATTERNS))
65
+ return 'approval_required';
66
+ if (this.matches(text, ERROR_PATTERNS))
67
+ return 'error';
68
+ if (this.matches(text, WAITING_PATTERNS))
69
+ return 'waiting_for_input';
70
+ if (this.matches(text, RUNNING_PATTERNS) &&
71
+ (currentStatus === 'waiting_for_input' || currentStatus === 'approval_required')) {
72
+ return 'running';
73
+ }
74
+ return null;
75
+ }
76
+ matches(text, patterns) {
77
+ return patterns.some((p) => p.test(text));
78
+ }
79
+ }
80
+ exports.CodexAdapter = CodexAdapter;
81
+ //# sourceMappingURL=codexAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexAdapter.js","sourceRoot":"","sources":["../../src/adapters/codexAdapter.ts"],"names":[],"mappings":";;;AAAA,+CAAiE;AAGjE,MAAM,OAAO,GAAG,mDAAmD,CAAC;AAEpE,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,qEAAqE;AACrE,MAAM,iBAAiB,GAAG;IACxB,4BAA4B;IAC5B,uBAAuB;IACvB,WAAW;IACX,WAAW;IACX,UAAU;IACV,eAAe;IACf,iBAAiB;IACjB,yBAAyB;CAC1B,CAAC;AAEF,wCAAwC;AACxC,MAAM,gBAAgB,GAAG;IACvB,SAAS;IACT,SAAS;IACT,gBAAgB,EAAQ,uBAAuB;IAC/C,iBAAiB,EAAO,wBAAwB;IAChD,iBAAiB;IACjB,sBAAsB;IACtB,0BAA0B;IAC1B,iCAAiC;IACjC,gBAAgB,EAAS,wBAAwB;IACjD,oBAAoB;CACrB,CAAC;AAEF,+BAA+B;AAC/B,MAAM,gBAAgB,GAAG;IACvB,4BAA4B;IAC5B,qCAAqC;IACrC,6BAA6B;IAC7B,oBAAoB;IACpB,2BAA2B;CAC5B,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,WAAW;IACX,cAAc;IACd,qBAAqB;IACrB,oBAAoB;IACpB,oBAAoB;IACpB,4BAA4B;IAC5B,wBAAwB;CACzB,CAAC;AAEF,MAAa,YAAa,SAAQ,yBAAW;IAA7C;;QACW,cAAS,GAAG,OAAO,CAAC;IA8B/B,CAAC;IA5BC,UAAU,CAAC,eAAyB;QAClC,sDAAsD;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;QACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAC5C,CAAC;IAED,YAAY,CAAC,GAAW,EAAE,aAA4B;QACpD,IAAI,aAAa,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QAE/C,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC;YAAE,OAAO,mBAAmB,CAAC;QACtE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC;YAAE,OAAO,OAAO,CAAC;QACvD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC;YAAE,OAAO,mBAAmB,CAAC;QAErE,IACE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,CAAC;YACpC,CAAC,aAAa,KAAK,mBAAmB,IAAI,aAAa,KAAK,mBAAmB,CAAC,EAChF,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,OAAO,CAAC,IAAY,EAAE,QAAkB;QAC9C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AA/BD,oCA+BC"}
@@ -0,0 +1,9 @@
1
+ export interface CreateSessionPayload {
2
+ agent: string;
3
+ name: string;
4
+ }
5
+ export declare function createSession(payload: CreateSessionPayload): Promise<string>;
6
+ export declare function updateSessionStatus(sessionId: string, status: string): Promise<void>;
7
+ export declare function notifySession(sessionId: string, title: string, body: string, priority: string): Promise<void>;
8
+ export declare function deleteSession(sessionId: string): Promise<void>;
9
+ //# sourceMappingURL=backendClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendClient.d.ts","sourceRoot":"","sources":["../../src/api/backendClient.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAalF;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM1F;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSession = createSession;
4
+ exports.updateSessionStatus = updateSessionStatus;
5
+ exports.notifySession = notifySession;
6
+ exports.deleteSession = deleteSession;
7
+ const BACKEND_URL = 'https://ashral-web.vercel.app';
8
+ async function createSession(payload) {
9
+ const res = await fetch(`${BACKEND_URL}/sessions`, {
10
+ method: 'POST',
11
+ headers: { 'Content-Type': 'application/json' },
12
+ body: JSON.stringify(payload),
13
+ });
14
+ if (!res.ok) {
15
+ throw new Error(`Failed to create session: ${res.status} ${res.statusText}`);
16
+ }
17
+ const data = await res.json();
18
+ return data.sessionId;
19
+ }
20
+ async function updateSessionStatus(sessionId, status) {
21
+ await fetch(`${BACKEND_URL}/sessions/${sessionId}/status`, {
22
+ method: 'PATCH',
23
+ headers: { 'Content-Type': 'application/json' },
24
+ body: JSON.stringify({ status }),
25
+ }).catch(() => { }); // best-effort, don't interrupt the session
26
+ }
27
+ async function notifySession(sessionId, title, body, priority) {
28
+ await fetch(`${BACKEND_URL}/sessions/${sessionId}/notify`, {
29
+ method: 'POST',
30
+ headers: { 'Content-Type': 'application/json' },
31
+ body: JSON.stringify({ title, body, priority }),
32
+ }).catch(() => { });
33
+ }
34
+ async function deleteSession(sessionId) {
35
+ await fetch(`${BACKEND_URL}/sessions/${sessionId}`, {
36
+ method: 'DELETE',
37
+ }).catch(() => { });
38
+ }
39
+ //# sourceMappingURL=backendClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendClient.js","sourceRoot":"","sources":["../../src/api/backendClient.ts"],"names":[],"mappings":";;AAOA,sCAaC;AAED,kDAMC;AAED,sCAWC;AAED,sCAIC;AA/CD,MAAM,WAAW,GAAG,+BAA+B,CAAC;AAO7C,KAAK,UAAU,aAAa,CAAC,OAA6B;IAC/D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,WAAW,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA2B,CAAC;IACvD,OAAO,IAAI,CAAC,SAAS,CAAC;AACxB,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAAc;IACzE,MAAM,KAAK,CAAC,GAAG,WAAW,aAAa,SAAS,SAAS,EAAE;QACzD,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,2CAA2C;AACjE,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,SAAiB,EACjB,KAAa,EACb,IAAY,EACZ,QAAgB;IAEhB,MAAM,KAAK,CAAC,GAAG,WAAW,aAAa,SAAS,SAAS,EAAE;QACzD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;KAChD,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,KAAK,CAAC,GAAG,WAAW,aAAa,SAAS,EAAE,EAAE;QAClD,MAAM,EAAE,QAAQ;KACjB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrB,CAAC"}
package/dist/cli.js CHANGED
@@ -4,10 +4,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  const commander_1 = require("commander");
5
5
  const runSession_1 = require("./runner/runSession");
6
6
  const claudeAdapter_1 = require("./adapters/claudeAdapter");
7
- const ntfyNotifier_1 = require("./notifications/ntfyNotifier");
8
- const firebaseNotifier_1 = require("./notifications/firebaseNotifier");
9
- const multiNotifier_1 = require("./notifications/multiNotifier");
7
+ const codexAdapter_1 = require("./adapters/codexAdapter");
8
+ const backendNotifier_1 = require("./notifications/backendNotifier");
10
9
  const loadEnv_1 = require("./config/loadEnv");
10
+ const showSessionQr_1 = require("./qr/showSessionQr");
11
+ const backendClient_1 = require("./api/backendClient");
12
+ const crypto_1 = require("crypto"); // fallback when backend is unreachable
11
13
  // ── ANSI helpers ─────────────────────────────────────────────────────────────
12
14
  const DIM = '\x1b[2m';
13
15
  const RESET = '\x1b[0m';
@@ -18,27 +20,19 @@ const GREEN = '\x1b[32m';
18
20
  function timestamp() {
19
21
  return new Date().toISOString().split('T')[1].replace('Z', '');
20
22
  }
21
- // ── Event handler factory ────────────────────────────────────────────────────
22
- // Returns an onEvent callback. Logs to stderr and fires push notifications
23
- // when Claude needs attention.
24
- function makeEventHandler(sessionName, notifier) {
23
+ // ── Event handler ─────────────────────────────────────────────────────────────
24
+ function makeEventHandler(sessionId, sessionName) {
25
25
  const tag = `${DIM}[ashral]${RESET}`;
26
26
  const label = sessionName ? `"${sessionName}"` : 'session';
27
+ const notifier = new backendNotifier_1.BackendNotifier(sessionId);
27
28
  return function onEvent(event) {
28
- // Raw output is already mirrored to stdout — skip it here
29
29
  if (event.type === 'output')
30
30
  return;
31
31
  const ts = `${DIM}${timestamp()}${RESET}`;
32
32
  switch (event.type) {
33
33
  case 'status_changed': {
34
34
  process.stderr.write(`\n${tag} ${ts} ${CYAN}status${RESET} ${event.from} → ${event.to}\n`);
35
- if (!notifier) {
36
- process.stderr.write(`${tag} ${ts} ${DIM}(no notifier configured)${RESET}\n`);
37
- break;
38
- }
39
- // Notify when Claude needs the user's attention
40
35
  if (event.to === 'waiting_for_input') {
41
- process.stderr.write(`${tag} ${ts} ${YELLOW}notify${RESET} sending push notification...\n`);
42
36
  notifier.send({
43
37
  title: `Ashral - ${label}`,
44
38
  body: 'Claude is waiting for your input.',
@@ -46,7 +40,6 @@ function makeEventHandler(sessionName, notifier) {
46
40
  });
47
41
  }
48
42
  else if (event.to === 'approval_required') {
49
- process.stderr.write(`${tag} ${ts} ${YELLOW}notify${RESET} sending push notification...\n`);
50
43
  notifier.send({
51
44
  title: `Ashral - ${label} [approval]`,
52
45
  body: 'Claude needs your approval before continuing.',
@@ -54,7 +47,6 @@ function makeEventHandler(sessionName, notifier) {
54
47
  });
55
48
  }
56
49
  else if (event.to === 'error') {
57
- process.stderr.write(`${tag} ${ts} ${YELLOW}notify${RESET} sending push notification...\n`);
58
50
  notifier.send({
59
51
  title: `Ashral - ${label} [error]`,
60
52
  body: 'Claude encountered an error.',
@@ -75,50 +67,34 @@ function makeEventHandler(sessionName, notifier) {
75
67
  }
76
68
  };
77
69
  }
78
- // ── Notifier setup ────────────────────────────────────────────────────────────
79
- // Builds ALL configured notifiers and fans out to them in parallel via MultiNotifier.
80
- // Firebase and ntfy are independent both fire when both are configured.
81
- //
82
- // Config (set in ~/.ashral/.env):
83
- // ASHRAL_FIREBASE_SERVICE_ACCOUNT path to service account JSON, or the JSON string itself
84
- // ASHRAL_FCM_TOKEN FCM device registration token
85
- // ASHRAL_NTFY_URL e.g. https://ntfy.sh/your-topic
86
- function resolveNotifier(ntfyFlagUrl) {
87
- const active = [];
88
- const labels = [];
89
- // ── Firebase ──────────────────────────────────────────────────────────────
90
- const serviceAccount = process.env.ASHRAL_FIREBASE_SERVICE_ACCOUNT;
91
- const deviceToken = process.env.ASHRAL_FCM_TOKEN;
92
- if (serviceAccount && deviceToken) {
93
- try {
94
- active.push(new firebaseNotifier_1.FirebaseNotifier({ serviceAccount, deviceToken }));
95
- labels.push('Firebase');
96
- }
97
- catch (err) {
98
- const msg = err instanceof Error ? err.message : String(err);
99
- process.stderr.write(`[ashral] Firebase init failed: ${msg}\n`);
100
- }
70
+ // ── Shared run logic ──────────────────────────────────────────────────────────
71
+ async function runAgent(adapter, options, passthroughArgs) {
72
+ let sessionId = (0, crypto_1.randomUUID)(); // fallback if backend is unreachable
73
+ try {
74
+ sessionId = await (0, backendClient_1.createSession)({ agent: adapter.agentName, name: options.name ?? adapter.agentName });
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ process.stderr.write(`[ashral] Warning: could not register session with backend: ${msg}\n`);
101
79
  }
102
- else {
103
- if (!serviceAccount)
104
- process.stderr.write(`[ashral] ${DIM}ASHRAL_FIREBASE_SERVICE_ACCOUNT not set${RESET}\n`);
105
- if (!deviceToken)
106
- process.stderr.write(`[ashral] ${DIM}ASHRAL_FCM_TOKEN not set${RESET}\n`);
80
+ (0, showSessionQr_1.showSessionQr)(sessionId, options.name);
81
+ try {
82
+ await (0, runSession_1.runSession)({
83
+ adapter,
84
+ name: options.name,
85
+ sessionId,
86
+ passthroughArgs,
87
+ onEvent: makeEventHandler(sessionId, options.name),
88
+ });
107
89
  }
108
- // ── ntfy ──────────────────────────────────────────────────────────────────
109
- const ntfyUrl = ntfyFlagUrl ?? process.env.ASHRAL_NTFY_URL;
110
- if (ntfyUrl) {
111
- active.push(new ntfyNotifier_1.NtfyNotifier(ntfyUrl));
112
- labels.push('ntfy');
90
+ catch (err) {
91
+ const message = err instanceof Error ? err.message : String(err);
92
+ process.stderr.write(`[ashral] Fatal: ${message}\n`);
93
+ process.exit(1);
113
94
  }
114
- else {
115
- process.stderr.write(`[ashral] ${DIM}ASHRAL_NTFY_URL not set${RESET}\n`);
95
+ finally {
96
+ await (0, backendClient_1.deleteSession)(sessionId);
116
97
  }
117
- if (active.length === 0)
118
- return { notifier: null, labels: [] };
119
- if (active.length === 1)
120
- return { notifier: active[0], labels };
121
- return { notifier: new multiNotifier_1.MultiNotifier(active), labels };
122
98
  }
123
99
  // ── CLI definition ────────────────────────────────────────────────────────────
124
100
  (0, loadEnv_1.loadEnvFile)();
@@ -132,54 +108,27 @@ runCmd
132
108
  .command('claude')
133
109
  .description('Start a Claude Code session')
134
110
  .option('--name <name>', 'human-readable session name')
135
- .option('--notify-url <url>', 'ntfy.sh topic URL for push notifications (or set ASHRAL_NTFY_URL)')
136
111
  .allowUnknownOption()
137
112
  .allowExcessArguments()
138
113
  .action(async (options, command) => {
139
- const passthroughArgs = command.args;
140
- const adapter = new claudeAdapter_1.ClaudeAdapter();
141
- const { notifier, labels } = resolveNotifier(options.notifyUrl);
142
- process.stderr.write('\n');
143
- if (options.name) {
144
- process.stderr.write(`[ashral] Starting session: ${options.name}\n`);
145
- }
146
- if (labels.length > 0) {
147
- process.stderr.write(`[ashral] Push notifications active: ${labels.join(' + ')}\n`);
148
- }
149
- else {
150
- process.stderr.write(`[ashral] Push notifications: none configured\n`);
151
- }
152
- process.stderr.write('\n');
153
- try {
154
- await (0, runSession_1.runSession)({
155
- adapter,
156
- name: options.name,
157
- passthroughArgs,
158
- onEvent: makeEventHandler(options.name, notifier),
159
- });
160
- }
161
- catch (err) {
162
- const message = err instanceof Error ? err.message : String(err);
163
- process.stderr.write(`[ashral] Fatal: ${message}\n`);
164
- process.exit(1);
165
- }
114
+ await runAgent(new claudeAdapter_1.ClaudeAdapter(), options, command.args);
166
115
  });
167
- // ── notify test ───────────────────────────────────────────────────────────────
116
+ runCmd
117
+ .command('codex')
118
+ .description('Start an OpenAI Codex session')
119
+ .option('--name <name>', 'human-readable session name')
120
+ .allowUnknownOption()
121
+ .allowExcessArguments()
122
+ .action(async (options, command) => {
123
+ await runAgent(new codexAdapter_1.CodexAdapter(), options, command.args);
124
+ });
125
+ // ── notify:test ───────────────────────────────────────────────────────────────
168
126
  program
169
127
  .command('notify:test')
170
- .description('Send a test notification to all configured providers')
171
- .action(async () => {
172
- const { notifier, labels } = resolveNotifier(undefined);
173
- if (!notifier) {
174
- process.stderr.write('[ashral] No notifiers configured. Check ~/.ashral/.env\n');
175
- process.exit(1);
176
- }
177
- process.stderr.write(`[ashral] Sending test notification via: ${labels.join(' + ')}\n`);
178
- await notifier.send({
179
- title: 'Ashral test',
180
- body: 'If you see this, notifications are working.',
181
- priority: 'high',
182
- });
128
+ .description('Send a test notification via backend')
129
+ .argument('<sessionId>', 'session ID to notify')
130
+ .action(async (sessionId) => {
131
+ await (0, backendClient_1.notifySession)(sessionId, 'Ashral test', 'If you see this, notifications are working.', 'high');
183
132
  process.stderr.write('[ashral] Done.\n');
184
133
  });
185
134
  program.parse(process.argv);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Notifier, NotificationPayload } from './notifier';
2
+ /**
3
+ * Sends notifications via the Ashral backend.
4
+ * The backend looks up all registered devices for the session and dispatches FCM.
5
+ * The CLI no longer needs Firebase credentials.
6
+ */
7
+ export declare class BackendNotifier implements Notifier {
8
+ private readonly sessionId;
9
+ constructor(sessionId: string);
10
+ send(payload: NotificationPayload): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=backendNotifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendNotifier.d.ts","sourceRoot":"","sources":["../../src/notifications/backendNotifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,EAAE,MAAM;IAIvB,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAQxD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackendNotifier = void 0;
4
+ const backendClient_1 = require("../api/backendClient");
5
+ /**
6
+ * Sends notifications via the Ashral backend.
7
+ * The backend looks up all registered devices for the session and dispatches FCM.
8
+ * The CLI no longer needs Firebase credentials.
9
+ */
10
+ class BackendNotifier {
11
+ constructor(sessionId) {
12
+ this.sessionId = sessionId;
13
+ }
14
+ async send(payload) {
15
+ await (0, backendClient_1.notifySession)(this.sessionId, payload.title, payload.body, payload.priority ?? 'normal');
16
+ }
17
+ }
18
+ exports.BackendNotifier = BackendNotifier;
19
+ //# sourceMappingURL=backendNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backendNotifier.js","sourceRoot":"","sources":["../../src/notifications/backendNotifier.ts"],"names":[],"mappings":";;;AAAA,wDAAqD;AAGrD;;;;GAIG;AACH,MAAa,eAAe;IAG1B,YAAY,SAAiB;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACrC,MAAM,IAAA,6BAAa,EACjB,IAAI,CAAC,SAAS,EACd,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAC7B,CAAC;IACJ,CAAC;CACF;AAfD,0CAeC"}
@@ -64,7 +64,7 @@ class FirebaseNotifier {
64
64
  },
65
65
  },
66
66
  });
67
- process.stderr.write(`[ashral] Firebase sent OK — messageId: ${messageId}\n`);
67
+ void messageId; // send confirmed
68
68
  }
69
69
  catch (err) {
70
70
  const msg = err instanceof Error ? err.message : String(err);
@@ -1 +1 @@
1
- {"version":3,"file":"firebaseNotifier.js","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"firebaseNotifier.js","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function showSessionQr(sessionId: string, sessionName?: string): void;
2
+ //# sourceMappingURL=showSessionQr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showSessionQr.d.ts","sourceRoot":"","sources":["../../src/qr/showSessionQr.ts"],"names":[],"mappings":"AAwDA,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAO3E"}
@@ -0,0 +1,64 @@
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.showSessionQr = showSessionQr;
7
+ const qrcode_1 = __importDefault(require("qrcode"));
8
+ const DEEP_LINK_BASE = 'https://ashral-web.vercel.app/join';
9
+ const MARGIN = 3; // quiet zone in modules
10
+ const WHITE = '\x1b[97m'; // bright white
11
+ const RESET = '\x1b[0m';
12
+ /**
13
+ * Renders the QR using half-block characters (▀ ▄ █).
14
+ * Two QR rows are packed into one terminal row, so each module becomes
15
+ * a perfect square: 1 char wide × ½ char tall × 2:1 terminal aspect ratio = 1:1.
16
+ * Colors are inverted (white on dark) for dark terminals.
17
+ */
18
+ function renderTerminalQr(url) {
19
+ const qr = qrcode_1.default.create(url, { errorCorrectionLevel: 'M' });
20
+ const { data, size } = qr.modules;
21
+ const total = size + MARGIN * 2;
22
+ function isDark(row, col) {
23
+ const r = row - MARGIN;
24
+ const c = col - MARGIN;
25
+ if (r < 0 || r >= size || c < 0 || c >= size)
26
+ return false;
27
+ return data[r * size + c] === 1;
28
+ }
29
+ const rows = [];
30
+ for (let row = 0; row < total; row += 2) {
31
+ let line = '';
32
+ for (let col = 0; col < total; col++) {
33
+ const top = isDark(row, col);
34
+ const bottom = (row + 1 < total) ? isDark(row + 1, col) : false;
35
+ // Inverted: dark QR module → white glyph, light → terminal background
36
+ if (top && bottom)
37
+ line += `${WHITE}█${RESET}`;
38
+ else if (top && !bottom)
39
+ line += `${WHITE}▀${RESET}`;
40
+ else if (!top && bottom)
41
+ line += `${WHITE}▄${RESET}`;
42
+ else
43
+ line += ' ';
44
+ }
45
+ rows.push(line);
46
+ }
47
+ // Border — total chars wide = total modules (1 char each) + 2 padding spaces each side
48
+ const innerWidth = total + 4;
49
+ const top = ' ╭' + '─'.repeat(innerWidth) + '╮';
50
+ const bottom = ' ╰' + '─'.repeat(innerWidth) + '╯';
51
+ process.stderr.write(top + '\n');
52
+ for (const row of rows) {
53
+ process.stderr.write(` │ ${row} │\n`);
54
+ }
55
+ process.stderr.write(bottom + '\n');
56
+ }
57
+ function showSessionQr(sessionId, sessionName) {
58
+ const url = `${DEEP_LINK_BASE}/${sessionId}`;
59
+ const label = sessionName ? `"${sessionName}"` : sessionId;
60
+ process.stderr.write(`\n Scan with Ashral app → ${label}\n\n`);
61
+ renderTerminalQr(url);
62
+ process.stderr.write(`\n ${url}\n\n`);
63
+ }
64
+ //# sourceMappingURL=showSessionQr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"showSessionQr.js","sourceRoot":"","sources":["../../src/qr/showSessionQr.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,8 @@ import type { AshralEvent } from '../types/events';
3
3
  export interface RunSessionOptions {
4
4
  adapter: BaseAdapter;
5
5
  name?: string;
6
+ /** Pre-generated session ID — pass this to show a QR before spawning */
7
+ sessionId?: string;
6
8
  /** Extra args forwarded verbatim to the agent CLI (everything after --) */
7
9
  passthroughArgs: string[];
8
10
  onEvent: (event: AshralEvent) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"runSession.d.ts","sourceRoot":"","sources":["../../src/runner/runSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyF1E"}
1
+ {"version":3,"file":"runSession.d.ts","sourceRoot":"","sources":["../../src/runner/runSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyF1E"}
@@ -41,10 +41,10 @@ const sessionState_1 = require("./sessionState");
41
41
  * state machine. Resolves when the agent process exits.
42
42
  */
43
43
  async function runSession(options) {
44
- const { adapter, name, passthroughArgs, onEvent } = options;
44
+ const { adapter, name, sessionId, passthroughArgs, onEvent } = options;
45
45
  const cwd = process.cwd();
46
46
  const { columns = 80, rows = 24 } = process.stdout;
47
- const state = new sessionState_1.SessionState(adapter.agentName, name, cwd, onEvent);
47
+ const state = new sessionState_1.SessionState(adapter.agentName, name, cwd, onEvent, sessionId);
48
48
  const config = adapter.getCommand(passthroughArgs);
49
49
  // Merge adapter env overrides on top of the current environment
50
50
  const env = { ...process.env, ...(config.env ?? {}) };
@@ -1 +1 @@
1
- {"version":3,"file":"runSession.js","sourceRoot":"","sources":["../../src/runner/runSession.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runSession.js","sourceRoot":"","sources":["../../src/runner/runSession.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import type { AshralEvent } from '../types/events';
3
3
  export declare class SessionState {
4
4
  private session;
5
5
  private readonly emit;
6
- constructor(agent: string, name: string | undefined, cwd: string, emit: (event: AshralEvent) => void);
6
+ constructor(agent: string, name: string | undefined, cwd: string, emit: (event: AshralEvent) => void, id?: string);
7
7
  get id(): string;
8
8
  get status(): SessionStatus;
9
9
  /** Transition to a new status and emit a status_changed event. No-ops on same status. */
@@ -1 +1 @@
1
- {"version":3,"file":"sessionState.d.ts","sourceRoot":"","sources":["../../src/runner/sessionState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAC;AAEvE,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;gBAGlD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI;IAapC,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,yFAAyF;IACzF,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAgBnC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWhC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC;CAG9B"}
1
+ {"version":3,"file":"sessionState.d.ts","sourceRoot":"","sources":["../../src/runner/sessionState.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,iBAAiB,CAAC;AAEvE,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;gBAGlD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,EAClC,EAAE,CAAC,EAAE,MAAM;IAab,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,yFAAyF;IACzF,UAAU,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAgBnC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWhC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC;CAG9B"}
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SessionState = void 0;
4
4
  const crypto_1 = require("crypto");
5
5
  class SessionState {
6
- constructor(agent, name, cwd, emit) {
6
+ constructor(agent, name, cwd, emit, id) {
7
7
  this.emit = emit;
8
8
  this.session = {
9
- id: (0, crypto_1.randomUUID)(),
9
+ id: id ?? (0, crypto_1.randomUUID)(),
10
10
  name,
11
11
  agent,
12
12
  status: 'starting',
@@ -1 +1 @@
1
- {"version":3,"file":"sessionState.js","sourceRoot":"","sources":["../../src/runner/sessionState.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAIpC,MAAa,YAAY;IAIvB,YACE,KAAa,EACb,IAAwB,EACxB,GAAW,EACX,IAAkC;QAElC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG;YACb,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,yFAAyF;IACzF,UAAU,CAAC,EAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO;QAExB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAuB;YAChC,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI;YACJ,EAAE;SACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,2EAA2E;IAC3E,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AA7DD,oCA6DC"}
1
+ {"version":3,"file":"sessionState.js","sourceRoot":"","sources":["../../src/runner/sessionState.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAIpC,MAAa,YAAY;IAIvB,YACE,KAAa,EACb,IAAwB,EACxB,GAAW,EACX,IAAkC,EAClC,EAAW;QAEX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG;YACb,EAAE,EAAE,EAAE,IAAI,IAAA,mBAAU,GAAE;YACtB,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,GAAG;SACJ,CAAC;IACJ,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,yFAAyF;IACzF,UAAU,CAAC,EAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO;QAExB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;QAEzB,MAAM,KAAK,GAAuB;YAChC,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,IAAI;YACJ,EAAE;SACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED,2EAA2E;IAC3E,QAAQ,CAAC,QAAgB;QACvB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACF;AA9DD,oCA8DC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ashral",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Control center for AI coding agents",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -21,10 +21,14 @@
21
21
  "dependencies": {
22
22
  "commander": "^12.1.0",
23
23
  "firebase-admin": "^13.7.0",
24
- "node-pty": "^1.0.0"
24
+ "node-pty": "^1.0.0",
25
+ "qrcode": "^1.5.4",
26
+ "qrcode-terminal": "^0.12.0"
25
27
  },
26
28
  "devDependencies": {
27
29
  "@types/node": "^20.0.0",
30
+ "@types/qrcode": "^1.5.6",
31
+ "@types/qrcode-terminal": "^0.12.2",
28
32
  "ts-node": "^10.9.2",
29
33
  "typescript": "^5.4.0"
30
34
  },