@sayknow-cli/coding-agent 0.2.7 → 0.3.1

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 (216) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/types/async/job-manager.d.ts +3 -1
  3. package/dist/types/cli/daemon-cli.d.ts +25 -0
  4. package/dist/types/cli/notify-cli.d.ts +25 -0
  5. package/dist/types/cli/setup-cli.d.ts +20 -1
  6. package/dist/types/commands/daemon.d.ts +41 -0
  7. package/dist/types/commands/notify.d.ts +41 -0
  8. package/dist/types/config/model-profile-activation.d.ts +12 -0
  9. package/dist/types/config/model-profiles.d.ts +2 -1
  10. package/dist/types/config/model-registry.d.ts +3 -3
  11. package/dist/types/config/models-config-schema.d.ts +5 -0
  12. package/dist/types/config/settings-schema.d.ts +136 -3
  13. package/dist/types/coordinator/contract.d.ts +1 -1
  14. package/dist/types/daemon/builtin.d.ts +20 -0
  15. package/dist/types/daemon/control-types.d.ts +57 -0
  16. package/dist/types/daemon/runtime.d.ts +25 -0
  17. package/dist/types/extensibility/extensions/types.d.ts +8 -0
  18. package/dist/types/extensibility/shared-events.d.ts +1 -0
  19. package/dist/types/i18n/messages/en.d.ts +1 -0
  20. package/dist/types/lsp/types.d.ts +2 -0
  21. package/dist/types/modes/components/oauth-selector.d.ts +2 -0
  22. package/dist/types/modes/components/settings-defs.d.ts +1 -0
  23. package/dist/types/modes/controllers/selector-controller.d.ts +2 -2
  24. package/dist/types/modes/interactive-mode.d.ts +1 -1
  25. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +10 -0
  26. package/dist/types/modes/theme/theme.d.ts +1 -1
  27. package/dist/types/modes/types.d.ts +7 -1
  28. package/dist/types/notifications/attachment-registry.d.ts +17 -0
  29. package/dist/types/notifications/chat-adapters.d.ts +9 -0
  30. package/dist/types/notifications/config-commands.d.ts +26 -0
  31. package/dist/types/notifications/config.d.ts +69 -0
  32. package/dist/types/notifications/engine.d.ts +59 -0
  33. package/dist/types/notifications/helpers.d.ts +55 -0
  34. package/dist/types/notifications/html-format.d.ts +62 -0
  35. package/dist/types/notifications/index.d.ts +28 -0
  36. package/dist/types/notifications/managed-daemon.d.ts +48 -0
  37. package/dist/types/notifications/rate-limit-pool.d.ts +93 -0
  38. package/dist/types/notifications/telegram-cli.d.ts +19 -0
  39. package/dist/types/notifications/telegram-daemon-cli.d.ts +11 -0
  40. package/dist/types/notifications/telegram-daemon-control.d.ts +56 -0
  41. package/dist/types/notifications/telegram-daemon.d.ts +295 -0
  42. package/dist/types/notifications/telegram-reference.d.ts +111 -0
  43. package/dist/types/notifications/threaded-inbound.d.ts +77 -0
  44. package/dist/types/notifications/threaded-render.d.ts +71 -0
  45. package/dist/types/notifications/topic-registry.d.ts +67 -0
  46. package/dist/types/rlm/index.d.ts +12 -0
  47. package/dist/types/session/agent-session.d.ts +41 -2
  48. package/dist/types/session/auth-storage.d.ts +1 -1
  49. package/dist/types/setup/credential-auto-import.d.ts +63 -0
  50. package/dist/types/setup/credential-import.d.ts +3 -0
  51. package/dist/types/setup/host-plugin-setup.d.ts +39 -0
  52. package/dist/types/skc-runtime/launch-tmux.d.ts +1 -0
  53. package/dist/types/skc-runtime/ralplan-runtime.d.ts +1 -1
  54. package/dist/types/skc-runtime/state-writer.d.ts +2 -0
  55. package/dist/types/skc-runtime/tmux-common.d.ts +3 -0
  56. package/dist/types/skc-runtime/tmux-sessions.d.ts +2 -0
  57. package/dist/types/skc-runtime/ultragoal-guard.d.ts +15 -0
  58. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +14 -0
  59. package/dist/types/tools/ask-answer-registry.d.ts +13 -0
  60. package/dist/types/tools/fetch.d.ts +23 -0
  61. package/dist/types/tools/index.d.ts +19 -0
  62. package/dist/types/tools/subagent.d.ts +3 -0
  63. package/dist/types/tools/telegram-send.d.ts +32 -0
  64. package/dist/types/web/insane/bridge.d.ts +103 -0
  65. package/dist/types/web/insane/url-guard.d.ts +22 -0
  66. package/dist/types/web/search/provider.d.ts +18 -1
  67. package/dist/types/web/search/providers/insane.d.ts +53 -0
  68. package/dist/types/web/search/providers/text-citations.d.ts +23 -0
  69. package/dist/types/web/search/types.d.ts +12 -4
  70. package/package.json +10 -8
  71. package/scripts/build-binary.ts +3 -0
  72. package/scripts/verify-insane-vendor.ts +132 -0
  73. package/src/async/job-manager.ts +5 -1
  74. package/src/cli/args.ts +1 -1
  75. package/src/cli/daemon-cli.ts +122 -0
  76. package/src/cli/fast-help.ts +1 -1
  77. package/src/cli/notify-cli.ts +421 -0
  78. package/src/cli/setup-cli.ts +173 -84
  79. package/src/cli.ts +3 -3
  80. package/src/commands/daemon.ts +47 -0
  81. package/src/commands/notify.ts +61 -0
  82. package/src/commands/setup.ts +11 -1
  83. package/src/commands/team.ts +1 -1
  84. package/src/config/model-profile-activation.ts +74 -5
  85. package/src/config/model-profiles.ts +7 -4
  86. package/src/config/model-registry.ts +6 -3
  87. package/src/config/models-config-schema.ts +1 -1
  88. package/src/config/settings-schema.ts +143 -0
  89. package/src/coordinator/contract.ts +3 -0
  90. package/src/coordinator-mcp/server.ts +270 -1
  91. package/src/daemon/builtin.ts +46 -0
  92. package/src/daemon/control-types.ts +65 -0
  93. package/src/daemon/runtime.ts +51 -0
  94. package/src/defaults/skc/rules/ponytail.md +68 -0
  95. package/src/defaults/skc/skills/ralplan/SKILL.md +11 -4
  96. package/src/defaults/skc/skills/ultragoal/SKILL.md +16 -0
  97. package/src/edit/modes/replace.ts +1 -1
  98. package/src/extensibility/extensions/runner.ts +4 -0
  99. package/src/extensibility/extensions/types.ts +8 -0
  100. package/src/extensibility/shared-events.ts +1 -0
  101. package/src/goals/tools/goal-tool.ts +11 -2
  102. package/src/hashline/hash.ts +1 -1
  103. package/src/i18n/messages/de.ts +1 -0
  104. package/src/i18n/messages/en.ts +1 -0
  105. package/src/i18n/messages/es.ts +1 -0
  106. package/src/i18n/messages/fr.ts +1 -0
  107. package/src/i18n/messages/ja.ts +1 -0
  108. package/src/i18n/messages/ko.ts +1 -0
  109. package/src/i18n/messages/zh.ts +1 -0
  110. package/src/internal-urls/docs-index.generated.ts +12 -10
  111. package/src/lsp/config.ts +16 -3
  112. package/src/lsp/defaults.json +7 -0
  113. package/src/lsp/types.ts +2 -0
  114. package/src/main.ts +30 -0
  115. package/src/modes/acp/acp-event-mapper.ts +1 -0
  116. package/src/modes/components/hook-editor.ts +7 -2
  117. package/src/modes/components/oauth-selector.ts +19 -0
  118. package/src/modes/components/settings-defs.ts +2 -1
  119. package/src/modes/components/settings-selector.ts +7 -2
  120. package/src/modes/controllers/event-controller.ts +35 -0
  121. package/src/modes/controllers/selector-controller.ts +80 -17
  122. package/src/modes/interactive-mode.ts +52 -4
  123. package/src/modes/runtime-init.ts +1 -0
  124. package/src/modes/shared/agent-wire/event-contract.ts +1 -0
  125. package/src/modes/shared/agent-wire/event-envelope.ts +1 -0
  126. package/src/modes/shared/agent-wire/event-observation.ts +16 -0
  127. package/src/modes/shared/agent-wire/unattended-session.ts +22 -0
  128. package/src/modes/theme/theme.ts +4 -0
  129. package/src/modes/types.ts +7 -1
  130. package/src/modes/utils/context-usage.ts +2 -2
  131. package/src/modes/utils/ui-helpers.ts +23 -0
  132. package/src/notifications/attachment-registry.ts +23 -0
  133. package/src/notifications/chat-adapters.ts +147 -0
  134. package/src/notifications/config-commands.ts +50 -0
  135. package/src/notifications/config.ts +128 -0
  136. package/src/notifications/engine.ts +100 -0
  137. package/src/notifications/helpers.ts +135 -0
  138. package/src/notifications/html-format.ts +389 -0
  139. package/src/notifications/index.ts +842 -0
  140. package/src/notifications/managed-daemon.ts +163 -0
  141. package/src/notifications/rate-limit-pool.ts +179 -0
  142. package/src/notifications/telegram-cli.ts +194 -0
  143. package/src/notifications/telegram-daemon-cli.ts +74 -0
  144. package/src/notifications/telegram-daemon-control.ts +370 -0
  145. package/src/notifications/telegram-daemon.ts +1591 -0
  146. package/src/notifications/telegram-reference.ts +335 -0
  147. package/src/notifications/threaded-inbound.ts +136 -0
  148. package/src/notifications/threaded-render.ts +173 -0
  149. package/src/notifications/topic-registry.ts +133 -0
  150. package/src/rlm/index.ts +19 -0
  151. package/src/sdk.ts +16 -0
  152. package/src/session/agent-session.ts +195 -54
  153. package/src/session/auth-storage.ts +3 -0
  154. package/src/session/session-dump-format.ts +43 -2
  155. package/src/session/session-manager.ts +39 -5
  156. package/src/setup/credential-auto-import.ts +258 -0
  157. package/src/setup/credential-import.ts +17 -0
  158. package/src/setup/hermes/templates/operator-instructions.v1.md +10 -0
  159. package/src/setup/host-plugin-setup.ts +142 -0
  160. package/src/skc-runtime/deep-interview-recorder.ts +2 -2
  161. package/src/skc-runtime/launch-tmux.ts +27 -5
  162. package/src/skc-runtime/ledger-event-renderer.ts +1 -0
  163. package/src/skc-runtime/ralplan-runtime.ts +2 -2
  164. package/src/skc-runtime/state-runtime.ts +18 -10
  165. package/src/skc-runtime/state-writer.ts +8 -8
  166. package/src/skc-runtime/tmux-common.ts +8 -0
  167. package/src/skc-runtime/tmux-sessions.ts +8 -1
  168. package/src/skc-runtime/ultragoal-guard.ts +57 -2
  169. package/src/skc-runtime/ultragoal-runtime.ts +105 -19
  170. package/src/skc-runtime/workflow-manifest.generated.json +56 -2
  171. package/src/skc-runtime/workflow-manifest.ts +18 -3
  172. package/src/slash-commands/builtin-registry.ts +4 -1
  173. package/src/task/executor.ts +5 -1
  174. package/src/tools/ask-answer-registry.ts +25 -0
  175. package/src/tools/ask.ts +77 -6
  176. package/src/tools/fetch.ts +78 -1
  177. package/src/tools/image-gen.ts +5 -8
  178. package/src/tools/index.ts +22 -0
  179. package/src/tools/inspect-image.ts +16 -11
  180. package/src/tools/subagent-render.ts +7 -0
  181. package/src/tools/subagent.ts +38 -7
  182. package/src/tools/telegram-send.ts +137 -0
  183. package/src/web/insane/bridge.ts +350 -0
  184. package/src/web/insane/url-guard.ts +155 -0
  185. package/src/web/search/provider.ts +77 -18
  186. package/src/web/search/providers/anthropic.ts +70 -3
  187. package/src/web/search/providers/codex.ts +1 -119
  188. package/src/web/search/providers/gemini.ts +99 -0
  189. package/src/web/search/providers/insane.ts +551 -0
  190. package/src/web/search/providers/openai-compatible.ts +66 -32
  191. package/src/web/search/providers/text-citations.ts +111 -0
  192. package/src/web/search/types.ts +13 -2
  193. package/vendor/insane-search/LICENSE +21 -0
  194. package/vendor/insane-search/MANIFEST.json +24 -0
  195. package/vendor/insane-search/engine/__init__.py +23 -0
  196. package/vendor/insane-search/engine/__main__.py +128 -0
  197. package/vendor/insane-search/engine/bias_check.py +183 -0
  198. package/vendor/insane-search/engine/executor.py +254 -0
  199. package/vendor/insane-search/engine/fetch_chain.py +725 -0
  200. package/vendor/insane-search/engine/learning.py +175 -0
  201. package/vendor/insane-search/engine/phase0.py +214 -0
  202. package/vendor/insane-search/engine/safety.py +91 -0
  203. package/vendor/insane-search/engine/templates/package.json +11 -0
  204. package/vendor/insane-search/engine/templates/playwright_mobile_chrome.js +188 -0
  205. package/vendor/insane-search/engine/templates/playwright_real_chrome.js +243 -0
  206. package/vendor/insane-search/engine/tests/test_hardening.py +57 -0
  207. package/vendor/insane-search/engine/tests/test_smoke.py +152 -0
  208. package/vendor/insane-search/engine/tests/test_u1.py +200 -0
  209. package/vendor/insane-search/engine/tests/test_u4.py +131 -0
  210. package/vendor/insane-search/engine/tests/test_u5.py +163 -0
  211. package/vendor/insane-search/engine/tests/test_u7.py +124 -0
  212. package/vendor/insane-search/engine/transport.py +211 -0
  213. package/vendor/insane-search/engine/url_transforms.py +98 -0
  214. package/vendor/insane-search/engine/validators.py +331 -0
  215. package/vendor/insane-search/engine/waf_detector.py +214 -0
  216. package/vendor/insane-search/engine/waf_profiles.yaml +162 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Pure rendering of threaded-session frames into Telegram send specs.
3
+ *
4
+ * The daemon receives the additive `ServerMessage` frames (identity_header,
5
+ * context_update, turn_stream, image_attachment, config_update) over the session
6
+ * WS and must turn each into a Bot API call scoped to the session's forum topic
7
+ * (`message_thread_id`), throttled through the shared rate-limit pool. This
8
+ * module is the pure frame→send mapping (including the priority lane and live-
9
+ * edit coalesce key), so rendering is unit-testable without a live Bot API.
10
+ */
11
+ import type { RateLimitLane } from "./rate-limit-pool";
12
+ /** A Telegram send derived from a threaded frame (topic id is applied by the daemon). */
13
+ export interface ThreadedSend {
14
+ method: "sendMessage" | "sendPhoto" | "sendDocument";
15
+ /** Rate-limit lane for prioritisation/fairness. */
16
+ lane: RateLimitLane;
17
+ /** Message text (sendMessage) or photo caption (sendPhoto). */
18
+ text?: string;
19
+ /** Base64 image bytes for sendPhoto. */
20
+ photoBase64?: string;
21
+ /** Base64 file bytes for sendDocument. */
22
+ documentBase64?: string;
23
+ /** Image MIME type for sendPhoto. */
24
+ mime?: string;
25
+ /** Suggested document filename. */
26
+ fileName?: string;
27
+ /** Coalesce key for live edits (same key collapses to the latest). */
28
+ coalesceKey?: string;
29
+ /** True for the one-time identity header (the daemon pins it once). */
30
+ identity?: boolean;
31
+ }
32
+ interface ThreadedFrame {
33
+ type?: unknown;
34
+ sessionId?: unknown;
35
+ repo?: unknown;
36
+ branch?: unknown;
37
+ machine?: unknown;
38
+ title?: unknown;
39
+ lastMessage?: unknown;
40
+ task?: unknown;
41
+ goal?: unknown;
42
+ tokenUsage?: unknown;
43
+ model?: unknown;
44
+ diff?: unknown;
45
+ phase?: unknown;
46
+ text?: unknown;
47
+ messageRef?: unknown;
48
+ source?: unknown;
49
+ data?: unknown;
50
+ mime?: unknown;
51
+ caption?: unknown;
52
+ name?: unknown;
53
+ verbosity?: unknown;
54
+ redact?: unknown;
55
+ }
56
+ /** Format the one-time identity header as pinned bullets. */
57
+ export declare function formatIdentityHeader(frame: {
58
+ repo?: unknown;
59
+ branch?: unknown;
60
+ machine?: unknown;
61
+ sessionId?: unknown;
62
+ title?: unknown;
63
+ }): string;
64
+ /** Format a streamed context update into a compact block (omitting empty fields). */
65
+ export declare function formatContextUpdate(frame: ThreadedFrame): string | undefined;
66
+ /**
67
+ * Map a threaded frame to a Telegram send spec, or `undefined` when there is
68
+ * nothing to send (e.g. an empty context update or an unknown frame type).
69
+ */
70
+ export declare function renderThreadedFrame(frame: ThreadedFrame): ThreadedSend | undefined;
71
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Per-session forum-topic registry for the threaded session surface.
3
+ *
4
+ * Each SKC session owns exactly one Telegram forum topic in the paired private
5
+ * DM. The topic is created once (via `createForumTopic`) and REUSED on resume,
6
+ * keyed by session id, so a resumed session streams back into its existing
7
+ * thread/history. The registry also tracks whether the one-time identity header
8
+ * has already been pinned, so it is sent exactly once per topic even across
9
+ * reconnects.
10
+ *
11
+ * State is a plain serialisable map persisted beside the daemon state files;
12
+ * topic creation is injected so this module is pure and unit-testable without a
13
+ * live Bot API.
14
+ */
15
+ /** Persisted record for one session's topic. */
16
+ export interface TopicRecord {
17
+ /** Telegram forum topic id (message_thread_id). */
18
+ topicId: string;
19
+ /** Whether the one-time identity header has been sent/pinned. */
20
+ identitySent: boolean;
21
+ /** Creation timestamp (ms epoch). */
22
+ createdAt: number;
23
+ /** Last applied topic title (for rename detection). */
24
+ name?: string;
25
+ }
26
+ /** Serialisable shape persisted to disk. */
27
+ export interface TopicRegistryState {
28
+ /** sessionId -> record. */
29
+ topics: Record<string, TopicRecord>;
30
+ }
31
+ export declare function emptyTopicRegistryState(): TopicRegistryState;
32
+ /**
33
+ * In-memory registry over a serialisable state. Topic creation is injected via
34
+ * `getOrCreateTopic`'s `create` callback (the daemon supplies a real
35
+ * `createForumTopic` call); reuse-on-resume is automatic when a record exists.
36
+ */
37
+ export declare class TopicRegistry {
38
+ private readonly topics;
39
+ /** Maps topicId -> sessionId for fast inbound routing. */
40
+ private readonly byTopic;
41
+ /** In-flight create promises, keyed by session, to dedupe concurrent creates. */
42
+ private readonly inflight;
43
+ constructor(state?: TopicRegistryState);
44
+ /** Merge a serialized state into this registry, preserving all persisted fields. */
45
+ load(state: TopicRegistryState): void;
46
+ /** Resolve the owning session for a topic id (for fail-closed inbound routing). */
47
+ sessionForTopic(topicId: string): string | undefined;
48
+ /** The existing topic record for a session, if any. */
49
+ get(sessionId: string): TopicRecord | undefined;
50
+ /**
51
+ * Return the existing topic for `sessionId`, or create one via `create`
52
+ * (called only on first use). Reuse-on-resume: an existing record is
53
+ * returned without invoking `create`.
54
+ */
55
+ getOrCreateTopic(sessionId: string, create: () => Promise<string>, now?: () => number): Promise<TopicRecord>;
56
+ /** Mark the identity header as sent for a session. Idempotent. */
57
+ markIdentitySent(sessionId: string): void;
58
+ /** Whether the identity header still needs sending for this session. */
59
+ needsIdentity(sessionId: string): boolean;
60
+ /**
61
+ * Record the topic's applied title. Returns `true` when it changed (so the
62
+ * caller should `editForumTopic`), `false` when already current or unknown.
63
+ */
64
+ applyName(sessionId: string, name: string): boolean;
65
+ /** Serialise for atomic persistence beside the daemon state. */
66
+ serialize(): TopicRegistryState;
67
+ }
@@ -31,5 +31,17 @@ export declare function buildRlmGoalObjective(input: {
31
31
  }): string;
32
32
  export declare function isRlmAutonomousRun(parsed: Pick<Args, "print" | "mode" | "messages">, pipedStdin: boolean): boolean;
33
33
  export declare function prepareRlmLaunchMode(parsed: Args, pipedStdin: boolean): boolean;
34
+ /**
35
+ * RLM artifacts are scoped under a SKC session directory and resolving their
36
+ * paths is a *write* (it must pick a concrete session). When `skc rlm` runs
37
+ * standalone — no parent agent, no `SKC_SESSION_ID` in the environment — there is
38
+ * no session to resolve and `resolveSkcSessionForWrite` throws
39
+ * `missing_for_write`. Establish a dedicated SKC session id in that case and pin
40
+ * it into the environment so artifact-path resolution, the per-session activity
41
+ * marker, and the child agent's workflow state all share one writable session.
42
+ *
43
+ * Returns the resolved (existing or freshly generated) SKC session id.
44
+ */
45
+ export declare function ensureRlmSkcSessionId(): string;
34
46
  export declare function runRlmCommand(argv: string[]): Promise<void>;
35
47
  export {};
@@ -71,7 +71,7 @@ import { type AgentRegistry } from "../registry/agent-registry";
71
71
  import { type DiscoverableMCPSearchIndex, type DiscoverableMCPTool } from "../runtime-mcp/discoverable-tool-metadata";
72
72
  import { type SecretObfuscator } from "../secrets/obfuscator";
73
73
  import { type DiscoverableTool, type DiscoverableToolSearchIndex } from "../tool-discovery/tool-index";
74
- import type { ToolSession } from "../tools";
74
+ import type { AskAnswerSource, ToolSession } from "../tools";
75
75
  import type { CheckpointState } from "../tools/checkpoint";
76
76
  import { type TodoItem, type TodoPhase } from "../tools/todo-write";
77
77
  import type { ClientBridge } from "./client-bridge";
@@ -81,6 +81,7 @@ import type { BranchSummaryEntry, NewSessionOptions, SessionContext, SessionMana
81
81
  import { ToolChoiceQueue } from "./tool-choice-queue";
82
82
  import { YieldQueue } from "./yield-queue";
83
83
  /** Session-specific events that extend the core AgentEvent */
84
+ export type AutoCompactionContinuationSkipReason = "auto_continue_disabled_non_resumable_tail";
84
85
  export type AgentSessionEvent = AgentEvent | {
85
86
  type: "auto_compaction_start";
86
87
  reason: "threshold" | "overflow" | "idle";
@@ -94,6 +95,7 @@ export type AgentSessionEvent = AgentEvent | {
94
95
  errorMessage?: string;
95
96
  /** True when compaction was skipped for a benign reason (no model, no candidates, nothing to compact). */
96
97
  skipped?: boolean;
98
+ continuationSkipReason?: AutoCompactionContinuationSkipReason;
97
99
  } | {
98
100
  type: "auto_retry_start";
99
101
  attempt: number;
@@ -128,6 +130,9 @@ export type AgentSessionEvent = AgentEvent | {
128
130
  } | {
129
131
  type: "irc_message";
130
132
  message: CustomMessage;
133
+ } | {
134
+ type: "subagent_steer_message";
135
+ message: CustomMessage;
131
136
  } | {
132
137
  type: "notice";
133
138
  level: "info" | "warning" | "error";
@@ -558,6 +563,7 @@ export declare class AgentSession {
558
563
  getGoalModeState(): GoalModeState | undefined;
559
564
  setGoalModeState(state: GoalModeState | undefined): void;
560
565
  getWorkflowGateEmitter(): WorkflowGateEmitter | undefined;
566
+ getAskAnswerSource(): AskAnswerSource | undefined;
561
567
  setWorkflowGateEmitter(emitter: WorkflowGateEmitter | undefined): void;
562
568
  get goalRuntime(): GoalRuntime;
563
569
  markPlanReferenceSent(): void;
@@ -713,12 +719,38 @@ export declare class AgentSession {
713
719
  }): Promise<void>;
714
720
  setActiveModelProfile(name: string | undefined): void;
715
721
  getActiveModelProfile(): string | undefined;
722
+ /**
723
+ * The model selector ("provider/id") that resume restores as the session
724
+ * default — the latest session-log `model_change` with role="default".
725
+ * Model-profile activation snapshots this before mutating the session so a
726
+ * failed-activation rollback can restore the pre-activation resume default
727
+ * instead of promoting a transient runtime model to the resume default.
728
+ */
729
+ getSessionDefaultModelSelector(): string | undefined;
730
+ /**
731
+ * Re-assert the session resume default ("provider/id") in the session log
732
+ * WITHOUT touching the live runtime model. Appends a `model_change` with
733
+ * role="default"; never writes to global settings (apply-for-this-session
734
+ * semantics). Used by model-profile activation rollback to neutralize the
735
+ * profile main model the failed activation already recorded as the default.
736
+ */
737
+ recordResumeDefaultModel(selector: string): void;
716
738
  /**
717
739
  * Set model temporarily (for this session only).
718
740
  * Validates API key, saves to session log but NOT to settings.
741
+ *
742
+ * The change is recorded in the session log as `role: "temporary"` by
743
+ * default, which means it is NOT restored as the session default on resume —
744
+ * transient retry/fallback/context-promotion/plan switches must not clobber
745
+ * the user's explicit pick (issue #849). Model-profile activation passes
746
+ * `persistAsSessionDefault: true` so the profile's main model becomes the
747
+ * session default and survives resume, while still not being written to
748
+ * global settings (new sessions keep the global default).
719
749
  * @throws Error if no API key available for the model
720
750
  */
721
- setModelTemporary(model: Model, thinkingLevel?: ThinkingLevel): Promise<void>;
751
+ setModelTemporary(model: Model, thinkingLevel?: ThinkingLevel, options?: {
752
+ persistAsSessionDefault?: boolean;
753
+ }): Promise<void>;
722
754
  /**
723
755
  * Cycle to next/previous model.
724
756
  * Uses scoped models (from --models flag) if available, otherwise all available models.
@@ -946,6 +978,13 @@ export declare class AgentSession {
946
978
  * Does not persist the record to history. Public so other sessions can forward.
947
979
  */
948
980
  emitIrcRelayObservation(record: CustomMessage): void;
981
+ emitSubagentSteerObservation(args: {
982
+ from: string;
983
+ to: string;
984
+ body: string;
985
+ timestamp?: number;
986
+ }): void;
987
+ emitSubagentSteerRelayObservation(record: CustomMessage): void;
949
988
  /**
950
989
  * Run a single ephemeral side-channel turn against this session's current
951
990
  * model + system prompt + history. No tools are used; the side request
@@ -2,5 +2,5 @@
2
2
  * Re-exports from @sayknow-cli/ai.
3
3
  * All credential storage types and the AuthStorage class now live in the ai package.
4
4
  */
5
- export type { ApiKeyCredential, AuthCredential, AuthCredentialEntry, AuthCredentialStore, AuthStorageData, AuthStorageOptions, OAuthCredential, SerializedAuthStorage, StoredAuthCredential, } from "@sayknow-cli/ai";
5
+ export type { ApiKeyCredential, AuthCredential, AuthCredentialEntry, AuthCredentialIfAbsentReason, AuthCredentialIfAbsentResult, AuthCredentialIfAbsentSnapshotResult, AuthCredentialStore, AuthStorageData, AuthStorageOptions, OAuthCredential, SerializedAuthStorage, StoredAuthCredential, } from "@sayknow-cli/ai";
6
6
  export { AuthBrokerClient, AuthStorage, REMOTE_REFRESH_SENTINEL, RemoteAuthCredentialStore, SqliteAuthCredentialStore, } from "@sayknow-cli/ai";
@@ -0,0 +1,63 @@
1
+ import type { AuthCredentialIfAbsentReason, AuthCredentialIfAbsentSnapshotResult, AuthStorage } from "@sayknow-cli/ai";
2
+ import type { ModelRegistry } from "../config/model-registry";
3
+ import { type CredentialDiscoveryResult, type CredentialOrigin, type DiscoveryOptions, type ImportableCredential } from "./credential-import";
4
+ export declare const CREDENTIAL_AUTO_IMPORT_ROTATION_WARNING = "Refreshing in skc may log out the Claude/Codex CLI because OAuth refresh tokens can rotate.";
5
+ export type CredentialAutoImportSourceLabel = "claude-code-file" | "claude-code-keychain" | "codex-file";
6
+ export type CredentialAutoImportTrigger = "startup" | "bare-login" | "setup-cli";
7
+ export declare function getCredentialAutoImportStatePath(agentDir?: string): string;
8
+ export declare function readCredentialImportMarker(agentDir?: string): Promise<string | undefined>;
9
+ export declare function writeCredentialImportMarker(version: string, agentDir?: string): Promise<boolean>;
10
+ export declare enum CredentialAutoImportFailureClass {
11
+ DiscoveryUnavailable = "discovery-unavailable",
12
+ SourceUnreadable = "source-unreadable",
13
+ SourceMalformed = "source-malformed",
14
+ KeychainDenied = "keychain-denied",
15
+ WriteInvalid = "write-invalid",
16
+ WriteConflict = "write-conflict",
17
+ BrokerUnavailable = "broker-unavailable",
18
+ BrokerUnsupported = "broker-unsupported",
19
+ Unknown = "unknown"
20
+ }
21
+ export interface CredentialAutoImportSkipped {
22
+ credential: ImportableCredential;
23
+ reason: AuthCredentialIfAbsentReason;
24
+ entries: AuthCredentialIfAbsentSnapshotResult["entries"];
25
+ }
26
+ export interface CredentialAutoImportFailure {
27
+ credential?: ImportableCredential;
28
+ origin?: CredentialOrigin;
29
+ source?: string;
30
+ failureClass: CredentialAutoImportFailureClass;
31
+ }
32
+ export interface CredentialAutoImportResult {
33
+ imported: ImportableCredential[];
34
+ skipped: CredentialAutoImportSkipped[];
35
+ failures: CredentialAutoImportFailure[];
36
+ discovered: boolean;
37
+ discovery?: CredentialDiscoveryResult;
38
+ globalDiscoveryFailure?: CredentialAutoImportFailure;
39
+ }
40
+ export type CredentialAutoImportAuthStorage = Pick<AuthStorage, "importCredentialIfAbsent">;
41
+ export interface CredentialAutoImportOptions {
42
+ authStorage: CredentialAutoImportAuthStorage;
43
+ discover?: (options?: DiscoveryOptions) => Promise<CredentialDiscoveryResult>;
44
+ discoveryOptions?: DiscoveryOptions;
45
+ trigger: CredentialAutoImportTrigger;
46
+ sourceLabel?: CredentialAutoImportSourceLabel;
47
+ }
48
+ export declare function runExternalCredentialAutoImport({ authStorage, discover, discoveryOptions }: CredentialAutoImportOptions): Promise<CredentialAutoImportResult>;
49
+ export declare function buildCredentialAutoImportNotice(result: Pick<CredentialAutoImportResult, "imported">): string | undefined;
50
+ export declare function formatCredentialAutoImportResult(result: CredentialAutoImportResult): string[];
51
+ export interface CredentialImportMarkerStore {
52
+ read: () => Promise<string | undefined> | string | undefined;
53
+ write: (version: string) => Promise<boolean> | boolean;
54
+ }
55
+ export interface StartupCredentialAutoImportOptions {
56
+ authStorage: CredentialAutoImportOptions["authStorage"];
57
+ modelRegistry: Pick<ModelRegistry, "refresh">;
58
+ discover?: CredentialAutoImportOptions["discover"];
59
+ version?: string;
60
+ agentDir?: string;
61
+ markerStore?: CredentialImportMarkerStore;
62
+ }
63
+ export declare function runStartupCredentialAutoImportIfNeeded({ authStorage: activeAuthStorage, modelRegistry: activeModelRegistry, discover, version, agentDir, markerStore }: StartupCredentialAutoImportOptions): Promise<string | undefined>;
@@ -3,6 +3,7 @@ import type { AuthCredential } from "@sayknow-cli/ai";
3
3
  export type ExternalProvider = "anthropic" | "openai-codex";
4
4
  /** Where a discovered credential came from. */
5
5
  export type CredentialOrigin = "claude-code-file" | "claude-code-keychain" | "codex-file";
6
+ export declare const AUTO_IMPORT_OAUTH_PROVIDER_ORIGINS: Record<ExternalProvider, ReadonlySet<CredentialOrigin>>;
6
7
  /** Human labels for providers, used in redacted summaries. */
7
8
  export declare const EXTERNAL_PROVIDER_LABELS: Record<ExternalProvider, string>;
8
9
  /** A credential that can be safely imported into skc's store. */
@@ -72,6 +73,8 @@ export declare function discoverExternalCredentials(options?: DiscoveryOptions):
72
73
  export declare function formatCredentialSummary(credential: ImportableCredential): string;
73
74
  /** Redacted summary lines for an entire discovery result. Never includes secrets. */
74
75
  export declare function formatDiscoverySummary(result: CredentialDiscoveryResult): string[];
76
+ export declare function isAutoImportOAuthCredential(credential: ImportableCredential): boolean;
77
+ export declare function filterAutoImportOAuthCredentials(credentials: readonly ImportableCredential[]): ImportableCredential[];
75
78
  /**
76
79
  * Persist discovered credentials via `upsert`. Each credential is imported
77
80
  * independently; a failure on one is recorded without aborting the rest.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Host plugin setup for `skc setup claude` and `skc setup codex`.
3
+ *
4
+ * Renders install guidance and a fail-closed coordinator MCP config preview for
5
+ * the canonical generated plugin bundle under `plugins/`. This is intentionally
6
+ * render-only and fail-closed: the workdir allowlist is scoped to the project
7
+ * root and no mutation class is enabled until the user opts in.
8
+ */
9
+ export type HostPluginKind = "claude" | "codex";
10
+ export interface HostPluginSetupFlags {
11
+ json?: boolean;
12
+ check?: boolean;
13
+ root?: string[];
14
+ repo?: string;
15
+ }
16
+ export interface HostPluginSetupResult {
17
+ ok: true;
18
+ host: HostPluginKind;
19
+ mode: "render";
20
+ gated: boolean;
21
+ pluginPath: string;
22
+ manifestPath: string;
23
+ marketplacePath: string;
24
+ installGuidance: string[];
25
+ coordinatorConfigPreview: {
26
+ command: string;
27
+ args: string[];
28
+ env: Record<string, string>;
29
+ };
30
+ mutationPolicy: string;
31
+ notes: string[];
32
+ check?: {
33
+ ok: boolean;
34
+ checked: string[];
35
+ missing: string[];
36
+ };
37
+ }
38
+ export declare function buildHostPluginSetup(host: HostPluginKind, flags?: HostPluginSetupFlags): HostPluginSetupResult;
39
+ export declare function formatHostPluginSetup(result: HostPluginSetupResult): string;
@@ -69,6 +69,7 @@ export interface SkcTmuxProfileContext {
69
69
  project?: string | null;
70
70
  sessionId?: string | null;
71
71
  sessionStateFile?: string | null;
72
+ version?: string | null;
72
73
  }
73
74
  export declare function applySkcTmuxProfile(context: SkcTmuxProfileContext): SkcTmuxProfileResult;
74
75
  export declare function buildSkcTmuxWindowTitle(cwd: string, branch: string | null | undefined): string;
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * 2. **Artifact write**: `skc ralplan --write --stage <type> --stage_n <N> --artifact
14
14
  * <path-or-string> [--run-id <id>] [--session-id <id>] [--json]` persists Planner / Architect
15
- * / Critic / revision / ADR / final markdown under `.skc/plans/ralplan/<run-id>/`, maintains
15
+ * / Critic / revision / post-interview / ADR / final markdown under `.skc/plans/ralplan/<run-id>/`, maintains
16
16
  * an `index.jsonl` audit log, copies `final` stages to `pending-approval.md`, and advances
17
17
  * the HUD chip to reflect the latest persisted stage.
18
18
  */
@@ -66,10 +66,12 @@ export interface GuardedStateWriterOptions extends StateWriterOptions {
66
66
  export type GuardedWriteResult = {
67
67
  path: string;
68
68
  written: true;
69
+ revision: number;
69
70
  } | {
70
71
  path: string;
71
72
  written: false;
72
73
  reason: "stale-skip";
74
+ revision: number;
73
75
  };
74
76
  export interface StateWriterOptions {
75
77
  cwd?: string;
@@ -10,6 +10,7 @@ export declare const SKC_TMUX_BRANCH_SLUG_OPTION = "@skc-branch-slug";
10
10
  export declare const SKC_TMUX_PROJECT_OPTION = "@skc-project";
11
11
  export declare const SKC_TMUX_SESSION_ID_OPTION = "@skc-session-id";
12
12
  export declare const SKC_TMUX_SESSION_STATE_FILE_OPTION = "@skc-session-state-file";
13
+ export declare const SKC_TMUX_VERSION_OPTION = "@skc-version";
13
14
  export interface SkcTmuxProfileCommand {
14
15
  description: string;
15
16
  args: string[];
@@ -50,6 +51,7 @@ export declare function buildSkcTmuxRequiredProfileCommands(target: string, meta
50
51
  project?: string | null;
51
52
  sessionId?: string | null;
52
53
  sessionStateFile?: string | null;
54
+ version?: string | null;
53
55
  }): SkcTmuxProfileCommand[];
54
56
  export declare function buildSkcTmuxProfileCommands(target: string, env?: NodeJS.ProcessEnv, metadata?: {
55
57
  branch?: string | null;
@@ -57,5 +59,6 @@ export declare function buildSkcTmuxProfileCommands(target: string, env?: NodeJS
57
59
  project?: string | null;
58
60
  sessionId?: string | null;
59
61
  sessionStateFile?: string | null;
62
+ version?: string | null;
60
63
  }): SkcTmuxProfileCommand[];
61
64
  export declare function normalizeTmuxCreatedAt(raw: string): string;
@@ -10,6 +10,7 @@ export interface SkcTmuxSessionStatus {
10
10
  project?: string;
11
11
  sessionId?: string;
12
12
  sessionStateFile?: string;
13
+ version?: string;
13
14
  panePids: number[];
14
15
  profile?: string;
15
16
  }
@@ -20,6 +21,7 @@ export interface SkcTmuxSessionTagsForGc {
20
21
  branchSlug?: string;
21
22
  sessionId?: string;
22
23
  sessionStateFile?: string;
24
+ version?: string;
23
25
  createdAt?: string;
24
26
  attached?: boolean;
25
27
  panePids?: number[];
@@ -27,10 +27,25 @@ export declare function validateCompletionReceipt(input: {
27
27
  export declare function readUltragoalVerificationState(input: {
28
28
  cwd: string;
29
29
  currentGoal?: CurrentGoalLike | null;
30
+ sessionId?: string | null;
30
31
  }): Promise<UltragoalGuardDiagnostic>;
31
32
  export declare function isUltragoalAskBlocked(cwd: string): Promise<UltragoalAskBlockDiagnostic>;
32
33
  export declare function assertCanCompleteCurrentGoal(input: {
33
34
  cwd: string;
34
35
  currentGoal?: CurrentGoalLike | null;
36
+ sessionId?: string | null;
35
37
  }): Promise<void>;
36
38
  export declare function isUltragoalBypassPrompt(prompt: string): boolean;
39
+ export interface UltragoalPauseBlockDiagnostic {
40
+ blocked: boolean;
41
+ reason: string;
42
+ }
43
+ /**
44
+ * While an Ultragoal run is active, `goal({"op":"pause"})` is only allowed when the
45
+ * current durable Ultragoal state is readable and the latest durable ledger event
46
+ * classifies the current blocker as `human_blocked`. Resolvable blockers must be
47
+ * worked, not parked. Reads fail closed so unreadable durable state or ledger data
48
+ * blocks pause rather than silently allowing a give-up.
49
+ */
50
+ export declare function isUltragoalPauseBlocked(cwd: string): Promise<UltragoalPauseBlockDiagnostic>;
51
+ export declare function assertUltragoalPauseAllowed(cwd: string): Promise<void>;
@@ -193,6 +193,19 @@ export declare function recordUltragoalReviewBlockers(input: {
193
193
  evidence: string;
194
194
  skcGoalJson?: string;
195
195
  }): Promise<UltragoalPlan>;
196
+ export type UltragoalBlockerClassification = "human_blocked" | "resolvable";
197
+ /**
198
+ * Record an audited blocker triage classification in the durable ledger. A
199
+ * `human_blocked` classification is the only thing that authorizes
200
+ * `goal({"op":"pause"})` while an Ultragoal run is active; `resolvable` is an
201
+ * audit note and never unblocks pause.
202
+ */
203
+ export declare function recordUltragoalBlockerClassification(input: {
204
+ cwd: string;
205
+ classification: UltragoalBlockerClassification;
206
+ evidence: string;
207
+ goalId?: string;
208
+ }): Promise<UltragoalLedgerEvent>;
196
209
  type UltragoalReviewContractStrength = "strong" | "thin-derived";
197
210
  interface UltragoalReviewFinding extends JsonObject {
198
211
  severity: "blocker";
@@ -208,6 +221,7 @@ interface UltragoalReviewResult extends JsonObject {
208
221
  weakContractCapApplied: boolean;
209
222
  blockerGoalIds?: string[];
210
223
  }
224
+ export declare function resolveGitBase(cwd: string, branch?: string): Promise<string>;
211
225
  export declare function runUltragoalReview(cwd: string, args: readonly string[]): Promise<UltragoalReviewResult>;
212
226
  export declare function runNativeUltragoalCommand(args: string[], cwd?: string): Promise<UltragoalCommandResult>;
213
227
  export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Process-wide registry mapping a session id to its active {@link AskAnswerSource}.
3
+ *
4
+ * Decouples the `ask` tool (which reads the source via `AgentSession`) from the
5
+ * notifications extension (which registers one), without threading a new method
6
+ * through the extension/runner/controller wiring. A session has at most one
7
+ * source; registering returns a disposer.
8
+ */
9
+ import type { AskAnswerSource } from "./index";
10
+ /** Register `source` for `sessionId`. Returns a disposer that clears it. */
11
+ export declare function registerAskAnswerSource(sessionId: string, source: AskAnswerSource): () => void;
12
+ /** The answer source for `sessionId`, if one is registered. */
13
+ export declare function getAskAnswerSource(sessionId: string): AskAnswerSource | undefined;
@@ -1,8 +1,10 @@
1
1
  import type { AgentToolResult } from "@sayknow-cli/agent-core";
2
2
  import { type Component } from "@sayknow-cli/tui";
3
+ import type { Settings } from "../config/settings";
3
4
  import type { RenderResultOptions } from "../extensibility/custom-tools/types";
4
5
  import { type Theme } from "../modes/theme/theme";
5
6
  import type { ToolSession } from "../sdk";
7
+ import type { RenderResult } from "../web/scrapers/types";
6
8
  import { type OutputMeta } from "./output-meta";
7
9
  export declare function isReadableUrlPath(value: string): boolean;
8
10
  export interface ParsedReadUrlTarget {
@@ -16,6 +18,27 @@ interface FetchImagePayload {
16
18
  data: string;
17
19
  mimeType: string;
18
20
  }
21
+ type FetchRenderResult = RenderResult & {
22
+ image?: FetchImagePayload;
23
+ };
24
+ /**
25
+ * Opt-in insane-search fallback for blocked / degraded public URL reads.
26
+ *
27
+ * Returns a finalized `method: "insane"` result on success, or null (so the
28
+ * caller continues with its normal degraded behavior). Fail-closed: no note,
29
+ * guard DNS, dependency probe, or subprocess when raw mode or the opt-in
30
+ * setting is off. The public-URL guard runs BEFORE any probe/spawn.
31
+ */
32
+ export declare function tryInsaneFallback(args: {
33
+ url: string;
34
+ finalUrl: string;
35
+ timeout: number;
36
+ raw: boolean;
37
+ settings: Settings;
38
+ signal: AbortSignal | undefined;
39
+ fetchedAt: string;
40
+ notes: string[];
41
+ }): Promise<FetchRenderResult | null>;
19
42
  export interface ReadUrlToolDetails {
20
43
  kind: "url";
21
44
  url: string;
@@ -55,6 +55,7 @@ export * from "./search-tool-bm25";
55
55
  export * from "./skill";
56
56
  export * from "./ssh";
57
57
  export * from "./subagent";
58
+ export * from "./telegram-send";
58
59
  export * from "./todo-write";
59
60
  export * from "./vim";
60
61
  export * from "./write";
@@ -68,6 +69,17 @@ export type ContextFileEntry = {
68
69
  };
69
70
  export type { DiscoverableMCPTool } from "../runtime-mcp/discoverable-tool-metadata";
70
71
  export type { DiscoverableTool, DiscoverableToolSearchIndex, DiscoverableToolSearchResult, DiscoverableToolSource, } from "../tool-discovery/tool-index";
72
+ /**
73
+ * Source of remote answers for interactive asks (e.g. a Telegram reply routed
74
+ * through the notifications SDK). Lets a pending ask resolve without RPC mode.
75
+ */
76
+ export interface AskAnswerSource {
77
+ /**
78
+ * Race a remote answer against the local UI for one question. Resolves with the
79
+ * chosen option label or free-text answer, or `undefined` to defer to local UI.
80
+ */
81
+ awaitAnswer(question: string, options: string[], signal?: AbortSignal): Promise<string | undefined>;
82
+ }
71
83
  /** Session context for tool factories */
72
84
  export interface ToolSession {
73
85
  /** Current working directory */
@@ -167,6 +179,13 @@ export interface ToolSession {
167
179
  getGoalModeState?: () => GoalModeState | undefined;
168
180
  /** Unattended workflow-gate emitter (present only when unattended mode is negotiated). */
169
181
  getWorkflowGateEmitter?: () => WorkflowGateEmitter | undefined;
182
+ /**
183
+ * Optional remote answer source for interactive asks. When present, the ask
184
+ * tool races the local UI selection against a remote answer (e.g. a Telegram
185
+ * reply via the notifications SDK) so asks can be answered without RPC mode.
186
+ * No-op when undefined: the ask path behaves exactly as before.
187
+ */
188
+ getAskAnswerSource?: () => AskAnswerSource | undefined;
170
189
  /** Optional per-session restriction for goal tool operations. */
171
190
  goalToolAllowedOps?: readonly ("create" | "get" | "complete" | "resume" | "drop" | "pause")[];
172
191
  /** Goal runtime for the active agent session. */
@@ -42,6 +42,9 @@ export interface SubagentSnapshot {
42
42
  outputRef?: string;
43
43
  truncated?: boolean;
44
44
  guidance?: string;
45
+ steerMessage?: string;
46
+ steerState?: "queued" | "resume_queued" | "resume_started";
47
+ steerPauseRequested?: boolean;
45
48
  /** Live streaming progress for the awaited subagent (await panel only; UI detail). */
46
49
  progress?: AgentProgress;
47
50
  /** True when a live in-session progress producer exists for this subagent. */
@@ -0,0 +1,32 @@
1
+ import type { AgentTool, AgentToolContext, AgentToolResult, AgentToolUpdateCallback } from "@sayknow-cli/agent-core";
2
+ import { z } from "zod/v4";
3
+ import type { ToolSession } from "./index";
4
+ declare const telegramSendSchema: z.ZodObject<{
5
+ path: z.ZodString;
6
+ caption: z.ZodOptional<z.ZodString>;
7
+ }, z.core.$strip>;
8
+ type TelegramSendParams = z.infer<typeof telegramSendSchema>;
9
+ interface TelegramSendDetails {
10
+ path: string;
11
+ caption?: string;
12
+ ok: boolean;
13
+ error?: string;
14
+ }
15
+ export declare class TelegramSendTool implements AgentTool<typeof telegramSendSchema, TelegramSendDetails> {
16
+ private readonly session;
17
+ readonly name = "telegram_send";
18
+ readonly label = "TelegramSend";
19
+ readonly summary = "Send a workspace file to Telegram";
20
+ readonly loadMode = "discoverable";
21
+ readonly description: string;
22
+ readonly parameters: z.ZodObject<{
23
+ path: z.ZodString;
24
+ caption: z.ZodOptional<z.ZodString>;
25
+ }, z.core.$strip>;
26
+ readonly strict = true;
27
+ constructor(session: ToolSession);
28
+ static createIf(session: ToolSession): TelegramSendTool | null;
29
+ private resolveContainedFile;
30
+ execute(_toolCallId: string, params: TelegramSendParams, _signal?: AbortSignal, _onUpdate?: AgentToolUpdateCallback<TelegramSendDetails>, _context?: AgentToolContext): Promise<AgentToolResult<TelegramSendDetails>>;
31
+ }
32
+ export {};