@ai-devkit/agent-manager 0.33.0 → 0.34.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 (174) hide show
  1. package/dist/AgentManager.d.ts +11 -2
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +37 -6
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +212 -5
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/capacity/codex.test.js +2 -1
  8. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  9. package/dist/__tests__/capacity/index.test.js +6 -3
  10. package/dist/__tests__/capacity/index.test.js.map +1 -1
  11. package/dist/__tests__/capacity/zai.test.js +213 -0
  12. package/dist/__tests__/capacity/zai.test.js.map +1 -0
  13. package/dist/__tests__/{adapters → providers/copilot}/CopilotAdapter.test.js +19 -14
  14. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
  15. package/dist/__tests__/{adapters → providers/gemini}/GeminiCliAdapter.test.js +37 -29
  16. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -0
  17. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js +189 -0
  18. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js.map +1 -0
  19. package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js +89 -0
  20. package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js.map +1 -0
  21. package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js +94 -0
  22. package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js.map +1 -0
  23. package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js +147 -0
  24. package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js.map +1 -0
  25. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
  26. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
  27. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +37 -1
  28. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -1
  29. package/dist/__tests__/utils/AgentRegistry.test.js +20 -13
  30. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  31. package/dist/adapters/index.d.ts +3 -3
  32. package/dist/adapters/index.d.ts.map +1 -1
  33. package/dist/adapters/index.js +3 -3
  34. package/dist/adapters/index.js.map +1 -1
  35. package/dist/capacity/codex.d.ts +1 -0
  36. package/dist/capacity/codex.d.ts.map +1 -1
  37. package/dist/capacity/codex.js +9 -4
  38. package/dist/capacity/codex.js.map +1 -1
  39. package/dist/capacity/index.d.ts +8 -0
  40. package/dist/capacity/index.d.ts.map +1 -1
  41. package/dist/capacity/index.js +10 -9
  42. package/dist/capacity/index.js.map +1 -1
  43. package/dist/capacity/types.d.ts +8 -0
  44. package/dist/capacity/types.d.ts.map +1 -1
  45. package/dist/capacity/types.js.map +1 -1
  46. package/dist/capacity/zai.d.ts +14 -0
  47. package/dist/capacity/zai.d.ts.map +1 -0
  48. package/dist/capacity/zai.js +203 -0
  49. package/dist/capacity/zai.js.map +1 -0
  50. package/dist/index.d.ts +8 -6
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +5 -4
  53. package/dist/index.js.map +1 -1
  54. package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
  55. package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
  56. package/dist/providers/copilot/CopilotAdapter.js +108 -0
  57. package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
  58. package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
  59. package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
  60. package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
  61. package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
  62. package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
  63. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
  64. package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
  65. package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
  66. package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
  67. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
  68. package/dist/providers/copilot/CopilotSessionParser.js +181 -0
  69. package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
  70. package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
  71. package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
  72. package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
  73. package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
  74. package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
  75. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
  76. package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
  77. package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
  78. package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
  79. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
  80. package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
  81. package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
  82. package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
  83. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
  84. package/dist/providers/gemini/GeminiSessionParser.js +166 -0
  85. package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
  86. package/dist/{adapters → providers/opencode}/OpenCodeAdapter.d.ts +6 -12
  87. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +1 -0
  88. package/dist/providers/opencode/OpenCodeAdapter.js +86 -0
  89. package/dist/providers/opencode/OpenCodeAdapter.js.map +1 -0
  90. package/dist/providers/opencode/OpenCodeAgentMapper.d.ts +11 -0
  91. package/dist/providers/opencode/OpenCodeAgentMapper.d.ts.map +1 -0
  92. package/dist/providers/opencode/OpenCodeAgentMapper.js +50 -0
  93. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +1 -0
  94. package/dist/providers/opencode/OpenCodeSessionLocator.d.ts +21 -0
  95. package/dist/providers/opencode/OpenCodeSessionLocator.d.ts.map +1 -0
  96. package/dist/providers/opencode/OpenCodeSessionLocator.js +99 -0
  97. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +1 -0
  98. package/dist/providers/opencode/OpenCodeSessionParser.d.ts +18 -0
  99. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  100. package/dist/providers/opencode/OpenCodeSessionParser.js +104 -0
  101. package/dist/providers/opencode/OpenCodeSessionParser.js.map +1 -0
  102. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
  103. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
  104. package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
  105. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
  106. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +5 -0
  107. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -1
  108. package/dist/runtime/herdr/HerdrAgentRuntime.js +26 -8
  109. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -1
  110. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +2 -0
  111. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -1
  112. package/dist/runtime/herdr/HerdrResponseParsers.js +12 -1
  113. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -1
  114. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  115. package/dist/utils/AgentRegistry.js +5 -5
  116. package/dist/utils/AgentRegistry.js.map +1 -1
  117. package/package.json +1 -1
  118. package/src/AgentManager.ts +67 -5
  119. package/src/__tests__/AgentManager.test.ts +231 -5
  120. package/src/__tests__/capacity/codex.test.ts +94 -26
  121. package/src/__tests__/capacity/fixtures/zai-auth.json +6 -0
  122. package/src/__tests__/capacity/fixtures/zai-quota-invalid.json +7 -0
  123. package/src/__tests__/capacity/fixtures/zai-quota.json +38 -0
  124. package/src/__tests__/capacity/index.test.ts +10 -3
  125. package/src/__tests__/capacity/zai.test.ts +186 -0
  126. package/src/__tests__/{adapters → providers/copilot}/CopilotAdapter.test.ts +13 -16
  127. package/src/__tests__/{adapters → providers/gemini}/GeminiCliAdapter.test.ts +39 -31
  128. package/src/__tests__/providers/opencode/OpenCodeAdapter.test.ts +197 -0
  129. package/src/__tests__/providers/opencode/OpenCodeAgentMapper.test.ts +83 -0
  130. package/src/__tests__/providers/opencode/OpenCodeSessionLocator.test.ts +84 -0
  131. package/src/__tests__/providers/opencode/OpenCodeSessionParser.test.ts +148 -0
  132. package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
  133. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +20 -1
  134. package/src/__tests__/utils/AgentRegistry.test.ts +20 -10
  135. package/src/adapters/index.ts +3 -3
  136. package/src/capacity/codex.ts +96 -28
  137. package/src/capacity/index.ts +29 -11
  138. package/src/capacity/types.ts +8 -0
  139. package/src/capacity/zai.ts +237 -0
  140. package/src/index.ts +18 -6
  141. package/src/providers/copilot/CopilotAdapter.ts +145 -0
  142. package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
  143. package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
  144. package/src/providers/copilot/CopilotSessionParser.ts +289 -0
  145. package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
  146. package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
  147. package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
  148. package/src/providers/gemini/GeminiSessionParser.ts +271 -0
  149. package/src/providers/opencode/OpenCodeAdapter.ts +112 -0
  150. package/src/providers/opencode/OpenCodeAgentMapper.ts +61 -0
  151. package/src/providers/opencode/OpenCodeSessionLocator.ts +123 -0
  152. package/src/providers/opencode/OpenCodeSessionParser.ts +145 -0
  153. package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
  154. package/src/runtime/herdr/HerdrAgentRuntime.ts +33 -7
  155. package/src/runtime/herdr/HerdrResponseParsers.ts +11 -1
  156. package/src/utils/AgentRegistry.ts +8 -6
  157. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
  158. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
  159. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +0 -635
  160. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +0 -1
  161. package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
  162. package/dist/adapters/CopilotAdapter.js +0 -329
  163. package/dist/adapters/CopilotAdapter.js.map +0 -1
  164. package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
  165. package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
  166. package/dist/adapters/GeminiCliAdapter.js +0 -513
  167. package/dist/adapters/GeminiCliAdapter.js.map +0 -1
  168. package/dist/adapters/OpenCodeAdapter.d.ts.map +0 -1
  169. package/dist/adapters/OpenCodeAdapter.js +0 -286
  170. package/dist/adapters/OpenCodeAdapter.js.map +0 -1
  171. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +0 -543
  172. package/src/adapters/CopilotAdapter.ts +0 -483
  173. package/src/adapters/GeminiCliAdapter.ts +0 -699
  174. package/src/adapters/OpenCodeAdapter.ts +0 -369
@@ -0,0 +1,203 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const ZAI_QUOTA_URL = "https://api.z.ai/api/monitor/usage/quota/limit";
5
+ const MISSING_API_KEY_MESSAGE = "z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai";
6
+ const LIMIT_METADATA = {
7
+ TOKENS_LIMIT: {
8
+ id: "tokens",
9
+ label: "Tokens"
10
+ },
11
+ CREDIT_LIMIT: {
12
+ id: "credit",
13
+ label: "Credit"
14
+ },
15
+ TIME_LIMIT: {
16
+ id: "time",
17
+ label: "Time"
18
+ }
19
+ };
20
+ const UNIT_METADATA = new Map([
21
+ [
22
+ 1,
23
+ {
24
+ minutes: 24 * 60,
25
+ label: "day"
26
+ }
27
+ ],
28
+ [
29
+ 3,
30
+ {
31
+ minutes: 60,
32
+ label: "hour"
33
+ }
34
+ ],
35
+ [
36
+ 5,
37
+ {
38
+ minutes: 1,
39
+ label: "minute"
40
+ }
41
+ ],
42
+ [
43
+ 6,
44
+ {
45
+ minutes: 7 * 24 * 60,
46
+ label: "week"
47
+ }
48
+ ]
49
+ ]);
50
+ function record(value) {
51
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
52
+ }
53
+ function nonEmptyText(value) {
54
+ return typeof value === "string" && value.trim() ? value.trim() : null;
55
+ }
56
+ function optionalNumber(value, field) {
57
+ if (value === undefined || value === null) return null;
58
+ if (typeof value !== "number" || !Number.isFinite(value)) {
59
+ throw new Error(`Invalid z.ai quota ${field}`);
60
+ }
61
+ return value;
62
+ }
63
+ function clampPercent(value) {
64
+ return Math.max(0, Math.min(100, value));
65
+ }
66
+ function integer(value) {
67
+ return typeof value === "number" && Number.isInteger(value) ? value : null;
68
+ }
69
+ function isCapacityLimitType(value) {
70
+ return Object.hasOwn(LIMIT_METADATA, value);
71
+ }
72
+ function durationMinutes(unit, number, type) {
73
+ if (type === "TIME_LIMIT" && unit === 5 && number === 1) return 30 * 24 * 60;
74
+ const metadata = UNIT_METADATA.get(unit);
75
+ return metadata === undefined || number <= 0 ? null : metadata.minutes * number;
76
+ }
77
+ function windowLabel(type, unit, number) {
78
+ if (type === "TIME_LIMIT" && unit === 5 && number === 1) return "MCP · monthly";
79
+ const kind = LIMIT_METADATA[type].label;
80
+ const unitLabel = UNIT_METADATA.get(unit)?.label;
81
+ if (!unitLabel) return kind;
82
+ return `${kind} · ${number} ${unitLabel}${number === 1 ? "" : "s"}`;
83
+ }
84
+ function resetTime(value) {
85
+ const milliseconds = optionalNumber(value, "limit nextResetTime");
86
+ if (milliseconds === null) return null;
87
+ const date = new Date(milliseconds);
88
+ if (Number.isNaN(date.getTime())) throw new Error("Invalid z.ai quota limit nextResetTime");
89
+ return date.toISOString();
90
+ }
91
+ function availability(windows) {
92
+ if (windows.length === 0) return "unknown";
93
+ if (windows.some((window)=>window.usedPercent !== null && window.usedPercent < 100)) {
94
+ return "yes";
95
+ }
96
+ return "no";
97
+ }
98
+ function parseLimit(value, index) {
99
+ const limit = record(value);
100
+ if (!limit) throw new Error("Invalid z.ai quota limit entry");
101
+ const unit = integer(limit.unit);
102
+ const count = integer(limit.number);
103
+ if (typeof limit.type !== "string" || unit === null || count === null) {
104
+ throw new Error("Invalid z.ai quota limit entry");
105
+ }
106
+ const serverPercent = optionalNumber(limit.percentage, "limit percentage");
107
+ if (serverPercent === null) throw new Error("Invalid z.ai quota limit percentage");
108
+ if (!isCapacityLimitType(limit.type)) return null;
109
+ const total = optionalNumber(limit.usage, "limit usage");
110
+ const current = optionalNumber(limit.currentValue, "limit currentValue");
111
+ const remaining = optionalNumber(limit.remaining, "limit remaining");
112
+ let consumed = total !== null && remaining !== null ? total - remaining : null;
113
+ if (current !== null) consumed = Math.max(consumed ?? current, current);
114
+ let usedPercent = serverPercent;
115
+ if (total !== null && total > 0 && consumed !== null) {
116
+ usedPercent = consumed / total * 100;
117
+ }
118
+ const metadata = LIMIT_METADATA[limit.type];
119
+ return {
120
+ id: `zai:${metadata.id}:${index + 1}`,
121
+ label: windowLabel(limit.type, unit, count),
122
+ limitType: limit.type,
123
+ durationMinutes: durationMinutes(unit, count, limit.type),
124
+ usedPercent: clampPercent(usedPercent),
125
+ resetsAt: resetTime(limit.nextResetTime),
126
+ total,
127
+ current,
128
+ remaining
129
+ };
130
+ }
131
+ export async function resolveZaiApiKey(options = {}) {
132
+ const env = options.env ?? process.env;
133
+ const environmentKey = nonEmptyText(env.Z_AI_API_KEY);
134
+ if (environmentKey) return environmentKey;
135
+ const authPath = join(env.HOME || homedir(), ".pi", "agent", "auth.json");
136
+ let parsed;
137
+ try {
138
+ const contents = await (options.readFile ?? readFile)(authPath, "utf8");
139
+ const root = record(JSON.parse(contents));
140
+ if (!root) throw new Error("invalid");
141
+ parsed = root;
142
+ } catch (error) {
143
+ if (record(error)?.code === "ENOENT") {
144
+ throw new Error(MISSING_API_KEY_MESSAGE);
145
+ }
146
+ throw new Error("z.ai Pi auth file is malformed");
147
+ }
148
+ const credential = record(parsed.zai);
149
+ if (!credential) {
150
+ throw new Error(MISSING_API_KEY_MESSAGE);
151
+ }
152
+ const key = credential.type === "api_key" ? nonEmptyText(credential.key) : null;
153
+ if (!key) throw new Error("z.ai Pi auth file has a malformed zai credential");
154
+ return key;
155
+ }
156
+ export function parseZaiQuota(raw, checkedAt) {
157
+ const root = record(raw);
158
+ const data = record(root?.data);
159
+ if (root?.success !== true || root.code !== 200 || !data || !Array.isArray(data.limits)) {
160
+ throw new Error("Invalid z.ai quota response");
161
+ }
162
+ const windows = data.limits.map(parseLimit).filter((window)=>window !== null);
163
+ return {
164
+ harness: "pi",
165
+ provider: "zai",
166
+ generatedAt: checkedAt,
167
+ authenticated: true,
168
+ available: availability(windows),
169
+ windows,
170
+ creditsRemaining: null
171
+ };
172
+ }
173
+ export async function probeZaiCapacity(options) {
174
+ const key = await resolveZaiApiKey(options);
175
+ const controller = new AbortController();
176
+ const timer = setTimeout(()=>controller.abort(), options.timeoutMs ?? 5000);
177
+ let response;
178
+ try {
179
+ response = await (options.fetch ?? globalThis.fetch)(ZAI_QUOTA_URL, {
180
+ method: "GET",
181
+ headers: {
182
+ Authorization: `Bearer ${key}`
183
+ },
184
+ signal: controller.signal
185
+ });
186
+ } catch {
187
+ throw new Error("z.ai quota request failed");
188
+ } finally{
189
+ clearTimeout(timer);
190
+ }
191
+ if (response.status !== 200) {
192
+ throw new Error(`z.ai quota request failed: HTTP ${response.status}`);
193
+ }
194
+ let raw;
195
+ try {
196
+ raw = await response.json();
197
+ } catch {
198
+ throw new Error("z.ai quota response is not valid JSON");
199
+ }
200
+ return parseZaiQuota(raw, options.checkedAt);
201
+ }
202
+
203
+ //# sourceMappingURL=zai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/capacity/zai.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type {\n Availability,\n CapacityLimitType,\n CapacityReport,\n CapacityWindow,\n} from \"./types.js\";\n\nconst ZAI_QUOTA_URL = \"https://api.z.ai/api/monitor/usage/quota/limit\";\nconst MISSING_API_KEY_MESSAGE =\n \"z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai\";\nconst LIMIT_METADATA = {\n TOKENS_LIMIT: { id: \"tokens\", label: \"Tokens\" },\n CREDIT_LIMIT: { id: \"credit\", label: \"Credit\" },\n TIME_LIMIT: { id: \"time\", label: \"Time\" },\n} as const satisfies Record<CapacityLimitType, { id: string; label: string }>;\nconst UNIT_METADATA = new Map<number, { minutes: number; label: string }>([\n [1, { minutes: 24 * 60, label: \"day\" }],\n [3, { minutes: 60, label: \"hour\" }],\n [5, { minutes: 1, label: \"minute\" }],\n [6, { minutes: 7 * 24 * 60, label: \"week\" }],\n]);\ntype UnknownRecord = Record<string, unknown>;\n\nexport type ZaiCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n};\n\nexport type ZaiProbeOptions = ZaiCredentialOptions & {\n checkedAt: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n};\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction optionalNumber(value: unknown, field: string): number | null {\n if (value === undefined || value === null) return null;\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`Invalid z.ai quota ${field}`);\n }\n return value;\n}\n\nfunction clampPercent(value: number): number {\n return Math.max(0, Math.min(100, value));\n}\n\nfunction integer(value: unknown): number | null {\n return typeof value === \"number\" && Number.isInteger(value) ? value : null;\n}\n\nfunction isCapacityLimitType(value: string): value is CapacityLimitType {\n return Object.hasOwn(LIMIT_METADATA, value);\n}\n\nfunction durationMinutes(\n unit: number,\n number: number,\n type: CapacityLimitType,\n): number | null {\n if (type === \"TIME_LIMIT\" && unit === 5 && number === 1) return 30 * 24 * 60;\n const metadata = UNIT_METADATA.get(unit);\n return metadata === undefined || number <= 0\n ? null\n : metadata.minutes * number;\n}\n\nfunction windowLabel(\n type: CapacityLimitType,\n unit: number,\n number: number,\n): string {\n if (type === \"TIME_LIMIT\" && unit === 5 && number === 1)\n return \"MCP · monthly\";\n const kind = LIMIT_METADATA[type].label;\n const unitLabel = UNIT_METADATA.get(unit)?.label;\n if (!unitLabel) return kind;\n return `${kind} · ${number} ${unitLabel}${number === 1 ? \"\" : \"s\"}`;\n}\n\nfunction resetTime(value: unknown): string | null {\n const milliseconds = optionalNumber(value, \"limit nextResetTime\");\n if (milliseconds === null) return null;\n const date = new Date(milliseconds);\n if (Number.isNaN(date.getTime()))\n throw new Error(\"Invalid z.ai quota limit nextResetTime\");\n return date.toISOString();\n}\n\nfunction availability(windows: CapacityWindow[]): Availability {\n if (windows.length === 0) return \"unknown\";\n if (\n windows.some(\n (window) => window.usedPercent !== null && window.usedPercent < 100,\n )\n ) {\n return \"yes\";\n }\n return \"no\";\n}\n\nfunction parseLimit(value: unknown, index: number): CapacityWindow | null {\n const limit = record(value);\n if (!limit) throw new Error(\"Invalid z.ai quota limit entry\");\n const unit = integer(limit.unit);\n const count = integer(limit.number);\n if (typeof limit.type !== \"string\" || unit === null || count === null) {\n throw new Error(\"Invalid z.ai quota limit entry\");\n }\n const serverPercent = optionalNumber(limit.percentage, \"limit percentage\");\n if (serverPercent === null)\n throw new Error(\"Invalid z.ai quota limit percentage\");\n if (!isCapacityLimitType(limit.type)) return null;\n\n const total = optionalNumber(limit.usage, \"limit usage\");\n const current = optionalNumber(limit.currentValue, \"limit currentValue\");\n const remaining = optionalNumber(limit.remaining, \"limit remaining\");\n let consumed =\n total !== null && remaining !== null ? total - remaining : null;\n if (current !== null) consumed = Math.max(consumed ?? current, current);\n\n let usedPercent = serverPercent;\n if (total !== null && total > 0 && consumed !== null) {\n usedPercent = (consumed / total) * 100;\n }\n const metadata = LIMIT_METADATA[limit.type];\n\n return {\n id: `zai:${metadata.id}:${index + 1}`,\n label: windowLabel(limit.type, unit, count),\n limitType: limit.type,\n durationMinutes: durationMinutes(unit, count, limit.type),\n usedPercent: clampPercent(usedPercent),\n resetsAt: resetTime(limit.nextResetTime),\n total,\n current,\n remaining,\n };\n}\n\nexport async function resolveZaiApiKey(\n options: ZaiCredentialOptions = {},\n): Promise<string> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.Z_AI_API_KEY);\n if (environmentKey) return environmentKey;\n\n const authPath = join(env.HOME || homedir(), \".pi\", \"agent\", \"auth.json\");\n let parsed: UnknownRecord;\n try {\n const contents = await (options.readFile ?? readFile)(authPath, \"utf8\");\n const root = record(JSON.parse(contents));\n if (!root) throw new Error(\"invalid\");\n parsed = root;\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") {\n throw new Error(MISSING_API_KEY_MESSAGE);\n }\n throw new Error(\"z.ai Pi auth file is malformed\");\n }\n\n const credential = record(parsed.zai);\n if (!credential) {\n throw new Error(MISSING_API_KEY_MESSAGE);\n }\n const key =\n credential.type === \"api_key\" ? nonEmptyText(credential.key) : null;\n if (!key) throw new Error(\"z.ai Pi auth file has a malformed zai credential\");\n return key;\n}\n\nexport function parseZaiQuota(raw: unknown, checkedAt: string): CapacityReport {\n const root = record(raw);\n const data = record(root?.data);\n if (\n root?.success !== true ||\n root.code !== 200 ||\n !data ||\n !Array.isArray(data.limits)\n ) {\n throw new Error(\"Invalid z.ai quota response\");\n }\n const windows = data.limits\n .map(parseLimit)\n .filter((window): window is CapacityWindow => window !== null);\n return {\n harness: \"pi\",\n provider: \"zai\",\n generatedAt: checkedAt,\n authenticated: true,\n available: availability(windows),\n windows,\n creditsRemaining: null,\n };\n}\n\nexport async function probeZaiCapacity(\n options: ZaiProbeOptions,\n): Promise<CapacityReport> {\n const key = await resolveZaiApiKey(options);\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 5000);\n let response: Response;\n try {\n response = await (options.fetch ?? globalThis.fetch)(ZAI_QUOTA_URL, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${key}` },\n signal: controller.signal,\n });\n } catch {\n throw new Error(\"z.ai quota request failed\");\n } finally {\n clearTimeout(timer);\n }\n if (response.status !== 200) {\n throw new Error(`z.ai quota request failed: HTTP ${response.status}`);\n }\n let raw: unknown;\n try {\n raw = await response.json();\n } catch {\n throw new Error(\"z.ai quota response is not valid JSON\");\n }\n return parseZaiQuota(raw, options.checkedAt);\n}\n"],"names":["readFile","homedir","join","ZAI_QUOTA_URL","MISSING_API_KEY_MESSAGE","LIMIT_METADATA","TOKENS_LIMIT","id","label","CREDIT_LIMIT","TIME_LIMIT","UNIT_METADATA","Map","minutes","record","value","Array","isArray","nonEmptyText","trim","optionalNumber","field","undefined","Number","isFinite","Error","clampPercent","Math","max","min","integer","isInteger","isCapacityLimitType","Object","hasOwn","durationMinutes","unit","number","type","metadata","get","windowLabel","kind","unitLabel","resetTime","milliseconds","date","Date","isNaN","getTime","toISOString","availability","windows","length","some","window","usedPercent","parseLimit","index","limit","count","serverPercent","percentage","total","usage","current","currentValue","remaining","consumed","limitType","resetsAt","nextResetTime","resolveZaiApiKey","options","env","process","environmentKey","Z_AI_API_KEY","authPath","HOME","parsed","contents","root","JSON","parse","error","code","credential","zai","key","parseZaiQuota","raw","checkedAt","data","success","limits","map","filter","harness","provider","generatedAt","authenticated","available","creditsRemaining","probeZaiCapacity","controller","AbortController","timer","setTimeout","abort","timeoutMs","response","fetch","globalThis","method","headers","Authorization","signal","clearTimeout","status","json"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,OAAO,QAAQ,UAAU;AAClC,SAASC,IAAI,QAAQ,YAAY;AAQjC,MAAMC,gBAAgB;AACtB,MAAMC,0BACJ;AACF,MAAMC,iBAAiB;IACrBC,cAAc;QAAEC,IAAI;QAAUC,OAAO;IAAS;IAC9CC,cAAc;QAAEF,IAAI;QAAUC,OAAO;IAAS;IAC9CE,YAAY;QAAEH,IAAI;QAAQC,OAAO;IAAO;AAC1C;AACA,MAAMG,gBAAgB,IAAIC,IAAgD;IACxE;QAAC;QAAG;YAAEC,SAAS,KAAK;YAAIL,OAAO;QAAM;KAAE;IACvC;QAAC;QAAG;YAAEK,SAAS;YAAIL,OAAO;QAAO;KAAE;IACnC;QAAC;QAAG;YAAEK,SAAS;YAAGL,OAAO;QAAS;KAAE;IACpC;QAAC;QAAG;YAAEK,SAAS,IAAI,KAAK;YAAIL,OAAO;QAAO;KAAE;CAC7C;AAcD,SAASM,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMI,IAAI,KAAKJ,MAAMI,IAAI,KAAK;AACpE;AAEA,SAASC,eAAeL,KAAc,EAAEM,KAAa;IACnD,IAAIN,UAAUO,aAAaP,UAAU,MAAM,OAAO;IAClD,IAAI,OAAOA,UAAU,YAAY,CAACQ,OAAOC,QAAQ,CAACT,QAAQ;QACxD,MAAM,IAAIU,MAAM,CAAC,mBAAmB,EAAEJ,OAAO;IAC/C;IACA,OAAON;AACT;AAEA,SAASW,aAAaX,KAAa;IACjC,OAAOY,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,KAAKd;AACnC;AAEA,SAASe,QAAQf,KAAc;IAC7B,OAAO,OAAOA,UAAU,YAAYQ,OAAOQ,SAAS,CAAChB,SAASA,QAAQ;AACxE;AAEA,SAASiB,oBAAoBjB,KAAa;IACxC,OAAOkB,OAAOC,MAAM,CAAC7B,gBAAgBU;AACvC;AAEA,SAASoB,gBACPC,IAAY,EACZC,MAAc,EACdC,IAAuB;IAEvB,IAAIA,SAAS,gBAAgBF,SAAS,KAAKC,WAAW,GAAG,OAAO,KAAK,KAAK;IAC1E,MAAME,WAAW5B,cAAc6B,GAAG,CAACJ;IACnC,OAAOG,aAAajB,aAAae,UAAU,IACvC,OACAE,SAAS1B,OAAO,GAAGwB;AACzB;AAEA,SAASI,YACPH,IAAuB,EACvBF,IAAY,EACZC,MAAc;IAEd,IAAIC,SAAS,gBAAgBF,SAAS,KAAKC,WAAW,GACpD,OAAO;IACT,MAAMK,OAAOrC,cAAc,CAACiC,KAAK,CAAC9B,KAAK;IACvC,MAAMmC,YAAYhC,cAAc6B,GAAG,CAACJ,OAAO5B;IAC3C,IAAI,CAACmC,WAAW,OAAOD;IACvB,OAAO,GAAGA,KAAK,GAAG,EAAEL,OAAO,CAAC,EAAEM,YAAYN,WAAW,IAAI,KAAK,KAAK;AACrE;AAEA,SAASO,UAAU7B,KAAc;IAC/B,MAAM8B,eAAezB,eAAeL,OAAO;IAC3C,IAAI8B,iBAAiB,MAAM,OAAO;IAClC,MAAMC,OAAO,IAAIC,KAAKF;IACtB,IAAItB,OAAOyB,KAAK,CAACF,KAAKG,OAAO,KAC3B,MAAM,IAAIxB,MAAM;IAClB,OAAOqB,KAAKI,WAAW;AACzB;AAEA,SAASC,aAAaC,OAAyB;IAC7C,IAAIA,QAAQC,MAAM,KAAK,GAAG,OAAO;IACjC,IACED,QAAQE,IAAI,CACV,CAACC,SAAWA,OAAOC,WAAW,KAAK,QAAQD,OAAOC,WAAW,GAAG,MAElE;QACA,OAAO;IACT;IACA,OAAO;AACT;AAEA,SAASC,WAAW1C,KAAc,EAAE2C,KAAa;IAC/C,MAAMC,QAAQ7C,OAAOC;IACrB,IAAI,CAAC4C,OAAO,MAAM,IAAIlC,MAAM;IAC5B,MAAMW,OAAON,QAAQ6B,MAAMvB,IAAI;IAC/B,MAAMwB,QAAQ9B,QAAQ6B,MAAMtB,MAAM;IAClC,IAAI,OAAOsB,MAAMrB,IAAI,KAAK,YAAYF,SAAS,QAAQwB,UAAU,MAAM;QACrE,MAAM,IAAInC,MAAM;IAClB;IACA,MAAMoC,gBAAgBzC,eAAeuC,MAAMG,UAAU,EAAE;IACvD,IAAID,kBAAkB,MACpB,MAAM,IAAIpC,MAAM;IAClB,IAAI,CAACO,oBAAoB2B,MAAMrB,IAAI,GAAG,OAAO;IAE7C,MAAMyB,QAAQ3C,eAAeuC,MAAMK,KAAK,EAAE;IAC1C,MAAMC,UAAU7C,eAAeuC,MAAMO,YAAY,EAAE;IACnD,MAAMC,YAAY/C,eAAeuC,MAAMQ,SAAS,EAAE;IAClD,IAAIC,WACFL,UAAU,QAAQI,cAAc,OAAOJ,QAAQI,YAAY;IAC7D,IAAIF,YAAY,MAAMG,WAAWzC,KAAKC,GAAG,CAACwC,YAAYH,SAASA;IAE/D,IAAIT,cAAcK;IAClB,IAAIE,UAAU,QAAQA,QAAQ,KAAKK,aAAa,MAAM;QACpDZ,cAAc,AAACY,WAAWL,QAAS;IACrC;IACA,MAAMxB,WAAWlC,cAAc,CAACsD,MAAMrB,IAAI,CAAC;IAE3C,OAAO;QACL/B,IAAI,CAAC,IAAI,EAAEgC,SAAShC,EAAE,CAAC,CAAC,EAAEmD,QAAQ,GAAG;QACrClD,OAAOiC,YAAYkB,MAAMrB,IAAI,EAAEF,MAAMwB;QACrCS,WAAWV,MAAMrB,IAAI;QACrBH,iBAAiBA,gBAAgBC,MAAMwB,OAAOD,MAAMrB,IAAI;QACxDkB,aAAa9B,aAAa8B;QAC1Bc,UAAU1B,UAAUe,MAAMY,aAAa;QACvCR;QACAE;QACAE;IACF;AACF;AAEA,OAAO,eAAeK,iBACpBC,UAAgC,CAAC,CAAC;IAElC,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,iBAAiB1D,aAAawD,IAAIG,YAAY;IACpD,IAAID,gBAAgB,OAAOA;IAE3B,MAAME,WAAW5E,KAAKwE,IAAIK,IAAI,IAAI9E,WAAW,OAAO,SAAS;IAC7D,IAAI+E;IACJ,IAAI;QACF,MAAMC,WAAW,MAAM,AAACR,CAAAA,QAAQzE,QAAQ,IAAIA,QAAO,EAAG8E,UAAU;QAChE,MAAMI,OAAOpE,OAAOqE,KAAKC,KAAK,CAACH;QAC/B,IAAI,CAACC,MAAM,MAAM,IAAIzD,MAAM;QAC3BuD,SAASE;IACX,EAAE,OAAOG,OAAO;QACd,IAAIvE,OAAOuE,QAAQC,SAAS,UAAU;YACpC,MAAM,IAAI7D,MAAMrB;QAClB;QACA,MAAM,IAAIqB,MAAM;IAClB;IAEA,MAAM8D,aAAazE,OAAOkE,OAAOQ,GAAG;IACpC,IAAI,CAACD,YAAY;QACf,MAAM,IAAI9D,MAAMrB;IAClB;IACA,MAAMqF,MACJF,WAAWjD,IAAI,KAAK,YAAYpB,aAAaqE,WAAWE,GAAG,IAAI;IACjE,IAAI,CAACA,KAAK,MAAM,IAAIhE,MAAM;IAC1B,OAAOgE;AACT;AAEA,OAAO,SAASC,cAAcC,GAAY,EAAEC,SAAiB;IAC3D,MAAMV,OAAOpE,OAAO6E;IACpB,MAAME,OAAO/E,OAAOoE,MAAMW;IAC1B,IACEX,MAAMY,YAAY,QAClBZ,KAAKI,IAAI,KAAK,OACd,CAACO,QACD,CAAC7E,MAAMC,OAAO,CAAC4E,KAAKE,MAAM,GAC1B;QACA,MAAM,IAAItE,MAAM;IAClB;IACA,MAAM2B,UAAUyC,KAAKE,MAAM,CACxBC,GAAG,CAACvC,YACJwC,MAAM,CAAC,CAAC1C,SAAqCA,WAAW;IAC3D,OAAO;QACL2C,SAAS;QACTC,UAAU;QACVC,aAAaR;QACbS,eAAe;QACfC,WAAWnD,aAAaC;QACxBA;QACAmD,kBAAkB;IACpB;AACF;AAEA,OAAO,eAAeC,iBACpB/B,OAAwB;IAExB,MAAMgB,MAAM,MAAMjB,iBAAiBC;IACnC,MAAMgC,aAAa,IAAIC;IACvB,MAAMC,QAAQC,WAAW,IAAMH,WAAWI,KAAK,IAAIpC,QAAQqC,SAAS,IAAI;IACxE,IAAIC;IACJ,IAAI;QACFA,WAAW,MAAM,AAACtC,CAAAA,QAAQuC,KAAK,IAAIC,WAAWD,KAAK,AAAD,EAAG7G,eAAe;YAClE+G,QAAQ;YACRC,SAAS;gBAAEC,eAAe,CAAC,OAAO,EAAE3B,KAAK;YAAC;YAC1C4B,QAAQZ,WAAWY,MAAM;QAC3B;IACF,EAAE,OAAM;QACN,MAAM,IAAI5F,MAAM;IAClB,SAAU;QACR6F,aAAaX;IACf;IACA,IAAII,SAASQ,MAAM,KAAK,KAAK;QAC3B,MAAM,IAAI9F,MAAM,CAAC,gCAAgC,EAAEsF,SAASQ,MAAM,EAAE;IACtE;IACA,IAAI5B;IACJ,IAAI;QACFA,MAAM,MAAMoB,SAASS,IAAI;IAC3B,EAAE,OAAM;QACN,MAAM,IAAI/F,MAAM;IAClB;IACA,OAAOiE,cAAcC,KAAKlB,QAAQmB,SAAS;AAC7C"}
package/dist/index.d.ts CHANGED
@@ -1,21 +1,23 @@
1
1
  export { AgentManager, AgentNotRunningError } from "./AgentManager.js";
2
- export { getCodexCapacityReport } from "./capacity/index.js";
3
- export type { CapacityProbeOptions, CapacityReport, CapacityWindow } from "./capacity/index.js";
2
+ export { getCodexCapacityReport, getZaiCapacityReport } from "./capacity/index.js";
3
+ export type { CapacityProbeOptions, CapacityReport, CapacityWindow, ZaiCapacityOptions, } from "./capacity/index.js";
4
4
  export { getAgentReadinessReport, getAgentReadinessReports, worstReadinessStatus, } from "./readiness/AgentReadiness.js";
5
5
  export type { AgentReadinessOptions, AgentReadinessReport, AuthReadinessCheck, BuiltInSkillsReadinessCheck, DirectoryReadinessCheck, ExecutableReadinessCheck, IntegrationReadinessCheck, ReadinessAgentType, ReadinessAuthState, ReadinessCheck, ReadinessStatus, } from "./readiness/AgentReadiness.js";
6
6
  export { ClaudeCodeAdapter } from "./providers/claude/ClaudeCodeAdapter.js";
7
7
  export { CodexAdapter } from "./providers/codex/CodexAdapter.js";
8
- export { CopilotAdapter } from "./adapters/CopilotAdapter.js";
9
- export { GeminiCliAdapter } from "./adapters/GeminiCliAdapter.js";
8
+ export { CopilotAdapter } from "./providers/copilot/CopilotAdapter.js";
9
+ export { GeminiCliAdapter } from "./providers/gemini/GeminiCliAdapter.js";
10
10
  export { GrokCliAdapter } from "./adapters/GrokCliAdapter.js";
11
- export { OpenCodeAdapter } from "./adapters/OpenCodeAdapter.js";
11
+ export { OpenCodeAdapter } from "./providers/opencode/OpenCodeAdapter.js";
12
12
  export { PiAdapter } from "./providers/pi/PiAdapter.js";
13
13
  export { AgentStatus } from "./adapters/AgentAdapter.js";
14
14
  export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext, } from "./adapters/AgentAdapter.js";
15
15
  export { TerminalFocusManager, TerminalType } from "./terminal/TerminalFocusManager.js";
16
16
  export type { TerminalLocation } from "./terminal/TerminalFocusManager.js";
17
17
  export { TtyWriter } from "./terminal/TtyWriter.js";
18
- export type { ListAgentsOptions } from "./AgentManager.js";
18
+ export type { AgentManagerOptions, ListAgentsOptions } from "./AgentManager.js";
19
+ export { extractHerdrAgentPanes, fetchHerdrAgentPanes, findMatchingHerdrPane, herdrPaneToRuntimeRef, } from "./runtime/herdr/HerdrAgentDiscovery.js";
20
+ export type { HerdrAgentPane } from "./runtime/herdr/HerdrAgentDiscovery.js";
19
21
  export { AgentRegistry, RenameNotFoundError, RenameConflictError, AGENT_RUNTIME_PROVIDERS, parseTmuxRuntimeRef, } from "./utils/AgentRegistry.js";
20
22
  export type { AgentRegistryOptions, RegistryEntry, AgentRuntimeProvider, TmuxRuntimeRef, } from "./utils/AgentRegistry.js";
21
23
  export { TmuxManager } from "./terminal/TmuxManager.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,16 +1,17 @@
1
1
  export { AgentManager, AgentNotRunningError } from "./AgentManager.js";
2
- export { getCodexCapacityReport } from "./capacity/index.js";
2
+ export { getCodexCapacityReport, getZaiCapacityReport } from "./capacity/index.js";
3
3
  export { getAgentReadinessReport, getAgentReadinessReports, worstReadinessStatus } from "./readiness/AgentReadiness.js";
4
4
  export { ClaudeCodeAdapter } from "./providers/claude/ClaudeCodeAdapter.js";
5
5
  export { CodexAdapter } from "./providers/codex/CodexAdapter.js";
6
- export { CopilotAdapter } from "./adapters/CopilotAdapter.js";
7
- export { GeminiCliAdapter } from "./adapters/GeminiCliAdapter.js";
6
+ export { CopilotAdapter } from "./providers/copilot/CopilotAdapter.js";
7
+ export { GeminiCliAdapter } from "./providers/gemini/GeminiCliAdapter.js";
8
8
  export { GrokCliAdapter } from "./adapters/GrokCliAdapter.js";
9
- export { OpenCodeAdapter } from "./adapters/OpenCodeAdapter.js";
9
+ export { OpenCodeAdapter } from "./providers/opencode/OpenCodeAdapter.js";
10
10
  export { PiAdapter } from "./providers/pi/PiAdapter.js";
11
11
  export { AgentStatus } from "./adapters/AgentAdapter.js";
12
12
  export { TerminalFocusManager, TerminalType } from "./terminal/TerminalFocusManager.js";
13
13
  export { TtyWriter } from "./terminal/TtyWriter.js";
14
+ export { extractHerdrAgentPanes, fetchHerdrAgentPanes, findMatchingHerdrPane, herdrPaneToRuntimeRef } from "./runtime/herdr/HerdrAgentDiscovery.js";
14
15
  export { AgentRegistry, RenameNotFoundError, RenameConflictError, AGENT_RUNTIME_PROVIDERS, parseTmuxRuntimeRef } from "./utils/AgentRegistry.js";
15
16
  export { TmuxManager } from "./terminal/TmuxManager.js";
16
17
  export { startAgent, stopAgent, focusAgent, sendAgentPrompt, TmuxUnavailableError, AgentNameInUseError, AgentPidPollTimeoutError, AgentRuntimeUnavailableError, AgentTerminalNotFoundError, DEFAULT_PID_POLL_INTERVAL_MS, DEFAULT_PID_POLL_TIMEOUT_MS } from "./runtime/ManagedAgentRuntime.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from \"./AgentManager.js\";\nexport { getCodexCapacityReport } from \"./capacity/index.js\";\nexport type { CapacityProbeOptions, CapacityReport, CapacityWindow } from \"./capacity/index.js\";\nexport {\n getAgentReadinessReport,\n getAgentReadinessReports,\n worstReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n AuthReadinessCheck,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n IntegrationReadinessCheck,\n ReadinessAgentType,\n ReadinessAuthState,\n ReadinessCheck,\n ReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\n\nexport { ClaudeCodeAdapter } from \"./providers/claude/ClaudeCodeAdapter.js\";\nexport { CodexAdapter } from \"./providers/codex/CodexAdapter.js\";\nexport { CopilotAdapter } from \"./adapters/CopilotAdapter.js\";\nexport { GeminiCliAdapter } from \"./adapters/GeminiCliAdapter.js\";\nexport { GrokCliAdapter } from \"./adapters/GrokCliAdapter.js\";\nexport { OpenCodeAdapter } from \"./adapters/OpenCodeAdapter.js\";\nexport { PiAdapter } from \"./providers/pi/PiAdapter.js\";\nexport { AgentStatus } from \"./adapters/AgentAdapter.js\";\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"./adapters/AgentAdapter.js\";\n\nexport { TerminalFocusManager, TerminalType } from \"./terminal/TerminalFocusManager.js\";\nexport type { TerminalLocation } from \"./terminal/TerminalFocusManager.js\";\nexport { TtyWriter } from \"./terminal/TtyWriter.js\";\n\nexport type { ListAgentsOptions } from \"./AgentManager.js\";\n\nexport {\n AgentRegistry,\n RenameNotFoundError,\n RenameConflictError,\n AGENT_RUNTIME_PROVIDERS,\n parseTmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport type {\n AgentRegistryOptions,\n RegistryEntry,\n AgentRuntimeProvider,\n TmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport { TmuxManager } from \"./terminal/TmuxManager.js\";\nexport type { AgentRuntimeAvailability, InteractiveAgentRuntime } from \"./runtime/types.js\";\nexport {\n startAgent,\n stopAgent,\n focusAgent,\n sendAgentPrompt,\n TmuxUnavailableError,\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n DEFAULT_PID_POLL_INTERVAL_MS,\n DEFAULT_PID_POLL_TIMEOUT_MS,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport type {\n FocusAgentDeps,\n StartAgentDeps,\n StartAgentOptions,\n StopAgentDeps,\n StopAgentResult,\n FocusAgentResult,\n SendAgentPromptDeps,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport { AGENTS } from \"./utils/agents.js\";\nexport type { AgentConfig, StartableAgentType } from \"./utils/agents.js\";\n\nexport type { AgentRequest } from \"./utils/agent-requests.js\";\nexport {\n getAgentRequestPath,\n readLatestAgentRequest,\n writeAgentRequest,\n} from \"./utils/agent-requests.js\";\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from \"./durable/DurableAgent.js\";\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from \"./durable/DurableAgent.js\";\nexport { DurableAgentRepository } from \"./durable/DurableAgentRepository.js\";\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from \"./durable/DurableAgentRepository.js\";\nexport { ClaudePrintAgentService } from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport { CodexCliProbe } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport type { CodexCliProbeOptions } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport { CodexPrintRunner } from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport { CodexPrintAgentService } from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport { PiCliProbe } from \"./providers/pi/durable/PiCliProbe.js\";\nexport type { PiCliProbeOptions } from \"./providers/pi/durable/PiCliProbe.js\";\nexport { PiPrintRunner } from \"./providers/pi/durable/PiPrintRunner.js\";\nexport type {\n PiPrintRunnerOptions,\n PiPrintRunRequest,\n PiPrintRunResult,\n} from \"./providers/pi/durable/PiPrintRunner.js\";\nexport { PiPrintAgentService } from \"./providers/pi/durable/PiPrintAgentService.js\";\nexport type {\n PiPrintAgentServiceOptions,\n PiPrintSendResult,\n} from \"./providers/pi/durable/PiPrintAgentService.js\";\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","getAgentReadinessReport","getAgentReadinessReports","worstReadinessStatus","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","AGENT_RUNTIME_PROVIDERS","parseTmuxRuntimeRef","TmuxManager","startAgent","stopAgent","focusAgent","sendAgentPrompt","TmuxUnavailableError","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAE7D,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,QACf,gCAAgC;AAevC,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,oCAAoC;AACjE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SACEC,aAAa,EACbC,mBAAmB,EACnBC,mBAAmB,EACnBC,uBAAuB,EACvBC,mBAAmB,QACd,2BAA2B;AAOlC,SAASC,WAAW,QAAQ,4BAA4B;AAExD,SACEC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,2BAA2B,QACtB,mCAAmC;AAU1C,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SACEC,mBAAmB,EACnBC,sBAAsB,EACtBC,iBAAiB,QACZ,4BAA4B;AAEnC,SACEC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACP,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAMxE,SAASC,mBAAmB,QAAQ,gDAAgD"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from \"./AgentManager.js\";\nexport { getCodexCapacityReport, getZaiCapacityReport } from \"./capacity/index.js\";\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n ZaiCapacityOptions,\n} from \"./capacity/index.js\";\nexport {\n getAgentReadinessReport,\n getAgentReadinessReports,\n worstReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n AuthReadinessCheck,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n IntegrationReadinessCheck,\n ReadinessAgentType,\n ReadinessAuthState,\n ReadinessCheck,\n ReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\n\nexport { ClaudeCodeAdapter } from \"./providers/claude/ClaudeCodeAdapter.js\";\nexport { CodexAdapter } from \"./providers/codex/CodexAdapter.js\";\nexport { CopilotAdapter } from \"./providers/copilot/CopilotAdapter.js\";\nexport { GeminiCliAdapter } from \"./providers/gemini/GeminiCliAdapter.js\";\nexport { GrokCliAdapter } from \"./adapters/GrokCliAdapter.js\";\nexport { OpenCodeAdapter } from \"./providers/opencode/OpenCodeAdapter.js\";\nexport { PiAdapter } from \"./providers/pi/PiAdapter.js\";\nexport { AgentStatus } from \"./adapters/AgentAdapter.js\";\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"./adapters/AgentAdapter.js\";\n\nexport { TerminalFocusManager, TerminalType } from \"./terminal/TerminalFocusManager.js\";\nexport type { TerminalLocation } from \"./terminal/TerminalFocusManager.js\";\nexport { TtyWriter } from \"./terminal/TtyWriter.js\";\n\nexport type { AgentManagerOptions, ListAgentsOptions } from \"./AgentManager.js\";\nexport {\n extractHerdrAgentPanes,\n fetchHerdrAgentPanes,\n findMatchingHerdrPane,\n herdrPaneToRuntimeRef,\n} from \"./runtime/herdr/HerdrAgentDiscovery.js\";\nexport type { HerdrAgentPane } from \"./runtime/herdr/HerdrAgentDiscovery.js\";\n\nexport {\n AgentRegistry,\n RenameNotFoundError,\n RenameConflictError,\n AGENT_RUNTIME_PROVIDERS,\n parseTmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport type {\n AgentRegistryOptions,\n RegistryEntry,\n AgentRuntimeProvider,\n TmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport { TmuxManager } from \"./terminal/TmuxManager.js\";\nexport type { AgentRuntimeAvailability, InteractiveAgentRuntime } from \"./runtime/types.js\";\nexport {\n startAgent,\n stopAgent,\n focusAgent,\n sendAgentPrompt,\n TmuxUnavailableError,\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n DEFAULT_PID_POLL_INTERVAL_MS,\n DEFAULT_PID_POLL_TIMEOUT_MS,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport type {\n FocusAgentDeps,\n StartAgentDeps,\n StartAgentOptions,\n StopAgentDeps,\n StopAgentResult,\n FocusAgentResult,\n SendAgentPromptDeps,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport { AGENTS } from \"./utils/agents.js\";\nexport type { AgentConfig, StartableAgentType } from \"./utils/agents.js\";\n\nexport type { AgentRequest } from \"./utils/agent-requests.js\";\nexport {\n getAgentRequestPath,\n readLatestAgentRequest,\n writeAgentRequest,\n} from \"./utils/agent-requests.js\";\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from \"./durable/DurableAgent.js\";\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from \"./durable/DurableAgent.js\";\nexport { DurableAgentRepository } from \"./durable/DurableAgentRepository.js\";\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from \"./durable/DurableAgentRepository.js\";\nexport { ClaudePrintAgentService } from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport { CodexCliProbe } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport type { CodexCliProbeOptions } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport { CodexPrintRunner } from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport { CodexPrintAgentService } from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport { PiCliProbe } from \"./providers/pi/durable/PiCliProbe.js\";\nexport type { PiCliProbeOptions } from \"./providers/pi/durable/PiCliProbe.js\";\nexport { PiPrintRunner } from \"./providers/pi/durable/PiPrintRunner.js\";\nexport type {\n PiPrintRunnerOptions,\n PiPrintRunRequest,\n PiPrintRunResult,\n} from \"./providers/pi/durable/PiPrintRunner.js\";\nexport { PiPrintAgentService } from \"./providers/pi/durable/PiPrintAgentService.js\";\nexport type {\n PiPrintAgentServiceOptions,\n PiPrintSendResult,\n} from \"./providers/pi/durable/PiPrintAgentService.js\";\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","getZaiCapacityReport","getAgentReadinessReport","getAgentReadinessReports","worstReadinessStatus","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","extractHerdrAgentPanes","fetchHerdrAgentPanes","findMatchingHerdrPane","herdrPaneToRuntimeRef","AgentRegistry","RenameNotFoundError","RenameConflictError","AGENT_RUNTIME_PROVIDERS","parseTmuxRuntimeRef","TmuxManager","startAgent","stopAgent","focusAgent","sendAgentPrompt","TmuxUnavailableError","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,EAAEC,oBAAoB,QAAQ,sBAAsB;AAOnF,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,QACf,gCAAgC;AAevC,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,oCAAoC;AACjE,SAASC,cAAc,QAAQ,wCAAwC;AACvE,SAASC,gBAAgB,QAAQ,yCAAyC;AAC1E,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,0CAA0C;AAC1E,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAGpD,SACEC,sBAAsB,EACtBC,oBAAoB,EACpBC,qBAAqB,EACrBC,qBAAqB,QAChB,yCAAyC;AAGhD,SACEC,aAAa,EACbC,mBAAmB,EACnBC,mBAAmB,EACnBC,uBAAuB,EACvBC,mBAAmB,QACd,2BAA2B;AAOlC,SAASC,WAAW,QAAQ,4BAA4B;AAExD,SACEC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,2BAA2B,QACtB,mCAAmC;AAU1C,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SACEC,mBAAmB,EACnBC,sBAAsB,EACtBC,iBAAiB,QACZ,4BAA4B;AAEnC,SACEC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACP,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAMxE,SAASC,mBAAmB,QAAQ,gDAAgD"}
@@ -8,40 +8,26 @@
8
8
  * 4. Reading events.jsonl as the primary session/conversation source
9
9
  * 5. Reading workspace.yaml as a flat fallback metadata source
10
10
  */
11
- import type { AgentAdapter, AgentInfo, ConversationMessage, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from "./AgentAdapter.js";
12
- import { AgentRegistry } from "../utils/AgentRegistry.js";
11
+ import type { AgentAdapter, AgentInfo, ConversationMessage, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
12
+ import { AgentRegistry } from "../../utils/AgentRegistry.js";
13
+ export interface CopilotAdapterOptions {
14
+ sessionStateDir?: string;
15
+ }
13
16
  export declare class CopilotAdapter implements AgentAdapter {
14
17
  readonly type: "copilot";
15
18
  readonly processNames: readonly ["copilot"];
16
- private static readonly IDLE_THRESHOLD_MINUTES;
17
- private static readonly VERBOSE_SYSTEM_EVENTS;
18
- private static readonly WAITING_EVENTS;
19
- private sessionStateDir;
20
- private registry;
21
- constructor(registry?: AgentRegistry);
19
+ private readonly registry;
20
+ private readonly parser;
21
+ private readonly mapper;
22
+ private readonly locator;
23
+ constructor(registry?: AgentRegistry, options?: CopilotAdapterOptions);
22
24
  canHandle(processInfo: ProcessInfo): boolean;
23
25
  detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
24
- private applyWrapperRegistryName;
25
26
  getConversation(sessionFilePath: string, options?: {
26
27
  verbose?: boolean;
27
28
  }): ConversationMessage[];
28
29
  listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
29
- private listSessionDirs;
30
- private discoverActiveLocks;
31
- private readSessionDir;
32
- private readEvents;
33
- private summarizeEvents;
34
- private hasWorkspaceMetadata;
35
- private readWorkspace;
36
- private stripYamlScalar;
37
- private parseEventLines;
38
- private roleForEvent;
39
- private extractEventText;
40
- private mapSessionToAgent;
41
- private mapProcessOnlyAgent;
42
- private determineStatus;
43
- private parseTimestamp;
44
- private truncate;
30
+ private applyWrapperRegistryName;
45
31
  private isCopilotExecutable;
46
32
  }
47
33
  //# sourceMappingURL=CopilotAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/copilot/CopilotAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAQxC,OAAO,EAAE,aAAa,EAAsB,MAAM,8BAA8B,CAAC;AAKjF,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAG9C,QAAQ,GAAE,aAAuC,EACjD,OAAO,GAAE,qBAA0B;IAWrC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCzE,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBzE,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,mBAAmB;CAI5B"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Copilot Adapter
3
+ *
4
+ * Detects running GitHub Copilot CLI agents by:
5
+ * 1. Filtering Copilot processes from a shared asynchronous process snapshot
6
+ * 2. Using snapshot CWD and start-time enrichment
7
+ * 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes
8
+ * 4. Reading events.jsonl as the primary session/conversation source
9
+ * 5. Reading workspace.yaml as a flat fallback metadata source
10
+ */ import * as path from "path";
11
+ import { captureProcessSnapshot, executableBasename, filterByProcessNames, findWrapperProcess, findWrapperProcessPids } from "../../utils/process.js";
12
+ import { AgentRegistry } from "../../utils/AgentRegistry.js";
13
+ import { CopilotAgentMapper } from "./CopilotAgentMapper.js";
14
+ import { CopilotSessionLocator } from "./CopilotSessionLocator.js";
15
+ import { CopilotSessionParser } from "./CopilotSessionParser.js";
16
+ export class CopilotAdapter {
17
+ type = "copilot";
18
+ processNames = [
19
+ "copilot"
20
+ ];
21
+ registry;
22
+ parser;
23
+ mapper;
24
+ locator;
25
+ constructor(registry = AgentRegistry.default(), options = {}){
26
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
27
+ this.registry = registry;
28
+ this.parser = new CopilotSessionParser();
29
+ this.mapper = new CopilotAgentMapper(this.parser);
30
+ this.locator = new CopilotSessionLocator({
31
+ sessionStateDir: options.sessionStateDir ?? path.join(homeDir, ".copilot", "session-state")
32
+ });
33
+ }
34
+ canHandle(processInfo) {
35
+ return this.isCopilotExecutable(processInfo.command);
36
+ }
37
+ async detectAgents(context) {
38
+ const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
39
+ const relevant = filterByProcessNames(snapshot, this.processNames);
40
+ const processes = relevant.filter((process1)=>this.canHandle(process1));
41
+ if (processes.length === 0) return [];
42
+ const processByPid = new Map(processes.map((proc)=>[
43
+ proc.pid,
44
+ proc
45
+ ]));
46
+ const registryEntriesByPid = new Map(this.registry.list().map((entry)=>[
47
+ entry.pid,
48
+ entry
49
+ ]));
50
+ const matchedPids = new Set();
51
+ const matchedProcesses = [];
52
+ const agents = [];
53
+ for (const lock of this.locator.discoverActiveLocks()){
54
+ const proc = processByPid.get(lock.pid);
55
+ if (!proc) continue;
56
+ const session = this.parser.readSessionDir(lock.sessionDir, lock.sessionId);
57
+ if (!session) continue;
58
+ const agent = this.mapper.mapSessionToAgent(session, proc);
59
+ this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);
60
+ agents.push(agent);
61
+ matchedPids.add(proc.pid);
62
+ matchedProcesses.push(proc);
63
+ }
64
+ const wrapperPids = findWrapperProcessPids(processes, matchedProcesses);
65
+ for (const proc of processes){
66
+ if (!matchedPids.has(proc.pid) && !wrapperPids.has(proc.pid)) {
67
+ const agent = this.mapper.mapProcessOnlyAgent(proc);
68
+ this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);
69
+ agents.push(agent);
70
+ }
71
+ }
72
+ return agents;
73
+ }
74
+ getConversation(sessionFilePath, options) {
75
+ return this.parser.getConversation(sessionFilePath, options);
76
+ }
77
+ async listSessions(opts) {
78
+ const summaries = [];
79
+ for (const { sessionDir, sessionId } of this.locator.listSessionDirs()){
80
+ const session = this.parser.readSessionDir(sessionDir, sessionId);
81
+ if (!session) continue;
82
+ if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;
83
+ summaries.push({
84
+ type: this.type,
85
+ sessionId: session.sessionId,
86
+ cwd: session.projectPath,
87
+ firstUserMessage: session.firstUserMessage,
88
+ lastActive: session.lastActive,
89
+ startedAt: session.sessionStart,
90
+ sessionFilePath: session.eventsFilePath
91
+ });
92
+ }
93
+ return summaries;
94
+ }
95
+ applyWrapperRegistryName(agent, processInfo, processes, registryEntriesByPid) {
96
+ const wrapper = findWrapperProcess(processes, processInfo);
97
+ const wrapperEntry = wrapper ? registryEntriesByPid.get(wrapper.pid) : undefined;
98
+ if (wrapperEntry?.type === this.type) {
99
+ agent.name = wrapperEntry.name;
100
+ }
101
+ }
102
+ isCopilotExecutable(command) {
103
+ const base = executableBasename(command);
104
+ return base === "copilot" || base === "copilot.exe";
105
+ }
106
+ }
107
+
108
+ //# sourceMappingURL=CopilotAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/providers/copilot/CopilotAdapter.ts"],"sourcesContent":["/**\n * Copilot Adapter\n *\n * Detects running GitHub Copilot CLI agents by:\n * 1. Filtering Copilot processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes\n * 4. Reading events.jsonl as the primary session/conversation source\n * 5. Reading workspace.yaml as a flat fallback metadata source\n */\n\nimport * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ConversationMessage,\n ListSessionsOptions,\n ProcessInfo,\n SessionSummary,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n findWrapperProcess,\n findWrapperProcessPids,\n} from \"../../utils/process.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { CopilotAgentMapper } from \"./CopilotAgentMapper.js\";\nimport { CopilotSessionLocator } from \"./CopilotSessionLocator.js\";\nimport { CopilotSessionParser } from \"./CopilotSessionParser.js\";\n\nexport interface CopilotAdapterOptions {\n sessionStateDir?: string;\n}\n\nexport class CopilotAdapter implements AgentAdapter {\n readonly type = \"copilot\" as const;\n readonly processNames = [\"copilot\"] as const;\n\n private readonly registry: AgentRegistry;\n private readonly parser: CopilotSessionParser;\n private readonly mapper: CopilotAgentMapper;\n private readonly locator: CopilotSessionLocator;\n\n constructor(\n registry: AgentRegistry = AgentRegistry.default(),\n options: CopilotAdapterOptions = {},\n ) {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n this.registry = registry;\n this.parser = new CopilotSessionParser();\n this.mapper = new CopilotAgentMapper(this.parser);\n this.locator = new CopilotSessionLocator({\n sessionStateDir: options.sessionStateDir ?? path.join(homeDir, \".copilot\", \"session-state\"),\n });\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isCopilotExecutable(processInfo.command);\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) return [];\n\n const processByPid = new Map(processes.map((proc) => [proc.pid, proc]));\n const registryEntriesByPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));\n const matchedPids = new Set<number>();\n const matchedProcesses: ProcessInfo[] = [];\n const agents: AgentInfo[] = [];\n\n for (const lock of this.locator.discoverActiveLocks()) {\n const proc = processByPid.get(lock.pid);\n if (!proc) continue;\n\n const session = this.parser.readSessionDir(lock.sessionDir, lock.sessionId);\n if (!session) continue;\n\n const agent = this.mapper.mapSessionToAgent(session, proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n matchedPids.add(proc.pid);\n matchedProcesses.push(proc);\n }\n\n const wrapperPids = findWrapperProcessPids(processes, matchedProcesses);\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid) && !wrapperPids.has(proc.pid)) {\n const agent = this.mapper.mapProcessOnlyAgent(proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n }\n }\n\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n\n for (const { sessionDir, sessionId } of this.locator.listSessionDirs()) {\n const session = this.parser.readSessionDir(sessionDir, sessionId);\n if (!session) continue;\n if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;\n\n summaries.push({\n type: this.type,\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: session.firstUserMessage,\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: session.eventsFilePath,\n });\n }\n\n return summaries;\n }\n\n private applyWrapperRegistryName(\n agent: AgentInfo,\n processInfo: ProcessInfo,\n processes: ProcessInfo[],\n registryEntriesByPid: Map<number, RegistryEntry>,\n ): void {\n const wrapper = findWrapperProcess(processes, processInfo);\n const wrapperEntry = wrapper ? registryEntriesByPid.get(wrapper.pid) : undefined;\n if (wrapperEntry?.type === this.type) {\n agent.name = wrapperEntry.name;\n }\n }\n\n private isCopilotExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === \"copilot\" || base === \"copilot.exe\";\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","findWrapperProcess","findWrapperProcessPids","AgentRegistry","CopilotAgentMapper","CopilotSessionLocator","CopilotSessionParser","CopilotAdapter","type","processNames","registry","parser","mapper","locator","default","options","homeDir","process","env","HOME","USERPROFILE","sessionStateDir","join","canHandle","processInfo","isCopilotExecutable","command","detectAgents","context","snapshot","processes","relevant","filter","length","processByPid","Map","map","proc","pid","registryEntriesByPid","list","entry","matchedPids","Set","matchedProcesses","agents","lock","discoverActiveLocks","get","session","readSessionDir","sessionDir","sessionId","agent","mapSessionToAgent","applyWrapperRegistryName","push","add","wrapperPids","has","mapProcessOnlyAgent","getConversation","sessionFilePath","listSessions","opts","summaries","listSessionDirs","cwd","undefined","projectPath","firstUserMessage","lastActive","startedAt","sessionStart","eventsFilePath","wrapper","wrapperEntry","name","base"],"mappings":"AAAA;;;;;;;;;CASC,GAED,YAAYA,UAAU,OAAO;AAU7B,SACEC,sBAAsB,EACtBC,kBAAkB,EAClBC,oBAAoB,EACpBC,kBAAkB,EAClBC,sBAAsB,QACjB,yBAAyB;AAChC,SAASC,aAAa,QAA4B,+BAA+B;AACjF,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,oBAAoB,QAAQ,4BAA4B;AAMjE,OAAO,MAAMC;IACFC,OAAO,UAAmB;IAC1BC,eAAe;QAAC;KAAU,CAAU;IAE5BC,SAAwB;IACxBC,OAA6B;IAC7BC,OAA2B;IAC3BC,QAA+B;IAEhD,YACEH,WAA0BP,cAAcW,OAAO,EAAE,EACjDC,UAAiC,CAAC,CAAC,CACnC;QACA,MAAMC,UAAUC,QAAQC,GAAG,CAACC,IAAI,IAAIF,QAAQC,GAAG,CAACE,WAAW,IAAI;QAC/D,IAAI,CAACV,QAAQ,GAAGA;QAChB,IAAI,CAACC,MAAM,GAAG,IAAIL;QAClB,IAAI,CAACM,MAAM,GAAG,IAAIR,mBAAmB,IAAI,CAACO,MAAM;QAChD,IAAI,CAACE,OAAO,GAAG,IAAIR,sBAAsB;YACvCgB,iBAAiBN,QAAQM,eAAe,IAAIxB,KAAKyB,IAAI,CAACN,SAAS,YAAY;QAC7E;IACF;IAEAO,UAAUC,WAAwB,EAAW;QAC3C,OAAO,IAAI,CAACC,mBAAmB,CAACD,YAAYE,OAAO;IACrD;IAEA,MAAMC,aAAaC,OAA+B,EAAwB;QACxE,MAAMC,WAAWD,SAASE,aAAc,MAAMhC,uBAAuB,IAAI,CAACW,YAAY;QACtF,MAAMsB,WAAW/B,qBAAqB6B,UAAU,IAAI,CAACpB,YAAY;QACjE,MAAMqB,YAAYC,SAASC,MAAM,CAAC,CAACf,WAAY,IAAI,CAACM,SAAS,CAACN;QAC9D,IAAIa,UAAUG,MAAM,KAAK,GAAG,OAAO,EAAE;QAErC,MAAMC,eAAe,IAAIC,IAAIL,UAAUM,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKC,GAAG;gBAAED;aAAK;QACrE,MAAME,uBAAuB,IAAIJ,IAAI,IAAI,CAACzB,QAAQ,CAAC8B,IAAI,GAAGJ,GAAG,CAAC,CAACK,QAAU;gBAACA,MAAMH,GAAG;gBAAEG;aAAM;QAC3F,MAAMC,cAAc,IAAIC;QACxB,MAAMC,mBAAkC,EAAE;QAC1C,MAAMC,SAAsB,EAAE;QAE9B,KAAK,MAAMC,QAAQ,IAAI,CAACjC,OAAO,CAACkC,mBAAmB,GAAI;YACrD,MAAMV,OAAOH,aAAac,GAAG,CAACF,KAAKR,GAAG;YACtC,IAAI,CAACD,MAAM;YAEX,MAAMY,UAAU,IAAI,CAACtC,MAAM,CAACuC,cAAc,CAACJ,KAAKK,UAAU,EAAEL,KAAKM,SAAS;YAC1E,IAAI,CAACH,SAAS;YAEd,MAAMI,QAAQ,IAAI,CAACzC,MAAM,CAAC0C,iBAAiB,CAACL,SAASZ;YACrD,IAAI,CAACkB,wBAAwB,CAACF,OAAOhB,MAAMP,WAAWS;YACtDM,OAAOW,IAAI,CAACH;YACZX,YAAYe,GAAG,CAACpB,KAAKC,GAAG;YACxBM,iBAAiBY,IAAI,CAACnB;QACxB;QAEA,MAAMqB,cAAcxD,uBAAuB4B,WAAWc;QACtD,KAAK,MAAMP,QAAQP,UAAW;YAC5B,IAAI,CAACY,YAAYiB,GAAG,CAACtB,KAAKC,GAAG,KAAK,CAACoB,YAAYC,GAAG,CAACtB,KAAKC,GAAG,GAAG;gBAC5D,MAAMe,QAAQ,IAAI,CAACzC,MAAM,CAACgD,mBAAmB,CAACvB;gBAC9C,IAAI,CAACkB,wBAAwB,CAACF,OAAOhB,MAAMP,WAAWS;gBACtDM,OAAOW,IAAI,CAACH;YACd;QACF;QAEA,OAAOR;IACT;IAEAgB,gBAAgBC,eAAuB,EAAE/C,OAA+B,EAAyB;QAC/F,OAAO,IAAI,CAACJ,MAAM,CAACkD,eAAe,CAACC,iBAAiB/C;IACtD;IAEA,MAAMgD,aAAaC,IAA0B,EAA6B;QACxE,MAAMC,YAA8B,EAAE;QAEtC,KAAK,MAAM,EAAEd,UAAU,EAAEC,SAAS,EAAE,IAAI,IAAI,CAACvC,OAAO,CAACqD,eAAe,GAAI;YACtE,MAAMjB,UAAU,IAAI,CAACtC,MAAM,CAACuC,cAAc,CAACC,YAAYC;YACvD,IAAI,CAACH,SAAS;YACd,IAAIe,MAAMG,QAAQC,aAAanB,QAAQoB,WAAW,KAAKL,KAAKG,GAAG,EAAE;YAEjEF,UAAUT,IAAI,CAAC;gBACbhD,MAAM,IAAI,CAACA,IAAI;gBACf4C,WAAWH,QAAQG,SAAS;gBAC5Be,KAAKlB,QAAQoB,WAAW;gBACxBC,kBAAkBrB,QAAQqB,gBAAgB;gBAC1CC,YAAYtB,QAAQsB,UAAU;gBAC9BC,WAAWvB,QAAQwB,YAAY;gBAC/BX,iBAAiBb,QAAQyB,cAAc;YACzC;QACF;QAEA,OAAOT;IACT;IAEQV,yBACNF,KAAgB,EAChB7B,WAAwB,EACxBM,SAAwB,EACxBS,oBAAgD,EAC1C;QACN,MAAMoC,UAAU1E,mBAAmB6B,WAAWN;QAC9C,MAAMoD,eAAeD,UAAUpC,qBAAqBS,GAAG,CAAC2B,QAAQrC,GAAG,IAAI8B;QACvE,IAAIQ,cAAcpE,SAAS,IAAI,CAACA,IAAI,EAAE;YACpC6C,MAAMwB,IAAI,GAAGD,aAAaC,IAAI;QAChC;IACF;IAEQpD,oBAAoBC,OAAe,EAAW;QACpD,MAAMoD,OAAO/E,mBAAmB2B;QAChC,OAAOoD,SAAS,aAAaA,SAAS;IACxC;AACF"}
@@ -0,0 +1,9 @@
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { CopilotSessionParser, type CopilotSession } from "./CopilotSessionParser.js";
3
+ export declare class CopilotAgentMapper {
4
+ private readonly parser;
5
+ constructor(parser?: CopilotSessionParser);
6
+ mapSessionToAgent(session: CopilotSession, processInfo: ProcessInfo): AgentInfo;
7
+ mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo;
8
+ }
9
+ //# sourceMappingURL=CopilotAgentMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/copilot/CopilotAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,oBAAiD;IAEtF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS;IAe/E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
@@ -0,0 +1,37 @@
1
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
2
+ import { generateAgentName } from "../../utils/matching.js";
3
+ import { CopilotSessionParser } from "./CopilotSessionParser.js";
4
+ export class CopilotAgentMapper {
5
+ parser;
6
+ constructor(parser = new CopilotSessionParser()){
7
+ this.parser = parser;
8
+ }
9
+ mapSessionToAgent(session, processInfo) {
10
+ const projectPath = session.projectPath || processInfo.cwd || "";
11
+ return {
12
+ name: generateAgentName(projectPath, processInfo.pid),
13
+ type: "copilot",
14
+ status: this.parser.determineStatus(session),
15
+ summary: session.summary || "Copilot session active",
16
+ pid: processInfo.pid,
17
+ projectPath,
18
+ sessionId: session.sessionId,
19
+ lastActive: session.lastActive,
20
+ sessionFilePath: session.eventsFilePath
21
+ };
22
+ }
23
+ mapProcessOnlyAgent(processInfo) {
24
+ return {
25
+ name: generateAgentName(processInfo.cwd || "", processInfo.pid),
26
+ type: "copilot",
27
+ status: AgentStatus.RUNNING,
28
+ summary: "Copilot process running",
29
+ pid: processInfo.pid,
30
+ projectPath: processInfo.cwd || "",
31
+ sessionId: `pid-${processInfo.pid}`,
32
+ lastActive: new Date()
33
+ };
34
+ }
35
+ }
36
+
37
+ //# sourceMappingURL=CopilotAgentMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/providers/copilot/CopilotAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { CopilotSessionParser, type CopilotSession } from \"./CopilotSessionParser.js\";\n\nexport class CopilotAgentMapper {\n constructor(private readonly parser: CopilotSessionParser = new CopilotSessionParser()) {}\n\n mapSessionToAgent(session: CopilotSession, processInfo: ProcessInfo): AgentInfo {\n const projectPath = session.projectPath || processInfo.cwd || \"\";\n return {\n name: generateAgentName(projectPath, processInfo.pid),\n type: \"copilot\",\n status: this.parser.determineStatus(session),\n summary: session.summary || \"Copilot session active\",\n pid: processInfo.pid,\n projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.eventsFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || \"\", processInfo.pid),\n type: \"copilot\",\n status: AgentStatus.RUNNING,\n summary: \"Copilot process running\",\n pid: processInfo.pid,\n projectPath: processInfo.cwd || \"\",\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","CopilotSessionParser","CopilotAgentMapper","parser","mapSessionToAgent","session","processInfo","projectPath","cwd","name","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","eventsFilePath","mapProcessOnlyAgent","RUNNING","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,oBAAoB,QAA6B,4BAA4B;AAEtF,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA+B,IAAIF,sBAAsB,CAAE;aAA3DE,SAAAA;IAA4D;IAEzFC,kBAAkBC,OAAuB,EAAEC,WAAwB,EAAa;QAC9E,MAAMC,cAAcF,QAAQE,WAAW,IAAID,YAAYE,GAAG,IAAI;QAC9D,OAAO;YACLC,MAAMT,kBAAkBO,aAAaD,YAAYI,GAAG;YACpDC,MAAM;YACNC,QAAQ,IAAI,CAACT,MAAM,CAACU,eAAe,CAACR;YACpCS,SAAST,QAAQS,OAAO,IAAI;YAC5BJ,KAAKJ,YAAYI,GAAG;YACpBH;YACAQ,WAAWV,QAAQU,SAAS;YAC5BC,YAAYX,QAAQW,UAAU;YAC9BC,iBAAiBZ,QAAQa,cAAc;QACzC;IACF;IAEAC,oBAAoBb,WAAwB,EAAa;QACvD,OAAO;YACLG,MAAMT,kBAAkBM,YAAYE,GAAG,IAAI,IAAIF,YAAYI,GAAG;YAC9DC,MAAM;YACNC,QAAQb,YAAYqB,OAAO;YAC3BN,SAAS;YACTJ,KAAKJ,YAAYI,GAAG;YACpBH,aAAaD,YAAYE,GAAG,IAAI;YAChCO,WAAW,CAAC,IAAI,EAAET,YAAYI,GAAG,EAAE;YACnCM,YAAY,IAAIK;QAClB;IACF;AACF"}
@@ -0,0 +1,19 @@
1
+ export interface CopilotLock {
2
+ sessionDir: string;
3
+ sessionId: string;
4
+ pid: number;
5
+ }
6
+ export interface CopilotSessionDir {
7
+ sessionDir: string;
8
+ sessionId: string;
9
+ }
10
+ export interface CopilotSessionLocatorOptions {
11
+ sessionStateDir?: string;
12
+ }
13
+ export declare class CopilotSessionLocator {
14
+ private readonly sessionStateDir;
15
+ constructor(options?: CopilotSessionLocatorOptions);
16
+ listSessionDirs(): CopilotSessionDir[];
17
+ discoverActiveLocks(): CopilotLock[];
18
+ }
19
+ //# sourceMappingURL=CopilotSessionLocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/copilot/CopilotSessionLocator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAE7B,OAAO,GAAE,4BAAiC;IAMtD,eAAe,IAAI,iBAAiB,EAAE;IActC,mBAAmB,IAAI,WAAW,EAAE;CAerC"}