@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.
Files changed (147) hide show
  1. package/README.md +39 -0
  2. package/dist/__tests__/context-template.test.d.ts +4 -0
  3. package/dist/__tests__/context-template.test.js +233 -0
  4. package/dist/__tests__/context-template.test.js.map +1 -0
  5. package/dist/__tests__/loader.test.js +140 -28
  6. package/dist/__tests__/loader.test.js.map +1 -1
  7. package/dist/__tests__/no-respawn.test.d.ts +1 -0
  8. package/dist/__tests__/no-respawn.test.js +254 -0
  9. package/dist/__tests__/no-respawn.test.js.map +1 -0
  10. package/dist/__tests__/onboard.test.d.ts +5 -0
  11. package/dist/__tests__/onboard.test.js +341 -0
  12. package/dist/__tests__/onboard.test.js.map +1 -0
  13. package/dist/__tests__/orphan-process.test.d.ts +11 -0
  14. package/dist/__tests__/orphan-process.test.js +286 -0
  15. package/dist/__tests__/orphan-process.test.js.map +1 -0
  16. package/dist/__tests__/runner.test.js +16 -0
  17. package/dist/__tests__/runner.test.js.map +1 -1
  18. package/dist/__tests__/shared-resource-guards.test.d.ts +7 -0
  19. package/dist/__tests__/shared-resource-guards.test.js +260 -0
  20. package/dist/__tests__/shared-resource-guards.test.js.map +1 -0
  21. package/dist/__tests__/watchdog.test.js +138 -12
  22. package/dist/__tests__/watchdog.test.js.map +1 -1
  23. package/dist/cli/status.js +11 -0
  24. package/dist/cli/status.js.map +1 -1
  25. package/dist/cli/stop.js +7 -2
  26. package/dist/cli/stop.js.map +1 -1
  27. package/dist/config/loader.d.ts +0 -4
  28. package/dist/config/loader.js +102 -42
  29. package/dist/config/loader.js.map +1 -1
  30. package/dist/config/schema.d.ts +6 -4
  31. package/dist/core/daemon/assignment-message.d.ts +12 -0
  32. package/dist/core/daemon/assignment-message.js +36 -0
  33. package/dist/core/daemon/assignment-message.js.map +1 -0
  34. package/dist/core/daemon/bootstrap.d.ts +35 -0
  35. package/dist/core/daemon/bootstrap.js +52 -0
  36. package/dist/core/daemon/bootstrap.js.map +1 -0
  37. package/dist/core/daemon/context-template.d.ts +11 -0
  38. package/dist/core/daemon/context-template.js +144 -0
  39. package/dist/core/daemon/context-template.js.map +1 -0
  40. package/dist/core/daemon/crash-log.d.ts +14 -0
  41. package/dist/core/daemon/crash-log.js +23 -0
  42. package/dist/core/daemon/crash-log.js.map +1 -0
  43. package/dist/core/daemon/git-auth.d.ts +18 -0
  44. package/dist/core/daemon/git-auth.js +88 -0
  45. package/dist/core/daemon/git-auth.js.map +1 -0
  46. package/dist/core/daemon/health-policy.d.ts +17 -0
  47. package/dist/core/daemon/health-policy.js +24 -0
  48. package/dist/core/daemon/health-policy.js.map +1 -0
  49. package/dist/core/daemon/sandbox-config.d.ts +9 -0
  50. package/dist/core/daemon/sandbox-config.js +17 -0
  51. package/dist/core/daemon/sandbox-config.js.map +1 -0
  52. package/dist/core/daemon/state.d.ts +33 -0
  53. package/dist/core/daemon/state.js +78 -0
  54. package/dist/core/daemon/state.js.map +1 -0
  55. package/dist/core/daemon/tmux-session.d.ts +17 -0
  56. package/dist/core/daemon/tmux-session.js +34 -0
  57. package/dist/core/daemon/tmux-session.js.map +1 -0
  58. package/dist/core/daemon/workspace.d.ts +23 -0
  59. package/dist/core/daemon/workspace.js +90 -0
  60. package/dist/core/daemon/workspace.js.map +1 -0
  61. package/dist/core/daemon.d.ts +9 -12
  62. package/dist/core/daemon.js +293 -393
  63. package/dist/core/daemon.js.map +1 -1
  64. package/dist/core/injector.d.ts +5 -1
  65. package/dist/core/injector.js +83 -0
  66. package/dist/core/injector.js.map +1 -1
  67. package/dist/core/registry.d.ts +62 -0
  68. package/dist/core/registry.js +18 -0
  69. package/dist/core/registry.js.map +1 -1
  70. package/dist/core/runner/build.d.ts +9 -0
  71. package/dist/core/runner/build.js +53 -0
  72. package/dist/core/runner/build.js.map +1 -0
  73. package/dist/core/runner/detect.d.ts +5 -0
  74. package/dist/core/runner/detect.js +14 -0
  75. package/dist/core/runner/detect.js.map +1 -0
  76. package/dist/core/runner/index.d.ts +5 -0
  77. package/dist/core/runner/index.js +5 -0
  78. package/dist/core/runner/index.js.map +1 -0
  79. package/dist/core/runner/model.d.ts +5 -0
  80. package/dist/core/runner/model.js +7 -0
  81. package/dist/core/runner/model.js.map +1 -0
  82. package/dist/core/runner/opencode-models.d.ts +15 -0
  83. package/dist/core/runner/opencode-models.js +70 -0
  84. package/dist/core/runner/opencode-models.js.map +1 -0
  85. package/dist/core/runner/types.d.ts +19 -0
  86. package/dist/core/runner/types.js +8 -0
  87. package/dist/core/runner/types.js.map +1 -0
  88. package/dist/core/runner.d.ts +5 -47
  89. package/dist/core/runner.js +5 -167
  90. package/dist/core/runner.js.map +1 -1
  91. package/dist/core/tmux-runtime.d.ts +13 -0
  92. package/dist/core/tmux-runtime.js +72 -0
  93. package/dist/core/tmux-runtime.js.map +1 -0
  94. package/dist/core/tmux.d.ts +7 -1
  95. package/dist/core/tmux.js +75 -45
  96. package/dist/core/tmux.js.map +1 -1
  97. package/dist/core/watchdog.d.ts +18 -1
  98. package/dist/core/watchdog.js +78 -29
  99. package/dist/core/watchdog.js.map +1 -1
  100. package/package.json +24 -4
  101. package/src/__tests__/context.test.ts +0 -464
  102. package/src/__tests__/injector.test.ts +0 -29
  103. package/src/__tests__/jwt.test.ts +0 -112
  104. package/src/__tests__/loader.test.ts +0 -239
  105. package/src/__tests__/runner.test.ts +0 -104
  106. package/src/__tests__/sandbox.test.ts +0 -435
  107. package/src/__tests__/watchdog.test.ts +0 -368
  108. package/src/cli/attach.ts +0 -22
  109. package/src/cli/build.ts +0 -145
  110. package/src/cli/config.ts +0 -148
  111. package/src/cli/context.ts +0 -231
  112. package/src/cli/deploy.ts +0 -155
  113. package/src/cli/index.ts +0 -376
  114. package/src/cli/init.ts +0 -75
  115. package/src/cli/list.ts +0 -70
  116. package/src/cli/local.ts +0 -183
  117. package/src/cli/logs.ts +0 -64
  118. package/src/cli/migrate.ts +0 -212
  119. package/src/cli/nudge.ts +0 -81
  120. package/src/cli/restart.ts +0 -59
  121. package/src/cli/slack.ts +0 -70
  122. package/src/cli/start.ts +0 -118
  123. package/src/cli/status.ts +0 -91
  124. package/src/cli/stop.ts +0 -48
  125. package/src/cli/test.ts +0 -143
  126. package/src/cli/token.ts +0 -188
  127. package/src/cli/whoami.ts +0 -142
  128. package/src/config/loader.ts +0 -121
  129. package/src/config/schema.ts +0 -68
  130. package/src/context/handoff.ts +0 -122
  131. package/src/context/index.ts +0 -8
  132. package/src/context/schema.ts +0 -111
  133. package/src/context/storage.ts +0 -197
  134. package/src/core/daemon.ts +0 -1317
  135. package/src/core/heartbeat.ts +0 -129
  136. package/src/core/injector.ts +0 -292
  137. package/src/core/registry.ts +0 -159
  138. package/src/core/runner.ts +0 -225
  139. package/src/core/sandbox.ts +0 -547
  140. package/src/core/session-id.ts +0 -111
  141. package/src/core/tmux.ts +0 -405
  142. package/src/core/watchdog.ts +0 -238
  143. package/src/core/websocket.ts +0 -94
  144. package/src/index.ts +0 -10
  145. package/src/utils/jwt.ts +0 -87
  146. package/tsconfig.json +0 -8
  147. 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;