@bike4mind/cli 0.20.0 → 0.20.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import { t as ProxyManager } from "./ProxyManager-C1-lgzEU.mjs";
3
+ export { ProxyManager };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { F as loadContextFiles, J as setWebSocketToolExecutor, L as generateCliTools, M as ReActAgent, X as buildSystemPrompt, Y as getPlanModeFilePath, a as McpManager, i as AgentStore, l as OllamaBackend, n as BackgroundAgentManager, o as createSseBackend, r as SubagentOrchestrator, s as ServerLlmBackend, t as AgentHistoryStore } from "./AgentHistoryStore-C8uUKjjC.mjs";
3
- import { n as logger } from "./ConfigStore-DD3DcC3-.mjs";
2
+ import { F as loadContextFiles, J as setWebSocketToolExecutor, L as generateCliTools, M as ReActAgent, X as buildSystemPrompt, Y as getPlanModeFilePath, a as McpManager, i as AgentStore, l as OllamaBackend, n as BackgroundAgentManager, o as createSseBackend, r as SubagentOrchestrator, s as ServerLlmBackend, t as AgentHistoryStore } from "./AgentHistoryStore-T7Oh84Yn.mjs";
3
+ import { n as logger } from "./ConfigStore-cIyF7hDg.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  import WebSocket from "ws";
6
6
  //#region src/llm/NotifyingLlmBackend.ts
@@ -659,7 +659,7 @@ async function buildSandbox(input) {
659
659
  import("./SandboxRuntimeAdapter-CKelGICD.mjs"),
660
660
  import("./SandboxOrchestrator-BFPVpmB5.mjs"),
661
661
  import("./types-CqscS34o.mjs"),
662
- import("./ProxyManager-Bqr7Lmsd.mjs"),
662
+ import("./ProxyManager-B1jFWL7b.mjs"),
663
663
  import("./ViolationLogStore-byEhxa2A.mjs")
664
664
  ]);
665
665
  const sandboxConfig = config.sandbox ?? DEFAULT_SANDBOX_CONFIG;
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import { $ as RemoteSkillSource, A as FallbackLlmBackend, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, I as PermissionManager, J as setWebSocketToolExecutor, O as createBackgroundAgentTools, Q as isReadOnlyTool, S as createTodoStore, et as CustomCommandStore, k as createAgentDelegateTool, nt as SessionStore, tt as CheckpointStore, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool } from "../AgentHistoryStore-C8uUKjjC.mjs";
3
- import { c as requireApiUrl, n as logger, t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
4
- import { t as ApiClient } from "../ApiClient-B_CQrUiF.mjs";
5
- import { a as createToolSearchTool, i as buildLlmBackend, n as buildSupportingStores, o as deferredToolRegistry, r as buildSandbox, s as NotifyingLlmBackend, t as buildAgent } from "../buildAgent-mVuXU_H4.mjs";
2
+ import { $ as RemoteSkillSource, A as FallbackLlmBackend, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, I as PermissionManager, J as setWebSocketToolExecutor, O as createBackgroundAgentTools, Q as isReadOnlyTool, S as createTodoStore, et as CustomCommandStore, k as createAgentDelegateTool, nt as SessionStore, tt as CheckpointStore, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool } from "../AgentHistoryStore-T7Oh84Yn.mjs";
3
+ import { c as requireApiUrl, n as logger, t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
4
+ import { t as ApiClient } from "../ApiClient-BopvMmQk.mjs";
5
+ import { a as createToolSearchTool, i as buildLlmBackend, n as buildSupportingStores, o as deferredToolRegistry, r as buildSandbox, s as NotifyingLlmBackend, t as buildAgent } from "../buildAgent-P0tOMLt1.mjs";
6
6
  import { randomUUID } from "crypto";
7
7
  import { existsSync, realpathSync, statSync } from "fs";
8
8
  import { isAbsolute } from "path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { l as resolveApiEndpoint, s as parseApiUrl, t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
2
+ import { l as resolveApiEndpoint, s as parseApiUrl, t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
3
3
  //#region src/commands/apiCommand.ts
4
4
  /**
5
5
  * External API config command (--api-url / --reset-api)
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "../package-BqKSCbso.mjs";
2
+ import { t as version } from "../package-CnVCHR3U.mjs";
3
3
  import { a as fetchLatestVersion, c as isNpmPrefixWritable, i as compareSemver } from "../updateChecker-CQW8bxo6.mjs";
4
4
  import { t as checkRipgrep } from "../ripgrepCheck-BmkyTK2i.mjs";
5
5
  import { execSync } from "child_process";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
2
+ import { t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
3
3
  //#region src/commands/envCommand.ts
4
4
  /**
5
5
  * Environment switching for the `--dev` / `--prod` launch flags.
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { $ as RemoteSkillSource, A as FallbackLlmBackend, B as classifyCommandRisk, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, F as loadContextFiles, I as PermissionManager, J as setWebSocketToolExecutor, L as generateCliTools, M as ReActAgent, O as createBackgroundAgentTools, Q as isReadOnlyTool, S as createTodoStore, X as buildSystemPrompt, a as McpManager, b as createWorkItemTools, et as CustomCommandStore, i as AgentStore, k as createAgentDelegateTool, n as BackgroundAgentManager, nt as SessionStore, o as createSseBackend, r as SubagentOrchestrator, t as AgentHistoryStore, tt as CheckpointStore, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool, z as SHELL_LIKE_TOOL_COMMAND_FIELDS } from "../AgentHistoryStore-C8uUKjjC.mjs";
3
- import { c as requireApiUrl, n as logger, t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
4
- import { t as ApiClient } from "../ApiClient-B_CQrUiF.mjs";
2
+ import { $ as RemoteSkillSource, A as FallbackLlmBackend, B as classifyCommandRisk, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, F as loadContextFiles, I as PermissionManager, J as setWebSocketToolExecutor, L as generateCliTools, M as ReActAgent, O as createBackgroundAgentTools, Q as isReadOnlyTool, S as createTodoStore, X as buildSystemPrompt, a as McpManager, b as createWorkItemTools, et as CustomCommandStore, i as AgentStore, k as createAgentDelegateTool, n as BackgroundAgentManager, nt as SessionStore, o as createSseBackend, r as SubagentOrchestrator, t as AgentHistoryStore, tt as CheckpointStore, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool, z as SHELL_LIKE_TOOL_COMMAND_FIELDS } from "../AgentHistoryStore-T7Oh84Yn.mjs";
3
+ import { c as requireApiUrl, n as logger, t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
4
+ import { t as ApiClient } from "../ApiClient-BopvMmQk.mjs";
5
5
  import { t as DEFAULT_SANDBOX_CONFIG } from "../types-LyRNHOiS.mjs";
6
6
  import { r as reconstructTurnBlocks, t as WorkItemsClient } from "../WorkItemsClient-Cow6nXx7.mjs";
7
7
  import { t as createSandboxRuntime } from "../SandboxRuntimeAdapter-ChGlxSGQ.mjs";
8
8
  import { t as SandboxOrchestrator } from "../SandboxOrchestrator-C8uleDn2.mjs";
9
- import { t as ProxyManager } from "../ProxyManager-C5H0pUyK.mjs";
9
+ import { t as ProxyManager } from "../ProxyManager-C1-lgzEU.mjs";
10
10
  import { randomBytes } from "crypto";
11
11
  import { v4 } from "uuid";
12
12
  import { readFile } from "fs/promises";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
3
- import { t as version } from "../package-BqKSCbso.mjs";
2
+ import { t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
3
+ import { t as version } from "../package-CnVCHR3U.mjs";
4
4
  //#region src/commands/mcpCommand.ts
5
5
  /**
6
6
  * External MCP commands (b4m mcp list, b4m mcp add, etc.)
@@ -70,7 +70,7 @@ async function handleMcpCommand(subcommand, argv) {
70
70
  await handleDisable(config, argv.name, configStore);
71
71
  break;
72
72
  case "serve": {
73
- const { handleMcpServeCommand } = await import("../serve-CuF0I5en.mjs");
73
+ const { handleMcpServeCommand } = await import("../serve-BocVOJ3W.mjs");
74
74
  await handleMcpServeCommand({
75
75
  http: Boolean(argv.http),
76
76
  port: typeof argv.port === "number" ? argv.port : void 0,
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { n as getDefaultPluginsDir, r as isFeatureEnabled, t as PluginStore } from "../PluginStore-DwvOJ-G3.mjs";
3
- import { t as ConfigStore } from "../ConfigStore-DD3DcC3-.mjs";
3
+ import { t as ConfigStore } from "../ConfigStore-cIyF7hDg.mjs";
4
4
  import { execFileSync } from "child_process";
5
5
  import { promises } from "fs";
6
6
  import path from "path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as version } from "../package-BqKSCbso.mjs";
2
+ import { t as version } from "../package-CnVCHR3U.mjs";
3
3
  import { c as isNpmPrefixWritable, l as setAutoUpdatePreference, n as REEXEC_GUARD_ENV, o as forceCheckForUpdate, r as checkForUpdate, s as getAutoUpdatePreference, t as INSTALL_CMD, u as shouldAttemptAutoUpdate } from "../updateChecker-CQW8bxo6.mjs";
4
4
  import { t as checkRipgrep } from "../ripgrepCheck-BmkyTK2i.mjs";
5
5
  import { execSync, spawnSync } from "child_process";
package/dist/index.mjs CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { $ as RemoteSkillSource, A as FallbackLlmBackend, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, G as DEFAULT_THOROUGHNESS, H as DEFAULT_AGENT_MODEL, I as PermissionManager, J as setWebSocketToolExecutor, K as clearFeatureModuleTools, N as findIterationBoundary, O as createBackgroundAgentTools, P as extractCompactInstructions, Q as isReadOnlyTool, R as getProcessHooks, S as createTodoStore, T as parseAgentConfig, U as DEFAULT_MAX_ITERATIONS, V as ALWAYS_DENIED_FOR_AGENTS, W as DEFAULT_RETRY_CONFIG, X as buildSystemPrompt, Y as getPlanModeFilePath, Z as buildSkillsPromptSection, _ as createDecisionStore, at as searchCommands, b as createWorkItemTools, c as isTransientNetworkError, ct as searchFiles, d as createReviewGateTool, et as CustomCommandStore, f as formatReviewGatesOutput, ft as MAX_PASTE_SIZE, g as createDecisionLogTool, h as formatBlockersOutput, it as processFileReferences, j as substituteArguments, k as createAgentDelegateTool, lt as warmFileCache, m as createBlockerTools, nt as SessionStore, ot as mergeCommands, p as createBlockerStore, q as registerFeatureModuleTools, rt as hasFileReferences, st as formatFileSize, tt as CheckpointStore, u as createReviewGateStore, ut as COMPACTION_SUMMARY_MARKER, v as formatDecisionsOutput, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool } from "./AgentHistoryStore-C8uUKjjC.mjs";
2
+ import { $ as RemoteSkillSource, A as FallbackLlmBackend, C as createWriteTodosTool, D as createResumeAgentTool, E as createCoordinateTaskTool, G as DEFAULT_THOROUGHNESS, H as DEFAULT_AGENT_MODEL, I as PermissionManager, J as setWebSocketToolExecutor, K as clearFeatureModuleTools, N as findIterationBoundary, O as createBackgroundAgentTools, P as extractCompactInstructions, Q as isReadOnlyTool, R as getProcessHooks, S as createTodoStore, T as parseAgentConfig, U as DEFAULT_MAX_ITERATIONS, V as ALWAYS_DENIED_FOR_AGENTS, W as DEFAULT_RETRY_CONFIG, X as buildSystemPrompt, Y as getPlanModeFilePath, Z as buildSkillsPromptSection, _ as createDecisionStore, at as searchCommands, b as createWorkItemTools, c as isTransientNetworkError, ct as searchFiles, d as createReviewGateTool, et as CustomCommandStore, f as formatReviewGatesOutput, ft as MAX_PASTE_SIZE, g as createDecisionLogTool, h as formatBlockersOutput, it as processFileReferences, j as substituteArguments, k as createAgentDelegateTool, lt as warmFileCache, m as createBlockerTools, nt as SessionStore, ot as mergeCommands, p as createBlockerStore, q as registerFeatureModuleTools, rt as hasFileReferences, st as formatFileSize, tt as CheckpointStore, u as createReviewGateStore, ut as COMPACTION_SUMMARY_MARKER, v as formatDecisionsOutput, w as createSkillTool, x as createFindDefinitionTool, y as createGetFileStructureTool } from "./AgentHistoryStore-T7Oh84Yn.mjs";
3
3
  import { a as selectLiveSubagentTokens, i as selectLiveSubagentCredits, n as selectActiveBackgroundShells, o as useCliStore, r as selectCompletedBackgroundShells, t as selectActiveBackgroundAgents } from "./store-CvjTpQPs.mjs";
4
4
  import { r as isFeatureEnabled, t as PluginStore } from "./PluginStore-DwvOJ-G3.mjs";
5
- import { a as getCreditsUrl, b as CREDIT_DEDUCT_TRANSACTION_TYPES, c as requireApiUrl, i as LOCAL_DEV_URL, l as resolveApiEndpoint, n as logger, o as getEnvironmentName, r as ApiEndpointUnconfiguredError, s as parseApiUrl, t as ConfigStore, x as ChatModels } from "./ConfigStore-DD3DcC3-.mjs";
5
+ import { a as getCreditsUrl, b as CREDIT_DEDUCT_TRANSACTION_TYPES, c as requireApiUrl, dt as isEarlyStop, i as LOCAL_DEV_URL, l as resolveApiEndpoint, n as logger, o as getEnvironmentName, r as ApiEndpointUnconfiguredError, s as parseApiUrl, t as ConfigStore, x as ChatModels } from "./ConfigStore-cIyF7hDg.mjs";
6
6
  import { t as getShellSessionManager } from "./ShellSessionManager-6o8KZzl1-vrbPAUTq.mjs";
7
- import { n as OAuthClient, t as ApiClient } from "./ApiClient-B_CQrUiF.mjs";
7
+ import { n as OAuthClient, t as ApiClient } from "./ApiClient-BopvMmQk.mjs";
8
8
  import { i as getTokenCounter, n as ConversationContext, r as reconstructTurnBlocks, t as WorkItemsClient } from "./WorkItemsClient-Cow6nXx7.mjs";
9
- import { a as createToolSearchTool, i as buildLlmBackend, n as buildSupportingStores, o as deferredToolRegistry, r as buildSandbox, s as NotifyingLlmBackend, t as buildAgent } from "./buildAgent-mVuXU_H4.mjs";
10
- import { t as version } from "./package-BqKSCbso.mjs";
9
+ import { a as createToolSearchTool, i as buildLlmBackend, n as buildSupportingStores, o as deferredToolRegistry, r as buildSandbox, s as NotifyingLlmBackend, t as buildAgent } from "./buildAgent-P0tOMLt1.mjs";
10
+ import { t as version } from "./package-CnVCHR3U.mjs";
11
11
  import { r as checkForUpdate } from "./updateChecker-CQW8bxo6.mjs";
12
12
  import React, { useCallback, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from "react";
13
13
  import { Box, Static, Text, render, useApp, useInput, usePaste, useStdout } from "ink";
@@ -22,10 +22,10 @@ import Spinner from "ink-spinner";
22
22
  import { useShallow } from "zustand/react/shallow";
23
23
  import TextInput from "ink-text-input";
24
24
  import { z as z$1 } from "zod";
25
+ import { ACTOR_COLOR_SLOTS, actorColorIndex, actorKindMarker, actorKindSchema, selfClaimedActorKindSchema } from "@bike4mind/hearth";
26
+ import axios, { isAxiosError } from "axios";
25
27
  import { marked } from "marked";
26
28
  import { highlight } from "cli-highlight";
27
- import { actorColorIndex } from "@bike4mind/hearth";
28
- import axios, { isAxiosError } from "axios";
29
29
  import SelectInput from "ink-select-input";
30
30
  import jwt from "jsonwebtoken";
31
31
  import open from "open";
@@ -1600,6 +1600,38 @@ const MAX_ITERATIONS_OPTIONS = [
1600
1600
  value: null
1601
1601
  }
1602
1602
  ];
1603
+ /**
1604
+ * 'Auto' (undefined) is first because it is the default and the right answer for almost
1605
+ * everyone: the server then sizes the output ceiling per model, which is what keeps
1606
+ * reasoning models from spending the whole budget on thinking and truncating the answer.
1607
+ * The explicit values exist for deliberately capping a run.
1608
+ */
1609
+ const MAX_TOKENS_OPTIONS = [
1610
+ {
1611
+ label: "Auto (sized for model)",
1612
+ value: void 0
1613
+ },
1614
+ {
1615
+ label: "4096",
1616
+ value: 4096
1617
+ },
1618
+ {
1619
+ label: "8192",
1620
+ value: 8192
1621
+ },
1622
+ {
1623
+ label: "16384",
1624
+ value: 16384
1625
+ },
1626
+ {
1627
+ label: "32000",
1628
+ value: 32e3
1629
+ },
1630
+ {
1631
+ label: "64000",
1632
+ value: 64e3
1633
+ }
1634
+ ];
1603
1635
  const THEME_OPTIONS = [{
1604
1636
  label: "dark",
1605
1637
  value: "dark"
@@ -1654,10 +1686,8 @@ function buildConfigItems(availableModels, pluginDescriptors = []) {
1654
1686
  }, {
1655
1687
  key: "maxTokens",
1656
1688
  label: "Max Tokens",
1657
- type: "number",
1658
- min: 256,
1659
- max: 128e3,
1660
- step: 256,
1689
+ type: "select",
1690
+ options: MAX_TOKENS_OPTIONS,
1661
1691
  getValue: (config) => config.preferences.maxTokens,
1662
1692
  setValue: (config, value) => ({
1663
1693
  ...config,
@@ -2389,7 +2419,7 @@ const MessageItem = React.memo(function MessageItem({ message, showThoughts = tr
2389
2419
  }, message.metadata?.permissionDenied ? /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "⚠️ ", message.content) : /* @__PURE__ */ React.createElement(MarkdownRenderer, {
2390
2420
  content: message.content,
2391
2421
  columns: terminalCols
2392
- })), !isUser && message.content !== "..." && message.metadata && /* @__PURE__ */ React.createElement(Box, {
2422
+ })), !isUser && message.metadata?.earlyStopReason && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, message.metadata.earlyStopReason === "degenerate_repetition" ? "⚠ Response stopped early: it began repeating itself. Try rephrasing the request." : "⚠ Response was cut off at the output-token limit. Type \"continue\" to resume, or raise Max Tokens in /config.")), !isUser && message.content !== "..." && message.metadata && /* @__PURE__ */ React.createElement(Box, {
2393
2423
  paddingLeft: 2,
2394
2424
  marginBottom: 1
2395
2425
  }, (message.metadata.tokenUsage?.total || message.metadata.creditsUsed) && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "(", message.metadata.tokenUsage?.total ? `${message.metadata.tokenUsage.total.toLocaleString()} tokens` : "", message.metadata.creditsUsed && message.metadata.creditsUsed > 0 ? (message.metadata.tokenUsage?.total ? " • " : "") + `used ${message.metadata.creditsUsed.toLocaleString()} ${message.metadata.creditsUsed === 1 ? "credit" : "credits"}` : "", ")")));
@@ -6124,6 +6154,8 @@ const HearthEventSchema = z$1.object({
6124
6154
  actorId: z$1.string(),
6125
6155
  /** Display name resolved by the server so surfaces need no actor lookup. */
6126
6156
  actorName: z$1.string().optional(),
6157
+ /** Resolved server-side; `human` is reserved there and never self-claimed. */
6158
+ actorKind: actorKindSchema.optional(),
6127
6159
  kind: HearthEventKindSchema,
6128
6160
  human: HearthHumanBodySchema,
6129
6161
  machine: HearthMachineBodySchema.optional(),
@@ -6142,7 +6174,14 @@ const HearthEventSchema = z$1.object({
6142
6174
  const HearthSessionSchema = z$1.object({
6143
6175
  id: z$1.string().min(1).max(200),
6144
6176
  /** Friendly name for the session (the notebook name); display only. */
6145
- label: z$1.string().max(200).optional()
6177
+ label: z$1.string().max(200).optional(),
6178
+ /**
6179
+ * What this session IS, so the server badges it honestly. Every write the CLI
6180
+ * makes originates in an LLM tool call, so a CLI session is an agent even
6181
+ * though its name is derived from the human's account. Only the self-claimable
6182
+ * kinds are accepted server-side; 'human' stays reserved there.
6183
+ */
6184
+ kind: selfClaimedActorKindSchema.optional()
6146
6185
  });
6147
6186
  const HearthChannelSchema = z$1.object({
6148
6187
  id: z$1.string(),
@@ -6488,26 +6527,27 @@ function createDelegateTool(service) {
6488
6527
  /**
6489
6528
  * Per-actor color for terminal output.
6490
6529
  *
6491
- * The SLOT comes from @bike4mind/hearth so an actor lands on the same slot here
6492
- * as in the SPA - that shared mapping is the point, since a session that reads
6493
- * as teal in the web channel view and amber in the CLI is two identities to a
6494
- * human, not one. Only the palette is local, because a terminal cannot express
6495
- * the SPA's light/dark hex pairs and vice versa.
6530
+ * Both the SLOT and the hues come from @bike4mind/hearth so an actor lands on
6531
+ * the same color here as in the SPA - a session that reads as green in the web
6532
+ * channel view and amber in the CLI is two identities to a human, not one. Only
6533
+ * the ENCODING is local: the shared palette is light/dark hex pairs, which a
6534
+ * terminal cannot take directly.
6496
6535
  *
6497
- * 256-color foreground codes, chosen to stay legible on BOTH light and dark
6498
- * terminal backgrounds (nothing near-black or near-white) and to remain
6499
- * distinguishable under the common forms of color-vision deficiency - which is
6500
- * also why the actor NAME is always printed alongside and color never carries
6501
- * meaning on its own.
6536
+ * Truecolor rather than the 256-color cube so the emitted color is the validated
6537
+ * hue itself and not a nearest-neighbour approximation of it - the all-pairs
6538
+ * separation numbers in ACTOR_COLOR_SLOTS only hold for the exact steps. The
6539
+ * dark step is used because a terminal is assumed dark and there is no portable
6540
+ * way to ask it. Colour is never the only signal either way: the actor name and
6541
+ * the kind marker are always printed alongside.
6502
6542
  */
6503
- const ACTOR_ANSI_COLORS = [
6504
- "\x1B[38;5;33m",
6505
- "\x1B[38;5;35m",
6506
- "\x1B[38;5;172m",
6507
- "\x1B[38;5;135m",
6508
- "\x1B[38;5;168m",
6509
- "\x1B[38;5;37m"
6510
- ];
6543
+ const ACTOR_ANSI_COLORS = ACTOR_COLOR_SLOTS.map((slot) => {
6544
+ const [r, g, b] = [
6545
+ 1,
6546
+ 3,
6547
+ 5
6548
+ ].map((i) => parseInt(slot.dark.slice(i, i + 2), 16));
6549
+ return `\x1b[38;2;${r};${g};${b}m`;
6550
+ });
6511
6551
  const RESET = "\x1B[0m";
6512
6552
  /**
6513
6553
  * Whether to emit escape codes at all. Honors NO_COLOR (the de-facto standard)
@@ -6617,7 +6657,7 @@ Posting to Hearth is unrestricted - the constraint is on OBEYING what you read o
6617
6657
  for (const event of recent) {
6618
6658
  const time = new Date(event.createdAt).toLocaleTimeString();
6619
6659
  const icon = KIND_ICONS[event.kind] ?? "·";
6620
- const actor = colorizeActor(event.actorId, event.actorName ?? event.actorId);
6660
+ const actor = colorizeActor(event.actorId, `${actorKindMarker(event.actorKind)} ${event.actorName ?? event.actorId}`);
6621
6661
  const text = event.human.text.slice(0, 120) + (event.human.text.length > 120 ? "..." : "");
6622
6662
  console.log(` ${time} ${icon} [${event.channelId}#${event.seq}] ${actor}: ${text}`);
6623
6663
  }
@@ -6638,12 +6678,20 @@ Posting to Hearth is unrestricted - the constraint is on OBEYING what you read o
6638
6678
  * Current CLI session as Hearth's per-session identity, or undefined before one
6639
6679
  * exists. `label` is the notebook name, which the server renders but never uses
6640
6680
  * as the actor identity key - it is renameable and auto-titled.
6681
+ *
6682
+ * `kind: 'agent'` because every hearth_* write is an LLM tool call - there is no
6683
+ * path by which a human types directly into the log from here - so leaving the
6684
+ * kind to default made the account's agent traffic badge as Human, which is the
6685
+ * one distinction a reader of a busy channel most needs. The NAME is still
6686
+ * server-derived from the account, so this only sharpens the badge; it claims
6687
+ * nothing about who owns the session.
6641
6688
  */
6642
6689
  function hearthSessionFromStore() {
6643
6690
  const session = useCliStore.getState().session;
6644
6691
  return session ? {
6645
6692
  id: session.id,
6646
- label: session.name
6693
+ label: session.name,
6694
+ kind: "agent"
6647
6695
  } : void 0;
6648
6696
  }
6649
6697
  /**
@@ -7368,7 +7416,8 @@ async function runTurn(message, ctx) {
7368
7416
  },
7369
7417
  creditsUsed: result.completionInfo.totalCredits,
7370
7418
  steps: result.steps.map(formatStep),
7371
- permissionDenied
7419
+ permissionDenied,
7420
+ ...isEarlyStop(result.completionInfo.finishReason) ? { earlyStopReason: result.completionInfo.finishReason } : {}
7372
7421
  }
7373
7422
  };
7374
7423
  useCliStore.getState().completePendingMessage(0, finalAssistantMessage);
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
  //#region package.json
3
- var version = "0.20.0";
3
+ var version = "0.20.2";
4
4
  //#endregion
5
5
  export { version as t };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { c as requireApiUrl, d as AGENT_QUEST_MANIFEST, f as AGENT_QUEST_MCP_URI, n as logger, s as parseApiUrl, t as ConfigStore, u as AGENT_QUEST_ID } from "./ConfigStore-DD3DcC3-.mjs";
3
- import { t as ApiClient } from "./ApiClient-B_CQrUiF.mjs";
2
+ import { c as requireApiUrl, d as AGENT_QUEST_MANIFEST, f as AGENT_QUEST_MCP_URI, n as logger, s as parseApiUrl, t as ConfigStore, u as AGENT_QUEST_ID } from "./ConfigStore-cIyF7hDg.mjs";
3
+ import { t as ApiClient } from "./ApiClient-BopvMmQk.mjs";
4
4
  import { z as z$1 } from "zod";
5
5
  import { isAxiosError } from "axios";
6
6
  import { Writable } from "node:stream";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bike4mind/cli",
3
- "version": "0.20.0",
3
+ "version": "0.20.2",
4
4
  "type": "module",
5
5
  "description": "Interactive CLI tool for Bike4Mind with ReAct agents",
6
6
  "license": "UNLICENSED",
@@ -110,7 +110,7 @@
110
110
  "zod": "^4.4.3",
111
111
  "zod-validation-error": "^5.0.0",
112
112
  "zustand": "^5.0.13",
113
- "@bike4mind/hearth": "0.2.0"
113
+ "@bike4mind/hearth": "0.3.0"
114
114
  },
115
115
  "devDependencies": {
116
116
  "@types/better-sqlite3": "^7.6.13",
@@ -126,14 +126,14 @@
126
126
  "tsx": "^4.23.0",
127
127
  "typescript": "^5.9.3",
128
128
  "vitest": "^4.1.10",
129
- "@bike4mind/agents": "0.20.0",
130
- "@bike4mind/common": "4.0.0",
131
- "@bike4mind/fab-pipeline": "1.0.0",
132
- "@bike4mind/llm-adapters": "0.11.0",
133
- "@bike4mind/mcp": "1.41.1",
129
+ "@bike4mind/agents": "0.20.3",
130
+ "@bike4mind/common": "6.0.0",
131
+ "@bike4mind/fab-pipeline": "1.2.0",
132
+ "@bike4mind/llm-adapters": "0.12.0",
133
+ "@bike4mind/mcp": "1.41.4",
134
134
  "@bike4mind/observability": "0.2.0",
135
- "@bike4mind/services": "4.0.0",
136
- "@bike4mind/utils": "3.1.0"
135
+ "@bike4mind/services": "6.1.0",
136
+ "@bike4mind/utils": "4.2.0"
137
137
  },
138
138
  "optionalDependencies": {
139
139
  "@vscode/ripgrep": "^1.18.0"
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import { t as ProxyManager } from "./ProxyManager-C5H0pUyK.mjs";
3
- export { ProxyManager };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { EventEmitter } from "events";
3
2
  import http from "http";
3
+ import { EventEmitter } from "events";
4
4
  import net from "net";
5
5
  //#region src/sandbox/proxy/domainMatcher.ts
6
6
  /**