agent-life-bridge 0.1.1

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 (195) hide show
  1. package/.env.example +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +350 -0
  4. package/bin/agent-life-bridge.mjs +13 -0
  5. package/config.example.json +130 -0
  6. package/config.multi-agent.example.json +88 -0
  7. package/dist/agents/agent-life-session-map-store.d.ts +21 -0
  8. package/dist/agents/agent-life-session-map-store.d.ts.map +1 -0
  9. package/dist/agents/agent-life-session-map-store.js +78 -0
  10. package/dist/agents/agent-life-session-map-store.js.map +1 -0
  11. package/dist/agents/agent-resolver.d.ts +12 -0
  12. package/dist/agents/agent-resolver.d.ts.map +1 -0
  13. package/dist/agents/agent-resolver.js +114 -0
  14. package/dist/agents/agent-resolver.js.map +1 -0
  15. package/dist/agents/agent-router.d.ts +8 -0
  16. package/dist/agents/agent-router.d.ts.map +1 -0
  17. package/dist/agents/agent-router.js +72 -0
  18. package/dist/agents/agent-router.js.map +1 -0
  19. package/dist/agents/cli-backends.d.ts +25 -0
  20. package/dist/agents/cli-backends.d.ts.map +1 -0
  21. package/dist/agents/cli-backends.js +252 -0
  22. package/dist/agents/cli-backends.js.map +1 -0
  23. package/dist/agents/cli-output.d.ts +43 -0
  24. package/dist/agents/cli-output.d.ts.map +1 -0
  25. package/dist/agents/cli-output.js +352 -0
  26. package/dist/agents/cli-output.js.map +1 -0
  27. package/dist/agents/cli-runner.d.ts +32 -0
  28. package/dist/agents/cli-runner.d.ts.map +1 -0
  29. package/dist/agents/cli-runner.js +861 -0
  30. package/dist/agents/cli-runner.js.map +1 -0
  31. package/dist/agents/cli-session-store.d.ts +53 -0
  32. package/dist/agents/cli-session-store.d.ts.map +1 -0
  33. package/dist/agents/cli-session-store.js +263 -0
  34. package/dist/agents/cli-session-store.js.map +1 -0
  35. package/dist/agents/codex-app-server-runtime.d.ts +80 -0
  36. package/dist/agents/codex-app-server-runtime.d.ts.map +1 -0
  37. package/dist/agents/codex-app-server-runtime.js +1049 -0
  38. package/dist/agents/codex-app-server-runtime.js.map +1 -0
  39. package/dist/agents/fch-runtime-context.d.ts +28 -0
  40. package/dist/agents/fch-runtime-context.d.ts.map +1 -0
  41. package/dist/agents/fch-runtime-context.js +65 -0
  42. package/dist/agents/fch-runtime-context.js.map +1 -0
  43. package/dist/agents/model-selection.d.ts +28 -0
  44. package/dist/agents/model-selection.d.ts.map +1 -0
  45. package/dist/agents/model-selection.js +40 -0
  46. package/dist/agents/model-selection.js.map +1 -0
  47. package/dist/agents/models-config.d.ts +28 -0
  48. package/dist/agents/models-config.d.ts.map +1 -0
  49. package/dist/agents/models-config.js +43 -0
  50. package/dist/agents/models-config.js.map +1 -0
  51. package/dist/channels/agent-life.d.ts +9 -0
  52. package/dist/channels/agent-life.d.ts.map +1 -0
  53. package/dist/channels/agent-life.js +407 -0
  54. package/dist/channels/agent-life.js.map +1 -0
  55. package/dist/channels/command-gating.d.ts +20 -0
  56. package/dist/channels/command-gating.d.ts.map +1 -0
  57. package/dist/channels/command-gating.js +43 -0
  58. package/dist/channels/command-gating.js.map +1 -0
  59. package/dist/channels/draft-stream-controls.d.ts +21 -0
  60. package/dist/channels/draft-stream-controls.d.ts.map +1 -0
  61. package/dist/channels/draft-stream-controls.js +43 -0
  62. package/dist/channels/draft-stream-controls.js.map +1 -0
  63. package/dist/channels/draft-stream-loop.d.ts +31 -0
  64. package/dist/channels/draft-stream-loop.d.ts.map +1 -0
  65. package/dist/channels/draft-stream-loop.js +60 -0
  66. package/dist/channels/draft-stream-loop.js.map +1 -0
  67. package/dist/channels/mention-gating.d.ts +18 -0
  68. package/dist/channels/mention-gating.d.ts.map +1 -0
  69. package/dist/channels/mention-gating.js +20 -0
  70. package/dist/channels/mention-gating.js.map +1 -0
  71. package/dist/channels/registry.d.ts +5 -0
  72. package/dist/channels/registry.d.ts.map +1 -0
  73. package/dist/channels/registry.js +14 -0
  74. package/dist/channels/registry.js.map +1 -0
  75. package/dist/channels/run-state-machine.d.ts +21 -0
  76. package/dist/channels/run-state-machine.d.ts.map +1 -0
  77. package/dist/channels/run-state-machine.js +41 -0
  78. package/dist/channels/run-state-machine.js.map +1 -0
  79. package/dist/channels/session-envelope.d.ts +5 -0
  80. package/dist/channels/session-envelope.d.ts.map +1 -0
  81. package/dist/channels/session-envelope.js +16 -0
  82. package/dist/channels/session-envelope.js.map +1 -0
  83. package/dist/channels/session-id.d.ts +3 -0
  84. package/dist/channels/session-id.d.ts.map +1 -0
  85. package/dist/channels/session-id.js +11 -0
  86. package/dist/channels/session-id.js.map +1 -0
  87. package/dist/channels/session.d.ts +18 -0
  88. package/dist/channels/session.d.ts.map +1 -0
  89. package/dist/channels/session.js +35 -0
  90. package/dist/channels/session.js.map +1 -0
  91. package/dist/channels/typing-lifecycle.d.ts +16 -0
  92. package/dist/channels/typing-lifecycle.d.ts.map +1 -0
  93. package/dist/channels/typing-lifecycle.js +31 -0
  94. package/dist/channels/typing-lifecycle.js.map +1 -0
  95. package/dist/cli/cmd-add-agent.d.ts +19 -0
  96. package/dist/cli/cmd-add-agent.d.ts.map +1 -0
  97. package/dist/cli/cmd-add-agent.js +362 -0
  98. package/dist/cli/cmd-add-agent.js.map +1 -0
  99. package/dist/cli/cmd-config.d.ts +3 -0
  100. package/dist/cli/cmd-config.d.ts.map +1 -0
  101. package/dist/cli/cmd-config.js +16 -0
  102. package/dist/cli/cmd-config.js.map +1 -0
  103. package/dist/cli/cmd-doctor.d.ts +3 -0
  104. package/dist/cli/cmd-doctor.d.ts.map +1 -0
  105. package/dist/cli/cmd-doctor.js +127 -0
  106. package/dist/cli/cmd-doctor.js.map +1 -0
  107. package/dist/cli/cmd-logs.d.ts +3 -0
  108. package/dist/cli/cmd-logs.d.ts.map +1 -0
  109. package/dist/cli/cmd-logs.js +26 -0
  110. package/dist/cli/cmd-logs.js.map +1 -0
  111. package/dist/cli/cmd-onboard.d.ts +5 -0
  112. package/dist/cli/cmd-onboard.d.ts.map +1 -0
  113. package/dist/cli/cmd-onboard.js +53 -0
  114. package/dist/cli/cmd-onboard.js.map +1 -0
  115. package/dist/cli/cmd-restart.d.ts +3 -0
  116. package/dist/cli/cmd-restart.d.ts.map +1 -0
  117. package/dist/cli/cmd-restart.js +22 -0
  118. package/dist/cli/cmd-restart.js.map +1 -0
  119. package/dist/cli/cmd-start.d.ts +19 -0
  120. package/dist/cli/cmd-start.d.ts.map +1 -0
  121. package/dist/cli/cmd-start.js +783 -0
  122. package/dist/cli/cmd-start.js.map +1 -0
  123. package/dist/cli/cmd-status.d.ts +3 -0
  124. package/dist/cli/cmd-status.d.ts.map +1 -0
  125. package/dist/cli/cmd-status.js +16 -0
  126. package/dist/cli/cmd-status.js.map +1 -0
  127. package/dist/cli/cmd-stop.d.ts +9 -0
  128. package/dist/cli/cmd-stop.d.ts.map +1 -0
  129. package/dist/cli/cmd-stop.js +59 -0
  130. package/dist/cli/cmd-stop.js.map +1 -0
  131. package/dist/cli/cmd-update.d.ts +3 -0
  132. package/dist/cli/cmd-update.d.ts.map +1 -0
  133. package/dist/cli/cmd-update.js +127 -0
  134. package/dist/cli/cmd-update.js.map +1 -0
  135. package/dist/cli/cmd-version.d.ts +4 -0
  136. package/dist/cli/cmd-version.d.ts.map +1 -0
  137. package/dist/cli/cmd-version.js +12 -0
  138. package/dist/cli/cmd-version.js.map +1 -0
  139. package/dist/cli/pid-file.d.ts +23 -0
  140. package/dist/cli/pid-file.d.ts.map +1 -0
  141. package/dist/cli/pid-file.js +136 -0
  142. package/dist/cli/pid-file.js.map +1 -0
  143. package/dist/cli/run-main.d.ts +16 -0
  144. package/dist/cli/run-main.d.ts.map +1 -0
  145. package/dist/cli/run-main.js +114 -0
  146. package/dist/cli/run-main.js.map +1 -0
  147. package/dist/cli/update-check.d.ts +15 -0
  148. package/dist/cli/update-check.d.ts.map +1 -0
  149. package/dist/cli/update-check.js +187 -0
  150. package/dist/cli/update-check.js.map +1 -0
  151. package/dist/commands/prefix-router.d.ts +17 -0
  152. package/dist/commands/prefix-router.d.ts.map +1 -0
  153. package/dist/commands/prefix-router.js +79 -0
  154. package/dist/commands/prefix-router.js.map +1 -0
  155. package/dist/config/agent-dirs.d.ts +24 -0
  156. package/dist/config/agent-dirs.d.ts.map +1 -0
  157. package/dist/config/agent-dirs.js +71 -0
  158. package/dist/config/agent-dirs.js.map +1 -0
  159. package/dist/config/config.d.ts +4 -0
  160. package/dist/config/config.d.ts.map +1 -0
  161. package/dist/config/config.js +42 -0
  162. package/dist/config/config.js.map +1 -0
  163. package/dist/config/default-config.d.ts +9 -0
  164. package/dist/config/default-config.d.ts.map +1 -0
  165. package/dist/config/default-config.js +94 -0
  166. package/dist/config/default-config.js.map +1 -0
  167. package/dist/config/env-vars.d.ts +15 -0
  168. package/dist/config/env-vars.d.ts.map +1 -0
  169. package/dist/config/env-vars.js +16 -0
  170. package/dist/config/env-vars.js.map +1 -0
  171. package/dist/config/merge-config.d.ts +7 -0
  172. package/dist/config/merge-config.d.ts.map +1 -0
  173. package/dist/config/merge-config.js +45 -0
  174. package/dist/config/merge-config.js.map +1 -0
  175. package/dist/config/paths.d.ts +25 -0
  176. package/dist/config/paths.d.ts.map +1 -0
  177. package/dist/config/paths.js +31 -0
  178. package/dist/config/paths.js.map +1 -0
  179. package/dist/config/zod-schema.d.ts +3114 -0
  180. package/dist/config/zod-schema.d.ts.map +1 -0
  181. package/dist/config/zod-schema.js +217 -0
  182. package/dist/config/zod-schema.js.map +1 -0
  183. package/dist/entry.d.ts +3 -0
  184. package/dist/entry.d.ts.map +1 -0
  185. package/dist/entry.js +70 -0
  186. package/dist/entry.js.map +1 -0
  187. package/dist/logger.d.ts +5 -0
  188. package/dist/logger.d.ts.map +1 -0
  189. package/dist/logger.js +42 -0
  190. package/dist/logger.js.map +1 -0
  191. package/dist/types/index.d.ts +215 -0
  192. package/dist/types/index.d.ts.map +1 -0
  193. package/dist/types/index.js +2 -0
  194. package/dist/types/index.js.map +1 -0
  195. package/package.json +62 -0
@@ -0,0 +1,362 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { createInterface } from 'node:readline/promises';
4
+ import { stdin, stdout } from 'node:process';
5
+ import { ensureDataDirs } from '../config/agent-dirs.js';
6
+ import { ONBOARD_MODEL_CHOICES } from '../config/default-config.js';
7
+ import { resolveConfigPath } from '../config/config.js';
8
+ import { DATA_DIR } from '../config/paths.js';
9
+ import { AppConfigSchema, AGENT_LIFE_CHANNEL_ID, normalizeAgentLifeChannelConfigs, toPersistedAgentLifeChannelConfig, } from '../config/zod-schema.js';
10
+ const AGENT_ID_REGEX = /^[a-z0-9][a-z0-9_-]{0,63}$/;
11
+ function createConfigBackupPath(configPath) {
12
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
13
+ return `${configPath}.bak.${timestamp}`;
14
+ }
15
+ function resolveExistingConfigPath(explicitConfigPath) {
16
+ const configPath = resolveConfigPath(explicitConfigPath);
17
+ return configPath ? resolve(configPath) : null;
18
+ }
19
+ function readConfigForMutation(explicitConfigPath) {
20
+ const configPath = resolveExistingConfigPath(explicitConfigPath);
21
+ if (!configPath) {
22
+ throw new Error('No config file found. Run `alb onboard` first or pass `-c <path>`.');
23
+ }
24
+ const raw = JSON.parse(readFileSync(configPath, 'utf-8').replace(/^\uFEFF/, ''));
25
+ return {
26
+ path: configPath,
27
+ config: AppConfigSchema.parse(raw),
28
+ };
29
+ }
30
+ function buildAgentList(config) {
31
+ const existing = config.agents.list;
32
+ if (existing && existing.length > 0) {
33
+ return [...existing];
34
+ }
35
+ return [{ id: 'default', default: true }];
36
+ }
37
+ function isCatchAllBinding(binding) {
38
+ return binding.match.channel === '*'
39
+ && binding.match.accountId === undefined
40
+ && binding.match.peer === undefined
41
+ && binding.match.userId === undefined;
42
+ }
43
+ function getAgentLifeBindingOwners(bindings) {
44
+ const owners = new Map();
45
+ for (const binding of bindings ?? []) {
46
+ if (binding.match.channel !== 'agent-life' || !binding.match.accountId) {
47
+ continue;
48
+ }
49
+ owners.set(binding.match.accountId, binding.agentId);
50
+ }
51
+ return owners;
52
+ }
53
+ export function addAgentToConfig(config, input) {
54
+ const list = buildAgentList(config);
55
+ if (list.some(agent => agent.id === input.id)) {
56
+ throw new Error(`Agent "${input.id}" already exists.`);
57
+ }
58
+ const nextList = list.map(agent => (input.default ? { ...agent, default: false } : { ...agent }));
59
+ const agent = {
60
+ id: input.id,
61
+ ...(input.default ? { default: true } : {}),
62
+ ...(input.name ? { name: input.name } : {}),
63
+ ...(input.model ? { model: input.model } : {}),
64
+ ...(input.workspace ? { workspace: input.workspace } : {}),
65
+ ...(input.cliSessionId ? { cliSessionId: input.cliSessionId } : {}),
66
+ };
67
+ nextList.push(agent);
68
+ const existingAccountIds = new Set(normalizeAgentLifeChannelConfigs(config.channels['agent-life']).map(account => account.accountId));
69
+ let agentLife = toPersistedAgentLifeChannelConfig(config.channels['agent-life']);
70
+ let bindingAccountId = input.accountId;
71
+ if (input.account) {
72
+ if (existingAccountIds.has(input.account.id)) {
73
+ throw new Error(`agent-life account "${input.account.id}" already exists.`);
74
+ }
75
+ agentLife = {
76
+ ...agentLife,
77
+ accounts: {
78
+ ...(agentLife.accounts ?? {}),
79
+ [input.account.id]: {
80
+ gateway_url: input.account.gatewayUrl,
81
+ bot_token: input.account.botToken,
82
+ poll_timeout: agentLife.poll_timeout,
83
+ retry_interval: agentLife.retry_interval,
84
+ max_retry_interval: agentLife.max_retry_interval,
85
+ },
86
+ },
87
+ };
88
+ bindingAccountId = input.account.id;
89
+ existingAccountIds.add(input.account.id);
90
+ }
91
+ let bindings = [...(config.bindings ?? [])];
92
+ if (bindingAccountId) {
93
+ if (!existingAccountIds.has(bindingAccountId)) {
94
+ throw new Error(`Unknown agent-life account "${bindingAccountId}".`);
95
+ }
96
+ const conflict = bindings.find(binding => binding.match.channel === 'agent-life' && binding.match.accountId === bindingAccountId);
97
+ if (conflict) {
98
+ throw new Error(`agent-life account "${bindingAccountId}" is already bound to agent "${conflict.agentId}".`);
99
+ }
100
+ bindings.push({
101
+ agentId: input.id,
102
+ match: {
103
+ channel: 'agent-life',
104
+ accountId: bindingAccountId,
105
+ },
106
+ });
107
+ }
108
+ if (input.default) {
109
+ bindings = bindings.map(binding => (isCatchAllBinding(binding)
110
+ ? { ...binding, agentId: input.id }
111
+ : binding));
112
+ }
113
+ return AppConfigSchema.parse({
114
+ ...config,
115
+ channels: {
116
+ ...config.channels,
117
+ [AGENT_LIFE_CHANNEL_ID]: agentLife,
118
+ },
119
+ agents: {
120
+ ...config.agents,
121
+ list: nextList,
122
+ },
123
+ ...(bindings.length > 0 ? { bindings } : {}),
124
+ });
125
+ }
126
+ function uniqueModelChoices(config) {
127
+ const models = new Set([
128
+ config.agents.defaults.model.primary,
129
+ ...(config.agents.defaults.model.fallbacks ?? []),
130
+ ...ONBOARD_MODEL_CHOICES,
131
+ ]);
132
+ for (const agent of config.agents.list ?? []) {
133
+ if (typeof agent.model === 'string') {
134
+ models.add(agent.model);
135
+ }
136
+ else if (agent.model?.primary) {
137
+ models.add(agent.model.primary);
138
+ for (const fallback of agent.model.fallbacks ?? []) {
139
+ models.add(fallback);
140
+ }
141
+ }
142
+ }
143
+ return [...models];
144
+ }
145
+ async function askRequired(rl, prompt, defaultValue) {
146
+ while (true) {
147
+ const suffix = defaultValue ? ` (default: ${defaultValue})` : '';
148
+ const answer = (await rl.question(`${prompt}${suffix}: `)).trim();
149
+ const value = answer || defaultValue || '';
150
+ if (value) {
151
+ return value;
152
+ }
153
+ console.log('This field is required.');
154
+ }
155
+ }
156
+ async function askAgentId(rl, existingIds, defaultValue) {
157
+ while (true) {
158
+ const id = await askRequired(rl, 'Agent ID', defaultValue);
159
+ if (!AGENT_ID_REGEX.test(id)) {
160
+ console.log('Agent ID must match ^[a-z0-9][a-z0-9_-]{0,63}$.');
161
+ continue;
162
+ }
163
+ if (existingIds.has(id)) {
164
+ console.log(`Agent "${id}" already exists.`);
165
+ continue;
166
+ }
167
+ return id;
168
+ }
169
+ }
170
+ async function askOptional(rl, prompt, defaultValue) {
171
+ const suffix = defaultValue ? ` (default: ${defaultValue})` : ' (optional)';
172
+ const answer = (await rl.question(`${prompt}${suffix}: `)).trim();
173
+ const value = answer || defaultValue || '';
174
+ return value ? value : undefined;
175
+ }
176
+ async function askOptionalWhenEnabled(rl, enablePrompt, fieldPrompt, options) {
177
+ const enabled = await askYesNo(rl, enablePrompt, options?.defaultEnabled ?? false);
178
+ if (!enabled) {
179
+ return undefined;
180
+ }
181
+ if (options?.requiredWhenEnabled) {
182
+ return askRequired(rl, fieldPrompt, options.defaultValue);
183
+ }
184
+ return askOptional(rl, fieldPrompt, options?.defaultValue);
185
+ }
186
+ async function askYesNo(rl, prompt, defaultValue = false) {
187
+ const hint = defaultValue ? '[Y/n]' : '[y/N]';
188
+ while (true) {
189
+ const answer = (await rl.question(`${prompt} ${hint} `)).trim().toLowerCase();
190
+ if (!answer)
191
+ return defaultValue;
192
+ if (answer === 'y' || answer === 'yes')
193
+ return true;
194
+ if (answer === 'n' || answer === 'no')
195
+ return false;
196
+ console.log('Please answer y or n.');
197
+ }
198
+ }
199
+ async function askModel(rl, config, defaultValue) {
200
+ const choices = uniqueModelChoices(config);
201
+ console.log('\nAvailable models:');
202
+ choices.forEach((model, index) => console.log(` ${index + 1}. ${model}`));
203
+ while (true) {
204
+ const raw = await askRequired(rl, 'Model number or model ref', defaultValue ?? config.agents.defaults.model.primary);
205
+ const idx = Number.parseInt(raw, 10);
206
+ if (Number.isInteger(idx) && idx >= 1 && idx <= choices.length) {
207
+ return choices[idx - 1];
208
+ }
209
+ if (raw.includes('/')) {
210
+ return raw;
211
+ }
212
+ console.log('Enter a list number or a model ref like qwen-cli/qwen3-coder-plus.');
213
+ }
214
+ }
215
+ async function askAccountId(rl, accounts, defaultValue) {
216
+ if (accounts.length === 0) {
217
+ return undefined;
218
+ }
219
+ console.log('\nAvailable agent-life accounts:');
220
+ accounts.forEach((accountId, index) => console.log(` ${index + 1}. ${accountId}`));
221
+ console.log('Leave blank to skip binding for now.');
222
+ while (true) {
223
+ const answer = (await rl.question(`Bind to agent-life account (number or id${defaultValue ? `, default: ${defaultValue}` : ''}): `)).trim();
224
+ const value = answer || defaultValue || '';
225
+ if (!value) {
226
+ return undefined;
227
+ }
228
+ const idx = Number.parseInt(value, 10);
229
+ if (Number.isInteger(idx) && idx >= 1 && idx <= accounts.length) {
230
+ return accounts[idx - 1];
231
+ }
232
+ if (accounts.includes(value)) {
233
+ return value;
234
+ }
235
+ console.log(`Unknown account "${value}". Available accounts: ${accounts.join(', ')}`);
236
+ }
237
+ }
238
+ async function askNewAccountId(rl, existingAccountIds, defaultValue) {
239
+ while (true) {
240
+ const accountId = await askRequired(rl, 'New agent-life account ID', defaultValue);
241
+ if (existingAccountIds.has(accountId)) {
242
+ console.log(`agent-life account "${accountId}" already exists.`);
243
+ continue;
244
+ }
245
+ return accountId;
246
+ }
247
+ }
248
+ async function askAccountSelection(rl, config, defaults = {}) {
249
+ const normalizedAccounts = normalizeAgentLifeChannelConfigs(config.channels['agent-life']);
250
+ const bindingOwners = getAgentLifeBindingOwners(config.bindings);
251
+ const availableAccounts = normalizedAccounts.filter(account => !bindingOwners.has(account.accountId));
252
+ const unavailableAccounts = normalizedAccounts.filter(account => bindingOwners.has(account.accountId));
253
+ const existingAccountIds = new Set(normalizedAccounts.map(account => account.accountId));
254
+ if (availableAccounts.length > 0) {
255
+ console.log('\nAvailable agent-life accounts:');
256
+ availableAccounts.forEach((account, index) => console.log(` ${index + 1}. ${account.accountId}`));
257
+ }
258
+ else {
259
+ console.log('\nNo available existing agent-life accounts for binding.');
260
+ }
261
+ if (unavailableAccounts.length > 0) {
262
+ console.log('\nAlready bound agent-life accounts:');
263
+ unavailableAccounts.forEach(account => {
264
+ console.log(` - ${account.accountId} (bound to ${bindingOwners.get(account.accountId)})`);
265
+ });
266
+ }
267
+ if (defaults.existingAccountId && bindingOwners.has(defaults.existingAccountId)) {
268
+ console.log(`agent-life account "${defaults.existingAccountId}" is already bound to agent "${bindingOwners.get(defaults.existingAccountId)}". You can create a new account instead.`);
269
+ }
270
+ if (!await askYesNo(rl, 'Bind this agent to a agent-life account?', availableAccounts.length > 0 || Boolean(defaults.newAccountId))) {
271
+ return { type: 'none' };
272
+ }
273
+ if (availableAccounts.length > 0 && !defaults.newAccountId) {
274
+ const useExisting = await askYesNo(rl, 'Use an existing agent-life account?', true);
275
+ if (useExisting) {
276
+ const defaultExistingAccountId = (defaults.existingAccountId && availableAccounts.some(account => account.accountId === defaults.existingAccountId)
277
+ ? defaults.existingAccountId
278
+ : undefined);
279
+ const accountId = await askAccountId(rl, availableAccounts.map(account => account.accountId), defaultExistingAccountId);
280
+ if (!accountId) {
281
+ return { type: 'none' };
282
+ }
283
+ return { type: 'existing', accountId };
284
+ }
285
+ }
286
+ const accountId = await askNewAccountId(rl, existingAccountIds, defaults.newAccountId);
287
+ const gatewayUrl = await askRequired(rl, 'Agent Life gateway URL', defaults.gatewayUrl ?? availableAccounts[0]?.config.gateway_url ?? normalizedAccounts[0]?.config.gateway_url ?? config.channels['agent-life'].gateway_url);
288
+ const botToken = await askRequired(rl, 'Bot token', defaults.botToken);
289
+ return {
290
+ type: 'new',
291
+ account: {
292
+ id: accountId,
293
+ gatewayUrl,
294
+ botToken,
295
+ },
296
+ };
297
+ }
298
+ export async function cmdAddAgent(args) {
299
+ console.log('alb - Add Agent\n');
300
+ if (!existsSync(DATA_DIR)) {
301
+ mkdirSync(DATA_DIR, { recursive: true });
302
+ }
303
+ ensureDataDirs();
304
+ const { path: configPath, config } = readConfigForMutation(args.config);
305
+ const existingIds = new Set(buildAgentList(config).map(agent => agent.id));
306
+ if (args.accountId && args.createAccount) {
307
+ throw new Error('Use either --account-id or --create-account, not both.');
308
+ }
309
+ if (!args.createAccount && (args.accountGatewayUrl || args.accountBotToken)) {
310
+ throw new Error('--account-gateway-url and --account-bot-token require --create-account.');
311
+ }
312
+ const [restId, restModel, restAccountId, restWorkspace] = args.rest;
313
+ const rl = createInterface({ input: stdin, output: stdout });
314
+ try {
315
+ const id = await askAgentId(rl, existingIds, restId);
316
+ const name = await askOptional(rl, 'Display name');
317
+ const model = await askModel(rl, config, restModel ?? config.agents.defaults.model.primary);
318
+ const workspace = await askOptionalWhenEnabled(rl, 'Configure workspace path?', 'Workspace path', {
319
+ defaultEnabled: Boolean(restWorkspace),
320
+ defaultValue: restWorkspace ?? process.cwd(),
321
+ requiredWhenEnabled: true,
322
+ });
323
+ const cliSessionId = await askOptionalWhenEnabled(rl, 'Configure CLI session ID?', 'CLI session ID', {
324
+ defaultEnabled: false,
325
+ });
326
+ const accountSelection = await askAccountSelection(rl, config, {
327
+ existingAccountId: args.accountId ?? restAccountId,
328
+ newAccountId: args.createAccount,
329
+ gatewayUrl: args.accountGatewayUrl,
330
+ botToken: args.accountBotToken,
331
+ });
332
+ const nextConfig = addAgentToConfig(config, {
333
+ id,
334
+ ...(name ? { name } : {}),
335
+ ...(model ? { model } : {}),
336
+ ...(workspace ? { workspace } : {}),
337
+ ...(cliSessionId ? { cliSessionId } : {}),
338
+ ...(accountSelection.type === 'existing' ? { accountId: accountSelection.accountId } : {}),
339
+ ...(accountSelection.type === 'new' ? { account: accountSelection.account } : {}),
340
+ });
341
+ const backupPath = createConfigBackupPath(configPath);
342
+ copyFileSync(configPath, backupPath);
343
+ writeFileSync(configPath, JSON.stringify(nextConfig, null, 2) + '\n', 'utf-8');
344
+ console.log(`\nAdded agent "${id}" to ${configPath}`);
345
+ console.log(`Backup saved to ${backupPath}`);
346
+ if (accountSelection.type === 'existing') {
347
+ console.log(`Bound agent-life account "${accountSelection.accountId}" -> "${id}"`);
348
+ }
349
+ else if (accountSelection.type === 'new') {
350
+ console.log(`Created agent-life account "${accountSelection.account.id}"`);
351
+ console.log(`Bound agent-life account "${accountSelection.account.id}" -> "${id}"`);
352
+ }
353
+ else {
354
+ console.log('No binding added. Configure `bindings` manually if this agent should receive traffic.');
355
+ }
356
+ console.log('\nRun `alb start` to reload the updated config.');
357
+ }
358
+ finally {
359
+ rl.close();
360
+ }
361
+ }
362
+ //# sourceMappingURL=cmd-add-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-add-agent.js","sourceRoot":"","sources":["../../src/cli/cmd-add-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliArgs } from './run-main.js';
2
+ export declare function cmdConfig(args: CliArgs): Promise<void>;
3
+ //# sourceMappingURL=cmd-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-config.d.ts","sourceRoot":"","sources":["../../src/cli/cmd-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,wBAAsB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB5D"}
@@ -0,0 +1,16 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { DATA_CONFIG_PATH } from '../config/paths.js';
3
+ import { resolveConfigPath } from '../config/config.js';
4
+ export async function cmdConfig(args) {
5
+ const configPath = resolveConfigPath(args.config) ?? (args.config ?? DATA_CONFIG_PATH);
6
+ if (!existsSync(configPath)) {
7
+ console.log(`No config file found at ${configPath}`);
8
+ console.log('Run `alb onboard` to create one.');
9
+ return;
10
+ }
11
+ console.log(`--- ${configPath} ---`);
12
+ const content = readFileSync(configPath, 'utf-8');
13
+ const redacted = content.replace(/("bot_token"\s*:\s*)"[^"]*"/g, '$1"***REDACTED***"');
14
+ console.log(redacted);
15
+ }
16
+ //# sourceMappingURL=cmd-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-config.js","sourceRoot":"","sources":["../../src/cli/cmd-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAa;IAC3C,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAA;IAEtF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAA;QACpD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;QAC/C,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,OAAO,UAAU,MAAM,CAAC,CAAA;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAC9B,8BAA8B,EAC9B,oBAAoB,CACrB,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACvB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CliArgs } from './run-main.js';
2
+ export declare function cmdDoctor(_args: CliArgs): Promise<void>;
3
+ //# sourceMappingURL=cmd-doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-doctor.d.ts","sourceRoot":"","sources":["../../src/cli/cmd-doctor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAoC5C,wBAAsB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqF7D"}
@@ -0,0 +1,127 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { basename } from 'node:path';
4
+ import { CliSessionStore } from '../agents/cli-session-store.js';
5
+ import { resolveLogFilePath } from '../logger.js';
6
+ import { loadConfig, resolveConfigPath } from '../config/config.js';
7
+ import { DATA_DIR } from '../config/paths.js';
8
+ import { normalizeAgentLifeChannelConfigs } from '../config/zod-schema.js';
9
+ function check(label, fn) {
10
+ try {
11
+ const result = fn();
12
+ if (typeof result === 'string') {
13
+ console.log(` OK ${label}: ${result}`);
14
+ }
15
+ else if (result) {
16
+ console.log(` OK ${label}`);
17
+ }
18
+ else {
19
+ console.log(` FAIL ${label}`);
20
+ }
21
+ }
22
+ catch {
23
+ console.log(` FAIL ${label}`);
24
+ }
25
+ }
26
+ function whichCommand(cmd) {
27
+ try {
28
+ const locator = process.platform === 'win32' ? 'where.exe' : 'which';
29
+ return execFileSync(locator, [cmd], { encoding: 'utf-8' })
30
+ .trim()
31
+ .split(/\r?\n/g)[0];
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function getVersion(cmd, versionFlag = '--version') {
38
+ try {
39
+ return execFileSync(cmd, [versionFlag], { encoding: 'utf-8', timeout: 5000 }).trim().split('\n')[0];
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ export async function cmdDoctor(_args) {
46
+ console.log('alb doctor - Environment Diagnostics\n');
47
+ console.log('[Data Directory]');
48
+ check('Data dir exists', () => existsSync(DATA_DIR));
49
+ check('Config file exists', () => {
50
+ const configPath = resolveConfigPath();
51
+ return configPath ? configPath : false;
52
+ });
53
+ console.log('\n[Runtime]');
54
+ check('Node.js', () => `${process.version}`);
55
+ check('Node.js >= 22', () => {
56
+ const major = parseInt(process.version.slice(1), 10);
57
+ return major >= 22 ? `v${major} OK` : `v${major} - requires >= 22`;
58
+ });
59
+ console.log('\n[Agent CLI Tools]');
60
+ check('claude', () => {
61
+ const path = whichCommand('claude');
62
+ if (!path)
63
+ return false;
64
+ const ver = getVersion('claude');
65
+ return ver ?? path;
66
+ });
67
+ check('codex', () => {
68
+ const path = whichCommand('codex');
69
+ if (!path)
70
+ return false;
71
+ const ver = getVersion('codex');
72
+ return ver ?? path;
73
+ });
74
+ check('qwen', () => {
75
+ const path = whichCommand('qwen');
76
+ if (!path)
77
+ return false;
78
+ const ver = getVersion('qwen');
79
+ return ver ?? path;
80
+ });
81
+ console.log('\n[API Keys]');
82
+ check('ANTHROPIC_API_KEY', () => !!process.env.ANTHROPIC_API_KEY);
83
+ check('OPENAI_API_KEY', () => !!process.env.OPENAI_API_KEY);
84
+ console.log('\n[Network]');
85
+ try {
86
+ const config = loadConfig();
87
+ const agentLifeAccounts = normalizeAgentLifeChannelConfigs(config.channels['agent-life']);
88
+ for (const account of agentLifeAccounts) {
89
+ check(`Gateway reachable (${account.accountId}: ${account.config.gateway_url})`, () => {
90
+ return `configured - run 'alb start' to verify connectivity`;
91
+ });
92
+ }
93
+ }
94
+ catch {
95
+ check('Gateway config', () => 'no config found - run `alb onboard` first');
96
+ }
97
+ // 6. Session store
98
+ console.log('\n[Session Store]');
99
+ const sessionStore = new CliSessionStore();
100
+ const sessions = await sessionStore.list();
101
+ const incompleteCodexSessions = await sessionStore.findIncompleteSessions('codex-cli');
102
+ check('Persisted agent-life sessions', () => `${Object.keys(sessions).length}`);
103
+ check('Codex sessions missing thread_id', () => {
104
+ if (incompleteCodexSessions.length === 0) {
105
+ return '0';
106
+ }
107
+ return `${incompleteCodexSessions.length} session(s)`;
108
+ });
109
+ if (incompleteCodexSessions.length > 0) {
110
+ console.log(' ! Incomplete session keys:');
111
+ for (const entry of incompleteCodexSessions.slice(0, 10)) {
112
+ console.log(` - ${entry.sessionKey}`);
113
+ }
114
+ }
115
+ // 7. Logs
116
+ console.log('\n[Logs]');
117
+ const logPath = resolveLogFilePath();
118
+ check('Daily log file', () => existsSync(logPath) ? basename(logPath) : `${basename(logPath)} (will be created on start)`);
119
+ console.log(' i Use `alb logs` to inspect the latest log file.');
120
+ console.log(' i Compare direct CLI and bridge latency with:');
121
+ console.log(' codex exec --json "reply with exactly OK"');
122
+ console.log(' codex exec resume <thread_id> --json "reply with exactly AGAIN"');
123
+ console.log(' codex app-server --listen stdio://');
124
+ console.log(' qwen -p "reply with exactly OK" --output-format json');
125
+ console.log();
126
+ }
127
+ //# sourceMappingURL=cmd-doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-doctor.js","sourceRoot":"","sources":["../../src/cli/cmd-doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CliArgs } from './run-main.js';
2
+ export declare function cmdLogs(_args: CliArgs): Promise<void>;
3
+ //# sourceMappingURL=cmd-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-logs.d.ts","sourceRoot":"","sources":["../../src/cli/cmd-logs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,wBAAsB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3D"}
@@ -0,0 +1,26 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { DATA_LOGS_DIR } from '../config/paths.js';
4
+ export async function cmdLogs(_args) {
5
+ if (!existsSync(DATA_LOGS_DIR)) {
6
+ console.log(`No logs directory found at ${DATA_LOGS_DIR}`);
7
+ console.log('Start alb once to create the daily log file.');
8
+ return;
9
+ }
10
+ const files = readdirSync(DATA_LOGS_DIR)
11
+ .filter(f => f.endsWith('.log'))
12
+ .sort();
13
+ if (files.length === 0) {
14
+ console.log('No log files found.');
15
+ return;
16
+ }
17
+ // Show the most recent log file (tail)
18
+ const latest = files[files.length - 1];
19
+ const logPath = join(DATA_LOGS_DIR, latest);
20
+ console.log(`--- ${logPath} ---`);
21
+ const content = readFileSync(logPath, 'utf-8');
22
+ const lines = content.split('\n');
23
+ const tail = lines.slice(-100); // last 100 lines
24
+ console.log(tail.join('\n'));
25
+ }
26
+ //# sourceMappingURL=cmd-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-logs.js","sourceRoot":"","sources":["../../src/cli/cmd-logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAc;IAC1C,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,8BAA8B,aAAa,EAAE,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAM;IACR,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC/B,IAAI,EAAE,CAAA;IAET,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;QAClC,OAAM;IACR,CAAC;IAED,uCAAuC;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,MAAM,CAAC,CAAA;IAEjC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA,CAAC,iBAAiB;IAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { CliArgs } from './run-main.js';
2
+ export declare const DEFAULT_GATEWAY_URL = "https://www.m2a.chat/gateway/api";
3
+ export declare function resolveGatewayUrlInput(input: string): string;
4
+ export declare function cmdOnboard(_args: CliArgs): Promise<void>;
5
+ //# sourceMappingURL=cmd-onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-onboard.d.ts","sourceRoot":"","sources":["../../src/cli/cmd-onboard.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAE5C,eAAO,MAAM,mBAAmB,qCAAqC,CAAA;AAErE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAOD,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8C9D"}