talon-agent 3.32.1 → 3.33.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 (115) hide show
  1. package/package.json +1 -1
  2. package/src/backend/claude-sdk/constants.ts +1 -6
  3. package/src/backend/claude-sdk/index.ts +2 -11
  4. package/src/backend/claude-sdk/models/parsing.ts +2 -2
  5. package/src/backend/claude-sdk/plan-usage.ts +0 -5
  6. package/src/backend/claude-sdk/stream.ts +1 -1
  7. package/src/backend/codex/auth.ts +2 -2
  8. package/src/backend/codex/constants.ts +0 -21
  9. package/src/backend/codex/handler/index.ts +0 -1
  10. package/src/backend/codex/mcp-config.ts +2 -2
  11. package/src/backend/codex/plan-usage.ts +0 -5
  12. package/src/backend/codex/state.ts +1 -1
  13. package/src/backend/codex/token-usage.ts +1 -1
  14. package/src/backend/kilo/index.ts +0 -6
  15. package/src/backend/kilo/server.ts +2 -22
  16. package/src/backend/kilo/sessions.ts +0 -3
  17. package/src/backend/openai-agents/handler/index.ts +0 -1
  18. package/src/backend/openai-agents/handler/state.ts +0 -5
  19. package/src/backend/openai-agents/init.ts +1 -18
  20. package/src/backend/opencode/index.ts +0 -4
  21. package/src/backend/opencode/server.ts +1 -10
  22. package/src/backend/opencode/sessions.ts +0 -3
  23. package/src/backend/remote-server/client.ts +1 -1
  24. package/src/backend/remote-server/events.ts +1 -1
  25. package/src/backend/remote-server/index.ts +4 -27
  26. package/src/backend/remote-server/mcp.ts +1 -4
  27. package/src/backend/remote-server/model-catalog/catalog.ts +1 -1
  28. package/src/backend/remote-server/model-catalog/index.ts +1 -15
  29. package/src/backend/remote-server/model-catalog/provider.ts +0 -1
  30. package/src/backend/remote-server/sse-stream.ts +1 -3
  31. package/src/backend/remote-server/turn-timeout.ts +1 -1
  32. package/src/backend/shared/index.ts +7 -43
  33. package/src/cli/logs.ts +1 -1
  34. package/src/cli/status.ts +1 -1
  35. package/src/core/agent-runtime/backend-registry.ts +1 -1
  36. package/src/core/agent-runtime/capabilities.ts +1 -1
  37. package/src/core/agent-runtime/events.ts +1 -1
  38. package/src/core/background/heartbeat/agent.ts +1 -1
  39. package/src/core/background/heartbeat/index.ts +1 -2
  40. package/src/core/background/isolated-agent.ts +1 -1
  41. package/src/core/background/triggers/exit.ts +1 -1
  42. package/src/core/background/triggers/index.ts +1 -1
  43. package/src/core/bus/events.ts +2 -2
  44. package/src/core/doctor.ts +1 -1
  45. package/src/core/engine/backend-controller/index.ts +1 -3
  46. package/src/core/engine/backend-controller/rebind.ts +2 -2
  47. package/src/core/engine/dispatcher.ts +1 -15
  48. package/src/core/engine/gateway-actions/index.ts +0 -3
  49. package/src/core/engine/gateway-actions/types.ts +1 -1
  50. package/src/core/frontend-runtime/capabilities.ts +0 -2
  51. package/src/core/frontend-runtime/index.ts +1 -6
  52. package/src/core/frontend-runtime/routing.ts +0 -1
  53. package/src/core/mcp-hub/children.ts +0 -5
  54. package/src/core/mesh/index.ts +1 -18
  55. package/src/core/models/active-model.ts +0 -19
  56. package/src/core/plugin/index.ts +0 -1
  57. package/src/core/plugin/registry.ts +1 -1
  58. package/src/core/prompt/templates.ts +0 -5
  59. package/src/core/scripting/lua-runner.ts +1 -1
  60. package/src/core/scripts/runner.ts +1 -1
  61. package/src/core/soul/critic.ts +1 -1
  62. package/src/core/soul/embedder.ts +2 -2
  63. package/src/core/soul/governance.ts +1 -1
  64. package/src/core/soul/hdc.ts +1 -1
  65. package/src/core/soul/reflex.ts +2 -2
  66. package/src/core/soul/retrieve.ts +1 -1
  67. package/src/core/soul/signals.ts +4 -4
  68. package/src/core/soul/types.ts +1 -1
  69. package/src/core/tasks/index.ts +0 -4
  70. package/src/core/tasks/types.ts +1 -1
  71. package/src/core/tools/index.ts +1 -6
  72. package/src/core/tools/mcp-env.ts +3 -33
  73. package/src/core/types.ts +1 -1
  74. package/src/core/update/self-update.ts +1 -1
  75. package/src/core/vfs/fusefs.ts +1 -1
  76. package/src/core/vfs/types.ts +1 -1
  77. package/src/core/weaver/index.ts +1 -1
  78. package/src/core/weaver/typing-loop.ts +1 -1
  79. package/src/frontend/discord/actions/types.ts +1 -1
  80. package/src/frontend/discord/commands/definitions.ts +1 -1
  81. package/src/frontend/discord/handlers/access.ts +0 -5
  82. package/src/frontend/discord/handlers/index.ts +2 -15
  83. package/src/frontend/discord/handlers/registry.ts +0 -6
  84. package/src/frontend/native/protocol.ts +1 -4
  85. package/src/frontend/native/server.ts +1 -1
  86. package/src/frontend/shared/status-context.ts +1 -1
  87. package/src/frontend/telegram/actions/types.ts +1 -1
  88. package/src/frontend/telegram/commands/index.ts +1 -1
  89. package/src/frontend/telegram/commands/state.ts +1 -1
  90. package/src/frontend/telegram/handlers/index.ts +0 -1
  91. package/src/frontend/telegram/helpers/menu.ts +1 -1
  92. package/src/frontend/terminal/commands.ts +1 -4
  93. package/src/frontend/terminal/renderer.ts +1 -1
  94. package/src/frontend/whatsapp/actions/chat-info.ts +0 -3
  95. package/src/frontend/whatsapp/actions/messaging.ts +1 -7
  96. package/src/frontend/whatsapp/actions/shared.ts +1 -1
  97. package/src/frontend/whatsapp/actions/types.ts +1 -1
  98. package/src/frontend/whatsapp/formatting.ts +1 -1
  99. package/src/frontend/whatsapp/media-store.ts +1 -1
  100. package/src/frontend/whatsapp/pins.ts +0 -5
  101. package/src/native/fusefs.ts +3 -3
  102. package/src/native/scheduler-core.ts +1 -1
  103. package/src/native/warden.ts +2 -2
  104. package/src/plugins/mempalace/provision.ts +1 -5
  105. package/src/plugins/playwright/provision.ts +1 -1
  106. package/src/storage/db.ts +1 -1
  107. package/src/storage/goal-store.ts +1 -5
  108. package/src/storage/metrics.ts +0 -5
  109. package/src/storage/repositories/scripts-repo.ts +0 -5
  110. package/src/storage/scheduled-store.ts +1 -5
  111. package/src/storage/script-store.ts +5 -13
  112. package/src/storage/sessions.ts +0 -3
  113. package/src/storage/skill-store.ts +3 -3
  114. package/src/util/exec-output.ts +1 -1
  115. package/src/util/mcp-launcher.ts +3 -0
@@ -19,7 +19,6 @@ import {
19
19
  userMessageTimestamps,
20
20
  RATE_LIMIT_WINDOW_MS,
21
21
  RATE_LIMIT_MAX_MESSAGES,
22
- type AccessConfig,
23
22
  } from "./state.js";
24
23
 
25
24
  export function setAccessControl(cfg: {
@@ -42,10 +41,6 @@ export function isAdmin(userId: string): boolean {
42
41
  return accessState.access.adminUserIds.has(userId);
43
42
  }
44
43
 
45
- export function getAccessSnapshot(): AccessConfig {
46
- return accessState.access;
47
- }
48
-
49
44
  export function trackDmUser(
50
45
  senderId: string,
51
46
  senderName: string,
@@ -15,20 +15,7 @@
15
15
  * Re-exports the same public surface the old single-file module exposed.
16
16
  */
17
17
 
18
- export type { DiscordChatInfo } from "./registry.js";
19
- export {
20
- registerDiscordChat,
21
- lookupDiscordChat,
22
- lookupDiscordChatByString,
23
- } from "./registry.js";
24
- export {
25
- setAccessControl,
26
- isAdmin,
27
- getAccessSnapshot,
28
- isAccessAllowed,
29
- isInteractionAllowed,
30
- shouldHandleInGuild,
31
- isUserRateLimited,
32
- } from "./access.js";
18
+ export { registerDiscordChat, lookupDiscordChat } from "./registry.js";
19
+ export { setAccessControl, isAdmin, isInteractionAllowed } from "./access.js";
33
20
  export { getSenderName, sendChunked } from "./context.js";
34
21
  export { handleMessage } from "./messages.js";
@@ -21,9 +21,3 @@ export function lookupDiscordChat(
21
21
  ): DiscordChatInfo | undefined {
22
22
  return chatRegistry.get(numericChatId);
23
23
  }
24
-
25
- export function lookupDiscordChatByString(
26
- chatId: string,
27
- ): DiscordChatInfo | undefined {
28
- return chatRegistryByString.get(chatId);
29
- }
@@ -26,7 +26,7 @@ export const BOT_SENDER_ID = 0;
26
26
  /** History sender id used for the human on the other end of a native chat. */
27
27
  export const USER_SENDER_ID = 1;
28
28
 
29
- export type ClientRole = "user" | "assistant" | "system";
29
+ type ClientRole = "user" | "assistant" | "system";
30
30
 
31
31
  /** An inline button. `url` opens a link; `data` is an opaque callback token. */
32
32
  export type ClientButton = { text: string; url?: string; data?: string };
@@ -238,7 +238,6 @@ export type {
238
238
  DeviceCommandResult,
239
239
  DeviceInfo,
240
240
  DeviceLocation,
241
- DevicePlatform,
242
241
  } from "../../core/mesh/types.js";
243
242
  import type { DeviceCommand as MeshDeviceCommand } from "../../core/mesh/types.js";
244
243
 
@@ -323,5 +322,3 @@ export function historyToClientMessage(
323
322
  ts: m.timestamp,
324
323
  };
325
324
  }
326
-
327
- export { toDeviceInfo, toDeviceLocation } from "../../core/mesh/types.js";
@@ -48,7 +48,7 @@ import {
48
48
  import type { ConfigSnapshot } from "./settings.js";
49
49
 
50
50
  /** Optional attachment references carried alongside a sent message. */
51
- export type SendOptions = {
51
+ type SendOptions = {
52
52
  /** Relative bridge path to render inline (e.g. `/media?id=…`). */
53
53
  imagePath?: string;
54
54
  /** Absolute on-disk path handed to the model so it can read the file. */
@@ -292,7 +292,7 @@ export function buildCacheDisplay(input: {
292
292
  /** Figures older than this are labelled with their age in /status. */
293
293
  const PLAN_STALE_AFTER_MS = 5 * 60_000;
294
294
 
295
- export interface PlanWindowDisplay {
295
+ interface PlanWindowDisplay {
296
296
  label: string;
297
297
  percent: number;
298
298
  bar: string;
@@ -20,7 +20,7 @@ export interface TelegramActionContext {
20
20
  scheduledMessages: Map<string, ReturnType<typeof setTimeout>>;
21
21
  }
22
22
 
23
- export type TelegramActionHandler = (
23
+ type TelegramActionHandler = (
24
24
  body: Record<string, unknown>,
25
25
  chatId: number,
26
26
  ctx: TelegramActionContext,
@@ -24,7 +24,7 @@ import { registerSettingsCommands } from "./settings.js";
24
24
  import { registerAdminCommands } from "./admin.js";
25
25
  import { registerWhatsAppPairingCommand } from "./whatsapp-pairing.js";
26
26
 
27
- export { TELEGRAM_COMMANDS, telegramCommandMenu } from "./definitions.js";
27
+ export { telegramCommandMenu } from "./definitions.js";
28
28
  export { setAdminUserId } from "./state.js";
29
29
 
30
30
  export function registerCommands(
@@ -11,7 +11,7 @@ import type { Context } from "grammy";
11
11
  import type { Backend } from "../../../core/agent-runtime/capabilities.js";
12
12
 
13
13
  /** Admin user ID is set via talon.json or TALON_ADMIN_USER_ID env var. */
14
- export const adminState = { adminUserId: 0 };
14
+ const adminState = { adminUserId: 0 };
15
15
 
16
16
  /** Set the admin user ID (called from config at startup). */
17
17
  export function setAdminUserId(id: number | undefined): void {
@@ -16,7 +16,6 @@
16
16
  export {
17
17
  setAccessControl,
18
18
  shouldHandleInGroup,
19
- isAccessAllowed,
20
19
  extractUnauthorizedPreview,
21
20
  } from "./access.js";
22
21
  export {
@@ -75,7 +75,7 @@ export interface SettingsPager {
75
75
  * callback for disabled-edge buttons (Telegram requires every inline
76
76
  * button to carry callback data).
77
77
  */
78
- export function renderModelPickerControlRows(
78
+ function renderModelPickerControlRows(
79
79
  pager: SettingsPager,
80
80
  navPrefix: string,
81
81
  noopData: string,
@@ -62,10 +62,7 @@ export type CommandContext = {
62
62
  backend?: Backend | null;
63
63
  };
64
64
 
65
- export type CommandHandler = (
66
- args: string,
67
- ctx: CommandContext,
68
- ) => Promise<void>;
65
+ type CommandHandler = (args: string, ctx: CommandContext) => Promise<void>;
69
66
 
70
67
  export type Command = {
71
68
  name: string;
@@ -11,7 +11,7 @@ import { formatUsd } from "../shared/format.js";
11
11
 
12
12
  // ── Types ────────────────────────────────────────────────────────────────────
13
13
 
14
- export type StatusBarInfo = {
14
+ type StatusBarInfo = {
15
15
  model: string;
16
16
  sessionName?: string;
17
17
  turns: number;
@@ -6,7 +6,6 @@
6
6
  * assembled from the registry and the profile endpoints.
7
7
  */
8
8
 
9
- import { downloadMediaMessage } from "baileys";
10
9
  import { lookupMessage } from "../message-store.js";
11
10
  import { toUserJid, tryAction } from "./shared.js";
12
11
  import type { WhatsAppActionHandlers } from "./types.js";
@@ -224,5 +223,3 @@ export const chatInfoHandlers: WhatsAppActionHandlers = {
224
223
  };
225
224
  }),
226
225
  };
227
-
228
- export { downloadMediaMessage };
@@ -11,11 +11,7 @@ import { randomUUID } from "node:crypto";
11
11
  import { proto } from "baileys";
12
12
  import { log } from "../../../util/log.js";
13
13
  import { toWhatsAppText } from "../formatting.js";
14
- import {
15
- lookupMessage,
16
- rememberMessage,
17
- resolveKey,
18
- } from "../message-store.js";
14
+ import { lookupMessage, resolveKey } from "../message-store.js";
19
15
  import { recordPin, listPins, forgetPin } from "../pins.js";
20
16
  import {
21
17
  resolveQuoted,
@@ -293,5 +289,3 @@ export const messagingHandlers: WhatsAppActionHandlers = {
293
289
  };
294
290
  },
295
291
  };
296
-
297
- export { rememberMessage };
@@ -177,7 +177,7 @@ function outboundTextMarker(content: AnyMessageContent): string {
177
177
  const SEND_TIMEOUT_MS = 60_000;
178
178
  let sendTail: Promise<unknown> = Promise.resolve();
179
179
 
180
- export class WhatsAppSendTimeoutError extends Error {
180
+ class WhatsAppSendTimeoutError extends Error {
181
181
  constructor(operation: string) {
182
182
  super(
183
183
  `WhatsApp ${operation} timed out after ${SEND_TIMEOUT_MS / 1000}s — ` +
@@ -25,7 +25,7 @@ export interface WhatsAppActionContext {
25
25
  scheduledMessages: Map<string, ReturnType<typeof setTimeout>>;
26
26
  }
27
27
 
28
- export type WhatsAppActionHandler = (
28
+ type WhatsAppActionHandler = (
29
29
  body: Record<string, unknown>,
30
30
  chatId: number,
31
31
  ctx: WhatsAppActionContext,
@@ -17,7 +17,7 @@ import { marked, type Token, type Tokens } from "marked";
17
17
  import { splitMessage } from "../telegram/formatting.js";
18
18
 
19
19
  /** WhatsApp accepts far more, but long bubbles read badly on a phone. */
20
- export const WHATSAPP_MAX_TEXT = 4096;
20
+ const WHATSAPP_MAX_TEXT = 4096;
21
21
 
22
22
  /** Rendered width of a table cell, for the monospace fallback. */
23
23
  const MAX_TABLE_CELL = 24;
@@ -31,7 +31,7 @@ export type SavedMedia = {
31
31
  };
32
32
 
33
33
  /** The media kind carried by a message, if any. */
34
- export function mediaKindOf(
34
+ function mediaKindOf(
35
35
  message: WAMessage,
36
36
  ): (typeof MEDIA_KINDS)[number] | undefined {
37
37
  const content = message.message;
@@ -45,8 +45,3 @@ export function forgetPin(chatId: string, msgId: number): void {
45
45
  export function listPins(chatId: string): PinnedMessage[] {
46
46
  return pinsByChat.get(chatId) ?? [];
47
47
  }
48
-
49
- /** Test seam: forget every recorded pin. */
50
- export function resetPins(): void {
51
- pinsByChat.clear();
52
- }
@@ -20,7 +20,7 @@ import { createRequire } from "node:module";
20
20
  import { fileURLToPath } from "node:url";
21
21
 
22
22
  /** One root symlink entry the mount serves (a file-backed mount). */
23
- export interface FuseSymlinkSpec {
23
+ interface FuseSymlinkSpec {
24
24
  name: string;
25
25
  target: string;
26
26
  }
@@ -32,7 +32,7 @@ export interface FuseSymlinkSpec {
32
32
  * namespace-relative ("proc/tasks/7"). The reply JSON shapes are
33
33
  * defined by `serveNamespaceRequest` in core/vfs/fusefs.ts.
34
34
  */
35
- export type FuseBridgeHandler = (id: number, op: string, path: string) => void;
35
+ type FuseBridgeHandler = (id: number, op: string, path: string) => void;
36
36
 
37
37
  /** The N-API surface exported by native/talon-fusefs. */
38
38
  export interface NativeFuseFs {
@@ -92,6 +92,6 @@ function loadNativeFuseFs(): NativeFuseFs | null {
92
92
  }
93
93
 
94
94
  /** Tests swap addons via TALON_FUSEFS_NODE and need the memo dropped. */
95
- export function _resetNativeFuseFsForTesting(): void {
95
+ function _resetNativeFuseFsForTesting(): void {
96
96
  addon = undefined;
97
97
  }
@@ -37,7 +37,7 @@ export function backoffDelayMs(
37
37
 
38
38
  // ── Circuit breaker ─────────────────────────────────────────────────────────
39
39
 
40
- export type BreakerState = "closed" | "open" | "half-open";
40
+ type BreakerState = "closed" | "open" | "half-open";
41
41
 
42
42
  export type Breaker = {
43
43
  state: BreakerState;
@@ -28,13 +28,13 @@ import { accessSync, constants } from "node:fs";
28
28
  import { createInterface } from "node:readline";
29
29
  import { fileURLToPath } from "node:url";
30
30
 
31
- export interface WardenStartEvent {
31
+ interface WardenStartEvent {
32
32
  pid: number;
33
33
  /** Linux /proc/<pid>/stat field 22 (jiffies since boot); null off-Linux. */
34
34
  pidStarttime: number | null;
35
35
  }
36
36
 
37
- export interface WardenLineEvent {
37
+ interface WardenLineEvent {
38
38
  stream: "stdout" | "stderr";
39
39
  text: string;
40
40
  /** True when the line exceeded the byte cap and its tail was dropped. */
@@ -148,11 +148,7 @@ export function classifyExternalInstall(pythonPath: string): string {
148
148
  * version, per flavor. Works in both directions (a newer-than-pin
149
149
  * install reconciles down), hence the neutral name.
150
150
  */
151
- export function reconcileHint(
152
- kind: string,
153
- python: string,
154
- target: string,
155
- ): string {
151
+ function reconcileHint(kind: string, python: string, target: string): string {
156
152
  if (kind === "uv-tool") {
157
153
  return `uv tool install --force 'mempalace==${target}'`;
158
154
  }
@@ -57,7 +57,7 @@ export interface PlaywrightProvisionDeps {
57
57
  }
58
58
 
59
59
  /** One entry of playwright-core's browsers.json. */
60
- export interface BrowserDescriptor {
60
+ interface BrowserDescriptor {
61
61
  name: string;
62
62
  revision: string;
63
63
  /** Per-host-platform revisions (e.g. webkit on older macOS). */
package/src/storage/db.ts CHANGED
@@ -37,7 +37,7 @@ import { SCHEMA, dbSql } from "./sql/statements.generated.js";
37
37
  * statements with positional params, identical row object shapes,
38
38
  * multi-statement exec, FTS5 virtual tables).
39
39
  */
40
- export type SqlStatement = {
40
+ type SqlStatement = {
41
41
  get(...params: unknown[]): unknown;
42
42
  all(...params: unknown[]): unknown[];
43
43
  run(...params: unknown[]): unknown;
@@ -34,11 +34,7 @@ export const GOAL_STATUSES: readonly GoalStatus[] = [
34
34
  "completed",
35
35
  "abandoned",
36
36
  ];
37
- export const GOAL_PRIORITIES: readonly GoalPriority[] = [
38
- "low",
39
- "normal",
40
- "high",
41
- ];
37
+ const GOAL_PRIORITIES: readonly GoalPriority[] = ["low", "normal", "high"];
42
38
 
43
39
  /** Statuses that count as "open" — shown to the heartbeat and listings. */
44
40
  export const OPEN_GOAL_STATUSES: readonly GoalStatus[] = ["active", "paused"];
@@ -24,11 +24,6 @@ export function incrementCounter(name: string, amount = 1): void {
24
24
  legacyCounters.set(name, (legacyCounters.get(name) ?? 0) + amount);
25
25
  }
26
26
 
27
- export function recordHistogram(_name: string, _value: number): void {
28
- // The old global histogram ring is intentionally gone. Chat-turn
29
- // histograms are now latency aggregates on SessionMetrics.
30
- }
31
-
32
27
  function addCounter(
33
28
  counters: Record<string, number>,
34
29
  name: string,
@@ -79,11 +79,6 @@ export function all(): Script[] {
79
79
  return rows.map(rowToScript);
80
80
  }
81
81
 
82
- export function count(): number {
83
- const row = getDatabase().prepare(scriptsSql.count).get() as { n: number };
84
- return row.n;
85
- }
86
-
87
82
  export function recordUse(name: string, when: number): void {
88
83
  getDatabase().prepare(scriptsSql.recordUse).run(when, name);
89
84
  }
@@ -24,7 +24,7 @@ const KEY = "scheduled.messages";
24
24
  * "dinner in an hour" reminder is noise, not delivery. */
25
25
  export const MAX_OVERDUE_MS = 24 * 60 * 60 * 1000;
26
26
 
27
- export type ScheduledButtonRow = Array<{
27
+ type ScheduledButtonRow = Array<{
28
28
  text: string;
29
29
  url?: string;
30
30
  callback_data?: string;
@@ -67,10 +67,6 @@ export function deleteScheduled(id: string): boolean {
67
67
  return true;
68
68
  }
69
69
 
70
- export function getScheduled(id: string): ScheduledMessage | undefined {
71
- return readAll()[id];
72
- }
73
-
74
70
  /** All pending entries for a frontend, soonest first. */
75
71
  export function listScheduled(frontend: string): ScheduledMessage[] {
76
72
  return Object.values(readAll())
@@ -25,11 +25,7 @@ import * as repo from "./repositories/scripts-repo.js";
25
25
  export type { Script, ScriptLanguage } from "./repositories/scripts-repo.js";
26
26
  import type { Script, ScriptLanguage } from "./repositories/scripts-repo.js";
27
27
 
28
- export const SCRIPT_LANGUAGES: readonly ScriptLanguage[] = [
29
- "bash",
30
- "python",
31
- "node",
32
- ];
28
+ const SCRIPT_LANGUAGES: readonly ScriptLanguage[] = ["bash", "python", "node"];
33
29
 
34
30
  /**
35
31
  * Stricter than the trigger name rule: a script name doubles as its
@@ -81,16 +77,16 @@ export function validateScriptDescription(description: string): string | null {
81
77
 
82
78
  // ── Script files ────────────────────────────────────────────────────────────
83
79
 
84
- export function scriptsDir(): string {
80
+ function scriptsDir(): string {
85
81
  return dirs.scripts;
86
82
  }
87
83
 
88
- export function scriptFilePath(name: string, lang: ScriptLanguage): string {
84
+ function scriptFilePath(name: string, lang: ScriptLanguage): string {
89
85
  return resolve(scriptsDir(), `${name}.${EXTENSIONS[lang]}`);
90
86
  }
91
87
 
92
88
  /** Write a script's body, creating the scripts dir as needed. */
93
- export function writeScriptFile(
89
+ function writeScriptFile(
94
90
  name: string,
95
91
  lang: ScriptLanguage,
96
92
  body: string,
@@ -104,7 +100,7 @@ export function writeScriptFile(
104
100
 
105
101
  // ── CRUD ────────────────────────────────────────────────────────────────────
106
102
 
107
- export function generateScriptId(): string {
103
+ function generateScriptId(): string {
108
104
  return `script_${randomUUID()}`;
109
105
  }
110
106
 
@@ -152,10 +148,6 @@ export function getAllScripts(): Script[] {
152
148
  return repo.all();
153
149
  }
154
150
 
155
- export function countScripts(): number {
156
- return repo.count();
157
- }
158
-
159
151
  export function recordScriptUse(name: string): void {
160
152
  repo.recordUse(name, Date.now());
161
153
  }
@@ -28,11 +28,8 @@ export type {
28
28
  MetricsCounterSet,
29
29
  MetricsGrain,
30
30
  MetricsLatencyAgg,
31
- SessionMetrics,
32
31
  SessionState,
33
- SessionUsage,
34
32
  } from "./session-record.js";
35
- export { emptyMetrics, normaliseMetrics } from "./session-record.js";
36
33
  import {
37
34
  emptyCounters,
38
35
  emptyGrain,
@@ -66,15 +66,15 @@ const BODY_MAX_BYTES = 128 * 1024;
66
66
  const PROMPT_LIST_LIMIT = 25;
67
67
  const SEARCH_RESULT_LIMIT = 10;
68
68
 
69
- export function skillsDir(): string {
69
+ function skillsDir(): string {
70
70
  return dirs.skills;
71
71
  }
72
72
 
73
- export function skillDir(name: string): string {
73
+ function skillDir(name: string): string {
74
74
  return resolve(skillsDir(), name);
75
75
  }
76
76
 
77
- export function skillFilePath(name: string): string {
77
+ function skillFilePath(name: string): string {
78
78
  return resolve(skillDir(name), SKILL_FILE);
79
79
  }
80
80
 
@@ -11,7 +11,7 @@
11
11
  */
12
12
 
13
13
  /** In-memory cap while capturing one child-process output stream. */
14
- export const MAX_EXEC_CAPTURE_BYTES = 4 * 1024 * 1024;
14
+ const MAX_EXEC_CAPTURE_BYTES = 4 * 1024 * 1024;
15
15
 
16
16
  /** Ceiling on each rendered exec stream (stdout, stderr independently). */
17
17
  export const MAX_EXEC_RENDER_CHARS = 30_000;
@@ -83,6 +83,9 @@ export const MCP_LAUNCH_SUBCOMMAND = "_mcp-launch";
83
83
  * `[command, ...argsPrefix]` that launches an entry which DOES dispatch
84
84
  * (e.g. `["node", "--import", "<tsx esm url>",
85
85
  * "<abs path to src/cli.ts>"]`).
86
+ *
87
+ * @public — consumed by embedders (and the integration probe), not by
88
+ * Talon's own graph, so knip must not report it.
86
89
  */
87
90
  export const SUPERVISOR_CMD_ENV = "TALON_MCP_SUPERVISOR_CMD";
88
91