aibroker 0.60.2 → 0.61.1
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/README.md +21 -33
- package/dist/adapters/iterm/core.d.ts +4 -0
- package/dist/adapters/iterm/core.d.ts.map +1 -1
- package/dist/adapters/iterm/core.js +16 -0
- package/dist/adapters/iterm/core.js.map +1 -1
- package/dist/adapters/iterm/dictation.d.ts +1 -1
- package/dist/adapters/iterm/dictation.d.ts.map +1 -1
- package/dist/adapters/iterm/dictation.js +5 -6
- package/dist/adapters/iterm/dictation.js.map +1 -1
- package/dist/adapters/iterm/sessions.d.ts.map +1 -1
- package/dist/adapters/iterm/sessions.js +11 -0
- package/dist/adapters/iterm/sessions.js.map +1 -1
- package/dist/adapters/kokoro/media.d.ts +1 -1
- package/dist/adapters/kokoro/media.d.ts.map +1 -1
- package/dist/adapters/kokoro/media.js +4 -3
- package/dist/adapters/kokoro/media.js.map +1 -1
- package/dist/adapters/kokoro/tts.d.ts +1 -1
- package/dist/adapters/kokoro/tts.d.ts.map +1 -1
- package/dist/adapters/kokoro/tts.js +15 -3
- package/dist/adapters/kokoro/tts.js.map +1 -1
- package/dist/adapters/pailot/gateway.d.ts.map +1 -1
- package/dist/adapters/pailot/gateway.js +7 -5
- package/dist/adapters/pailot/gateway.js.map +1 -1
- package/dist/backend/api.d.ts.map +1 -1
- package/dist/backend/api.js +2 -1
- package/dist/backend/api.js.map +1 -1
- package/dist/core/bins.d.ts +25 -0
- package/dist/core/bins.d.ts.map +1 -0
- package/dist/core/bins.js +59 -0
- package/dist/core/bins.js.map +1 -0
- package/dist/core/env-bootstrap.js +2 -7
- package/dist/core/env-bootstrap.js.map +1 -1
- package/dist/core/log.d.ts +2 -0
- package/dist/core/log.d.ts.map +1 -1
- package/dist/core/log.js +7 -0
- package/dist/core/log.js.map +1 -1
- package/dist/core/private-file.d.ts +10 -0
- package/dist/core/private-file.d.ts.map +1 -0
- package/dist/core/private-file.js +30 -0
- package/dist/core/private-file.js.map +1 -0
- package/dist/core/service-env.d.ts +10 -0
- package/dist/core/service-env.d.ts.map +1 -0
- package/dist/core/service-env.js +18 -0
- package/dist/core/service-env.js.map +1 -0
- package/dist/core/session-discovery.d.ts +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +1 -1
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/daemon/audit.d.ts.map +1 -1
- package/dist/daemon/audit.js +4 -3
- package/dist/daemon/audit.js.map +1 -1
- package/dist/daemon/cli.d.ts +3 -1
- package/dist/daemon/cli.d.ts.map +1 -1
- package/dist/daemon/cli.js +43 -48
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +6 -2
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/daemon-control.d.ts +51 -0
- package/dist/daemon/daemon-control.d.ts.map +1 -0
- package/dist/daemon/daemon-control.js +182 -0
- package/dist/daemon/daemon-control.js.map +1 -0
- package/dist/daemon/doctor.d.ts +21 -0
- package/dist/daemon/doctor.d.ts.map +1 -0
- package/dist/daemon/doctor.js +134 -0
- package/dist/daemon/doctor.js.map +1 -0
- package/dist/daemon/funnel-watchdog.d.ts.map +1 -1
- package/dist/daemon/funnel-watchdog.js +8 -8
- package/dist/daemon/funnel-watchdog.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +24 -4
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/launch-cli.d.ts +67 -1
- package/dist/daemon/launch-cli.d.ts.map +1 -1
- package/dist/daemon/launch-cli.js +138 -35
- package/dist/daemon/launch-cli.js.map +1 -1
- package/dist/daemon/manage.d.ts.map +1 -1
- package/dist/daemon/manage.js +3 -15
- package/dist/daemon/manage.js.map +1 -1
- package/dist/daemon/screenshot.d.ts.map +1 -1
- package/dist/daemon/screenshot.js +43 -0
- package/dist/daemon/screenshot.js.map +1 -1
- package/dist/daemon/send-cli.d.ts +9 -0
- package/dist/daemon/send-cli.d.ts.map +1 -0
- package/dist/daemon/send-cli.js +55 -0
- package/dist/daemon/send-cli.js.map +1 -0
- package/dist/daemon/session-content.d.ts +2 -2
- package/dist/daemon/session-content.d.ts.map +1 -1
- package/dist/daemon/session-content.js +23 -3
- package/dist/daemon/session-content.js.map +1 -1
- package/dist/daemon/sessions.d.ts +29 -0
- package/dist/daemon/sessions.d.ts.map +1 -1
- package/dist/daemon/sessions.js +160 -63
- package/dist/daemon/sessions.js.map +1 -1
- package/dist/daemon/setup.d.ts +86 -0
- package/dist/daemon/setup.d.ts.map +1 -0
- package/dist/daemon/setup.js +470 -0
- package/dist/daemon/setup.js.map +1 -0
- package/dist/daemon/status-format.d.ts +4 -0
- package/dist/daemon/status-format.d.ts.map +1 -0
- package/dist/daemon/status-format.js +22 -0
- package/dist/daemon/status-format.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/ipc/validate.d.ts +2 -0
- package/dist/ipc/validate.d.ts.map +1 -1
- package/dist/ipc/validate.js +2 -1
- package/dist/ipc/validate.js.map +1 -1
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/transport/index.d.ts +2 -1
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +6 -0
- package/dist/transport/index.js.map +1 -1
- package/dist/transport/iterm.d.ts +4 -1
- package/dist/transport/iterm.d.ts.map +1 -1
- package/dist/transport/iterm.js +26 -0
- package/dist/transport/iterm.js.map +1 -1
- package/dist/transport/policy.d.ts +24 -0
- package/dist/transport/policy.d.ts.map +1 -0
- package/dist/transport/policy.js +41 -0
- package/dist/transport/policy.js.map +1 -0
- package/dist/transport/screen.d.ts +11 -0
- package/dist/transport/screen.d.ts.map +1 -1
- package/dist/transport/screen.js +19 -0
- package/dist/transport/screen.js.map +1 -1
- package/dist/transport/session-transport.d.ts +27 -0
- package/dist/transport/session-transport.d.ts.map +1 -1
- package/dist/transport/session-transport.js +6 -1
- package/dist/transport/session-transport.js.map +1 -1
- package/dist/transport/sync-facade.d.ts +19 -0
- package/dist/transport/sync-facade.d.ts.map +1 -1
- package/dist/transport/sync-facade.js +38 -8
- package/dist/transport/sync-facade.js.map +1 -1
- package/dist/transport/tmux.d.ts +15 -1
- package/dist/transport/tmux.d.ts.map +1 -1
- package/dist/transport/tmux.js +52 -4
- package/dist/transport/tmux.js.map +1 -1
- package/package.json +4 -2
- package/templates/systemd/aibroker.service +22 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/setup.ts — `aibroker setup` / `aibroker uninstall`.
|
|
3
|
+
*
|
|
4
|
+
* One idempotent command wires the four things a user otherwise does by hand:
|
|
5
|
+
* the service (systemd --user on Linux, LaunchAgent on macOS), the MCP server
|
|
6
|
+
* registration for Claude Code, the Claude Code hooks, and ~/.aibroker/env.
|
|
7
|
+
* Every host fact (home, platform, which binaries exist, running a command) is
|
|
8
|
+
* behind `Sys`, so tests run under a temp HOME without touching the machine.
|
|
9
|
+
*/
|
|
10
|
+
export interface Sys {
|
|
11
|
+
home: string;
|
|
12
|
+
platform: NodeJS.Platform;
|
|
13
|
+
env: NodeJS.ProcessEnv;
|
|
14
|
+
execPath: string;
|
|
15
|
+
nodeVersion: string;
|
|
16
|
+
/** Root of the installed aibroker package (holds dist/, hooks/, templates/). */
|
|
17
|
+
pkgRoot: string;
|
|
18
|
+
user: string;
|
|
19
|
+
uid: number;
|
|
20
|
+
/** Absolute path of a binary, or null when it is not installed. */
|
|
21
|
+
which(bin: string): string | null;
|
|
22
|
+
/** Run a command; never throws. */
|
|
23
|
+
run(cmd: string, args: string[]): {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
out: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function realSys(): Sys;
|
|
29
|
+
export declare const UNIT_NAME = "aibroker.service";
|
|
30
|
+
export declare const PLIST_LABEL = "com.aibroker.daemon";
|
|
31
|
+
export declare const unitPath: (s: Sys) => string;
|
|
32
|
+
export declare const plistPath: (s: Sys) => string;
|
|
33
|
+
export declare const envFilePath: (s: Sys) => string;
|
|
34
|
+
export declare const daemonLogPath: (s: Sys) => string;
|
|
35
|
+
export declare const claudeJsonPath: (s: Sys) => string;
|
|
36
|
+
export declare const settingsPath: (s: Sys) => string;
|
|
37
|
+
export declare const cliJs: (s: Sys) => string;
|
|
38
|
+
export declare const mcpJs: (s: Sys) => string;
|
|
39
|
+
export declare const hooksDir: (s: Sys) => string;
|
|
40
|
+
export interface HookSpec {
|
|
41
|
+
event: string;
|
|
42
|
+
matcher?: string;
|
|
43
|
+
file: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Which hook file runs on which Claude Code event, from each file's own header
|
|
47
|
+
* and docs/mailbox.md. budget-stop.mjs is left out on purpose: it reads PAI's
|
|
48
|
+
* advisor file and only means something on a PAI install.
|
|
49
|
+
*/
|
|
50
|
+
export declare const HOOK_PLAN: HookSpec[];
|
|
51
|
+
type Json = Record<string, any>;
|
|
52
|
+
export declare function mergeHooks(settings: Json, s: Sys): {
|
|
53
|
+
settings: Json;
|
|
54
|
+
added: string[];
|
|
55
|
+
present: string[];
|
|
56
|
+
};
|
|
57
|
+
/** Remove exactly the entries whose command lives under this install's hooks/ dir. */
|
|
58
|
+
export declare function unmergeHooks(settings: Json, s: Sys): {
|
|
59
|
+
settings: Json;
|
|
60
|
+
removed: number;
|
|
61
|
+
};
|
|
62
|
+
/** The `aibroker` entry in ~/.claude.json: whether present and the .js it launches. */
|
|
63
|
+
export declare function readMcpEntry(s: Sys): {
|
|
64
|
+
found: boolean;
|
|
65
|
+
target?: string;
|
|
66
|
+
};
|
|
67
|
+
export declare function renderUnit(s: Sys): string;
|
|
68
|
+
export declare function renderPlist(s: Sys): string;
|
|
69
|
+
export declare const ENV_TEMPLATE = "# AIBroker environment: KEY=value per line, read by the daemon at start.\n# Restart the daemon after editing (aibroker restart).\n#\n# AIBROKER_TRANSPORT=tmux\n# PAILOT_PORT=8765\n# TODOIST_API_TOKEN=\n";
|
|
70
|
+
export interface Opts {
|
|
71
|
+
service: boolean;
|
|
72
|
+
mcp: boolean;
|
|
73
|
+
hooks: boolean;
|
|
74
|
+
dryRun: boolean;
|
|
75
|
+
force: boolean;
|
|
76
|
+
purge: boolean;
|
|
77
|
+
}
|
|
78
|
+
export declare function parseOpts(argv: string[]): Opts;
|
|
79
|
+
type Say = (line: string) => void;
|
|
80
|
+
/** Returns the number of failed steps. */
|
|
81
|
+
export declare function setup(s: Sys, opts: Opts, say?: Say): number;
|
|
82
|
+
export declare function uninstall(s: Sys, opts: Opts, say?: Say): number;
|
|
83
|
+
export declare function runSetup(argv: string[]): Promise<void>;
|
|
84
|
+
export declare function runUninstall(argv: string[]): Promise<void>;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/daemon/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/setup.ts — `aibroker setup` / `aibroker uninstall`.
|
|
3
|
+
*
|
|
4
|
+
* One idempotent command wires the four things a user otherwise does by hand:
|
|
5
|
+
* the service (systemd --user on Linux, LaunchAgent on macOS), the MCP server
|
|
6
|
+
* registration for Claude Code, the Claude Code hooks, and ~/.aibroker/env.
|
|
7
|
+
* Every host fact (home, platform, which binaries exist, running a command) is
|
|
8
|
+
* behind `Sys`, so tests run under a temp HOME without touching the machine.
|
|
9
|
+
*/
|
|
10
|
+
import { spawnSync } from "node:child_process";
|
|
11
|
+
import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { userInfo } from "node:os";
|
|
13
|
+
import { dirname, join } from "node:path";
|
|
14
|
+
import { fileURLToPath } from "node:url";
|
|
15
|
+
import { resolveBin } from "../core/bins.js";
|
|
16
|
+
import { plistEnvEntries, serviceEnv, xmlEscape } from "../core/service-env.js";
|
|
17
|
+
export function realSys() {
|
|
18
|
+
const home = process.env.HOME || userInfo().homedir;
|
|
19
|
+
return {
|
|
20
|
+
home,
|
|
21
|
+
platform: process.platform,
|
|
22
|
+
env: process.env,
|
|
23
|
+
execPath: process.execPath,
|
|
24
|
+
nodeVersion: process.version,
|
|
25
|
+
pkgRoot: join(dirname(fileURLToPath(import.meta.url)), "..", ".."),
|
|
26
|
+
user: userInfo().username,
|
|
27
|
+
uid: process.getuid?.() ?? 0,
|
|
28
|
+
which: (bin) => {
|
|
29
|
+
const p = resolveBin(bin);
|
|
30
|
+
return p !== bin ? p : null;
|
|
31
|
+
},
|
|
32
|
+
run: (cmd, args) => {
|
|
33
|
+
const r = spawnSync(cmd, args, { encoding: "utf8", timeout: 15_000 });
|
|
34
|
+
return { ok: r.status === 0, out: `${r.stdout ?? ""}${r.stderr ?? ""}` };
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// ── paths ─────────────────────────────────────────────────────────────────
|
|
39
|
+
export const UNIT_NAME = "aibroker.service";
|
|
40
|
+
export const PLIST_LABEL = "com.aibroker.daemon";
|
|
41
|
+
export const unitPath = (s) => join(s.home, ".config", "systemd", "user", UNIT_NAME);
|
|
42
|
+
export const plistPath = (s) => join(s.home, "Library", "LaunchAgents", `${PLIST_LABEL}.plist`);
|
|
43
|
+
export const envFilePath = (s) => join(s.home, ".aibroker", "env");
|
|
44
|
+
export const daemonLogPath = (s) => join(s.home, ".aibroker", "daemon.log");
|
|
45
|
+
export const claudeJsonPath = (s) => join(s.home, ".claude.json");
|
|
46
|
+
export const settingsPath = (s) => join(s.home, ".claude", "settings.json");
|
|
47
|
+
export const cliJs = (s) => join(s.pkgRoot, "dist", "daemon", "cli.js");
|
|
48
|
+
export const mcpJs = (s) => join(s.pkgRoot, "dist", "mcp", "index.js");
|
|
49
|
+
export const hooksDir = (s) => join(s.pkgRoot, "hooks");
|
|
50
|
+
/**
|
|
51
|
+
* Which hook file runs on which Claude Code event, from each file's own header
|
|
52
|
+
* and docs/mailbox.md. budget-stop.mjs is left out on purpose: it reads PAI's
|
|
53
|
+
* advisor file and only means something on a PAI install.
|
|
54
|
+
*/
|
|
55
|
+
export const HOOK_PLAN = [
|
|
56
|
+
{ event: "UserPromptSubmit", file: "drain-mailbox.mjs" },
|
|
57
|
+
{ event: "UserPromptSubmit", file: "manage-hook.mjs" },
|
|
58
|
+
{ event: "Stop", file: "aibroker-route-guard.mjs" },
|
|
59
|
+
{ event: "PreToolUse", matcher: "Task|Agent", file: "aibroker-progress.mjs" },
|
|
60
|
+
{ event: "PreToolUse", matcher: "mcp__aibroker__aibroker_rename", file: "aibroker-rename-title.mjs" },
|
|
61
|
+
];
|
|
62
|
+
const q = (p) => (/\s/.test(p) ? `"${p}"` : p);
|
|
63
|
+
const hookCommand = (s, file) => `${q(s.execPath)} ${q(join(hooksDir(s), file))}`;
|
|
64
|
+
const commandsIn = (settings, event) => (settings.hooks?.[event] ?? []).flatMap((g) => (g.hooks ?? []).map((h) => h.command ?? ""));
|
|
65
|
+
/** Wired already, from any install dir: same hook file under any hooks/ directory. */
|
|
66
|
+
const hasHookFile = (settings, event, file) => commandsIn(settings, event).some((c) => c.includes(`/hooks/${file}`) || c.includes(`\\hooks\\${file}`));
|
|
67
|
+
export function mergeHooks(settings, s) {
|
|
68
|
+
const next = { ...settings, hooks: { ...(settings.hooks ?? {}) } };
|
|
69
|
+
const added = [];
|
|
70
|
+
const present = [];
|
|
71
|
+
for (const h of HOOK_PLAN) {
|
|
72
|
+
if (hasHookFile(next, h.event, h.file)) {
|
|
73
|
+
present.push(h.file);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const group = { ...(h.matcher ? { matcher: h.matcher } : {}), hooks: [{ type: "command", command: hookCommand(s, h.file) }] };
|
|
77
|
+
next.hooks[h.event] = [...(next.hooks[h.event] ?? []), group];
|
|
78
|
+
added.push(`${h.event}${h.matcher ? `[${h.matcher}]` : ""} ${h.file}`);
|
|
79
|
+
}
|
|
80
|
+
return { settings: next, added, present };
|
|
81
|
+
}
|
|
82
|
+
/** Remove exactly the entries whose command lives under this install's hooks/ dir. */
|
|
83
|
+
export function unmergeHooks(settings, s) {
|
|
84
|
+
const dir = hooksDir(s);
|
|
85
|
+
let removed = 0;
|
|
86
|
+
const hooks = {};
|
|
87
|
+
for (const [event, groups] of Object.entries((settings.hooks ?? {}))) {
|
|
88
|
+
const kept = [];
|
|
89
|
+
for (const g of groups) {
|
|
90
|
+
const keep = (g.hooks ?? []).filter((h) => !(h.command ?? "").includes(dir));
|
|
91
|
+
removed += (g.hooks ?? []).length - keep.length;
|
|
92
|
+
if (keep.length)
|
|
93
|
+
kept.push({ ...g, hooks: keep });
|
|
94
|
+
}
|
|
95
|
+
if (kept.length)
|
|
96
|
+
hooks[event] = kept;
|
|
97
|
+
}
|
|
98
|
+
const next = { ...settings };
|
|
99
|
+
if (Object.keys(hooks).length)
|
|
100
|
+
next.hooks = hooks;
|
|
101
|
+
else
|
|
102
|
+
delete next.hooks;
|
|
103
|
+
return { settings: next, removed };
|
|
104
|
+
}
|
|
105
|
+
// ── MCP entry ─────────────────────────────────────────────────────────────
|
|
106
|
+
/** The `aibroker` entry in ~/.claude.json: whether present and the .js it launches. */
|
|
107
|
+
export function readMcpEntry(s) {
|
|
108
|
+
const cfg = readJson(claudeJsonPath(s));
|
|
109
|
+
const e = cfg?.mcpServers?.aibroker;
|
|
110
|
+
if (!e)
|
|
111
|
+
return { found: false };
|
|
112
|
+
const args = Array.isArray(e.args) ? e.args : [];
|
|
113
|
+
return { found: true, target: args.find((a) => typeof a === "string" && a.endsWith(".js")) };
|
|
114
|
+
}
|
|
115
|
+
function readJson(path) {
|
|
116
|
+
if (!existsSync(path))
|
|
117
|
+
return null;
|
|
118
|
+
try {
|
|
119
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ── rendering ─────────────────────────────────────────────────────────────
|
|
126
|
+
/**
|
|
127
|
+
* PATH + AIBROKER_* from the invoking shell, minus what ~/.aibroker/env defines:
|
|
128
|
+
* the daemon loads that file itself, and by the time setup runs the CLI has
|
|
129
|
+
* already merged it into process.env, so copying it would duplicate secrets
|
|
130
|
+
* into the unit and freeze them there.
|
|
131
|
+
*/
|
|
132
|
+
function captureEnv(s) {
|
|
133
|
+
const own = new Set((readIf(envFilePath(s)) ?? "").split("\n").map((l) => /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=/.exec(l)?.[1]).filter(Boolean));
|
|
134
|
+
const env = serviceEnv(s.env);
|
|
135
|
+
for (const k of own)
|
|
136
|
+
if (k !== "PATH")
|
|
137
|
+
delete env[k];
|
|
138
|
+
return env;
|
|
139
|
+
}
|
|
140
|
+
const sdQuote = (v) => { const e = v.replace(/%/g, "%%"); return /\s/.test(e) ? `"${e}"` : e; };
|
|
141
|
+
export function renderUnit(s) {
|
|
142
|
+
const template = readFileSync(join(s.pkgRoot, "templates", "systemd", UNIT_NAME), "utf8");
|
|
143
|
+
const envLines = Object.entries(captureEnv(s))
|
|
144
|
+
.map(([k, v]) => `Environment="${`${k}=${v}`.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/%/g, "%%")}"`)
|
|
145
|
+
.join("\n");
|
|
146
|
+
return template
|
|
147
|
+
.replace("@EXEC_START@", `${sdQuote(s.execPath)} ${sdQuote(cliJs(s))} start`)
|
|
148
|
+
.replace("@ENVIRONMENT@", envLines);
|
|
149
|
+
}
|
|
150
|
+
export function renderPlist(s) {
|
|
151
|
+
const env = { ...captureEnv(s), HOME: s.home };
|
|
152
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
153
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
154
|
+
<plist version="1.0">
|
|
155
|
+
<dict>
|
|
156
|
+
<key>Label</key><string>${PLIST_LABEL}</string>
|
|
157
|
+
<key>ProgramArguments</key>
|
|
158
|
+
<array>
|
|
159
|
+
<string>${xmlEscape(s.execPath)}</string>
|
|
160
|
+
<string>${xmlEscape(cliJs(s))}</string>
|
|
161
|
+
<string>start</string>
|
|
162
|
+
</array>
|
|
163
|
+
<key>EnvironmentVariables</key>
|
|
164
|
+
<dict>${plistEnvEntries(env)}</dict>
|
|
165
|
+
<key>RunAtLoad</key><true/>
|
|
166
|
+
<key>KeepAlive</key><true/>
|
|
167
|
+
<key>StandardOutPath</key><string>${xmlEscape(daemonLogPath(s))}</string>
|
|
168
|
+
<key>StandardErrorPath</key><string>${xmlEscape(daemonLogPath(s))}</string>
|
|
169
|
+
</dict>
|
|
170
|
+
</plist>
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
export const ENV_TEMPLATE = `# AIBroker environment: KEY=value per line, read by the daemon at start.
|
|
174
|
+
# Restart the daemon after editing (aibroker restart).
|
|
175
|
+
#
|
|
176
|
+
# AIBROKER_TRANSPORT=tmux
|
|
177
|
+
# PAILOT_PORT=8765
|
|
178
|
+
# TODOIST_API_TOKEN=
|
|
179
|
+
`;
|
|
180
|
+
export function parseOpts(argv) {
|
|
181
|
+
return {
|
|
182
|
+
service: !argv.includes("--no-service"),
|
|
183
|
+
mcp: !argv.includes("--no-mcp"),
|
|
184
|
+
hooks: !argv.includes("--no-hooks"),
|
|
185
|
+
dryRun: argv.includes("--dry-run"),
|
|
186
|
+
force: argv.includes("--force"),
|
|
187
|
+
purge: argv.includes("--purge"),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
class Act {
|
|
191
|
+
s;
|
|
192
|
+
dryRun;
|
|
193
|
+
say;
|
|
194
|
+
fails = 0;
|
|
195
|
+
constructor(s, dryRun, say) {
|
|
196
|
+
this.s = s;
|
|
197
|
+
this.dryRun = dryRun;
|
|
198
|
+
this.say = say;
|
|
199
|
+
}
|
|
200
|
+
/** Outcome line; a dry run already said "would …". */
|
|
201
|
+
done(line) { if (!this.dryRun)
|
|
202
|
+
this.say(line); }
|
|
203
|
+
fail(line) { this.fails++; this.say(` FAIL ${line}`); }
|
|
204
|
+
/**
|
|
205
|
+
* Atomic write; backs up the previous file. The first backup (`.bak`, the pre-aibroker original)
|
|
206
|
+
* is never overwritten; later ones go to `.bak.<ISO-timestamp>`. Existing files keep their mode.
|
|
207
|
+
*/
|
|
208
|
+
write(path, data, backup = false) {
|
|
209
|
+
if (this.dryRun) {
|
|
210
|
+
this.say(` would write ${path} (${data.length} bytes)`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
214
|
+
let mode = 0o600;
|
|
215
|
+
if (existsSync(path)) {
|
|
216
|
+
mode = statSync(path).mode & 0o777;
|
|
217
|
+
if (backup) {
|
|
218
|
+
const first = `${path}.bak`;
|
|
219
|
+
const dest = existsSync(first) ? `${first}.${new Date().toISOString()}` : first;
|
|
220
|
+
copyFileSync(path, dest);
|
|
221
|
+
chmodSync(dest, 0o600);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
225
|
+
writeFileSync(tmp, data, { mode });
|
|
226
|
+
renameSync(tmp, path);
|
|
227
|
+
}
|
|
228
|
+
remove(path, recursive = false) {
|
|
229
|
+
if (this.dryRun) {
|
|
230
|
+
this.say(` would remove ${path}`);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
rmSync(path, { force: true, recursive });
|
|
234
|
+
}
|
|
235
|
+
/** A state-changing command. Dry-run prints it instead of running it. */
|
|
236
|
+
run(cmd, args) {
|
|
237
|
+
const line = [cmd, ...args].join(" ");
|
|
238
|
+
if (this.dryRun) {
|
|
239
|
+
this.say(` would run: ${line}`);
|
|
240
|
+
return { ok: true, out: "" };
|
|
241
|
+
}
|
|
242
|
+
const r = this.s.run(cmd, args);
|
|
243
|
+
if (!r.ok)
|
|
244
|
+
this.say(` command failed: ${line}${r.out.trim() ? `: ${r.out.trim()}` : ""}`);
|
|
245
|
+
return r;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const readIf = (p) => (existsSync(p) ? readFileSync(p, "utf8") : null);
|
|
249
|
+
/** The `<string>` values of a plist, in order: what it runs and where it logs. The environment block is left out: it can hold secrets. */
|
|
250
|
+
const plistValues = (x) => [...x.replace(/<key>EnvironmentVariables<\/key>\s*<dict>[\s\S]*?<\/dict>/, "").matchAll(/<string>([^<]*)<\/string>/g)].map((m) => m[1]);
|
|
251
|
+
function plistDiff(oldText, newText) {
|
|
252
|
+
const o = new Set(plistValues(oldText)), n = new Set(plistValues(newText));
|
|
253
|
+
return [
|
|
254
|
+
...plistValues(oldText).filter((v) => !n.has(v)).map((v) => ` - ${v}`),
|
|
255
|
+
...plistValues(newText).filter((v) => !o.has(v)).map((v) => ` + ${v}`),
|
|
256
|
+
].slice(0, 20);
|
|
257
|
+
}
|
|
258
|
+
// ── service ───────────────────────────────────────────────────────────────
|
|
259
|
+
function serviceLinux(a, opts) {
|
|
260
|
+
const s = a.s;
|
|
261
|
+
if (!existsSync(join(s.pkgRoot, "dist", "daemon", "cli.js")) && !a.dryRun)
|
|
262
|
+
return a.fail(`${cliJs(s)} not found; run npm run build`);
|
|
263
|
+
const unit = renderUnit(s);
|
|
264
|
+
const path = unitPath(s);
|
|
265
|
+
const old = readIf(path);
|
|
266
|
+
if (old === unit)
|
|
267
|
+
a.say(` unit unchanged: ${path}`);
|
|
268
|
+
else {
|
|
269
|
+
a.write(path, unit);
|
|
270
|
+
a.done(` ${old === null ? "wrote" : "updated"} unit: ${path}`);
|
|
271
|
+
}
|
|
272
|
+
if (opts.dryRun)
|
|
273
|
+
a.say(` unit content:\n${unit.split("\n").map((l) => ` | ${l}`).join("\n")}`);
|
|
274
|
+
if (!s.which("systemctl")) {
|
|
275
|
+
a.say(` systemctl not found: no service started. Run it yourself: ${s.execPath} ${cliJs(s)} start`);
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
a.run("systemctl", ["--user", "daemon-reload"]);
|
|
279
|
+
const enabled = a.run("systemctl", ["--user", "enable", "--now", UNIT_NAME]);
|
|
280
|
+
if (!enabled.ok)
|
|
281
|
+
a.fails++;
|
|
282
|
+
else if (old !== null && old !== unit)
|
|
283
|
+
a.run("systemctl", ["--user", "restart", UNIT_NAME]);
|
|
284
|
+
if (!s.which("loginctl"))
|
|
285
|
+
return;
|
|
286
|
+
const linger = s.run("loginctl", ["show-user", s.user, "-p", "Linger"]);
|
|
287
|
+
if (/Linger=yes/.test(linger.out))
|
|
288
|
+
a.say(" linger: on (service survives logout)");
|
|
289
|
+
else
|
|
290
|
+
a.say(` linger: OFF, the service stops at logout. Run once: sudo loginctl enable-linger ${s.user}`);
|
|
291
|
+
}
|
|
292
|
+
function serviceMac(a, opts) {
|
|
293
|
+
const s = a.s;
|
|
294
|
+
const plist = renderPlist(s);
|
|
295
|
+
const path = plistPath(s);
|
|
296
|
+
const old = readIf(path);
|
|
297
|
+
if (old !== null && !opts.force) {
|
|
298
|
+
if (old === plist)
|
|
299
|
+
a.say(` plist unchanged: ${path}`);
|
|
300
|
+
else
|
|
301
|
+
a.say(` plist exists, left alone (use --force to replace): ${path}\n${plistDiff(old, plist).join("\n")}`);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (!existsSync(cliJs(s)) && !a.dryRun)
|
|
305
|
+
return a.fail(`${cliJs(s)} not found; run npm run build`);
|
|
306
|
+
if (!existsSync(daemonLogPath(s)))
|
|
307
|
+
a.write(daemonLogPath(s), "");
|
|
308
|
+
a.write(path, plist);
|
|
309
|
+
const target = `gui/${s.uid}`;
|
|
310
|
+
a.run("launchctl", ["bootout", `${target}/${PLIST_LABEL}`]);
|
|
311
|
+
const r = a.run("launchctl", ["bootstrap", target, path]);
|
|
312
|
+
if (!r.ok)
|
|
313
|
+
a.fails++;
|
|
314
|
+
else
|
|
315
|
+
a.done(` ${old === null ? "wrote" : "replaced"} and loaded ${PLIST_LABEL}`);
|
|
316
|
+
}
|
|
317
|
+
// ── mcp ───────────────────────────────────────────────────────────────────
|
|
318
|
+
function mcpAdd(a) {
|
|
319
|
+
const s = a.s;
|
|
320
|
+
const entry = readMcpEntry(s);
|
|
321
|
+
if (entry.found && entry.target && existsSync(entry.target)) {
|
|
322
|
+
return a.say(` aibroker entry already registered -> ${entry.target}; left alone`);
|
|
323
|
+
}
|
|
324
|
+
if (!existsSync(mcpJs(s)) && !a.dryRun)
|
|
325
|
+
return a.fail(`${mcpJs(s)} not found; run npm run build`);
|
|
326
|
+
const claude = s.which("claude");
|
|
327
|
+
if (claude) {
|
|
328
|
+
if (entry.found)
|
|
329
|
+
a.run(claude, ["mcp", "remove", "--scope", "user", "aibroker"]);
|
|
330
|
+
const r = a.run(claude, ["mcp", "add", "--scope", "user", "aibroker", "--", s.execPath, mcpJs(s)]);
|
|
331
|
+
// Exit 0 is not proof: verify the artifact the same way doctor reads it.
|
|
332
|
+
if (r.ok && (a.dryRun || readMcpEntry(s).target === mcpJs(s)))
|
|
333
|
+
return a.done(` registered via claude CLI -> ${mcpJs(s)}`);
|
|
334
|
+
a.say(r.ok ? " claude CLI did not register it; wrote ~/.claude.json directly" : " claude CLI failed; falling back to editing ~/.claude.json");
|
|
335
|
+
}
|
|
336
|
+
const path = claudeJsonPath(s);
|
|
337
|
+
const cfg = existsSync(path) ? readJson(path) : {};
|
|
338
|
+
if (cfg === null)
|
|
339
|
+
return a.fail(`${path} is not valid JSON; not touching it`);
|
|
340
|
+
const next = { ...cfg, mcpServers: { ...(cfg.mcpServers ?? {}), aibroker: { type: "stdio", command: s.execPath, args: [mcpJs(s)] } } };
|
|
341
|
+
a.write(path, `${JSON.stringify(next, null, 2)}\n`, true);
|
|
342
|
+
a.done(` merged aibroker into ${path} (other servers untouched, backup ${path}.bak)`);
|
|
343
|
+
}
|
|
344
|
+
function mcpRemove(a) {
|
|
345
|
+
const s = a.s;
|
|
346
|
+
const entry = readMcpEntry(s);
|
|
347
|
+
if (!entry.found)
|
|
348
|
+
return a.say(" no aibroker entry");
|
|
349
|
+
if (entry.target !== mcpJs(s))
|
|
350
|
+
return a.say(` aibroker entry points elsewhere (${entry.target ?? "?"}); left alone`);
|
|
351
|
+
const claude = s.which("claude");
|
|
352
|
+
if (claude && a.run(claude, ["mcp", "remove", "--scope", "user", "aibroker"]).ok)
|
|
353
|
+
return a.done(" removed via claude CLI");
|
|
354
|
+
const path = claudeJsonPath(s);
|
|
355
|
+
const cfg = readJson(path);
|
|
356
|
+
if (!cfg)
|
|
357
|
+
return a.fail(`${path} unreadable; not touching it`);
|
|
358
|
+
const { aibroker: _gone, ...others } = cfg.mcpServers;
|
|
359
|
+
a.write(path, `${JSON.stringify({ ...cfg, mcpServers: others }, null, 2)}\n`, true);
|
|
360
|
+
a.done(` removed aibroker from ${path}`);
|
|
361
|
+
}
|
|
362
|
+
// ── hooks ─────────────────────────────────────────────────────────────────
|
|
363
|
+
function hooksEdit(a, remove) {
|
|
364
|
+
const s = a.s;
|
|
365
|
+
const path = settingsPath(s);
|
|
366
|
+
const cur = existsSync(path) ? readJson(path) : {};
|
|
367
|
+
if (cur === null)
|
|
368
|
+
return a.fail(`${path} is not valid JSON; not touching it`);
|
|
369
|
+
if (remove) {
|
|
370
|
+
const { settings, removed } = unmergeHooks(cur, s);
|
|
371
|
+
if (!removed)
|
|
372
|
+
return a.say(" no hooks of this install found");
|
|
373
|
+
a.write(path, `${JSON.stringify(settings, null, 2)}\n`, true);
|
|
374
|
+
return a.done(` removed ${removed} hook entr(ies) from ${path}`);
|
|
375
|
+
}
|
|
376
|
+
const { settings, added, present } = mergeHooks(cur, s);
|
|
377
|
+
for (const f of present)
|
|
378
|
+
a.say(` already wired: ${f}`);
|
|
379
|
+
if (!added.length)
|
|
380
|
+
return;
|
|
381
|
+
a.write(path, `${JSON.stringify(settings, null, 2)}\n`, true);
|
|
382
|
+
for (const h of added)
|
|
383
|
+
a.say(` ${a.dryRun ? "would add" : "added"}: ${h}`);
|
|
384
|
+
}
|
|
385
|
+
// ── env file ──────────────────────────────────────────────────────────────
|
|
386
|
+
function envFile(a) {
|
|
387
|
+
const path = envFilePath(a.s);
|
|
388
|
+
if (existsSync(path))
|
|
389
|
+
return a.say(` ${path} exists; left alone`);
|
|
390
|
+
a.write(path, ENV_TEMPLATE);
|
|
391
|
+
a.done(` created ${path} (0600)`);
|
|
392
|
+
}
|
|
393
|
+
// ── entry points ──────────────────────────────────────────────────────────
|
|
394
|
+
/** Returns the number of failed steps. */
|
|
395
|
+
export function setup(s, opts, say = console.log) {
|
|
396
|
+
const a = new Act(s, opts.dryRun, say);
|
|
397
|
+
say(`aibroker setup${opts.dryRun ? " (dry run, nothing is written)" : ""}: ${s.platform}, ${s.pkgRoot}`);
|
|
398
|
+
say("env:");
|
|
399
|
+
envFile(a);
|
|
400
|
+
if (opts.service) {
|
|
401
|
+
say("service:");
|
|
402
|
+
if (s.platform === "linux")
|
|
403
|
+
serviceLinux(a, opts);
|
|
404
|
+
else if (s.platform === "darwin")
|
|
405
|
+
serviceMac(a, opts);
|
|
406
|
+
else
|
|
407
|
+
say(` no service support on ${s.platform}; run: ${s.execPath} ${cliJs(s)} start`);
|
|
408
|
+
}
|
|
409
|
+
if (opts.mcp) {
|
|
410
|
+
say("mcp:");
|
|
411
|
+
mcpAdd(a);
|
|
412
|
+
}
|
|
413
|
+
if (opts.hooks) {
|
|
414
|
+
say("hooks:");
|
|
415
|
+
hooksEdit(a, false);
|
|
416
|
+
}
|
|
417
|
+
say(a.fails ? `setup finished with ${a.fails} failure(s)` : "setup done. Next: aibroker doctor");
|
|
418
|
+
return a.fails;
|
|
419
|
+
}
|
|
420
|
+
export function uninstall(s, opts, say = console.log) {
|
|
421
|
+
const a = new Act(s, opts.dryRun, say);
|
|
422
|
+
say(`aibroker uninstall${opts.dryRun ? " (dry run, nothing is changed)" : ""}`);
|
|
423
|
+
if (opts.service) {
|
|
424
|
+
say("service:");
|
|
425
|
+
if (s.platform === "linux") {
|
|
426
|
+
if (s.which("systemctl"))
|
|
427
|
+
a.run("systemctl", ["--user", "disable", "--now", UNIT_NAME]);
|
|
428
|
+
if (existsSync(unitPath(s))) {
|
|
429
|
+
a.remove(unitPath(s));
|
|
430
|
+
a.done(` removed ${unitPath(s)}`);
|
|
431
|
+
}
|
|
432
|
+
else
|
|
433
|
+
say(" no unit installed");
|
|
434
|
+
if (s.which("systemctl"))
|
|
435
|
+
a.run("systemctl", ["--user", "daemon-reload"]);
|
|
436
|
+
}
|
|
437
|
+
else if (s.platform === "darwin") {
|
|
438
|
+
if (existsSync(plistPath(s))) {
|
|
439
|
+
a.run("launchctl", ["bootout", `gui/${s.uid}/${PLIST_LABEL}`]);
|
|
440
|
+
a.remove(plistPath(s));
|
|
441
|
+
a.done(` removed ${plistPath(s)}`);
|
|
442
|
+
}
|
|
443
|
+
else
|
|
444
|
+
say(" no plist installed");
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
if (opts.mcp) {
|
|
448
|
+
say("mcp:");
|
|
449
|
+
mcpRemove(a);
|
|
450
|
+
}
|
|
451
|
+
if (opts.hooks) {
|
|
452
|
+
say("hooks:");
|
|
453
|
+
hooksEdit(a, true);
|
|
454
|
+
}
|
|
455
|
+
const data = join(s.home, ".aibroker");
|
|
456
|
+
if (opts.purge) {
|
|
457
|
+
a.remove(data, true);
|
|
458
|
+
a.done(` purged ${data}`);
|
|
459
|
+
}
|
|
460
|
+
else
|
|
461
|
+
say(`kept ${data} (add --purge to delete it)`);
|
|
462
|
+
return a.fails;
|
|
463
|
+
}
|
|
464
|
+
export async function runSetup(argv) {
|
|
465
|
+
process.exitCode = setup(realSys(), parseOpts(argv)) ? 1 : 0;
|
|
466
|
+
}
|
|
467
|
+
export async function runUninstall(argv) {
|
|
468
|
+
process.exitCode = uninstall(realSys(), parseOpts(argv)) ? 1 : 0;
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/daemon/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** daemon/status-format.ts — text rendering of the hub status for `aibroker status`. */
|
|
2
|
+
import type { ValidatedHubStatus } from "../ipc/validate.js";
|
|
3
|
+
export declare function formatHubStatus(status: ValidatedHubStatus): string[];
|
|
4
|
+
//# sourceMappingURL=status-format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-format.d.ts","sourceRoot":"","sources":["../../src/daemon/status-format.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAmBpE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** daemon/status-format.ts — text rendering of the hub status for `aibroker status`. */
|
|
2
|
+
export function formatHubStatus(status) {
|
|
3
|
+
const out = [`AIBroker Hub v${status.version}`];
|
|
4
|
+
if (status.status !== "ok") {
|
|
5
|
+
out.push(` Status: ${status.status}${status.detail ? ` — ${status.detail}` : ""}`);
|
|
6
|
+
}
|
|
7
|
+
out.push(` Transport: ${status.transport}`);
|
|
8
|
+
out.push(` Active session: ${status.activeSession ?? "(none)"}`);
|
|
9
|
+
out.push(` Sessions: ${status.activeSessions}`);
|
|
10
|
+
out.push(` Adapters: ${status.adapters.join(", ") || "(none)"}`);
|
|
11
|
+
if (Object.keys(status.adapterHealth).length > 0) {
|
|
12
|
+
out.push("", " Adapter Health:");
|
|
13
|
+
for (const [name, h] of Object.entries(status.adapterHealth)) {
|
|
14
|
+
const icon = h.status === "ok" ? "●" : h.status === "degraded" ? "◐" : "○";
|
|
15
|
+
const detail = h.detail ? ` — ${h.detail}` : "";
|
|
16
|
+
const msgs = `↓${h.stats.messagesReceived} ↑${h.stats.messagesSent}`;
|
|
17
|
+
out.push(` ${icon} ${name}: ${h.status} (${h.connectionStatus}) ${msgs}${detail}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=status-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-format.js","sourceRoot":"","sources":["../../src/daemon/status-format.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAIxF,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,MAAM,GAAG,GAAG,CAAC,iBAAiB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACvD,GAAG,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAClC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAC3E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACrE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,gBAAgB,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -53,6 +53,7 @@ export { recordFromMic, transcribeLocalAudio, WHISPER_BIN as DICTATION_WHISPER_B
|
|
|
53
53
|
export { textToVoiceNote, speakLocally, listVoices } from "./adapters/kokoro/tts.js";
|
|
54
54
|
export type { KokoroVoice } from "./adapters/kokoro/tts.js";
|
|
55
55
|
export { transcribeAudio, splitIntoChunks, mimetypeToExt, mimetypeToDocExt, WHISPER_BIN, WHISPER_MODEL, } from "./adapters/kokoro/media.js";
|
|
56
|
+
export { resolveBin, resolveWhisperBin, resolveFfmpegBin, resolveSoxBin } from "./core/bins.js";
|
|
56
57
|
export { startWsGateway, stopWsGateway, broadcastText, broadcastImage, broadcastVoice, broadcastStatus, hasPailotClients, setScreenshotHandler, } from "./adapters/pailot/gateway.js";
|
|
57
58
|
export { SessionBackend } from "./adapters/session/backend.js";
|
|
58
59
|
export { APIBackend } from "./backend/api.js";
|