@masstensor/anotify 0.0.0-stage → 0.5.9
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/LICENSE +21 -0
- package/README.md +14 -2
- package/dist/src/adapters.js +97 -0
- package/dist/src/adapters.js.map +1 -0
- package/dist/src/claude-question-wait.js +67 -0
- package/dist/src/claude-question-wait.js.map +1 -0
- package/dist/src/claude-question.js +22 -0
- package/dist/src/claude-question.js.map +1 -0
- package/dist/src/claude.js +23 -0
- package/dist/src/claude.js.map +1 -0
- package/dist/src/cli.js +294 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/codex-readiness.js +37 -0
- package/dist/src/codex-readiness.js.map +1 -0
- package/dist/src/config.js +21 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/crypto.js +26 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/daemon.js +356 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/demand.js +89 -0
- package/dist/src/demand.js.map +1 -0
- package/dist/src/device-name.js +12 -0
- package/dist/src/device-name.js.map +1 -0
- package/dist/src/http.js +38 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/install.js +254 -0
- package/dist/src/install.js.map +1 -0
- package/dist/src/integration.js +184 -0
- package/dist/src/integration.js.map +1 -0
- package/dist/src/mcp.js +48 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/native-owner.js +44 -0
- package/dist/src/native-owner.js.map +1 -0
- package/dist/src/npm-cli.js +24 -0
- package/dist/src/npm-cli.js.map +1 -0
- package/dist/src/owners.js +57 -0
- package/dist/src/owners.js.map +1 -0
- package/dist/src/pairing-cli.js +125 -0
- package/dist/src/pairing-cli.js.map +1 -0
- package/dist/src/pairing.js +57 -0
- package/dist/src/pairing.js.map +1 -0
- package/dist/src/preferences.js +18 -0
- package/dist/src/preferences.js.map +1 -0
- package/dist/src/protocol.js +40 -0
- package/dist/src/protocol.js.map +1 -0
- package/dist/src/question-crypto.js +29 -0
- package/dist/src/question-crypto.js.map +1 -0
- package/dist/src/readiness.js +58 -0
- package/dist/src/readiness.js.map +1 -0
- package/dist/src/service.js +57 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/sessions.js +217 -0
- package/dist/src/sessions.js.map +1 -0
- package/dist/src/setup-cli.js +59 -0
- package/dist/src/setup-cli.js.map +1 -0
- package/dist/src/terminal.js +68 -0
- package/dist/src/terminal.js.map +1 -0
- package/dist/src/vault.js +49 -0
- package/dist/src/vault.js.map +1 -0
- package/dist/src/wizard.js +43 -0
- package/dist/src/wizard.js.map +1 -0
- package/npm-shrinkwrap.json +1919 -0
- package/package.json +26 -4
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { parse as parseToml } from 'smol-toml';
|
|
5
|
+
import { managedHookCommand } from './integration.js';
|
|
6
|
+
import { codexHooks } from './codex-readiness.js';
|
|
7
|
+
const binary = (host) => host === 'claude-code' ? 'claude' : host === 'gemini-cli' ? 'gemini' : 'codex';
|
|
8
|
+
export function classifyCodex(hooks, source, command) {
|
|
9
|
+
const own = hooks.filter(hook => hook.sourcePath === source && hook.handlerType === 'command' && hook.command === command);
|
|
10
|
+
if (!['sessionStart', 'sessionEnd', 'preToolUse', 'stop', 'permissionRequest'].every(event => own.some(hook => hook.eventName === event)))
|
|
11
|
+
return 'not_configured';
|
|
12
|
+
if (own.some(hook => !hook.enabled))
|
|
13
|
+
return 'disabled';
|
|
14
|
+
if (own.some(hook => hook.trustStatus !== 'trusted'))
|
|
15
|
+
return 'review_required';
|
|
16
|
+
return 'configured';
|
|
17
|
+
}
|
|
18
|
+
export async function inspectAgents(home, current, hosts, cwd) {
|
|
19
|
+
return Promise.all(hosts.map(async (host) => {
|
|
20
|
+
const found = spawnSync(binary(host), ['--version'], { encoding: 'utf8', timeout: 5000 });
|
|
21
|
+
if (found.status !== 0)
|
|
22
|
+
return { host, state: 'unavailable', hint: `Install ${binary(host)} before starting it.`, authentication: 'not_checked' };
|
|
23
|
+
let state = 'not_configured', hint = 'Run anotify setup to connect this agent.';
|
|
24
|
+
try {
|
|
25
|
+
const path = host === 'claude-code' ? join(home, '.claude', 'settings.json') : host === 'codex' ? join(home, '.codex', 'hooks.json') : join(home, '.gemini', 'settings.json');
|
|
26
|
+
if (existsSync(path)) {
|
|
27
|
+
const value = JSON.parse(readFileSync(path, 'utf8'));
|
|
28
|
+
const expected = managedHookCommand(join(dirname(current), 'state'), current + '/src/cli.js', host);
|
|
29
|
+
const handlers = Object.values(value.hooks ?? {}).flatMap(groups => groups.flatMap(group => group.hooks ?? [])).filter(handler => handler.command === expected);
|
|
30
|
+
const command = handlers[0]?.command;
|
|
31
|
+
if (host === 'codex' && command) {
|
|
32
|
+
const features = spawnSync('codex', ['features', 'list'], { cwd, encoding: 'utf8', timeout: 5000 });
|
|
33
|
+
const hookFeature = features.status === 0 ? features.stdout.match(/^hooks\s+\S+\s+(true|false)\s*$/m)?.[1] : undefined;
|
|
34
|
+
state = hookFeature === 'false' ? 'disabled' : hookFeature === 'true' ? classifyCodex(await codexHooks(cwd), path, command) : 'unknown';
|
|
35
|
+
}
|
|
36
|
+
else if (command) {
|
|
37
|
+
const required = host === 'claude-code' ? ['SessionStart', 'SessionEnd', 'PreToolUse', 'Stop', 'Notification'] : ['SessionStart', 'SessionEnd', 'BeforeAgent', 'BeforeTool', 'AfterAgent', 'Notification'];
|
|
38
|
+
state = required.every(event => (value.hooks?.[event] ?? []).some(group => (event !== 'Notification' || group.matcher === (host === 'claude-code' ? 'permission_prompt' : 'ToolPermission')) && group.hooks?.some(handler => handler.command === command))) ? 'configured' : 'not_configured';
|
|
39
|
+
if (value.disableAllHooks || value.hooksConfig?.enabled === false || handlers.some(handler => handler.name && value.hooksConfig?.disabled?.includes(handler.name)))
|
|
40
|
+
state = 'disabled';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (state === 'configured') {
|
|
44
|
+
const mcp = host === 'codex' ? parseToml(readFileSync(join(home, '.codex', 'config.toml'), 'utf8')).mcp_servers?.agent_notify : (JSON.parse(readFileSync(host === 'claude-code' ? join(home, '.claude.json') : join(home, '.gemini', 'settings.json'), 'utf8')).mcpServers?.agent_notify);
|
|
45
|
+
const server = mcp;
|
|
46
|
+
if (!server || server.command !== process.execPath || JSON.stringify(server.args) !== JSON.stringify([current + '/src/cli.js', 'installed-mcp', host]) || server.env?.AGENT_NOTIFY_HOME !== join(dirname(current), 'state') || (host === 'codex' && !server.env_vars?.includes('AGENT_NOTIFY_INSTANCE')))
|
|
47
|
+
state = 'not_configured';
|
|
48
|
+
}
|
|
49
|
+
hint = state === 'configured' ? `Configured for direct ${binary(host)} sessions. Model login and actual delivery are not checked.` : state === 'review_required' ? 'Open Codex /hooks and trust only the Agent Notify entries.' : state === 'disabled' ? `Review ${binary(host)} hook settings; Agent Notify will not override your disabled hooks.` : state === 'unknown' ? 'Could not verify the agent hook configuration.' : hint;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
state = 'unknown';
|
|
53
|
+
hint = 'Could not inspect this host safely. Review its hook settings manually.';
|
|
54
|
+
}
|
|
55
|
+
return { host, state, version: found.stdout.trim().split('\n')[0]?.slice(0, 120), hint, authentication: 'not_checked' };
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { DatabaseSync, backup } from 'node:sqlite';
|
|
2
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/** SQLite's OS lock is released on crashes; no PID reuse or stale lock-file guessing. */
|
|
5
|
+
export function serviceLease(dir) {
|
|
6
|
+
const db = new DatabaseSync(join(dir, 'service-lock.sqlite'));
|
|
7
|
+
try {
|
|
8
|
+
db.exec('PRAGMA busy_timeout=0; BEGIN EXCLUSIVE');
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
db.close();
|
|
12
|
+
throw Error('A notification service already owns this state directory');
|
|
13
|
+
}
|
|
14
|
+
return db;
|
|
15
|
+
}
|
|
16
|
+
export async function migrateState(source, target) {
|
|
17
|
+
if (source.dir === target.dir)
|
|
18
|
+
return;
|
|
19
|
+
const sender = source.load('sender');
|
|
20
|
+
if (existsSync(join(target.dir, 'local.sqlite')) || target.load('sender')) {
|
|
21
|
+
if (sender && JSON.stringify(sender) === JSON.stringify(target.load('sender')))
|
|
22
|
+
return;
|
|
23
|
+
throw Error('Destination already contains state; refusing to overwrite pairing or history');
|
|
24
|
+
}
|
|
25
|
+
if (existsSync(join(source.dir, 'local.sqlite'))) {
|
|
26
|
+
const db = new DatabaseSync(join(source.dir, 'local.sqlite'), { readOnly: true });
|
|
27
|
+
try {
|
|
28
|
+
if (db.prepare('SELECT COUNT(*) AS n FROM clients WHERE closed=0').get().n !== 0)
|
|
29
|
+
throw Error('Finish registered sessions before migrating their state');
|
|
30
|
+
await backup(db, join(target.dir, 'local.sqlite'));
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
db.close();
|
|
34
|
+
}
|
|
35
|
+
const copied = new DatabaseSync(join(target.dir, 'local.sqlite'));
|
|
36
|
+
try {
|
|
37
|
+
copied.exec('BEGIN IMMEDIATE');
|
|
38
|
+
for (const row of copied.prepare('SELECT key,envelope FROM events').all())
|
|
39
|
+
copied.prepare('UPDATE events SET envelope=? WHERE key=?').run(target.encrypt(source.decrypt(row.envelope)), row.key);
|
|
40
|
+
if (copied.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='session_projects'").get())
|
|
41
|
+
for (const row of copied.prepare('SELECT host,session,value FROM session_projects').all())
|
|
42
|
+
copied.prepare('UPDATE session_projects SET value=? WHERE host=? AND session=?').run(target.encrypt(source.decrypt(String(row.value))), String(row.host), String(row.session));
|
|
43
|
+
copied.exec('COMMIT');
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
copied.exec('ROLLBACK');
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
copied.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const name of readdirSync(source.dir))
|
|
54
|
+
if (name.endsWith('.sealed') && name !== 'connection.sealed' && !name.includes('/'))
|
|
55
|
+
target.save(name.slice(0, -7), source.load(name.slice(0, -7)));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { hash } from './protocol.js';
|
|
3
|
+
import { HttpError } from './http.js';
|
|
4
|
+
import { recordOwners, reconcileClients, attachAgent, ownersTable } from './owners.js';
|
|
5
|
+
import { readPreferences } from './preferences.js';
|
|
6
|
+
/** Native session policy is durable; client identity exists only for explicit lifecycle handoffs. */
|
|
7
|
+
export class Sessions {
|
|
8
|
+
db;
|
|
9
|
+
constructor(db) {
|
|
10
|
+
this.db = db;
|
|
11
|
+
db.exec(`
|
|
12
|
+
CREATE TABLE IF NOT EXISTS policies(host TEXT,session TEXT,mode TEXT,PRIMARY KEY(host,session));
|
|
13
|
+
CREATE TABLE IF NOT EXISTS armed(host TEXT,session TEXT,turn TEXT,PRIMARY KEY(host,session));
|
|
14
|
+
CREATE TABLE IF NOT EXISTS clients(id TEXT PRIMARY KEY,host TEXT NOT NULL,current TEXT,closed INTEGER NOT NULL DEFAULT 0);
|
|
15
|
+
CREATE TABLE IF NOT EXISTS direct_clients(host TEXT NOT NULL,session TEXT NOT NULL,client TEXT NOT NULL,PRIMARY KEY(host,session));
|
|
16
|
+
CREATE TABLE IF NOT EXISTS direct_lineage(host TEXT NOT NULL,pid INTEGER NOT NULL,born TEXT NOT NULL,session TEXT NOT NULL,ambiguous INTEGER NOT NULL DEFAULT 0,PRIMARY KEY(host,pid,born));
|
|
17
|
+
CREATE TABLE IF NOT EXISTS client_sessions(client TEXT,session TEXT,source TEXT,end_reason TEXT,PRIMARY KEY(client,session));
|
|
18
|
+
CREATE TABLE IF NOT EXISTS gemini_attempts(id TEXT PRIMARY KEY,client TEXT NOT NULL,session TEXT NOT NULL,started INTEGER NOT NULL,prompt_hash TEXT NOT NULL,ended INTEGER,root TEXT,UNIQUE(client,session,started));
|
|
19
|
+
CREATE TABLE IF NOT EXISTS gemini_ends(client TEXT,session TEXT,at INTEGER,retry INTEGER,root TEXT NOT NULL,PRIMARY KEY(client,session,at));
|
|
20
|
+
CREATE TABLE IF NOT EXISTS gemini_tools(client TEXT,session TEXT,at INTEGER,signature TEXT,capability TEXT NOT NULL,PRIMARY KEY(client,session,at,signature));
|
|
21
|
+
`);
|
|
22
|
+
ownersTable(db);
|
|
23
|
+
}
|
|
24
|
+
open(host, owner) {
|
|
25
|
+
reconcileClients(this.db);
|
|
26
|
+
const id = randomUUID();
|
|
27
|
+
this.db.prepare('INSERT INTO clients(id,host) VALUES(?,?)').run(id, host);
|
|
28
|
+
if (owner)
|
|
29
|
+
recordOwners(this.db, id, owner);
|
|
30
|
+
return id;
|
|
31
|
+
}
|
|
32
|
+
direct(host, session, event, source, owner) {
|
|
33
|
+
const record = this.db.prepare('SELECT d.client,c.closed FROM direct_clients d JOIN clients c ON c.id=d.client WHERE d.host=? AND d.session=?').get(host, session);
|
|
34
|
+
const lineage = owner ? this.db.prepare('SELECT session,ambiguous FROM direct_lineage WHERE host=? AND pid=? AND born=?').get(host, owner.pid, owner.start) : undefined;
|
|
35
|
+
const fresh = !record;
|
|
36
|
+
if (owner) {
|
|
37
|
+
if (!lineage)
|
|
38
|
+
this.db.prepare('INSERT INTO direct_lineage(host,pid,born,session) VALUES(?,?,?,?)').run(host, owner.pid, owner.start, session);
|
|
39
|
+
else if (lineage.session !== session) {
|
|
40
|
+
if (fresh && event === 'SessionStart' && ['clear', 'resume'].includes(source ?? ''))
|
|
41
|
+
this.db.prepare('UPDATE direct_lineage SET session=? WHERE host=? AND pid=? AND born=?').run(session, host, owner.pid, owner.start);
|
|
42
|
+
else if ((event === 'SessionStart' && (fresh || source === 'resume')) || (!record && event !== 'SessionEnd'))
|
|
43
|
+
this.db.prepare('UPDATE direct_lineage SET ambiguous=1 WHERE host=? AND pid=? AND born=?').run(host, owner.pid, owner.start);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (record && !record.closed)
|
|
47
|
+
return String(record.client);
|
|
48
|
+
if (record && event !== 'SessionStart')
|
|
49
|
+
return;
|
|
50
|
+
if (!record && event === 'SessionEnd')
|
|
51
|
+
return;
|
|
52
|
+
const id = this.open(host);
|
|
53
|
+
this.db.prepare('INSERT OR REPLACE INTO direct_clients VALUES(?,?,?)').run(host, session, id);
|
|
54
|
+
this.start(id, host, session, 'startup');
|
|
55
|
+
if (event === 'SessionStart' && source === 'clear') {
|
|
56
|
+
if (lineage && !lineage.ambiguous && lineage.session !== session) {
|
|
57
|
+
const prior = this.db.prepare('SELECT mode FROM policies WHERE host=? AND session=?').get(host, String(lineage.session));
|
|
58
|
+
if (prior)
|
|
59
|
+
this.db.prepare('INSERT OR IGNORE INTO policies VALUES(?,?,?)').run(host, session, prior.mode === 'spent' ? 'off' : String(prior.mode));
|
|
60
|
+
}
|
|
61
|
+
else
|
|
62
|
+
this.db.prepare('INSERT OR IGNORE INTO policies VALUES(?,?,?)').run(host, session, 'off');
|
|
63
|
+
}
|
|
64
|
+
return id;
|
|
65
|
+
}
|
|
66
|
+
client(id, host) {
|
|
67
|
+
const row = this.db.prepare('SELECT * FROM clients WHERE id=?').get(id);
|
|
68
|
+
if (!row || row.host !== host)
|
|
69
|
+
throw new HttpError(409, 'Unregistered client or mismatched host');
|
|
70
|
+
if (row.closed)
|
|
71
|
+
throw new HttpError(409, 'Client is closed; launch a new registered instance');
|
|
72
|
+
return row;
|
|
73
|
+
}
|
|
74
|
+
attachOwner(id, owner) { if (!this.db.prepare('SELECT 1 FROM clients WHERE id=? AND closed=0').get(id))
|
|
75
|
+
throw new HttpError(409, 'Client is closed'); attachAgent(this.db, id, owner); }
|
|
76
|
+
reconcile() { return reconcileClients(this.db); }
|
|
77
|
+
close(id) { this.db.prepare('UPDATE clients SET closed=1 WHERE id=?').run(id); }
|
|
78
|
+
assertSession(id, host, session) {
|
|
79
|
+
this.client(id, host);
|
|
80
|
+
if (!this.db.prepare('SELECT 1 FROM client_sessions WHERE client=? AND session=?').get(id, session))
|
|
81
|
+
throw new HttpError(409, 'Session is not registered to this client');
|
|
82
|
+
}
|
|
83
|
+
start(id, host, session, source) {
|
|
84
|
+
const client = this.client(id, host);
|
|
85
|
+
if (!['startup', 'resume', 'clear', 'compact', 'fork'].includes(source))
|
|
86
|
+
throw new HttpError(400, 'Unsupported session start source');
|
|
87
|
+
// Replayed startup/clear events never rewind the client's current session or recopy policy.
|
|
88
|
+
if (this.db.prepare('SELECT 1 FROM client_sessions WHERE client=? AND session=?').get(id, session))
|
|
89
|
+
return { status: 'duplicate' };
|
|
90
|
+
if (source === 'clear' && !client.current)
|
|
91
|
+
throw new HttpError(409, 'Clear predecessor is unknown; policy was not reset');
|
|
92
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
93
|
+
try {
|
|
94
|
+
if (source === 'clear' && this.db.prepare('SELECT 1 FROM policies WHERE host=? AND session=?').get(host, client.current)) {
|
|
95
|
+
const previous = this.mode(host, client.current);
|
|
96
|
+
const inherited = previous === 'spent' ? 'off' : previous;
|
|
97
|
+
// A restored destination already has its own policy; never overwrite another client's setting.
|
|
98
|
+
this.db.prepare('INSERT OR IGNORE INTO policies VALUES(?,?,?)').run(host, session, inherited);
|
|
99
|
+
}
|
|
100
|
+
this.db.prepare('INSERT INTO client_sessions(client,session,source) VALUES(?,?,?)').run(id, session, source);
|
|
101
|
+
this.db.prepare('UPDATE clients SET current=? WHERE id=?').run(session, id);
|
|
102
|
+
this.db.exec('COMMIT');
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.db.exec('ROLLBACK');
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
return { status: source === 'clear' ? 'inherited' : 'registered', mode: this.mode(host, session) };
|
|
109
|
+
}
|
|
110
|
+
end(id, host, session, reason) {
|
|
111
|
+
this.assertSession(id, host, session);
|
|
112
|
+
// Keep the predecessor until SessionStart(clear), even if SessionEnd arrived first.
|
|
113
|
+
// A late end for an old session cannot erase or replace the client's current mapping.
|
|
114
|
+
this.db.prepare('UPDATE client_sessions SET end_reason=? WHERE client=? AND session=?').run(reason, id, session);
|
|
115
|
+
}
|
|
116
|
+
mode(host, session) {
|
|
117
|
+
return (this.db.prepare('SELECT mode FROM policies WHERE host=? AND session=?').get(host, session)?.mode ?? readPreferences(this.db).defaultMode);
|
|
118
|
+
}
|
|
119
|
+
policy(host, session, mode, armedTurn) {
|
|
120
|
+
this.db.prepare('INSERT OR REPLACE INTO policies VALUES(?,?,?)').run(host, session, mode);
|
|
121
|
+
this.db.prepare('DELETE FROM armed WHERE host=? AND session=?').run(host, session);
|
|
122
|
+
if (mode === 'once' && armedTurn)
|
|
123
|
+
this.db.prepare('INSERT INTO armed VALUES(?,?,?)').run(host, session, armedTurn);
|
|
124
|
+
}
|
|
125
|
+
spent(host, session) { this.db.prepare('INSERT OR REPLACE INTO policies VALUES(?,?,?)').run(host, session, 'spent'); }
|
|
126
|
+
canonical(host, session, turn) {
|
|
127
|
+
if (host !== 'gemini-cli')
|
|
128
|
+
return turn;
|
|
129
|
+
return this.db.prepare('SELECT root FROM gemini_attempts WHERE id=? AND session=?').get(turn, session)?.root ?? turn;
|
|
130
|
+
}
|
|
131
|
+
timestamp(value) {
|
|
132
|
+
const at = Date.parse(value);
|
|
133
|
+
if (!Number.isSafeInteger(at))
|
|
134
|
+
throw new HttpError(400, 'Missing valid Gemini hook timestamp');
|
|
135
|
+
return at;
|
|
136
|
+
}
|
|
137
|
+
begin(id, session, timestamp, prompt) {
|
|
138
|
+
this.assertSession(id, 'gemini-cli', session);
|
|
139
|
+
if (this.client(id, 'gemini-cli').current !== session)
|
|
140
|
+
throw new HttpError(409, 'Gemini hook is not for the current session');
|
|
141
|
+
const at = this.timestamp(timestamp);
|
|
142
|
+
const existing = this.db.prepare('SELECT * FROM gemini_attempts WHERE client=? AND session=? AND started=?').get(id, session, at);
|
|
143
|
+
if (existing) {
|
|
144
|
+
if (existing.prompt_hash !== hash(prompt))
|
|
145
|
+
throw new HttpError(409, 'Conflicting Gemini start event');
|
|
146
|
+
return existing.id;
|
|
147
|
+
}
|
|
148
|
+
const previous = this.latest(id, session);
|
|
149
|
+
if (previous && (at <= previous.started || (previous.ended !== null && at <= previous.ended)))
|
|
150
|
+
throw new HttpError(409, 'Out-of-order Gemini begin event');
|
|
151
|
+
const turn = randomUUID();
|
|
152
|
+
this.db.prepare('INSERT INTO gemini_attempts(id,client,session,started,prompt_hash) VALUES(?,?,?,?,?)').run(turn, id, session, at, hash(prompt));
|
|
153
|
+
return turn;
|
|
154
|
+
}
|
|
155
|
+
latest(id, session) {
|
|
156
|
+
return this.db.prepare('SELECT * FROM gemini_attempts WHERE client=? AND session=? ORDER BY started DESC LIMIT 1').get(id, session);
|
|
157
|
+
}
|
|
158
|
+
currentTurn(id, session, timestamp) {
|
|
159
|
+
this.assertSession(id, 'gemini-cli', session);
|
|
160
|
+
if (this.client(id, 'gemini-cli').current !== session)
|
|
161
|
+
throw new HttpError(409, 'Gemini hook is not for the current session');
|
|
162
|
+
const latest = this.latest(id, session);
|
|
163
|
+
if (!latest)
|
|
164
|
+
throw new HttpError(409, 'Gemini BeforeAgent context is missing');
|
|
165
|
+
if (timestamp && (this.timestamp(timestamp) < latest.started || latest.ended !== null))
|
|
166
|
+
throw new HttpError(409, 'Out-of-order Gemini tool event');
|
|
167
|
+
return latest.id;
|
|
168
|
+
}
|
|
169
|
+
async toolCapability(id, session, timestamp, signature, create) {
|
|
170
|
+
const at = this.timestamp(timestamp);
|
|
171
|
+
// Validate the current attempt even when this is a duplicate of an old tool hook.
|
|
172
|
+
this.currentTurn(id, session, timestamp);
|
|
173
|
+
const old = this.db.prepare('SELECT capability FROM gemini_tools WHERE client=? AND session=? AND at=? AND signature=?').get(id, session, at, signature);
|
|
174
|
+
if (old)
|
|
175
|
+
return old.capability;
|
|
176
|
+
const capability = await create();
|
|
177
|
+
this.db.prepare('INSERT INTO gemini_tools VALUES(?,?,?,?,?)').run(id, session, at, signature, capability);
|
|
178
|
+
return capability;
|
|
179
|
+
}
|
|
180
|
+
latestEnding(id, session, timestamp, root) {
|
|
181
|
+
const row = this.db.prepare('SELECT MAX(at) AS at FROM gemini_ends WHERE client=? AND session=? AND root=?').get(id, session, root);
|
|
182
|
+
return row?.at === this.timestamp(timestamp);
|
|
183
|
+
}
|
|
184
|
+
finish(id, session, timestamp, retry) {
|
|
185
|
+
this.assertSession(id, 'gemini-cli', session);
|
|
186
|
+
const at = this.timestamp(timestamp);
|
|
187
|
+
const existing = this.db.prepare('SELECT * FROM gemini_ends WHERE client=? AND session=? AND at=?').get(id, session, at);
|
|
188
|
+
if (existing) {
|
|
189
|
+
if (existing.retry !== Number(retry))
|
|
190
|
+
throw new HttpError(409, 'Conflicting Gemini end event');
|
|
191
|
+
return existing.root;
|
|
192
|
+
}
|
|
193
|
+
const turn = this.currentTurn(id, session);
|
|
194
|
+
const attempt = this.latest(id, session);
|
|
195
|
+
if (at < attempt.started || attempt.ended !== null)
|
|
196
|
+
throw new HttpError(409, 'Out-of-order Gemini end event');
|
|
197
|
+
let root = turn;
|
|
198
|
+
if (retry) {
|
|
199
|
+
const previous = this.db.prepare('SELECT * FROM gemini_attempts WHERE client=? AND session=? AND started<? ORDER BY started DESC LIMIT 1').get(id, session, attempt.started);
|
|
200
|
+
if (!previous?.root || previous.ended === null || previous.ended >= attempt.started)
|
|
201
|
+
throw new HttpError(409, 'Retry has no verified prior ending');
|
|
202
|
+
root = previous.root;
|
|
203
|
+
}
|
|
204
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
205
|
+
try {
|
|
206
|
+
this.db.prepare('UPDATE gemini_attempts SET ended=?,root=? WHERE id=?').run(at, root, turn);
|
|
207
|
+
this.db.prepare('INSERT INTO gemini_ends VALUES(?,?,?,?,?)').run(id, session, at, Number(retry), root);
|
|
208
|
+
this.db.exec('COMMIT');
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
this.db.exec('ROLLBACK');
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
return root;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { install, layout } from './install.js';
|
|
2
|
+
import { loadPreferences } from './preferences.js';
|
|
3
|
+
import { collectSetup } from './wizard.js';
|
|
4
|
+
import { terminal } from './terminal.js';
|
|
5
|
+
import { hostSchema } from './protocol.js';
|
|
6
|
+
export async function setupCLI(args, provided) {
|
|
7
|
+
let yes = false, migrateFrom;
|
|
8
|
+
let preferences = loadPreferences(layout().state);
|
|
9
|
+
for (let i = 0; i < args.length; i++) {
|
|
10
|
+
const arg = args[i];
|
|
11
|
+
if (arg === '--yes')
|
|
12
|
+
yes = true;
|
|
13
|
+
else if (arg === '--migrate-from') {
|
|
14
|
+
migrateFrom = args[++i];
|
|
15
|
+
if (!migrateFrom)
|
|
16
|
+
throw Error('Missing migration directory');
|
|
17
|
+
}
|
|
18
|
+
else if (arg === '--notifications') {
|
|
19
|
+
const mode = args[++i];
|
|
20
|
+
if (!['on', 'off'].includes(mode ?? ''))
|
|
21
|
+
throw Error('Use --notifications on|off');
|
|
22
|
+
preferences = { ...preferences, defaultMode: mode === 'on' ? 'all' : 'off' };
|
|
23
|
+
}
|
|
24
|
+
else if (arg === '--permission-alerts') {
|
|
25
|
+
const value = args[++i];
|
|
26
|
+
if (!['on', 'off'].includes(value ?? ''))
|
|
27
|
+
throw Error('Use --permission-alerts on|off');
|
|
28
|
+
preferences = { ...preferences, permissionAlerts: value === 'on' };
|
|
29
|
+
}
|
|
30
|
+
else if (arg === '--hosts') {
|
|
31
|
+
const value = args[++i];
|
|
32
|
+
if (!value)
|
|
33
|
+
throw Error('Use --hosts claude,codex,gemini');
|
|
34
|
+
preferences = { ...preferences, hosts: value.split(',').map(host => hostSchema.parse(host === 'claude' ? 'claude-code' : host === 'gemini' ? 'gemini-cli' : host)) };
|
|
35
|
+
}
|
|
36
|
+
else
|
|
37
|
+
throw Error('Usage: install|setup [--yes] [--notifications on|off] [--permission-alerts on|off] [--hosts claude,codex,gemini] [--migrate-from <directory>]');
|
|
38
|
+
}
|
|
39
|
+
if (!yes && !provided && (!process.stdin.isTTY || !process.stdout.isTTY))
|
|
40
|
+
throw Error('Setup needs a terminal. For automation use --yes and optional --notifications/--hosts. Nothing was installed.');
|
|
41
|
+
const own = !yes && !provided ? terminal() : undefined;
|
|
42
|
+
const io = provided ?? own;
|
|
43
|
+
try {
|
|
44
|
+
const selected = yes ? preferences : await collectSetup(io, preferences);
|
|
45
|
+
if (!selected) {
|
|
46
|
+
io.write('Setup cancelled. No installation changes were made.');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const result = await install({ preferences: selected, migrateFrom });
|
|
50
|
+
(io?.write ?? console.log)(`\nAgent Notify installed.\nCommand: ${result.command}\nDefault notifications: ${selected.defaultMode === 'all' ? 'on' : 'off'}\nAgents: ${selected.hosts.join(', ')}\nPairing: ${result.paired ? 'preserved' : 'not connected'}\nNo login background service.\nReview the new Hook/MCP entries in your agents. Codex: /hooks.\nStart your agent normally.\nManage later: anotify\nDiagnose: anotify doctor`);
|
|
51
|
+
(io?.write ?? console.log)('On iPhone, choose Show message previews in Settings. Decryption stays on your phone; iOS lock-screen settings still apply.');
|
|
52
|
+
if (!result.paired)
|
|
53
|
+
(io?.write ?? console.log)('Next: run anotify pair on Mac, scan its QR in the iPhone app, and compare all 8 digits on both screens.');
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
own?.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=setup-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../../src/setup-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
export function terminal() { const reader = createInterface({ input: process.stdin, output: process.stdout }); return { ask: (question) => reader.question(question), write: (text) => console.log(text), close: () => reader.close() }; }
|
|
3
|
+
export const HELP = `Agent Notify — encrypted notifications for coding agents
|
|
4
|
+
|
|
5
|
+
anotify Open the interactive management menu
|
|
6
|
+
anotify setup Choose notification defaults and connected agents
|
|
7
|
+
anotify status [--json] Show installation, pairing and notification state
|
|
8
|
+
anotify pair [--relay URL] Show a QR code and compare codes on your iPhone
|
|
9
|
+
anotify pair --cancel Discard an unfinished pairing; keep existing phone
|
|
10
|
+
anotify test Send an explicit encrypted test notification
|
|
11
|
+
anotify deliveries [--json] Show recent delivery states and retry queued messages
|
|
12
|
+
anotify notifications on|off Set the default for sessions without an override
|
|
13
|
+
anotify permission-alerts on|off Enable/disable permission attention alerts
|
|
14
|
+
anotify pause | resume Pause/resume all automatic notifications
|
|
15
|
+
anotify sessions List registered sessions
|
|
16
|
+
anotify session <id> on|off|once
|
|
17
|
+
Change one listed session, including its current task
|
|
18
|
+
anotify doctor [--json] Diagnose configuration and Hook trust
|
|
19
|
+
anotify claude|codex|gemini Start a connected agent
|
|
20
|
+
anotify stop | restart Stop/restart the temporary local helper
|
|
21
|
+
anotify uninstall Remove owned integrations; keep encrypted pairing
|
|
22
|
+
|
|
23
|
+
The helper starts on demand and exits when idle. Start your agent normally after reviewing its hooks.
|
|
24
|
+
Model login and phone display are separate from installation readiness.`;
|
|
25
|
+
export async function menu(io, run) {
|
|
26
|
+
while (true) {
|
|
27
|
+
io.write('\nAgent Notify\n1 Status\n2 Notification settings\n3 Pair iPhone\n4 Send a test\n5 Setup wizard\n6 Diagnose\n7 Stop local helper\n8 Uninstall\n9 Recent deliveries and retry\n0 Exit');
|
|
28
|
+
const answer = (await io.ask('Choose: ')).trim();
|
|
29
|
+
if (answer === '0' || !answer)
|
|
30
|
+
return;
|
|
31
|
+
const commands = { '1': ['status'], '3': ['pair'], '4': ['test'], '5': ['setup'], '6': ['doctor'], '7': ['stop'], '9': ['deliveries'] };
|
|
32
|
+
try {
|
|
33
|
+
if (commands[answer])
|
|
34
|
+
await run(commands[answer]);
|
|
35
|
+
else if (answer === '2') {
|
|
36
|
+
io.write('1 Default on\n2 Enable per session\n3 Pause automatic notifications\n4 Resume\n5 Manage a session\n6 Enable permission alerts\n7 Disable permission alerts\n0 Back');
|
|
37
|
+
const value = (await io.ask('Choose: ')).trim();
|
|
38
|
+
const actions = { '1': ['notifications', 'on'], '2': ['notifications', 'off'], '3': ['pause'], '4': ['resume'], '5': ['sessions', '--select'], '6': ['permission-alerts', 'on'], '7': ['permission-alerts', 'off'] };
|
|
39
|
+
if (actions[value])
|
|
40
|
+
await run(actions[value]);
|
|
41
|
+
}
|
|
42
|
+
else if (answer === '8') {
|
|
43
|
+
if ((await io.ask('Remove Agent Notify integrations and command? Pairing is kept. [y/N]: ')).trim().toLowerCase() === 'y') {
|
|
44
|
+
await run(['uninstall']);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else
|
|
49
|
+
io.write('Choose a listed number.');
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
io.write('Could not complete: ' + (error instanceof Error ? error.message : 'Unknown error'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function formatStatus(input) {
|
|
57
|
+
const status = input;
|
|
58
|
+
return [
|
|
59
|
+
'Agent Notify', `Installed: ${status.installed ? 'yes' : 'no'}`, `iPhone: ${status.paired ? 'paired' : 'not paired'}`,
|
|
60
|
+
`Automatic notifications: ${status.preferences?.paused ? 'paused' : status.preferences?.defaultMode === 'off' ? 'enable per session' : 'on by default'}`,
|
|
61
|
+
`Permission alerts: ${status.preferences?.permissionAlerts ? 'on' : 'off'}`,
|
|
62
|
+
`Agents: ${status.preferences?.hosts.join(', ') ?? 'not configured'}`,
|
|
63
|
+
`Local helper: ${status.running ? 'running temporarily' : 'asleep (normal; starts on demand)'}`,
|
|
64
|
+
`Registered sessions: ${status.activeClients ?? 0} · Queued: ${status.queued ?? 0}`,
|
|
65
|
+
'For host configuration/trust checks: anotify doctor'
|
|
66
|
+
].join('\n');
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=terminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../src/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createCipheriv, createDecipheriv, randomBytes, randomUUID } from 'node:crypto';
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, chmodSync, renameSync, rmSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { hash } from './protocol.js';
|
|
6
|
+
export class Vault {
|
|
7
|
+
dir;
|
|
8
|
+
key;
|
|
9
|
+
constructor(dir, options = {}) {
|
|
10
|
+
this.dir = dir;
|
|
11
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
12
|
+
chmodSync(dir, 0o700);
|
|
13
|
+
if (options.key) {
|
|
14
|
+
this.key = options.key;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (options.developmentFileKey) {
|
|
18
|
+
const file = join(dir, 'development-master.key');
|
|
19
|
+
if (!existsSync(file))
|
|
20
|
+
writeFileSync(file, randomBytes(32), { mode: 0o600 });
|
|
21
|
+
this.key = readFileSync(file);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (process.platform !== 'darwin')
|
|
25
|
+
throw new Error('Default secret storage requires macOS Keychain');
|
|
26
|
+
const account = hash(dir).slice(0, 32);
|
|
27
|
+
let stored;
|
|
28
|
+
try {
|
|
29
|
+
stored = execFileSync('/usr/bin/security', ['find-generic-password', '-s', 'app.agentnotify.v1', '-a', account, '-w'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
stored = randomBytes(32).toString('base64url');
|
|
33
|
+
execFileSync('/usr/bin/security', ['add-generic-password', '-s', 'app.agentnotify.v1', '-a', account, '-w', stored], { stdio: 'ignore' });
|
|
34
|
+
}
|
|
35
|
+
this.key = Buffer.from(stored, 'base64url');
|
|
36
|
+
}
|
|
37
|
+
encrypt(value) { const iv = randomBytes(12); const cipher = createCipheriv('aes-256-gcm', this.key, iv); cipher.setAAD(Buffer.from('AgentNotify/local/v1')); const data = Buffer.concat([cipher.update(JSON.stringify(value)), cipher.final()]); return Buffer.concat([iv, cipher.getAuthTag(), data]).toString('base64url'); }
|
|
38
|
+
decrypt(text) { const b = Buffer.from(text, 'base64url'); const decipher = createDecipheriv('aes-256-gcm', this.key, b.subarray(0, 12)); decipher.setAAD(Buffer.from('AgentNotify/local/v1')); decipher.setAuthTag(b.subarray(12, 28)); return JSON.parse(Buffer.concat([decipher.update(b.subarray(28)), decipher.final()]).toString()); }
|
|
39
|
+
save(name, value) { if (!/^[a-zA-Z0-9_-]+$/.test(name))
|
|
40
|
+
throw Error('Invalid vault entry'); const path = join(this.dir, name + '.sealed'), temporary = path + '.' + randomUUID(); try {
|
|
41
|
+
writeFileSync(temporary, this.encrypt(value), { mode: 0o600, flag: 'wx' });
|
|
42
|
+
renameSync(temporary, path);
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
rmSync(temporary, { force: true });
|
|
46
|
+
} }
|
|
47
|
+
load(name) { const p = join(this.dir, name + '.sealed'); return existsSync(p) ? this.decrypt(readFileSync(p, 'utf8')) : undefined; }
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/vault.ts"],"names":[],"mappings":"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"}
|