@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.
- package/CHANGELOG.md +20 -0
- package/dist/types/async/job-manager.d.ts +3 -1
- package/dist/types/cli/daemon-cli.d.ts +25 -0
- package/dist/types/cli/notify-cli.d.ts +25 -0
- package/dist/types/cli/setup-cli.d.ts +20 -1
- package/dist/types/commands/daemon.d.ts +41 -0
- package/dist/types/commands/notify.d.ts +41 -0
- package/dist/types/config/model-profile-activation.d.ts +12 -0
- package/dist/types/config/model-profiles.d.ts +2 -1
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/models-config-schema.d.ts +5 -0
- package/dist/types/config/settings-schema.d.ts +136 -3
- package/dist/types/coordinator/contract.d.ts +1 -1
- package/dist/types/daemon/builtin.d.ts +20 -0
- package/dist/types/daemon/control-types.d.ts +57 -0
- package/dist/types/daemon/runtime.d.ts +25 -0
- package/dist/types/extensibility/extensions/types.d.ts +8 -0
- package/dist/types/extensibility/shared-events.d.ts +1 -0
- package/dist/types/i18n/messages/en.d.ts +1 -0
- package/dist/types/lsp/types.d.ts +2 -0
- package/dist/types/modes/components/oauth-selector.d.ts +2 -0
- package/dist/types/modes/components/settings-defs.d.ts +1 -0
- package/dist/types/modes/controllers/selector-controller.d.ts +2 -2
- package/dist/types/modes/interactive-mode.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +10 -0
- package/dist/types/modes/theme/theme.d.ts +1 -1
- package/dist/types/modes/types.d.ts +7 -1
- package/dist/types/notifications/attachment-registry.d.ts +17 -0
- package/dist/types/notifications/chat-adapters.d.ts +9 -0
- package/dist/types/notifications/config-commands.d.ts +26 -0
- package/dist/types/notifications/config.d.ts +69 -0
- package/dist/types/notifications/engine.d.ts +59 -0
- package/dist/types/notifications/helpers.d.ts +55 -0
- package/dist/types/notifications/html-format.d.ts +62 -0
- package/dist/types/notifications/index.d.ts +28 -0
- package/dist/types/notifications/managed-daemon.d.ts +48 -0
- package/dist/types/notifications/rate-limit-pool.d.ts +93 -0
- package/dist/types/notifications/telegram-cli.d.ts +19 -0
- package/dist/types/notifications/telegram-daemon-cli.d.ts +11 -0
- package/dist/types/notifications/telegram-daemon-control.d.ts +56 -0
- package/dist/types/notifications/telegram-daemon.d.ts +295 -0
- package/dist/types/notifications/telegram-reference.d.ts +111 -0
- package/dist/types/notifications/threaded-inbound.d.ts +77 -0
- package/dist/types/notifications/threaded-render.d.ts +71 -0
- package/dist/types/notifications/topic-registry.d.ts +67 -0
- package/dist/types/rlm/index.d.ts +12 -0
- package/dist/types/session/agent-session.d.ts +41 -2
- package/dist/types/session/auth-storage.d.ts +1 -1
- package/dist/types/setup/credential-auto-import.d.ts +63 -0
- package/dist/types/setup/credential-import.d.ts +3 -0
- package/dist/types/setup/host-plugin-setup.d.ts +39 -0
- package/dist/types/skc-runtime/launch-tmux.d.ts +1 -0
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/state-writer.d.ts +2 -0
- package/dist/types/skc-runtime/tmux-common.d.ts +3 -0
- package/dist/types/skc-runtime/tmux-sessions.d.ts +2 -0
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +15 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +14 -0
- package/dist/types/tools/ask-answer-registry.d.ts +13 -0
- package/dist/types/tools/fetch.d.ts +23 -0
- package/dist/types/tools/index.d.ts +19 -0
- package/dist/types/tools/subagent.d.ts +3 -0
- package/dist/types/tools/telegram-send.d.ts +32 -0
- package/dist/types/web/insane/bridge.d.ts +103 -0
- package/dist/types/web/insane/url-guard.d.ts +22 -0
- package/dist/types/web/search/provider.d.ts +18 -1
- package/dist/types/web/search/providers/insane.d.ts +53 -0
- package/dist/types/web/search/providers/text-citations.d.ts +23 -0
- package/dist/types/web/search/types.d.ts +12 -4
- package/package.json +10 -8
- package/scripts/build-binary.ts +3 -0
- package/scripts/verify-insane-vendor.ts +132 -0
- package/src/async/job-manager.ts +5 -1
- package/src/cli/args.ts +1 -1
- package/src/cli/daemon-cli.ts +122 -0
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/notify-cli.ts +421 -0
- package/src/cli/setup-cli.ts +173 -84
- package/src/cli.ts +3 -3
- package/src/commands/daemon.ts +47 -0
- package/src/commands/notify.ts +61 -0
- package/src/commands/setup.ts +11 -1
- package/src/commands/team.ts +1 -1
- package/src/config/model-profile-activation.ts +74 -5
- package/src/config/model-profiles.ts +7 -4
- package/src/config/model-registry.ts +6 -3
- package/src/config/models-config-schema.ts +1 -1
- package/src/config/settings-schema.ts +143 -0
- package/src/coordinator/contract.ts +3 -0
- package/src/coordinator-mcp/server.ts +270 -1
- package/src/daemon/builtin.ts +46 -0
- package/src/daemon/control-types.ts +65 -0
- package/src/daemon/runtime.ts +51 -0
- package/src/defaults/skc/rules/ponytail.md +68 -0
- package/src/defaults/skc/skills/ralplan/SKILL.md +11 -4
- package/src/defaults/skc/skills/ultragoal/SKILL.md +16 -0
- package/src/edit/modes/replace.ts +1 -1
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +8 -0
- package/src/extensibility/shared-events.ts +1 -0
- package/src/goals/tools/goal-tool.ts +11 -2
- package/src/hashline/hash.ts +1 -1
- package/src/i18n/messages/de.ts +1 -0
- package/src/i18n/messages/en.ts +1 -0
- package/src/i18n/messages/es.ts +1 -0
- package/src/i18n/messages/fr.ts +1 -0
- package/src/i18n/messages/ja.ts +1 -0
- package/src/i18n/messages/ko.ts +1 -0
- package/src/i18n/messages/zh.ts +1 -0
- package/src/internal-urls/docs-index.generated.ts +12 -10
- package/src/lsp/config.ts +16 -3
- package/src/lsp/defaults.json +7 -0
- package/src/lsp/types.ts +2 -0
- package/src/main.ts +30 -0
- package/src/modes/acp/acp-event-mapper.ts +1 -0
- package/src/modes/components/hook-editor.ts +7 -2
- package/src/modes/components/oauth-selector.ts +19 -0
- package/src/modes/components/settings-defs.ts +2 -1
- package/src/modes/components/settings-selector.ts +7 -2
- package/src/modes/controllers/event-controller.ts +35 -0
- package/src/modes/controllers/selector-controller.ts +80 -17
- package/src/modes/interactive-mode.ts +52 -4
- package/src/modes/runtime-init.ts +1 -0
- package/src/modes/shared/agent-wire/event-contract.ts +1 -0
- package/src/modes/shared/agent-wire/event-envelope.ts +1 -0
- package/src/modes/shared/agent-wire/event-observation.ts +16 -0
- package/src/modes/shared/agent-wire/unattended-session.ts +22 -0
- package/src/modes/theme/theme.ts +4 -0
- package/src/modes/types.ts +7 -1
- package/src/modes/utils/context-usage.ts +2 -2
- package/src/modes/utils/ui-helpers.ts +23 -0
- package/src/notifications/attachment-registry.ts +23 -0
- package/src/notifications/chat-adapters.ts +147 -0
- package/src/notifications/config-commands.ts +50 -0
- package/src/notifications/config.ts +128 -0
- package/src/notifications/engine.ts +100 -0
- package/src/notifications/helpers.ts +135 -0
- package/src/notifications/html-format.ts +389 -0
- package/src/notifications/index.ts +842 -0
- package/src/notifications/managed-daemon.ts +163 -0
- package/src/notifications/rate-limit-pool.ts +179 -0
- package/src/notifications/telegram-cli.ts +194 -0
- package/src/notifications/telegram-daemon-cli.ts +74 -0
- package/src/notifications/telegram-daemon-control.ts +370 -0
- package/src/notifications/telegram-daemon.ts +1591 -0
- package/src/notifications/telegram-reference.ts +335 -0
- package/src/notifications/threaded-inbound.ts +136 -0
- package/src/notifications/threaded-render.ts +173 -0
- package/src/notifications/topic-registry.ts +133 -0
- package/src/rlm/index.ts +19 -0
- package/src/sdk.ts +16 -0
- package/src/session/agent-session.ts +195 -54
- package/src/session/auth-storage.ts +3 -0
- package/src/session/session-dump-format.ts +43 -2
- package/src/session/session-manager.ts +39 -5
- package/src/setup/credential-auto-import.ts +258 -0
- package/src/setup/credential-import.ts +17 -0
- package/src/setup/hermes/templates/operator-instructions.v1.md +10 -0
- package/src/setup/host-plugin-setup.ts +142 -0
- package/src/skc-runtime/deep-interview-recorder.ts +2 -2
- package/src/skc-runtime/launch-tmux.ts +27 -5
- package/src/skc-runtime/ledger-event-renderer.ts +1 -0
- package/src/skc-runtime/ralplan-runtime.ts +2 -2
- package/src/skc-runtime/state-runtime.ts +18 -10
- package/src/skc-runtime/state-writer.ts +8 -8
- package/src/skc-runtime/tmux-common.ts +8 -0
- package/src/skc-runtime/tmux-sessions.ts +8 -1
- package/src/skc-runtime/ultragoal-guard.ts +57 -2
- package/src/skc-runtime/ultragoal-runtime.ts +105 -19
- package/src/skc-runtime/workflow-manifest.generated.json +56 -2
- package/src/skc-runtime/workflow-manifest.ts +18 -3
- package/src/slash-commands/builtin-registry.ts +4 -1
- package/src/task/executor.ts +5 -1
- package/src/tools/ask-answer-registry.ts +25 -0
- package/src/tools/ask.ts +77 -6
- package/src/tools/fetch.ts +78 -1
- package/src/tools/image-gen.ts +5 -8
- package/src/tools/index.ts +22 -0
- package/src/tools/inspect-image.ts +16 -11
- package/src/tools/subagent-render.ts +7 -0
- package/src/tools/subagent.ts +38 -7
- package/src/tools/telegram-send.ts +137 -0
- package/src/web/insane/bridge.ts +350 -0
- package/src/web/insane/url-guard.ts +155 -0
- package/src/web/search/provider.ts +77 -18
- package/src/web/search/providers/anthropic.ts +70 -3
- package/src/web/search/providers/codex.ts +1 -119
- package/src/web/search/providers/gemini.ts +99 -0
- package/src/web/search/providers/insane.ts +551 -0
- package/src/web/search/providers/openai-compatible.ts +66 -32
- package/src/web/search/providers/text-citations.ts +111 -0
- package/src/web/search/types.ts +13 -2
- package/vendor/insane-search/LICENSE +21 -0
- package/vendor/insane-search/MANIFEST.json +24 -0
- package/vendor/insane-search/engine/__init__.py +23 -0
- package/vendor/insane-search/engine/__main__.py +128 -0
- package/vendor/insane-search/engine/bias_check.py +183 -0
- package/vendor/insane-search/engine/executor.py +254 -0
- package/vendor/insane-search/engine/fetch_chain.py +725 -0
- package/vendor/insane-search/engine/learning.py +175 -0
- package/vendor/insane-search/engine/phase0.py +214 -0
- package/vendor/insane-search/engine/safety.py +91 -0
- package/vendor/insane-search/engine/templates/package.json +11 -0
- package/vendor/insane-search/engine/templates/playwright_mobile_chrome.js +188 -0
- package/vendor/insane-search/engine/templates/playwright_real_chrome.js +243 -0
- package/vendor/insane-search/engine/tests/test_hardening.py +57 -0
- package/vendor/insane-search/engine/tests/test_smoke.py +152 -0
- package/vendor/insane-search/engine/tests/test_u1.py +200 -0
- package/vendor/insane-search/engine/tests/test_u4.py +131 -0
- package/vendor/insane-search/engine/tests/test_u5.py +163 -0
- package/vendor/insane-search/engine/tests/test_u7.py +124 -0
- package/vendor/insane-search/engine/transport.py +211 -0
- package/vendor/insane-search/engine/url_transforms.py +98 -0
- package/vendor/insane-search/engine/validators.py +331 -0
- package/vendor/insane-search/engine/waf_detector.py +214 -0
- 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
|
|
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 {};
|