@songsid/agend 2.1.0-beta.9 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/README.zh-TW.md +2 -1
- package/dist/access-path.js +3 -3
- package/dist/access-path.js.map +1 -1
- package/dist/agent-cli.js +1 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +8 -0
- package/dist/agent-endpoint.js +36 -8
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/backend/antigravity.d.ts +8 -0
- package/dist/backend/antigravity.js +43 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +6 -0
- package/dist/backend/claude-code.js +20 -4
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.d.ts +12 -1
- package/dist/backend/codex.js +55 -1
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/factory.js +4 -1
- package/dist/backend/factory.js.map +1 -1
- package/dist/backend/grok.d.ts +59 -0
- package/dist/backend/grok.js +329 -0
- package/dist/backend/grok.js.map +1 -0
- package/dist/backend/kiro.d.ts +6 -0
- package/dist/backend/kiro.js +38 -3
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/opencode.d.ts +5 -0
- package/dist/backend/opencode.js +18 -0
- package/dist/backend/opencode.js.map +1 -1
- package/dist/backend/types.d.ts +59 -3
- package/dist/backend/types.js +15 -2
- package/dist/backend/types.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +20 -0
- package/dist/channel/adapters/discord.js +88 -11
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.js +4 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +18 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/chat-export.js +5 -2
- package/dist/chat-export.js.map +1 -1
- package/dist/classic-channel-manager.d.ts +16 -1
- package/dist/classic-channel-manager.js +76 -4
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +82 -16
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +70 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.js +14 -1
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +67 -5
- package/dist/daemon.js +489 -180
- package/dist/daemon.js.map +1 -1
- package/dist/daily-summary.js +7 -2
- package/dist/daily-summary.js.map +1 -1
- package/dist/fleet-context.d.ts +11 -0
- package/dist/fleet-manager.d.ts +128 -7
- package/dist/fleet-manager.js +1116 -140
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-system-prompt.js +1 -1
- package/dist/general-knowledge/skills/fleet-config/SKILL.md +19 -13
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +30 -51
- package/dist/general-knowledge/skills/fleet-restart/SKILL.md +1 -1
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +19 -13
- package/dist/general-knowledge/skills/model-discovery/SKILL.md +1 -5
- package/dist/general-knowledge/skills/scheduling/SKILL.md +41 -0
- package/dist/general-knowledge/skills/session-management/SKILL.md +29 -116
- package/dist/instance-lifecycle.d.ts +13 -0
- package/dist/instance-lifecycle.js +57 -18
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +28 -2
- package/dist/locale.js.map +1 -1
- package/dist/logger.d.ts +6 -0
- package/dist/logger.js +23 -7
- package/dist/logger.js.map +1 -1
- package/dist/outbound-handlers.js +199 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +44 -2
- package/dist/outbound-schemas.js +50 -3
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pause-marker.d.ts +5 -0
- package/dist/pause-marker.js +36 -0
- package/dist/pause-marker.js.map +1 -0
- package/dist/scheduler/db.d.ts +8 -0
- package/dist/scheduler/db.js +74 -5
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/db.test.js +50 -0
- package/dist/scheduler/db.test.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +6 -0
- package/dist/scheduler/scheduler.js +99 -16
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/scheduler.test.js +131 -1
- package/dist/scheduler/scheduler.test.js.map +1 -1
- package/dist/scheduler/types.d.ts +9 -3
- package/dist/scheduler/types.js.map +1 -1
- package/dist/settings-api.d.ts +20 -2
- package/dist/settings-api.js +213 -9
- package/dist/settings-api.js.map +1 -1
- package/dist/setup-wizard.js +8 -0
- package/dist/setup-wizard.js.map +1 -1
- package/dist/tmux-control.d.ts +7 -0
- package/dist/tmux-control.js +22 -1
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -1
- package/dist/tmux-manager.js.map +1 -1
- package/dist/topic-commands.d.ts +14 -0
- package/dist/topic-commands.js +107 -15
- package/dist/topic-commands.js.map +1 -1
- package/dist/types.d.ts +29 -1
- package/dist/tz-utils.d.ts +26 -0
- package/dist/tz-utils.js +46 -0
- package/dist/tz-utils.js.map +1 -0
- package/dist/ui/dashboard.html +3 -3
- package/dist/ui/settings.html +453 -74
- package/dist/web-api.js +3 -1
- package/dist/web-api.js.map +1 -1
- package/dist/workflow-templates/default.md +0 -4
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/backend/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAAmB;IAC7D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC5C,KAAK,YAAY;YACf,OAAO,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;YAC5G,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,UAAU;YACb,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACtC,KAAK,aAAa;YAChB,OAAO,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC7C,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/backend/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAAmB;IAC7D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC5C,KAAK,YAAY;YACf,OAAO,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;YAC5G,OAAO,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC3C,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;QACvC,KAAK,UAAU;YACb,OAAO,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,UAAU;YACb,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACtC,KAAK,aAAa;YAChB,OAAO,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC7C,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACtC,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACtC;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,0FAA0F,CAAC,CAAC;IACxI,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { type CliBackend, type CliBackendConfig, type ErrorPattern, type RuntimeDialog, type StartupDialog } from "./types.js";
|
|
2
|
+
/** Parse the text format emitted by `grok models`. */
|
|
3
|
+
export declare function parseGrokModelsOutput(output: string): import("./types.js").ModelOption[];
|
|
4
|
+
/**
|
|
5
|
+
* Grok Build (xAI) — https://docs.x.ai/build/cli
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT — why the interactive TUI, not `grok agent stdio`:
|
|
8
|
+
* Grok Build exposes three surfaces: the interactive TUI (`grok`), headless
|
|
9
|
+
* (`grok -p "<prompt>"`), and an ACP agent (`grok agent stdio`) that speaks
|
|
10
|
+
* JSON-RPC over stdin/stdout. AgEnD drives a backend through a tmux PTY — it
|
|
11
|
+
* scans human-readable pane text for ready/error patterns and injects
|
|
12
|
+
* keystrokes (cancel key, slash commands). An ACP JSON-RPC agent has no
|
|
13
|
+
* human-readable prompt, ready banner, or slash commands, so the CliBackend
|
|
14
|
+
* interface does not map onto it. The interactive TUI is the correct surface,
|
|
15
|
+
* the same choice made for codex/opencode/kiro.
|
|
16
|
+
*
|
|
17
|
+
* Phase 2: ready pattern, cancel/quit keys, /compact, context format, and the
|
|
18
|
+
* device-flow login dialog were confirmed against a live grok session. Error
|
|
19
|
+
* strings beyond the cancellation notice are still best-effort and may need
|
|
20
|
+
* tuning.
|
|
21
|
+
*/
|
|
22
|
+
export declare class GrokBackend implements CliBackend {
|
|
23
|
+
private instanceDir;
|
|
24
|
+
readonly binaryName = "grok";
|
|
25
|
+
private binaryPath;
|
|
26
|
+
private workingDirectory?;
|
|
27
|
+
constructor(instanceDir: string);
|
|
28
|
+
buildCommand(config: CliBackendConfig): string;
|
|
29
|
+
/**
|
|
30
|
+
* Build an ASCII-only, per-instance MCP server key. Grok Build's MCP client has
|
|
31
|
+
* a bug where a non-ASCII (e.g. CJK) server name connects but drops ALL tools
|
|
32
|
+
* (tool_count=0, misreported as "connection failed"). Instance names can be CJK
|
|
33
|
+
* (persona ClassicBot channels), so sanitize: pure-ASCII names pass through
|
|
34
|
+
* unchanged (readable + already unique); names with non-ASCII are stripped to an
|
|
35
|
+
* ASCII slug plus a short hash of the ORIGINAL name, so two distinct CJK names
|
|
36
|
+
* sharing a working directory can't collide to the same key.
|
|
37
|
+
*/
|
|
38
|
+
private mcpKey;
|
|
39
|
+
/** The daemon's persisted session id (written from getSessionId()), for --resume. */
|
|
40
|
+
private storedSessionId;
|
|
41
|
+
writeConfig(config: CliBackendConfig): void;
|
|
42
|
+
getReadyPattern(): RegExp;
|
|
43
|
+
getErrorPatterns(): ErrorPattern[];
|
|
44
|
+
getStartupDialogs(): StartupDialog[];
|
|
45
|
+
getContextUsage(): number | null;
|
|
46
|
+
getSessionId(): string | null;
|
|
47
|
+
getRuntimeDialogs(): RuntimeDialog[];
|
|
48
|
+
getQuitCommand(): string | null;
|
|
49
|
+
getQuitKey(): string;
|
|
50
|
+
getCompactCommand(): string;
|
|
51
|
+
getCancelKey(): string;
|
|
52
|
+
getModelSwitchStrategy(): "runtime" | "restart";
|
|
53
|
+
listModels(): Promise<import("./types.js").ModelOption[]>;
|
|
54
|
+
probeCLIEnv(): Promise<{
|
|
55
|
+
version: string | undefined;
|
|
56
|
+
models: import("./types.js").ModelOption[];
|
|
57
|
+
}>;
|
|
58
|
+
cleanup(config: CliBackendConfig): void;
|
|
59
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
3
|
+
import { existsSync, readFileSync, readdirSync, statSync, writeFileSync, chmodSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { createHash } from "node:crypto";
|
|
6
|
+
import { isModelCompatible, resolveBinary, validateModel } from "./types.js";
|
|
7
|
+
import { appendWithMarker, removeMarker } from "./marker-utils.js";
|
|
8
|
+
/** Session ids are UUIDs (e.g. "019f82d4-…"); guard before shell interpolation. */
|
|
9
|
+
const SESSION_ID_RE = /^[A-Za-z0-9-]+$/;
|
|
10
|
+
const MODEL_ID_RE = /^[A-Za-z0-9][A-Za-z0-9._:/-]*$/;
|
|
11
|
+
/** Parse the text format emitted by `grok models`. */
|
|
12
|
+
export function parseGrokModelsOutput(output) {
|
|
13
|
+
const models = [];
|
|
14
|
+
const seen = new Set();
|
|
15
|
+
let inModelList = false;
|
|
16
|
+
for (const rawLine of output.split(/\r?\n/)) {
|
|
17
|
+
const trimmed = rawLine.trim();
|
|
18
|
+
if (/^Available models:\s*$/i.test(trimmed)) {
|
|
19
|
+
inModelList = true;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (!inModelList || !trimmed)
|
|
23
|
+
continue;
|
|
24
|
+
const id = trimmed
|
|
25
|
+
.replace(/^(?:[*•-]|\d+\.)\s*/, "")
|
|
26
|
+
.replace(/\s+\(default\)\s*$/i, "")
|
|
27
|
+
.trim();
|
|
28
|
+
if (!MODEL_ID_RE.test(id) || !/^grok/i.test(id) || seen.has(id))
|
|
29
|
+
continue;
|
|
30
|
+
seen.add(id);
|
|
31
|
+
models.push({ id, label: id });
|
|
32
|
+
}
|
|
33
|
+
return models;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Grok Build (xAI) — https://docs.x.ai/build/cli
|
|
37
|
+
*
|
|
38
|
+
* IMPORTANT — why the interactive TUI, not `grok agent stdio`:
|
|
39
|
+
* Grok Build exposes three surfaces: the interactive TUI (`grok`), headless
|
|
40
|
+
* (`grok -p "<prompt>"`), and an ACP agent (`grok agent stdio`) that speaks
|
|
41
|
+
* JSON-RPC over stdin/stdout. AgEnD drives a backend through a tmux PTY — it
|
|
42
|
+
* scans human-readable pane text for ready/error patterns and injects
|
|
43
|
+
* keystrokes (cancel key, slash commands). An ACP JSON-RPC agent has no
|
|
44
|
+
* human-readable prompt, ready banner, or slash commands, so the CliBackend
|
|
45
|
+
* interface does not map onto it. The interactive TUI is the correct surface,
|
|
46
|
+
* the same choice made for codex/opencode/kiro.
|
|
47
|
+
*
|
|
48
|
+
* Phase 2: ready pattern, cancel/quit keys, /compact, context format, and the
|
|
49
|
+
* device-flow login dialog were confirmed against a live grok session. Error
|
|
50
|
+
* strings beyond the cancellation notice are still best-effort and may need
|
|
51
|
+
* tuning.
|
|
52
|
+
*/
|
|
53
|
+
export class GrokBackend {
|
|
54
|
+
instanceDir;
|
|
55
|
+
binaryName = "grok";
|
|
56
|
+
binaryPath;
|
|
57
|
+
// Cached from buildCommand/writeConfig so getSessionId() (which takes no args)
|
|
58
|
+
// can scope to grok's per-cwd session directory.
|
|
59
|
+
workingDirectory;
|
|
60
|
+
constructor(instanceDir) {
|
|
61
|
+
this.instanceDir = instanceDir;
|
|
62
|
+
this.binaryPath = resolveBinary("grok");
|
|
63
|
+
}
|
|
64
|
+
buildCommand(config) {
|
|
65
|
+
this.workingDirectory = config.workingDirectory;
|
|
66
|
+
// Flags: -m/--model, --always-approve, -r/--resume <ID>, -p/--single, --no-auto-update.
|
|
67
|
+
// --no-auto-update: an auto-update prompt on launch would corrupt ready detection.
|
|
68
|
+
let cmd = `${this.binaryPath} --no-auto-update`;
|
|
69
|
+
// --always-approve auto-approves tool executions (documented flag). If a grok
|
|
70
|
+
// build ignores it, getRuntimeDialogs() auto-approves the prompt as a net.
|
|
71
|
+
if (config.skipPermissions !== false)
|
|
72
|
+
cmd += " --always-approve";
|
|
73
|
+
// Resume by explicit session id (verified: grok prints
|
|
74
|
+
// "Resume this session with: grok --resume <uuid>" on exit — there is no
|
|
75
|
+
// bare --continue that reliably resumes). The id is persisted by the daemon
|
|
76
|
+
// from getSessionId(); skip on crash recovery (skipResume) for a clean start.
|
|
77
|
+
if (!config.skipResume) {
|
|
78
|
+
const sid = this.storedSessionId();
|
|
79
|
+
if (sid)
|
|
80
|
+
cmd += ` --resume ${sid}`;
|
|
81
|
+
}
|
|
82
|
+
if (config.model) {
|
|
83
|
+
if (isModelCompatible("grok", config.model)) {
|
|
84
|
+
cmd += ` --model ${validateModel(config.model)}`;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
console.warn(`[agend] model "${config.model}" is not compatible with grok — skipping --model, using the CLI's default`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return cmd;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build an ASCII-only, per-instance MCP server key. Grok Build's MCP client has
|
|
94
|
+
* a bug where a non-ASCII (e.g. CJK) server name connects but drops ALL tools
|
|
95
|
+
* (tool_count=0, misreported as "connection failed"). Instance names can be CJK
|
|
96
|
+
* (persona ClassicBot channels), so sanitize: pure-ASCII names pass through
|
|
97
|
+
* unchanged (readable + already unique); names with non-ASCII are stripped to an
|
|
98
|
+
* ASCII slug plus a short hash of the ORIGINAL name, so two distinct CJK names
|
|
99
|
+
* sharing a working directory can't collide to the same key.
|
|
100
|
+
*/
|
|
101
|
+
mcpKey(mcpName, instanceName) {
|
|
102
|
+
const ascii = instanceName.replace(/[^\x20-\x7E]/g, "");
|
|
103
|
+
if (ascii === instanceName)
|
|
104
|
+
return `${mcpName}-${instanceName}`;
|
|
105
|
+
const slug = ascii.replace(/[^A-Za-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
106
|
+
const hash = createHash("md5").update(instanceName).digest("hex").slice(0, 8);
|
|
107
|
+
return slug ? `${mcpName}-${slug}-${hash}` : `${mcpName}-${hash}`;
|
|
108
|
+
}
|
|
109
|
+
/** The daemon's persisted session id (written from getSessionId()), for --resume. */
|
|
110
|
+
storedSessionId() {
|
|
111
|
+
try {
|
|
112
|
+
const sid = readFileSync(join(this.instanceDir, "session-id"), "utf-8").trim();
|
|
113
|
+
return SESSION_ID_RE.test(sid) ? sid : null;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
writeConfig(config) {
|
|
120
|
+
this.workingDirectory = config.workingDirectory;
|
|
121
|
+
// Grok Build merges MCP servers from a project-level .mcp.json (loaded below
|
|
122
|
+
// ~/.grok/config.toml in priority). Using the project file means we never
|
|
123
|
+
// clobber the user's global config. Standard mcpServers format: { command, args, env }.
|
|
124
|
+
const mcpPath = join(config.workingDirectory, ".mcp.json");
|
|
125
|
+
let root = {};
|
|
126
|
+
try {
|
|
127
|
+
root = JSON.parse(readFileSync(mcpPath, "utf-8"));
|
|
128
|
+
}
|
|
129
|
+
catch { /* new file */ }
|
|
130
|
+
const servers = (root.mcpServers ?? {});
|
|
131
|
+
// Drop stale agend entries whose wrapper script no longer exists, plus any
|
|
132
|
+
// legacy non-ASCII key (grok drops all tools on a CJK key — we now always
|
|
133
|
+
// write ASCII keys, so a lingering CJK entry is dead weight to remove).
|
|
134
|
+
for (const [key, val] of Object.entries(servers)) {
|
|
135
|
+
if (key.startsWith("agend-")) {
|
|
136
|
+
const cmd = val?.command;
|
|
137
|
+
if ((typeof cmd === "string" && !existsSync(cmd)) || /[^\x20-\x7E]/.test(key)) {
|
|
138
|
+
delete servers[key];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Namespace each server by instance so multiple instances can share a working
|
|
143
|
+
// dir. Key is ASCII-sanitized (grok's MCP client drops tools on a CJK key).
|
|
144
|
+
for (const [name, entry] of Object.entries(config.mcpServers)) {
|
|
145
|
+
const instanceKey = this.mcpKey(name, config.instanceName);
|
|
146
|
+
const allEnv = { ...entry.env, AGEND_INSTANCE_NAME: config.instanceName };
|
|
147
|
+
// WORKAROUND (same as kiro-cli): grok does not reliably pass the mcp.json
|
|
148
|
+
// "env" block to the MCP server subprocess — the process would inherit grok's
|
|
149
|
+
// env, which has NO AGEND_SOCKET_PATH (the daemon keeps it out of process.env),
|
|
150
|
+
// so the server can't connect and every MCP tool (reply/react/…) fails. Emit a
|
|
151
|
+
// wrapper that exports the env explicitly, waits for the IPC socket, then execs
|
|
152
|
+
// the real server. This is env-delivery-independent and works either way.
|
|
153
|
+
const wrapperPath = join(this.instanceDir, `mcp-wrapper-${name}.sh`);
|
|
154
|
+
const envExports = Object.entries(allEnv)
|
|
155
|
+
.map(([k, v]) => `export ${k}='${String(v).replace(/'/g, "'\\''")}'`)
|
|
156
|
+
.join("\n");
|
|
157
|
+
// 0o700: wrapper inlines sensitive env (tokens, socket paths) — owner-only.
|
|
158
|
+
writeFileSync(wrapperPath, `#!/bin/bash\n${envExports}\n# Wait for IPC socket to be ready (up to 10s)\nfor i in $(seq 1 20); do [ -S "$AGEND_SOCKET_PATH" ] && break; sleep 0.5; done\nexec ${entry.command} ${entry.args.map((a) => JSON.stringify(a)).join(" ")}\n`, { mode: 0o700 });
|
|
159
|
+
chmodSync(wrapperPath, 0o700);
|
|
160
|
+
servers[instanceKey] = { command: wrapperPath, args: [] };
|
|
161
|
+
}
|
|
162
|
+
// Clean up any legacy non-namespaced key.
|
|
163
|
+
delete servers["agend"];
|
|
164
|
+
root.mcpServers = servers;
|
|
165
|
+
writeFileSync(mcpPath, JSON.stringify(root, null, 2));
|
|
166
|
+
// Fleet instructions → AGENTS.md marker block (Grok reads AGENTS.md project docs,
|
|
167
|
+
// same convention as Codex). Additive + idempotent via the AGEND marker.
|
|
168
|
+
if (config.instructions) {
|
|
169
|
+
try {
|
|
170
|
+
appendWithMarker(join(config.workingDirectory, "AGENTS.md"), config.instanceName, config.instructions);
|
|
171
|
+
}
|
|
172
|
+
catch { /* best effort */ }
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
getReadyPattern() {
|
|
176
|
+
// Verified: `❯` is the idle input prompt inside the TUI box; the Grok Build
|
|
177
|
+
// header ("Grok Build" / "Grok <n>") also identifies the ready screen.
|
|
178
|
+
return /❯|Grok \d|Grok Build/m;
|
|
179
|
+
}
|
|
180
|
+
getErrorPatterns() {
|
|
181
|
+
// NOTE: "Turn cancelled by user" is NORMAL behaviour (user interrupt), not an
|
|
182
|
+
// error — none of the patterns below match it, and none should be added that do.
|
|
183
|
+
// Error strings below are best-effort generic API shapes; tune once observed live.
|
|
184
|
+
return [
|
|
185
|
+
{ pattern: /rate.?limit|too many requests|\b429\b/i, type: "rate_limit", action: "failover", message: "Grok rate limit reached" },
|
|
186
|
+
{ pattern: /unauthorized|authentication (failed|error)|\b401\b/i, type: "auth_error", action: "pause", message: "Grok authentication error" },
|
|
187
|
+
{ pattern: /quota|insufficient credits|out of credits/i, type: "quota", action: "notify", message: "Grok quota/credits exhausted" },
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
getStartupDialogs() {
|
|
191
|
+
return [
|
|
192
|
+
// Workspace trust confirmation ("Do you trust the contents of this directory?")
|
|
193
|
+
// appears BEFORE the login screen — auto-approve with the 'y' hotkey.
|
|
194
|
+
{ pattern: /Do you trust the contents|trust.*directory/i, keys: ["y"], description: "Grok workspace trust — auto-approve" },
|
|
195
|
+
// Device-flow login is BLOCKING and cannot be auto-dismissed — the user must
|
|
196
|
+
// approve externally. Empty keys => the daemon sends nothing but treats the
|
|
197
|
+
// screen as "not ready yet" and keeps polling, so the login screen is never
|
|
198
|
+
// mistaken for the idle prompt. (The "[Click here to Upgrade]" banner is
|
|
199
|
+
// non-blocking and is intentionally NOT listed — nothing to dismiss.)
|
|
200
|
+
{ pattern: /Waiting for approval|Log in to continue|device.*approval/i, keys: [], description: "Grok device-flow login — wait for user authorization (no auto-dismiss)" },
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
getContextUsage() {
|
|
204
|
+
// Grok shows context as "12K / 500K" (used / total) in the TUI, not in a file.
|
|
205
|
+
// getContextUsage() has no pane access, so parsing lives in the pane scanners
|
|
206
|
+
// (parseContextPercent in topic-commands.ts + defaultParser in cli.ts), which
|
|
207
|
+
// is what /ctx and `agend ls` use. Nothing file-based to report here.
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
getSessionId() {
|
|
211
|
+
// grok stores sessions per working directory (verified):
|
|
212
|
+
// ~/.grok/sessions/<encodeURIComponent(cwd)>/<session-uuid>/{events.jsonl,…}
|
|
213
|
+
// Scoping by cwd means multiple concurrent grok instances (distinct cwds)
|
|
214
|
+
// never pick up each other's session. Return the UUID of the most-recently
|
|
215
|
+
// ACTIVE session in this instance's cwd for the daemon to persist (--resume).
|
|
216
|
+
if (!this.workingDirectory)
|
|
217
|
+
return null;
|
|
218
|
+
try {
|
|
219
|
+
const base = join(homedir(), ".grok", "sessions", encodeURIComponent(this.workingDirectory));
|
|
220
|
+
let newestId = null;
|
|
221
|
+
let newestMtime = -1;
|
|
222
|
+
for (const name of readdirSync(base)) {
|
|
223
|
+
// Session dirs are named by UUID; skip prompt_history.jsonl etc.
|
|
224
|
+
if (!SESSION_ID_RE.test(name) || name.length < 8)
|
|
225
|
+
continue;
|
|
226
|
+
const sessionDir = join(base, name);
|
|
227
|
+
let st;
|
|
228
|
+
try {
|
|
229
|
+
st = statSync(sessionDir);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (!st.isDirectory())
|
|
235
|
+
continue;
|
|
236
|
+
// Activity = latest INNER-file mtime. The dir's own mtime doesn't move on
|
|
237
|
+
// append AND is misleadingly recent for a just-created dir, so it must NOT
|
|
238
|
+
// outweigh a resumed older session whose logs were just appended. Only fall
|
|
239
|
+
// back to dir mtime when the session has no inner files yet.
|
|
240
|
+
let activity = -1;
|
|
241
|
+
try {
|
|
242
|
+
for (const f of readdirSync(sessionDir)) {
|
|
243
|
+
try {
|
|
244
|
+
const m = statSync(join(sessionDir, f)).mtimeMs;
|
|
245
|
+
if (m > activity)
|
|
246
|
+
activity = m;
|
|
247
|
+
}
|
|
248
|
+
catch { /* skip */ }
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch { /* unreadable dir */ }
|
|
252
|
+
if (activity < 0)
|
|
253
|
+
activity = st.mtimeMs;
|
|
254
|
+
if (activity > newestMtime) {
|
|
255
|
+
newestMtime = activity;
|
|
256
|
+
newestId = name;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return newestId;
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
getRuntimeDialogs() {
|
|
266
|
+
return [
|
|
267
|
+
// Mid-task tool-approval prompt ("1. Yes, always 2. Yes 3. No"). Select
|
|
268
|
+
// option 1 so the fleet runs unattended. Primary mechanism is
|
|
269
|
+
// --always-approve at launch; this is the net if that flag is absent/ignored.
|
|
270
|
+
// ⚠️ key needs live confirmation — assumes a numeric hotkey (types "1"+Enter);
|
|
271
|
+
// if grok uses an arrow-select cursor instead, switch to ["Enter"] or nav keys.
|
|
272
|
+
{ pattern: /1\.\s*Yes,?\s*always|Yes,?\s*always[\s\S]{0,40}\bNo\b/i, keys: ["1"], description: "Grok tool-approval prompt — select 'Yes, always'" },
|
|
273
|
+
];
|
|
274
|
+
}
|
|
275
|
+
// grok has no slash quit command — it quits via the Ctrl+Q key chord (getQuitKey).
|
|
276
|
+
getQuitCommand() { return null; }
|
|
277
|
+
getQuitKey() { return "C-q"; }
|
|
278
|
+
// Trailing space commits the exact slash command before Grok's autocomplete
|
|
279
|
+
// can expand the partial token to `/compact-mode`.
|
|
280
|
+
getCompactCommand() { return "/compact "; }
|
|
281
|
+
// Verified: grok interrupts generation on Ctrl+C.
|
|
282
|
+
getCancelKey() { return "C-c"; }
|
|
283
|
+
// grok's in-session model switch is a picker → restart to apply reliably.
|
|
284
|
+
getModelSwitchStrategy() { return "restart"; }
|
|
285
|
+
async listModels() {
|
|
286
|
+
// Verified format:
|
|
287
|
+
// Available models:
|
|
288
|
+
// * grok-4.5 (default)
|
|
289
|
+
try {
|
|
290
|
+
const out = execFileSync(this.binaryPath, ["models"], { encoding: "utf-8", timeout: 5000, stdio: ["ignore", "pipe", "ignore"] });
|
|
291
|
+
const models = parseGrokModelsOutput(out);
|
|
292
|
+
if (models.length)
|
|
293
|
+
return models;
|
|
294
|
+
}
|
|
295
|
+
catch { /* fall back to documented set */ }
|
|
296
|
+
return [
|
|
297
|
+
{ id: "grok-4.5", label: "grok-4.5" },
|
|
298
|
+
];
|
|
299
|
+
}
|
|
300
|
+
async probeCLIEnv() {
|
|
301
|
+
const { probeCliVersion } = await import("./types.js");
|
|
302
|
+
return { version: probeCliVersion(this.binaryPath), models: await this.listModels() };
|
|
303
|
+
}
|
|
304
|
+
cleanup(config) {
|
|
305
|
+
// Remove only this instance's namespaced MCP entries — a non-namespaced key
|
|
306
|
+
// may belong to another instance sharing the working directory.
|
|
307
|
+
try {
|
|
308
|
+
const mcpPath = join(config.workingDirectory, ".mcp.json");
|
|
309
|
+
if (existsSync(mcpPath)) {
|
|
310
|
+
const root = JSON.parse(readFileSync(mcpPath, "utf-8"));
|
|
311
|
+
if (root.mcpServers) {
|
|
312
|
+
for (const name of Object.keys(config.mcpServers)) {
|
|
313
|
+
delete root.mcpServers[this.mcpKey(name, config.instanceName)];
|
|
314
|
+
// Also drop any legacy raw (pre-sanitize) key for this instance.
|
|
315
|
+
delete root.mcpServers[`${name}-${config.instanceName}`];
|
|
316
|
+
}
|
|
317
|
+
writeFileSync(mcpPath, JSON.stringify(root, null, 2));
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
catch { /* best effort */ }
|
|
322
|
+
// Remove fleet instructions marker block from AGENTS.md.
|
|
323
|
+
try {
|
|
324
|
+
removeMarker(join(config.workingDirectory, "AGENTS.md"), config.instanceName);
|
|
325
|
+
}
|
|
326
|
+
catch { /* best effort */ }
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=grok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grok.js","sourceRoot":"","sources":["../../src/backend/grok.ts"],"names":[],"mappings":"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"}
|
package/dist/backend/kiro.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export declare class KiroBackend implements CliBackend {
|
|
|
14
14
|
getSessionId(): string | null;
|
|
15
15
|
getQuitCommand(): string;
|
|
16
16
|
getCompactCommand(): string;
|
|
17
|
+
getModelSwitchStrategy(): "runtime" | "restart";
|
|
18
|
+
listModels(): Promise<import("./types.js").ModelOption[]>;
|
|
19
|
+
probeCLIEnv(): Promise<{
|
|
20
|
+
version: string | undefined;
|
|
21
|
+
models: import("./types.js").ModelOption[];
|
|
22
|
+
}>;
|
|
17
23
|
getCancelKey(): string;
|
|
18
24
|
cleanup(config: CliBackendConfig): void;
|
|
19
25
|
}
|
package/dist/backend/kiro.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
2
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync, unlinkSync } from "node:fs";
|
|
3
4
|
import { isModelCompatible, resolveBinary, validateModel } from "./types.js";
|
|
4
5
|
export class KiroBackend {
|
|
@@ -10,7 +11,12 @@ export class KiroBackend {
|
|
|
10
11
|
this.binaryPath = resolveBinary("kiro-cli");
|
|
11
12
|
}
|
|
12
13
|
buildCommand(config) {
|
|
13
|
-
|
|
14
|
+
const ui = config.kiroUi ?? "legacy";
|
|
15
|
+
let cmd = `${this.binaryPath} chat`;
|
|
16
|
+
if (ui === "legacy")
|
|
17
|
+
cmd += " --legacy-ui";
|
|
18
|
+
else if (ui === "v3")
|
|
19
|
+
cmd += " --v3";
|
|
14
20
|
if (config.skipPermissions !== false)
|
|
15
21
|
cmd += " --trust-all-tools";
|
|
16
22
|
// --resume is boolean: Kiro auto-resumes latest conversation for this working directory
|
|
@@ -89,13 +95,15 @@ export class KiroBackend {
|
|
|
89
95
|
}
|
|
90
96
|
}
|
|
91
97
|
getReadyPattern() {
|
|
92
|
-
// Startup: trust/banner text. Daily prompt: "22% !>" / "8% ❯"
|
|
98
|
+
// Startup: trust/banner text. Daily prompt: "22% !>" / "8% ❯";
|
|
99
|
+
// Kiro may insert mode glyphs between them, e.g. "20% λ !>".
|
|
93
100
|
// TUI statusline: "◔ 22%" context indicator shown while waiting for input.
|
|
94
|
-
return /All tools are now trusted|Trust All Tools active|Credits:.*Time:|ask a question or describe a task|\d
|
|
101
|
+
return /All tools are now trusted|Trust All Tools active|Credits:.*Time:|ask a question or describe a task|\d+%.*[!❯>]|◔\s*\d+%/m;
|
|
95
102
|
}
|
|
96
103
|
getErrorPatterns() {
|
|
97
104
|
return [
|
|
98
105
|
{ pattern: /having trouble responding/i, type: "rate_limit", action: "notify", message: "Rate limit (having trouble responding)" },
|
|
106
|
+
{ pattern: /model.*not available|Please use '\/model'/i, type: "model_error", action: "notify", message: "Model unavailable — use /model to switch" },
|
|
99
107
|
{ pattern: /Response timed out/i, type: "timeout", action: "notify", message: "Kiro response timed out (generation too long) — please try again", skipCooldown: true, skipRecoveryWait: true },
|
|
100
108
|
];
|
|
101
109
|
}
|
|
@@ -130,6 +138,33 @@ export class KiroBackend {
|
|
|
130
138
|
}
|
|
131
139
|
getQuitCommand() { return "/quit"; }
|
|
132
140
|
getCompactCommand() { return "/compact"; }
|
|
141
|
+
// kiro's in-session `/model` opens an interactive picker (not a one-shot
|
|
142
|
+
// command), so a runtime paste can't select a specific model — use restart.
|
|
143
|
+
getModelSwitchStrategy() { return "restart"; }
|
|
144
|
+
async listModels() {
|
|
145
|
+
// Verified format: { "models": [{ model_name, model_id, description, ... }],
|
|
146
|
+
// "default_model": "auto" }. Older/other shapes (bare array) also tolerated.
|
|
147
|
+
try {
|
|
148
|
+
const out = execFileSync(this.binaryPath, ["chat", "--list-models", "--format", "json"], { encoding: "utf-8", timeout: 5000, stdio: ["ignore", "pipe", "ignore"] });
|
|
149
|
+
const parsed = JSON.parse(out);
|
|
150
|
+
const arr = Array.isArray(parsed) ? parsed : (parsed?.models ?? []);
|
|
151
|
+
return arr.map((m) => {
|
|
152
|
+
if (typeof m === "string")
|
|
153
|
+
return { id: m, label: m };
|
|
154
|
+
const o = m;
|
|
155
|
+
const id = String(o.model_id ?? o.id ?? o.name ?? o.model ?? "");
|
|
156
|
+
const label = String(o.model_name ?? o.name ?? o.label ?? id);
|
|
157
|
+
const desc = typeof o.description === "string" ? o.description : undefined;
|
|
158
|
+
return desc ? { id, label, description: desc } : { id, label };
|
|
159
|
+
}).filter(o => o.id);
|
|
160
|
+
}
|
|
161
|
+
catch { /* unknown flag/format — fall back to free-text */ }
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
async probeCLIEnv() {
|
|
165
|
+
const { probeCliVersion } = await import("./types.js");
|
|
166
|
+
return { version: probeCliVersion(this.binaryPath), models: await this.listModels() };
|
|
167
|
+
}
|
|
133
168
|
// kiro-cli interrupts generation on Ctrl+C (others use Escape).
|
|
134
169
|
getCancelKey() { return "C-c"; }
|
|
135
170
|
cleanup(config) {
|
package/dist/backend/kiro.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../src/backend/kiro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpG,OAAO,EAAqG,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhL,MAAM,OAAO,WAAW;IAIF;IAHX,UAAU,GAAG,UAAU,CAAC;IACzB,UAAU,CAAS;IAE3B,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACrC,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,YAAY,CAAC,MAAwB;QACnC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../src/backend/kiro.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,11 @@ export declare class OpenCodeBackend implements CliBackend {
|
|
|
13
13
|
getQuitCommand(): string;
|
|
14
14
|
getCompactCommand(): string;
|
|
15
15
|
getCancelKey(): string;
|
|
16
|
+
listModels(): Promise<import("./types.js").ModelOption[]>;
|
|
17
|
+
probeCLIEnv(): Promise<{
|
|
18
|
+
version?: string;
|
|
19
|
+
models: import("./types.js").ModelOption[];
|
|
20
|
+
}>;
|
|
16
21
|
getRuntimeDialogs(): RuntimeDialog[];
|
|
17
22
|
cleanup(config: CliBackendConfig): void;
|
|
18
23
|
}
|
package/dist/backend/opencode.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { join } from "node:path";
|
|
2
|
+
import { execFileSync } from "node:child_process";
|
|
2
3
|
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
4
|
import { isModelCompatible, resolveBinary, validateModel } from "./types.js";
|
|
4
5
|
export class OpenCodeBackend {
|
|
@@ -102,6 +103,23 @@ export class OpenCodeBackend {
|
|
|
102
103
|
getCompactCommand() { return "/compact"; }
|
|
103
104
|
// OpenCode's default session_interrupt keybinding is Escape (Ctrl+C exits).
|
|
104
105
|
getCancelKey() { return "Escape"; }
|
|
106
|
+
async listModels() {
|
|
107
|
+
// Verified: `opencode models` prints one `provider/model` id per line.
|
|
108
|
+
try {
|
|
109
|
+
const out = execFileSync(this.binaryPath, ["models"], { encoding: "utf-8", timeout: 5000, stdio: ["ignore", "pipe", "ignore"] });
|
|
110
|
+
const ids = [...new Set(out.split("\n")
|
|
111
|
+
.map(l => l.trim().split(/\s+/)[0])
|
|
112
|
+
.filter(id => /^[\w.-]+\/[\w.-]+$/.test(id)))];
|
|
113
|
+
if (ids.length)
|
|
114
|
+
return ids.map(id => ({ id, label: id }));
|
|
115
|
+
}
|
|
116
|
+
catch { /* fall back to free-text */ }
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
async probeCLIEnv() {
|
|
120
|
+
const { probeCliVersion } = await import("./types.js");
|
|
121
|
+
return { version: probeCliVersion(this.binaryPath), models: await this.listModels() };
|
|
122
|
+
}
|
|
105
123
|
getRuntimeDialogs() {
|
|
106
124
|
return [
|
|
107
125
|
{ pattern: /Permission required/i, keys: ["Right", "Enter"], description: "OpenCode permission prompt — Allow always" },
|
|
@@ -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,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAqG,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhL,MAAM,OAAO,eAAe;IAIN;IAHX,UAAU,GAAG,UAAU,CAAC;IACzB,UAAU,CAAS;IAE3B,YAAoB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;QACrC,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,YAAY,CAAC,MAAwB;QACnC,uEAAuE;QACvE,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QAE1B,+CAA+C;QAC/C,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC3D,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,IAAI,GAAG;oBAAE,GAAG,IAAI,cAAc,GAAG,EAAE,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,aAAa,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,iBAAiB,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,GAAG,IAAI,YAAY,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,KAAK,+EAA+E,CAAC,CAAC;YAC9H,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,WAAW,CAAC,MAAwB;QAClC,2DAA2D;QAC3D,oEAAoE;QACpE,uDAAuD;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QAClE,IAAI,EAAE,GAA4B,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;QAE1B,2EAA2E;QAC3E,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAA4B,CAAC;QACtD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;YACrJ,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,gBAAgB,EAAE,CAAC;YAClD,0CAA0C;YAC1C,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,WAAW;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,GAAG,CAAC,WAAW,CAAC,GAAG;gBACjB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;gBACvC,WAAW,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,CAAC,YAAY,EAAE;aACxE,CAAC;QACJ,CAAC;QACD,6CAA6C;QAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;QACpB,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC;QACb,OAAO,EAAE,CAAC,UAAU,CAAC;QAErB,qFAAqF;QACrF,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;gBACpE,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,CAAa,CAAC;gBAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtD,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;QAED,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,eAAe;QACb,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IAED,gBAAgB;QACd,OAAO;YACL,EAAE,OAAO,EAAE,oCAAoC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,EAAE;YACxH,EAAE,OAAO,EAAE,+BAA+B,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE;SACnH,CAAC;IACJ,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,YAAY;QACV,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAC/C,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;IAC1B,CAAC;IAED,cAAc,KAAa,OAAO,OAAO,CAAC,CAAC,CAAC;IAE5C,iBAAiB,KAAa,OAAO,UAAU,CAAC,CAAC,CAAC;IAElD,4EAA4E;IAC5E,YAAY,KAAa,OAAO,QAAQ,CAAC,CAAC,CAAC;IAE3C,iBAAiB;QACf,OAAO;YACL,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACvH,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE;SACjF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAwB;QAC9B,6DAA6D;QAC7D,yEAAyE;QACzE,mDAAmD;QACnD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;YAClE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzD,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC;oBACX,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;wBAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;wBAC7I,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC;wBACrC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,kCAAkC;oBACrF,CAAC;gBACH,CAAC;gBACD,mDAAmD;gBACnD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;gBACpE,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;oBACnC,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;gBAC3E,CAAC;gBACD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAE7B,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;YACpE,IAAI,UAAU,CAAC,SAAS,CAAC;gBAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/backend/opencode.ts"],"names":[],"mappings":"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"}
|