@songsid/agend 2.1.4-beta.4 → 2.1.4-beta.40
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/README.md +1 -1
- package/README.zh-TW.md +1 -1
- package/dist/agent-endpoint.js +1 -1
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/backend/antigravity.d.ts +9 -5
- package/dist/backend/antigravity.js +156 -31
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +62 -23
- package/dist/backend/claude-code.js +296 -43
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +18 -0
- package/dist/backend/codex.js +148 -8
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/gemini-cli.js +2 -2
- package/dist/backend/gemini-cli.js.map +1 -1
- package/dist/backend/grok.js +2 -2
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +2 -0
- package/dist/backend/kiro.js +24 -3
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/opencode.d.ts +27 -11
- package/dist/backend/opencode.js +65 -41
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/types.d.ts +45 -3
- package/dist/backend/types.js +12 -1
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +44 -2
- package/dist/channel/adapters/discord.js +526 -78
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +30 -0
- package/dist/channel/adapters/telegram.js +212 -18
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/agy-mcp-launcher.d.ts +2 -0
- package/dist/channel/agy-mcp-launcher.js +28 -0
- package/dist/channel/agy-mcp-launcher.js.map +1 -0
- package/dist/channel/ipc-bridge.d.ts +2 -1
- package/dist/channel/ipc-bridge.js +33 -4
- package/dist/channel/ipc-bridge.js.map +1 -1
- package/dist/channel/mcp-server.js +28 -25
- package/dist/channel/mcp-server.js.map +1 -1
- package/dist/channel/mcp-tools.js +4 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/message-queue.js +62 -1
- package/dist/channel/message-queue.js.map +1 -1
- package/dist/channel/types.d.ts +31 -1
- package/dist/classic-channel-manager.d.ts +40 -3
- package/dist/classic-channel-manager.js +218 -31
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +109 -37
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +48 -7
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.js +12 -1
- package/dist/config.js.map +1 -1
- package/dist/cross-instance-envelope.d.ts +6 -0
- package/dist/cross-instance-envelope.js +30 -0
- package/dist/cross-instance-envelope.js.map +1 -0
- package/dist/daemon.d.ts +319 -9
- package/dist/daemon.js +1402 -255
- package/dist/daemon.js.map +1 -1
- package/dist/doctor.d.ts +41 -0
- package/dist/doctor.js +267 -0
- package/dist/doctor.js.map +1 -0
- package/dist/fleet-context.d.ts +47 -0
- package/dist/fleet-manager.d.ts +265 -11
- package/dist/fleet-manager.js +2273 -455
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-yaml-slim.d.ts +10 -0
- package/dist/fleet-yaml-slim.js +59 -0
- package/dist/fleet-yaml-slim.js.map +1 -0
- package/dist/general-knowledge/skills/backend-providers/SKILL.md +114 -0
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +3 -1
- package/dist/general-knowledge/skills/delegation-playbook/SKILL.md +52 -0
- package/dist/general-knowledge/skills/development-workflow/SKILL.md +28 -0
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +1 -0
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +1 -0
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -0
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +1 -0
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +64 -16
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +1 -0
- package/dist/general-knowledge/skills/scheduling/SKILL.md +1 -0
- package/dist/general-knowledge/skills/session-management/SKILL.md +1 -0
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +1 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +30 -0
- package/dist/instance-lifecycle.d.ts +67 -0
- package/dist/instance-lifecycle.js +273 -8
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +12 -0
- package/dist/instructions.js +35 -1
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +958 -288
- package/dist/locale.js.map +1 -1
- package/dist/login-flows.d.ts +91 -0
- package/dist/login-flows.js +170 -0
- package/dist/login-flows.js.map +1 -0
- package/dist/login-manager.d.ts +63 -0
- package/dist/login-manager.js +134 -0
- package/dist/login-manager.js.map +1 -0
- package/dist/network-family.d.ts +18 -0
- package/dist/network-family.js +20 -0
- package/dist/network-family.js.map +1 -0
- package/dist/outbound-handlers.d.ts +8 -0
- package/dist/outbound-handlers.js +101 -18
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +7 -1
- package/dist/outbound-schemas.js +9 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/reply-dedup.d.ts +7 -8
- package/dist/reply-dedup.js +0 -0
- package/dist/reply-dedup.js.map +1 -1
- package/dist/restart-progress.d.ts +2 -0
- package/dist/restart-progress.js +3 -0
- package/dist/restart-progress.js.map +1 -1
- package/dist/scheduler/db.d.ts +12 -0
- package/dist/scheduler/db.js +59 -0
- package/dist/scheduler/db.js.map +1 -1
- package/dist/service-installer.d.ts +11 -0
- package/dist/service-installer.js +84 -18
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.js +1 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/setup-wizard.js +2 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/spawn-gate.d.ts +30 -0
- package/dist/spawn-gate.js +79 -0
- package/dist/spawn-gate.js.map +1 -0
- package/dist/storm-window.d.ts +83 -0
- package/dist/storm-window.js +251 -0
- package/dist/storm-window.js.map +1 -0
- package/dist/tips.d.ts +44 -0
- package/dist/tips.js +355 -0
- package/dist/tips.js.map +1 -0
- package/dist/tmux-manager.d.ts +16 -0
- package/dist/tmux-manager.js +110 -25
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-progress.d.ts +40 -0
- package/dist/tool-progress.js +289 -0
- package/dist/tool-progress.js.map +1 -0
- package/dist/topic-commands.d.ts +42 -4
- package/dist/topic-commands.js +354 -66
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +15 -2
- package/dist/transcript-monitor.js +63 -17
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +131 -0
- package/dist/transcript-sources.js +580 -0
- package/dist/transcript-sources.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/ui/dashboard.html +55 -32
- package/dist/ui/settings.html +200 -60
- package/dist/ui/view.html +147 -30
- package/dist/usage/format-rich.js +24 -23
- package/dist/usage/format-rich.js.map +1 -1
- package/dist/usage/i18n-keys.d.ts +7 -0
- package/dist/usage/i18n-keys.js +34 -0
- package/dist/usage/i18n-keys.js.map +1 -0
- package/dist/usage/i18n.d.ts +5 -0
- package/dist/usage/i18n.js +27 -0
- package/dist/usage/i18n.js.map +1 -0
- package/dist/usage/providers.d.ts +19 -0
- package/dist/usage/providers.js +150 -74
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/usage-api.d.ts +8 -2
- package/dist/usage/usage-api.js +45 -23
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/workflow-templates/default.md +2 -1
- package/package.json +2 -2
|
@@ -17,22 +17,38 @@ export declare class OpenCodeBackend implements CliBackend {
|
|
|
17
17
|
getContextUsage(): number | null;
|
|
18
18
|
getSessionId(): string | null;
|
|
19
19
|
/**
|
|
20
|
-
* Find this instance's OpenCode session
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
20
|
+
* Find this instance's OpenCode session via the CLI's own listing —
|
|
21
|
+
* `opencode session list --format json` — the official output surface for
|
|
22
|
+
* exactly the data this needs ({ id, directory, created, updated } per
|
|
23
|
+
* session, newest first, subagent children excluded). This replaced a
|
|
24
|
+
* direct read of opencode.db: same information, but semver-protected CLI
|
|
25
|
+
* output instead of a private sqlite schema, and no node:sqlite
|
|
26
|
+
* requirement. ~1.2s per call is fine — discovery only runs from
|
|
27
|
+
* saveSessionId sites (shutdown, pause, crash respawn, idle checkpoint),
|
|
28
|
+
* never on a hot path.
|
|
25
29
|
*
|
|
26
30
|
* A row is only accepted when it matches the spawn this backend performed:
|
|
27
31
|
* same directory AND (created after our launch, or the exact id we resumed
|
|
28
|
-
* with). A session someone created manually in the same cwd before our
|
|
29
|
-
* can therefore never be adopted — the hijack #525 removed must not
|
|
30
|
-
* through this path.
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* quietly returns null and resume simply stays unavailable.
|
|
32
|
+
* with). A session someone created manually in the same cwd before our
|
|
33
|
+
* spawn can therefore never be adopted — the hijack #525 removed must not
|
|
34
|
+
* return through this path. The directory filter is done here because the
|
|
35
|
+
* listing is global; `--continue`'s apparent per-cwd behavior is an
|
|
36
|
+
* undocumented server-scoping side effect we deliberately do not rely on.
|
|
34
37
|
*/
|
|
35
38
|
private discoverSessionId;
|
|
39
|
+
/**
|
|
40
|
+
* `opencode session list --format json`, bounded and best-effort. Split out
|
|
41
|
+
* as the process-spawning seam so tests stub it with fixture rows instead
|
|
42
|
+
* of a real CLI.
|
|
43
|
+
*
|
|
44
|
+
* Runs with cwd = the instance's working directory: the listing is scoped
|
|
45
|
+
* to the PROJECT opencode resolves for the cwd it runs in (a git root, or
|
|
46
|
+
* the "global" project outside one — verified on 1.18.15). Run anywhere
|
|
47
|
+
* else and the instance's sessions may simply not be in the output. The
|
|
48
|
+
* exact-directory filter in discoverSessionId still applies on top, because
|
|
49
|
+
* a project can span several directories (worktrees, monorepo).
|
|
50
|
+
*/
|
|
51
|
+
private listSessions;
|
|
36
52
|
getQuitCommand(): string;
|
|
37
53
|
getCompactCommand(): string;
|
|
38
54
|
getClearCommand(): string;
|
package/dist/backend/opencode.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
2
|
import { execFileSync } from "node:child_process";
|
|
3
3
|
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
4
|
-
import {
|
|
5
|
-
import { resolveBinary, validateModel, warnIfModelMismatch } from "./types.js";
|
|
4
|
+
import { resolveBinary, shellQuote, validateModel, warnIfModelMismatch } from "./types.js";
|
|
6
5
|
export class OpenCodeBackend {
|
|
7
6
|
instanceDir;
|
|
8
7
|
binaryName = "opencode";
|
|
@@ -38,7 +37,7 @@ export class OpenCodeBackend {
|
|
|
38
37
|
if (config.model) {
|
|
39
38
|
const model = validateModel(config.model);
|
|
40
39
|
warnIfModelMismatch("opencode", model);
|
|
41
|
-
cmd += ` --model ${model}`;
|
|
40
|
+
cmd += ` --model ${shellQuote(model)}`;
|
|
42
41
|
}
|
|
43
42
|
return cmd;
|
|
44
43
|
}
|
|
@@ -90,8 +89,21 @@ export class OpenCodeBackend {
|
|
|
90
89
|
}
|
|
91
90
|
getErrorPatterns() {
|
|
92
91
|
return [
|
|
93
|
-
{
|
|
94
|
-
|
|
92
|
+
{
|
|
93
|
+
// Pane scrollback also contains the user's prose. Require OpenCode's
|
|
94
|
+
// decorated error-line prefix and token boundaries so IDs such as
|
|
95
|
+
// 14290/4012 cannot trigger recovery actions.
|
|
96
|
+
pattern: /^\s*(?:■|⚠️?|Error:)\s*[^\n]*\b(?:rate[ _-]?limit(?:ed|ing)?|too many requests|429)\b/im,
|
|
97
|
+
type: "rate_limit",
|
|
98
|
+
action: "failover",
|
|
99
|
+
message: "Rate limit reached",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
pattern: /^\s*(?:■|⚠️?|Error:)\s*[^\n]*\b(?:auth(?:entication)?[ _-]?(?:error|failed|failure)|unauthorized|401)\b/im,
|
|
103
|
+
type: "auth_error",
|
|
104
|
+
action: "pause",
|
|
105
|
+
message: "Authentication error",
|
|
106
|
+
},
|
|
95
107
|
];
|
|
96
108
|
}
|
|
97
109
|
getContextUsage() {
|
|
@@ -113,52 +125,64 @@ export class OpenCodeBackend {
|
|
|
113
125
|
}
|
|
114
126
|
}
|
|
115
127
|
/**
|
|
116
|
-
* Find this instance's OpenCode session
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
128
|
+
* Find this instance's OpenCode session via the CLI's own listing —
|
|
129
|
+
* `opencode session list --format json` — the official output surface for
|
|
130
|
+
* exactly the data this needs ({ id, directory, created, updated } per
|
|
131
|
+
* session, newest first, subagent children excluded). This replaced a
|
|
132
|
+
* direct read of opencode.db: same information, but semver-protected CLI
|
|
133
|
+
* output instead of a private sqlite schema, and no node:sqlite
|
|
134
|
+
* requirement. ~1.2s per call is fine — discovery only runs from
|
|
135
|
+
* saveSessionId sites (shutdown, pause, crash respawn, idle checkpoint),
|
|
136
|
+
* never on a hot path.
|
|
121
137
|
*
|
|
122
138
|
* A row is only accepted when it matches the spawn this backend performed:
|
|
123
139
|
* same directory AND (created after our launch, or the exact id we resumed
|
|
124
|
-
* with). A session someone created manually in the same cwd before our
|
|
125
|
-
* can therefore never be adopted — the hijack #525 removed must not
|
|
126
|
-
* through this path.
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
* quietly returns null and resume simply stays unavailable.
|
|
140
|
+
* with). A session someone created manually in the same cwd before our
|
|
141
|
+
* spawn can therefore never be adopted — the hijack #525 removed must not
|
|
142
|
+
* return through this path. The directory filter is done here because the
|
|
143
|
+
* listing is global; `--continue`'s apparent per-cwd behavior is an
|
|
144
|
+
* undocumented server-scoping side effect we deliberately do not rely on.
|
|
130
145
|
*/
|
|
131
146
|
discoverSessionId() {
|
|
132
147
|
if (!this.workingDirectory || this.launchedAt === null)
|
|
133
148
|
return null;
|
|
149
|
+
const sessions = this.listSessions();
|
|
150
|
+
if (!sessions)
|
|
151
|
+
return null;
|
|
152
|
+
const candidates = sessions
|
|
153
|
+
.filter(s => s.directory === this.workingDirectory && !s.parentID)
|
|
154
|
+
.sort((a, b) => (b.updated ?? 0) - (a.updated ?? 0));
|
|
155
|
+
for (const session of candidates) {
|
|
156
|
+
if (session.id === this.launchedSessionId)
|
|
157
|
+
return session.id;
|
|
158
|
+
if ((session.created ?? 0) >= this.launchedAt)
|
|
159
|
+
return session.id;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* `opencode session list --format json`, bounded and best-effort. Split out
|
|
165
|
+
* as the process-spawning seam so tests stub it with fixture rows instead
|
|
166
|
+
* of a real CLI.
|
|
167
|
+
*
|
|
168
|
+
* Runs with cwd = the instance's working directory: the listing is scoped
|
|
169
|
+
* to the PROJECT opencode resolves for the cwd it runs in (a git root, or
|
|
170
|
+
* the "global" project outside one — verified on 1.18.15). Run anywhere
|
|
171
|
+
* else and the instance's sessions may simply not be in the output. The
|
|
172
|
+
* exact-directory filter in discoverSessionId still applies on top, because
|
|
173
|
+
* a project can span several directories (worktrees, monorepo).
|
|
174
|
+
*/
|
|
175
|
+
listSessions() {
|
|
176
|
+
if (!this.workingDirectory)
|
|
177
|
+
return null;
|
|
134
178
|
try {
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return null;
|
|
139
|
-
const dataHome = process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
140
|
-
const dbPath = join(dataHome, "opencode", "opencode.db");
|
|
141
|
-
if (!existsSync(dbPath))
|
|
142
|
-
return null;
|
|
143
|
-
const db = new sqlite.DatabaseSync(dbPath, { readOnly: true });
|
|
144
|
-
try {
|
|
145
|
-
// parent_id IS NULL excludes subagent child sessions. LIMIT 10 keeps the
|
|
146
|
-
// scan bounded; the active session is the newest by time_updated anyway.
|
|
147
|
-
const rows = db.prepare("SELECT id, time_created FROM session WHERE directory = ? AND parent_id IS NULL ORDER BY time_updated DESC LIMIT 10").all(this.workingDirectory);
|
|
148
|
-
for (const row of rows) {
|
|
149
|
-
if (row.id === this.launchedSessionId)
|
|
150
|
-
return row.id;
|
|
151
|
-
if (row.time_created >= this.launchedAt)
|
|
152
|
-
return row.id;
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
finally {
|
|
157
|
-
db.close();
|
|
158
|
-
}
|
|
179
|
+
const out = execFileSync(this.binaryPath, ["session", "list", "--format", "json", "-n", "50"], { encoding: "utf-8", timeout: 15_000, stdio: ["ignore", "pipe", "ignore"], cwd: this.workingDirectory });
|
|
180
|
+
const parsed = JSON.parse(out);
|
|
181
|
+
return Array.isArray(parsed) ? parsed : null;
|
|
159
182
|
}
|
|
160
183
|
catch {
|
|
161
|
-
//
|
|
184
|
+
// CLI missing/slow/failed, or the working directory is gone — resume is
|
|
185
|
+
// best-effort, never fatal.
|
|
162
186
|
return null;
|
|
163
187
|
}
|
|
164
188
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/backend/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/backend/opencode.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/types.d.ts
CHANGED
|
@@ -34,11 +34,13 @@ export interface CliBackendConfig {
|
|
|
34
34
|
agentMode?: "mcp" | "cli";
|
|
35
35
|
/** Health server port for CLI mode (agend-agent connects here). */
|
|
36
36
|
agentPort?: number;
|
|
37
|
+
/** Per-backend options merged from fleet defaults + instance config (e.g. { provider: "glm" }). */
|
|
38
|
+
backendOptions?: Record<string, unknown>;
|
|
37
39
|
}
|
|
38
40
|
/** Action to take when an error pattern is detected in PTY output. */
|
|
39
41
|
export type ErrorActionType = "notify" | "failover" | "restart" | "pause";
|
|
40
42
|
/** Categorizes detected errors for logging and response. */
|
|
41
|
-
export type ErrorType = "rate_limit" | "auth_error" | "crash" | "network" | "quota" | "timeout" | "model_error";
|
|
43
|
+
export type ErrorType = "rate_limit" | "auth_error" | "crash" | "network" | "quota" | "timeout" | "model_error" | "config_error";
|
|
42
44
|
export interface ErrorPattern {
|
|
43
45
|
pattern: RegExp;
|
|
44
46
|
type: ErrorType;
|
|
@@ -72,6 +74,12 @@ export interface CliEnv {
|
|
|
72
74
|
authenticated?: boolean;
|
|
73
75
|
currentModel?: string;
|
|
74
76
|
models: ModelOption[];
|
|
77
|
+
/**
|
|
78
|
+
* Extended account catalog behind the "/model → more models" tier (claude:
|
|
79
|
+
* live `GET /v1/models` plus [1m] variants). Kept separate from `models` so
|
|
80
|
+
* the quick-pick tier stays short.
|
|
81
|
+
*/
|
|
82
|
+
apiModels?: ModelOption[];
|
|
75
83
|
/** Epoch ms the probe ran (drives the cache TTL). */
|
|
76
84
|
probedAt: number;
|
|
77
85
|
}
|
|
@@ -86,8 +94,22 @@ export interface RuntimeDialog {
|
|
|
86
94
|
/** Human-readable description for logging. */
|
|
87
95
|
description: string;
|
|
88
96
|
}
|
|
89
|
-
/**
|
|
90
|
-
|
|
97
|
+
/**
|
|
98
|
+
* A dialog that may appear during CLI startup (trust prompts, session pickers, etc.).
|
|
99
|
+
* With `fatal` set, the screen cannot be dismissed by keypresses (e.g. a corrupt
|
|
100
|
+
* claude.json modal whose only choices are "exit" and "reset config"): the daemon
|
|
101
|
+
* reports the error instead of sending keys — `keys` is ignored and should be [].
|
|
102
|
+
* This must be detected as a dialog, not left to the ready check: such modals
|
|
103
|
+
* often contain the `❯` selector that ready patterns match, so they would
|
|
104
|
+
* otherwise pass as ready and queued messages would be typed into the modal.
|
|
105
|
+
*/
|
|
106
|
+
export type StartupDialog = RuntimeDialog & {
|
|
107
|
+
fatal?: {
|
|
108
|
+
type: ErrorType;
|
|
109
|
+
action: ErrorActionType;
|
|
110
|
+
message: string;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
91
113
|
export interface CliBackend {
|
|
92
114
|
/** The CLI binary name (e.g. "claude", "gemini", "codex") */
|
|
93
115
|
readonly binaryName: string;
|
|
@@ -107,6 +129,16 @@ export interface CliBackend {
|
|
|
107
129
|
* at an empty prompt and during generation. Absent means false.
|
|
108
130
|
*/
|
|
109
131
|
requiresDeliveryEnterRetry?(): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Whether the TUI can emit terminal output while its visible pane is
|
|
134
|
+
* unchanged (for example, rerunning and repainting a status-line hook).
|
|
135
|
+
*
|
|
136
|
+
* The daemon normally treats every tmux control-mode output event as immediate
|
|
137
|
+
* evidence of work. Backends with periodic cosmetic redraws instead require a
|
|
138
|
+
* pane capture to confirm that visible content actually changed. Absent means
|
|
139
|
+
* false.
|
|
140
|
+
*/
|
|
141
|
+
hasPeriodicPaneRedraw?(): boolean;
|
|
110
142
|
/** Build the shell command string to launch the CLI in a tmux window. */
|
|
111
143
|
buildCommand(config: CliBackendConfig): string;
|
|
112
144
|
/** Write all config files the CLI needs before launch. */
|
|
@@ -191,6 +223,14 @@ export interface CliBackend {
|
|
|
191
223
|
* verified equivalent. Used by the admin-only /clear fleet command.
|
|
192
224
|
*/
|
|
193
225
|
getClearCommand(): string | null;
|
|
226
|
+
/**
|
|
227
|
+
* Optional confirmation shown after getClearCommand() is submitted. AgEnD
|
|
228
|
+
* already obtains an admin confirmation in the channel, so a backend that
|
|
229
|
+
* adds its own terminal prompt can be answered automatically. The daemon
|
|
230
|
+
* only consults this for /clear deliveries; ordinary runtime dialogs and
|
|
231
|
+
* manually typed commands are not affected.
|
|
232
|
+
*/
|
|
233
|
+
getClearConfirmationDialog?(): RuntimeDialog | null;
|
|
194
234
|
/**
|
|
195
235
|
* The tmux key that interrupts the CLI's current generation WITHOUT quitting —
|
|
196
236
|
* "Escape" for most, "C-c" (Ctrl+C) for kiro-cli. Used by the cancel button and
|
|
@@ -250,6 +290,8 @@ export declare function resolveBinary(name: string, fallbackDirs?: readonly stri
|
|
|
250
290
|
*/
|
|
251
291
|
export declare function validateEffort(effort: string): string;
|
|
252
292
|
export declare function validateModel(model: string): string;
|
|
293
|
+
/** Guard a provider name before embedding it in a shell command. */
|
|
294
|
+
export declare function validateProvider(provider: string): string;
|
|
253
295
|
/** Check if a model name is compatible with the given backend. */
|
|
254
296
|
export declare function isModelCompatible(backendName: string, model: string): boolean;
|
|
255
297
|
/**
|
package/dist/backend/types.js
CHANGED
|
@@ -73,7 +73,11 @@ export function resolveBinary(name, fallbackDirs) {
|
|
|
73
73
|
* Throws if `model` contains anything else, since `buildCommand` returns a
|
|
74
74
|
* shell string consumed by tmux and we cannot rely on argv-style quoting.
|
|
75
75
|
*/
|
|
76
|
-
|
|
76
|
+
// Brackets admit Claude Code's 1M-context suffix (opus[1m] — binary-verified
|
|
77
|
+
// "append [1m] to the model name for 1M"). They are shell GLOB characters,
|
|
78
|
+
// so every command-line embed of a model MUST go through shellQuote(): an
|
|
79
|
+
// unquoted opus[1m] can pathname-expand in bash and aborts zsh outright.
|
|
80
|
+
const SAFE_MODEL_RE = /^[A-Za-z0-9._:/[\]-]+$/;
|
|
77
81
|
/**
|
|
78
82
|
* Guard an effort level before it reaches a shell command line. Same reasoning
|
|
79
83
|
* as validateModel: the value originates from a chat message, and the launch
|
|
@@ -92,6 +96,13 @@ export function validateModel(model) {
|
|
|
92
96
|
}
|
|
93
97
|
return model;
|
|
94
98
|
}
|
|
99
|
+
/** Guard a provider name before embedding it in a shell command. */
|
|
100
|
+
export function validateProvider(provider) {
|
|
101
|
+
if (!/^[A-Za-z0-9_-]+$/.test(provider)) {
|
|
102
|
+
throw new Error(`Invalid provider name: "${provider}" — only alphanumeric, underscore, hyphen allowed`);
|
|
103
|
+
}
|
|
104
|
+
return provider;
|
|
105
|
+
}
|
|
95
106
|
/** Known model prefixes/patterns per backend. Used only for advisory warnings. */
|
|
96
107
|
const BACKEND_MODEL_PATTERNS = {
|
|
97
108
|
"claude-code": /^(sonnet|opus|haiku|opusplan|best|fable|claude)/i,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backend/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
|
-
import
|
|
2
|
+
import { Client } from "discord.js";
|
|
3
|
+
import type { ChannelAdapter, ApprovalHandle, SendOpts, SentMessage, PermissionPrompt, Choice, AlertData, AdapterHealthSnapshot } from "../types.js";
|
|
3
4
|
import type { AccessManager } from "../access-manager.js";
|
|
4
5
|
/** Curated ClassicBot backends for Discord's native slash-option dropdown. */
|
|
5
6
|
export declare const DISCORD_START_BACKEND_CHOICES: readonly [{
|
|
@@ -30,12 +31,39 @@ export interface DiscordAdapterOptions {
|
|
|
30
31
|
categoryName?: string;
|
|
31
32
|
generalChannelId?: string;
|
|
32
33
|
registerCommands?: boolean;
|
|
34
|
+
/** Test seams; production callers leave these unset. */
|
|
35
|
+
clientFactory?: () => Client;
|
|
36
|
+
now?: () => number;
|
|
37
|
+
watchdogIntervalMs?: number;
|
|
38
|
+
staleThresholdMs?: number;
|
|
39
|
+
reconnectBaseDelayMs?: number;
|
|
33
40
|
}
|
|
34
41
|
export declare class DiscordAdapter extends EventEmitter implements ChannelAdapter {
|
|
35
42
|
readonly type = "discord";
|
|
36
43
|
readonly topology: "channels";
|
|
37
44
|
readonly id: string;
|
|
38
45
|
private client;
|
|
46
|
+
private readonly clientFactory;
|
|
47
|
+
private readonly now;
|
|
48
|
+
private readonly watchdogIntervalMs;
|
|
49
|
+
private readonly staleThresholdMs;
|
|
50
|
+
private readonly reconnectBaseDelayMs;
|
|
51
|
+
private desiredRunning;
|
|
52
|
+
private lifecycleEpoch;
|
|
53
|
+
private clientGeneration;
|
|
54
|
+
private reconnectPromise;
|
|
55
|
+
private watchdogTimer;
|
|
56
|
+
private lastWatchdogTickAt;
|
|
57
|
+
private generationReadyAt;
|
|
58
|
+
private generationNonReadySince;
|
|
59
|
+
private shardNonReadySince;
|
|
60
|
+
private previousHeartbeatAck;
|
|
61
|
+
private observedHeartbeatInterval;
|
|
62
|
+
private healthStatus;
|
|
63
|
+
private lastDispatchAt;
|
|
64
|
+
private lastReconnectAt;
|
|
65
|
+
private lastReconnectReason;
|
|
66
|
+
private reconnectCount;
|
|
39
67
|
private botToken;
|
|
40
68
|
private accessManager;
|
|
41
69
|
private inboxDir;
|
|
@@ -49,10 +77,22 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
49
77
|
private attachmentUrls;
|
|
50
78
|
private categoryIdPromise?;
|
|
51
79
|
constructor(opts: DiscordAdapterOptions);
|
|
80
|
+
private buildClient;
|
|
52
81
|
private _fetchTextChannel;
|
|
53
|
-
private
|
|
82
|
+
private registerClientHandlers;
|
|
54
83
|
/** Mark channels as open (skip access control) — used for classic bot channels */
|
|
55
84
|
setOpenChannels(channelIds: string[]): void;
|
|
85
|
+
private isCurrentClient;
|
|
86
|
+
private emitFromClient;
|
|
87
|
+
private emitHealthChanged;
|
|
88
|
+
private loginFreshClient;
|
|
89
|
+
/** Rebuild just this bot's gateway Client. Calls coalesce into one generation. */
|
|
90
|
+
reconnectGateway(reason: string): Promise<void>;
|
|
91
|
+
private readyClient;
|
|
92
|
+
private startGatewayWatchdog;
|
|
93
|
+
private checkGatewayLiveness;
|
|
94
|
+
getHealthSnapshot(): AdapterHealthSnapshot;
|
|
95
|
+
private handleClientReady;
|
|
56
96
|
start(): Promise<void>;
|
|
57
97
|
stop(): Promise<void>;
|
|
58
98
|
/**
|
|
@@ -69,6 +109,8 @@ export declare class DiscordAdapter extends EventEmitter implements ChannelAdapt
|
|
|
69
109
|
editMessage(chatId: string, messageId: string, text: string, threadId?: string): Promise<void>;
|
|
70
110
|
/** Edit text and clear components (Discord keeps components on a plain edit,
|
|
71
111
|
* so we must pass an empty array to drop the Cancel button). */
|
|
112
|
+
/** Keyboard-only removal — Discord keeps the original content untouched. */
|
|
113
|
+
removeMessageButtons(chatId: string, messageId: string, threadId?: string): Promise<void>;
|
|
72
114
|
editMessageRemoveButtons(chatId: string, messageId: string, text: string, threadId?: string): Promise<void>;
|
|
73
115
|
deleteMessage(chatId: string, messageId: string, threadId?: string): Promise<void>;
|
|
74
116
|
react(chatId: string, messageId: string, emoji: string, threadId?: string): Promise<void>;
|