@geteigen/cli 0.0.0-stage → 3.0.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 (168) hide show
  1. package/README.md +154 -2
  2. package/dist/agent.d.ts +32 -0
  3. package/dist/agent.js +246 -0
  4. package/dist/auth.d.ts +5 -0
  5. package/dist/auth.js +33 -0
  6. package/dist/cli/src/agent.d.ts +24 -0
  7. package/dist/cli/src/agent.js +260 -0
  8. package/dist/cli/src/agentTools.d.ts +10 -0
  9. package/dist/cli/src/agentTools.js +70 -0
  10. package/dist/cli/src/auth.d.ts +5 -0
  11. package/dist/cli/src/auth.js +33 -0
  12. package/dist/cli/src/config.d.ts +11 -0
  13. package/dist/cli/src/config.js +51 -0
  14. package/dist/cli/src/cursorAuth.d.ts +10 -0
  15. package/dist/cli/src/cursorAuth.js +92 -0
  16. package/dist/cli/src/index.d.ts +2 -0
  17. package/dist/cli/src/index.js +244 -0
  18. package/dist/cli/src/listModels.d.ts +14 -0
  19. package/dist/cli/src/listModels.js +196 -0
  20. package/dist/cli/src/listSessions.d.ts +9 -0
  21. package/dist/cli/src/listSessions.js +37 -0
  22. package/dist/cli/src/machineConfig.d.ts +20 -0
  23. package/dist/cli/src/machineConfig.js +66 -0
  24. package/dist/cli/src/pickFolder.d.ts +5 -0
  25. package/dist/cli/src/pickFolder.js +65 -0
  26. package/dist/cli/src/proc.d.ts +23 -0
  27. package/dist/cli/src/proc.js +77 -0
  28. package/dist/cli/src/service.d.ts +17 -0
  29. package/dist/cli/src/service.js +246 -0
  30. package/dist/cli/src/workRoots.d.ts +30 -0
  31. package/dist/cli/src/workRoots.js +221 -0
  32. package/dist/cli/src/worker.d.ts +8 -0
  33. package/dist/cli/src/worker.js +51 -0
  34. package/dist/cli/src/workerCore.d.ts +47 -0
  35. package/dist/cli/src/workerCore.js +702 -0
  36. package/dist/cli/src/workspace.d.ts +8 -0
  37. package/dist/cli/src/workspace.js +269 -0
  38. package/dist/config.d.ts +11 -0
  39. package/dist/config.js +51 -0
  40. package/dist/cursorAuth.d.ts +10 -0
  41. package/dist/cursorAuth.js +95 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +108 -0
  44. package/dist/listModels.d.ts +6 -0
  45. package/dist/listModels.js +62 -0
  46. package/dist/listSessions.d.ts +9 -0
  47. package/dist/listSessions.js +37 -0
  48. package/dist/pickFolder.d.ts +5 -0
  49. package/dist/pickFolder.js +65 -0
  50. package/dist/shared/actionDrafts.d.ts +83 -0
  51. package/dist/shared/actionDrafts.js +169 -0
  52. package/dist/shared/agentArtifacts.d.ts +49 -0
  53. package/dist/shared/agentArtifacts.js +169 -0
  54. package/dist/shared/agentLabel.d.ts +18 -0
  55. package/dist/shared/agentLabel.js +22 -0
  56. package/dist/shared/agentMentions.d.ts +38 -0
  57. package/dist/shared/agentMentions.js +110 -0
  58. package/dist/shared/agentRepos.d.ts +28 -0
  59. package/dist/shared/agentRepos.js +60 -0
  60. package/dist/shared/agentRunStatus.d.ts +12 -0
  61. package/dist/shared/agentRunStatus.js +17 -0
  62. package/dist/shared/agentUsage.d.ts +24 -0
  63. package/dist/shared/agentUsage.js +139 -0
  64. package/dist/shared/approvals.d.ts +44 -0
  65. package/dist/shared/approvals.js +97 -0
  66. package/dist/shared/askEigen.d.ts +190 -0
  67. package/dist/shared/askEigen.js +76 -0
  68. package/dist/shared/attribution.d.ts +25 -0
  69. package/dist/shared/attribution.js +63 -0
  70. package/dist/shared/automations.d.ts +136 -0
  71. package/dist/shared/automations.js +546 -0
  72. package/dist/shared/backends/claudeCode.d.ts +42 -0
  73. package/dist/shared/backends/claudeCode.js +540 -0
  74. package/dist/shared/backends/codex.d.ts +15 -0
  75. package/dist/shared/backends/codex.js +287 -0
  76. package/dist/shared/backends/cursor.d.ts +102 -0
  77. package/dist/shared/backends/cursor.js +1197 -0
  78. package/dist/shared/backends/index.d.ts +18 -0
  79. package/dist/shared/backends/index.js +58 -0
  80. package/dist/shared/backends/opencode.d.ts +40 -0
  81. package/dist/shared/backends/opencode.js +397 -0
  82. package/dist/shared/backends/types.d.ts +171 -0
  83. package/dist/shared/backends/types.js +19 -0
  84. package/dist/shared/backends/usage.d.ts +8 -0
  85. package/dist/shared/backends/usage.js +71 -0
  86. package/dist/shared/billingPlans.d.ts +60 -0
  87. package/dist/shared/billingPlans.js +262 -0
  88. package/dist/shared/brain.d.ts +353 -0
  89. package/dist/shared/brain.js +487 -0
  90. package/dist/shared/clarifyingQuestions.d.ts +13 -0
  91. package/dist/shared/clarifyingQuestions.js +207 -0
  92. package/dist/shared/claudeModels.d.ts +10 -0
  93. package/dist/shared/claudeModels.js +52 -0
  94. package/dist/shared/cloudBackends.d.ts +21 -0
  95. package/dist/shared/cloudBackends.js +29 -0
  96. package/dist/shared/codexModels.d.ts +10 -0
  97. package/dist/shared/codexModels.js +28 -0
  98. package/dist/shared/contextWindows.d.ts +2 -0
  99. package/dist/shared/contextWindows.js +30 -0
  100. package/dist/shared/cursorMcpConfig.d.ts +14 -0
  101. package/dist/shared/cursorMcpConfig.js +43 -0
  102. package/dist/shared/cursorProjectMcp.d.ts +10 -0
  103. package/dist/shared/cursorProjectMcp.js +42 -0
  104. package/dist/shared/docs.d.ts +59 -0
  105. package/dist/shared/docs.js +87 -0
  106. package/dist/shared/events.d.ts +929 -0
  107. package/dist/shared/events.js +59 -0
  108. package/dist/shared/integrations.d.ts +266 -0
  109. package/dist/shared/integrations.js +449 -0
  110. package/dist/shared/issueTranscript.d.ts +64 -0
  111. package/dist/shared/issueTranscript.js +387 -0
  112. package/dist/shared/issues.d.ts +139 -0
  113. package/dist/shared/issues.js +217 -0
  114. package/dist/shared/machines.d.ts +115 -0
  115. package/dist/shared/machines.js +58 -0
  116. package/dist/shared/markdownMedia.d.ts +13 -0
  117. package/dist/shared/markdownMedia.js +41 -0
  118. package/dist/shared/notificationText.d.ts +6 -0
  119. package/dist/shared/notificationText.js +38 -0
  120. package/dist/shared/opencodeModels.d.ts +19 -0
  121. package/dist/shared/opencodeModels.js +62 -0
  122. package/dist/shared/opencodeSession.d.ts +7 -0
  123. package/dist/shared/opencodeSession.js +30 -0
  124. package/dist/shared/orchestration.d.ts +58 -0
  125. package/dist/shared/orchestration.js +12 -0
  126. package/dist/shared/orgs.d.ts +47 -0
  127. package/dist/shared/orgs.js +49 -0
  128. package/dist/shared/personalOrg.d.ts +5 -0
  129. package/dist/shared/personalOrg.js +12 -0
  130. package/dist/shared/plans.d.ts +3 -0
  131. package/dist/shared/plans.js +19 -0
  132. package/dist/shared/providerModels.d.ts +40 -0
  133. package/dist/shared/providerModels.js +503 -0
  134. package/dist/shared/roomAttention.d.ts +17 -0
  135. package/dist/shared/roomAttention.js +36 -0
  136. package/dist/shared/roomContext.d.ts +120 -0
  137. package/dist/shared/roomContext.js +133 -0
  138. package/dist/shared/roomPermissions.d.ts +56 -0
  139. package/dist/shared/roomPermissions.js +133 -0
  140. package/dist/shared/sessionSeats.d.ts +29 -0
  141. package/dist/shared/sessionSeats.js +57 -0
  142. package/dist/shared/slashCommands.d.ts +39 -0
  143. package/dist/shared/slashCommands.js +166 -0
  144. package/dist/shared/space.d.ts +33 -0
  145. package/dist/shared/space.js +54 -0
  146. package/dist/shared/spaceFeed.d.ts +78 -0
  147. package/dist/shared/spaceFeed.js +194 -0
  148. package/dist/shared/stringifyUnknown.d.ts +1 -0
  149. package/dist/shared/stringifyUnknown.js +1 -0
  150. package/dist/shared/swarm.d.ts +320 -0
  151. package/dist/shared/swarm.js +328 -0
  152. package/dist/shared/swarmVisual.d.ts +79 -0
  153. package/dist/shared/swarmVisual.js +212 -0
  154. package/dist/shared/terminalFilter.d.ts +13 -0
  155. package/dist/shared/terminalFilter.js +46 -0
  156. package/dist/shared/toolIntegration.d.ts +56 -0
  157. package/dist/shared/toolIntegration.js +180 -0
  158. package/dist/shared/typing.d.ts +9 -0
  159. package/dist/shared/typing.js +37 -0
  160. package/dist/shared/uploads.d.ts +31 -0
  161. package/dist/shared/uploads.js +65 -0
  162. package/dist/shared/voiceApprovals.d.ts +36 -0
  163. package/dist/shared/voiceApprovals.js +229 -0
  164. package/dist/shared/workspace.d.ts +47 -0
  165. package/dist/shared/workspace.js +40 -0
  166. package/dist/worker.d.ts +1 -0
  167. package/dist/worker.js +266 -0
  168. package/package.json +51 -4
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Reserved `agentId` for people-to-people chat in the Space. No agent ever
3
+ * has this id, so these messages never reach an agent's prompt or tab.
4
+ */
5
+ export const SPACE_CHANNEL_ID = "space";
6
+ export function isSpaceMessage(msg) {
7
+ return msg.agentId === SPACE_CHANNEL_ID;
8
+ }
9
+ export function isIntegratorAgent(agent) {
10
+ return agent.kind === "integrator";
11
+ }
12
+ export function isFeatureAgent(agent) {
13
+ return !isIntegratorAgent(agent);
14
+ }
15
+ /** Keep thinking (and other defined fields) when a later write omits them. */
16
+ export function mergeChatMessage(prev, incoming) {
17
+ if (!prev || prev.id !== incoming.id)
18
+ return incoming;
19
+ const next = { ...prev };
20
+ for (const [key, value] of Object.entries(incoming)) {
21
+ if (value === undefined)
22
+ continue;
23
+ next[key] = value;
24
+ }
25
+ const kept = prev.thinking?.trim() ? prev.thinking : undefined;
26
+ const nextThinking = incoming.thinking?.trim() ? incoming.thinking : undefined;
27
+ if (kept && (!nextThinking || kept.length > nextThinking.length)) {
28
+ next.thinking = kept;
29
+ }
30
+ else if (nextThinking) {
31
+ next.thinking = nextThinking;
32
+ }
33
+ return next;
34
+ }
35
+ /**
36
+ * Kinds that belong in the in-app list and toasts. A room agent finishing a
37
+ * turn ("run_finished") is routine and only reaches the desktop app; an
38
+ * automation run finishing ("automation_finished") is shown, since nobody
39
+ * was watching it.
40
+ */
41
+ export function isInboxNotification(kind) {
42
+ return kind !== "run_finished";
43
+ }
44
+ /** Where a notification opens: its link, else its room. */
45
+ export function notificationHref(n) {
46
+ if (n.href)
47
+ return n.href;
48
+ return n.roomId ? `/room/${encodeURIComponent(n.roomId)}` : null;
49
+ }
50
+ export const AVATAR_COLORS = [
51
+ "#4d9fff",
52
+ "#3ecf8e",
53
+ "#e8a23a",
54
+ "#c084fc",
55
+ "#f07070",
56
+ "#38bdf8",
57
+ "#a3e635",
58
+ "#fb7185",
59
+ ];
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Integrations Hub — Steer-owned MCP credentials for live external actions.
3
+ * Memory lives in Supermemory; live actions go through these connections.
4
+ */
5
+ export type IntegrationProvider = "linear" | "sentry" | "notion" | "github" | "plain" | "posthog" | "custom";
6
+ export type IntegrationCategory = "planning" | "observability" | "docs" | "code" | "support" | "analytics" | "custom";
7
+ /** How Steer connects to the provider's default hosted MCP URL. */
8
+ export type IntegrationCredentialKind = "api_key" | "hosted_oauth";
9
+ export interface IntegrationCatalogItem {
10
+ id: IntegrationProvider;
11
+ name: string;
12
+ tagline: string;
13
+ category: IntegrationCategory;
14
+ /** Default streamable-HTTP MCP endpoint. Admins can override (self-hosted). */
15
+ mcpUrl: string;
16
+ /**
17
+ * `api_key` — paste a long-lived token (Linear, GitHub PAT, …).
18
+ * `hosted_oauth` — the vendor's hosted MCP only accepts an OAuth session, not integration/API tokens.
19
+ */
20
+ credentialKind: IntegrationCredentialKind;
21
+ tokenLabel: string;
22
+ tokenHelpUrl?: string;
23
+ /** Header used for the credential. Defaults to Authorization: Bearer. */
24
+ authHeader?: string;
25
+ /** Composio toolkit slug when using COMPOSIO_API_KEY OAuth bridge. */
26
+ composioToolkit?: string;
27
+ /** When false, Composio has no managed OAuth for this toolkit. */
28
+ composioManagedOAuth?: boolean;
29
+ templates: Array<"incident" | "support" | "planning">;
30
+ accent: string;
31
+ }
32
+ export type MarketplaceCategory = {
33
+ id: string;
34
+ name: string;
35
+ count?: number;
36
+ };
37
+ export type MarketplaceSort = "popular" | "name";
38
+ /** Composio marketplace sidebar groups (same taxonomy as composio.com toolkits). */
39
+ export declare const COMPOSIO_MARKETPLACE_GROUP_NAMES: readonly ["Artificial Intelligence", "Sales & CRM", "Marketing", "Communication", "Commerce & Payments", "Customer Support", "Developer Tools", "Data & Analytics", "Databases & Storage", "HR & Recruiting"];
40
+ export declare function normalizeMarketplaceCategoryName(name: string): string;
41
+ export declare function marketplaceCategorySlug(name: string): string;
42
+ /** Fallback ids when Composio category API is unavailable. */
43
+ export declare function composioMarketplaceGroupCategoriesFallback(): MarketplaceCategory[];
44
+ /** Keep only the standard Composio sidebar groups, in display order. */
45
+ export declare function filterComposioMarketplaceSidebarCategories(categories: MarketplaceCategory[]): MarketplaceCategory[];
46
+ /** Map toolkit meta categories onto a canonical Composio sidebar group id. */
47
+ export declare function resolveToolkitMarketplaceCategory(metaCategories: unknown, sidebar: MarketplaceCategory[]): {
48
+ categoryId: string;
49
+ categoryLabel: string;
50
+ };
51
+ /** Marketplace card fields returned from the API (no server wiring like composioToolkit / mcpUrl). */
52
+ /** One user-supplied credential field for Composio API-key / custom-auth connect. */
53
+ export type IntegrationConnectCredentialField = {
54
+ name: string;
55
+ label: string;
56
+ description?: string;
57
+ secret: boolean;
58
+ };
59
+ export type IntegrationCatalogItemPublic = {
60
+ id: string;
61
+ name: string;
62
+ tagline: string;
63
+ /** Composio category id/slug (or static Steer category when not on Composio). */
64
+ category: IntegrationCategory | string;
65
+ /** Human-readable category from Composio meta. */
66
+ categoryLabel?: string;
67
+ tokenLabel: string;
68
+ tokenHelpUrl?: string;
69
+ templates: Array<"incident" | "support" | "planning">;
70
+ accent: string;
71
+ /** When present (Composio catalog), approximate action tool count for this app. */
72
+ toolsCount?: number;
73
+ /** Toolkit logo URL from Composio (or elsewhere). */
74
+ logoUrl?: string | null;
75
+ /** When false, Composio has no managed OAuth — connect with an API key instead. */
76
+ composioManagedOAuth?: boolean;
77
+ /** At least one action in this toolkit can run on Composio Instant (no user account). */
78
+ instantSupported?: boolean;
79
+ };
80
+ /** Published Instant price for one action. Missing price is unknown, not free. */
81
+ export interface InstantToolPrice {
82
+ description: string;
83
+ discount: string | null;
84
+ }
85
+ export declare function integrationCatalogPublic(): IntegrationCatalogItemPublic[];
86
+ export declare const INTEGRATION_CATALOG: IntegrationCatalogItem[];
87
+ export declare const INTEGRATION_TEMPLATES: Record<"incident" | "support" | "planning", {
88
+ title: string;
89
+ description: string;
90
+ read: IntegrationProvider[];
91
+ write: IntegrationProvider[];
92
+ }>;
93
+ export declare function catalogItem(id: string): IntegrationCatalogItem | undefined;
94
+ export declare function composioToolkitSlug(provider: string): string | undefined;
95
+ export declare function providerSupportsComposioOAuth(provider: string): boolean;
96
+ export declare function staticCatalogPublic(): IntegrationCatalogItemPublic[];
97
+ export interface MarketplaceCatalogPagination {
98
+ page: number;
99
+ pageSize: number;
100
+ total: number;
101
+ totalPages: number;
102
+ }
103
+ export declare function paginateMarketplaceCatalog(items: IntegrationCatalogItemPublic[], opts: {
104
+ page: number;
105
+ pageSize: number;
106
+ category?: string | null;
107
+ q?: string | null;
108
+ sort?: MarketplaceSort | null;
109
+ categoryCatalog?: MarketplaceCategory[];
110
+ }): {
111
+ catalog: IntegrationCatalogItemPublic[];
112
+ pagination: MarketplaceCatalogPagination;
113
+ categories: MarketplaceCategory[];
114
+ };
115
+ export declare function normalizeMcpUrl(raw: string): string;
116
+ /** True when connecting to the vendor's default hosted MCP (OAuth-only providers). */
117
+ export declare function usesDefaultHostedMcp(provider: string, mcpUrl: string): boolean;
118
+ export declare function hostedOAuthConnectBlockedMessage(provider: string): string;
119
+ /** Turn upstream MCP health-check errors into actionable copy for the Integrations UI. */
120
+ export declare function formatIntegrationHealthError(provider: string, mcpUrl: string, raw: string): string;
121
+ export declare function isIntegrationProvider(v: unknown): v is IntegrationProvider;
122
+ export type ConnectionScope = "org" | "personal";
123
+ export type ConnectionHealth = "healthy" | "error" | "unknown" | "expiring";
124
+ export interface IntegrationToolInfo {
125
+ name: string;
126
+ description?: string;
127
+ write: boolean;
128
+ }
129
+ export interface IntegrationConnectionInfo {
130
+ id: string;
131
+ orgId: string;
132
+ provider: string;
133
+ scope: ConnectionScope;
134
+ userId: string | null;
135
+ userName?: string | null;
136
+ label: string;
137
+ mcpUrl: string;
138
+ authHeader: string;
139
+ tokenHint: string | null;
140
+ health: ConnectionHealth;
141
+ lastCheckedAt: number | null;
142
+ lastError: string | null;
143
+ expiresAt: number | null;
144
+ tools: IntegrationToolInfo[];
145
+ /** Composio toolkit logo when marketplace cache is warm. */
146
+ providerLogoUrl?: string | null;
147
+ /** Custom MCP servers need an admin security review before runs can use them. */
148
+ securityReviewed: boolean;
149
+ /**
150
+ * Team connections only: what agents may do with it. Writes still follow the
151
+ * team's external-write policy (approval card by default).
152
+ */
153
+ teamAccess: TeamConnectionAccess;
154
+ createdBy: string;
155
+ createdAt: number;
156
+ updatedAt: number;
157
+ }
158
+ export type ExternalWritePolicy = "allow" | "approval" | "disabled";
159
+ export type TeamConnectionAccess = "read" | "read_write";
160
+ /** A room's integration setup: team connections are on unless switched off. */
161
+ export interface RoomIntegrationsInfo {
162
+ /** Team connections, each with whether this room uses it. */
163
+ team: Array<IntegrationConnectionInfo & {
164
+ enabledInRoom: boolean;
165
+ }>;
166
+ /** The viewer's own connections — used automatically whenever they steer. */
167
+ mine: IntegrationConnectionInfo[];
168
+ /** Room owner / editor or team admin. */
169
+ canManage: boolean;
170
+ }
171
+ export interface IntegrationPolicy {
172
+ externalWrites: ExternalWritePolicy;
173
+ /** When non-empty, only these bundled tool names (provider__tool) are exposed. */
174
+ toolAllowlist: string[];
175
+ blockedTools: string[];
176
+ allowCustomMcp: boolean;
177
+ /** Admin-approved hostnames for Custom MCP URLs. */
178
+ customMcpHosts: string[];
179
+ allowLeasing: boolean;
180
+ leaseTtlMinutes: number;
181
+ leaseSlackNotify: boolean;
182
+ /**
183
+ * When true, rooms may turn on Instant-supported apps that nobody has connected.
184
+ * Composio bills the Eigen organization; default off.
185
+ */
186
+ instantEnabled: boolean;
187
+ }
188
+ export declare const DEFAULT_INTEGRATION_POLICY: IntegrationPolicy;
189
+ export type LeaseStatus = "pending" | "approved" | "denied" | "expired" | "revoked";
190
+ export interface IntegrationLeaseInfo {
191
+ id: string;
192
+ orgId: string;
193
+ connectionId: string;
194
+ provider: string;
195
+ ownerUserId: string;
196
+ ownerName?: string | null;
197
+ requesterUserId: string;
198
+ requesterName?: string | null;
199
+ roomId: string | null;
200
+ agentId: string | null;
201
+ reason: string;
202
+ status: LeaseStatus;
203
+ ttlMinutes: number;
204
+ expiresAt: number | null;
205
+ createdAt: number;
206
+ decidedAt: number | null;
207
+ }
208
+ export interface IntegrationAuditInfo {
209
+ id: string;
210
+ orgId: string;
211
+ userId: string | null;
212
+ userName?: string | null;
213
+ provider: string;
214
+ tool: string;
215
+ connectionId: string | null;
216
+ connectionScope: ConnectionScope | "lease" | "instant" | null;
217
+ /** `instant_account` when the call ran on Composio Instant. */
218
+ credentialSource?: string | null;
219
+ /** USD amount string from Composio when the call was billed as Instant. */
220
+ instantCharge?: string | null;
221
+ roomId: string | null;
222
+ issueId: string | null;
223
+ swarmId: string | null;
224
+ agentId: string | null;
225
+ /** Set when the call came from an automation run. */
226
+ automationId?: string | null;
227
+ automationRunId?: string | null;
228
+ /** Automation name, filled in when the audit is read. */
229
+ automationName?: string | null;
230
+ write: boolean;
231
+ outcome: "ok" | "error" | "blocked" | "approval_requested";
232
+ error: string | null;
233
+ createdAt: number;
234
+ }
235
+ /** What a given run gets: resolved per steering user + org. */
236
+ export interface IntegrationBundleSummary {
237
+ provider: string;
238
+ label: string;
239
+ access: "read" | "read_write";
240
+ via: ConnectionScope | "lease" | "instant";
241
+ /** Whose account a personal / leased connection acts as. */
242
+ ownerName?: string | null;
243
+ }
244
+ /**
245
+ * Mail and social sends (Gmail, LinkedIn, Reddit, Twitter, Slack, and the
246
+ * same kind of app). Fetches on those apps are not included. Everything else
247
+ * runs, including uploads and analytics queries.
248
+ */
249
+ export declare function isOutboundAction(name: string): boolean;
250
+ /**
251
+ * A call that is trying to deliver a message, even when the tool name looks
252
+ * read-only. Ask-first automations draft these instead of executing them.
253
+ */
254
+ export declare function isOutboundMessage(toolName: string, args: Record<string, unknown> | undefined): boolean;
255
+ export declare function isWriteTool(name: string, annotations?: {
256
+ readOnlyHint?: boolean;
257
+ destructiveHint?: boolean;
258
+ } | null): boolean;
259
+ /** `linear__create_issue` — provider-prefixed, MCP-safe, ≤ 64 chars. */
260
+ export declare function bundledToolName(provider: string, tool: string): string;
261
+ export declare function splitBundledToolName(name: string): {
262
+ provider: string;
263
+ tool: string;
264
+ } | null;
265
+ export declare const EXTERNAL_TOOL_PREFIX = "external:";
266
+ export declare function connectionHealthLabel(h: ConnectionHealth): string;