agim-cli 1.2.96 → 1.2.98

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.
@@ -24,7 +24,11 @@ export declare const alwaysAllowGate: ApprovalGate;
24
24
  * this break a stuck model would burn the full
25
25
  * IMHUB_NATIVE_AGENT_MAX_ITER budget; stopping early saves cost AND
26
26
  * gives the user a much more actionable recap. */
27
- export type LoopFinishReason = FinishReason | 'max_iterations' | 'aborted' | 'stuck_loop';
27
+ /** - `off_track` (v1.2.98): goal-critic flagged the recent tool chain
28
+ * as semantically off-target for the user's prompt / active goal.
29
+ * Different from stuck_loop (mechanical repeat) — this catches the
30
+ * "different calls but still pointless" failure mode. */
31
+ export type LoopFinishReason = FinishReason | 'max_iterations' | 'aborted' | 'stuck_loop' | 'off_track';
28
32
  export interface AgentLoopInput {
29
33
  provider: LlmProvider;
30
34
  /** Optional system prompt prepended ONCE; never re-issued across
@@ -76,6 +80,18 @@ export interface AgentLoopInput {
76
80
  channelId: string;
77
81
  threadId: string;
78
82
  };
83
+ /** v1.2.98 — anchors handed to the goal-critic when it fires.
84
+ * `prompt` is the user's current-turn input string; `goalTitle` +
85
+ * `goalBody` come from goals.getActiveGoal for this thread (caller
86
+ * fetches once; loop just relays). Either may be empty — critic
87
+ * refuses to judge if both are. Leaving criticAnchor unset (or
88
+ * setting IMHUB_NATIVE_CRITIC=off) disables the critic for this
89
+ * invocation. */
90
+ criticAnchor?: {
91
+ prompt?: string;
92
+ goalTitle?: string;
93
+ goalBody?: string;
94
+ };
79
95
  /** Lifecycle hooks for caller-side observability (heartbeats, progress
80
96
  * push, custom logging). All hooks are best-effort: thrown errors are
81
97
  * swallowed so a faulty observer cannot break the loop. */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAEV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,QAAQ,EACR,eAAe,EACf,UAAU,EACV,OAAO,EACR,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAO5E;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,CAAA;AAE9B;;+BAE+B;AAC/B,eAAO,MAAM,eAAe,EAAE,YAAkC,CAAA;AAEhE;;;;;;;;;qDASqD;AACrD,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,gBAAgB,GAAG,SAAS,GAAG,YAAY,CAAA;AAEzF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,CAAA;IACrB;;iEAE6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;gCAC4B;IAC5B,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB;yCACqC;IACrC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB,sEAAsE;IACtE,UAAU,CAAC,EAAE,UAAU,CAAA;IAEvB;+DAC2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,qEAAqE;IACrE,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAE1E;4EACwE;IACxE,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,kDAAkD;IAClD,OAAO,CAAC,EAAE,YAAY,CAAA;IAEtB;gFAC4E;IAC5E,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,CAAA;IAED;;;;8BAI0B;IAC1B,OAAO,CAAC,EAAE;QACR,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IAED;;gEAE4D;IAC5D,KAAK,CAAC,EAAE;QACN;mDAC2C;QAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;QAC7C,0DAA0D;QAC1D,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAA;KAC/F,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,iEAAiE;IACjE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;IAC1B,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAA;IAChB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB;;sDAEkD;IAClD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B;;mEAE+D;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ;yCACqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,0EAA0E;IAC1E,KAAK,EAAE,QAAQ,CAAA;IACf,4BAA4B;IAC5B,YAAY,EAAE,gBAAgB,CAAA;IAC9B,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAiOlF"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"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"}
@@ -45,9 +45,17 @@
45
45
  // iteration vs spread evenly).
46
46
  import { logger as rootLogger } from '../logger.js';
47
47
  import { logInvocation } from '../audit-log.js';
48
+ import { runGoalCritic } from './goal-critic.js';
48
49
  const log = rootLogger.child({ component: 'agent-loop' });
49
50
  const DEFAULT_MAX_ITERATIONS = 20;
50
51
  const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 min — generous; signal usually fires first
52
+ // v1.2.98 — goal-critic firing schedule. Thresholds chosen empirically:
53
+ // fewer than 5 tool calls = not enough trail to judge; more often than
54
+ // every 5 tool calls = critic itself becomes too noisy. Per-turn cap
55
+ // of 2 keeps a runaway critic from compounding cost on a hot turn.
56
+ const CRITIC_MIN_TOOL_CALLS = 5;
57
+ const CRITIC_EVERY_N = 5;
58
+ const CRITIC_MAX_CALLS = 2;
51
59
  /** Default: skip approval entirely. The agent loop is safe-by-default
52
60
  * for tests and the introspection use case; production AgentAdapters
53
61
  * should pass a real gate. */
@@ -77,6 +85,8 @@ export async function runAgentLoop(input) {
77
85
  const history = input.messages.slice();
78
86
  const toolCalls = [];
79
87
  const usageAcc = {};
88
+ // v1.2.98 — goal-critic per-turn fire counter (capped at CRITIC_MAX_CALLS).
89
+ let criticCallsFired = 0;
80
90
  let iter = 0;
81
91
  for (; iter < maxIter; iter++) {
82
92
  if (signal.signal.aborted) {
@@ -257,6 +267,60 @@ export async function runAgentLoop(input) {
257
267
  };
258
268
  }
259
269
  }
270
+ // v1.2.98 — goal-critic check (semantic stuck-loop / off-track).
271
+ // Fires when:
272
+ // · caller supplied a criticAnchor (prompt or active goal)
273
+ // · we've executed at least MIN_TOOL_CALLS tool calls this turn
274
+ // · we haven't already fired the critic MAX_CRITIC_CALLS times
275
+ // · we're on a "trigger" mark (every CRITIC_EVERY_N tool calls)
276
+ // The critic itself decides whether to break (onTrack=false) or
277
+ // let the loop continue. It returns onTrack=true on errors so a
278
+ // provider hiccup never accidentally kills a working turn.
279
+ if (input.criticAnchor
280
+ && toolCalls.length >= CRITIC_MIN_TOOL_CALLS
281
+ && criticCallsFired < CRITIC_MAX_CALLS
282
+ && (toolCalls.length - CRITIC_MIN_TOOL_CALLS) % CRITIC_EVERY_N === 0) {
283
+ criticCallsFired += 1;
284
+ const recent = toolCalls.slice(-10);
285
+ const verdict = await runGoalCritic({
286
+ prompt: input.criticAnchor.prompt,
287
+ goalTitle: input.criticAnchor.goalTitle,
288
+ goalBody: input.criticAnchor.goalBody,
289
+ recentToolCalls: recent,
290
+ }, { signal: signal.signal });
291
+ log.info({
292
+ event: 'agent-loop.goal_critic_verdict',
293
+ iter,
294
+ totalToolCalls: toolCalls.length,
295
+ onTrack: verdict.onTrack,
296
+ reason: verdict.reason,
297
+ modelUsed: verdict.modelUsed,
298
+ });
299
+ if (!verdict.onTrack) {
300
+ log.warn({
301
+ event: 'agent-loop.off_track_detected',
302
+ iter,
303
+ reason: verdict.reason,
304
+ redirect: verdict.redirect,
305
+ }, `goal-critic flagged off-track at iter ${iter}: ${verdict.reason}`);
306
+ signal.cleanup();
307
+ return {
308
+ text: '',
309
+ iterations: iter + 1,
310
+ toolCalls,
311
+ usage: usageAcc,
312
+ finishReason: 'off_track',
313
+ // Smuggle the critic's reason + redirect into `error` so
314
+ // the native adapter can surface it verbatim in the recap
315
+ // without re-importing goal-critic. Yes, abusing `error`
316
+ // for non-error info is mildly ugly; alternative is adding
317
+ // a new field to AgentLoopResult — overkill for one knob.
318
+ error: verdict.redirect
319
+ ? `${verdict.reason} || redirect: ${verdict.redirect}`
320
+ : verdict.reason,
321
+ };
322
+ }
323
+ }
260
324
  }
261
325
  // Loop tail → next iteration calls provider with appended history.
262
326
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../../src/core/llm/agent-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type Server } from 'node:http';
2
+ export interface RpcContext {
3
+ platform: string;
4
+ channelId: string;
5
+ threadId: string;
6
+ userId: string;
7
+ }
8
+ interface TokenEntry {
9
+ ctx: RpcContext;
10
+ /** ms-epoch expiry. After this time the token is rejected. */
11
+ expiresAt: number;
12
+ /** Where the token was minted from — purely for diagnostic logs. */
13
+ origin: string;
14
+ }
15
+ /**
16
+ * Mint a new RPC token bound to a specific IM thread. Returns the hex
17
+ * token + the socket path subprocesses should connect to. Callers
18
+ * should pass these to spawn() via env so the child inherits them
19
+ * unconditionally (and not via argv — argv shows up in `ps`).
20
+ */
21
+ export declare function mintRpcToken(ctx: RpcContext, origin?: string): {
22
+ token: string;
23
+ socketPath: string;
24
+ expiresAt: number;
25
+ };
26
+ /** Revoke a token explicitly. Token registry is also pruned on a
27
+ * periodic sweep, so revoke is best-effort cleanup, not required. */
28
+ export declare function revokeRpcToken(token: string): void;
29
+ export declare function resolveSocketPath(): string;
30
+ /**
31
+ * Start the local RPC server on a Unix socket. Idempotent — repeated
32
+ * calls return the same handle. Best-effort: a failure to start (e.g.
33
+ * permission denied on the socket path) logs at warn and resolves to
34
+ * `null` so the rest of agim boots normally.
35
+ */
36
+ export declare function startRpcServer(): Promise<Server | null>;
37
+ /** Graceful shutdown — called on SIGTERM. */
38
+ export declare function stopRpcServer(): Promise<void>;
39
+ /** Internal-only — used by tests to snapshot token state. */
40
+ export declare function _peekTokensForTests(): Map<string, TokenEntry>;
41
+ export {};
42
+ //# sourceMappingURL=agim-rpc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agim-rpc-server.d.ts","sourceRoot":"","sources":["../../../src/core/llm/agim-rpc-server.ts"],"names":[],"mappings":"AAqCA,OAAO,EAA+E,KAAK,MAAM,EAAE,MAAM,WAAW,CAAA;AAcpH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,UAAU,CAAA;IACf,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAA;IACjB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;CACf;AA0BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,SAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAK9H;AAED;sEACsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAElD;AASD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAKD;;;;;GAKG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgC7D;AAED,6CAA6C;AAC7C,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAOnD;AA0HD,6DAA6D;AAC7D,wBAAgB,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAE7D"}
@@ -0,0 +1,283 @@
1
+ // agim-rpc-server — local RPC bridge for bgjob-spawned subprocesses.
2
+ //
3
+ // Why this exists (v1.2.97, borrowed from Hermes Agent's "Python script
4
+ // via RPC" pattern):
5
+ // When `native` faces a task that requires many similar tool calls
6
+ // (e.g. "fetch financial data for 50 stocks, write the result to a
7
+ // CSV, then email me"), running 50 mcp__imhub__* calls in a chat turn
8
+ // means 50 LLM round-trips and a real chance of hitting either the
9
+ // stuck-loop detector (v1.2.95) or the iteration cap. The right shape
10
+ // for that work is: the model writes ONE Python script, that script
11
+ // runs in a bgjob detached worker, and the worker calls back into
12
+ // agim's tool surface via local IPC. agim pays one round-trip
13
+ // instead of fifty.
14
+ //
15
+ // Surface (just enough):
16
+ // - POST {socket}/rpc/<toolName>
17
+ // - Header X-Agim-Rpc-Token: <hex>
18
+ // - Body { args: Record<string, unknown> }
19
+ // - Reply { ok: true, result } | { ok: false, error, status }
20
+ //
21
+ // Security model:
22
+ // - Unix-domain socket only (no TCP port; cannot be reached from a
23
+ // different host). File mode 0600 owned by the agim process user.
24
+ // - Per-process auth token, minted on demand and bound to a single
25
+ // RunContext (platform / channelId / threadId / userId). A subprocess
26
+ // that knows the token can ONLY drive that one IM thread — it
27
+ // cannot spam push_message into someone else's thread.
28
+ // - Tool whitelist hard-coded to read-only / write-safe imhub MCP
29
+ // tools. Operators can extend via IMHUB_RPC_ALLOWED_TOOLS env.
30
+ // native_exec / fs writes / call_agent / long_task are NOT exposed
31
+ // — the bgjob worker already has a shell, no need to indirect.
32
+ //
33
+ // Limits intentionally NOT in MVP:
34
+ // - Per-token rate limit (TODO when first noisy bgjob shows up)
35
+ // - Per-token cost budget for save_memo / push_message
36
+ // - Windows named-pipe alternative (no Windows production targets)
37
+ import { createServer as createHttpServer } from 'node:http';
38
+ import { randomBytes } from 'node:crypto';
39
+ import { chmod, mkdir, unlink } from 'node:fs/promises';
40
+ import { existsSync } from 'node:fs';
41
+ import { dirname, join } from 'node:path';
42
+ import { logger as rootLogger } from '../logger.js';
43
+ import { AGIM_HOME } from '../agim-paths.js';
44
+ import { handleMemoOp } from '../memo-rpc.js';
45
+ import { handlePushOp } from '../push-rpc.js';
46
+ import { handleSkillsOp } from '../skills-rpc.js';
47
+ const log = rootLogger.child({ component: 'agim-rpc' });
48
+ const tokens = new Map();
49
+ const DEFAULT_TTL_MS = (() => {
50
+ const raw = process.env.IMHUB_RPC_TOKEN_TTL_MS;
51
+ if (!raw)
52
+ return 24 * 60 * 60 * 1000; // 24 h
53
+ const n = parseInt(raw, 10);
54
+ return Number.isFinite(n) && n > 0 ? n : 24 * 60 * 60 * 1000;
55
+ })();
56
+ const DEFAULT_ALLOWED_TOOLS = [
57
+ 'mcp__imhub__search_memos',
58
+ 'mcp__imhub__save_memo',
59
+ 'mcp__imhub__read_skill',
60
+ 'mcp__imhub__list_skills',
61
+ 'mcp__imhub__push_message',
62
+ ];
63
+ function resolveAllowedTools() {
64
+ const raw = process.env.IMHUB_RPC_ALLOWED_TOOLS;
65
+ if (!raw?.trim())
66
+ return new Set(DEFAULT_ALLOWED_TOOLS);
67
+ const extra = raw.split(',').map((s) => s.trim()).filter(Boolean);
68
+ return new Set([...DEFAULT_ALLOWED_TOOLS, ...extra]);
69
+ }
70
+ /**
71
+ * Mint a new RPC token bound to a specific IM thread. Returns the hex
72
+ * token + the socket path subprocesses should connect to. Callers
73
+ * should pass these to spawn() via env so the child inherits them
74
+ * unconditionally (and not via argv — argv shows up in `ps`).
75
+ */
76
+ export function mintRpcToken(ctx, origin = 'native_exec') {
77
+ const token = randomBytes(32).toString('hex');
78
+ const expiresAt = Date.now() + DEFAULT_TTL_MS;
79
+ tokens.set(token, { ctx, expiresAt, origin });
80
+ return { token, socketPath: resolveSocketPath(), expiresAt };
81
+ }
82
+ /** Revoke a token explicitly. Token registry is also pruned on a
83
+ * periodic sweep, so revoke is best-effort cleanup, not required. */
84
+ export function revokeRpcToken(token) {
85
+ tokens.delete(token);
86
+ }
87
+ function pruneExpired() {
88
+ const now = Date.now();
89
+ for (const [t, entry] of tokens) {
90
+ if (entry.expiresAt <= now)
91
+ tokens.delete(t);
92
+ }
93
+ }
94
+ export function resolveSocketPath() {
95
+ return process.env.IMHUB_RPC_SOCKET || join(AGIM_HOME, 'rpc.sock');
96
+ }
97
+ let server = null;
98
+ let sweepTimer = null;
99
+ /**
100
+ * Start the local RPC server on a Unix socket. Idempotent — repeated
101
+ * calls return the same handle. Best-effort: a failure to start (e.g.
102
+ * permission denied on the socket path) logs at warn and resolves to
103
+ * `null` so the rest of agim boots normally.
104
+ */
105
+ export async function startRpcServer() {
106
+ if (server)
107
+ return server;
108
+ const socketPath = resolveSocketPath();
109
+ try {
110
+ // Make sure the parent dir exists. AGIM_HOME may not have been
111
+ // created yet on a brand-new install.
112
+ await mkdir(dirname(socketPath), { recursive: true });
113
+ // Stale socket from a previous run blocks listen() with EADDRINUSE.
114
+ if (existsSync(socketPath)) {
115
+ try {
116
+ await unlink(socketPath);
117
+ }
118
+ catch { /* best-effort */ }
119
+ }
120
+ const s = createHttpServer((req, res) => { void handleRequest(req, res); });
121
+ await new Promise((resolve, reject) => {
122
+ s.once('error', reject);
123
+ s.listen(socketPath, () => resolve());
124
+ });
125
+ // Lock the socket down so only the owning UID can connect. Group
126
+ // and world read are intentionally stripped.
127
+ try {
128
+ await chmod(socketPath, 0o600);
129
+ }
130
+ catch { /* best-effort */ }
131
+ server = s;
132
+ sweepTimer = setInterval(pruneExpired, 60_000);
133
+ if (sweepTimer.unref)
134
+ sweepTimer.unref();
135
+ log.info({ event: 'agim-rpc.started', socketPath }, `agim RPC server listening on ${socketPath}`);
136
+ return s;
137
+ }
138
+ catch (err) {
139
+ log.warn({
140
+ event: 'agim-rpc.start_failed',
141
+ socketPath,
142
+ err: err instanceof Error ? err.message : String(err),
143
+ }, 'agim RPC server failed to start — Python sidecar will be unavailable');
144
+ return null;
145
+ }
146
+ }
147
+ /** Graceful shutdown — called on SIGTERM. */
148
+ export async function stopRpcServer() {
149
+ if (sweepTimer) {
150
+ clearInterval(sweepTimer);
151
+ sweepTimer = null;
152
+ }
153
+ if (!server)
154
+ return;
155
+ await new Promise((resolve) => server.close(() => resolve()));
156
+ server = null;
157
+ try {
158
+ await unlink(resolveSocketPath());
159
+ }
160
+ catch { /* best-effort */ }
161
+ tokens.clear();
162
+ }
163
+ async function readBody(req, capBytes = 256 * 1024) {
164
+ return new Promise((resolve, reject) => {
165
+ let total = 0;
166
+ const chunks = [];
167
+ req.on('data', (c) => {
168
+ total += c.length;
169
+ if (total > capBytes) {
170
+ req.destroy();
171
+ reject(new Error(`request body exceeds ${capBytes} bytes`));
172
+ return;
173
+ }
174
+ chunks.push(c);
175
+ });
176
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
177
+ req.on('error', reject);
178
+ });
179
+ }
180
+ function writeJson(res, status, body) {
181
+ res.statusCode = status;
182
+ res.setHeader('content-type', 'application/json; charset=utf-8');
183
+ res.end(JSON.stringify(body));
184
+ }
185
+ async function handleRequest(req, res) {
186
+ try {
187
+ if (req.method !== 'POST') {
188
+ writeJson(res, 405, { ok: false, error: 'POST required', status: 405 });
189
+ return;
190
+ }
191
+ const url = req.url || '';
192
+ if (!url.startsWith('/rpc/')) {
193
+ writeJson(res, 404, { ok: false, error: 'unknown route', status: 404 });
194
+ return;
195
+ }
196
+ const toolName = url.slice('/rpc/'.length).split(/[?#]/)[0];
197
+ const allowed = resolveAllowedTools();
198
+ if (!allowed.has(toolName)) {
199
+ log.warn({ event: 'agim-rpc.tool_denied', toolName });
200
+ writeJson(res, 403, { ok: false, error: `tool not in RPC whitelist: ${toolName}`, status: 403 });
201
+ return;
202
+ }
203
+ const token = String(req.headers['x-agim-rpc-token'] ?? '');
204
+ if (!token) {
205
+ writeJson(res, 401, { ok: false, error: 'missing X-Agim-Rpc-Token header', status: 401 });
206
+ return;
207
+ }
208
+ const entry = tokens.get(token);
209
+ if (!entry || entry.expiresAt <= Date.now()) {
210
+ if (entry)
211
+ tokens.delete(token); // expired
212
+ log.warn({ event: 'agim-rpc.token_invalid', toolName, hasEntry: !!entry });
213
+ writeJson(res, 401, { ok: false, error: 'invalid or expired token', status: 401 });
214
+ return;
215
+ }
216
+ const raw = await readBody(req);
217
+ let parsed;
218
+ try {
219
+ parsed = raw ? JSON.parse(raw) : {};
220
+ }
221
+ catch {
222
+ writeJson(res, 400, { ok: false, error: 'malformed JSON body', status: 400 });
223
+ return;
224
+ }
225
+ const args = (parsed.args ?? {});
226
+ log.info({
227
+ event: 'agim-rpc.call',
228
+ toolName,
229
+ origin: entry.origin,
230
+ platform: entry.ctx.platform,
231
+ threadId: entry.ctx.threadId,
232
+ });
233
+ const result = await dispatch(toolName, args, entry.ctx);
234
+ writeJson(res, 200, result);
235
+ }
236
+ catch (err) {
237
+ const msg = err instanceof Error ? err.message : String(err);
238
+ log.error({ event: 'agim-rpc.handler_threw', err: msg });
239
+ writeJson(res, 500, { ok: false, error: msg, status: 500 });
240
+ }
241
+ }
242
+ async function dispatch(toolName, args, ctx) {
243
+ // Each branch funnels into the SAME RPC handler the in-process
244
+ // native dispatcher uses, so the surface is byte-identical.
245
+ switch (toolName) {
246
+ case 'mcp__imhub__search_memos': {
247
+ const r = await handleMemoOp('search', args, ctx);
248
+ return r.ok ? { ok: true, result: r.result } : { ok: false, error: r.error };
249
+ }
250
+ case 'mcp__imhub__save_memo': {
251
+ const r = await handleMemoOp('save', args, ctx);
252
+ return r.ok ? { ok: true, result: r.result } : { ok: false, error: r.error };
253
+ }
254
+ case 'mcp__imhub__read_skill': {
255
+ const r = await handleSkillsOp({ op: 'read', name: typeof args.name === 'string' ? args.name : '' });
256
+ if (!r.ok)
257
+ return { ok: false, error: r.error };
258
+ if (r.result.op !== 'read')
259
+ return { ok: false, error: 'unexpected response shape' };
260
+ if (!r.result.available)
261
+ return { ok: false, error: `skill unavailable: ${r.result.unavailableReason || 'unknown'}` };
262
+ return { ok: true, result: r.result.body };
263
+ }
264
+ case 'mcp__imhub__list_skills': {
265
+ const r = await handleSkillsOp({ op: 'list' });
266
+ return r.ok ? { ok: true, result: r.result } : { ok: false, error: r.error };
267
+ }
268
+ case 'mcp__imhub__push_message': {
269
+ const r = await handlePushOp(args, ctx);
270
+ return r.ok ? { ok: true, result: r.result } : { ok: false, error: r.error };
271
+ }
272
+ default:
273
+ // Whitelist already filtered upstream; this branch is dead unless
274
+ // an operator added a tool to IMHUB_RPC_ALLOWED_TOOLS without
275
+ // adding a corresponding handler here.
276
+ return { ok: false, error: `no handler wired for ${toolName} (operator-extended allowlist?)` };
277
+ }
278
+ }
279
+ /** Internal-only — used by tests to snapshot token state. */
280
+ export function _peekTokensForTests() {
281
+ return tokens;
282
+ }
283
+ //# sourceMappingURL=agim-rpc-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agim-rpc-server.js","sourceRoot":"","sources":["../../../src/core/llm/agim-rpc-server.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,21 @@ export declare function isExecToolName(name: string): boolean;
4
4
  export declare function getExecTools(): ToolDef[];
5
5
  export interface ExecContext {
6
6
  cwd: string;
7
+ /** v1.2.97 — when present, every spawned child gets IMHUB_RPC_SOCKET
8
+ * and IMHUB_RPC_TOKEN env vars so a bgjob-launched Python (or any
9
+ * language) script can call back into agim's tool surface via the
10
+ * local RPC server. The token is bound to this exact RunContext so
11
+ * a worker can only drive its own IM thread. Caller (native/index.ts)
12
+ * mints a token at turn start; exec-dispatcher injects it on every
13
+ * spawn under the same turn. Optional — leaving it unset just means
14
+ * the bgjob child can't call back (the existing v1.2.93 SOP still
15
+ * works, just without the RPC convenience). */
16
+ rpcCtx?: {
17
+ platform: string;
18
+ channelId: string;
19
+ threadId: string;
20
+ userId: string;
21
+ };
7
22
  }
8
23
  export declare function buildExecDispatcher(ctx: ExecContext): ToolDispatcher;
9
24
  export declare function isBgjobInvocation(cmd: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"exec-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/llm/exec-dispatcher.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAU5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAsBxC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAapE;AA+HD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYtD"}
1
+ {"version":3,"file":"exec-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/llm/exec-dispatcher.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAU5E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAsBxC;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX;;;;;;;;oDAQgD;IAChD,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CACnF;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAapE;AAoJD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYtD"}
@@ -130,15 +130,36 @@ async function runExec(args, ctx, signal) {
130
130
  const { bin, argv } = useSandbox
131
131
  ? buildBwrapInvocation(command, cwd, sandboxNetOff)
132
132
  : { bin: '/bin/sh', argv: ['-c', command] };
133
+ // v1.2.97 — mint a per-spawn RPC token + injection env. Bound to
134
+ // the current IM thread so the child can ONLY drive that thread's
135
+ // memo / push / skill surface, never anyone else's. Best-effort:
136
+ // if minting fails (RPC server didn't start, no rpcCtx) the spawn
137
+ // still runs — Python sidecar inside the child will just refuse
138
+ // to construct a client (raises RuntimeError on missing env).
139
+ let extraEnv;
140
+ if (ctx.rpcCtx) {
141
+ try {
142
+ const { mintRpcToken, resolveSocketPath } = await import('./agim-rpc-server.js');
143
+ const { token } = mintRpcToken(ctx.rpcCtx, 'native_exec');
144
+ extraEnv = { IMHUB_RPC_SOCKET: resolveSocketPath(), IMHUB_RPC_TOKEN: token };
145
+ }
146
+ catch (err) {
147
+ log.debug({
148
+ event: 'exec.rpc_mint_failed',
149
+ err: err instanceof Error ? err.message : String(err),
150
+ }, 'failed to mint RPC token; child will boot without IMHUB_RPC_*');
151
+ }
152
+ }
133
153
  log.info({
134
154
  event: 'exec.spawn',
135
155
  bin,
136
156
  cwd,
137
157
  sandbox: useSandbox ? `bwrap${sandboxNetOff ? '+no-net' : ''}` : (isBgjob ? 'bypassed-for-bgjob' : 'none'),
158
+ rpcTokenInjected: !!extraEnv,
138
159
  timeoutMs,
139
160
  commandPreview: command.slice(0, 120),
140
161
  });
141
- return await runChild(bin, argv, { cwd, timeoutMs, signal });
162
+ return await runChild(bin, argv, { cwd, timeoutMs, signal, extraEnv });
142
163
  }
143
164
  const DANGEROUS_PATTERNS = [
144
165
  // rm -rf with paths that touch root / home root / ~. Allow narrow
@@ -268,7 +289,8 @@ function runChild(bin, argv, opts) {
268
289
  let stdoutTruncated = false;
269
290
  let stderrTruncated = false;
270
291
  let timedOut = false;
271
- const child = spawn(bin, argv, { cwd: opts.cwd, env: process.env, signal: opts.signal });
292
+ const env = opts.extraEnv ? { ...process.env, ...opts.extraEnv } : process.env;
293
+ const child = spawn(bin, argv, { cwd: opts.cwd, env, signal: opts.signal });
272
294
  const timer = setTimeout(() => {
273
295
  timedOut = true;
274
296
  try {