awb-agent-manager 1.0.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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +246 -0
  3. package/dist/lib/agent-lockfile.d.ts +37 -0
  4. package/dist/lib/agent-lockfile.js +205 -0
  5. package/dist/lib/agent-lockfile.js.map +1 -0
  6. package/dist/lib/agent-manager-commands.d.ts +34 -0
  7. package/dist/lib/agent-manager-commands.js +531 -0
  8. package/dist/lib/agent-manager-commands.js.map +1 -0
  9. package/dist/lib/base-session-manager.d.ts +127 -0
  10. package/dist/lib/base-session-manager.js +667 -0
  11. package/dist/lib/base-session-manager.js.map +1 -0
  12. package/dist/lib/chat-attachment-prep.d.ts +35 -0
  13. package/dist/lib/chat-attachment-prep.js +180 -0
  14. package/dist/lib/chat-attachment-prep.js.map +1 -0
  15. package/dist/lib/chat-session-manager.d.ts +29 -0
  16. package/dist/lib/chat-session-manager.js +400 -0
  17. package/dist/lib/chat-session-manager.js.map +1 -0
  18. package/dist/lib/circuit-breaker.d.ts +34 -0
  19. package/dist/lib/circuit-breaker.js +146 -0
  20. package/dist/lib/circuit-breaker.js.map +1 -0
  21. package/dist/lib/cli-adapters/antigravity.d.ts +15 -0
  22. package/dist/lib/cli-adapters/antigravity.js +114 -0
  23. package/dist/lib/cli-adapters/antigravity.js.map +1 -0
  24. package/dist/lib/cli-adapters/base.d.ts +115 -0
  25. package/dist/lib/cli-adapters/base.js +111 -0
  26. package/dist/lib/cli-adapters/base.js.map +1 -0
  27. package/dist/lib/cli-adapters/claude.d.ts +19 -0
  28. package/dist/lib/cli-adapters/claude.js +233 -0
  29. package/dist/lib/cli-adapters/claude.js.map +1 -0
  30. package/dist/lib/cli-adapters/codex.d.ts +14 -0
  31. package/dist/lib/cli-adapters/codex.js +152 -0
  32. package/dist/lib/cli-adapters/codex.js.map +1 -0
  33. package/dist/lib/cli-adapters/deepseek.d.ts +15 -0
  34. package/dist/lib/cli-adapters/deepseek.js +70 -0
  35. package/dist/lib/cli-adapters/deepseek.js.map +1 -0
  36. package/dist/lib/cli-adapters/index.d.ts +8 -0
  37. package/dist/lib/cli-adapters/index.js +27 -0
  38. package/dist/lib/cli-adapters/index.js.map +1 -0
  39. package/dist/lib/cli-adapters/model-introspect.d.ts +3 -0
  40. package/dist/lib/cli-adapters/model-introspect.js +65 -0
  41. package/dist/lib/cli-adapters/model-introspect.js.map +1 -0
  42. package/dist/lib/cli-error-signatures.d.ts +9 -0
  43. package/dist/lib/cli-error-signatures.js +22 -0
  44. package/dist/lib/cli-error-signatures.js.map +1 -0
  45. package/dist/lib/cli-output-summary.d.ts +2 -0
  46. package/dist/lib/cli-output-summary.js +104 -0
  47. package/dist/lib/cli-output-summary.js.map +1 -0
  48. package/dist/lib/cli-resolver.d.ts +2 -0
  49. package/dist/lib/cli-resolver.js +177 -0
  50. package/dist/lib/cli-resolver.js.map +1 -0
  51. package/dist/lib/config.d.ts +13 -0
  52. package/dist/lib/config.js +124 -0
  53. package/dist/lib/config.js.map +1 -0
  54. package/dist/lib/constants.d.ts +36 -0
  55. package/dist/lib/constants.js +51 -0
  56. package/dist/lib/constants.js.map +1 -0
  57. package/dist/lib/environment-provisioner.d.ts +31 -0
  58. package/dist/lib/environment-provisioner.js +182 -0
  59. package/dist/lib/environment-provisioner.js.map +1 -0
  60. package/dist/lib/error-log-uploader.d.ts +19 -0
  61. package/dist/lib/error-log-uploader.js +138 -0
  62. package/dist/lib/error-log-uploader.js.map +1 -0
  63. package/dist/lib/event-dispatcher.d.ts +149 -0
  64. package/dist/lib/event-dispatcher.js +799 -0
  65. package/dist/lib/event-dispatcher.js.map +1 -0
  66. package/dist/lib/event-log-recorder.d.ts +11 -0
  67. package/dist/lib/event-log-recorder.js +77 -0
  68. package/dist/lib/event-log-recorder.js.map +1 -0
  69. package/dist/lib/event-stream.d.ts +26 -0
  70. package/dist/lib/event-stream.js +177 -0
  71. package/dist/lib/event-stream.js.map +1 -0
  72. package/dist/lib/fs-browser.d.ts +30 -0
  73. package/dist/lib/fs-browser.js +287 -0
  74. package/dist/lib/fs-browser.js.map +1 -0
  75. package/dist/lib/host-mcp/logs.d.ts +19 -0
  76. package/dist/lib/host-mcp/logs.js +102 -0
  77. package/dist/lib/host-mcp/logs.js.map +1 -0
  78. package/dist/lib/host-mcp/platform.d.ts +24 -0
  79. package/dist/lib/host-mcp/platform.js +133 -0
  80. package/dist/lib/host-mcp/platform.js.map +1 -0
  81. package/dist/lib/host-mcp/screens.d.ts +22 -0
  82. package/dist/lib/host-mcp/screens.js +172 -0
  83. package/dist/lib/host-mcp/screens.js.map +1 -0
  84. package/dist/lib/host-mcp/server.d.ts +3 -0
  85. package/dist/lib/host-mcp/server.js +233 -0
  86. package/dist/lib/host-mcp/server.js.map +1 -0
  87. package/dist/lib/host-mcp/tools.d.ts +172 -0
  88. package/dist/lib/host-mcp/tools.js +1241 -0
  89. package/dist/lib/host-mcp/tools.js.map +1 -0
  90. package/dist/lib/instance-heartbeat.d.ts +55 -0
  91. package/dist/lib/instance-heartbeat.js +118 -0
  92. package/dist/lib/instance-heartbeat.js.map +1 -0
  93. package/dist/lib/legacy-import.d.ts +17 -0
  94. package/dist/lib/legacy-import.js +70 -0
  95. package/dist/lib/legacy-import.js.map +1 -0
  96. package/dist/lib/logging.d.ts +3 -0
  97. package/dist/lib/logging.js +65 -0
  98. package/dist/lib/logging.js.map +1 -0
  99. package/dist/lib/managed-agent-context.d.ts +25 -0
  100. package/dist/lib/managed-agent-context.js +33 -0
  101. package/dist/lib/managed-agent-context.js.map +1 -0
  102. package/dist/lib/managed-agent-store.d.ts +34 -0
  103. package/dist/lib/managed-agent-store.js +160 -0
  104. package/dist/lib/managed-agent-store.js.map +1 -0
  105. package/dist/lib/managed-agents.d.ts +24 -0
  106. package/dist/lib/managed-agents.js +87 -0
  107. package/dist/lib/managed-agents.js.map +1 -0
  108. package/dist/lib/mcp-client.d.ts +8 -0
  109. package/dist/lib/mcp-client.js +122 -0
  110. package/dist/lib/mcp-client.js.map +1 -0
  111. package/dist/lib/orphan-cleanup.d.ts +6 -0
  112. package/dist/lib/orphan-cleanup.js +108 -0
  113. package/dist/lib/orphan-cleanup.js.map +1 -0
  114. package/dist/lib/presence-heartbeat.d.ts +8 -0
  115. package/dist/lib/presence-heartbeat.js +61 -0
  116. package/dist/lib/presence-heartbeat.js.map +1 -0
  117. package/dist/lib/prompts.d.ts +29 -0
  118. package/dist/lib/prompts.js +208 -0
  119. package/dist/lib/prompts.js.map +1 -0
  120. package/dist/lib/rest.d.ts +61 -0
  121. package/dist/lib/rest.js +307 -0
  122. package/dist/lib/rest.js.map +1 -0
  123. package/dist/lib/run-provisioner.d.ts +21 -0
  124. package/dist/lib/run-provisioner.js +115 -0
  125. package/dist/lib/run-provisioner.js.map +1 -0
  126. package/dist/lib/self-path.d.ts +7 -0
  127. package/dist/lib/self-path.js +29 -0
  128. package/dist/lib/self-path.js.map +1 -0
  129. package/dist/lib/self-update.d.ts +46 -0
  130. package/dist/lib/self-update.js +482 -0
  131. package/dist/lib/self-update.js.map +1 -0
  132. package/dist/lib/service-install.d.ts +23 -0
  133. package/dist/lib/service-install.js +673 -0
  134. package/dist/lib/service-install.js.map +1 -0
  135. package/dist/lib/setup.d.ts +16 -0
  136. package/dist/lib/setup.js +157 -0
  137. package/dist/lib/setup.js.map +1 -0
  138. package/dist/lib/subagent-manager.d.ts +84 -0
  139. package/dist/lib/subagent-manager.js +793 -0
  140. package/dist/lib/subagent-manager.js.map +1 -0
  141. package/dist/lib/subagent-monitor.d.ts +43 -0
  142. package/dist/lib/subagent-monitor.js +229 -0
  143. package/dist/lib/subagent-monitor.js.map +1 -0
  144. package/dist/lib/ticket-session-manager.d.ts +23 -0
  145. package/dist/lib/ticket-session-manager.js +471 -0
  146. package/dist/lib/ticket-session-manager.js.map +1 -0
  147. package/dist/lib/worktree-manager.d.ts +39 -0
  148. package/dist/lib/worktree-manager.js +226 -0
  149. package/dist/lib/worktree-manager.js.map +1 -0
  150. package/dist/main.d.ts +2 -0
  151. package/dist/main.js +670 -0
  152. package/dist/main.js.map +1 -0
  153. package/dist/package.json +57 -0
  154. package/package.json +57 -0
@@ -0,0 +1,177 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { accessSync, constants as fsConstants, readlinkSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { join, basename } from 'node:path';
5
+ import { KNOWN_CLI_TYPES } from './constants.js';
6
+ import { log } from './logging.js';
7
+ const isWindows = process.platform === 'win32';
8
+ const WIN_EXEC_EXT = /\.exe$/i;
9
+ function canExec(p) {
10
+ if (!p)
11
+ return false;
12
+ if (isWindows && !WIN_EXEC_EXT.test(p))
13
+ return false;
14
+ try {
15
+ accessSync(p, fsConstants.X_OK);
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ const CANDIDATE_PROVIDERS = {
23
+ claude: { unix: claudeUnixCandidates, windows: claudeWindowsCandidates },
24
+ agy: { unix: agyUnixCandidates, windows: agyWindowsCandidates },
25
+ codex: { unix: codexUnixCandidates, windows: codexWindowsCandidates },
26
+ };
27
+ function parentExeMatching(nameRegex) {
28
+ try {
29
+ const ppid = process.ppid;
30
+ if (!ppid)
31
+ return null;
32
+ const exe = readlinkSync(`/proc/${ppid}/exe`);
33
+ if (!exe || !canExec(exe))
34
+ return null;
35
+ if (/\.vscode\/extensions\//.test(exe))
36
+ return null;
37
+ if (!nameRegex.test(basename(exe)))
38
+ return null;
39
+ return exe;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ const cache = new Map();
46
+ export function resolveCliBin(cliType, configured) {
47
+ const ct = String(cliType || 'claude').toLowerCase();
48
+ const cached = cache.get(ct);
49
+ if (cached)
50
+ return cached;
51
+ if (configured && configured !== ct) {
52
+ if (KNOWN_CLI_TYPES.includes(configured)) {
53
+ log(`[cli-resolver:${ct}] ignoring configured="${configured}" — it names a different known CLI; falling through to lookup`);
54
+ }
55
+ else {
56
+ cache.set(ct, configured);
57
+ log(`[cli-resolver:${ct}] using configured path: ${configured}`);
58
+ return configured;
59
+ }
60
+ }
61
+ if (ct === 'claude') {
62
+ const viaParent = parentExeMatching(/claude/i);
63
+ if (viaParent) {
64
+ cache.set(ct, viaParent);
65
+ log(`[cli-resolver:claude] resolved via parent /proc/${process.ppid}/exe: ${viaParent}`);
66
+ return viaParent;
67
+ }
68
+ }
69
+ try {
70
+ const cmd = isWindows
71
+ ? `where ${ct}`
72
+ : `command -v ${ct} 2>/dev/null || which ${ct} 2>/dev/null`;
73
+ const out = execSync(cmd, {
74
+ encoding: 'utf8',
75
+ timeout: 2000,
76
+ shell: isWindows ? undefined : '/bin/sh',
77
+ }).trim();
78
+ const lines = out
79
+ .split(/\r?\n/)
80
+ .map((s) => s.trim())
81
+ .filter(Boolean);
82
+ for (const cand of lines) {
83
+ if (canExec(cand)) {
84
+ cache.set(ct, cand);
85
+ log(`[cli-resolver:${ct}] resolved via shell: ${cand}`);
86
+ return cand;
87
+ }
88
+ }
89
+ }
90
+ catch {
91
+ }
92
+ const provider = CANDIDATE_PROVIDERS[ct];
93
+ if (provider) {
94
+ const home = homedir();
95
+ const candidates = isWindows ? provider.windows(home) : provider.unix(home);
96
+ for (const p of candidates) {
97
+ if (canExec(p)) {
98
+ cache.set(ct, p);
99
+ log(`[cli-resolver:${ct}] resolved via candidate: ${p}`);
100
+ return p;
101
+ }
102
+ }
103
+ }
104
+ cache.set(ct, ct);
105
+ log(`[cli-resolver:${ct}] resolution failed; falling back to literal "${ct}" (expect ENOENT unless PATH is set)`);
106
+ return ct;
107
+ }
108
+ export function _resetResolverCache() {
109
+ cache.clear();
110
+ }
111
+ function claudeUnixCandidates(home) {
112
+ return [
113
+ join(home, '.npm-global/bin/claude'),
114
+ join(home, '.bun/bin/claude'),
115
+ join(home, '.local/bin/claude'),
116
+ join(home, '.volta/bin/claude'),
117
+ join(home, '.npm-packages/bin/claude'),
118
+ join(home, 'node_modules/.bin/claude'),
119
+ '/usr/local/bin/claude',
120
+ '/opt/homebrew/bin/claude',
121
+ '/usr/bin/claude',
122
+ ];
123
+ }
124
+ function claudeWindowsCandidates(home) {
125
+ const appdata = process.env.APPDATA || join(home, 'AppData', 'Roaming');
126
+ const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');
127
+ const pkgBin = join(appdata, 'npm', 'node_modules', '@anthropic-ai', 'claude-code', 'bin');
128
+ return [
129
+ join(pkgBin, 'claude.exe'),
130
+ join(appdata, 'npm', 'claude.exe'),
131
+ join(localAppData, 'Programs', 'anthropic', 'claude-code', 'claude.exe'),
132
+ ];
133
+ }
134
+ function agyUnixCandidates(home) {
135
+ return [
136
+ join(home, '.local/bin/agy'),
137
+ join(home, '.npm-global/bin/agy'),
138
+ join(home, '.bun/bin/agy'),
139
+ join(home, '.volta/bin/agy'),
140
+ join(home, '.npm-packages/bin/agy'),
141
+ join(home, 'node_modules/.bin/agy'),
142
+ '/usr/local/bin/agy',
143
+ '/opt/homebrew/bin/agy',
144
+ '/usr/bin/agy',
145
+ ];
146
+ }
147
+ function agyWindowsCandidates(home) {
148
+ const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');
149
+ return [
150
+ join(localAppData, 'Antigravity', 'agy.exe'),
151
+ join(localAppData, 'Programs', 'google', 'antigravity', 'agy.exe'),
152
+ ];
153
+ }
154
+ function codexUnixCandidates(home) {
155
+ return [
156
+ join(home, '.npm-global/bin/codex'),
157
+ join(home, '.bun/bin/codex'),
158
+ join(home, '.local/bin/codex'),
159
+ join(home, '.volta/bin/codex'),
160
+ join(home, '.npm-packages/bin/codex'),
161
+ join(home, 'node_modules/.bin/codex'),
162
+ '/usr/local/bin/codex',
163
+ '/opt/homebrew/bin/codex',
164
+ '/usr/bin/codex',
165
+ ];
166
+ }
167
+ function codexWindowsCandidates(home) {
168
+ const appdata = process.env.APPDATA || join(home, 'AppData', 'Roaming');
169
+ const localAppData = process.env.LOCALAPPDATA || join(home, 'AppData', 'Local');
170
+ const pkgBin = join(appdata, 'npm', 'node_modules', '@openai', 'codex', 'bin');
171
+ return [
172
+ join(pkgBin, 'codex.exe'),
173
+ join(appdata, 'npm', 'codex.exe'),
174
+ join(localAppData, 'Programs', 'openai', 'codex', 'codex.exe'),
175
+ ];
176
+ }
177
+ //# sourceMappingURL=cli-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-resolver.js","sourceRoot":"","sources":["../../src/lib/cli-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CliType } from './constants.js';
2
+ import type { AwbConfig } from './rest.js';
3
+ export interface AgentInfo {
4
+ agent_id: string | null;
5
+ agent_name?: string;
6
+ workspace_id?: string;
7
+ _note?: string;
8
+ [key: string]: unknown;
9
+ }
10
+ export declare function loadConfig(path?: string): AwbConfig | null;
11
+ export declare function loadAgentInfo(path?: string): AgentInfo | null;
12
+ export declare function resolveAgentId(config: AwbConfig, agentPath?: string): Promise<string | null>;
13
+ export declare function getCliType(config: AwbConfig | null | undefined): CliType;
@@ -0,0 +1,124 @@
1
+ import { existsSync, readFileSync, promises as fsp } from 'node:fs';
2
+ import { AGENT_PATH, CONFIG_PATH, DELEGATION_DEFAULTS, KNOWN_CLI_TYPES, REQUEST_TIMEOUT_MS, } from './constants.js';
3
+ import { log } from './logging.js';
4
+ export function loadConfig(path = CONFIG_PATH) {
5
+ if (!existsSync(path))
6
+ return null;
7
+ try {
8
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
9
+ raw.delegation = { ...DELEGATION_DEFAULTS, ...(raw.delegation || {}) };
10
+ const cli = String(raw.cli || 'claude').toLowerCase().trim();
11
+ raw.cli = cli || 'claude';
12
+ if (!KNOWN_CLI_TYPES.includes(raw.cli)) {
13
+ log(`config.cli="${raw.cli}" is not a known CLI; valid: ${KNOWN_CLI_TYPES.join(', ')}. Adapter will fall back at creation.`);
14
+ }
15
+ return raw;
16
+ }
17
+ catch (err) {
18
+ log(`config load failed (${path}): ${err?.message ?? err}`);
19
+ return null;
20
+ }
21
+ }
22
+ export function loadAgentInfo(path = AGENT_PATH) {
23
+ if (!existsSync(path))
24
+ return null;
25
+ try {
26
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
27
+ return raw && typeof raw === 'object' ? raw : null;
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ }
33
+ export async function resolveAgentId(config, agentPath = AGENT_PATH) {
34
+ const info = loadAgentInfo(agentPath);
35
+ if (!info)
36
+ return null;
37
+ if (typeof info.agent_id === 'string' && info.agent_id)
38
+ return info.agent_id;
39
+ log('agent_id is null — resolving via MCP whoami...');
40
+ const base = config.url.replace(/\/$/, '');
41
+ const url = `${base}/mcp`;
42
+ const headers = {
43
+ Authorization: `Bearer ${config.apiKey}`,
44
+ 'Content-Type': 'application/json',
45
+ Accept: 'application/json, text/event-stream',
46
+ };
47
+ try {
48
+ const initResp = await fetch(url, {
49
+ method: 'POST',
50
+ headers,
51
+ body: JSON.stringify({
52
+ jsonrpc: '2.0',
53
+ id: 1,
54
+ method: 'initialize',
55
+ params: {
56
+ protocolVersion: '2025-03-26',
57
+ capabilities: { experimental: { 'awb/schemaVersion': { version: 2 } } },
58
+ clientInfo: { name: 'awb-agent-resolve', version: '1.0.0' },
59
+ },
60
+ }),
61
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
62
+ });
63
+ if (!initResp.ok)
64
+ throw new Error(`initialize HTTP ${initResp.status}`);
65
+ const sid = initResp.headers.get('mcp-session-id');
66
+ if (!sid)
67
+ throw new Error('initialize did not return Mcp-Session-Id');
68
+ await initResp.text().catch(() => null);
69
+ const sessionHeaders = { ...headers, 'Mcp-Session-Id': sid };
70
+ await fetch(url, {
71
+ method: 'POST',
72
+ headers: sessionHeaders,
73
+ body: JSON.stringify({ jsonrpc: '2.0', method: 'notifications/initialized' }),
74
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
75
+ }).then((r) => r.text().catch(() => null));
76
+ const whoamiResp = await fetch(url, {
77
+ method: 'POST',
78
+ headers: sessionHeaders,
79
+ body: JSON.stringify({
80
+ jsonrpc: '2.0',
81
+ id: 2,
82
+ method: 'tools/call',
83
+ params: { name: 'whoami', arguments: {} },
84
+ }),
85
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
86
+ });
87
+ if (!whoamiResp.ok)
88
+ throw new Error(`whoami HTTP ${whoamiResp.status}`);
89
+ const whoamiBody = await whoamiResp.json();
90
+ fetch(url, {
91
+ method: 'DELETE',
92
+ headers: sessionHeaders,
93
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
94
+ })
95
+ .then((r) => r.text().catch(() => null))
96
+ .catch(() => {
97
+ });
98
+ const content = whoamiBody?.result?.content;
99
+ if (!Array.isArray(content) || !content[0]?.text) {
100
+ throw new Error('unexpected whoami response shape');
101
+ }
102
+ const parsed = JSON.parse(content[0].text);
103
+ const agentId = parsed?.agent_id;
104
+ if (!agentId || typeof agentId !== 'string') {
105
+ throw new Error(`whoami returned no agent_id: ${content[0].text}`);
106
+ }
107
+ info.agent_id = agentId;
108
+ info._note = `agent_id resolved automatically by agent-manager at ${new Date().toISOString()}`;
109
+ await fsp.writeFile(agentPath, JSON.stringify(info, null, 2) + '\n', 'utf8');
110
+ log(`agent_id resolved: ${agentId.slice(0, 8)}...`);
111
+ return agentId;
112
+ }
113
+ catch (err) {
114
+ log(`agent_id resolve failed: ${err?.message ?? err}`);
115
+ return null;
116
+ }
117
+ }
118
+ export function getCliType(config) {
119
+ const raw = String(config?.cli ?? 'claude').toLowerCase().trim();
120
+ if (KNOWN_CLI_TYPES.includes(raw))
121
+ return raw;
122
+ return 'claude';
123
+ }
124
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare const AGENT_MANAGER_HOME: string;
2
+ export declare const CONFIG_PATH: string;
3
+ export declare const AGENT_PATH: string;
4
+ export declare const SUBAGENTS_BASE_DIR: string;
5
+ export declare const SUBAGENTS_PERSIST_PATH: string;
6
+ export declare const INSTANCES_DIR: string;
7
+ export declare const MANAGED_AGENTS_DIR: string;
8
+ export declare const LOG_DIR: string;
9
+ export declare const LOG_PATH: string;
10
+ export declare const LEGACY_PLUGIN_HOME: string;
11
+ export declare const LEGACY_CONFIG_PATH: string;
12
+ export declare const LEGACY_AGENT_PATH: string;
13
+ export declare const LEGACY_LOCK_PATH: string;
14
+ export declare const LEGACY_MIGRATION_MARKER: string;
15
+ export declare const RECONNECT_INITIAL_MS = 2000;
16
+ export declare const RECONNECT_MAX_MS = 30000;
17
+ export declare const REQUEST_TIMEOUT_MS = 30000;
18
+ export declare const HEARTBEAT_INTERVAL_MS = 30000;
19
+ export declare const OUTPUT_LIVENESS_MIN_INTERVAL_MS = 15000;
20
+ export declare const DELEGATION_DEFAULTS: Readonly<{
21
+ enabled: true;
22
+ maxConcurrent: 15;
23
+ ttlMinutes: 15;
24
+ claudeBin: "claude";
25
+ appendSystemPromptMode: "role_only";
26
+ persistentChatSessions: true;
27
+ persistentTicketSessions: true;
28
+ idleMinutes: 10;
29
+ maxTurnsPerSession: 30;
30
+ worktreeIsolation: true;
31
+ }>;
32
+ export declare const TTL_SWEEP_INTERVAL_MS = 60000;
33
+ export declare const SIGTERM_GRACE_MS = 5000;
34
+ export declare const STOP_GRACE_MS = 2000;
35
+ export declare const KNOWN_CLI_TYPES: readonly ["claude", "deepseek", "codex", "antigravity"];
36
+ export type CliType = (typeof KNOWN_CLI_TYPES)[number];
@@ -0,0 +1,51 @@
1
+ import { join } from 'node:path';
2
+ import { homedir, platform } from 'node:os';
3
+ function configBaseDir() {
4
+ if (process.env.AWB_AGENT_MANAGER_HOME)
5
+ return process.env.AWB_AGENT_MANAGER_HOME;
6
+ if (platform() === 'win32') {
7
+ const appdata = process.env.APPDATA;
8
+ if (appdata)
9
+ return join(appdata, 'awb-agent-manager');
10
+ }
11
+ const xdg = process.env.XDG_CONFIG_HOME;
12
+ if (xdg)
13
+ return join(xdg, 'awb-agent-manager');
14
+ return join(homedir(), '.config', 'awb-agent-manager');
15
+ }
16
+ export const AGENT_MANAGER_HOME = configBaseDir();
17
+ export const CONFIG_PATH = join(AGENT_MANAGER_HOME, 'config.json');
18
+ export const AGENT_PATH = join(AGENT_MANAGER_HOME, 'agent.json');
19
+ export const SUBAGENTS_BASE_DIR = join(AGENT_MANAGER_HOME, 'subagents');
20
+ export const SUBAGENTS_PERSIST_PATH = join(AGENT_MANAGER_HOME, 'subagents.json');
21
+ export const INSTANCES_DIR = join(AGENT_MANAGER_HOME, 'instances');
22
+ export const MANAGED_AGENTS_DIR = join(AGENT_MANAGER_HOME, 'agents');
23
+ export const LOG_DIR = AGENT_MANAGER_HOME;
24
+ export const LOG_PATH = join(LOG_DIR, 'agent-manager.log');
25
+ export const LEGACY_PLUGIN_HOME = join(process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), '.claude'), 'channels', 'awb');
26
+ export const LEGACY_CONFIG_PATH = join(LEGACY_PLUGIN_HOME, 'config.json');
27
+ export const LEGACY_AGENT_PATH = join(LEGACY_PLUGIN_HOME, 'agent.json');
28
+ export const LEGACY_LOCK_PATH = join(LEGACY_PLUGIN_HOME, 'agent.lock');
29
+ export const LEGACY_MIGRATION_MARKER = join(LEGACY_PLUGIN_HOME, 'MIGRATED-TO-AGENT-MANAGER.txt');
30
+ export const RECONNECT_INITIAL_MS = 2000;
31
+ export const RECONNECT_MAX_MS = 30000;
32
+ export const REQUEST_TIMEOUT_MS = 30000;
33
+ export const HEARTBEAT_INTERVAL_MS = 30_000;
34
+ export const OUTPUT_LIVENESS_MIN_INTERVAL_MS = 15_000;
35
+ export const DELEGATION_DEFAULTS = Object.freeze({
36
+ enabled: true,
37
+ maxConcurrent: 15,
38
+ ttlMinutes: 15,
39
+ claudeBin: 'claude',
40
+ appendSystemPromptMode: 'role_only',
41
+ persistentChatSessions: true,
42
+ persistentTicketSessions: true,
43
+ idleMinutes: 10,
44
+ maxTurnsPerSession: 30,
45
+ worktreeIsolation: true,
46
+ });
47
+ export const TTL_SWEEP_INTERVAL_MS = 60_000;
48
+ export const SIGTERM_GRACE_MS = 5_000;
49
+ export const STOP_GRACE_MS = 2_000;
50
+ export const KNOWN_CLI_TYPES = ['claude', 'deepseek', 'codex', 'antigravity'];
51
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface ResolvedEnvironmentRepository {
2
+ url: string;
3
+ target_dir: string;
4
+ branch: string;
5
+ post_clone_commands: string[];
6
+ }
7
+ export interface ResolvedEnvironmentConfig {
8
+ repositories: ResolvedEnvironmentRepository[];
9
+ env_vars: Record<string, string>;
10
+ setup_commands: string[];
11
+ setup_timeout_seconds: number;
12
+ version: number;
13
+ }
14
+ export interface ProvisionArgs {
15
+ agentId: string;
16
+ config: ResolvedEnvironmentConfig;
17
+ ticketId?: string;
18
+ }
19
+ export interface ProvisionResult {
20
+ ok: boolean;
21
+ skipped: boolean;
22
+ fingerprint: string;
23
+ steps: string[];
24
+ error?: string;
25
+ reported?: boolean;
26
+ }
27
+ export declare function fingerprintEnvironment(config: ResolvedEnvironmentConfig): string;
28
+ export declare class EnvironmentProvisioner {
29
+ #private;
30
+ provision(args: ProvisionArgs): Promise<ProvisionResult>;
31
+ }
@@ -0,0 +1,182 @@
1
+ import { promises as fsp } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { execFile, exec } from 'node:child_process';
4
+ import { createHash } from 'node:crypto';
5
+ import { MANAGED_AGENTS_DIR } from './constants.js';
6
+ import { log } from './logging.js';
7
+ const FAILED_COOLDOWN_MS = 5 * 60 * 1000;
8
+ function gitRaw(args, cwd, timeoutMs) {
9
+ return new Promise((resolve) => {
10
+ execFile('git', args, { cwd, timeout: timeoutMs, maxBuffer: 8 * 1024 * 1024, windowsHide: true }, (err, stdout, stderr) => {
11
+ resolve({
12
+ ok: !err,
13
+ code: err?.code ?? 0,
14
+ stdout: (stdout ?? '').toString(),
15
+ stderr: (stderr ?? err?.message ?? '').toString(),
16
+ });
17
+ });
18
+ });
19
+ }
20
+ function runShell(command, cwd, env, timeoutMs) {
21
+ return new Promise((resolve) => {
22
+ exec(command, { cwd, env, timeout: timeoutMs, maxBuffer: 16 * 1024 * 1024, windowsHide: true }, (err, stdout, stderr) => {
23
+ resolve({
24
+ ok: !err,
25
+ code: err?.code ?? 0,
26
+ stdout: (stdout ?? '').toString(),
27
+ stderr: (stderr ?? err?.message ?? '').toString(),
28
+ });
29
+ });
30
+ });
31
+ }
32
+ function stableStringify(value) {
33
+ if (value === null || typeof value !== 'object')
34
+ return JSON.stringify(value);
35
+ if (Array.isArray(value))
36
+ return `[${value.map(stableStringify).join(',')}]`;
37
+ const obj = value;
38
+ const keys = Object.keys(obj).sort();
39
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${stableStringify(obj[k])}`).join(',')}}`;
40
+ }
41
+ export function fingerprintEnvironment(config) {
42
+ return createHash('sha256').update(stableStringify(config)).digest('hex').slice(0, 32);
43
+ }
44
+ async function pathExists(p) {
45
+ try {
46
+ await fsp.access(p);
47
+ return true;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ export class EnvironmentProvisioner {
54
+ #inflight = new Map();
55
+ async provision(args) {
56
+ const fingerprint = fingerprintEnvironment(args.config);
57
+ const lockKey = `${args.agentId}::${fingerprint}`;
58
+ const existing = this.#inflight.get(lockKey);
59
+ if (existing)
60
+ return existing;
61
+ const run = this.#run(args, fingerprint).finally(() => this.#inflight.delete(lockKey));
62
+ this.#inflight.set(lockKey, run);
63
+ return run;
64
+ }
65
+ async #run(args, fingerprint) {
66
+ const agentDir = join(MANAGED_AGENTS_DIR, args.agentId);
67
+ const envDir = join(agentDir, 'env');
68
+ const markerPath = join(envDir, `${fingerprint}.json`);
69
+ const failedPath = join(envDir, `${fingerprint}.failed.json`);
70
+ const steps = [];
71
+ if (await pathExists(markerPath)) {
72
+ return { ok: true, skipped: true, fingerprint, steps };
73
+ }
74
+ const recentFailure = await this.#readRecentFailure(failedPath);
75
+ if (recentFailure) {
76
+ log(`[env-provision] cooldown active for agent=${args.agentId.slice(0, 8)} fp=${fingerprint.slice(0, 8)} (last failure ${recentFailure})`);
77
+ return {
78
+ ok: false,
79
+ skipped: false,
80
+ fingerprint,
81
+ steps,
82
+ error: `environment provisioning previously failed (cooling down): ${recentFailure}`,
83
+ reported: true,
84
+ };
85
+ }
86
+ const timeoutMs = Math.max(1, args.config.setup_timeout_seconds) * 1000;
87
+ const env = { ...process.env, ...(args.config.env_vars || {}) };
88
+ try {
89
+ await fsp.mkdir(envDir, { recursive: true });
90
+ for (const repo of args.config.repositories || []) {
91
+ await this.#prepareRepo(repo, agentDir, env, timeoutMs, steps);
92
+ }
93
+ for (const cmd of args.config.setup_commands || []) {
94
+ log(`[env-provision] setup: ${cmd} (agent=${args.agentId.slice(0, 8)})`);
95
+ const r = await runShell(cmd, agentDir, env, timeoutMs);
96
+ steps.push(`setup [${'.'}] ${cmd} → ${r.ok ? 'ok' : `FAIL(${r.code})`}`);
97
+ if (!r.ok) {
98
+ throw new Error(`setup command failed (exit ${r.code}): ${cmd}\n${tail(r.stderr)}`);
99
+ }
100
+ }
101
+ await fsp.writeFile(markerPath, JSON.stringify({
102
+ fingerprint,
103
+ applied_at: new Date().toISOString(),
104
+ version: args.config.version,
105
+ repositories: (args.config.repositories || []).map((r) => r.target_dir),
106
+ }, null, 2));
107
+ await fsp.rm(failedPath, { force: true }).catch(() => { });
108
+ log(`[env-provision] ready: agent=${args.agentId.slice(0, 8)} fp=${fingerprint.slice(0, 8)} repos=${(args.config.repositories || []).length} setup=${(args.config.setup_commands || []).length}`);
109
+ return { ok: true, skipped: false, fingerprint, steps };
110
+ }
111
+ catch (err) {
112
+ const error = String(err?.message ?? err);
113
+ log(`[env-provision] FAILED: agent=${args.agentId.slice(0, 8)} fp=${fingerprint.slice(0, 8)}: ${error}`);
114
+ await fsp
115
+ .writeFile(failedPath, JSON.stringify({ fingerprint, failed_at: new Date().toISOString(), error, steps }, null, 2))
116
+ .catch(() => { });
117
+ return { ok: false, skipped: false, fingerprint, steps, error };
118
+ }
119
+ }
120
+ async #prepareRepo(repo, agentDir, env, timeoutMs, steps) {
121
+ const dest = join(agentDir, repo.target_dir);
122
+ const gitDir = join(dest, '.git');
123
+ let fresh = false;
124
+ if (await pathExists(gitDir)) {
125
+ const fetched = await gitRaw(['-C', dest, 'fetch', '--all', '--prune'], undefined, timeoutMs);
126
+ steps.push(`fetch ${repo.target_dir} → ${fetched.ok ? 'ok' : `FAIL: ${tail(fetched.stderr)}`}`);
127
+ if (!fetched.ok) {
128
+ throw new Error(`git fetch failed for ${repo.target_dir}: ${tail(fetched.stderr)}`);
129
+ }
130
+ if (repo.branch) {
131
+ const co = await gitRaw(['-C', dest, 'checkout', repo.branch], undefined, timeoutMs);
132
+ steps.push(`checkout ${repo.branch} in ${repo.target_dir} → ${co.ok ? 'ok' : `skip: ${tail(co.stderr)}`}`);
133
+ }
134
+ const pulled = await gitRaw(['-C', dest, 'pull', '--ff-only'], undefined, timeoutMs);
135
+ steps.push(`pull --ff-only ${repo.target_dir} → ${pulled.ok ? 'ok' : `non-ff (left as-is): ${tail(pulled.stderr)}`}`);
136
+ }
137
+ else {
138
+ await fsp.mkdir(dirname(dest), { recursive: true });
139
+ const args = ['clone'];
140
+ if (repo.branch)
141
+ args.push('--branch', repo.branch);
142
+ args.push(repo.url, dest);
143
+ log(`[env-provision] clone ${repo.url} → ${repo.target_dir}`);
144
+ const cloned = await gitRaw(args, undefined, timeoutMs);
145
+ steps.push(`clone ${repo.url} → ${repo.target_dir} ${cloned.ok ? 'ok' : `FAIL: ${tail(cloned.stderr)}`}`);
146
+ if (!cloned.ok) {
147
+ throw new Error(`git clone failed for ${repo.url}: ${tail(cloned.stderr)}`);
148
+ }
149
+ fresh = true;
150
+ }
151
+ if (fresh) {
152
+ for (const cmd of repo.post_clone_commands || []) {
153
+ log(`[env-provision] post_clone [${repo.target_dir}]: ${cmd}`);
154
+ const r = await runShell(cmd, dest, env, timeoutMs);
155
+ steps.push(`post_clone [${repo.target_dir}] ${cmd} → ${r.ok ? 'ok' : `FAIL(${r.code})`}`);
156
+ if (!r.ok) {
157
+ throw new Error(`post_clone command failed (exit ${r.code}) in ${repo.target_dir}: ${cmd}\n${tail(r.stderr)}`);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ async #readRecentFailure(failedPath) {
163
+ try {
164
+ const raw = await fsp.readFile(failedPath, 'utf8');
165
+ const parsed = JSON.parse(raw);
166
+ const failedAt = Date.parse(parsed?.failed_at || '');
167
+ if (!Number.isFinite(failedAt))
168
+ return null;
169
+ if (Date.now() - failedAt > FAILED_COOLDOWN_MS)
170
+ return null;
171
+ return String(parsed?.error || 'unknown error');
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ }
177
+ }
178
+ function tail(s, n = 1500) {
179
+ const t = (s || '').trim();
180
+ return t.length > n ? `…${t.slice(-n)}` : t;
181
+ }
182
+ //# sourceMappingURL=environment-provisioner.js.map