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.
Files changed (66) hide show
  1. package/dist/acp/acp-agent.js +17 -3
  2. package/dist/acp/acp-agent.js.map +1 -1
  3. package/dist/acp/approvals.js +11 -0
  4. package/dist/acp/approvals.js.map +1 -1
  5. package/dist/acp/meta/daemon.d.ts +12 -0
  6. package/dist/acp/meta/daemon.js +16 -0
  7. package/dist/acp/meta/daemon.js.map +1 -0
  8. package/dist/acp/meta/origin.d.ts +8 -0
  9. package/dist/acp/meta/origin.js +38 -0
  10. package/dist/acp/meta/origin.js.map +1 -0
  11. package/dist/acp/sessions/store.d.ts +6 -0
  12. package/dist/acp/sessions/store.js.map +1 -1
  13. package/dist/cli.js +78 -26
  14. package/dist/cli.js.map +1 -1
  15. package/dist/configure/app.js +1 -0
  16. package/dist/configure/app.js.map +1 -1
  17. package/dist/core/config.d.ts +29 -0
  18. package/dist/core/config.js +32 -0
  19. package/dist/core/config.js.map +1 -1
  20. package/dist/core/index.d.ts +7 -0
  21. package/dist/core/index.js +2 -1
  22. package/dist/core/index.js.map +1 -1
  23. package/dist/core/mcp/manager.d.ts +15 -0
  24. package/dist/core/mcp/manager.js +28 -0
  25. package/dist/core/mcp/manager.js.map +1 -1
  26. package/dist/core/mcp/prefixed-mcp-tool.d.ts +1 -0
  27. package/dist/core/mcp/prefixed-mcp-tool.js +1 -1
  28. package/dist/core/mcp/prefixed-mcp-tool.js.map +1 -1
  29. package/dist/core/skills/built-in/hooman-config/SKILL.md +35 -3
  30. package/dist/daemon/acp-client.d.ts +49 -0
  31. package/dist/daemon/acp-client.js +130 -0
  32. package/dist/daemon/acp-client.js.map +1 -0
  33. package/dist/daemon/approvals.d.ts +9 -2
  34. package/dist/daemon/approvals.js +151 -6
  35. package/dist/daemon/approvals.js.map +1 -1
  36. package/dist/daemon/attachments.d.ts +9 -0
  37. package/dist/daemon/attachments.js +63 -0
  38. package/dist/daemon/attachments.js.map +1 -0
  39. package/dist/daemon/index.d.ts +16 -6
  40. package/dist/daemon/index.js +162 -71
  41. package/dist/daemon/index.js.map +1 -1
  42. package/dist/daemon/mcproxy/catalog.d.ts +17 -0
  43. package/dist/daemon/mcproxy/catalog.js +71 -0
  44. package/dist/daemon/mcproxy/catalog.js.map +1 -0
  45. package/dist/daemon/mcproxy/http-server.d.ts +15 -0
  46. package/dist/daemon/mcproxy/http-server.js +150 -0
  47. package/dist/daemon/mcproxy/http-server.js.map +1 -0
  48. package/dist/daemon/mcproxy/index.d.ts +23 -0
  49. package/dist/daemon/mcproxy/index.js +23 -0
  50. package/dist/daemon/mcproxy/index.js.map +1 -0
  51. package/dist/daemon/mcproxy/session.d.ts +9 -0
  52. package/dist/daemon/mcproxy/session.js +24 -0
  53. package/dist/daemon/mcproxy/session.js.map +1 -0
  54. package/dist/daemon/queue.d.ts +14 -5
  55. package/dist/daemon/queue.js +31 -33
  56. package/dist/daemon/queue.js.map +1 -1
  57. package/dist/daemon/session-registry.d.ts +66 -0
  58. package/dist/daemon/session-registry.js +198 -0
  59. package/dist/daemon/session-registry.js.map +1 -0
  60. package/dist/daemon/session-store.d.ts +20 -0
  61. package/dist/daemon/session-store.js +63 -0
  62. package/dist/daemon/session-store.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/daemon/questions.d.ts +0 -18
  65. package/dist/daemon/questions.js +0 -44
  66. 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 { HoomanToolApprovalIntervention } from "../core/approvals/intervention.js";
1
+ import type { RequestPermissionRequest, RequestPermissionResponse } from "@agentclientprotocol/sdk";
2
2
  import type { Manager as McpManager } from "../core/mcp/index.js";
3
- export declare function createDaemonApprovalIntervention(manager: McpManager): HoomanToolApprovalIntervention;
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>;
@@ -1,8 +1,153 @@
1
- import { createChannelPermissionAsk } from "../core/approvals/channel-ask.js";
2
- import { HoomanToolApprovalIntervention } from "../core/approvals/intervention.js";
3
- export function createDaemonApprovalIntervention(manager) {
4
- return new HoomanToolApprovalIntervention({
5
- ask: createChannelPermissionAsk(manager),
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":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAGnF,MAAM,UAAU,gCAAgC,CAAC,OAAmB;IAClE,OAAO,IAAI,8BAA8B,CAAC;QACxC,GAAG,EAAE,0BAA0B,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;AACL,CAAC"}
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"}
@@ -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 { resolveLlmMetadata } from "../core/utils/metadata.js";
4
- type RunDaemonOptions = {
5
- agent: Agent;
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
- metadata?: Awaited<ReturnType<typeof resolveLlmMetadata>>;
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 {};