ashral 0.1.1 → 0.1.3

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 (39) hide show
  1. package/dist/adapters/codexAdapter.d.ts +9 -0
  2. package/dist/adapters/codexAdapter.d.ts.map +1 -0
  3. package/dist/adapters/codexAdapter.js +81 -0
  4. package/dist/adapters/codexAdapter.js.map +1 -0
  5. package/dist/api/backendClient.d.ts +9 -0
  6. package/dist/api/backendClient.d.ts.map +1 -0
  7. package/dist/api/backendClient.js +39 -0
  8. package/dist/api/backendClient.js.map +1 -0
  9. package/dist/cli.js +57 -41
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config/loadEnv.d.ts +9 -0
  12. package/dist/config/loadEnv.d.ts.map +1 -0
  13. package/dist/config/loadEnv.js +45 -0
  14. package/dist/config/loadEnv.js.map +1 -0
  15. package/dist/notifications/backendNotifier.d.ts +12 -0
  16. package/dist/notifications/backendNotifier.d.ts.map +1 -0
  17. package/dist/notifications/backendNotifier.js +19 -0
  18. package/dist/notifications/backendNotifier.js.map +1 -0
  19. package/dist/notifications/firebaseNotifier.d.ts +19 -0
  20. package/dist/notifications/firebaseNotifier.d.ts.map +1 -0
  21. package/dist/notifications/firebaseNotifier.js +86 -0
  22. package/dist/notifications/firebaseNotifier.js.map +1 -0
  23. package/dist/notifications/multiNotifier.d.ts +11 -0
  24. package/dist/notifications/multiNotifier.d.ts.map +1 -0
  25. package/dist/notifications/multiNotifier.js +17 -0
  26. package/dist/notifications/multiNotifier.js.map +1 -0
  27. package/dist/qr/showSessionQr.d.ts +2 -0
  28. package/dist/qr/showSessionQr.d.ts.map +1 -0
  29. package/dist/qr/showSessionQr.js +64 -0
  30. package/dist/qr/showSessionQr.js.map +1 -0
  31. package/dist/runner/runSession.d.ts +2 -0
  32. package/dist/runner/runSession.d.ts.map +1 -1
  33. package/dist/runner/runSession.js +2 -2
  34. package/dist/runner/runSession.js.map +1 -1
  35. package/dist/runner/sessionState.d.ts +1 -1
  36. package/dist/runner/sessionState.d.ts.map +1 -1
  37. package/dist/runner/sessionState.js +2 -2
  38. package/dist/runner/sessionState.js.map +1 -1
  39. package/package.json +7 -2
@@ -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,CAAC,EAAE,MAAM,CAAC;CACf;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,7 +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");
7
+ const codexAdapter_1 = require("./adapters/codexAdapter");
8
+ const backendNotifier_1 = require("./notifications/backendNotifier");
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
8
13
  // ── ANSI helpers ─────────────────────────────────────────────────────────────
9
14
  const DIM = '\x1b[2m';
10
15
  const RESET = '\x1b[0m';
@@ -15,23 +20,18 @@ const GREEN = '\x1b[32m';
15
20
  function timestamp() {
16
21
  return new Date().toISOString().split('T')[1].replace('Z', '');
17
22
  }
18
- // ── Event handler factory ────────────────────────────────────────────────────
19
- // Returns an onEvent callback. Logs to stderr and fires push notifications
20
- // when Claude needs attention.
21
- function makeEventHandler(sessionName, notifier) {
23
+ // ── Event handler ─────────────────────────────────────────────────────────────
24
+ function makeEventHandler(sessionId, sessionName) {
22
25
  const tag = `${DIM}[ashral]${RESET}`;
23
26
  const label = sessionName ? `"${sessionName}"` : 'session';
27
+ const notifier = new backendNotifier_1.BackendNotifier(sessionId);
24
28
  return function onEvent(event) {
25
- // Raw output is already mirrored to stdout — skip it here
26
29
  if (event.type === 'output')
27
30
  return;
28
31
  const ts = `${DIM}${timestamp()}${RESET}`;
29
32
  switch (event.type) {
30
33
  case 'status_changed': {
31
34
  process.stderr.write(`\n${tag} ${ts} ${CYAN}status${RESET} ${event.from} → ${event.to}\n`);
32
- if (!notifier)
33
- break;
34
- // Notify when Claude needs the user's attention
35
35
  if (event.to === 'waiting_for_input') {
36
36
  notifier.send({
37
37
  title: `Ashral - ${label}`,
@@ -67,16 +67,37 @@ function makeEventHandler(sessionName, notifier) {
67
67
  }
68
68
  };
69
69
  }
70
- // ── Notifier setup ────────────────────────────────────────────────────────────
71
- // Resolves a notifier from --notify-url flag or ASHRAL_NTFY_URL env var.
72
- // Returns null (silent) if neither is set.
73
- function resolveNotifier(flagUrl) {
74
- const url = flagUrl ?? process.env.ASHRAL_NTFY_URL;
75
- if (!url)
76
- return null;
77
- return new ntfyNotifier_1.NtfyNotifier(url);
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 });
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`);
79
+ }
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
+ });
89
+ }
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);
94
+ }
95
+ finally {
96
+ await (0, backendClient_1.deleteSession)(sessionId);
97
+ }
78
98
  }
79
99
  // ── CLI definition ────────────────────────────────────────────────────────────
100
+ (0, loadEnv_1.loadEnvFile)();
80
101
  const program = new commander_1.Command();
81
102
  program
82
103
  .name('ashral')
@@ -87,33 +108,28 @@ runCmd
87
108
  .command('claude')
88
109
  .description('Start a Claude Code session')
89
110
  .option('--name <name>', 'human-readable session name')
90
- .option('--notify-url <url>', 'ntfy.sh topic URL for push notifications (or set ASHRAL_NTFY_URL)')
91
111
  .allowUnknownOption()
92
112
  .allowExcessArguments()
93
113
  .action(async (options, command) => {
94
- const passthroughArgs = command.args;
95
- const adapter = new claudeAdapter_1.ClaudeAdapter();
96
- const notifier = resolveNotifier(options.notifyUrl);
97
- if (options.name) {
98
- process.stderr.write(`\n[ashral] Starting session: ${options.name}\n`);
99
- }
100
- if (notifier) {
101
- process.stderr.write(`[ashral] Push notifications enabled.\n`);
102
- }
103
- process.stderr.write('\n');
104
- try {
105
- await (0, runSession_1.runSession)({
106
- adapter,
107
- name: options.name,
108
- passthroughArgs,
109
- onEvent: makeEventHandler(options.name, notifier),
110
- });
111
- }
112
- catch (err) {
113
- const message = err instanceof Error ? err.message : String(err);
114
- process.stderr.write(`[ashral] Fatal: ${message}\n`);
115
- process.exit(1);
116
- }
114
+ await runAgent(new claudeAdapter_1.ClaudeAdapter(), options, command.args);
115
+ });
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 ───────────────────────────────────────────────────────────────
126
+ program
127
+ .command('notify:test')
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');
132
+ process.stderr.write('[ashral] Done.\n');
117
133
  });
118
134
  program.parse(process.argv);
119
135
  //# sourceMappingURL=cli.js.map
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":";;;AACA,yCAAoC;AACpC,oDAAiD;AACjD,4DAAyD;AACzD,0DAAuD;AACvD,qEAAkE;AAClE,8CAA+C;AAC/C,sDAAmD;AACnD,uDAAkF;AAClF,mCAAoC,CAAC,uCAAuC;AAG5E,gFAAgF;AAEhF,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AAEzB,SAAS,SAAS;IAChB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,iFAAiF;AAEjF,SAAS,gBAAgB,CACvB,SAAiB,EACjB,WAA+B;IAE/B,MAAM,GAAG,GAAK,GAAG,GAAG,WAAW,KAAK,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,iCAAe,CAAC,SAAS,CAAC,CAAC;IAEhD,OAAO,SAAS,OAAO,CAAC,KAAkB;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAEpC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,CAAC;QAE1C,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,GAAG,IAAI,EAAE,IAAI,IAAI,SAAS,KAAK,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,IAAI,CACtE,CAAC;gBAEF,IAAI,KAAK,CAAC,EAAE,KAAK,mBAAmB,EAAE,CAAC;oBACrC,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,YAAY,KAAK,EAAE;wBAC1B,IAAI,EAAE,mCAAmC;wBACzC,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,KAAK,CAAC,EAAE,KAAK,mBAAmB,EAAE,CAAC;oBAC5C,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,YAAY,KAAK,aAAa;wBACrC,IAAI,EAAE,+CAA+C;wBACrD,QAAQ,EAAE,QAAQ;qBACnB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC;wBACZ,KAAK,EAAE,YAAY,KAAK,UAAU;wBAClC,IAAI,EAAE,8BAA8B;wBACpC,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,cAAc;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;gBACjF,MAAM;YAER,KAAK,OAAO;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,GAAG,QAAQ,KAAK,OAAO,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;gBAC/E,MAAM;YAER,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,KAAK,kBAAkB,KAAK,CAAC,QAAQ,IAAI,CACxE,CAAC;gBACF,MAAM;QACV,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,QAAQ,CACrB,OAA+E,EAC/E,OAA0B,EAC1B,eAAyB;IAEzB,IAAI,SAAS,GAAW,IAAA,mBAAU,GAAE,CAAC,CAAC,qCAAqC;IAE3E,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,IAAA,6BAAa,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8DAA8D,GAAG,IAAI,CAAC,CAAC;IAC9F,CAAC;IAED,IAAA,6BAAa,EAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,IAAA,uBAAU,EAAC;YACf,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS;YACT,eAAe;YACf,OAAO,EAAE,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,IAAA,6BAAa,EAAC,SAAS,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,IAAA,qBAAW,GAAE,CAAC;AAEd,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAC;AAE5E,MAAM;KACH,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;KACtD,kBAAkB,EAAE;KACpB,oBAAoB,EAAE;KACtB,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,OAAgB,EAAE,EAAE;IAC7D,MAAM,QAAQ,CAAC,IAAI,6BAAa,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL,MAAM;KACH,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC;KACtD,kBAAkB,EAAE;KACpB,oBAAoB,EAAE;KACtB,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,OAAgB,EAAE,EAAE;IAC7D,MAAM,QAAQ,CAAC,IAAI,2BAAY,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEL,iFAAiF;AAEjF,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC/C,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;IAClC,MAAM,IAAA,6BAAa,EAAC,SAAS,EAAE,aAAa,EAAE,6CAA6C,EAAE,MAAM,CAAC,CAAC;IACrG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Loads .env files in priority order (later files do NOT override earlier ones):
3
+ * 1. ~/.ashral/.env — global user config, credentials live here
4
+ * 2. <cwd>/.env — project-level overrides
5
+ *
6
+ * This means Firebase credentials set once in ~/.ashral/.env work from any directory.
7
+ */
8
+ export declare function loadEnvFile(): void;
9
+ //# sourceMappingURL=loadEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadEnv.d.ts","sourceRoot":"","sources":["../../src/config/loadEnv.ts"],"names":[],"mappings":"AAuCA;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadEnvFile = loadEnvFile;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const os_1 = require("os");
7
+ function stripWrappingQuotes(value) {
8
+ if ((value.startsWith('"') && value.endsWith('"')) ||
9
+ (value.startsWith("'") && value.endsWith("'"))) {
10
+ return value.slice(1, -1);
11
+ }
12
+ return value;
13
+ }
14
+ function loadFile(envPath) {
15
+ if (!(0, fs_1.existsSync)(envPath))
16
+ return;
17
+ const content = (0, fs_1.readFileSync)(envPath, 'utf-8');
18
+ for (const rawLine of content.split(/\r?\n/)) {
19
+ const line = rawLine.trim();
20
+ if (!line || line.startsWith('#'))
21
+ continue;
22
+ const exportPrefix = line.startsWith('export ') ? 'export '.length : 0;
23
+ const normalized = line.slice(exportPrefix);
24
+ const separatorIndex = normalized.indexOf('=');
25
+ if (separatorIndex <= 0)
26
+ continue;
27
+ const key = normalized.slice(0, separatorIndex).trim();
28
+ const value = stripWrappingQuotes(normalized.slice(separatorIndex + 1).trim());
29
+ if (!key || process.env[key] !== undefined)
30
+ continue;
31
+ process.env[key] = value;
32
+ }
33
+ }
34
+ /**
35
+ * Loads .env files in priority order (later files do NOT override earlier ones):
36
+ * 1. ~/.ashral/.env — global user config, credentials live here
37
+ * 2. <cwd>/.env — project-level overrides
38
+ *
39
+ * This means Firebase credentials set once in ~/.ashral/.env work from any directory.
40
+ */
41
+ function loadEnvFile() {
42
+ loadFile((0, path_1.join)((0, os_1.homedir)(), '.ashral', '.env'));
43
+ loadFile((0, path_1.resolve)(process.cwd(), '.env'));
44
+ }
45
+ //# sourceMappingURL=loadEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadEnv.js","sourceRoot":"","sources":["../../src/config/loadEnv.ts"],"names":[],"mappings":";;AA8CA,kCAGC;AAjDD,2BAA8C;AAC9C,+BAAqC;AACrC,2BAA6B;AAE7B,SAAS,mBAAmB,CAAC,KAAa;IACxC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe;IAC/B,IAAI,CAAC,IAAA,eAAU,EAAC,OAAO,CAAC;QAAE,OAAO;IAEjC,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/C,IAAI,cAAc,IAAI,CAAC;YAAE,SAAS;QAElC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAE/E,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,SAAS;QACrD,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW;IACzB,QAAQ,CAAC,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAA,cAAO,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -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"}
@@ -0,0 +1,19 @@
1
+ import { type ServiceAccount } from 'firebase-admin/app';
2
+ import type { Notifier, NotificationPayload } from './notifier';
3
+ export interface FirebaseNotifierConfig {
4
+ /**
5
+ * Path to a Firebase service account JSON file,
6
+ * OR the JSON content as a string,
7
+ * OR a parsed service account object.
8
+ */
9
+ serviceAccount: string | ServiceAccount;
10
+ /** FCM device registration token for the target phone */
11
+ deviceToken: string;
12
+ }
13
+ export declare class FirebaseNotifier implements Notifier {
14
+ private readonly deviceToken;
15
+ constructor(config: FirebaseNotifierConfig);
16
+ send(payload: NotificationPayload): Promise<void>;
17
+ private parseServiceAccount;
18
+ }
19
+ //# sourceMappingURL=firebaseNotifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebaseNotifier.d.ts","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAiChE,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,cAAc,EAAE,MAAM,GAAG,cAAc,CAAC;IACxC,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,sBAAsB;IAcpC,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCvD,OAAO,CAAC,mBAAmB;CAW5B"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FirebaseNotifier = void 0;
4
+ const app_1 = require("firebase-admin/app");
5
+ const messaging_1 = require("firebase-admin/messaging");
6
+ // FCM message-level delivery priority (wakes up the device)
7
+ const ANDROID_MESSAGE_PRIORITY = {
8
+ low: 'normal',
9
+ normal: 'high',
10
+ high: 'high',
11
+ urgent: 'high',
12
+ };
13
+ // Android notification display priority (controls heads-up / sound)
14
+ const ANDROID_NOTIFICATION_PRIORITY = {
15
+ low: 'default',
16
+ normal: 'high',
17
+ high: 'high',
18
+ urgent: 'max',
19
+ };
20
+ // APNs interrupt level for iOS
21
+ const APNS_INTERRUPT_LEVEL = {
22
+ low: 'passive',
23
+ normal: 'active',
24
+ high: 'time-sensitive',
25
+ urgent: 'time-sensitive',
26
+ };
27
+ class FirebaseNotifier {
28
+ constructor(config) {
29
+ this.deviceToken = config.deviceToken;
30
+ // Initialise the Admin SDK once — safe to call from multiple sessions
31
+ if ((0, app_1.getApps)().length === 0) {
32
+ const sa = typeof config.serviceAccount === 'string'
33
+ ? this.parseServiceAccount(config.serviceAccount)
34
+ : config.serviceAccount;
35
+ (0, app_1.initializeApp)({ credential: (0, app_1.cert)(sa) });
36
+ }
37
+ }
38
+ async send(payload) {
39
+ const priority = payload.priority ?? 'normal';
40
+ try {
41
+ const messageId = await (0, messaging_1.getMessaging)().send({
42
+ token: this.deviceToken,
43
+ notification: {
44
+ title: payload.title,
45
+ body: payload.body,
46
+ },
47
+ android: {
48
+ // High priority wakes the device even in Doze mode
49
+ priority: ANDROID_MESSAGE_PRIORITY[priority],
50
+ notification: {
51
+ // No channelId — let FCM create the default channel automatically,
52
+ // same as the Firebase Console test does.
53
+ sound: 'default',
54
+ priority: ANDROID_NOTIFICATION_PRIORITY[priority],
55
+ defaultSound: true,
56
+ },
57
+ },
58
+ apns: {
59
+ payload: {
60
+ aps: {
61
+ sound: 'default',
62
+ interruptionLevel: APNS_INTERRUPT_LEVEL[priority],
63
+ },
64
+ },
65
+ },
66
+ });
67
+ void messageId; // send confirmed
68
+ }
69
+ catch (err) {
70
+ const msg = err instanceof Error ? err.message : String(err);
71
+ process.stderr.write(`[ashral] Firebase error: ${msg}\n`);
72
+ }
73
+ }
74
+ parseServiceAccount(input) {
75
+ // Accept either a file path or raw JSON string
76
+ if (input.trim().startsWith('{')) {
77
+ return JSON.parse(input);
78
+ }
79
+ // It's a file path — read synchronously (only at startup, not on each send)
80
+ const { readFileSync } = require('fs');
81
+ const content = readFileSync(input, 'utf-8');
82
+ return JSON.parse(content);
83
+ }
84
+ }
85
+ exports.FirebaseNotifier = FirebaseNotifier;
86
+ //# sourceMappingURL=firebaseNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebaseNotifier.js","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Notifier, NotificationPayload } from './notifier';
2
+ /**
3
+ * Fans out a single send() call to every configured notifier in parallel.
4
+ * One failing notifier never blocks the others.
5
+ */
6
+ export declare class MultiNotifier implements Notifier {
7
+ private readonly notifiers;
8
+ constructor(notifiers: Notifier[]);
9
+ send(payload: NotificationPayload): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=multiNotifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiNotifier.d.ts","sourceRoot":"","sources":["../../src/notifications/multiNotifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;gBAE3B,SAAS,EAAE,QAAQ,EAAE;IAI3B,IAAI,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiNotifier = void 0;
4
+ /**
5
+ * Fans out a single send() call to every configured notifier in parallel.
6
+ * One failing notifier never blocks the others.
7
+ */
8
+ class MultiNotifier {
9
+ constructor(notifiers) {
10
+ this.notifiers = notifiers;
11
+ }
12
+ async send(payload) {
13
+ await Promise.allSettled(this.notifiers.map((n) => n.send(payload)));
14
+ }
15
+ }
16
+ exports.MultiNotifier = MultiNotifier;
17
+ //# sourceMappingURL=multiNotifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multiNotifier.js","sourceRoot":"","sources":["../../src/notifications/multiNotifier.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,aAAa;IAGxB,YAAY,SAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACrC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AAVD,sCAUC"}
@@ -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.1",
3
+ "version": "0.1.3",
4
4
  "description": "Control center for AI coding agents",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -20,10 +20,15 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "commander": "^12.1.0",
23
- "node-pty": "^1.0.0"
23
+ "firebase-admin": "^13.7.0",
24
+ "node-pty": "^1.0.0",
25
+ "qrcode": "^1.5.4",
26
+ "qrcode-terminal": "^0.12.0"
24
27
  },
25
28
  "devDependencies": {
26
29
  "@types/node": "^20.0.0",
30
+ "@types/qrcode": "^1.5.6",
31
+ "@types/qrcode-terminal": "^0.12.2",
27
32
  "ts-node": "^10.9.2",
28
33
  "typescript": "^5.4.0"
29
34
  },