hoomanjs 1.58.0 → 1.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/acp-agent.js +17 -3
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.js +11 -0
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/meta/daemon.d.ts +12 -0
- package/dist/acp/meta/daemon.js +16 -0
- package/dist/acp/meta/daemon.js.map +1 -0
- package/dist/acp/meta/origin.d.ts +8 -0
- package/dist/acp/meta/origin.js +38 -0
- package/dist/acp/meta/origin.js.map +1 -0
- package/dist/acp/sessions/store.d.ts +6 -0
- package/dist/acp/sessions/store.js.map +1 -1
- package/dist/cli.js +78 -26
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +1 -0
- package/dist/configure/app.js.map +1 -1
- package/dist/core/config.d.ts +29 -0
- package/dist/core/config.js +32 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +15 -0
- package/dist/core/mcp/manager.js +28 -0
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/mcp/prefixed-mcp-tool.d.ts +1 -0
- package/dist/core/mcp/prefixed-mcp-tool.js +1 -1
- package/dist/core/mcp/prefixed-mcp-tool.js.map +1 -1
- package/dist/core/skills/built-in/hooman-config/SKILL.md +35 -3
- package/dist/daemon/acp-client.d.ts +49 -0
- package/dist/daemon/acp-client.js +130 -0
- package/dist/daemon/acp-client.js.map +1 -0
- package/dist/daemon/approvals.d.ts +9 -2
- package/dist/daemon/approvals.js +151 -6
- package/dist/daemon/approvals.js.map +1 -1
- package/dist/daemon/attachments.d.ts +9 -0
- package/dist/daemon/attachments.js +63 -0
- package/dist/daemon/attachments.js.map +1 -0
- package/dist/daemon/index.d.ts +16 -6
- package/dist/daemon/index.js +162 -71
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/mcproxy/catalog.d.ts +17 -0
- package/dist/daemon/mcproxy/catalog.js +71 -0
- package/dist/daemon/mcproxy/catalog.js.map +1 -0
- package/dist/daemon/mcproxy/http-server.d.ts +15 -0
- package/dist/daemon/mcproxy/http-server.js +150 -0
- package/dist/daemon/mcproxy/http-server.js.map +1 -0
- package/dist/daemon/mcproxy/index.d.ts +23 -0
- package/dist/daemon/mcproxy/index.js +23 -0
- package/dist/daemon/mcproxy/index.js.map +1 -0
- package/dist/daemon/mcproxy/session.d.ts +9 -0
- package/dist/daemon/mcproxy/session.js +24 -0
- package/dist/daemon/mcproxy/session.js.map +1 -0
- package/dist/daemon/queue.d.ts +14 -5
- package/dist/daemon/queue.js +31 -33
- package/dist/daemon/queue.js.map +1 -1
- package/dist/daemon/session-registry.d.ts +66 -0
- package/dist/daemon/session-registry.js +198 -0
- package/dist/daemon/session-registry.js.map +1 -0
- package/dist/daemon/session-store.d.ts +20 -0
- package/dist/daemon/session-store.js +63 -0
- package/dist/daemon/session-store.js.map +1 -0
- package/package.json +1 -1
- package/dist/daemon/questions.d.ts +0 -18
- package/dist/daemon/questions.js +0 -44
- package/dist/daemon/questions.js.map +0 -1
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { Readable, Writable } from "node:stream";
|
|
3
|
+
import { client as buildClientApp, methods, ndJsonStream, PROTOCOL_VERSION, } from "@agentclientprotocol/sdk";
|
|
4
|
+
import { HOOMAN_X_DAEMON_ENV } from "../acp/meta/daemon.js";
|
|
5
|
+
/**
|
|
6
|
+
* Owns the single `hooman acp` child process the daemon multiplexes every
|
|
7
|
+
* ACP session over, and the ACP client-role connection to it. Lazily
|
|
8
|
+
* (re)spawns on first use and after an unexpected exit, so a crashed child is
|
|
9
|
+
* recovered on the next call rather than requiring a daemon restart.
|
|
10
|
+
*/
|
|
11
|
+
export class AcpDaemonClient {
|
|
12
|
+
options;
|
|
13
|
+
#child = null;
|
|
14
|
+
#connection = null;
|
|
15
|
+
#starting = null;
|
|
16
|
+
#agentInfo;
|
|
17
|
+
#closed = false;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.options = options;
|
|
20
|
+
}
|
|
21
|
+
get agentCapabilities() {
|
|
22
|
+
return this.#agentInfo?.agentCapabilities;
|
|
23
|
+
}
|
|
24
|
+
/** Ensures the child process + connection are up, spawning/reconnecting lazily if needed. */
|
|
25
|
+
async ensureStarted() {
|
|
26
|
+
if (this.#closed) {
|
|
27
|
+
throw new Error("ACP daemon client is closed.");
|
|
28
|
+
}
|
|
29
|
+
if (this.#starting) {
|
|
30
|
+
return this.#starting;
|
|
31
|
+
}
|
|
32
|
+
this.#starting = this.#start().catch((error) => {
|
|
33
|
+
this.#starting = null;
|
|
34
|
+
throw error;
|
|
35
|
+
});
|
|
36
|
+
return this.#starting;
|
|
37
|
+
}
|
|
38
|
+
async #start() {
|
|
39
|
+
const child = spawn(process.execPath, [this.options.cliPath, "acp"], {
|
|
40
|
+
cwd: this.options.cwd,
|
|
41
|
+
env: { ...process.env, [HOOMAN_X_DAEMON_ENV]: "true" },
|
|
42
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
43
|
+
});
|
|
44
|
+
this.#child = child;
|
|
45
|
+
let stderrBuffer = "";
|
|
46
|
+
child.stderr.on("data", (chunk) => {
|
|
47
|
+
stderrBuffer = `${stderrBuffer}${chunk.toString("utf8")}`;
|
|
48
|
+
const lines = stderrBuffer.split("\n");
|
|
49
|
+
stderrBuffer = lines.pop() ?? "";
|
|
50
|
+
for (const line of lines) {
|
|
51
|
+
if (line.trim()) {
|
|
52
|
+
this.options.onChildStderr?.(line);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
child.on("exit", () => {
|
|
57
|
+
this.#child = null;
|
|
58
|
+
this.#connection = null;
|
|
59
|
+
this.#starting = null;
|
|
60
|
+
this.#agentInfo = undefined;
|
|
61
|
+
});
|
|
62
|
+
const stream = ndJsonStream(Writable.toWeb(child.stdin), Readable.toWeb(child.stdout));
|
|
63
|
+
const clientApp = buildClientApp({ name: "hoomanjs-daemon" })
|
|
64
|
+
.onRequest(methods.client.session.requestPermission, (ctx) => this.options.onPermissionRequest(ctx.params.sessionId, ctx.params, ctx.signal))
|
|
65
|
+
.onNotification(methods.client.session.update, (ctx) => {
|
|
66
|
+
this.options.onSessionUpdate(ctx.params);
|
|
67
|
+
});
|
|
68
|
+
this.#connection = clientApp.connect(stream);
|
|
69
|
+
const agent = this.#connection.agent;
|
|
70
|
+
this.#agentInfo = await agent.request(methods.agent.initialize, {
|
|
71
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
72
|
+
clientCapabilities: {},
|
|
73
|
+
});
|
|
74
|
+
return agent;
|
|
75
|
+
}
|
|
76
|
+
async newSession(params) {
|
|
77
|
+
const agent = await this.ensureStarted();
|
|
78
|
+
return agent.request(methods.agent.session.new, {
|
|
79
|
+
cwd: params.cwd,
|
|
80
|
+
mcpServers: params.mcpServers,
|
|
81
|
+
...(params.meta ? { _meta: params.meta } : {}),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async resumeSession(params) {
|
|
85
|
+
const agent = await this.ensureStarted();
|
|
86
|
+
return agent.request(methods.agent.session.resume, {
|
|
87
|
+
sessionId: params.sessionId,
|
|
88
|
+
cwd: params.cwd,
|
|
89
|
+
mcpServers: params.mcpServers,
|
|
90
|
+
...(params.meta ? { _meta: params.meta } : {}),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async prompt(params) {
|
|
94
|
+
const agent = await this.ensureStarted();
|
|
95
|
+
return agent.request(methods.agent.session.prompt, {
|
|
96
|
+
sessionId: params.sessionId,
|
|
97
|
+
prompt: params.prompt,
|
|
98
|
+
...(params.meta ? { _meta: params.meta } : {}),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async closeSession(sessionId) {
|
|
102
|
+
const agent = await this.ensureStarted();
|
|
103
|
+
await agent.request(methods.agent.session.close, { sessionId });
|
|
104
|
+
}
|
|
105
|
+
/** Fire-and-forget per the ACP spec; a no-op when the connection is already gone. */
|
|
106
|
+
cancelSession(sessionId) {
|
|
107
|
+
if (!this.#connection) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
void this.#connection.agent
|
|
111
|
+
.notify(methods.agent.session.cancel, { sessionId })
|
|
112
|
+
.catch(() => undefined);
|
|
113
|
+
}
|
|
114
|
+
async setConfigOption(params) {
|
|
115
|
+
const agent = await this.ensureStarted();
|
|
116
|
+
return agent.request(methods.agent.session.setConfigOption, params);
|
|
117
|
+
}
|
|
118
|
+
/** Stops accepting work and terminates the child; safe to call more than once. */
|
|
119
|
+
async close() {
|
|
120
|
+
this.#closed = true;
|
|
121
|
+
this.#connection = null;
|
|
122
|
+
this.#starting = null;
|
|
123
|
+
const child = this.#child;
|
|
124
|
+
this.#child = null;
|
|
125
|
+
if (child && !child.killed) {
|
|
126
|
+
child.kill();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=acp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acp-client.js","sourceRoot":"","sources":["../../src/daemon/acp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { RequestPermissionRequest, RequestPermissionResponse } from "@agentclientprotocol/sdk";
|
|
2
2
|
import type { Manager as McpManager } from "../core/mcp/index.js";
|
|
3
|
-
|
|
3
|
+
import type { DaemonSessionRegistry } from "./session-registry.js";
|
|
4
|
+
/**
|
|
5
|
+
* Builds the daemon ACP client's `session/request_permission` handler,
|
|
6
|
+
* dispatching to the tool-approval or `ask_user` relay and always resolving
|
|
7
|
+
* to the originating upstream server the current turn's origin snapshot
|
|
8
|
+
* points at.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createDaemonPermissionHandler(manager: McpManager, registry: DaemonSessionRegistry): (sessionId: string, request: RequestPermissionRequest, signal: AbortSignal) => Promise<RequestPermissionResponse>;
|
package/dist/daemon/approvals.js
CHANGED
|
@@ -1,8 +1,153 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { ACP_ASK_USER_META_KEY } from "../acp/questions.js";
|
|
2
|
+
const TOOL_DESCRIPTION_PREVIEW_LIMIT = 64;
|
|
3
|
+
const TOOL_ARGS_PREVIEW_LIMIT = 200;
|
|
4
|
+
const CANCELLED = {
|
|
5
|
+
outcome: { outcome: "cancelled" },
|
|
6
|
+
};
|
|
7
|
+
function selected(optionId) {
|
|
8
|
+
return { outcome: { outcome: "selected", optionId } };
|
|
9
|
+
}
|
|
10
|
+
function pickOptionByKind(options, kind) {
|
|
11
|
+
return options.find((option) => option.kind === kind)?.optionId;
|
|
12
|
+
}
|
|
13
|
+
function truncate(text, max) {
|
|
14
|
+
return text.length > max ? `${text.slice(0, max)}…` : text;
|
|
15
|
+
}
|
|
16
|
+
function inputPreview(input) {
|
|
17
|
+
try {
|
|
18
|
+
return truncate(JSON.stringify(input) ?? "null", TOOL_ARGS_PREVIEW_LIMIT);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return truncate(String(input), TOOL_ARGS_PREVIEW_LIMIT);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Exact tool name and raw description the ACP server attaches to
|
|
26
|
+
* `session/request_permission` via `_meta` (see `src/acp/approvals.ts`), so
|
|
27
|
+
* the channel gets a minimal "tool name + description + input" message
|
|
28
|
+
* instead of the display `title` (which already folds them together for
|
|
29
|
+
* ACP UI clients). Falls back to `toolCall.title`/`toolCallId` only for
|
|
30
|
+
* non-conforming callers.
|
|
31
|
+
*/
|
|
32
|
+
function extractToolMeta(request) {
|
|
33
|
+
const meta = request._meta;
|
|
34
|
+
const metaName = meta?.["hoomanjs/tool_name"];
|
|
35
|
+
const metaDescription = meta?.["hoomanjs/tool_description"];
|
|
36
|
+
const name = typeof metaName === "string" && metaName.trim()
|
|
37
|
+
? metaName.trim()
|
|
38
|
+
: request.toolCall.title?.trim() || request.toolCall.toolCallId;
|
|
39
|
+
const description = typeof metaDescription === "string" ? metaDescription.trim() : "";
|
|
40
|
+
return {
|
|
41
|
+
name,
|
|
42
|
+
description: truncate(description, TOOL_DESCRIPTION_PREVIEW_LIMIT),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Relays a tool-approval `session/request_permission` to the exact upstream
|
|
47
|
+
* MCP server that originated the current turn's channel notification, over
|
|
48
|
+
* `hooman/channel/permission`. Unsupported/missing capability or origin
|
|
49
|
+
* safely denies via a `cancelled` outcome — never broadcasts to other
|
|
50
|
+
* upstream servers.
|
|
51
|
+
*/
|
|
52
|
+
async function relayToolApproval(manager, registry, sessionId, request, _signal) {
|
|
53
|
+
const origin = registry.originForAcpSession(sessionId);
|
|
54
|
+
if (!origin?.server) {
|
|
55
|
+
return CANCELLED;
|
|
56
|
+
}
|
|
57
|
+
const supported = await manager.supportsChannelPermission(origin.server);
|
|
58
|
+
if (!supported) {
|
|
59
|
+
return CANCELLED;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const { name, description } = extractToolMeta(request);
|
|
63
|
+
const behavior = await manager.requestChannelPermission(origin.server, {
|
|
64
|
+
requestId: crypto.randomUUID(),
|
|
65
|
+
tool: name,
|
|
66
|
+
description,
|
|
67
|
+
preview: inputPreview(request.toolCall.rawInput),
|
|
68
|
+
source: origin.source,
|
|
69
|
+
user: origin.user,
|
|
70
|
+
session: origin.session,
|
|
71
|
+
thread: origin.thread,
|
|
72
|
+
});
|
|
73
|
+
if (behavior === "allow_once") {
|
|
74
|
+
const optionId = pickOptionByKind(request.options, "allow_once");
|
|
75
|
+
return optionId ? selected(optionId) : CANCELLED;
|
|
76
|
+
}
|
|
77
|
+
if (behavior === "allow_always") {
|
|
78
|
+
const optionId = pickOptionByKind(request.options, "allow_always") ??
|
|
79
|
+
pickOptionByKind(request.options, "allow_once");
|
|
80
|
+
return optionId ? selected(optionId) : CANCELLED;
|
|
81
|
+
}
|
|
82
|
+
return CANCELLED;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return CANCELLED;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Relays an `ask_user` question (the same `session/request_permission`
|
|
90
|
+
* method, tagged with `_meta[ACP_ASK_USER_META_KEY]`) over
|
|
91
|
+
* `hooman/channel/ask`. Maps the channel's answer back to the offered
|
|
92
|
+
* `answer_N` option by matching its resolved label; free text that doesn't
|
|
93
|
+
* match an offered option is treated as a dismissal, matching how the ACP
|
|
94
|
+
* server-side `ask_user` backend itself only understands option IDs or
|
|
95
|
+
* dismissal.
|
|
96
|
+
*/
|
|
97
|
+
async function relayAskUser(manager, registry, sessionId, request, signal) {
|
|
98
|
+
const origin = registry.originForAcpSession(sessionId);
|
|
99
|
+
if (!origin?.server) {
|
|
100
|
+
return CANCELLED;
|
|
101
|
+
}
|
|
102
|
+
const supported = await manager.supportsChannelAsk(origin.server);
|
|
103
|
+
if (!supported) {
|
|
104
|
+
return CANCELLED;
|
|
105
|
+
}
|
|
106
|
+
const rawInput = request.toolCall.rawInput;
|
|
107
|
+
const question = typeof rawInput?.question === "string"
|
|
108
|
+
? rawInput.question
|
|
109
|
+
: request.toolCall.title?.trim() || "Question";
|
|
110
|
+
const options = Array.isArray(rawInput?.options)
|
|
111
|
+
? rawInput.options.filter((value) => typeof value === "string")
|
|
112
|
+
: [];
|
|
113
|
+
try {
|
|
114
|
+
const outcome = await manager.requestChannelAsk(origin.server, {
|
|
115
|
+
requestId: crypto.randomUUID(),
|
|
116
|
+
question,
|
|
117
|
+
options,
|
|
118
|
+
source: origin.source,
|
|
119
|
+
user: origin.user,
|
|
120
|
+
session: origin.session,
|
|
121
|
+
thread: origin.thread,
|
|
122
|
+
}, { signal });
|
|
123
|
+
if (outcome.kind === "dismissed") {
|
|
124
|
+
return CANCELLED;
|
|
125
|
+
}
|
|
126
|
+
const index = options.indexOf(outcome.answer);
|
|
127
|
+
if (index < 0) {
|
|
128
|
+
return CANCELLED;
|
|
129
|
+
}
|
|
130
|
+
const optionId = `answer_${index}`;
|
|
131
|
+
return request.options.some((option) => option.optionId === optionId)
|
|
132
|
+
? selected(optionId)
|
|
133
|
+
: CANCELLED;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return CANCELLED;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the daemon ACP client's `session/request_permission` handler,
|
|
141
|
+
* dispatching to the tool-approval or `ask_user` relay and always resolving
|
|
142
|
+
* to the originating upstream server the current turn's origin snapshot
|
|
143
|
+
* points at.
|
|
144
|
+
*/
|
|
145
|
+
export function createDaemonPermissionHandler(manager, registry) {
|
|
146
|
+
return (sessionId, request, signal) => {
|
|
147
|
+
const isAskUser = request._meta?.[ACP_ASK_USER_META_KEY] === true;
|
|
148
|
+
return isAskUser
|
|
149
|
+
? relayAskUser(manager, registry, sessionId, request, signal)
|
|
150
|
+
: relayToolApproval(manager, registry, sessionId, request, signal);
|
|
151
|
+
};
|
|
7
152
|
}
|
|
8
153
|
//# sourceMappingURL=approvals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/daemon/approvals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/daemon/approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ContentBlock } from "@agentclientprotocol/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Converts local channel attachment paths into ACP `session/prompt` content
|
|
4
|
+
* blocks: recognized image/audio files under the 1 MiB limit are embedded as
|
|
5
|
+
* base64 `image`/`audio` blocks, everything else (including oversized or
|
|
6
|
+
* unreadable files) is listed as a text block naming the local absolute
|
|
7
|
+
* path, since the ACP agent runs on the same machine and can read it itself.
|
|
8
|
+
*/
|
|
9
|
+
export declare function attachmentPathsToAcpBlocks(paths: readonly string[]): Promise<ContentBlock[]>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import { extname } from "node:path";
|
|
3
|
+
const MAX_ATTACHMENT_BYTES = 1024 * 1024;
|
|
4
|
+
const IMAGE_MIME_BY_EXT = {
|
|
5
|
+
".png": "image/png",
|
|
6
|
+
".jpg": "image/jpeg",
|
|
7
|
+
".jpeg": "image/jpeg",
|
|
8
|
+
".gif": "image/gif",
|
|
9
|
+
".webp": "image/webp",
|
|
10
|
+
};
|
|
11
|
+
const AUDIO_MIME_BY_EXT = {
|
|
12
|
+
".mp3": "audio/mpeg",
|
|
13
|
+
".wav": "audio/wav",
|
|
14
|
+
".ogg": "audio/ogg",
|
|
15
|
+
".m4a": "audio/mp4",
|
|
16
|
+
".flac": "audio/flac",
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Converts local channel attachment paths into ACP `session/prompt` content
|
|
20
|
+
* blocks: recognized image/audio files under the 1 MiB limit are embedded as
|
|
21
|
+
* base64 `image`/`audio` blocks, everything else (including oversized or
|
|
22
|
+
* unreadable files) is listed as a text block naming the local absolute
|
|
23
|
+
* path, since the ACP agent runs on the same machine and can read it itself.
|
|
24
|
+
*/
|
|
25
|
+
export async function attachmentPathsToAcpBlocks(paths) {
|
|
26
|
+
const blocks = [];
|
|
27
|
+
const textPaths = [];
|
|
28
|
+
for (const rawPath of paths) {
|
|
29
|
+
const path = rawPath.trim();
|
|
30
|
+
if (!path) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const ext = extname(path).toLowerCase();
|
|
34
|
+
const imageMime = IMAGE_MIME_BY_EXT[ext];
|
|
35
|
+
const audioMime = AUDIO_MIME_BY_EXT[ext];
|
|
36
|
+
if (!imageMime && !audioMime) {
|
|
37
|
+
textPaths.push(path);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const info = await stat(path);
|
|
42
|
+
if (!info.isFile() || info.size > MAX_ATTACHMENT_BYTES) {
|
|
43
|
+
textPaths.push(path);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const data = (await readFile(path)).toString("base64");
|
|
47
|
+
blocks.push(imageMime
|
|
48
|
+
? { type: "image", data, mimeType: imageMime }
|
|
49
|
+
: { type: "audio", data, mimeType: audioMime });
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
textPaths.push(path);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (textPaths.length > 0) {
|
|
56
|
+
blocks.push({
|
|
57
|
+
type: "text",
|
|
58
|
+
text: `Files uploaded:\n${textPaths.join("\n")}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return blocks;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/daemon/attachments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,MAAM,iBAAiB,GAA2B;IAChD,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF,MAAM,iBAAiB,GAA2B;IAChD,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;CACtB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAwB;IAExB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,oBAAoB,EAAE,CAAC;gBACvD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CACT,SAAS;gBACP,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE;gBAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAU,EAAE,CAClD,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,oBAAoB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/daemon/index.d.ts
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
|
-
import { type Agent } from "@strands-agents/sdk";
|
|
2
1
|
import type { Manager as McpManager } from "../core/mcp/index.js";
|
|
3
|
-
import {
|
|
4
|
-
type
|
|
5
|
-
|
|
2
|
+
import type { AcpDaemonClient } from "./acp-client.js";
|
|
3
|
+
import type { DaemonMcpProxyServer } from "./mcproxy/index.js";
|
|
4
|
+
import type { DaemonSessionRegistry } from "./session-registry.js";
|
|
5
|
+
export type DaemonCliOverrides = {
|
|
6
|
+
mode?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
effort?: string;
|
|
9
|
+
yolo?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type RunDaemonOptions = {
|
|
6
12
|
manager: McpManager;
|
|
7
|
-
|
|
13
|
+
acpClient: AcpDaemonClient;
|
|
14
|
+
registry: DaemonSessionRegistry;
|
|
15
|
+
mcpServer: DaemonMcpProxyServer;
|
|
16
|
+
cwd: string;
|
|
17
|
+
/** Fallback external-session component when a notification carries no `hooman/session`. */
|
|
8
18
|
session?: string;
|
|
19
|
+
cliOverrides: DaemonCliOverrides;
|
|
9
20
|
debug?: boolean;
|
|
10
21
|
};
|
|
11
22
|
export declare function main(options: RunDaemonOptions): Promise<void>;
|
|
12
|
-
export {};
|