@agentmeshhq/agent 0.2.0 → 0.3.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 +39 -0
- package/dist/__tests__/context-template.test.d.ts +4 -0
- package/dist/__tests__/context-template.test.js +233 -0
- package/dist/__tests__/context-template.test.js.map +1 -0
- package/dist/__tests__/loader.test.js +140 -28
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/no-respawn.test.d.ts +1 -0
- package/dist/__tests__/no-respawn.test.js +254 -0
- package/dist/__tests__/no-respawn.test.js.map +1 -0
- package/dist/__tests__/onboard.test.d.ts +5 -0
- package/dist/__tests__/onboard.test.js +341 -0
- package/dist/__tests__/onboard.test.js.map +1 -0
- package/dist/__tests__/orphan-process.test.d.ts +11 -0
- package/dist/__tests__/orphan-process.test.js +286 -0
- package/dist/__tests__/orphan-process.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +16 -0
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/shared-resource-guards.test.d.ts +7 -0
- package/dist/__tests__/shared-resource-guards.test.js +260 -0
- package/dist/__tests__/shared-resource-guards.test.js.map +1 -0
- package/dist/__tests__/watchdog.test.js +138 -12
- package/dist/__tests__/watchdog.test.js.map +1 -1
- package/dist/cli/status.js +11 -0
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/stop.js +7 -2
- package/dist/cli/stop.js.map +1 -1
- package/dist/config/loader.d.ts +0 -4
- package/dist/config/loader.js +102 -42
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +6 -4
- package/dist/core/daemon/assignment-message.d.ts +12 -0
- package/dist/core/daemon/assignment-message.js +36 -0
- package/dist/core/daemon/assignment-message.js.map +1 -0
- package/dist/core/daemon/bootstrap.d.ts +35 -0
- package/dist/core/daemon/bootstrap.js +52 -0
- package/dist/core/daemon/bootstrap.js.map +1 -0
- package/dist/core/daemon/context-template.d.ts +11 -0
- package/dist/core/daemon/context-template.js +144 -0
- package/dist/core/daemon/context-template.js.map +1 -0
- package/dist/core/daemon/crash-log.d.ts +14 -0
- package/dist/core/daemon/crash-log.js +23 -0
- package/dist/core/daemon/crash-log.js.map +1 -0
- package/dist/core/daemon/git-auth.d.ts +18 -0
- package/dist/core/daemon/git-auth.js +88 -0
- package/dist/core/daemon/git-auth.js.map +1 -0
- package/dist/core/daemon/health-policy.d.ts +17 -0
- package/dist/core/daemon/health-policy.js +24 -0
- package/dist/core/daemon/health-policy.js.map +1 -0
- package/dist/core/daemon/sandbox-config.d.ts +9 -0
- package/dist/core/daemon/sandbox-config.js +17 -0
- package/dist/core/daemon/sandbox-config.js.map +1 -0
- package/dist/core/daemon/state.d.ts +33 -0
- package/dist/core/daemon/state.js +78 -0
- package/dist/core/daemon/state.js.map +1 -0
- package/dist/core/daemon/tmux-session.d.ts +17 -0
- package/dist/core/daemon/tmux-session.js +34 -0
- package/dist/core/daemon/tmux-session.js.map +1 -0
- package/dist/core/daemon/workspace.d.ts +23 -0
- package/dist/core/daemon/workspace.js +90 -0
- package/dist/core/daemon/workspace.js.map +1 -0
- package/dist/core/daemon.d.ts +9 -12
- package/dist/core/daemon.js +293 -393
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/injector.d.ts +5 -1
- package/dist/core/injector.js +83 -0
- package/dist/core/injector.js.map +1 -1
- package/dist/core/registry.d.ts +62 -0
- package/dist/core/registry.js +18 -0
- package/dist/core/registry.js.map +1 -1
- package/dist/core/runner/build.d.ts +9 -0
- package/dist/core/runner/build.js +53 -0
- package/dist/core/runner/build.js.map +1 -0
- package/dist/core/runner/detect.d.ts +5 -0
- package/dist/core/runner/detect.js +14 -0
- package/dist/core/runner/detect.js.map +1 -0
- package/dist/core/runner/index.d.ts +5 -0
- package/dist/core/runner/index.js +5 -0
- package/dist/core/runner/index.js.map +1 -0
- package/dist/core/runner/model.d.ts +5 -0
- package/dist/core/runner/model.js +7 -0
- package/dist/core/runner/model.js.map +1 -0
- package/dist/core/runner/opencode-models.d.ts +15 -0
- package/dist/core/runner/opencode-models.js +70 -0
- package/dist/core/runner/opencode-models.js.map +1 -0
- package/dist/core/runner/types.d.ts +19 -0
- package/dist/core/runner/types.js +8 -0
- package/dist/core/runner/types.js.map +1 -0
- package/dist/core/runner.d.ts +5 -47
- package/dist/core/runner.js +5 -167
- package/dist/core/runner.js.map +1 -1
- package/dist/core/tmux-runtime.d.ts +13 -0
- package/dist/core/tmux-runtime.js +72 -0
- package/dist/core/tmux-runtime.js.map +1 -0
- package/dist/core/tmux.d.ts +7 -1
- package/dist/core/tmux.js +75 -45
- package/dist/core/tmux.js.map +1 -1
- package/dist/core/watchdog.d.ts +18 -1
- package/dist/core/watchdog.js +78 -29
- package/dist/core/watchdog.js.map +1 -1
- package/package.json +24 -4
- package/src/__tests__/context.test.ts +0 -464
- package/src/__tests__/injector.test.ts +0 -29
- package/src/__tests__/jwt.test.ts +0 -112
- package/src/__tests__/loader.test.ts +0 -239
- package/src/__tests__/runner.test.ts +0 -104
- package/src/__tests__/sandbox.test.ts +0 -435
- package/src/__tests__/watchdog.test.ts +0 -368
- package/src/cli/attach.ts +0 -22
- package/src/cli/build.ts +0 -145
- package/src/cli/config.ts +0 -148
- package/src/cli/context.ts +0 -231
- package/src/cli/deploy.ts +0 -155
- package/src/cli/index.ts +0 -376
- package/src/cli/init.ts +0 -75
- package/src/cli/list.ts +0 -70
- package/src/cli/local.ts +0 -183
- package/src/cli/logs.ts +0 -64
- package/src/cli/migrate.ts +0 -212
- package/src/cli/nudge.ts +0 -81
- package/src/cli/restart.ts +0 -59
- package/src/cli/slack.ts +0 -70
- package/src/cli/start.ts +0 -118
- package/src/cli/status.ts +0 -91
- package/src/cli/stop.ts +0 -48
- package/src/cli/test.ts +0 -143
- package/src/cli/token.ts +0 -188
- package/src/cli/whoami.ts +0 -142
- package/src/config/loader.ts +0 -121
- package/src/config/schema.ts +0 -68
- package/src/context/handoff.ts +0 -122
- package/src/context/index.ts +0 -8
- package/src/context/schema.ts +0 -111
- package/src/context/storage.ts +0 -197
- package/src/core/daemon.ts +0 -1317
- package/src/core/heartbeat.ts +0 -129
- package/src/core/injector.ts +0 -292
- package/src/core/registry.ts +0 -159
- package/src/core/runner.ts +0 -225
- package/src/core/sandbox.ts +0 -547
- package/src/core/session-id.ts +0 -111
- package/src/core/tmux.ts +0 -405
- package/src/core/watchdog.ts +0 -238
- package/src/core/websocket.ts +0 -94
- package/src/index.ts +0 -10
- package/src/utils/jwt.ts +0 -87
- package/tsconfig.json +0 -8
- package/vitest.config.ts +0 -12
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { AgentConfig, Config } from "../../config/schema.js";
|
|
2
|
+
import { type RunnerConfig } from "../runner.js";
|
|
3
|
+
export interface BootstrapOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
command?: string;
|
|
6
|
+
workdir?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
restoreContext?: boolean;
|
|
9
|
+
worker?: boolean;
|
|
10
|
+
autoSetup?: boolean;
|
|
11
|
+
serve?: boolean;
|
|
12
|
+
servePort?: number;
|
|
13
|
+
sandbox?: boolean;
|
|
14
|
+
sandboxImage?: string;
|
|
15
|
+
sandboxCpu?: string;
|
|
16
|
+
sandboxMemory?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DaemonBootstrap {
|
|
19
|
+
config: Config;
|
|
20
|
+
agentConfig: AgentConfig;
|
|
21
|
+
runnerConfig: RunnerConfig;
|
|
22
|
+
shouldRestoreContext: boolean;
|
|
23
|
+
isWorkerAgent: boolean;
|
|
24
|
+
autoSetup: boolean;
|
|
25
|
+
serveMode: boolean;
|
|
26
|
+
servePort: number;
|
|
27
|
+
sandboxMode: boolean;
|
|
28
|
+
sandboxImage: string;
|
|
29
|
+
sandboxCpu: string;
|
|
30
|
+
sandboxMemory: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolves daemon runtime configuration from persisted config + CLI overrides.
|
|
34
|
+
*/
|
|
35
|
+
export declare function bootstrapDaemon(options: BootstrapOptions): DaemonBootstrap;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { loadConfig } from "../../config/loader.js";
|
|
2
|
+
import { buildRunnerConfig } from "../runner.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolves daemon runtime configuration from persisted config + CLI overrides.
|
|
5
|
+
*/
|
|
6
|
+
export function bootstrapDaemon(options) {
|
|
7
|
+
const config = loadConfig();
|
|
8
|
+
if (!config) {
|
|
9
|
+
throw new Error("No config found. Run 'agentmesh init' first.");
|
|
10
|
+
}
|
|
11
|
+
if (!config.agents)
|
|
12
|
+
config.agents = [];
|
|
13
|
+
if (!config.defaults) {
|
|
14
|
+
config.defaults = { command: "opencode", model: "claude-sonnet-4-5-20250929" };
|
|
15
|
+
}
|
|
16
|
+
let agentConfig = config.agents.find((a) => a.name === options.name);
|
|
17
|
+
if (!agentConfig) {
|
|
18
|
+
agentConfig = {
|
|
19
|
+
name: options.name,
|
|
20
|
+
command: options.command || config.defaults.command,
|
|
21
|
+
workdir: options.workdir,
|
|
22
|
+
model: options.model || config.defaults.model,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (options.command)
|
|
26
|
+
agentConfig.command = options.command;
|
|
27
|
+
if (options.workdir)
|
|
28
|
+
agentConfig.workdir = options.workdir;
|
|
29
|
+
if (options.model)
|
|
30
|
+
agentConfig.model = options.model;
|
|
31
|
+
const runnerConfig = buildRunnerConfig({
|
|
32
|
+
cliModel: options.model,
|
|
33
|
+
agentModel: agentConfig.model,
|
|
34
|
+
defaultModel: config.defaults.model,
|
|
35
|
+
command: agentConfig.command,
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
config,
|
|
39
|
+
agentConfig,
|
|
40
|
+
runnerConfig,
|
|
41
|
+
shouldRestoreContext: options.restoreContext === true,
|
|
42
|
+
isWorkerAgent: options.worker === true,
|
|
43
|
+
autoSetup: options.autoSetup === true,
|
|
44
|
+
serveMode: options.serve === true,
|
|
45
|
+
servePort: options.servePort || 3001,
|
|
46
|
+
sandboxMode: options.sandbox === true,
|
|
47
|
+
sandboxImage: options.sandboxImage || "agentmesh/agent-sandbox:latest",
|
|
48
|
+
sandboxCpu: options.sandboxCpu || "1",
|
|
49
|
+
sandboxMemory: options.sandboxMemory || "2g",
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/core/daemon/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,cAAc,CAAC;AAiCpE;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,CAAC,MAAM,GAAG,EAAE,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG;YACZ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO;YACnD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK;SAC9C,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,OAAO;QAAE,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,CAAC,OAAO;QAAE,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,CAAC,KAAK;QAAE,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAErD,MAAM,YAAY,GAAG,iBAAiB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,KAAK;QACvB,UAAU,EAAE,WAAW,CAAC,KAAK;QAC7B,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK;QACnC,OAAO,EAAE,WAAW,CAAC,OAAO;KAC7B,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,WAAW;QACX,YAAY;QACZ,oBAAoB,EAAE,OAAO,CAAC,cAAc,KAAK,IAAI;QACrD,aAAa,EAAE,OAAO,CAAC,MAAM,KAAK,IAAI;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI;QACrC,SAAS,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,WAAW,EAAE,OAAO,CAAC,OAAO,KAAK,IAAI;QACrC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,gCAAgC;QACtE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,GAAG;QACrC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md generation for onboarded agents.
|
|
3
|
+
* Renders project context as a persistent file (complements ephemeral tmux injection).
|
|
4
|
+
*/
|
|
5
|
+
import type { OnboardData } from "../registry.js";
|
|
6
|
+
export declare function generateClaudeMd(onboard: OnboardData): string;
|
|
7
|
+
export declare function writeClaudeMd({ workdir, onboard, }: {
|
|
8
|
+
workdir: string;
|
|
9
|
+
onboard: OnboardData;
|
|
10
|
+
}): string | null;
|
|
11
|
+
export declare function removeClaudeMd(workdir: string): void;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLAUDE.md generation for onboarded agents.
|
|
3
|
+
* Renders project context as a persistent file (complements ephemeral tmux injection).
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Pure renderer
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export function generateClaudeMd(onboard) {
|
|
11
|
+
const lines = [];
|
|
12
|
+
lines.push("<!-- AUTO-GENERATED by AgentMesh — do not edit manually -->");
|
|
13
|
+
lines.push("");
|
|
14
|
+
// ── Identity ──────────────────────────────────────────────────────────
|
|
15
|
+
const a = onboard.agent;
|
|
16
|
+
lines.push("# Agent Context");
|
|
17
|
+
lines.push("");
|
|
18
|
+
lines.push(`- **Name**: ${a.display_name}`);
|
|
19
|
+
lines.push(`- **Model**: ${a.model}`);
|
|
20
|
+
if (onboard.assignment) {
|
|
21
|
+
lines.push(`- **Role**: ${onboard.assignment.role}`);
|
|
22
|
+
}
|
|
23
|
+
if (a.capabilities.length > 0) {
|
|
24
|
+
lines.push(`- **Capabilities**: ${a.capabilities.join(", ")}`);
|
|
25
|
+
}
|
|
26
|
+
lines.push("");
|
|
27
|
+
// ── Project ───────────────────────────────────────────────────────────
|
|
28
|
+
if (onboard.project) {
|
|
29
|
+
const p = onboard.project;
|
|
30
|
+
lines.push("## Project");
|
|
31
|
+
lines.push("");
|
|
32
|
+
lines.push(`- **Name**: ${p.name} (\`${p.code}\`)`);
|
|
33
|
+
if (p.description) {
|
|
34
|
+
lines.push(`- **Description**: ${p.description}`);
|
|
35
|
+
}
|
|
36
|
+
lines.push("");
|
|
37
|
+
// ── Git Workflow Rules ────────────────────────────────────────────
|
|
38
|
+
const wf = p.workflow_config;
|
|
39
|
+
lines.push("## Git Workflow Rules");
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push(`- **Branch prefix**: \`${wf.branch_prefix}\``);
|
|
42
|
+
lines.push(`- **PR target branch**: \`${wf.pr_target_branch}\``);
|
|
43
|
+
lines.push(`- **Commit convention**: ${wf.commit_convention}`);
|
|
44
|
+
if (wf.code_review_required) {
|
|
45
|
+
lines.push("- **Code review**: Required before merge");
|
|
46
|
+
}
|
|
47
|
+
if (wf.protected_branches.length > 0) {
|
|
48
|
+
lines.push(`- **Protected branches**: ${wf.protected_branches.map((b) => `\`${b}\``).join(", ")} — NEVER push directly to these`);
|
|
49
|
+
}
|
|
50
|
+
if (wf.custom_rules.length > 0) {
|
|
51
|
+
lines.push("");
|
|
52
|
+
lines.push("### Custom Rules");
|
|
53
|
+
lines.push("");
|
|
54
|
+
for (const rule of wf.custom_rules) {
|
|
55
|
+
lines.push(`- ${rule}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
lines.push("");
|
|
59
|
+
}
|
|
60
|
+
// ── Team Roster ────────────────────────────────────────────────────
|
|
61
|
+
if (onboard.team.length > 0) {
|
|
62
|
+
lines.push("## Team");
|
|
63
|
+
lines.push("");
|
|
64
|
+
lines.push("| Agent | Model | Role | Status |");
|
|
65
|
+
lines.push("|-------|-------|------|--------|");
|
|
66
|
+
for (const t of onboard.team) {
|
|
67
|
+
lines.push(`| ${t.display_name} | ${t.model} | ${t.role} | ${t.status} |`);
|
|
68
|
+
}
|
|
69
|
+
lines.push("");
|
|
70
|
+
}
|
|
71
|
+
// ── Hub API Reference ─────────────────────────────────────────────
|
|
72
|
+
lines.push("## Hub API");
|
|
73
|
+
lines.push("");
|
|
74
|
+
const api = onboard.hub_api;
|
|
75
|
+
lines.push(`- **Handoffs**: \`${api.handoffs}\``);
|
|
76
|
+
lines.push(`- **Claims**: \`${api.claims}\``);
|
|
77
|
+
lines.push(`- **Blockers**: \`${api.blockers}\``);
|
|
78
|
+
lines.push(`- **Inbox**: \`${api.inbox}\``);
|
|
79
|
+
lines.push(`- **Heartbeat**: \`${api.heartbeat}\``);
|
|
80
|
+
lines.push("");
|
|
81
|
+
// ── Repositories (NO credentials) ─────────────────────────────────
|
|
82
|
+
if (onboard.repos.length > 0) {
|
|
83
|
+
lines.push("## Repositories");
|
|
84
|
+
lines.push("");
|
|
85
|
+
for (const r of onboard.repos) {
|
|
86
|
+
lines.push(`- \`${r.full_name}\` (${r.provider}) — default branch: \`${r.default_branch ?? "unknown"}\``);
|
|
87
|
+
}
|
|
88
|
+
lines.push("");
|
|
89
|
+
}
|
|
90
|
+
// ── Project Instructions ──────────────────────────────────────────
|
|
91
|
+
if (onboard.project?.instructions) {
|
|
92
|
+
lines.push("## Project Instructions");
|
|
93
|
+
lines.push("");
|
|
94
|
+
lines.push(onboard.project.instructions);
|
|
95
|
+
lines.push("");
|
|
96
|
+
}
|
|
97
|
+
// ── Footer ────────────────────────────────────────────────────────
|
|
98
|
+
lines.push("---");
|
|
99
|
+
lines.push(`*Generated at ${new Date().toISOString()} by AgentMesh*`);
|
|
100
|
+
lines.push("");
|
|
101
|
+
return lines.join("\n");
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// File I/O
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
export function writeClaudeMd({ workdir, onboard, }) {
|
|
107
|
+
if (!fs.existsSync(workdir)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const filePath = path.join(workdir, "CLAUDE.md");
|
|
111
|
+
const content = generateClaudeMd(onboard);
|
|
112
|
+
fs.writeFileSync(filePath, content, { encoding: "utf-8" });
|
|
113
|
+
// Ensure CLAUDE.md is in .gitignore
|
|
114
|
+
const gitignorePath = path.join(workdir, ".gitignore");
|
|
115
|
+
try {
|
|
116
|
+
let gitignoreContent = "";
|
|
117
|
+
if (fs.existsSync(gitignorePath)) {
|
|
118
|
+
gitignoreContent = fs.readFileSync(gitignorePath, "utf-8");
|
|
119
|
+
}
|
|
120
|
+
const lines = gitignoreContent.split("\n").map((l) => l.trim());
|
|
121
|
+
if (!lines.includes("CLAUDE.md")) {
|
|
122
|
+
const appendLine = gitignoreContent.endsWith("\n") || gitignoreContent === ""
|
|
123
|
+
? "CLAUDE.md\n"
|
|
124
|
+
: "\nCLAUDE.md\n";
|
|
125
|
+
fs.appendFileSync(gitignorePath, appendLine);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// Non-fatal: .gitignore update is best-effort
|
|
130
|
+
}
|
|
131
|
+
return filePath;
|
|
132
|
+
}
|
|
133
|
+
export function removeClaudeMd(workdir) {
|
|
134
|
+
try {
|
|
135
|
+
const filePath = path.join(workdir, "CLAUDE.md");
|
|
136
|
+
if (fs.existsSync(filePath)) {
|
|
137
|
+
fs.unlinkSync(filePath);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Non-fatal: cleanup is best-effort
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=context-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-template.js","sourceRoot":"","sources":["../../../src/core/daemon/context-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface CrashLogInput {
|
|
2
|
+
timestamp: string;
|
|
3
|
+
agentName: string;
|
|
4
|
+
agentId: string | null;
|
|
5
|
+
reason: string;
|
|
6
|
+
sandboxLabel: string;
|
|
7
|
+
workdir?: string;
|
|
8
|
+
model: string;
|
|
9
|
+
lastOutput: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Formats a structured crash entry for on-disk diagnostics.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatCrashLog(input: CrashLogInput): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formats a structured crash entry for on-disk diagnostics.
|
|
3
|
+
*/
|
|
4
|
+
export function formatCrashLog(input) {
|
|
5
|
+
return `
|
|
6
|
+
================================================================================
|
|
7
|
+
AGENT CRASH DETECTED
|
|
8
|
+
================================================================================
|
|
9
|
+
Timestamp: ${input.timestamp}
|
|
10
|
+
Agent: ${input.agentName}
|
|
11
|
+
Agent ID: ${input.agentId}
|
|
12
|
+
Reason: ${input.reason}
|
|
13
|
+
Sandbox: ${input.sandboxLabel}
|
|
14
|
+
Workdir: ${input.workdir}
|
|
15
|
+
Model: ${input.model}
|
|
16
|
+
|
|
17
|
+
--- Last Session Output ---
|
|
18
|
+
${input.lastOutput}
|
|
19
|
+
================================================================================
|
|
20
|
+
|
|
21
|
+
`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=crash-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crash-log.js","sourceRoot":"","sources":["../../../src/core/daemon/crash-log.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAoB;IACjD,OAAO;;;;aAII,KAAK,CAAC,SAAS;SACnB,KAAK,CAAC,SAAS;YACZ,KAAK,CAAC,OAAO;UACf,KAAK,CAAC,MAAM;WACX,KAAK,CAAC,YAAY;WAClB,KAAK,CAAC,OAAO;SACf,KAAK,CAAC,KAAK;;;EAGlB,KAAK,CAAC,UAAU;;;CAGjB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Authentication Setup
|
|
3
|
+
* Configures git credential helpers or SSH keys from onboard credentials.
|
|
4
|
+
*/
|
|
5
|
+
export interface GitAuthInput {
|
|
6
|
+
type: string;
|
|
7
|
+
value: string;
|
|
8
|
+
repoUrl: string;
|
|
9
|
+
agentName: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Sets up git credentials for a repo and returns extra env vars to pass to the runner.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setupGitAuth(input: GitAuthInput): Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Removes credential files created for an agent.
|
|
17
|
+
*/
|
|
18
|
+
export declare function cleanupGitAuth(agentName: string): void;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git Authentication Setup
|
|
3
|
+
* Configures git credential helpers or SSH keys from onboard credentials.
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
const CREDENTIALS_DIR = path.join(os.homedir(), ".agentmesh", "credentials");
|
|
9
|
+
/**
|
|
10
|
+
* Sets up git credentials for a repo and returns extra env vars to pass to the runner.
|
|
11
|
+
*/
|
|
12
|
+
export function setupGitAuth(input) {
|
|
13
|
+
if (!fs.existsSync(CREDENTIALS_DIR)) {
|
|
14
|
+
fs.mkdirSync(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });
|
|
15
|
+
}
|
|
16
|
+
if (input.type === "pat") {
|
|
17
|
+
return setupPatAuth(input);
|
|
18
|
+
}
|
|
19
|
+
if (input.type === "ssh_deploy_key") {
|
|
20
|
+
return setupSshAuth(input);
|
|
21
|
+
}
|
|
22
|
+
console.log(`[GIT-AUTH] Unknown credential type: ${input.type}`);
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
function setupPatAuth(input) {
|
|
26
|
+
const credFile = path.join(CREDENTIALS_DIR, `${input.agentName}.git-credentials`);
|
|
27
|
+
// Parse repo URL to build credential line
|
|
28
|
+
// e.g., https://github.com/owner/repo -> https://x-access-token:{pat}@github.com
|
|
29
|
+
let host = "github.com";
|
|
30
|
+
try {
|
|
31
|
+
const url = new URL(input.repoUrl);
|
|
32
|
+
host = url.hostname;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Fallback to github.com
|
|
36
|
+
}
|
|
37
|
+
const credentialLine = `https://x-access-token:${input.value}@${host}\n`;
|
|
38
|
+
// Append to credential file (one host per line)
|
|
39
|
+
if (fs.existsSync(credFile)) {
|
|
40
|
+
const existing = fs.readFileSync(credFile, "utf-8");
|
|
41
|
+
if (!existing.includes(`@${host}`)) {
|
|
42
|
+
fs.appendFileSync(credFile, credentialLine);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
fs.writeFileSync(credFile, credentialLine, { mode: 0o600 });
|
|
47
|
+
}
|
|
48
|
+
console.log(`[GIT-AUTH] PAT credential configured for ${host}`);
|
|
49
|
+
return {
|
|
50
|
+
GIT_ASKPASS: "echo",
|
|
51
|
+
GIT_CONFIG_COUNT: "1",
|
|
52
|
+
GIT_CONFIG_KEY_0: "credential.helper",
|
|
53
|
+
GIT_CONFIG_VALUE_0: `store --file=${credFile}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function setupSshAuth(input) {
|
|
57
|
+
const keyFile = path.join(CREDENTIALS_DIR, `${input.agentName}.deploy-key`);
|
|
58
|
+
fs.writeFileSync(keyFile, input.value, { mode: 0o600 });
|
|
59
|
+
// Ensure the key file ends with a newline (SSH requirement)
|
|
60
|
+
if (!input.value.endsWith("\n")) {
|
|
61
|
+
fs.appendFileSync(keyFile, "\n");
|
|
62
|
+
}
|
|
63
|
+
console.log(`[GIT-AUTH] SSH deploy key written to ${keyFile}`);
|
|
64
|
+
return {
|
|
65
|
+
GIT_SSH_COMMAND: `ssh -i ${keyFile} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Removes credential files created for an agent.
|
|
70
|
+
*/
|
|
71
|
+
export function cleanupGitAuth(agentName) {
|
|
72
|
+
const patterns = [
|
|
73
|
+
path.join(CREDENTIALS_DIR, `${agentName}.git-credentials`),
|
|
74
|
+
path.join(CREDENTIALS_DIR, `${agentName}.deploy-key`),
|
|
75
|
+
];
|
|
76
|
+
for (const filePath of patterns) {
|
|
77
|
+
if (fs.existsSync(filePath)) {
|
|
78
|
+
try {
|
|
79
|
+
fs.unlinkSync(filePath);
|
|
80
|
+
console.log(`[GIT-AUTH] Removed ${filePath}`);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error(`[GIT-AUTH] Failed to remove ${filePath}:`, err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=git-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-auth.js","sourceRoot":"","sources":["../../../src/core/daemon/git-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ProgressLike {
|
|
2
|
+
status: string;
|
|
3
|
+
blockedOn?: string;
|
|
4
|
+
details?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* User-facing detail used when an agent is first considered stuck.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getStuckDetail(progress: ProgressLike): string;
|
|
10
|
+
/**
|
|
11
|
+
* Worker nudge message tuned by stuck status.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getNudgeMessage(progress: ProgressLike): string;
|
|
14
|
+
/**
|
|
15
|
+
* Returns true if we are still in the post-nudge grace period.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isWithinNudgeWaitWindow(nudgeSentAt: Date | null, nudgeWaitMs: number, now: Date): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-facing detail used when an agent is first considered stuck.
|
|
3
|
+
*/
|
|
4
|
+
export function getStuckDetail(progress) {
|
|
5
|
+
return progress.details || progress.blockedOn || "no activity";
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Worker nudge message tuned by stuck status.
|
|
9
|
+
*/
|
|
10
|
+
export function getNudgeMessage(progress) {
|
|
11
|
+
if (progress.status === "permission_blocked") {
|
|
12
|
+
return "Please continue with your task. If you see a permission prompt, try an alternative approach that doesn't require that permission.";
|
|
13
|
+
}
|
|
14
|
+
return "Please continue with your current task.";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Returns true if we are still in the post-nudge grace period.
|
|
18
|
+
*/
|
|
19
|
+
export function isWithinNudgeWaitWindow(nudgeSentAt, nudgeWaitMs, now) {
|
|
20
|
+
if (!nudgeSentAt)
|
|
21
|
+
return false;
|
|
22
|
+
return now.getTime() - nudgeSentAt.getTime() < nudgeWaitMs;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=health-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-policy.js","sourceRoot":"","sources":["../../../src/core/daemon/health-policy.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAsB;IACnD,OAAO,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS,IAAI,aAAa,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QAC7C,OAAO,mIAAmI,CAAC;IAC7I,CAAC;IACD,OAAO,yCAAyC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAwB,EACxB,WAAmB,EACnB,GAAS;IAET,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SandboxConfigInput {
|
|
2
|
+
configPath: string;
|
|
3
|
+
baseConfig: Record<string, unknown>;
|
|
4
|
+
model?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Writes sandbox OpenCode config, ensuring parent directories exist.
|
|
8
|
+
*/
|
|
9
|
+
export declare function writeSandboxOpencodeConfig(input: SandboxConfigInput): void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Writes sandbox OpenCode config, ensuring parent directories exist.
|
|
5
|
+
*/
|
|
6
|
+
export function writeSandboxOpencodeConfig(input) {
|
|
7
|
+
const { configPath, baseConfig, model } = input;
|
|
8
|
+
const configDir = path.dirname(configPath);
|
|
9
|
+
if (!fs.existsSync(configDir)) {
|
|
10
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
const config = { ...baseConfig };
|
|
13
|
+
if (model)
|
|
14
|
+
config.model = model;
|
|
15
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=sandbox-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-config.js","sourceRoot":"","sources":["../../../src/core/daemon/sandbox-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,KAAyB;IAClE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,GAAG,UAAU,EAAE,CAAC;IAC1D,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAEhC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RunnerType } from "../../config/schema.js";
|
|
2
|
+
export interface PersistRunningStateInput {
|
|
3
|
+
agentName: string;
|
|
4
|
+
agentId: string;
|
|
5
|
+
pid: number;
|
|
6
|
+
token: string;
|
|
7
|
+
workdir?: string;
|
|
8
|
+
assignedProject?: string;
|
|
9
|
+
runtimeModel: string;
|
|
10
|
+
runnerType: RunnerType;
|
|
11
|
+
sandboxContainer?: string;
|
|
12
|
+
serveMode: boolean;
|
|
13
|
+
servePort: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the PID of the foreground process running in a tmux pane.
|
|
17
|
+
* Returns null if session doesn't exist or PID can't be determined.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getTmuxPanePid(sessionName: string): number | null;
|
|
20
|
+
/**
|
|
21
|
+
* Recursively get all descendant PIDs of a process (process tree).
|
|
22
|
+
* Returns empty array if the process has no children or doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getProcessTree(pid: number): number[];
|
|
25
|
+
/**
|
|
26
|
+
* Capture all PIDs for a running agent: the tmux pane process + full process tree.
|
|
27
|
+
* This includes the opencode process and any LSP servers it spawned.
|
|
28
|
+
*/
|
|
29
|
+
export declare function captureAgentChildPids(agentName: string): number[];
|
|
30
|
+
/**
|
|
31
|
+
* Persists daemon runtime state for status/attach/restart operations.
|
|
32
|
+
*/
|
|
33
|
+
export declare function persistRunningState(input: PersistRunningStateInput): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { addAgentToState } from "../../config/loader.js";
|
|
3
|
+
import { getSessionName } from "../tmux.js";
|
|
4
|
+
/**
|
|
5
|
+
* Get the PID of the foreground process running in a tmux pane.
|
|
6
|
+
* Returns null if session doesn't exist or PID can't be determined.
|
|
7
|
+
*/
|
|
8
|
+
export function getTmuxPanePid(sessionName) {
|
|
9
|
+
try {
|
|
10
|
+
const result = execSync(`tmux list-panes -t "${sessionName}" -F '#{pane_pid}' 2>/dev/null`, {
|
|
11
|
+
encoding: "utf-8",
|
|
12
|
+
});
|
|
13
|
+
const pid = parseInt(result.trim(), 10);
|
|
14
|
+
return Number.isNaN(pid) ? null : pid;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Recursively get all descendant PIDs of a process (process tree).
|
|
22
|
+
* Returns empty array if the process has no children or doesn't exist.
|
|
23
|
+
*/
|
|
24
|
+
export function getProcessTree(pid) {
|
|
25
|
+
try {
|
|
26
|
+
const result = execSync(`pgrep -P ${pid} 2>/dev/null`, { encoding: "utf-8" });
|
|
27
|
+
const childPids = result
|
|
28
|
+
.trim()
|
|
29
|
+
.split("\n")
|
|
30
|
+
.map((p) => parseInt(p, 10))
|
|
31
|
+
.filter((p) => !Number.isNaN(p) && p > 0);
|
|
32
|
+
const allDescendants = [...childPids];
|
|
33
|
+
for (const childPid of childPids) {
|
|
34
|
+
allDescendants.push(...getProcessTree(childPid));
|
|
35
|
+
}
|
|
36
|
+
return allDescendants;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Capture all PIDs for a running agent: the tmux pane process + full process tree.
|
|
44
|
+
* This includes the opencode process and any LSP servers it spawned.
|
|
45
|
+
*/
|
|
46
|
+
export function captureAgentChildPids(agentName) {
|
|
47
|
+
const sessionName = getSessionName(agentName);
|
|
48
|
+
const panePid = getTmuxPanePid(sessionName);
|
|
49
|
+
if (!panePid) {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
const pids = [panePid, ...getProcessTree(panePid)];
|
|
53
|
+
// Deduplicate
|
|
54
|
+
return [...new Set(pids)];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Persists daemon runtime state for status/attach/restart operations.
|
|
58
|
+
*/
|
|
59
|
+
export function persistRunningState(input) {
|
|
60
|
+
const sessionName = input.serveMode
|
|
61
|
+
? `serve:${input.servePort}`
|
|
62
|
+
: getSessionName(input.agentName);
|
|
63
|
+
addAgentToState({
|
|
64
|
+
name: input.agentName,
|
|
65
|
+
agentId: input.agentId,
|
|
66
|
+
pid: input.pid,
|
|
67
|
+
tmuxSession: sessionName,
|
|
68
|
+
startedAt: new Date().toISOString(),
|
|
69
|
+
token: input.token,
|
|
70
|
+
workdir: input.workdir,
|
|
71
|
+
assignedProject: input.assignedProject,
|
|
72
|
+
runtimeModel: input.runtimeModel,
|
|
73
|
+
runnerType: input.runnerType,
|
|
74
|
+
sandboxContainer: input.sandboxContainer,
|
|
75
|
+
servePort: input.serveMode ? input.servePort : undefined,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type SessionEnv } from "../tmux.js";
|
|
2
|
+
export interface StartTmuxSessionInput {
|
|
3
|
+
agentName: string;
|
|
4
|
+
agentId: string | null;
|
|
5
|
+
command: string;
|
|
6
|
+
workdir?: string;
|
|
7
|
+
runnerEnv: SessionEnv;
|
|
8
|
+
shouldRestoreContext: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface StartTmuxSessionResult {
|
|
11
|
+
preStartSessionId?: string | null;
|
|
12
|
+
attemptedResumeSessionId?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Starts or reconnects to the interactive tmux runtime session.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startTmuxRuntimeSession(input: StartTmuxSessionInput): StartTmuxSessionResult;
|