ashral 0.1.2 → 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.
- package/dist/adapters/codexAdapter.d.ts +9 -0
- package/dist/adapters/codexAdapter.d.ts.map +1 -0
- package/dist/adapters/codexAdapter.js +81 -0
- package/dist/adapters/codexAdapter.js.map +1 -0
- package/dist/api/backendClient.d.ts +9 -0
- package/dist/api/backendClient.d.ts.map +1 -0
- package/dist/api/backendClient.js +39 -0
- package/dist/api/backendClient.js.map +1 -0
- package/dist/cli.js +47 -98
- package/dist/cli.js.map +1 -1
- package/dist/notifications/backendNotifier.d.ts +12 -0
- package/dist/notifications/backendNotifier.d.ts.map +1 -0
- package/dist/notifications/backendNotifier.js +19 -0
- package/dist/notifications/backendNotifier.js.map +1 -0
- package/dist/notifications/firebaseNotifier.js +1 -1
- package/dist/notifications/firebaseNotifier.js.map +1 -1
- package/dist/qr/showSessionQr.d.ts +2 -0
- package/dist/qr/showSessionQr.d.ts.map +1 -0
- package/dist/qr/showSessionQr.js +64 -0
- package/dist/qr/showSessionQr.js.map +1 -0
- package/dist/runner/runSession.d.ts +2 -0
- package/dist/runner/runSession.d.ts.map +1 -1
- package/dist/runner/runSession.js +2 -2
- package/dist/runner/runSession.js.map +1 -1
- package/dist/runner/sessionState.d.ts +1 -1
- package/dist/runner/sessionState.d.ts.map +1 -1
- package/dist/runner/sessionState.js +2 -2
- package/dist/runner/sessionState.js.map +1 -1
- package/package.json +6 -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,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
|
|
8
|
-
const
|
|
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
|
|
22
|
-
|
|
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
|
-
// ──
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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 });
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
171
|
-
.
|
|
172
|
-
|
|
173
|
-
|
|
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":";;;AACA,yCAAoC;AACpC,oDAAiD;AACjD,4DAAyD;AACzD
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebaseNotifier.js","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":";;;AAAA,4CAAuF;AACvF,wDAAwD;AAGxD,4DAA4D;AAC5D,MAAM,wBAAwB,GAA4E;IACxG,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,MAAM;CACf,CAAC;AAEF,oEAAoE;AACpE,MAAM,6BAA6B,GAG/B;IACF,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,+BAA+B;AAC/B,MAAM,oBAAoB,GAGtB;IACF,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAcF,MAAa,gBAAgB;IAG3B,YAAY,MAA8B;QACxC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAEtC,sEAAsE;QACtE,IAAI,IAAA,aAAO,GAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,GACN,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ;gBACvC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC;gBACjD,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;YAE5B,IAAA,mBAAa,EAAC,EAAE,UAAU,EAAE,IAAA,UAAI,EAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA4B;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAY,GAAE,CAAC,IAAI,CAAC;gBAC1C,KAAK,EAAE,IAAI,CAAC,WAAW;gBACvB,YAAY,EAAE;oBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB;gBACD,OAAO,EAAE;oBACP,mDAAmD;oBACnD,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,CAAC;oBAC5C,YAAY,EAAE;wBACZ,mEAAmE;wBACnE,0CAA0C;wBAC1C,KAAK,EAAE,SAAS;wBAChB,QAAQ,EAAE,6BAA6B,CAAC,QAAQ,CAAC;wBACjD,YAAY,EAAE,IAAI;qBACnB;iBACF;gBACD,IAAI,EAAE;oBACJ,OAAO,EAAE;wBACP,GAAG,EAAE;4BACH,KAAK,EAAE,SAAS;4BAChB,iBAAiB,EAAE,oBAAoB,CAAC,QAAQ,CAAC;yBAClD;qBACF;iBACF;aACF,CAAC,CAAC;YACH,
|
|
1
|
+
{"version":3,"file":"firebaseNotifier.js","sourceRoot":"","sources":["../../src/notifications/firebaseNotifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
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;
|
|
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;
|
|
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.
|
|
3
|
+
"version": "0.1.3",
|
|
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
|
},
|