aibroker 0.5.1 → 0.6.2
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 +263 -104
- package/dist/adapters/iterm/iterm2-api.d.ts +20 -0
- package/dist/adapters/iterm/iterm2-api.d.ts.map +1 -0
- package/dist/adapters/iterm/iterm2-api.js +244 -0
- package/dist/adapters/iterm/iterm2-api.js.map +1 -0
- package/dist/adapters/iterm/sessions.d.ts +1 -0
- package/dist/adapters/iterm/sessions.d.ts.map +1 -1
- package/dist/adapters/iterm/sessions.js +26 -2
- package/dist/adapters/iterm/sessions.js.map +1 -1
- package/dist/adapters/kokoro/media.js +2 -2
- package/dist/adapters/kokoro/media.js.map +1 -1
- package/dist/adapters/pailot/gateway.d.ts +5 -6
- package/dist/adapters/pailot/gateway.d.ts.map +1 -1
- package/dist/adapters/pailot/gateway.js +575 -34
- package/dist/adapters/pailot/gateway.js.map +1 -1
- package/dist/aibp/bridge.d.ts +123 -0
- package/dist/aibp/bridge.d.ts.map +1 -0
- package/dist/aibp/bridge.js +363 -0
- package/dist/aibp/bridge.js.map +1 -0
- package/dist/aibp/envelope.d.ts +26 -0
- package/dist/aibp/envelope.d.ts.map +1 -0
- package/dist/aibp/envelope.js +101 -0
- package/dist/aibp/envelope.js.map +1 -0
- package/dist/aibp/index.d.ts +11 -0
- package/dist/aibp/index.d.ts.map +1 -0
- package/dist/aibp/index.js +10 -0
- package/dist/aibp/index.js.map +1 -0
- package/dist/aibp/registry.d.ts +71 -0
- package/dist/aibp/registry.d.ts.map +1 -0
- package/dist/aibp/registry.js +408 -0
- package/dist/aibp/registry.js.map +1 -0
- package/dist/aibp/types.d.ts +91 -0
- package/dist/aibp/types.d.ts.map +1 -0
- package/dist/aibp/types.js +8 -0
- package/dist/aibp/types.js.map +1 -0
- package/dist/core/hybrid.d.ts +2 -0
- package/dist/core/hybrid.d.ts.map +1 -1
- package/dist/core/hybrid.js +8 -0
- package/dist/core/hybrid.js.map +1 -1
- package/dist/core/state.d.ts +12 -0
- package/dist/core/state.d.ts.map +1 -1
- package/dist/core/state.js +34 -0
- package/dist/core/state.js.map +1 -1
- package/dist/core/status-cache.d.ts +51 -0
- package/dist/core/status-cache.d.ts.map +1 -0
- package/dist/core/status-cache.js +62 -0
- package/dist/core/status-cache.js.map +1 -0
- package/dist/daemon/adapter-registry.d.ts +5 -0
- package/dist/daemon/adapter-registry.d.ts.map +1 -1
- package/dist/daemon/adapter-registry.js +94 -4
- package/dist/daemon/adapter-registry.js.map +1 -1
- package/dist/daemon/cli.d.ts +1 -0
- package/dist/daemon/cli.d.ts.map +1 -1
- package/dist/daemon/cli.js +95 -3
- package/dist/daemon/cli.js.map +1 -1
- package/dist/daemon/command-context.d.ts +28 -0
- package/dist/daemon/command-context.d.ts.map +1 -0
- package/dist/daemon/command-context.js +13 -0
- package/dist/daemon/command-context.js.map +1 -0
- package/dist/daemon/commands.d.ts +22 -0
- package/dist/daemon/commands.d.ts.map +1 -0
- package/dist/daemon/commands.js +849 -0
- package/dist/daemon/commands.js.map +1 -0
- package/dist/daemon/core-handlers.d.ts.map +1 -1
- package/dist/daemon/core-handlers.js +758 -3
- package/dist/daemon/core-handlers.js.map +1 -1
- package/dist/daemon/create-adapter.js +2 -1
- package/dist/daemon/create-adapter.js.map +1 -1
- package/dist/daemon/image-context.d.ts +56 -0
- package/dist/daemon/image-context.d.ts.map +1 -0
- package/dist/daemon/image-context.js +116 -0
- package/dist/daemon/image-context.js.map +1 -0
- package/dist/daemon/image-gen/index.d.ts +22 -0
- package/dist/daemon/image-gen/index.d.ts.map +1 -0
- package/dist/daemon/image-gen/index.js +129 -0
- package/dist/daemon/image-gen/index.js.map +1 -0
- package/dist/daemon/image-gen/providers/cloudflare.d.ts +13 -0
- package/dist/daemon/image-gen/providers/cloudflare.d.ts.map +1 -0
- package/dist/daemon/image-gen/providers/cloudflare.js +63 -0
- package/dist/daemon/image-gen/providers/cloudflare.js.map +1 -0
- package/dist/daemon/image-gen/providers/huggingface.d.ts +12 -0
- package/dist/daemon/image-gen/providers/huggingface.d.ts.map +1 -0
- package/dist/daemon/image-gen/providers/huggingface.js +58 -0
- package/dist/daemon/image-gen/providers/huggingface.js.map +1 -0
- package/dist/daemon/image-gen/providers/pollinations.d.ts +11 -0
- package/dist/daemon/image-gen/providers/pollinations.d.ts.map +1 -0
- package/dist/daemon/image-gen/providers/pollinations.js +39 -0
- package/dist/daemon/image-gen/providers/pollinations.js.map +1 -0
- package/dist/daemon/image-gen/providers/replicate.d.ts +9 -0
- package/dist/daemon/image-gen/providers/replicate.d.ts.map +1 -0
- package/dist/daemon/image-gen/providers/replicate.js +158 -0
- package/dist/daemon/image-gen/providers/replicate.js.map +1 -0
- package/dist/daemon/image-gen/types.d.ts +41 -0
- package/dist/daemon/image-gen/types.d.ts.map +1 -0
- package/dist/daemon/image-gen/types.js +5 -0
- package/dist/daemon/image-gen/types.js.map +1 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +260 -6
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/screenshot.d.ts +12 -0
- package/dist/daemon/screenshot.d.ts.map +1 -0
- package/dist/daemon/screenshot.js +252 -0
- package/dist/daemon/screenshot.js.map +1 -0
- package/dist/daemon/session-content.d.ts +27 -0
- package/dist/daemon/session-content.d.ts.map +1 -0
- package/dist/daemon/session-content.js +76 -0
- package/dist/daemon/session-content.js.map +1 -0
- package/dist/daemon/vision.d.ts +46 -0
- package/dist/daemon/vision.d.ts.map +1 -0
- package/dist/daemon/vision.js +176 -0
- package/dist/daemon/vision.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc/validate.d.ts +52 -0
- package/dist/ipc/validate.d.ts.map +1 -0
- package/dist/ipc/validate.js +129 -0
- package/dist/ipc/validate.js.map +1 -0
- package/dist/mcp/index.d.ts +23 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +787 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/types/broker.d.ts +3 -1
- package/dist/types/broker.d.ts.map +1 -1
- package/dist/types/broker.js.map +1 -1
- package/package.json +5 -2
- package/templates/adapter/ONBOARDING_PROMPT.md +51 -29
- package/templates/adapter/README.md.tmpl +14 -31
- package/templates/adapter/package.json.tmpl +1 -1
- package/templates/adapter/src/watcher/commands.ts.tmpl +24 -126
- package/templates/adapter/src/watcher/index.ts.tmpl +112 -88
- package/templates/adapter/src/watcher/ipc-server.ts.tmpl +27 -3
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/session-content.ts — Read terminal content from iTerm2 sessions.
|
|
3
|
+
*
|
|
4
|
+
* Uses AppleScript to read the visible + scrollback content from iTerm2 tabs.
|
|
5
|
+
* Also detects busy/idle state via `is at shell prompt`.
|
|
6
|
+
*
|
|
7
|
+
* Part of Session Orchestration (Phase 1, v0.7).
|
|
8
|
+
*/
|
|
9
|
+
import { runAppleScript, withSessionAppleScript, snapshotAllSessions } from "../adapters/iterm/core.js";
|
|
10
|
+
/**
|
|
11
|
+
* Read terminal content from a specific iTerm2 session.
|
|
12
|
+
* Returns the last N lines of terminal output + busy/idle flag.
|
|
13
|
+
*/
|
|
14
|
+
export function readSessionContent(sessionId, lines = 100) {
|
|
15
|
+
// AppleScript: get contents, name, atPrompt for a specific session
|
|
16
|
+
const script = withSessionAppleScript(sessionId, ` set sessionName to name of aSession
|
|
17
|
+
set isAtPrompt to (is at shell prompt of aSession)
|
|
18
|
+
tell aSession
|
|
19
|
+
try
|
|
20
|
+
set paiName to (variable named "user.paiName")
|
|
21
|
+
on error
|
|
22
|
+
set paiName to ""
|
|
23
|
+
end try
|
|
24
|
+
end tell
|
|
25
|
+
set rawContent to contents of aSession
|
|
26
|
+
-- Take last N lines
|
|
27
|
+
set AppleScript's text item delimiters to linefeed
|
|
28
|
+
set allLines to text items of rawContent
|
|
29
|
+
set lineCount to count of allLines
|
|
30
|
+
if lineCount > ${lines} then
|
|
31
|
+
set lastLines to items (lineCount - ${lines - 1}) thru lineCount of allLines
|
|
32
|
+
else
|
|
33
|
+
set lastLines to allLines
|
|
34
|
+
end if
|
|
35
|
+
set resultContent to lastLines as text
|
|
36
|
+
return sessionName & (ASCII character 9) & (isAtPrompt as text) & (ASCII character 9) & paiName & (ASCII character 9) & resultContent`, 'return "NOT_FOUND"');
|
|
37
|
+
const result = runAppleScript(script);
|
|
38
|
+
if (!result || result === "NOT_FOUND")
|
|
39
|
+
return null;
|
|
40
|
+
const tabIdx = result.indexOf("\t");
|
|
41
|
+
const tabIdx2 = result.indexOf("\t", tabIdx + 1);
|
|
42
|
+
const tabIdx3 = result.indexOf("\t", tabIdx2 + 1);
|
|
43
|
+
if (tabIdx < 0 || tabIdx2 < 0 || tabIdx3 < 0)
|
|
44
|
+
return null;
|
|
45
|
+
const name = result.substring(0, tabIdx);
|
|
46
|
+
const atPrompt = result.substring(tabIdx + 1, tabIdx2) === "true";
|
|
47
|
+
const paiName = result.substring(tabIdx2 + 1, tabIdx3);
|
|
48
|
+
const content = result.substring(tabIdx3 + 1);
|
|
49
|
+
return {
|
|
50
|
+
sessionId,
|
|
51
|
+
name,
|
|
52
|
+
content,
|
|
53
|
+
lineCount: content.split("\n").length,
|
|
54
|
+
atPrompt,
|
|
55
|
+
paiName: paiName && paiName !== "missing value" && paiName !== "" ? paiName : null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Read terminal content from ALL iTerm2 sessions.
|
|
60
|
+
* Returns array of session contents with busy/idle flags.
|
|
61
|
+
*/
|
|
62
|
+
export function readAllSessionContent(lines = 100) {
|
|
63
|
+
// First get all session IDs via snapshot
|
|
64
|
+
const snapshots = snapshotAllSessions();
|
|
65
|
+
if (snapshots.length === 0)
|
|
66
|
+
return [];
|
|
67
|
+
const results = [];
|
|
68
|
+
for (const snap of snapshots) {
|
|
69
|
+
const content = readSessionContent(snap.id, lines);
|
|
70
|
+
if (content) {
|
|
71
|
+
results.push(content);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return results;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=session-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-content.js","sourceRoot":"","sources":["../../src/daemon/session-content.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAYxG;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAK,GAAG,GAAG;IAC/D,mEAAmE;IACnE,MAAM,MAAM,GAAG,sBAAsB,CACnC,SAAS,EACT;;;;;;;;;;;;;;2BAcuB,KAAK;kDACkB,KAAK,GAAG,CAAC;;;;;gJAKqF,EAC5I,oBAAoB,CACrB,CAAC;IAEF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC;IAClE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAE9C,OAAO;QACL,SAAS;QACT,IAAI;QACJ,OAAO;QACP,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;QACrC,QAAQ;QACR,OAAO,EAAE,OAAO,IAAI,OAAO,KAAK,eAAe,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KACnF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAK,GAAG,GAAG;IAC/C,yCAAyC;IACzC,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/vision.ts — Image and video understanding.
|
|
3
|
+
*
|
|
4
|
+
* Image analysis: Delivered to the active Claude Code session via iTerm2.
|
|
5
|
+
* The image is written to a temp file, and the path is typed into the session
|
|
6
|
+
* so Claude's built-in Read tool can analyze it. Covered by Max plan.
|
|
7
|
+
*
|
|
8
|
+
* Video analysis: Google Gemini 2.0 Flash REST API (free tier: 15 RPM, 1M tokens/day).
|
|
9
|
+
* Only model with native video understanding — no frame extraction needed.
|
|
10
|
+
*
|
|
11
|
+
* Requires GEMINI_API_KEY for video analysis (free tier available).
|
|
12
|
+
*/
|
|
13
|
+
interface SaveImageResult {
|
|
14
|
+
path: string;
|
|
15
|
+
sizeBytes: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Save a received image to disk and return the path.
|
|
19
|
+
* The path can be typed into an active Claude Code session for analysis.
|
|
20
|
+
*/
|
|
21
|
+
export declare function saveReceivedImage(imageBuffer: Buffer, mimetype?: string): SaveImageResult;
|
|
22
|
+
/**
|
|
23
|
+
* Save a received video to disk and return the path.
|
|
24
|
+
*/
|
|
25
|
+
export declare function saveReceivedVideo(videoBuffer: Buffer, mimetype?: string): SaveImageResult;
|
|
26
|
+
interface AnalyzeVideoOptions {
|
|
27
|
+
videoBuffer: Buffer;
|
|
28
|
+
mimetype?: string;
|
|
29
|
+
prompt?: string;
|
|
30
|
+
model?: string;
|
|
31
|
+
}
|
|
32
|
+
interface AnalyzeResult {
|
|
33
|
+
text: string;
|
|
34
|
+
model: string;
|
|
35
|
+
durationMs: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Analyze a video using Gemini's native video understanding.
|
|
39
|
+
* Free tier: 15 requests/minute, 1M tokens/day.
|
|
40
|
+
*
|
|
41
|
+
* Used as a fallback when no active Claude Code session is available,
|
|
42
|
+
* or for direct video analysis requests.
|
|
43
|
+
*/
|
|
44
|
+
export declare function analyzeVideo(opts: AnalyzeVideoOptions): Promise<AnalyzeResult>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=vision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/daemon/vision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CAQzF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,eAAe,CAQzF;AAOD,UAAU,mBAAmB;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiEpF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon/vision.ts — Image and video understanding.
|
|
3
|
+
*
|
|
4
|
+
* Image analysis: Delivered to the active Claude Code session via iTerm2.
|
|
5
|
+
* The image is written to a temp file, and the path is typed into the session
|
|
6
|
+
* so Claude's built-in Read tool can analyze it. Covered by Max plan.
|
|
7
|
+
*
|
|
8
|
+
* Video analysis: Google Gemini 2.0 Flash REST API (free tier: 15 RPM, 1M tokens/day).
|
|
9
|
+
* Only model with native video understanding — no frame extraction needed.
|
|
10
|
+
*
|
|
11
|
+
* Requires GEMINI_API_KEY for video analysis (free tier available).
|
|
12
|
+
*/
|
|
13
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
14
|
+
import { homedir } from "node:os";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { log } from "../core/log.js";
|
|
17
|
+
/** Directory for received media files. */
|
|
18
|
+
const MEDIA_DIR = join(homedir(), ".aibroker", "media");
|
|
19
|
+
/**
|
|
20
|
+
* Save a received image to disk and return the path.
|
|
21
|
+
* The path can be typed into an active Claude Code session for analysis.
|
|
22
|
+
*/
|
|
23
|
+
export function saveReceivedImage(imageBuffer, mimetype) {
|
|
24
|
+
mkdirSync(MEDIA_DIR, { recursive: true });
|
|
25
|
+
const ext = mimeToExt(mimetype ?? "image/png");
|
|
26
|
+
const filename = `img-${Date.now()}.${ext}`;
|
|
27
|
+
const path = join(MEDIA_DIR, filename);
|
|
28
|
+
writeFileSync(path, imageBuffer);
|
|
29
|
+
log(`Vision: saved image (${imageBuffer.length} bytes) to ${path}`);
|
|
30
|
+
return { path, sizeBytes: imageBuffer.length };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Save a received video to disk and return the path.
|
|
34
|
+
*/
|
|
35
|
+
export function saveReceivedVideo(videoBuffer, mimetype) {
|
|
36
|
+
mkdirSync(MEDIA_DIR, { recursive: true });
|
|
37
|
+
const ext = mimeToExt(mimetype ?? "video/mp4");
|
|
38
|
+
const filename = `vid-${Date.now()}.${ext}`;
|
|
39
|
+
const path = join(MEDIA_DIR, filename);
|
|
40
|
+
writeFileSync(path, videoBuffer);
|
|
41
|
+
log(`Vision: saved video (${videoBuffer.length} bytes) to ${path}`);
|
|
42
|
+
return { path, sizeBytes: videoBuffer.length };
|
|
43
|
+
}
|
|
44
|
+
// ── Video Analysis (Gemini 2.0 Flash — free tier) ──
|
|
45
|
+
const GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta";
|
|
46
|
+
const DEFAULT_VIDEO_MODEL = "gemini-2.0-flash";
|
|
47
|
+
/**
|
|
48
|
+
* Analyze a video using Gemini's native video understanding.
|
|
49
|
+
* Free tier: 15 requests/minute, 1M tokens/day.
|
|
50
|
+
*
|
|
51
|
+
* Used as a fallback when no active Claude Code session is available,
|
|
52
|
+
* or for direct video analysis requests.
|
|
53
|
+
*/
|
|
54
|
+
export async function analyzeVideo(opts) {
|
|
55
|
+
const apiKey = process.env.GEMINI_API_KEY;
|
|
56
|
+
if (!apiKey) {
|
|
57
|
+
throw new Error("GEMINI_API_KEY not set. Get a free key at https://aistudio.google.com/app/apikey");
|
|
58
|
+
}
|
|
59
|
+
const model = opts.model ?? DEFAULT_VIDEO_MODEL;
|
|
60
|
+
const mimetype = opts.mimetype ?? "video/mp4";
|
|
61
|
+
const prompt = opts.prompt ?? "Describe what is happening in this video.";
|
|
62
|
+
const startMs = Date.now();
|
|
63
|
+
const sizeBytes = opts.videoBuffer.length;
|
|
64
|
+
log(`Vision: analyzing video (${sizeBytes} bytes, ${mimetype}) with ${model}`);
|
|
65
|
+
let fileUri;
|
|
66
|
+
if (sizeBytes > 20 * 1024 * 1024) {
|
|
67
|
+
fileUri = await uploadToGeminiFileApi(opts.videoBuffer, mimetype, apiKey);
|
|
68
|
+
}
|
|
69
|
+
const parts = [];
|
|
70
|
+
if (fileUri) {
|
|
71
|
+
parts.push({
|
|
72
|
+
fileData: { mimeType: mimetype, fileUri },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
parts.push({
|
|
77
|
+
inlineData: { mimeType: mimetype, data: opts.videoBuffer.toString("base64") },
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
parts.push({ text: prompt });
|
|
81
|
+
const generateUrl = `${GEMINI_API_URL}/models/${model}:generateContent?key=${apiKey}`;
|
|
82
|
+
const res = await fetch(generateUrl, {
|
|
83
|
+
method: "POST",
|
|
84
|
+
headers: { "Content-Type": "application/json" },
|
|
85
|
+
body: JSON.stringify({
|
|
86
|
+
contents: [{ parts }],
|
|
87
|
+
generationConfig: { maxOutputTokens: 1024 },
|
|
88
|
+
}),
|
|
89
|
+
});
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
const errText = await res.text();
|
|
92
|
+
throw new Error(`Gemini API error (${res.status}): ${errText}`);
|
|
93
|
+
}
|
|
94
|
+
const data = await res.json();
|
|
95
|
+
const text = data.candidates?.[0]?.content?.parts
|
|
96
|
+
?.filter((p) => p.text)
|
|
97
|
+
.map((p) => p.text)
|
|
98
|
+
.join("\n") ?? "";
|
|
99
|
+
const durationMs = Date.now() - startMs;
|
|
100
|
+
log(`Vision: video analysis completed in ${durationMs}ms`);
|
|
101
|
+
return { text, model, durationMs };
|
|
102
|
+
}
|
|
103
|
+
async function uploadToGeminiFileApi(buffer, mimetype, apiKey) {
|
|
104
|
+
const startUrl = `https://generativelanguage.googleapis.com/upload/v1beta/files?key=${apiKey}`;
|
|
105
|
+
const startRes = await fetch(startUrl, {
|
|
106
|
+
method: "POST",
|
|
107
|
+
headers: {
|
|
108
|
+
"Content-Type": "application/json",
|
|
109
|
+
"X-Goog-Upload-Protocol": "resumable",
|
|
110
|
+
"X-Goog-Upload-Command": "start",
|
|
111
|
+
"X-Goog-Upload-Header-Content-Length": String(buffer.length),
|
|
112
|
+
"X-Goog-Upload-Header-Content-Type": mimetype,
|
|
113
|
+
},
|
|
114
|
+
body: JSON.stringify({
|
|
115
|
+
file: { displayName: `aibroker-upload-${Date.now()}` },
|
|
116
|
+
}),
|
|
117
|
+
});
|
|
118
|
+
if (!startRes.ok) {
|
|
119
|
+
throw new Error(`Gemini File API start failed (${startRes.status}): ${await startRes.text()}`);
|
|
120
|
+
}
|
|
121
|
+
const uploadUrl = startRes.headers.get("X-Goog-Upload-URL");
|
|
122
|
+
if (!uploadUrl) {
|
|
123
|
+
throw new Error("Gemini File API did not return an upload URL");
|
|
124
|
+
}
|
|
125
|
+
const uploadRes = await fetch(uploadUrl, {
|
|
126
|
+
method: "PUT",
|
|
127
|
+
headers: {
|
|
128
|
+
"Content-Length": String(buffer.length),
|
|
129
|
+
"X-Goog-Upload-Offset": "0",
|
|
130
|
+
"X-Goog-Upload-Command": "upload, finalize",
|
|
131
|
+
},
|
|
132
|
+
body: buffer,
|
|
133
|
+
});
|
|
134
|
+
if (!uploadRes.ok) {
|
|
135
|
+
throw new Error(`Gemini File API upload failed (${uploadRes.status}): ${await uploadRes.text()}`);
|
|
136
|
+
}
|
|
137
|
+
const fileData = await uploadRes.json();
|
|
138
|
+
const uri = fileData.file?.uri;
|
|
139
|
+
if (!uri) {
|
|
140
|
+
throw new Error("Gemini File API did not return a file URI");
|
|
141
|
+
}
|
|
142
|
+
if (fileData.file?.state === "PROCESSING") {
|
|
143
|
+
await waitForGeminiFile(uri, apiKey);
|
|
144
|
+
}
|
|
145
|
+
return uri;
|
|
146
|
+
}
|
|
147
|
+
async function waitForGeminiFile(uri, apiKey, maxWaitMs = 120_000) {
|
|
148
|
+
const startMs = Date.now();
|
|
149
|
+
while (Date.now() - startMs < maxWaitMs) {
|
|
150
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
151
|
+
const res = await fetch(`${uri}?key=${apiKey}`);
|
|
152
|
+
if (!res.ok)
|
|
153
|
+
continue;
|
|
154
|
+
const data = await res.json();
|
|
155
|
+
if (data.state === "ACTIVE")
|
|
156
|
+
return;
|
|
157
|
+
if (data.state === "FAILED")
|
|
158
|
+
throw new Error("Gemini file processing failed");
|
|
159
|
+
}
|
|
160
|
+
throw new Error(`Gemini file processing timed out after ${maxWaitMs}ms`);
|
|
161
|
+
}
|
|
162
|
+
// ── Helpers ──
|
|
163
|
+
function mimeToExt(mime) {
|
|
164
|
+
const map = {
|
|
165
|
+
"image/png": "png",
|
|
166
|
+
"image/jpeg": "jpg",
|
|
167
|
+
"image/gif": "gif",
|
|
168
|
+
"image/webp": "webp",
|
|
169
|
+
"image/svg+xml": "svg",
|
|
170
|
+
"video/mp4": "mp4",
|
|
171
|
+
"video/webm": "webm",
|
|
172
|
+
"video/quicktime": "mov",
|
|
173
|
+
};
|
|
174
|
+
return map[mime] ?? "bin";
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=vision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/daemon/vision.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,9 +28,11 @@ export type { HybridSession, SessionKind } from "./core/hybrid.js";
|
|
|
28
28
|
export { WatcherClient } from "./ipc/client.js";
|
|
29
29
|
export { IpcServer } from "./ipc/server.js";
|
|
30
30
|
export type { IpcHandler } from "./ipc/server.js";
|
|
31
|
+
export { validateAdapterHealth, validateSessionList, validateHubStatus, validateTtsResult, validateTranscription, } from "./ipc/validate.js";
|
|
32
|
+
export type { ValidatedSession, ValidatedHubStatus, ValidatedTtsResult, ValidatedTranscription, } from "./ipc/validate.js";
|
|
31
33
|
export { runAppleScript, stripItermPrefix, withSessionAppleScript, sendKeystrokeToSession, sendEscapeSequenceToSession, typeIntoSession, pasteTextIntoSession, findClaudeSession, isClaudeRunningInSession, isItermRunning, isItermSessionAlive, isScreenLocked, writeToTty, snapshotAllSessions, } from "./adapters/iterm/core.js";
|
|
32
34
|
export type { SessionSnapshot } from "./adapters/iterm/core.js";
|
|
33
|
-
export { setItermSessionVar, setItermTabName, getItermSessionVar, findItermSessionForTermId, listClaudeSessions, getSessionList, createClaudeSession, createTerminalTab, restartSession, killSession, } from "./adapters/iterm/sessions.js";
|
|
35
|
+
export { setItermSessionVar, setItermTabName, setItermBadge, getItermSessionVar, findItermSessionForTermId, listClaudeSessions, getSessionList, createClaudeSession, createTerminalTab, restartSession, killSession, } from "./adapters/iterm/sessions.js";
|
|
34
36
|
export { recordFromMic, transcribeLocalAudio, WHISPER_BIN as DICTATION_WHISPER_BIN, WHISPER_MODEL as DICTATION_WHISPER_MODEL, } from "./adapters/iterm/dictation.js";
|
|
35
37
|
export { textToVoiceNote, speakLocally, listVoices } from "./adapters/kokoro/tts.js";
|
|
36
38
|
export type { KokoroVoice } from "./adapters/kokoro/tts.js";
|
|
@@ -40,6 +42,9 @@ export { SessionBackend } from "./adapters/session/backend.js";
|
|
|
40
42
|
export { APIBackend } from "./backend/api.js";
|
|
41
43
|
export type { APISession, SessionStatus, SessionState } from "./backend/api.js";
|
|
42
44
|
export { startDaemon, DAEMON_SOCKET_PATH } from "./daemon/index.js";
|
|
45
|
+
export type { CommandContext } from "./daemon/command-context.js";
|
|
46
|
+
export { createHubCommandHandler } from "./daemon/commands.js";
|
|
47
|
+
export { handleScreenshot } from "./daemon/screenshot.js";
|
|
43
48
|
export { AdapterRegistry } from "./daemon/adapter-registry.js";
|
|
44
49
|
export type { AdapterDescriptor } from "./daemon/adapter-registry.js";
|
|
45
50
|
export { listPaiProjects, findPaiProject, launchPaiProject, getEffectiveConfig, invalidatePaiProjectCache, } from "./daemon/pai-projects.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,SAAS,EACT,SAAS,EACT,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzF,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -27,9 +27,10 @@ export { HybridSessionManager, hybridManager, setHybridManager } from "./core/hy
|
|
|
27
27
|
// ── IPC ──
|
|
28
28
|
export { WatcherClient } from "./ipc/client.js";
|
|
29
29
|
export { IpcServer } from "./ipc/server.js";
|
|
30
|
+
export { validateAdapterHealth, validateSessionList, validateHubStatus, validateTtsResult, validateTranscription, } from "./ipc/validate.js";
|
|
30
31
|
// ── Adapters > iTerm2 ──
|
|
31
32
|
export { runAppleScript, stripItermPrefix, withSessionAppleScript, sendKeystrokeToSession, sendEscapeSequenceToSession, typeIntoSession, pasteTextIntoSession, findClaudeSession, isClaudeRunningInSession, isItermRunning, isItermSessionAlive, isScreenLocked, writeToTty, snapshotAllSessions, } from "./adapters/iterm/core.js";
|
|
32
|
-
export { setItermSessionVar, setItermTabName, getItermSessionVar, findItermSessionForTermId, listClaudeSessions, getSessionList, createClaudeSession, createTerminalTab, restartSession, killSession, } from "./adapters/iterm/sessions.js";
|
|
33
|
+
export { setItermSessionVar, setItermTabName, setItermBadge, getItermSessionVar, findItermSessionForTermId, listClaudeSessions, getSessionList, createClaudeSession, createTerminalTab, restartSession, killSession, } from "./adapters/iterm/sessions.js";
|
|
33
34
|
export { recordFromMic, transcribeLocalAudio, WHISPER_BIN as DICTATION_WHISPER_BIN, WHISPER_MODEL as DICTATION_WHISPER_MODEL, } from "./adapters/iterm/dictation.js";
|
|
34
35
|
// ── Adapters > Kokoro TTS ──
|
|
35
36
|
export { textToVoiceNote, speakLocally, listVoices } from "./adapters/kokoro/tts.js";
|
|
@@ -42,6 +43,8 @@ export { SessionBackend } from "./adapters/session/backend.js";
|
|
|
42
43
|
export { APIBackend } from "./backend/api.js";
|
|
43
44
|
// ── Daemon ──
|
|
44
45
|
export { startDaemon, DAEMON_SOCKET_PATH } from "./daemon/index.js";
|
|
46
|
+
export { createHubCommandHandler } from "./daemon/commands.js";
|
|
47
|
+
export { handleScreenshot } from "./daemon/screenshot.js";
|
|
45
48
|
export { AdapterRegistry } from "./daemon/adapter-registry.js";
|
|
46
49
|
export { listPaiProjects, findPaiProject, launchPaiProject, getEffectiveConfig, invalidatePaiProjectCache, } from "./daemon/pai-projects.js";
|
|
47
50
|
export { createBrokerMessage } from "./types/broker.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,cAAc;AACd,cAAc,kBAAkB,CAAC;AAEjC,aAAa;AACb,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACtG,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,SAAS,EACT,SAAS,EACT,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzF,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ipc/validate.ts — Runtime validation for IPC responses.
|
|
3
|
+
*
|
|
4
|
+
* IPC calls return Record<string, unknown>. These helpers validate
|
|
5
|
+
* the shape at the system boundary so consumers get typed data
|
|
6
|
+
* instead of unsafe casts.
|
|
7
|
+
*/
|
|
8
|
+
import type { AdapterHealth } from "../types/adapter.js";
|
|
9
|
+
/**
|
|
10
|
+
* Validate and coerce an IPC response into a typed AdapterHealth.
|
|
11
|
+
* Returns a degraded health object if the response shape is wrong.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateAdapterHealth(raw: unknown): AdapterHealth;
|
|
14
|
+
export interface ValidatedSession {
|
|
15
|
+
index: number;
|
|
16
|
+
name: string;
|
|
17
|
+
kind: string;
|
|
18
|
+
active: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a sessions IPC response.
|
|
22
|
+
* Expects { sessions: Array<{ index, name, kind, active }> }.
|
|
23
|
+
*/
|
|
24
|
+
export declare function validateSessionList(raw: unknown): ValidatedSession[];
|
|
25
|
+
export interface ValidatedHubStatus {
|
|
26
|
+
version: string;
|
|
27
|
+
adapters: string[];
|
|
28
|
+
activeSessions: number;
|
|
29
|
+
activeSession: string | null;
|
|
30
|
+
adapterHealth: Record<string, AdapterHealth>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate a hub status IPC response.
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateHubStatus(raw: unknown): ValidatedHubStatus;
|
|
36
|
+
export interface ValidatedTtsResult {
|
|
37
|
+
generated: boolean;
|
|
38
|
+
voice: string;
|
|
39
|
+
bytes: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validate a TTS IPC response.
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateTtsResult(raw: unknown): ValidatedTtsResult;
|
|
45
|
+
export interface ValidatedTranscription {
|
|
46
|
+
text: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate a transcription IPC response.
|
|
50
|
+
*/
|
|
51
|
+
export declare function validateTranscription(raw: unknown): ValidatedTranscription;
|
|
52
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/ipc/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAgClF;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAiCjE;AAID,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,EAAE,CAapE;AAID,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CAuBlE;AAID,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,kBAAkB,CASlE;AAID,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAG1E"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ipc/validate.ts — Runtime validation for IPC responses.
|
|
3
|
+
*
|
|
4
|
+
* IPC calls return Record<string, unknown>. These helpers validate
|
|
5
|
+
* the shape at the system boundary so consumers get typed data
|
|
6
|
+
* instead of unsafe casts.
|
|
7
|
+
*/
|
|
8
|
+
// ── Generic Helpers ──
|
|
9
|
+
/** Assert a value is a non-null object. */
|
|
10
|
+
function isObject(v) {
|
|
11
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
12
|
+
}
|
|
13
|
+
/** Pick a string field or return a default. */
|
|
14
|
+
function str(obj, key, fallback) {
|
|
15
|
+
const v = obj[key];
|
|
16
|
+
return typeof v === "string" ? v : fallback;
|
|
17
|
+
}
|
|
18
|
+
/** Pick a number field or return a default. */
|
|
19
|
+
function num(obj, key, fallback) {
|
|
20
|
+
const v = obj[key];
|
|
21
|
+
return typeof v === "number" ? v : fallback;
|
|
22
|
+
}
|
|
23
|
+
/** Pick a boolean field or return a default. */
|
|
24
|
+
function bool(obj, key, fallback) {
|
|
25
|
+
const v = obj[key];
|
|
26
|
+
return typeof v === "boolean" ? v : fallback;
|
|
27
|
+
}
|
|
28
|
+
// ── AdapterHealth ──
|
|
29
|
+
const VALID_STATUSES = new Set(["ok", "degraded", "down"]);
|
|
30
|
+
const VALID_CONN = new Set(["connected", "connecting", "disconnected", "error"]);
|
|
31
|
+
/**
|
|
32
|
+
* Validate and coerce an IPC response into a typed AdapterHealth.
|
|
33
|
+
* Returns a degraded health object if the response shape is wrong.
|
|
34
|
+
*/
|
|
35
|
+
export function validateAdapterHealth(raw) {
|
|
36
|
+
if (!isObject(raw)) {
|
|
37
|
+
return {
|
|
38
|
+
status: "down",
|
|
39
|
+
connectionStatus: "disconnected",
|
|
40
|
+
stats: { messagesReceived: 0, messagesSent: 0, errors: 0 },
|
|
41
|
+
lastMessageAgo: null,
|
|
42
|
+
detail: `Invalid health response: expected object, got ${typeof raw}`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const statusRaw = str(raw, "status", "down");
|
|
46
|
+
const status = VALID_STATUSES.has(statusRaw) ? statusRaw : "down";
|
|
47
|
+
const connRaw = str(raw, "connectionStatus", "disconnected");
|
|
48
|
+
const connectionStatus = VALID_CONN.has(connRaw) ? connRaw : "disconnected";
|
|
49
|
+
const statsRaw = raw.stats;
|
|
50
|
+
let stats;
|
|
51
|
+
if (isObject(statsRaw)) {
|
|
52
|
+
stats = {
|
|
53
|
+
messagesReceived: num(statsRaw, "messagesReceived", 0),
|
|
54
|
+
messagesSent: num(statsRaw, "messagesSent", 0),
|
|
55
|
+
errors: num(statsRaw, "errors", 0),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
stats = { messagesReceived: 0, messagesSent: 0, errors: 0 };
|
|
60
|
+
}
|
|
61
|
+
const lastMessageAgo = typeof raw.lastMessageAgo === "number" ? raw.lastMessageAgo : null;
|
|
62
|
+
const detail = typeof raw.detail === "string" ? raw.detail : undefined;
|
|
63
|
+
return { status, connectionStatus, stats, lastMessageAgo, detail };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validate a sessions IPC response.
|
|
67
|
+
* Expects { sessions: Array<{ index, name, kind, active }> }.
|
|
68
|
+
*/
|
|
69
|
+
export function validateSessionList(raw) {
|
|
70
|
+
if (!isObject(raw))
|
|
71
|
+
return [];
|
|
72
|
+
const sessions = raw.sessions;
|
|
73
|
+
if (!Array.isArray(sessions))
|
|
74
|
+
return [];
|
|
75
|
+
return sessions
|
|
76
|
+
.filter(isObject)
|
|
77
|
+
.map((s) => ({
|
|
78
|
+
index: num(s, "index", 0),
|
|
79
|
+
name: str(s, "name", "unknown"),
|
|
80
|
+
kind: str(s, "kind", "unknown"),
|
|
81
|
+
active: bool(s, "active", false),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Validate a hub status IPC response.
|
|
86
|
+
*/
|
|
87
|
+
export function validateHubStatus(raw) {
|
|
88
|
+
if (!isObject(raw)) {
|
|
89
|
+
return { version: "unknown", adapters: [], activeSessions: 0, activeSession: null, adapterHealth: {} };
|
|
90
|
+
}
|
|
91
|
+
const adapters = Array.isArray(raw.adapters)
|
|
92
|
+
? raw.adapters.filter((a) => typeof a === "string")
|
|
93
|
+
: [];
|
|
94
|
+
const adapterHealth = {};
|
|
95
|
+
if (isObject(raw.adapterHealth)) {
|
|
96
|
+
for (const [name, h] of Object.entries(raw.adapterHealth)) {
|
|
97
|
+
adapterHealth[name] = validateAdapterHealth(h);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
version: str(raw, "version", "unknown"),
|
|
102
|
+
adapters,
|
|
103
|
+
activeSessions: num(raw, "activeSessions", 0),
|
|
104
|
+
activeSession: typeof raw.activeSession === "string" ? raw.activeSession : null,
|
|
105
|
+
adapterHealth,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Validate a TTS IPC response.
|
|
110
|
+
*/
|
|
111
|
+
export function validateTtsResult(raw) {
|
|
112
|
+
if (!isObject(raw)) {
|
|
113
|
+
return { generated: false, voice: "unknown", bytes: 0 };
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
generated: bool(raw, "generated", false),
|
|
117
|
+
voice: str(raw, "voice", "unknown"),
|
|
118
|
+
bytes: num(raw, "bytes", 0),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Validate a transcription IPC response.
|
|
123
|
+
*/
|
|
124
|
+
export function validateTranscription(raw) {
|
|
125
|
+
if (!isObject(raw))
|
|
126
|
+
return { text: "" };
|
|
127
|
+
return { text: str(raw, "text", "") };
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/ipc/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* mcp/index.ts — AIBroker unified MCP server.
|
|
4
|
+
*
|
|
5
|
+
* Single MCP entry point replacing individual Whazaa and Telex MCP servers.
|
|
6
|
+
* Connects to the AIBroker hub daemon at /tmp/aibroker.sock and forwards
|
|
7
|
+
* all tool calls through the hub to the appropriate adapter.
|
|
8
|
+
*
|
|
9
|
+
* Tool groups:
|
|
10
|
+
* - aibroker_* (17) — hub-level: status, sessions, TTS, dictation, image gen, session orchestration
|
|
11
|
+
* - whatsapp_* (11) — proxied to whazaa adapter via adapter_call
|
|
12
|
+
* - telegram_* (11) — proxied to telex adapter via adapter_call
|
|
13
|
+
* - pailot_* (3) — direct hub calls for PAILot mobile app
|
|
14
|
+
*
|
|
15
|
+
* Usage in ~/.claude.json:
|
|
16
|
+
* "aibroker": {
|
|
17
|
+
* "type": "stdio",
|
|
18
|
+
* "command": "node",
|
|
19
|
+
* "args": ["/Users/i052341/dev/ai/AIBroker/dist/mcp/index.js"]
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|