indusagi 0.12.34 → 0.13.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 (55) hide show
  1. package/dist/agent.js +1247 -184
  2. package/dist/ai.js +72 -4
  3. package/dist/capabilities.js +69 -2
  4. package/dist/cli.js +83 -13
  5. package/dist/connectors-saas.js +66 -0
  6. package/dist/index.js +83 -13
  7. package/dist/interop.js +66 -0
  8. package/dist/mcp.js +270 -363
  9. package/dist/react-ink.js +15 -11
  10. package/dist/shell-app.js +83 -13
  11. package/dist/smithy.js +69 -2
  12. package/dist/swarm.js +69 -2
  13. package/dist/types/capabilities/backends/node-backends.d.ts +3 -1
  14. package/dist/types/capabilities/files/read-state-gate.d.ts +69 -0
  15. package/dist/types/capabilities/files/read-state-gate.test.d.ts +14 -0
  16. package/dist/types/capabilities/kernel/context.d.ts +4 -0
  17. package/dist/types/capabilities/kernel/index.d.ts +2 -2
  18. package/dist/types/capabilities/kernel/spec.d.ts +55 -0
  19. package/dist/types/facade/bot/actions/bash.d.ts +15 -0
  20. package/dist/types/facade/bot/actions/bash.test.d.ts +1 -0
  21. package/dist/types/facade/bot/actions/checkpoint.d.ts +49 -0
  22. package/dist/types/facade/bot/actions/checkpoint.test.d.ts +1 -0
  23. package/dist/types/facade/bot/actions/edit-utils.d.ts +86 -0
  24. package/dist/types/facade/bot/actions/edit.d.ts +18 -0
  25. package/dist/types/facade/bot/actions/edit.test.d.ts +1 -0
  26. package/dist/types/facade/bot/actions/find.d.ts +2 -0
  27. package/dist/types/facade/bot/actions/find.test.d.ts +1 -0
  28. package/dist/types/facade/bot/actions/grep.d.ts +10 -0
  29. package/dist/types/facade/bot/actions/grep.test.d.ts +1 -0
  30. package/dist/types/facade/bot/actions/index.d.ts +16 -0
  31. package/dist/types/facade/bot/actions/read-state.d.ts +83 -0
  32. package/dist/types/facade/bot/actions/read-state.test.d.ts +1 -0
  33. package/dist/types/facade/bot/actions/read.d.ts +7 -0
  34. package/dist/types/facade/bot/actions/read.test.d.ts +1 -0
  35. package/dist/types/facade/bot/actions/sandbox-backend.d.ts +99 -0
  36. package/dist/types/facade/bot/actions/sandbox-backend.test.d.ts +1 -0
  37. package/dist/types/facade/bot/actions/websearch.d.ts +5 -2
  38. package/dist/types/facade/bot/actions/websearch.test.d.ts +1 -0
  39. package/dist/types/facade/bot/actions/write.d.ts +15 -0
  40. package/dist/types/facade/bot/agent-loop.d.ts +10 -0
  41. package/dist/types/facade/bot/agent-loop.test.d.ts +1 -0
  42. package/dist/types/facade/bot/agent.d.ts +9 -1
  43. package/dist/types/facade/bot/permission-gate.test.d.ts +1 -0
  44. package/dist/types/facade/bot/types.d.ts +60 -0
  45. package/dist/types/facade/mcp-core/client.d.ts +71 -15
  46. package/dist/types/facade/mcp-core/client.test.d.ts +18 -0
  47. package/dist/types/facade/mcp-core/types.d.ts +10 -0
  48. package/dist/types/facade/ml/adapters/anthropic-retry.test.d.ts +1 -0
  49. package/dist/types/facade/ml/adapters/anthropic.d.ts +17 -0
  50. package/dist/types/facade/ml/adapters/simple-options.d.ts +13 -0
  51. package/dist/types/facade/ml/adapters/simple-options.test.d.ts +1 -0
  52. package/dist/types/react-ink/components/StatusLine.d.ts +10 -1
  53. package/dist/types/react-ink/components/ToolEventBlock.d.ts +2 -1
  54. package/dist/types/react-ink/components/ToolEventBlock.test.d.ts +1 -0
  55. package/package.json +1 -1
@@ -1,4 +1,6 @@
1
1
  import type { AgentTool } from "../types.js";
2
+ import { type CheckpointHandle } from "./checkpoint.js";
3
+ import { type ReadStateHandle } from "./read-state.js";
2
4
  declare const writeSchema: import("@sinclair/typebox").TObject<{
3
5
  path: import("@sinclair/typebox").TString;
4
6
  content: import("@sinclair/typebox").TString;
@@ -20,6 +22,19 @@ export interface WriteToolOptions {
20
22
  operations?: WriteOperations;
21
23
  /** If set, duplicate any existing file to a sibling .bak before it is overwritten. */
22
24
  createBackup?: boolean;
25
+ /**
26
+ * Optional read-before-edit gate store. When present, overwriting an EXISTING
27
+ * file is refused unless it was read this session and has not drifted on disk;
28
+ * brand-new files (not yet on disk) are exempt. Absent → no gate (no-op).
29
+ */
30
+ readState?: ReadStateHandle;
31
+ /**
32
+ * Optional file-checkpoint sink. When present, the file's pre-mutation
33
+ * on-disk content (or `null` when it did not exist) is captured exactly once
34
+ * before the overwrite, so a later rewind can roll the working tree back.
35
+ * Absent → no snapshot (no-op).
36
+ */
37
+ checkpoint?: CheckpointHandle;
23
38
  }
24
39
  export declare function createWriteTool(cwd: string, options?: WriteToolOptions): AgentTool<typeof writeSchema>;
25
40
  /** Ready-to-use write tool bound to the current working directory. */
@@ -8,6 +8,16 @@
8
8
  */
9
9
  import { EventStream } from "../ml/index.js";
10
10
  import type { AgentContext, AgentEvent, AgentLoopConfig, AgentMessage, StreamFn } from "./types.js";
11
+ /**
12
+ * Conservative static allow-list of tools that only read state, never mutate
13
+ * it. Consecutive runs of these within a single assistant turn are safe to
14
+ * dispatch concurrently. Anything not on this list — mutating tools (edit,
15
+ * write, bash), and every dynamic / MCP / composio tool whose behavior the
16
+ * loop can't statically vouch for — runs serially in request order.
17
+ *
18
+ * Callers can supply their own set through `AgentLoopConfig.readOnlyToolNames`.
19
+ */
20
+ export declare const READ_ONLY_TOOL_NAMES: ReadonlySet<string>;
11
21
  /**
12
22
  * Begin a brand-new run. The supplied prompt messages are appended to the
13
23
  * conversation up front, then the turn cycle starts.
@@ -0,0 +1 @@
1
+ export {};
@@ -5,7 +5,7 @@
5
5
  * default the model is reached through streamSimple.
6
6
  */
7
7
  import { type ImageContent, type Message, type Model, type ThinkingBudgets } from "../ml/index.js";
8
- import type { AgentEvent, AgentMessage, AgentState, AgentTool, StreamFn, ThinkingLevel } from "./types.js";
8
+ import type { AgentEvent, AgentMessage, AgentState, AgentTool, CanUseToolFn, StreamFn, ThinkingLevel } from "./types.js";
9
9
  type QueueMode = "all" | "one-at-a-time";
10
10
  export interface AgentOptions {
11
11
  initialState?: Partial<AgentState>;
@@ -46,6 +46,13 @@ export interface AgentOptions {
46
46
  * expire, such as short-lived OAuth access tokens.
47
47
  */
48
48
  getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;
49
+ /**
50
+ * Hard permission gate consulted before each tool runs. A host supplies it to
51
+ * enforce an allow/ask/deny policy; the loop awaits it on the validated args
52
+ * and either proceeds (optionally with substituted input) or short-circuits
53
+ * to an isError result. Omit it to allow every tool — today's behavior.
54
+ */
55
+ canUseTool?: CanUseToolFn;
49
56
  /**
50
57
  * Per-level token allowances for thinking; only meaningful for providers
51
58
  * whose reasoning effort is expressed as a token budget.
@@ -63,6 +70,7 @@ export declare class Agent {
63
70
  streamFn: StreamFn;
64
71
  private _sessionId?;
65
72
  getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;
73
+ canUseTool?: CanUseToolFn;
66
74
  private runningPrompt?;
67
75
  private resolveRunningPrompt?;
68
76
  private _thinkingBudgets?;
@@ -0,0 +1 @@
1
+ export {};
@@ -38,8 +38,41 @@ export interface AgentToolResult<T> {
38
38
  }
39
39
  export interface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> extends Tool<TParameters> {
40
40
  label: string;
41
+ /**
42
+ * Marks a tool that only inspects state and never mutates it (read/ls/grep/
43
+ * find/websearch/webfetch/todoread). Hosts can lean on this to auto-allow
44
+ * such tools in a permission policy without re-deriving the read-only set by
45
+ * name. Optional and defaults to undefined → treated as "not known read-only".
46
+ */
47
+ readOnly?: boolean;
41
48
  execute: (toolCallId: string, params: Static<TParameters>, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<TDetails>) => Promise<AgentToolResult<TDetails>>;
42
49
  }
50
+ /**
51
+ * The verdict a {@link CanUseToolFn} returns for a single tool call.
52
+ *
53
+ * - `allow` proceeds with execution; an optional `updatedInput` replaces the
54
+ * validated arguments before the tool runs (e.g. a sanitized command).
55
+ * - `deny` short-circuits: the tool never executes and `message` is surfaced as
56
+ * an `isError` tool result so the model sees why it was blocked.
57
+ */
58
+ export type PermissionDecision = {
59
+ behavior: "allow";
60
+ updatedInput?: unknown;
61
+ } | {
62
+ behavior: "deny";
63
+ message: string;
64
+ };
65
+ /**
66
+ * Hard permission gate consulted immediately before a tool executes. Hosts
67
+ * supply it to enforce an allow/ask/deny policy; the loop awaits it (passing the
68
+ * abort signal so a pending prompt can be cancelled) and acts on the verdict.
69
+ *
70
+ * Entirely optional — when omitted the loop allows every tool, preserving
71
+ * today's behavior.
72
+ */
73
+ export type CanUseToolFn = (toolName: string, input: unknown, opts: {
74
+ signal?: AbortSignal;
75
+ }) => Promise<PermissionDecision>;
43
76
  export interface AgentContext {
44
77
  systemPrompt: string;
45
78
  messages: AgentMessage[];
@@ -116,6 +149,15 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
116
149
  * while a slow stretch of tool calls is still running.
117
150
  */
118
151
  getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;
152
+ /**
153
+ * Hard permission gate consulted right before each tool executes. When set,
154
+ * the loop awaits it with the tool name and its VALIDATED arguments; a `deny`
155
+ * verdict short-circuits to an `isError` tool result (the tool never runs),
156
+ * while an `allow` verdict proceeds — substituting `updatedInput` when given.
157
+ *
158
+ * Omit it to allow every tool, i.e. exactly today's behavior.
159
+ */
160
+ canUseTool?: CanUseToolFn;
119
161
  /**
120
162
  * Yields steering messages to splice into the run while it is in flight.
121
163
  *
@@ -135,6 +177,24 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
135
177
  * Use it for input that should wait until the current work wraps up.
136
178
  */
137
179
  getFollowUpMessages?: () => Promise<AgentMessage[]>;
180
+ /**
181
+ * Names of tools that are safe to run concurrently because they only read
182
+ * (never mutate) state. Consecutive runs of such calls within one assistant
183
+ * turn are dispatched in parallel (bounded by {@link maxToolConcurrency});
184
+ * everything else still runs one-at-a-time in request order.
185
+ *
186
+ * When omitted the loop falls back to a conservative built-in set
187
+ * (`read`/`ls`/`grep`/`find`/`websearch`/`webfetch`/`todoread`). Tools that
188
+ * aren't on the list — including dynamic/MCP/composio tools — always run
189
+ * serially, preserving today's behavior.
190
+ */
191
+ readOnlyToolNames?: ReadonlySet<string>;
192
+ /**
193
+ * Upper bound on how many read-only tool calls run at once. Defaults to the
194
+ * `CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY` / `INDUS_MAX_TOOL_CONCURRENCY`
195
+ * environment override, or 10. Set to 1 to force fully-sequential dispatch.
196
+ */
197
+ maxToolConcurrency?: number;
138
198
  }
139
199
  type AgentLifecycleEvent = {
140
200
  type: "agent_start";
@@ -4,7 +4,18 @@
4
4
  * Manages connection to one MCP server and provides
5
5
  * methods to list/call tools, read resources, etc.
6
6
  *
7
- * Reference: MCP client implementation patterns.
7
+ * Transport is provided by the official `@modelcontextprotocol/sdk`:
8
+ * - stdio → subprocess JSON-RPC over stdin/stdout
9
+ * - http → Streamable HTTP (POST for client→server, plus a server→client
10
+ * push channel — the SDK opens the SSE stream and a standalone GET
11
+ * SSE for server-initiated messages, and handles reconnect/
12
+ * session-expiry by re-using the session id)
13
+ * - sse → legacy HTTP+SSE transport (when `transport: "sse"` is requested)
14
+ *
15
+ * The SDK gives us a real persistent connection, a server→client push channel,
16
+ * dispatch of server NOTIFICATIONS, answering of server REQUESTS (elicitation,
17
+ * roots/list, sampling, ping), and bounded reconnect on a dropped stream /
18
+ * expired session — none of which the hand-rolled POST-only transport did.
8
19
  */
9
20
  import type { MCPServerConfig, MCPToolDefinition, MCPResource, MCPPrompt, MCPToolCallResult, MCPLogHandler, MCPProgressHandler, MCPElicitationHandler, MCPRoot } from "./types.js";
10
21
  /**
@@ -29,7 +40,7 @@ export interface MCPClientOptions {
29
40
  /**
30
41
  * MCP Client - manages connection to a single MCP server.
31
42
  *
32
- * Supports stdio transport (subprocess communication).
43
+ * Supports stdio (subprocess) and HTTP (Streamable HTTP / legacy SSE) transports.
33
44
  * Provides methods to list tools, call tools, read resources, etc.
34
45
  *
35
46
  * @example
@@ -50,10 +61,8 @@ export interface MCPClientOptions {
50
61
  */
51
62
  export declare class MCPClient {
52
63
  private options;
53
- private process?;
54
- private buffer;
55
- private messageId;
56
- private pendingRequests;
64
+ private client?;
65
+ private transport?;
57
66
  private isConnected;
58
67
  private connectionPromise;
59
68
  private serverCapabilities?;
@@ -61,6 +70,13 @@ export declare class MCPClient {
61
70
  private enableServerLogs;
62
71
  private enableProgressTracking;
63
72
  private _roots;
73
+ private elicitationHandler?;
74
+ private samplingHandler?;
75
+ private resourceUpdatedHandler?;
76
+ private resourceListChangedHandler?;
77
+ private toolListChangedHandler?;
78
+ private promptListChangedHandler?;
79
+ private progressHandler?;
64
80
  /** Server name */
65
81
  readonly serverName: string;
66
82
  /** Server config */
@@ -74,10 +90,37 @@ export declare class MCPClient {
74
90
  */
75
91
  connect(): Promise<void>;
76
92
  private doConnect;
77
- private connectHttp;
78
- private connectStdio;
93
+ /**
94
+ * Build the SDK transport for the configured server.
95
+ *
96
+ * - stdio: `StdioClientTransport` (inherits the parent env, merges config.env).
97
+ * - http: `StreamableHTTPClientTransport` (POST + server-push SSE channel,
98
+ * reconnect + session-expiry handled by the SDK), unless the config
99
+ * asks for the legacy `SSEClientTransport`.
100
+ */
101
+ private createTransport;
102
+ /**
103
+ * Register handlers for server-initiated REQUESTS and NOTIFICATIONS.
104
+ *
105
+ * REQUESTS (have both `.method` AND `.id`) must be ANSWERED with a JSON-RPC
106
+ * RESPONSE carrying the matching id — the SDK does this automatically for the
107
+ * value a request handler returns (or rejects). The previous hand-rolled
108
+ * transport routed these into the notification path, so they were never
109
+ * answered (bug #13).
110
+ *
111
+ * Defaults:
112
+ * - ping → {}
113
+ * - roots/list → the configured roots
114
+ * - elicitation/create→ decline ({action:"cancel"}) unless a host handler is set
115
+ * - sampling → reject "Method not found" unless a host handler is set
116
+ */
117
+ private registerServerHandlers;
79
118
  /**
80
119
  * Disconnect from the MCP server.
120
+ *
121
+ * The SDK's `client.close()` closes the transport and rejects any pending
122
+ * requests — a clean teardown for both stdio (graceful subprocess shutdown)
123
+ * and HTTP (close the push channel / end the session).
81
124
  */
82
125
  disconnect(): Promise<void>;
83
126
  /**
@@ -134,24 +177,37 @@ export declare class MCPClient {
134
177
  * Set a handler for resource list changed notifications.
135
178
  */
136
179
  setResourceListChangedHandler(handler: () => void): void;
180
+ /**
181
+ * Set a handler for tool list changed notifications.
182
+ */
183
+ setToolListChangedHandler(handler: () => void): void;
137
184
  /**
138
185
  * Set a handler for prompt list changed notifications.
139
186
  */
140
187
  setPromptListChangedHandler(handler: () => void): void;
141
188
  /**
142
- * Set a handler for elicitation requests.
189
+ * Set a handler for elicitation requests. When set, the server's
190
+ * `elicitation/create` REQUEST is answered with the host's decision; when
191
+ * unset the request is declined ({action:"cancel"}).
143
192
  */
144
193
  setElicitationHandler(handler: MCPElicitationHandler): void;
194
+ /**
195
+ * Set a handler for sampling (`sampling/createMessage`) requests. When set,
196
+ * the server request is answered with the host's result; when unset the
197
+ * request is rejected with "Method not found".
198
+ */
199
+ setSamplingHandler(handler: (params: unknown) => Promise<unknown>): void;
145
200
  /**
146
201
  * Set a handler for progress notifications.
147
202
  */
148
203
  setProgressHandler(handler: MCPProgressHandler): void;
149
204
  private ensureConnected;
150
- private sendRequest;
151
- private sendHttpRequest;
152
- private sendNotification;
153
- private processBuffer;
154
- private handleMessage;
155
- private handleNotification;
205
+ /**
206
+ * Normalize an SDK/transport error into an MCPError. Session-expiry style
207
+ * failures (404 session / -32001) are surfaced as SESSION_ERROR so callers
208
+ * (the pool) can decide to reconnect; the SDK's StreamableHTTP transport
209
+ * already attempts a bounded reconnect re-using the session id before this.
210
+ */
211
+ private wrapError;
156
212
  private log;
157
213
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * MCP client transport tests (#23 / bug #13).
3
+ *
4
+ * These verify the server→client directions that the old hand-rolled,
5
+ * POST-only transport never handled:
6
+ * 1. A server-initiated REQUEST (`elicitation/create`) is ANSWERED with a
7
+ * JSON-RPC RESPONSE carrying the matching id (not silently dropped into a
8
+ * notification path).
9
+ * 2. A server-initiated NOTIFICATION (`notifications/tools/list_changed`)
10
+ * fires the host-registered handler.
11
+ * 3. The HTTP path builds a real Streamable-HTTP transport with a server-push
12
+ * channel, and an SSE-framed server message off that channel is parsed and
13
+ * dispatched to the right handler.
14
+ *
15
+ * A `MockTransport` (implementing the SDK `Transport` interface) drives the
16
+ * client without a live MCP server.
17
+ */
18
+ export {};
@@ -27,6 +27,12 @@ export interface HttpServerConfig {
27
27
  url: URL;
28
28
  /** Optional headers for HTTP requests */
29
29
  headers?: Record<string, string>;
30
+ /**
31
+ * Which HTTP transport to use.
32
+ * - "http" (default): Streamable HTTP (single endpoint, server-push channel)
33
+ * - "sse": legacy HTTP+SSE transport
34
+ */
35
+ transport?: "http" | "sse";
30
36
  /** Custom fetch implementation */
31
37
  fetch?: typeof fetch;
32
38
  }
@@ -166,6 +172,8 @@ export interface MCPServerConfigEntry {
166
172
  url?: string;
167
173
  /** Headers for HTTP transport */
168
174
  headers?: Record<string, string>;
175
+ /** HTTP transport flavor ("http" = Streamable HTTP default, "sse" = legacy) */
176
+ transport?: "http" | "sse";
169
177
  /** Timeout in milliseconds */
170
178
  timeout?: number;
171
179
  /** Whether this server is enabled (default: true) */
@@ -185,6 +193,8 @@ export interface MCPServerConfigValue {
185
193
  url?: string;
186
194
  /** Headers for HTTP transport */
187
195
  headers?: Record<string, string>;
196
+ /** HTTP transport flavor ("http" = Streamable HTTP default, "sse" = legacy) */
197
+ transport?: "http" | "sse";
188
198
  /** Timeout in milliseconds */
189
199
  timeout?: number;
190
200
  /** Whether this server is enabled (default: true) */
@@ -57,5 +57,22 @@ export declare class AnthropicStreamHandler extends BaseStreamHandler {
57
57
  */
58
58
  process(anthropicStream: AsyncIterable<unknown>, onEvent: (event: any) => void): Promise<void>;
59
59
  }
60
+ /**
61
+ * Reads a `Retry-After` header off an Anthropic APIError and converts it to a
62
+ * delay in milliseconds. The header is the integer-seconds form per the
63
+ * Anthropic API; a missing/non-numeric value yields `null` so callers fall
64
+ * back to exponential backoff.
65
+ */
66
+ export declare function parseAnthropicRetryAfterMs(error: unknown): number | null;
67
+ /**
68
+ * Classifies an Anthropic failure as worth retrying. Mirrors
69
+ * `kit/provider-errors.ts:isRetryableError`: transient HTTP statuses (408/409/
70
+ * 429/529/5xx) and an `overloaded_error` body are retryable; auth/validation
71
+ * (401/403/4xx) are not. Generic errors fall back to a message sniff covering
72
+ * network/timeout/overload conditions. The `_attempt` is accepted to satisfy
73
+ * the RetryPolicy.shouldRetry contract but unused here (the loop already caps
74
+ * attempts).
75
+ */
76
+ export declare function shouldRetryAnthropic(error: unknown, _attempt: number): boolean;
60
77
  export declare const streamAnthropic: StreamFunction<"anthropic-messages", AnthropicOptions>;
61
78
  export declare const streamSimpleAnthropic: StreamFunction<"anthropic-messages", SimpleStreamOptions>;
@@ -8,7 +8,20 @@ export interface RetryPolicy {
8
8
  maxAttempts: number;
9
9
  baseDelayMs: number;
10
10
  maxDelayMs?: number;
11
+ /**
12
+ * When present, abort is checked between attempts and before each backoff
13
+ * sleep. A live request is short-circuited the moment its signal fires —
14
+ * but the presence of a signal no longer suppresses transient retries.
15
+ */
16
+ signal?: AbortSignal;
11
17
  shouldRetry?: (error: unknown, attempt: number) => boolean;
18
+ /**
19
+ * Returns the server-requested cooldown (e.g. a parsed `Retry-After`
20
+ * header) in milliseconds, or `null` when the error carries no such hint.
21
+ * When provided, it takes priority over exponential backoff (still clamped
22
+ * by `maxDelayMs`).
23
+ */
24
+ getRetryAfterMs?: (error: unknown) => number | null;
12
25
  }
13
26
  export declare class SimpleOptionsProviderError extends Error {
14
27
  readonly code: "rate_limit" | "timeout" | "network" | "validation" | "auth" | "unknown";
@@ -4,6 +4,15 @@ interface StatusLineProps {
4
4
  theme: InkThemeAdapter;
5
5
  status?: StatusMessage;
6
6
  snapshot: SessionSnapshot;
7
+ /**
8
+ * Whether this line draws its own "Agent working..." / "Running bash..." /
9
+ * "Compacting..." busy fallbacks. Defaults to `true` (legacy behaviour). A host
10
+ * that renders its own live progress affordance (e.g. an animated working
11
+ * indicator on a separate row) passes `false` so the busy state is shown in ONE
12
+ * place only — this line then carries just the explicit transient toast (and a
13
+ * hard error), and never competes with the host's indicator.
14
+ */
15
+ showBusyText?: boolean;
7
16
  }
8
- export declare function StatusLine({ snapshot, status, theme }: StatusLineProps): JSX.Element | null;
17
+ export declare function StatusLine({ snapshot, status, theme, showBusyText }: StatusLineProps): JSX.Element | null;
9
18
  export {};
@@ -20,5 +20,6 @@ interface ToolEventBlockProps {
20
20
  */
21
21
  preformatted?: boolean;
22
22
  }
23
- export declare function ToolEventBlock({ detail, emptyText, indent, marginBottom, maxContentLines, preformatted, showSummaryInline, showTitle, status, summary, theme: _theme, title, }: ToolEventBlockProps): JSX.Element;
23
+ export declare function statusColorKey(status: ToolEventStatus): string;
24
+ export declare function ToolEventBlock({ detail, emptyText, indent, marginBottom, maxContentLines, preformatted, showSummaryInline, showTitle, status, summary, theme, title, }: ToolEventBlockProps): JSX.Element;
24
25
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "indusagi",
3
- "version": "0.12.34",
3
+ "version": "0.13.0",
4
4
  "description": "Indusagi — a terminal-first AI coding agent framework. Clean-room implementation.",
5
5
  "author": "Varun Israni",
6
6
  "license": "MIT",