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,78 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
3
+ import { dirname } from 'node:path';
4
+ import { DATA_AGENT_LIFE_SESSION_MAP_PATH } from '../config/paths.js';
5
+ function cloneEntry(entry) {
6
+ return { ...entry };
7
+ }
8
+ function makeMappingKey(agentLifeMsgId, agentId) {
9
+ return `${agentId}:${agentLifeMsgId}`;
10
+ }
11
+ export class AgentLifeSessionMapStore {
12
+ filePath;
13
+ cache = null;
14
+ queue = Promise.resolve();
15
+ constructor(filePath = DATA_AGENT_LIFE_SESSION_MAP_PATH) {
16
+ this.filePath = filePath;
17
+ }
18
+ async upsert(entry) {
19
+ return this.mutate((store) => {
20
+ const stored = {
21
+ ...entry,
22
+ updatedAt: Date.now(),
23
+ };
24
+ store.mappings[makeMappingKey(entry.agentLifeMsgId, entry.agentId)] = stored;
25
+ return cloneEntry(stored);
26
+ });
27
+ }
28
+ async get(agentLifeMsgId, agentId) {
29
+ const store = await this.load();
30
+ const entry = store.mappings[makeMappingKey(agentLifeMsgId, agentId)];
31
+ return entry ? cloneEntry(entry) : undefined;
32
+ }
33
+ async list() {
34
+ const store = await this.load();
35
+ return Object.fromEntries(Object.entries(store.mappings).map(([key, entry]) => [key, cloneEntry(entry)]));
36
+ }
37
+ async mutate(mutator) {
38
+ const previous = this.queue;
39
+ let release;
40
+ this.queue = new Promise((resolve) => {
41
+ release = resolve;
42
+ });
43
+ await previous;
44
+ try {
45
+ const store = await this.load();
46
+ const result = await mutator(store);
47
+ await this.save(store);
48
+ return result;
49
+ }
50
+ finally {
51
+ release();
52
+ }
53
+ }
54
+ async load() {
55
+ if (this.cache) {
56
+ return this.cache;
57
+ }
58
+ await mkdir(dirname(this.filePath), { recursive: true });
59
+ if (!existsSync(this.filePath)) {
60
+ this.cache = { version: 1, mappings: {} };
61
+ return this.cache;
62
+ }
63
+ const raw = await readFile(this.filePath, 'utf-8');
64
+ const parsed = JSON.parse(raw);
65
+ this.cache = {
66
+ version: 1,
67
+ mappings: parsed.mappings ?? {},
68
+ };
69
+ return this.cache;
70
+ }
71
+ async save(store) {
72
+ await mkdir(dirname(this.filePath), { recursive: true });
73
+ const tempPath = `${this.filePath}.tmp`;
74
+ await writeFile(tempPath, JSON.stringify(store, null, 2) + '\n', 'utf-8');
75
+ await rename(tempPath, this.filePath);
76
+ }
77
+ }
78
+ //# sourceMappingURL=agent-life-session-map-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-life-session-map-store.js","sourceRoot":"","sources":["../../src/agents/agent-life-session-map-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AppConfig } from '../config/zod-schema.js';
2
+ import type { Logger, ResolvedAgent } from '../types/index.js';
3
+ export interface ResolveAgentsResult {
4
+ agents: Map<string, ResolvedAgent>;
5
+ defaultAgentId: string;
6
+ }
7
+ /**
8
+ * Resolve agent configurations: merge defaults + list → Map<agentId, ResolvedAgent>.
9
+ * Called once at startup, result cached for routing.
10
+ */
11
+ export declare function resolveAgentConfigs(config: AppConfig, logger: Logger): ResolveAgentsResult;
12
+ //# sourceMappingURL=agent-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.d.ts","sourceRoot":"","sources":["../../src/agents/agent-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAoB,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAKhF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAClC,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAyC1F"}
@@ -0,0 +1,114 @@
1
+ import { agentStatePath } from '../config/paths.js';
2
+ const PROTECTED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
3
+ /**
4
+ * Resolve agent configurations: merge defaults + list → Map<agentId, ResolvedAgent>.
5
+ * Called once at startup, result cached for routing.
6
+ */
7
+ export function resolveAgentConfigs(config, logger) {
8
+ const defaults = config.agents.defaults;
9
+ const list = config.agents.list;
10
+ const bindings = config.bindings;
11
+ // No list → implicit "default" agent from defaults
12
+ if (!list || list.length === 0) {
13
+ const agent = buildResolvedAgent('default', defaults, undefined);
14
+ validateBindingRefs(bindings, new Set(['default']));
15
+ return { agents: new Map([['default', agent]]), defaultAgentId: 'default' };
16
+ }
17
+ // Validate uniqueness
18
+ const idSet = new Set();
19
+ for (const entry of list) {
20
+ if (idSet.has(entry.id)) {
21
+ throw new Error(`Duplicate agentId: "${entry.id}"`);
22
+ }
23
+ idSet.add(entry.id);
24
+ }
25
+ // Determine default agent
26
+ const defaultEntries = list.filter((a) => a.default === true);
27
+ if (defaultEntries.length > 1) {
28
+ logger.warn({ agents: defaultEntries.map((a) => a.id) }, 'Multiple agents marked as default, using the first one');
29
+ }
30
+ const defaultAgentId = defaultEntries[0]?.id ?? list[0].id;
31
+ // Merge each agent with defaults
32
+ const agents = new Map();
33
+ for (const entry of list) {
34
+ agents.set(entry.id, buildResolvedAgent(entry.id, defaults, entry));
35
+ }
36
+ // Validate binding references
37
+ validateBindingRefs(bindings, idSet);
38
+ return { agents, defaultAgentId };
39
+ }
40
+ function buildResolvedAgent(id, defaults, agentConfig) {
41
+ const model = resolveModel(defaults.model, agentConfig?.model);
42
+ const cliBackends = deepMergeRecords(defaults.cliBackends ?? {}, (agentConfig?.cliBackends ?? {}));
43
+ const env = { ...(defaults.env ?? {}), ...(agentConfig?.env ?? {}) };
44
+ const clearEnv = [...(defaults.clearEnv ?? []), ...(agentConfig?.clearEnv ?? [])];
45
+ return {
46
+ id,
47
+ name: agentConfig?.name ?? id,
48
+ model,
49
+ workspace: agentConfig?.workspace ?? process.cwd(),
50
+ cliSessionId: agentConfig?.cliSessionId,
51
+ systemPrompt: agentConfig?.systemPrompt,
52
+ cliBackends,
53
+ env,
54
+ clearEnv,
55
+ tools: agentConfig?.tools ?? defaults.tools,
56
+ skills: agentConfig?.skills,
57
+ identity: agentConfig?.identity,
58
+ stateDir: agentStatePath(id),
59
+ };
60
+ }
61
+ function resolveModel(defaultModel, agentModel) {
62
+ if (!agentModel) {
63
+ return { ...defaultModel };
64
+ }
65
+ if (typeof agentModel === 'string') {
66
+ return { primary: agentModel };
67
+ }
68
+ return { ...agentModel };
69
+ }
70
+ function deepMergeRecords(base, override) {
71
+ const result = { ...base };
72
+ for (const [key, value] of Object.entries(override)) {
73
+ if (PROTECTED_KEYS.has(key))
74
+ continue;
75
+ const existing = result[key];
76
+ if (existing && isPlainObject(value)) {
77
+ result[key] = deepMerge(existing, value);
78
+ }
79
+ else {
80
+ result[key] = value;
81
+ }
82
+ }
83
+ return result;
84
+ }
85
+ function deepMerge(base, override) {
86
+ const result = { ...base };
87
+ for (const [key, value] of Object.entries(override)) {
88
+ if (PROTECTED_KEYS.has(key))
89
+ continue;
90
+ if (value === null) {
91
+ delete result[key];
92
+ }
93
+ else if (isPlainObject(value) && isPlainObject(result[key])) {
94
+ result[key] = deepMerge(result[key], value);
95
+ }
96
+ else {
97
+ result[key] = value;
98
+ }
99
+ }
100
+ return result;
101
+ }
102
+ function isPlainObject(value) {
103
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
104
+ }
105
+ function validateBindingRefs(bindings, validIds) {
106
+ if (!bindings)
107
+ return;
108
+ for (const binding of bindings) {
109
+ if (!validIds.has(binding.agentId)) {
110
+ throw new Error(`Binding references unknown agentId "${binding.agentId}". Valid ids: ${[...validIds].join(', ')}`);
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=agent-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.js","sourceRoot":"","sources":["../../src/agents/agent-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { AgentBinding } from '../config/zod-schema.js';
2
+ import type { ResolvedAgent, SessionEnvelope } from '../types/index.js';
3
+ /**
4
+ * Route an incoming envelope to the appropriate agent.
5
+ * Uses specificity scoring: higher score wins, ties broken by config order.
6
+ */
7
+ export declare function resolveAgent(envelope: SessionEnvelope, bindings: AgentBinding[], agents: Map<string, ResolvedAgent>, defaultAgentId: string): ResolvedAgent;
8
+ //# sourceMappingURL=agent-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-router.d.ts","sourceRoot":"","sources":["../../src/agents/agent-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAUvE;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,YAAY,EAAE,EACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,cAAc,EAAE,MAAM,GACrB,aAAa,CAqBf"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Route an incoming envelope to the appropriate agent.
3
+ * Uses specificity scoring: higher score wins, ties broken by config order.
4
+ */
5
+ export function resolveAgent(envelope, bindings, agents, defaultAgentId) {
6
+ const ctx = extractRouteContext(envelope);
7
+ let bestBinding = null;
8
+ let bestScore = -1;
9
+ for (const binding of bindings) {
10
+ const score = scoreBinding(binding.match, ctx);
11
+ if (score > 0 && score > bestScore) {
12
+ bestScore = score;
13
+ bestBinding = binding;
14
+ }
15
+ }
16
+ const agentId = bestBinding?.agentId ?? defaultAgentId;
17
+ const agent = agents.get(agentId);
18
+ if (!agent) {
19
+ // Should not happen if config validation passed, but guard anyway
20
+ const fallback = agents.get(defaultAgentId);
21
+ return fallback;
22
+ }
23
+ return agent;
24
+ }
25
+ function extractRouteContext(envelope) {
26
+ return {
27
+ channel: envelope.source.channel,
28
+ accountId: envelope.source.accountId,
29
+ chatId: String(envelope.source.chatId),
30
+ chatType: envelope.source.chatType,
31
+ userId: String(envelope.source.userId),
32
+ };
33
+ }
34
+ function scoreBinding(match, ctx) {
35
+ let score = 0;
36
+ let allSatisfied = true;
37
+ if (match.peer?.id !== undefined) {
38
+ if (String(match.peer.id) === ctx.chatId)
39
+ score += 100;
40
+ else
41
+ allSatisfied = false;
42
+ }
43
+ if (match.userId !== undefined) {
44
+ if (String(match.userId) === ctx.userId)
45
+ score += 80;
46
+ else
47
+ allSatisfied = false;
48
+ }
49
+ if (match.peer?.kind !== undefined) {
50
+ if (match.peer.kind === ctx.chatType)
51
+ score += 40;
52
+ else
53
+ allSatisfied = false;
54
+ }
55
+ if (match.accountId !== undefined) {
56
+ if (match.accountId === ctx.accountId)
57
+ score += 60;
58
+ else
59
+ allSatisfied = false;
60
+ }
61
+ if (match.channel !== undefined) {
62
+ if (match.channel === '*')
63
+ score += 1;
64
+ else if (match.channel === ctx.channel)
65
+ score += 20;
66
+ else
67
+ allSatisfied = false;
68
+ }
69
+ // AND semantics: all specified fields must match
70
+ return allSatisfied ? score : 0;
71
+ }
72
+ //# sourceMappingURL=agent-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-router.js","sourceRoot":"","sources":["../../src/agents/agent-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { AppConfig } from '../config/zod-schema.js';
2
+ import type { CliBackendConfig } from '../types/index.js';
3
+ export interface ResolvedCliBackend {
4
+ id: string;
5
+ config: CliBackendConfig;
6
+ }
7
+ export declare const CLI_WATCHDOG_MIN_TIMEOUT_MS = 1000;
8
+ export declare const CLI_FRESH_WATCHDOG_DEFAULTS: {
9
+ readonly noOutputTimeoutRatio: 0.8;
10
+ readonly minMs: 180000;
11
+ readonly maxMs: 600000;
12
+ };
13
+ export declare const CLI_RESUME_WATCHDOG_DEFAULTS: {
14
+ readonly noOutputTimeoutRatio: 0.3;
15
+ readonly minMs: 60000;
16
+ readonly maxMs: 180000;
17
+ };
18
+ export declare function normalizeProviderId(provider: string): string;
19
+ export declare function resolveCliBackendIds(cfg?: Pick<AppConfig, 'agents'>): Set<string>;
20
+ export declare function extractProvider(modelRef: string): string;
21
+ export declare function extractModel(modelRef: string): string;
22
+ export declare function isCliBackend(modelRef: string, backends?: Record<string, CliBackendConfig>): boolean;
23
+ export declare function resolveCliBackendConfig(provider: string, cfg?: Pick<AppConfig, 'agents'>, cliBackendsOverride?: Record<string, CliBackendConfig>): ResolvedCliBackend | null;
24
+ export declare function resolveCliBackend(modelRef: string, backends: Record<string, CliBackendConfig> | undefined): CliBackendConfig | undefined;
25
+ //# sourceMappingURL=cli-backends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-backends.d.ts","sourceRoot":"","sources":["../../src/agents/cli-backends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,gBAAgB,CAAA;CACzB;AAwBD,eAAO,MAAM,2BAA2B,OAAQ,CAAA;AAEhD,eAAO,MAAM,2BAA2B;;;;CAI9B,CAAA;AAEV,eAAO,MAAM,4BAA4B;;;;CAI/B,CAAA;AA2HV,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB5D;AAkBD,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAOjF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,OAAO,CAYT;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrD,kBAAkB,GAAG,IAAI,CAoC3B;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,SAAS,GACrD,gBAAgB,GAAG,SAAS,CAW9B"}
@@ -0,0 +1,252 @@
1
+ const CLAUDE_MODEL_ALIASES = {
2
+ opus: 'opus',
3
+ 'opus-4.6': 'opus',
4
+ 'opus-4.5': 'opus',
5
+ 'opus-4': 'opus',
6
+ 'claude-opus-4-6': 'opus',
7
+ 'claude-opus-4-5': 'opus',
8
+ 'claude-opus-4': 'opus',
9
+ sonnet: 'sonnet',
10
+ 'sonnet-4.6': 'sonnet',
11
+ 'sonnet-4.5': 'sonnet',
12
+ 'sonnet-4.1': 'sonnet',
13
+ 'sonnet-4.0': 'sonnet',
14
+ 'claude-sonnet-4-6': 'sonnet',
15
+ 'claude-sonnet-4-5': 'sonnet',
16
+ 'claude-sonnet-4-1': 'sonnet',
17
+ 'claude-sonnet-4-0': 'sonnet',
18
+ haiku: 'haiku',
19
+ 'haiku-3.5': 'haiku',
20
+ 'claude-haiku-3-5': 'haiku',
21
+ };
22
+ export const CLI_WATCHDOG_MIN_TIMEOUT_MS = 1_000;
23
+ export const CLI_FRESH_WATCHDOG_DEFAULTS = {
24
+ noOutputTimeoutRatio: 0.8,
25
+ minMs: 180_000,
26
+ maxMs: 600_000,
27
+ };
28
+ export const CLI_RESUME_WATCHDOG_DEFAULTS = {
29
+ noOutputTimeoutRatio: 0.3,
30
+ minMs: 60_000,
31
+ maxMs: 180_000,
32
+ };
33
+ const DEFAULT_CLAUDE_BACKEND = {
34
+ command: 'claude',
35
+ modelAliases: CLAUDE_MODEL_ALIASES,
36
+ sessionMode: 'always',
37
+ reliability: {
38
+ watchdog: {
39
+ fresh: { noOutputTimeoutMs: 600_000 },
40
+ resume: { noOutputTimeoutMs: 600_000 },
41
+ },
42
+ },
43
+ serialize: true,
44
+ };
45
+ const DEFAULT_CODEX_BACKEND = {
46
+ command: 'codex',
47
+ runtimeMode: 'app-server',
48
+ args: ['exec', '--json', '--color', 'never', '--sandbox', 'danger-full-access', '--skip-git-repo-check'],
49
+ resumeArgs: [
50
+ 'exec',
51
+ 'resume',
52
+ '{sessionId}',
53
+ '--color',
54
+ 'never',
55
+ '--sandbox',
56
+ 'danger-full-access',
57
+ '--skip-git-repo-check',
58
+ ],
59
+ output: 'jsonl',
60
+ resumeOutput: 'text',
61
+ input: 'arg',
62
+ modelArg: '--model',
63
+ sessionIdFields: ['thread_id'],
64
+ sessionMode: 'existing',
65
+ imageArg: '--image',
66
+ imageMode: 'repeat',
67
+ appServer: {
68
+ listen: 'stdio://',
69
+ startupTimeoutMs: 15_000,
70
+ requestTimeoutMs: 30_000,
71
+ serviceName: 'agent-life-bridge',
72
+ experimentalApi: false,
73
+ approvalPolicy: 'never',
74
+ sandbox: 'danger-full-access',
75
+ persistExtendedHistory: false,
76
+ experimentalRawEvents: false,
77
+ },
78
+ reliability: {
79
+ watchdog: {
80
+ fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS },
81
+ resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS },
82
+ },
83
+ },
84
+ serialize: true,
85
+ };
86
+ const DEFAULT_QWEN_BACKEND = {
87
+ command: 'qwen',
88
+ runtimeMode: 'exec',
89
+ args: ['-p', '--output-format', 'json'],
90
+ resumeArgs: ['-p', '--resume', '{sessionId}', '--output-format', 'json'],
91
+ output: 'json',
92
+ resumeOutput: 'json',
93
+ input: 'arg',
94
+ modelArg: '--model',
95
+ sessionArg: '--session-id',
96
+ sessionMode: 'always',
97
+ sessionIdFields: ['session_id', 'sessionId'],
98
+ reliability: {
99
+ watchdog: {
100
+ fresh: { ...CLI_FRESH_WATCHDOG_DEFAULTS },
101
+ resume: { ...CLI_RESUME_WATCHDOG_DEFAULTS },
102
+ },
103
+ },
104
+ serialize: true,
105
+ };
106
+ function mergeBackendConfig(base, override) {
107
+ if (!override) {
108
+ return { ...base };
109
+ }
110
+ const baseFresh = base.reliability?.watchdog?.fresh ?? {};
111
+ const baseResume = base.reliability?.watchdog?.resume ?? {};
112
+ const overrideFresh = override.reliability?.watchdog?.fresh ?? {};
113
+ const overrideResume = override.reliability?.watchdog?.resume ?? {};
114
+ const baseAppServer = base.appServer ?? {};
115
+ const overrideAppServer = override.appServer ?? {};
116
+ return {
117
+ ...base,
118
+ ...override,
119
+ args: override.args ?? base.args,
120
+ runtimeMode: override.runtimeMode ?? base.runtimeMode,
121
+ appServer: base.appServer || override.appServer
122
+ ? {
123
+ ...baseAppServer,
124
+ ...overrideAppServer,
125
+ args: overrideAppServer.args ?? baseAppServer.args,
126
+ optOutNotificationMethods: overrideAppServer.optOutNotificationMethods ?? baseAppServer.optOutNotificationMethods,
127
+ }
128
+ : undefined,
129
+ env: { ...base.env, ...override.env },
130
+ modelAliases: { ...base.modelAliases, ...override.modelAliases },
131
+ clearEnv: Array.from(new Set([...(base.clearEnv ?? []), ...(override.clearEnv ?? [])])),
132
+ sessionIdFields: override.sessionIdFields ?? base.sessionIdFields,
133
+ sessionArgs: override.sessionArgs ?? base.sessionArgs,
134
+ resumeArgs: override.resumeArgs ?? base.resumeArgs,
135
+ reliability: {
136
+ ...base.reliability,
137
+ ...override.reliability,
138
+ watchdog: {
139
+ ...base.reliability?.watchdog,
140
+ ...override.reliability?.watchdog,
141
+ fresh: { ...baseFresh, ...overrideFresh },
142
+ resume: { ...baseResume, ...overrideResume },
143
+ },
144
+ },
145
+ };
146
+ }
147
+ export function normalizeProviderId(provider) {
148
+ const normalized = provider.trim().toLowerCase().replaceAll('_', '-');
149
+ if (normalized === 'claude' ||
150
+ normalized === 'claude-cli' ||
151
+ normalized === 'claudecli') {
152
+ return 'claude-cli';
153
+ }
154
+ if (normalized === 'codex' ||
155
+ normalized === 'codex-cli' ||
156
+ normalized === 'codexcli') {
157
+ return 'codex-cli';
158
+ }
159
+ if (normalized === 'qwen' ||
160
+ normalized === 'qwen-cli' ||
161
+ normalized === 'qwencli') {
162
+ return 'qwen-cli';
163
+ }
164
+ return normalized;
165
+ }
166
+ function normalizeBackendKey(key) {
167
+ return normalizeProviderId(key);
168
+ }
169
+ function pickBackendConfig(config, normalizedId) {
170
+ for (const [key, entry] of Object.entries(config)) {
171
+ if (normalizeBackendKey(key) === normalizedId) {
172
+ return entry;
173
+ }
174
+ }
175
+ return undefined;
176
+ }
177
+ export function resolveCliBackendIds(cfg) {
178
+ const ids = new Set(['claude-cli', 'codex-cli', 'qwen-cli']);
179
+ const configured = cfg?.agents.defaults.cliBackends ?? {};
180
+ for (const key of Object.keys(configured)) {
181
+ ids.add(normalizeBackendKey(key));
182
+ }
183
+ return ids;
184
+ }
185
+ export function extractProvider(modelRef) {
186
+ const slashIdx = modelRef.indexOf('/');
187
+ return normalizeProviderId(slashIdx === -1 ? modelRef : modelRef.slice(0, slashIdx));
188
+ }
189
+ export function extractModel(modelRef) {
190
+ const slashIdx = modelRef.indexOf('/');
191
+ return slashIdx === -1 ? '' : modelRef.slice(slashIdx + 1);
192
+ }
193
+ export function isCliBackend(modelRef, backends) {
194
+ const provider = extractProvider(modelRef);
195
+ if (provider === 'claude-cli' || provider === 'codex-cli' || provider === 'qwen-cli') {
196
+ return true;
197
+ }
198
+ if (provider.endsWith('-cli')) {
199
+ return true;
200
+ }
201
+ if (!backends) {
202
+ return false;
203
+ }
204
+ return Object.keys(backends).some((key) => normalizeBackendKey(key) === provider);
205
+ }
206
+ export function resolveCliBackendConfig(provider, cfg, cliBackendsOverride) {
207
+ const normalized = normalizeBackendKey(provider);
208
+ const configured = cliBackendsOverride ?? cfg?.agents.defaults.cliBackends ?? {};
209
+ const override = pickBackendConfig(configured, normalized);
210
+ if (normalized === 'claude-cli') {
211
+ const merged = mergeBackendConfig(DEFAULT_CLAUDE_BACKEND, override);
212
+ const command = merged.command.trim();
213
+ if (!command)
214
+ return null;
215
+ return { id: normalized, config: { ...merged, command } };
216
+ }
217
+ if (normalized === 'codex-cli') {
218
+ const merged = mergeBackendConfig(DEFAULT_CODEX_BACKEND, override);
219
+ const command = merged.command.trim();
220
+ if (!command)
221
+ return null;
222
+ return { id: normalized, config: { ...merged, command } };
223
+ }
224
+ if (normalized === 'qwen-cli') {
225
+ const merged = mergeBackendConfig(DEFAULT_QWEN_BACKEND, override);
226
+ const command = merged.command.trim();
227
+ if (!command)
228
+ return null;
229
+ return { id: normalized, config: { ...merged, command } };
230
+ }
231
+ if (!override) {
232
+ return null;
233
+ }
234
+ const command = override.command.trim();
235
+ if (!command) {
236
+ return null;
237
+ }
238
+ return { id: normalized, config: { ...override, command } };
239
+ }
240
+ export function resolveCliBackend(modelRef, backends) {
241
+ if (!backends) {
242
+ return undefined;
243
+ }
244
+ const provider = extractProvider(modelRef);
245
+ for (const [key, config] of Object.entries(backends)) {
246
+ if (normalizeBackendKey(key) === provider) {
247
+ return config;
248
+ }
249
+ }
250
+ return undefined;
251
+ }
252
+ //# sourceMappingURL=cli-backends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-backends.js","sourceRoot":"","sources":["../../src/agents/cli-backends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { CliBackendConfig, CliRunUsage } from '../types/index.js';
2
+ export interface ParsedCliOutput {
3
+ text: string;
4
+ cliSessionId?: string;
5
+ usage?: CliRunUsage;
6
+ }
7
+ export interface ParsedCliStreamChunk {
8
+ text?: string;
9
+ cliSessionId?: string;
10
+ usage?: CliRunUsage;
11
+ kind?: 'assistant' | 'progress';
12
+ incremental?: boolean;
13
+ }
14
+ export interface CliOutputProbeSnapshot {
15
+ firstStdoutMs?: number;
16
+ firstStderrMs?: number;
17
+ threadStartedMs?: number;
18
+ firstAgentMessageMs?: number;
19
+ turnCompletedMs?: number;
20
+ reconnectCount: number;
21
+ fellBackToHttps: boolean;
22
+ cliSessionId?: string;
23
+ lastText?: string;
24
+ usage?: CliRunUsage;
25
+ }
26
+ export interface CliOutputProbe {
27
+ onStdout(chunk: string, atMs: number): void;
28
+ onStderr(chunk: string, atMs: number): void;
29
+ snapshot(): CliOutputProbeSnapshot;
30
+ }
31
+ export declare function createCliOutputProbe(params: {
32
+ backend: CliBackendConfig;
33
+ mode: 'json' | 'jsonl' | 'text';
34
+ }): CliOutputProbe;
35
+ export declare function parseCliOutput(raw: string, mode: 'json' | 'jsonl' | 'text', backend: CliBackendConfig): ParsedCliOutput | null;
36
+ export declare function parseCliStreamChunk(raw: string, mode: 'json' | 'jsonl' | 'text', backend: CliBackendConfig): ParsedCliStreamChunk | null;
37
+ export declare function parseCliJson(raw: string, backend: CliBackendConfig): ParsedCliOutput | null;
38
+ export declare function parseCliJsonl(raw: string, backend: CliBackendConfig): ParsedCliOutput | null;
39
+ export declare function pickCliSessionId(parsed: Record<string, unknown>, backend: CliBackendConfig): string | undefined;
40
+ export declare function collectText(value: unknown): string;
41
+ export declare function toUsage(raw: Record<string, unknown>): CliRunUsage | undefined;
42
+ export declare function isSessionExpiredError(error: unknown): boolean;
43
+ //# sourceMappingURL=cli-output.d.ts.map