@agentmeshhq/agent 0.2.1 → 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/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__/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/cli/inbox.d.ts +5 -0
- package/dist/cli/inbox.js +123 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/index.js +0 -0
- package/dist/cli/issue.d.ts +42 -0
- package/dist/cli/issue.js +297 -0
- package/dist/cli/issue.js.map +1 -0
- package/dist/cli/ready.d.ts +5 -0
- package/dist/cli/ready.js +131 -0
- package/dist/cli/ready.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.js +154 -0
- package/dist/cli/sync.js.map +1 -0
- 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 +2 -2
- 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 +0 -2
- package/dist/core/daemon/crash-log.js +0 -1
- package/dist/core/daemon/crash-log.js.map +1 -1
- 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 +0 -4
- package/dist/core/daemon/health-policy.js +0 -8
- package/dist/core/daemon/health-policy.js.map +1 -1
- package/dist/core/daemon/state.js +1 -0
- package/dist/core/daemon/state.js.map +1 -1
- package/dist/core/daemon/workspace.d.ts +13 -0
- package/dist/core/daemon/workspace.js +39 -0
- package/dist/core/daemon/workspace.js.map +1 -1
- package/dist/core/daemon.d.ts +9 -6
- package/dist/core/daemon.js +206 -185
- package/dist/core/daemon.js.map +1 -1
- package/dist/core/injector.d.ts +5 -1
- package/dist/core/injector.js +77 -0
- package/dist/core/injector.js.map +1 -1
- package/dist/core/issue-cache.d.ts +44 -0
- package/dist/core/issue-cache.js +75 -0
- package/dist/core/issue-cache.js.map +1 -0
- package/dist/core/registry.d.ts +62 -0
- package/dist/core/registry.js +18 -0
- package/dist/core/registry.js.map +1 -1
- package/package.json +12 -11
- package/LICENSE +0 -21
package/dist/config/loader.js
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { CONFIG_PATH, DEFAULT_CONFIG, STATE_PATH, } from "./schema.js";
|
|
4
|
+
const STATE_LOCK_PATH = STATE_PATH + ".lock";
|
|
5
|
+
/**
|
|
6
|
+
* Executes a function while holding an exclusive advisory lock on state.json.
|
|
7
|
+
* Uses O_EXCL to atomically create a lockfile — blocks concurrent writers.
|
|
8
|
+
* Retries with exponential backoff if the lock is held.
|
|
9
|
+
*/
|
|
10
|
+
function withStateLock(fn) {
|
|
11
|
+
const maxRetries = 20;
|
|
12
|
+
const baseDelay = 50; // ms
|
|
13
|
+
let fd = null;
|
|
14
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
15
|
+
try {
|
|
16
|
+
fd = fs.openSync(STATE_LOCK_PATH, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
if (err.code !== "EEXIST")
|
|
21
|
+
throw err;
|
|
22
|
+
// Lock held by another process — check for stale lock (>10s old)
|
|
23
|
+
try {
|
|
24
|
+
const stat = fs.statSync(STATE_LOCK_PATH);
|
|
25
|
+
if (Date.now() - stat.mtimeMs > 10_000) {
|
|
26
|
+
// Stale lock — force remove and retry immediately
|
|
27
|
+
fs.unlinkSync(STATE_LOCK_PATH);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Lock file disappeared — retry
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
// Wait with jittered backoff
|
|
36
|
+
const delay = baseDelay * Math.pow(2, Math.min(attempt, 6)) + Math.random() * 20;
|
|
37
|
+
const until = Date.now() + delay;
|
|
38
|
+
while (Date.now() < until) { /* busy wait — short duration */ }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (fd === null) {
|
|
42
|
+
throw new Error("Failed to acquire state lock after retries");
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
return fn();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
fs.closeSync(fd);
|
|
49
|
+
try {
|
|
50
|
+
fs.unlinkSync(STATE_LOCK_PATH);
|
|
51
|
+
}
|
|
52
|
+
catch { /* already removed */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Atomically writes a file by writing to a temp file then renaming.
|
|
57
|
+
* Prevents partial reads from concurrent processes.
|
|
58
|
+
*/
|
|
59
|
+
function atomicWriteFileSync(filePath, data) {
|
|
60
|
+
const dir = path.dirname(filePath);
|
|
61
|
+
const tmpPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.tmp`);
|
|
62
|
+
fs.writeFileSync(tmpPath, data);
|
|
63
|
+
fs.renameSync(tmpPath, filePath);
|
|
64
|
+
}
|
|
4
65
|
export function ensureConfigDir() {
|
|
5
66
|
const configDir = path.dirname(CONFIG_PATH);
|
|
6
67
|
if (!fs.existsSync(configDir)) {
|
|
@@ -37,60 +98,59 @@ export function loadState() {
|
|
|
37
98
|
}
|
|
38
99
|
export function saveState(state) {
|
|
39
100
|
ensureConfigDir();
|
|
40
|
-
|
|
101
|
+
atomicWriteFileSync(STATE_PATH, JSON.stringify(state, null, 2));
|
|
41
102
|
}
|
|
42
103
|
export function addAgentToState(agent) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
104
|
+
withStateLock(() => {
|
|
105
|
+
const state = loadState();
|
|
106
|
+
// Remove existing entry with same name
|
|
107
|
+
state.agents = state.agents.filter((a) => a.name !== agent.name);
|
|
108
|
+
state.agents.push(agent);
|
|
109
|
+
saveState(state);
|
|
110
|
+
});
|
|
48
111
|
}
|
|
49
112
|
export function removeAgentFromState(name, preserveAgentId = false) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
113
|
+
withStateLock(() => {
|
|
114
|
+
const state = loadState();
|
|
115
|
+
if (preserveAgentId) {
|
|
116
|
+
// Keep minimal state with agentId for re-registration
|
|
117
|
+
const existing = state.agents.find((a) => a.name === name);
|
|
118
|
+
if (existing) {
|
|
119
|
+
state.agents = state.agents.filter((a) => a.name !== name);
|
|
120
|
+
// Save only the agentId for next startup
|
|
121
|
+
state.agents.push({
|
|
122
|
+
name: existing.name,
|
|
123
|
+
agentId: existing.agentId,
|
|
124
|
+
pid: 0,
|
|
125
|
+
tmuxSession: "",
|
|
126
|
+
startedAt: existing.startedAt,
|
|
127
|
+
status: "stopped",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
55
132
|
state.agents = state.agents.filter((a) => a.name !== name);
|
|
56
|
-
// Save only the agentId and restartCount for next startup
|
|
57
|
-
state.agents.push({
|
|
58
|
-
name: existing.name,
|
|
59
|
-
agentId: existing.agentId,
|
|
60
|
-
pid: 0,
|
|
61
|
-
tmuxSession: "",
|
|
62
|
-
startedAt: existing.startedAt,
|
|
63
|
-
restartCount: existing.restartCount,
|
|
64
|
-
status: "stopped",
|
|
65
|
-
});
|
|
66
133
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
state.agents = state.agents.filter((a) => a.name !== name);
|
|
70
|
-
}
|
|
71
|
-
saveState(state);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Reset restart count for an agent (called on manual start or after stable period)
|
|
75
|
-
*/
|
|
76
|
-
export function resetAgentRestartCount(name) {
|
|
77
|
-
updateAgentInState(name, { restartCount: 0, stuckSince: undefined, status: "running" });
|
|
134
|
+
saveState(state);
|
|
135
|
+
});
|
|
78
136
|
}
|
|
79
137
|
export function getAgentState(name) {
|
|
80
138
|
const state = loadState();
|
|
81
139
|
return state.agents.find((a) => a.name === name);
|
|
82
140
|
}
|
|
83
141
|
export function updateAgentInState(name, updates) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
142
|
+
withStateLock(() => {
|
|
143
|
+
const state = loadState();
|
|
144
|
+
const agentIndex = state.agents.findIndex((a) => a.name === name);
|
|
145
|
+
if (agentIndex === -1) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
state.agents[agentIndex] = {
|
|
149
|
+
...state.agents[agentIndex],
|
|
150
|
+
...updates,
|
|
151
|
+
};
|
|
152
|
+
saveState(state);
|
|
153
|
+
});
|
|
94
154
|
}
|
|
95
155
|
export function createDefaultConfig(apiKey, workspace) {
|
|
96
156
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAEL,WAAW,EAEX,cAAc,EACd,UAAU,GAEX,MAAM,aAAa,CAAC;AAErB,MAAM,UAAU,eAAe;IAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,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;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAU,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,eAAe,EAAE,CAAC;IAClB,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -36,8 +36,6 @@ export interface AgentState {
|
|
|
36
36
|
runnerType?: RunnerType;
|
|
37
37
|
/** Docker container name if running in sandbox mode */
|
|
38
38
|
sandboxContainer?: string;
|
|
39
|
-
/** Number of auto-restart attempts since last manual start */
|
|
40
|
-
restartCount?: number;
|
|
41
39
|
/** ISO timestamp of last auto-restart */
|
|
42
40
|
lastRestartAt?: string;
|
|
43
41
|
/** ISO timestamp of last detected activity */
|
|
@@ -50,6 +48,8 @@ export interface AgentState {
|
|
|
50
48
|
opencodeSessionId?: string;
|
|
51
49
|
/** PIDs of spawned child processes (opencode + LSP servers) tracked for cleanup */
|
|
52
50
|
childPids?: number[];
|
|
51
|
+
/** Port used in serve mode (for collision detection) */
|
|
52
|
+
servePort?: number;
|
|
53
53
|
}
|
|
54
54
|
export interface State {
|
|
55
55
|
agents: AgentState[];
|
|
@@ -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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"}
|
|
@@ -10,7 +10,6 @@ Timestamp: ${input.timestamp}
|
|
|
10
10
|
Agent: ${input.agentName}
|
|
11
11
|
Agent ID: ${input.agentId}
|
|
12
12
|
Reason: ${input.reason}
|
|
13
|
-
Restart Count: ${input.restartCount}/${input.maxRestartAttempts}
|
|
14
13
|
Sandbox: ${input.sandboxLabel}
|
|
15
14
|
Workdir: ${input.workdir}
|
|
16
15
|
Model: ${input.model}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crash-log.js","sourceRoot":"","sources":["../../../src/core/daemon/crash-log.ts"],"names":[],"mappings":"
|
|
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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"}
|
|
@@ -3,10 +3,6 @@ export interface ProgressLike {
|
|
|
3
3
|
blockedOn?: string;
|
|
4
4
|
details?: string;
|
|
5
5
|
}
|
|
6
|
-
/**
|
|
7
|
-
* Returns true when restart counters should be reset after a stable period.
|
|
8
|
-
*/
|
|
9
|
-
export declare function shouldResetRestartCount(restartCount: number, lastStableTime: Date | null, resetWindowMs: number): boolean;
|
|
10
6
|
/**
|
|
11
7
|
* User-facing detail used when an agent is first considered stuck.
|
|
12
8
|
*/
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns true when restart counters should be reset after a stable period.
|
|
3
|
-
*/
|
|
4
|
-
export function shouldResetRestartCount(restartCount, lastStableTime, resetWindowMs) {
|
|
5
|
-
if (restartCount <= 0 || !lastStableTime)
|
|
6
|
-
return false;
|
|
7
|
-
return Date.now() - lastStableTime.getTime() > resetWindowMs;
|
|
8
|
-
}
|
|
9
1
|
/**
|
|
10
2
|
* User-facing detail used when an agent is first considered stuck.
|
|
11
3
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-policy.js","sourceRoot":"","sources":["../../../src/core/daemon/health-policy.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,
|
|
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"}
|
|
@@ -72,6 +72,7 @@ export function persistRunningState(input) {
|
|
|
72
72
|
runtimeModel: input.runtimeModel,
|
|
73
73
|
runnerType: input.runnerType,
|
|
74
74
|
sandboxContainer: input.sandboxContainer,
|
|
75
|
+
servePort: input.serveMode ? input.servePort : undefined,
|
|
75
76
|
});
|
|
76
77
|
}
|
|
77
78
|
//# sourceMappingURL=state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/daemon/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,3 +8,16 @@ export interface WorkspaceSetupInput {
|
|
|
8
8
|
* Ensures a project workspace exists and is on the target default branch.
|
|
9
9
|
*/
|
|
10
10
|
export declare function setupWorkspace(input: WorkspaceSetupInput): string;
|
|
11
|
+
export interface GitIdentityInput {
|
|
12
|
+
workspacePath: string;
|
|
13
|
+
agentName: string;
|
|
14
|
+
agentDisplayName: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sets local git user.name and user.email for the workspace.
|
|
18
|
+
*/
|
|
19
|
+
export declare function configureGitIdentity(input: GitIdentityInput): void;
|
|
20
|
+
/**
|
|
21
|
+
* Validates push access with a dry-run push (non-fatal).
|
|
22
|
+
*/
|
|
23
|
+
export declare function validatePushAccess(workspacePath: string, remoteBranch?: string): boolean;
|
|
@@ -48,4 +48,43 @@ export function setupWorkspace(input) {
|
|
|
48
48
|
console.log(`✓ Workspace ready: ${workspacePath}\n`);
|
|
49
49
|
return workspacePath;
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Sets local git user.name and user.email for the workspace.
|
|
53
|
+
*/
|
|
54
|
+
export function configureGitIdentity(input) {
|
|
55
|
+
const { workspacePath, agentName, agentDisplayName } = input;
|
|
56
|
+
try {
|
|
57
|
+
execSync(`git config user.name "${agentDisplayName}"`, {
|
|
58
|
+
cwd: workspacePath,
|
|
59
|
+
stdio: "pipe",
|
|
60
|
+
});
|
|
61
|
+
execSync(`git config user.email "${agentName}@agents.agentmeshhq.dev"`, {
|
|
62
|
+
cwd: workspacePath,
|
|
63
|
+
stdio: "pipe",
|
|
64
|
+
});
|
|
65
|
+
console.log(`✓ Git identity configured: ${agentDisplayName} <${agentName}@agents.agentmeshhq.dev>`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.warn(`⚠ Could not configure git identity: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Validates push access with a dry-run push (non-fatal).
|
|
73
|
+
*/
|
|
74
|
+
export function validatePushAccess(workspacePath, remoteBranch) {
|
|
75
|
+
const target = remoteBranch ?? "HEAD";
|
|
76
|
+
try {
|
|
77
|
+
execSync(`git push --dry-run origin ${target}`, {
|
|
78
|
+
cwd: workspacePath,
|
|
79
|
+
stdio: "pipe",
|
|
80
|
+
timeout: 15_000,
|
|
81
|
+
});
|
|
82
|
+
console.log("✓ Push access validated");
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.warn(`⚠ Push access validation failed: ${error.message}`);
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
51
90
|
//# sourceMappingURL=workspace.js.map
|