* docs: add ACP persistent binding experiment plan * docs: align ACP persistent binding spec to channel-local config * docs: scope Telegram ACP bindings to forum topics only * docs: lock bound /new and /reset behavior to in-place ACP reset * ACP: add persistent discord/telegram conversation bindings * ACP: fix persistent binding reuse and discord thread parent context * docs: document channel-specific persistent ACP bindings * ACP: split persistent bindings and share conversation id helpers * ACP: defer configured binding init until preflight passes * ACP: fix discord thread parent fallback and explicit disable inheritance * ACP: keep bound /new and /reset in-place * ACP: honor configured bindings in native command flows * ACP: avoid configured fallback after runtime bind failure * docs: refine ACP bindings experiment config examples * acp: cut over to typed top-level persistent bindings * ACP bindings: harden reset recovery and native command auth * Docs: add ACP bound command auth proposal * Tests: normalize i18n registry zh-CN assertion encoding * ACP bindings: address review findings for reset and fallback routing * ACP reset: gate hooks on success and preserve /new arguments * ACP bindings: fix auth and binding-priority review findings * Telegram ACP: gate ensure on auth and accepted messages * ACP bindings: fix session-key precedence and unavailable handling * ACP reset/native commands: honor fallback targets and abort on bootstrap failure * Config schema: validate ACP binding channel and Telegram topic IDs * Discord ACP: apply configured DM bindings to native commands * ACP reset tails: dispatch through ACP after command handling * ACP tails/native reset auth: fix target dispatch and restore full auth * ACP reset detection: fallback to active ACP keys for DM contexts * Tests: type runTurn mock input in ACP dispatch test * ACP: dedup binding route bootstrap and reset target resolution * reply: align ACP reset hooks with bound session key * docs: replace personal discord ids with placeholders * fix: add changelog entry for ACP persistent bindings (#34873) (thanks @dutifulbob) --------- Co-authored-by: Onur <2453968+osolmaz@users.noreply.github.com>
96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import type { ChatType } from "../channels/chat-type.js";
|
|
import type { AgentDefaultsConfig } from "./types.agent-defaults.js";
|
|
import type { AgentModelConfig, AgentSandboxConfig } from "./types.agents-shared.js";
|
|
import type { HumanDelayConfig, IdentityConfig } from "./types.base.js";
|
|
import type { GroupChatConfig } from "./types.messages.js";
|
|
import type { AgentToolsConfig, MemorySearchConfig } from "./types.tools.js";
|
|
|
|
export type AgentRuntimeAcpConfig = {
|
|
/** ACP harness adapter id (for example codex, claude). */
|
|
agent?: string;
|
|
/** Optional ACP backend override for this agent runtime. */
|
|
backend?: string;
|
|
/** Optional ACP session mode override. */
|
|
mode?: "persistent" | "oneshot";
|
|
/** Optional runtime working directory override. */
|
|
cwd?: string;
|
|
};
|
|
|
|
export type AgentRuntimeConfig =
|
|
| {
|
|
type: "embedded";
|
|
}
|
|
| {
|
|
type: "acp";
|
|
acp?: AgentRuntimeAcpConfig;
|
|
};
|
|
|
|
export type AgentBindingMatch = {
|
|
channel: string;
|
|
accountId?: string;
|
|
peer?: { kind: ChatType; id: string };
|
|
guildId?: string;
|
|
teamId?: string;
|
|
/** Discord role IDs used for role-based routing. */
|
|
roles?: string[];
|
|
};
|
|
|
|
export type AgentRouteBinding = {
|
|
/** Missing type is interpreted as route for backward compatibility. */
|
|
type?: "route";
|
|
agentId: string;
|
|
comment?: string;
|
|
match: AgentBindingMatch;
|
|
};
|
|
|
|
export type AgentAcpBinding = {
|
|
type: "acp";
|
|
agentId: string;
|
|
comment?: string;
|
|
match: AgentBindingMatch;
|
|
acp?: {
|
|
mode?: "persistent" | "oneshot";
|
|
label?: string;
|
|
cwd?: string;
|
|
backend?: string;
|
|
};
|
|
};
|
|
|
|
export type AgentBinding = AgentRouteBinding | AgentAcpBinding;
|
|
|
|
export type AgentConfig = {
|
|
id: string;
|
|
default?: boolean;
|
|
name?: string;
|
|
workspace?: string;
|
|
agentDir?: string;
|
|
model?: AgentModelConfig;
|
|
/** Optional allowlist of skills for this agent (omit = all skills; empty = none). */
|
|
skills?: string[];
|
|
memorySearch?: MemorySearchConfig;
|
|
/** Human-like delay between block replies for this agent. */
|
|
humanDelay?: HumanDelayConfig;
|
|
/** Optional per-agent heartbeat overrides. */
|
|
heartbeat?: AgentDefaultsConfig["heartbeat"];
|
|
identity?: IdentityConfig;
|
|
groupChat?: GroupChatConfig;
|
|
subagents?: {
|
|
/** Allow spawning sub-agents under other agent ids. Use "*" to allow any. */
|
|
allowAgents?: string[];
|
|
/** Per-agent default model for spawned sub-agents (string or {primary,fallbacks}). */
|
|
model?: AgentModelConfig;
|
|
};
|
|
/** Optional per-agent sandbox overrides. */
|
|
sandbox?: AgentSandboxConfig;
|
|
/** Optional per-agent stream params (e.g. cacheRetention, temperature). */
|
|
params?: Record<string, unknown>;
|
|
tools?: AgentToolsConfig;
|
|
/** Optional runtime descriptor for this agent. */
|
|
runtime?: AgentRuntimeConfig;
|
|
};
|
|
|
|
export type AgentsConfig = {
|
|
defaults?: AgentDefaultsConfig;
|
|
list?: AgentConfig[];
|
|
};
|