@ai-devkit/agent-manager 0.41.0 → 0.42.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 (101) hide show
  1. package/dist/AgentManager.d.ts.map +1 -1
  2. package/dist/AgentManager.js +25 -9
  3. package/dist/AgentManager.js.map +1 -1
  4. package/dist/__tests__/fixtures.test.js.map +1 -1
  5. package/dist/__tests__/harnesses/devin/DevinAdapter.test.js.map +1 -1
  6. package/dist/__tests__/harnesses/devin/DevinSessionParser.test.js.map +1 -1
  7. package/dist/__tests__/harnesses/muse/MuseAdapter.test.js +247 -0
  8. package/dist/__tests__/harnesses/muse/MuseAdapter.test.js.map +1 -0
  9. package/dist/__tests__/harnesses/muse/MuseAgentMapper.test.js +81 -0
  10. package/dist/__tests__/harnesses/muse/MuseAgentMapper.test.js.map +1 -0
  11. package/dist/__tests__/harnesses/muse/MuseSessionLocator.test.js +185 -0
  12. package/dist/__tests__/harnesses/muse/MuseSessionLocator.test.js.map +1 -0
  13. package/dist/__tests__/harnesses/muse/MuseSessionParser.test.js +328 -0
  14. package/dist/__tests__/harnesses/muse/MuseSessionParser.test.js.map +1 -0
  15. package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js.map +1 -1
  16. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js +42 -1
  17. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -1
  18. package/dist/__tests__/harnesses/runtimeProfiles.test.js +12 -0
  19. package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -1
  20. package/dist/__tests__/utils/process.test.js +71 -1
  21. package/dist/__tests__/utils/process.test.js.map +1 -1
  22. package/dist/adapters/AgentAdapter.d.ts +8 -1
  23. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  24. package/dist/adapters/AgentAdapter.js +2 -1
  25. package/dist/adapters/AgentAdapter.js.map +1 -1
  26. package/dist/fixtures/capture.d.ts.map +1 -1
  27. package/dist/fixtures/capture.js +5 -4
  28. package/dist/fixtures/capture.js.map +1 -1
  29. package/dist/harnesses/devin/DevinAdapter.d.ts.map +1 -1
  30. package/dist/harnesses/devin/DevinAdapter.js.map +1 -1
  31. package/dist/harnesses/devin/DevinAgentMapper.d.ts.map +1 -1
  32. package/dist/harnesses/devin/DevinAgentMapper.js.map +1 -1
  33. package/dist/harnesses/devin/DevinSessionParser.d.ts.map +1 -1
  34. package/dist/harnesses/devin/DevinSessionParser.js.map +1 -1
  35. package/dist/harnesses/index.d.ts.map +1 -1
  36. package/dist/harnesses/index.js +3 -1
  37. package/dist/harnesses/index.js.map +1 -1
  38. package/dist/harnesses/muse/MuseAdapter.d.ts +33 -0
  39. package/dist/harnesses/muse/MuseAdapter.d.ts.map +1 -0
  40. package/dist/harnesses/muse/MuseAdapter.js +122 -0
  41. package/dist/harnesses/muse/MuseAdapter.js.map +1 -0
  42. package/dist/harnesses/muse/MuseAgentMapper.d.ts +15 -0
  43. package/dist/harnesses/muse/MuseAgentMapper.d.ts.map +1 -0
  44. package/dist/harnesses/muse/MuseAgentMapper.js +29 -0
  45. package/dist/harnesses/muse/MuseAgentMapper.js.map +1 -0
  46. package/dist/harnesses/muse/MuseSessionLocator.d.ts +61 -0
  47. package/dist/harnesses/muse/MuseSessionLocator.d.ts.map +1 -0
  48. package/dist/harnesses/muse/MuseSessionLocator.js +233 -0
  49. package/dist/harnesses/muse/MuseSessionLocator.js.map +1 -0
  50. package/dist/harnesses/muse/MuseSessionParser.d.ts +77 -0
  51. package/dist/harnesses/muse/MuseSessionParser.d.ts.map +1 -0
  52. package/dist/harnesses/muse/MuseSessionParser.js +350 -0
  53. package/dist/harnesses/muse/MuseSessionParser.js.map +1 -0
  54. package/dist/harnesses/muse/readiness.d.ts +3 -0
  55. package/dist/harnesses/muse/readiness.d.ts.map +1 -0
  56. package/dist/harnesses/muse/readiness.js +37 -0
  57. package/dist/harnesses/muse/readiness.js.map +1 -0
  58. package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -1
  59. package/dist/harnesses/readiness/AgentReadiness.js +3 -1
  60. package/dist/harnesses/readiness/AgentReadiness.js.map +1 -1
  61. package/dist/harnesses/readiness/types.d.ts +1 -1
  62. package/dist/harnesses/readiness/types.d.ts.map +1 -1
  63. package/dist/harnesses/runtimeProfiles.d.ts.map +1 -1
  64. package/dist/harnesses/runtimeProfiles.js +2 -1
  65. package/dist/harnesses/runtimeProfiles.js.map +1 -1
  66. package/dist/harnesses/shared.d.ts +1 -1
  67. package/dist/harnesses/shared.d.ts.map +1 -1
  68. package/dist/harnesses/shared.js +6 -5
  69. package/dist/harnesses/shared.js.map +1 -1
  70. package/dist/utils/process.d.ts +23 -1
  71. package/dist/utils/process.d.ts.map +1 -1
  72. package/dist/utils/process.js +44 -8
  73. package/dist/utils/process.js.map +1 -1
  74. package/package.json +1 -1
  75. package/src/AgentManager.ts +34 -8
  76. package/src/__tests__/fixtures.test.ts +15 -17
  77. package/src/__tests__/harnesses/devin/DevinAdapter.test.ts +1 -3
  78. package/src/__tests__/harnesses/devin/DevinSessionParser.test.ts +3 -9
  79. package/src/__tests__/harnesses/muse/MuseAdapter.test.ts +197 -0
  80. package/src/__tests__/harnesses/muse/MuseAgentMapper.test.ts +83 -0
  81. package/src/__tests__/harnesses/muse/MuseSessionLocator.test.ts +177 -0
  82. package/src/__tests__/harnesses/muse/MuseSessionParser.test.ts +279 -0
  83. package/src/__tests__/harnesses/opencode/OpenCodeSessionParser.test.ts +3 -2
  84. package/src/__tests__/harnesses/readiness/AgentReadiness.test.ts +36 -0
  85. package/src/__tests__/harnesses/runtimeProfiles.test.ts +13 -0
  86. package/src/__tests__/utils/process.test.ts +30 -0
  87. package/src/adapters/AgentAdapter.ts +9 -0
  88. package/src/fixtures/capture.ts +32 -17
  89. package/src/harnesses/devin/DevinAdapter.ts +3 -15
  90. package/src/harnesses/devin/DevinAgentMapper.ts +1 -5
  91. package/src/harnesses/devin/DevinSessionParser.ts +3 -12
  92. package/src/harnesses/index.ts +2 -0
  93. package/src/harnesses/muse/MuseAdapter.ts +157 -0
  94. package/src/harnesses/muse/MuseAgentMapper.ts +33 -0
  95. package/src/harnesses/muse/MuseSessionLocator.ts +286 -0
  96. package/src/harnesses/muse/MuseSessionParser.ts +435 -0
  97. package/src/harnesses/muse/readiness.ts +38 -0
  98. package/src/harnesses/readiness/AgentReadiness.ts +2 -0
  99. package/src/harnesses/runtimeProfiles.ts +1 -0
  100. package/src/harnesses/shared.ts +10 -5
  101. package/src/utils/process.ts +61 -9
@@ -0,0 +1,350 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
4
+ import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
5
+ import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
6
+ function classifyRecord(record) {
7
+ const payload = record.payload;
8
+ if (!isRecord(payload)) return "other";
9
+ switch(record.payload_type){
10
+ case "runtime.session.metadata":
11
+ return "metadata";
12
+ case "session.name.changed":
13
+ return "name-changed";
14
+ case "runtime.user_intent.accepted":
15
+ case "runtime.user_intent.materialized":
16
+ return "user-intent";
17
+ case "runtime.session":
18
+ break;
19
+ default:
20
+ return "other";
21
+ }
22
+ if (!isRecord(payload.event) || typeof payload.event.kind !== "string") return "other";
23
+ if (payload.kind === "run") {
24
+ switch(payload.event.kind){
25
+ case "assistant_message_committed":
26
+ return "assistant";
27
+ case "assistant_tool_calls_committed":
28
+ return "tool-calls";
29
+ case "terminal":
30
+ return "run-terminal";
31
+ }
32
+ }
33
+ switch(payload.event.kind){
34
+ case "approval_wait.effect.started":
35
+ return "approval-started";
36
+ case "approval_wait.effect.terminal":
37
+ return "approval-settled";
38
+ case "user_input_prompt_requested":
39
+ return "input-requested";
40
+ case "user_input_prompt_settled":
41
+ return "input-settled";
42
+ default:
43
+ return "other";
44
+ }
45
+ }
46
+ const MICROSECONDS_THRESHOLD = 1_000_000_000_000_000;
47
+ /** `recorded_at` microseconds → epoch ms; null when invalid. */ export function museTimestampToMs(value) {
48
+ if (typeof value !== "number" || !Number.isFinite(value)) return null;
49
+ const ms = value >= MICROSECONDS_THRESHOLD ? Math.floor(value / 1000) : value;
50
+ return ms >= 0 ? ms : null;
51
+ }
52
+ /** Unwrap one raw frame line into zero or more inner records. */ export function unwrapFrameRecords(line) {
53
+ let outer;
54
+ try {
55
+ outer = JSON.parse(line);
56
+ } catch {
57
+ return [];
58
+ }
59
+ return unwrapOuterRecords(outer);
60
+ }
61
+ /** Unwrap an already-parsed frame value into zero or more inner records. */ export function unwrapOuterRecords(outer) {
62
+ if (!outer || typeof outer !== "object") return [];
63
+ const obj = outer;
64
+ if (typeof obj.record_json === "string") {
65
+ try {
66
+ const inner = JSON.parse(obj.record_json);
67
+ return [
68
+ inner
69
+ ];
70
+ } catch {
71
+ return [];
72
+ }
73
+ }
74
+ if (Array.isArray(obj.children)) {
75
+ const out = [];
76
+ for (const child of obj.children){
77
+ if (child && typeof child === "object" && typeof child.record_json === "string") {
78
+ try {
79
+ out.push(JSON.parse(child.record_json));
80
+ } catch {
81
+ /* skip malformed child */ }
82
+ }
83
+ }
84
+ return out;
85
+ }
86
+ return [
87
+ obj
88
+ ];
89
+ }
90
+ function isRecord(value) {
91
+ return value !== null && typeof value === "object" && !Array.isArray(value);
92
+ }
93
+ function nonEmptyText(value) {
94
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
95
+ }
96
+ /** Collect `{ kind: "text", text }` strings from intent/model message blocks. */ function collectTextBlocks(value) {
97
+ const out = [];
98
+ if (Array.isArray(value)) {
99
+ for (const block of value){
100
+ if (isRecord(block) && block.kind === "text") {
101
+ const text = nonEmptyText(block.text);
102
+ if (text) out.push(text);
103
+ }
104
+ }
105
+ }
106
+ return out;
107
+ }
108
+ /** User turn text from an intent payload (`refill_blocks` then `model_messages`). */ function intentText(payload) {
109
+ const refill = collectTextBlocks(payload.refill_blocks);
110
+ if (refill.length > 0) return refill.join("\n");
111
+ const modelMessages = payload.model_messages;
112
+ if (Array.isArray(modelMessages)) {
113
+ const parts = [];
114
+ for (const message of modelMessages){
115
+ if (isRecord(message)) parts.push(...collectTextBlocks(message.content));
116
+ }
117
+ if (parts.length > 0) return parts.join("\n");
118
+ }
119
+ return null;
120
+ }
121
+ /** Assistant reply text from a `run.assistant_message_committed` event. */ function assistantEventText(event) {
122
+ return nonEmptyText(event.text);
123
+ }
124
+ export class MuseSessionParser {
125
+ tailReader = new JsonlTailReader();
126
+ sessionCache;
127
+ constructor(){
128
+ this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {});
129
+ }
130
+ readSession(filePath, projectPath) {
131
+ let content;
132
+ try {
133
+ content = fs.readFileSync(filePath, "utf-8");
134
+ } catch {
135
+ return null;
136
+ }
137
+ if (!content.trim()) return null;
138
+ return this.toSession(filePath, projectPath, reduceJsonlContent(this.summaryReducer, content));
139
+ }
140
+ readSessionIncremental(filePath, projectPath) {
141
+ const result = this.sessionCache.read(filePath);
142
+ return result ? this.toSession(filePath, projectPath, result.state) : null;
143
+ }
144
+ pruneSessionCache() {
145
+ this.sessionCache.prune();
146
+ }
147
+ summaryReducer = {
148
+ initial: ()=>({
149
+ seenFirstLine: false
150
+ }),
151
+ reduce: (state, value)=>{
152
+ const next = {
153
+ ...state,
154
+ seenFirstLine: true
155
+ };
156
+ // Session start comes from the first line only; the first user message
157
+ // may come from anywhere before a bounded-skip (mirrors Claude semantics).
158
+ const flags = {
159
+ isHead: !state.seenFirstLine,
160
+ canBeFirst: !state.pastHead
161
+ };
162
+ for (const record of unwrapOuterRecords(value)){
163
+ this.foldRecord(next, record, flags);
164
+ }
165
+ return next;
166
+ },
167
+ skip: (state)=>({
168
+ seenFirstLine: true,
169
+ pastHead: true,
170
+ sessionStartMs: state.sessionStartMs,
171
+ firstUserMessage: state.firstUserMessage
172
+ })
173
+ };
174
+ /**
175
+ * Fold one inner record into the summary. `isHead` marks the first line
176
+ * (session start only); `canBeFirst` allows the first user message from any
177
+ * line read before a bounded-skip.
178
+ */ foldRecord(next, record, flags) {
179
+ const { isHead, canBeFirst } = flags;
180
+ const atMs = museTimestampToMs(record.recorded_at);
181
+ if (atMs !== null) {
182
+ if (isHead && next.sessionStartMs === undefined) next.sessionStartMs = atMs;
183
+ next.lastActiveMs = atMs;
184
+ }
185
+ const payload = record.payload;
186
+ if (!isRecord(payload)) return;
187
+ switch(classifyRecord(record)){
188
+ case "metadata":
189
+ {
190
+ if (!isRecord(payload.record)) return;
191
+ const root = nonEmptyText(payload.record.workspace_root);
192
+ if (root) next.workspaceRoot = root;
193
+ const model = nonEmptyText(payload.record.model_id);
194
+ if (model) next.modelId = model;
195
+ return;
196
+ }
197
+ case "name-changed":
198
+ {
199
+ const name = nonEmptyText(payload.new_name);
200
+ if (name) next.displayName = name;
201
+ return;
202
+ }
203
+ case "user-intent":
204
+ {
205
+ next.lastSignal = "user-intent";
206
+ const text = intentText(payload);
207
+ if (text) {
208
+ next.lastUserMessage = text;
209
+ if (canBeFirst && !next.firstUserMessage) next.firstUserMessage = text;
210
+ }
211
+ return;
212
+ }
213
+ case "assistant":
214
+ next.lastSignal = "assistant";
215
+ return;
216
+ case "approval-started":
217
+ next.lastSignal = "approval-wait";
218
+ return;
219
+ case "approval-settled":
220
+ if (next.lastSignal === "approval-wait") next.lastSignal = "assistant";
221
+ return;
222
+ case "input-requested":
223
+ next.lastSignal = "input-requested";
224
+ return;
225
+ case "input-settled":
226
+ if (next.lastSignal === "input-requested") next.lastSignal = "assistant";
227
+ return;
228
+ case "run-terminal":
229
+ next.lastSignal = "run-terminal";
230
+ return;
231
+ default:
232
+ return;
233
+ }
234
+ }
235
+ toSession(filePath, projectPath, state) {
236
+ const sessionStartMs = state.sessionStartMs ?? state.lastActiveMs;
237
+ return {
238
+ sessionId: path.basename(path.dirname(filePath)),
239
+ projectPath: projectPath || state.workspaceRoot || "",
240
+ displayName: state.displayName,
241
+ modelId: state.modelId,
242
+ sessionStart: sessionStartMs !== undefined ? new Date(sessionStartMs) : new Date(),
243
+ lastActive: state.lastActiveMs !== undefined ? new Date(state.lastActiveMs) : new Date(),
244
+ lastSignal: state.lastSignal,
245
+ lastUserMessage: state.lastUserMessage,
246
+ firstUserMessage: state.firstUserMessage
247
+ };
248
+ }
249
+ /**
250
+ * Status mapping over the last conversation signal:
251
+ * - user-intent → RUNNING (agent is processing the new turn)
252
+ * - assistant → WAITING (reply committed, awaiting user)
253
+ * - approval-wait / input-requested → WAITING (blocked on the user)
254
+ * - run-terminal → IDLE; no signal → UNKNOWN.
255
+ */ determineStatus(session) {
256
+ switch(session.lastSignal){
257
+ case "user-intent":
258
+ return AgentStatus.RUNNING;
259
+ case "assistant":
260
+ case "approval-wait":
261
+ case "input-requested":
262
+ return AgentStatus.WAITING;
263
+ case "run-terminal":
264
+ return AgentStatus.IDLE;
265
+ default:
266
+ return AgentStatus.UNKNOWN;
267
+ }
268
+ }
269
+ getConversation(sessionFilePath, options) {
270
+ const verbose = options?.verbose ?? false;
271
+ const tail = normalizeTail(options?.tail);
272
+ if (tail !== undefined) {
273
+ return this.tailReader.read(sessionFilePath, tail, {
274
+ parseLine: (line)=>this.lineToMessage(line, verbose)
275
+ }, String(verbose));
276
+ }
277
+ let content;
278
+ try {
279
+ content = fs.readFileSync(sessionFilePath, "utf-8");
280
+ } catch {
281
+ return [];
282
+ }
283
+ const messages = [];
284
+ for (const line of content.trim().split("\n")){
285
+ messages.push(...this.linesToMessages(line, verbose));
286
+ }
287
+ return messages;
288
+ }
289
+ /** One raw frame line → conversation messages (usually zero or one). */ linesToMessages(line, verbose) {
290
+ const out = [];
291
+ for (const record of unwrapFrameRecords(line)){
292
+ const message = this.recordToMessage(record, verbose);
293
+ if (message) out.push(message);
294
+ }
295
+ return out;
296
+ }
297
+ /**
298
+ * One raw frame line → its first conversation message, for tail reads.
299
+ * A retained frame can theoretically hold several messages; the tail
300
+ * window counts lines, so a boundary line keeps only its first message.
301
+ */ lineToMessage(line, verbose) {
302
+ return this.linesToMessages(line, verbose)[0] ?? null;
303
+ }
304
+ recordToMessage(record, verbose) {
305
+ const payload = record.payload;
306
+ if (!isRecord(payload)) return null;
307
+ const atMs = museTimestampToMs(record.recorded_at);
308
+ const timestamp = atMs !== null ? new Date(atMs).toISOString() : undefined;
309
+ switch(classifyRecord(record)){
310
+ case "user-intent":
311
+ {
312
+ const text = intentText(payload);
313
+ if (!text) return null;
314
+ return {
315
+ role: "user",
316
+ content: text,
317
+ timestamp
318
+ };
319
+ }
320
+ case "assistant":
321
+ {
322
+ if (!isRecord(payload.event)) return null;
323
+ const text = assistantEventText(payload.event);
324
+ if (!text) return null;
325
+ return {
326
+ role: "assistant",
327
+ content: text,
328
+ timestamp
329
+ };
330
+ }
331
+ case "tool-calls":
332
+ {
333
+ if (!verbose || !isRecord(payload.event) || !Array.isArray(payload.event.tool_calls)) {
334
+ return null;
335
+ }
336
+ const names = payload.event.tool_calls.filter(isRecord).map((call)=>nonEmptyText(call.tool_name)).filter((name)=>name !== null);
337
+ if (names.length === 0) return null;
338
+ return {
339
+ role: "assistant",
340
+ content: `tool calls: ${names.join(", ")}`,
341
+ timestamp
342
+ };
343
+ }
344
+ default:
345
+ return null;
346
+ }
347
+ }
348
+ }
349
+
350
+ //# sourceMappingURL=MuseSessionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/muse/MuseSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\n\n/**\n * A single unwrapped inner record from a Muse session frame.\n *\n * Each session.jsonl line is one of: a direct inner record, a\n * `{ record_json: string }` envelope, or a `retained_frame` wrapper whose\n * `children[]` carry `record_json` strings. Inner records dispatch on\n * `payload_type`; timestamps (`recorded_at`) are microseconds.\n */\nexport interface MuseInnerRecord {\n stream?: { kind?: string; id?: string };\n sequence?: number;\n recorded_at?: number;\n record_type?: string;\n payload_type?: string;\n payload?: Record<string, unknown>;\n}\n\n/** Parsed session state extracted from a Muse transcript. */\nexport interface MuseSession {\n sessionId: string;\n projectPath: string;\n /** Last display name from `session.name.changed`, when present. */\n displayName?: string;\n modelId?: string;\n sessionStart: Date;\n lastActive: Date;\n /** Last conversation signal: user-intent, assistant reply, approval, tool batch… */\n lastSignal?: string;\n lastUserMessage?: string;\n /** First meaningful user prompt in the session. */\n firstUserMessage?: string;\n}\n\ninterface MuseSummaryState {\n seenFirstLine: boolean;\n pastHead?: boolean;\n sessionStartMs?: number;\n lastActiveMs?: number;\n workspaceRoot?: string;\n modelId?: string;\n displayName?: string;\n lastSignal?: string;\n lastUserMessage?: string;\n firstUserMessage?: string;\n}\n\n/**\n * Conversation-relevant shape of one inner record. Both the summary fold and\n * the message reader switch on this instead of re-matching payload shapes.\n */\ntype MuseRecordKind =\n | \"metadata\"\n | \"name-changed\"\n | \"user-intent\"\n | \"assistant\"\n | \"tool-calls\"\n | \"approval-started\"\n | \"approval-settled\"\n | \"input-requested\"\n | \"input-settled\"\n | \"run-terminal\"\n | \"other\";\n\nfunction classifyRecord(record: MuseInnerRecord): MuseRecordKind {\n const payload = record.payload;\n if (!isRecord(payload)) return \"other\";\n switch (record.payload_type) {\n case \"runtime.session.metadata\":\n return \"metadata\";\n case \"session.name.changed\":\n return \"name-changed\";\n case \"runtime.user_intent.accepted\":\n case \"runtime.user_intent.materialized\":\n return \"user-intent\";\n case \"runtime.session\":\n break;\n default:\n return \"other\";\n }\n if (!isRecord(payload.event) || typeof payload.event.kind !== \"string\") return \"other\";\n if (payload.kind === \"run\") {\n switch (payload.event.kind) {\n case \"assistant_message_committed\":\n return \"assistant\";\n case \"assistant_tool_calls_committed\":\n return \"tool-calls\";\n case \"terminal\":\n return \"run-terminal\";\n }\n }\n switch (payload.event.kind) {\n case \"approval_wait.effect.started\":\n return \"approval-started\";\n case \"approval_wait.effect.terminal\":\n return \"approval-settled\";\n case \"user_input_prompt_requested\":\n return \"input-requested\";\n case \"user_input_prompt_settled\":\n return \"input-settled\";\n default:\n return \"other\";\n }\n}\n\nconst MICROSECONDS_THRESHOLD = 1_000_000_000_000_000;\n\n/** `recorded_at` microseconds → epoch ms; null when invalid. */\nexport function museTimestampToMs(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n const ms = value >= MICROSECONDS_THRESHOLD ? Math.floor(value / 1000) : value;\n return ms >= 0 ? ms : null;\n}\n\n/** Unwrap one raw frame line into zero or more inner records. */\nexport function unwrapFrameRecords(line: string): MuseInnerRecord[] {\n let outer: unknown;\n try {\n outer = JSON.parse(line);\n } catch {\n return [];\n }\n return unwrapOuterRecords(outer);\n}\n\n/** Unwrap an already-parsed frame value into zero or more inner records. */\nexport function unwrapOuterRecords(outer: unknown): MuseInnerRecord[] {\n if (!outer || typeof outer !== \"object\") return [];\n const obj = outer as { record_json?: unknown; children?: unknown };\n if (typeof obj.record_json === \"string\") {\n try {\n const inner = JSON.parse(obj.record_json) as MuseInnerRecord;\n return [inner];\n } catch {\n return [];\n }\n }\n if (Array.isArray(obj.children)) {\n const out: MuseInnerRecord[] = [];\n for (const child of obj.children) {\n if (\n child &&\n typeof child === \"object\" &&\n typeof (child as { record_json?: unknown }).record_json === \"string\"\n ) {\n try {\n out.push(JSON.parse((child as { record_json: string }).record_json));\n } catch {\n /* skip malformed child */\n }\n }\n }\n return out;\n }\n return [obj as MuseInnerRecord];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\n}\n\n/** Collect `{ kind: \"text\", text }` strings from intent/model message blocks. */\nfunction collectTextBlocks(value: unknown): string[] {\n const out: string[] = [];\n if (Array.isArray(value)) {\n for (const block of value) {\n if (isRecord(block) && block.kind === \"text\") {\n const text = nonEmptyText(block.text);\n if (text) out.push(text);\n }\n }\n }\n return out;\n}\n\n/** User turn text from an intent payload (`refill_blocks` then `model_messages`). */\nfunction intentText(payload: Record<string, unknown>): string | null {\n const refill = collectTextBlocks(payload.refill_blocks);\n if (refill.length > 0) return refill.join(\"\\n\");\n const modelMessages = payload.model_messages;\n if (Array.isArray(modelMessages)) {\n const parts: string[] = [];\n for (const message of modelMessages) {\n if (isRecord(message)) parts.push(...collectTextBlocks(message.content));\n }\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n return null;\n}\n\n/** Assistant reply text from a `run.assistant_message_committed` event. */\nfunction assistantEventText(event: Record<string, unknown>): string | null {\n return nonEmptyText(event.text);\n}\n\nexport class MuseSessionParser {\n private readonly tailReader = new JsonlTailReader();\n private readonly sessionCache: IncrementalJsonlSummary<MuseSummaryState>;\n\n constructor() {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {});\n }\n\n readSession(filePath: string, projectPath: string): MuseSession | null {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n return null;\n }\n if (!content.trim()) return null;\n return this.toSession(filePath, projectPath, reduceJsonlContent(this.summaryReducer, content));\n }\n\n readSessionIncremental(filePath: string, projectPath: string): MuseSession | null {\n const result = this.sessionCache.read(filePath);\n return result ? this.toSession(filePath, projectPath, result.state) : null;\n }\n\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n private readonly summaryReducer: JsonlSummaryReducer<MuseSummaryState> = {\n initial: () => ({ seenFirstLine: false }),\n reduce: (state, value) => {\n const next: MuseSummaryState = { ...state, seenFirstLine: true };\n // Session start comes from the first line only; the first user message\n // may come from anywhere before a bounded-skip (mirrors Claude semantics).\n const flags = { isHead: !state.seenFirstLine, canBeFirst: !state.pastHead };\n for (const record of unwrapOuterRecords(value)) {\n this.foldRecord(next, record, flags);\n }\n return next;\n },\n skip: (state) => ({\n seenFirstLine: true,\n pastHead: true,\n sessionStartMs: state.sessionStartMs,\n firstUserMessage: state.firstUserMessage,\n }),\n };\n\n /**\n * Fold one inner record into the summary. `isHead` marks the first line\n * (session start only); `canBeFirst` allows the first user message from any\n * line read before a bounded-skip.\n */\n private foldRecord(\n next: MuseSummaryState,\n record: MuseInnerRecord,\n flags: { isHead: boolean; canBeFirst: boolean },\n ): void {\n const { isHead, canBeFirst } = flags;\n const atMs = museTimestampToMs(record.recorded_at);\n if (atMs !== null) {\n if (isHead && next.sessionStartMs === undefined) next.sessionStartMs = atMs;\n next.lastActiveMs = atMs;\n }\n const payload = record.payload;\n if (!isRecord(payload)) return;\n switch (classifyRecord(record)) {\n case \"metadata\": {\n if (!isRecord(payload.record)) return;\n const root = nonEmptyText(payload.record.workspace_root);\n if (root) next.workspaceRoot = root;\n const model = nonEmptyText(payload.record.model_id);\n if (model) next.modelId = model;\n return;\n }\n case \"name-changed\": {\n const name = nonEmptyText(payload.new_name);\n if (name) next.displayName = name;\n return;\n }\n case \"user-intent\": {\n next.lastSignal = \"user-intent\";\n const text = intentText(payload);\n if (text) {\n next.lastUserMessage = text;\n if (canBeFirst && !next.firstUserMessage) next.firstUserMessage = text;\n }\n return;\n }\n case \"assistant\":\n next.lastSignal = \"assistant\";\n return;\n case \"approval-started\":\n next.lastSignal = \"approval-wait\";\n return;\n case \"approval-settled\":\n if (next.lastSignal === \"approval-wait\") next.lastSignal = \"assistant\";\n return;\n case \"input-requested\":\n next.lastSignal = \"input-requested\";\n return;\n case \"input-settled\":\n if (next.lastSignal === \"input-requested\") next.lastSignal = \"assistant\";\n return;\n case \"run-terminal\":\n next.lastSignal = \"run-terminal\";\n return;\n default:\n return;\n }\n }\n\n private toSession(filePath: string, projectPath: string, state: MuseSummaryState): MuseSession {\n const sessionStartMs = state.sessionStartMs ?? state.lastActiveMs;\n return {\n sessionId: path.basename(path.dirname(filePath)),\n projectPath: projectPath || state.workspaceRoot || \"\",\n displayName: state.displayName,\n modelId: state.modelId,\n sessionStart: sessionStartMs !== undefined ? new Date(sessionStartMs) : new Date(),\n lastActive: state.lastActiveMs !== undefined ? new Date(state.lastActiveMs) : new Date(),\n lastSignal: state.lastSignal,\n lastUserMessage: state.lastUserMessage,\n firstUserMessage: state.firstUserMessage,\n };\n }\n\n /**\n * Status mapping over the last conversation signal:\n * - user-intent → RUNNING (agent is processing the new turn)\n * - assistant → WAITING (reply committed, awaiting user)\n * - approval-wait / input-requested → WAITING (blocked on the user)\n * - run-terminal → IDLE; no signal → UNKNOWN.\n */\n determineStatus(session: MuseSession): AgentStatus {\n switch (session.lastSignal) {\n case \"user-intent\":\n return AgentStatus.RUNNING;\n case \"assistant\":\n case \"approval-wait\":\n case \"input-requested\":\n return AgentStatus.WAITING;\n case \"run-terminal\":\n return AgentStatus.IDLE;\n default:\n return AgentStatus.UNKNOWN;\n }\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n sessionFilePath,\n tail,\n { parseLine: (line) => this.lineToMessage(line, verbose) },\n String(verbose),\n );\n }\n let content: string;\n try {\n content = fs.readFileSync(sessionFilePath, \"utf-8\");\n } catch {\n return [];\n }\n const messages: ConversationMessage[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n messages.push(...this.linesToMessages(line, verbose));\n }\n return messages;\n }\n\n /** One raw frame line → conversation messages (usually zero or one). */\n private linesToMessages(line: string, verbose: boolean): ConversationMessage[] {\n const out: ConversationMessage[] = [];\n for (const record of unwrapFrameRecords(line)) {\n const message = this.recordToMessage(record, verbose);\n if (message) out.push(message);\n }\n return out;\n }\n\n /**\n * One raw frame line → its first conversation message, for tail reads.\n * A retained frame can theoretically hold several messages; the tail\n * window counts lines, so a boundary line keeps only its first message.\n */\n private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {\n return this.linesToMessages(line, verbose)[0] ?? null;\n }\n\n private recordToMessage(record: MuseInnerRecord, verbose: boolean): ConversationMessage | null {\n const payload = record.payload;\n if (!isRecord(payload)) return null;\n const atMs = museTimestampToMs(record.recorded_at);\n const timestamp = atMs !== null ? new Date(atMs).toISOString() : undefined;\n\n switch (classifyRecord(record)) {\n case \"user-intent\": {\n const text = intentText(payload);\n if (!text) return null;\n return { role: \"user\", content: text, timestamp };\n }\n case \"assistant\": {\n if (!isRecord(payload.event)) return null;\n const text = assistantEventText(payload.event);\n if (!text) return null;\n return { role: \"assistant\", content: text, timestamp };\n }\n case \"tool-calls\": {\n if (!verbose || !isRecord(payload.event) || !Array.isArray(payload.event.tool_calls)) {\n return null;\n }\n const names = (payload.event.tool_calls as unknown[])\n .filter(isRecord)\n .map((call) => nonEmptyText(call.tool_name))\n .filter((name): name is string => name !== null);\n if (names.length === 0) return null;\n return { role: \"assistant\", content: `tool calls: ${names.join(\", \")}`, timestamp };\n }\n default:\n return null;\n }\n }\n}\n"],"names":["fs","path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","classifyRecord","record","payload","isRecord","payload_type","event","kind","MICROSECONDS_THRESHOLD","museTimestampToMs","value","Number","isFinite","ms","Math","floor","unwrapFrameRecords","line","outer","JSON","parse","unwrapOuterRecords","obj","record_json","inner","Array","isArray","children","out","child","push","nonEmptyText","trim","length","collectTextBlocks","block","text","intentText","refill","refill_blocks","join","modelMessages","model_messages","parts","message","content","assistantEventText","MuseSessionParser","tailReader","sessionCache","summaryReducer","readSession","filePath","projectPath","readFileSync","toSession","readSessionIncremental","result","read","state","pruneSessionCache","prune","initial","seenFirstLine","reduce","next","flags","isHead","canBeFirst","pastHead","foldRecord","skip","sessionStartMs","firstUserMessage","atMs","recorded_at","undefined","lastActiveMs","root","workspace_root","workspaceRoot","model","model_id","modelId","name","new_name","displayName","lastSignal","lastUserMessage","sessionId","basename","dirname","sessionStart","Date","lastActive","determineStatus","session","RUNNING","WAITING","IDLE","UNKNOWN","getConversation","sessionFilePath","options","verbose","tail","parseLine","lineToMessage","String","messages","split","linesToMessages","recordToMessage","timestamp","toISOString","role","tool_calls","names","filter","map","call","tool_name"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const museReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/muse/readiness.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AA4B/B,eAAO,MAAM,aAAa,EAAE,uBAG3B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { join } from "node:path";
2
+ import { displayHome, record } from "../readiness/checks.js";
3
+ async function authCheck(runtime) {
4
+ const sourcePath = join(runtime.homeDir, ".config", "muse", "auth.json");
5
+ try {
6
+ const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));
7
+ if (!parsed) throw new Error("invalid");
8
+ const authenticated = Object.keys(parsed).length > 0;
9
+ return {
10
+ state: authenticated ? "authenticated" : "unauthenticated",
11
+ source: displayHome(sourcePath, runtime.homeDir),
12
+ provider: null,
13
+ availableProviders: [],
14
+ status: authenticated ? "pass" : "fail",
15
+ errors: authenticated ? [] : [
16
+ "Muse credential file has no entries"
17
+ ]
18
+ };
19
+ } catch {
20
+ return {
21
+ state: "unauthenticated",
22
+ source: displayHome(sourcePath, runtime.homeDir),
23
+ provider: null,
24
+ availableProviders: [],
25
+ status: "fail",
26
+ errors: [
27
+ "Muse credential file is missing or invalid"
28
+ ]
29
+ };
30
+ }
31
+ }
32
+ export const museReadiness = {
33
+ configDir: ".config/muse",
34
+ auth: authCheck
35
+ };
36
+
37
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/muse/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport { displayHome, record } from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n const sourcePath = join(runtime.homeDir, \".config\", \"muse\", \"auth.json\");\n try {\n const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));\n if (!parsed) throw new Error(\"invalid\");\n const authenticated = Object.keys(parsed).length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"Muse credential file has no entries\"],\n };\n } catch {\n return {\n state: \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: \"fail\",\n errors: [\"Muse credential file is missing or invalid\"],\n };\n }\n}\n\nexport const museReadiness: HarnessReadinessProfile = {\n configDir: \".config/muse\",\n auth: authCheck,\n};\n"],"names":["join","displayHome","record","authCheck","runtime","sourcePath","homeDir","parsed","JSON","parse","readFile","Error","authenticated","Object","keys","length","state","source","provider","availableProviders","status","errors","museReadiness","configDir","auth"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAY;AACjC,SAASC,WAAW,EAAEC,MAAM,QAAQ,yBAAyB;AAO7D,eAAeC,UAAUC,OAAyB;IAChD,MAAMC,aAAaL,KAAKI,QAAQE,OAAO,EAAE,WAAW,QAAQ;IAC5D,IAAI;QACF,MAAMC,SAASL,OAAOM,KAAKC,KAAK,CAAC,MAAML,QAAQM,QAAQ,CAACL;QACxD,IAAI,CAACE,QAAQ,MAAM,IAAII,MAAM;QAC7B,MAAMC,gBAAgBC,OAAOC,IAAI,CAACP,QAAQQ,MAAM,GAAG;QACnD,OAAO;YACLC,OAAOJ,gBAAgB,kBAAkB;YACzCK,QAAQhB,YAAYI,YAAYD,QAAQE,OAAO;YAC/CY,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQR,gBAAgB,SAAS;YACjCS,QAAQT,gBAAgB,EAAE,GAAG;gBAAC;aAAsC;QACtE;IACF,EAAE,OAAM;QACN,OAAO;YACLI,OAAO;YACPC,QAAQhB,YAAYI,YAAYD,QAAQE,OAAO;YAC/CY,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAA6C;QACxD;IACF;AACF;AAEA,OAAO,MAAMC,gBAAyC;IACpDC,WAAW;IACXC,MAAMrB;AACR,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AAepB,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA8BD,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAQ3D;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AAgBpB,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA8BD,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAQ3D;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -4,6 +4,7 @@ import { copilotReadiness } from "../copilot/readiness.js";
4
4
  import { openCodeReadiness } from "../opencode/readiness.js";
5
5
  import { piReadiness } from "../pi/readiness.js";
6
6
  import { devinReadiness } from "../devin/readiness.js";
7
+ import { museReadiness } from "../muse/readiness.js";
7
8
  import { builtInSkillsCheck, createReadinessRuntime, directoryCheck, executableCheck, worstReadinessStatus } from "./checks.js";
8
9
  import { READINESS_AGENT_TYPES } from "./types.js";
9
10
  const READINESS_PROFILES = {
@@ -24,7 +25,8 @@ const READINESS_PROFILES = {
24
25
  opencode: openCodeReadiness,
25
26
  copilot: copilotReadiness,
26
27
  pi: piReadiness,
27
- devin: devinReadiness
28
+ devin: devinReadiness,
29
+ muse: museReadiness
28
30
  };
29
31
  export async function getAgentReadinessReport(agent, options = {}) {
30
32
  return agentReadiness(agent, createReadinessRuntime(options));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"sourcesContent":["import { claudeReadiness } from \"../claude/readiness.js\";\nimport { codexReadiness } from \"../codex/readiness.js\";\nimport { copilotReadiness } from \"../copilot/readiness.js\";\nimport { openCodeReadiness } from \"../opencode/readiness.js\";\nimport { piReadiness } from \"../pi/readiness.js\";\nimport { devinReadiness } from \"../devin/readiness.js\";\nimport {\n builtInSkillsCheck,\n createReadinessRuntime,\n directoryCheck,\n executableCheck,\n worstReadinessStatus,\n} from \"./checks.js\";\nimport {\n READINESS_AGENT_TYPES,\n type AgentReadinessOptions,\n type AgentReadinessReport,\n type HarnessReadinessProfile,\n type ReadinessAgentType,\n type ReadinessRuntime,\n} from \"./types.js\";\n\nconst READINESS_PROFILES: Record<ReadinessAgentType, HarnessReadinessProfile> = {\n claude: claudeReadiness,\n codex: codexReadiness,\n gemini_cli: { configDir: \".gemini\" },\n grok_cli: { configDir: \".grok\" },\n kiro: { configDir: \".kiro\" },\n antigravity_cli: { configDir: \".gemini/antigravity-cli\" },\n opencode: openCodeReadiness,\n copilot: copilotReadiness,\n pi: piReadiness,\n devin: devinReadiness,\n};\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, createReadinessRuntime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<AgentReadinessReport> {\n const profile = READINESS_PROFILES[agent];\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, runtime),\n directoryCheck(profile.configDir, runtime),\n builtInSkillsCheck(agent, runtime),\n profile.auth?.(runtime),\n profile.integration?.(runtime),\n ]);\n return {\n type: agent,\n executable,\n globalConfig,\n builtInSkills,\n auth,\n integration,\n status: worstReadinessStatus([\n executable.status,\n globalConfig.status,\n ...(auth ? [auth.status] : []),\n ...(integration ? [integration.status] : []),\n ]),\n };\n}\n\nexport async function getAgentReadinessReports(\n options: AgentReadinessOptions = {},\n): Promise<Record<ReadinessAgentType, AgentReadinessReport>> {\n const runtime = createReadinessRuntime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(\n async (agent) => [agent, await agentReadiness(agent, runtime)] as const,\n ),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n\nexport { worstReadinessStatus } from \"./checks.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n ReadinessAgentType,\n ReadinessStatus,\n} from \"./types.js\";\n"],"names":["claudeReadiness","codexReadiness","copilotReadiness","openCodeReadiness","piReadiness","devinReadiness","builtInSkillsCheck","createReadinessRuntime","directoryCheck","executableCheck","worstReadinessStatus","READINESS_AGENT_TYPES","READINESS_PROFILES","claude","codex","gemini_cli","configDir","grok_cli","kiro","antigravity_cli","opencode","copilot","pi","devin","getAgentReadinessReport","agent","options","agentReadiness","runtime","profile","executable","globalConfig","builtInSkills","auth","integration","Promise","all","type","status","getAgentReadinessReports","entries","map","Object","fromEntries"],"mappings":"AAAA,SAASA,eAAe,QAAQ,yBAAyB;AACzD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,cAAc,EACdC,eAAe,EACfC,oBAAoB,QACf,cAAc;AACrB,SACEC,qBAAqB,QAMhB,aAAa;AAEpB,MAAMC,qBAA0E;IAC9EC,QAAQb;IACRc,OAAOb;IACPc,YAAY;QAAEC,WAAW;IAAU;IACnCC,UAAU;QAAED,WAAW;IAAQ;IAC/BE,MAAM;QAAEF,WAAW;IAAQ;IAC3BG,iBAAiB;QAAEH,WAAW;IAA0B;IACxDI,UAAUjB;IACVkB,SAASnB;IACToB,IAAIlB;IACJmB,OAAOlB;AACT;AAEA,OAAO,eAAemB,wBACpBC,KAAyB,EACzBC,UAAiC,CAAC,CAAC;IAEnC,OAAOC,eAAeF,OAAOlB,uBAAuBmB;AACtD;AAEA,eAAeC,eACbF,KAAyB,EACzBG,OAAyB;IAEzB,MAAMC,UAAUjB,kBAAkB,CAACa,MAAM;IACzC,MAAM,CAACK,YAAYC,cAAcC,eAAeC,MAAMC,YAAY,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACrF3B,gBAAgBgB,OAAOG;QACvBpB,eAAeqB,QAAQb,SAAS,EAAEY;QAClCtB,mBAAmBmB,OAAOG;QAC1BC,QAAQI,IAAI,GAAGL;QACfC,QAAQK,WAAW,GAAGN;KACvB;IACD,OAAO;QACLS,MAAMZ;QACNK;QACAC;QACAC;QACAC;QACAC;QACAI,QAAQ5B,qBAAqB;YAC3BoB,WAAWQ,MAAM;YACjBP,aAAaO,MAAM;eACfL,OAAO;gBAACA,KAAKK,MAAM;aAAC,GAAG,EAAE;eACzBJ,cAAc;gBAACA,YAAYI,MAAM;aAAC,GAAG,EAAE;SAC5C;IACH;AACF;AAEA,OAAO,eAAeC,yBACpBb,UAAiC,CAAC,CAAC;IAEnC,MAAME,UAAUrB,uBAAuBmB;IACvC,MAAMc,UAAU,MAAML,QAAQC,GAAG,CAC/BzB,sBAAsB8B,GAAG,CACvB,OAAOhB,QAAU;YAACA;YAAO,MAAME,eAAeF,OAAOG;SAAS;IAGlE,OAAOc,OAAOC,WAAW,CAACH;AAC5B;AAEA,SAAS9B,oBAAoB,QAAQ,cAAc"}
1
+ {"version":3,"sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"sourcesContent":["import { claudeReadiness } from \"../claude/readiness.js\";\nimport { codexReadiness } from \"../codex/readiness.js\";\nimport { copilotReadiness } from \"../copilot/readiness.js\";\nimport { openCodeReadiness } from \"../opencode/readiness.js\";\nimport { piReadiness } from \"../pi/readiness.js\";\nimport { devinReadiness } from \"../devin/readiness.js\";\nimport { museReadiness } from \"../muse/readiness.js\";\nimport {\n builtInSkillsCheck,\n createReadinessRuntime,\n directoryCheck,\n executableCheck,\n worstReadinessStatus,\n} from \"./checks.js\";\nimport {\n READINESS_AGENT_TYPES,\n type AgentReadinessOptions,\n type AgentReadinessReport,\n type HarnessReadinessProfile,\n type ReadinessAgentType,\n type ReadinessRuntime,\n} from \"./types.js\";\n\nconst READINESS_PROFILES: Record<ReadinessAgentType, HarnessReadinessProfile> = {\n claude: claudeReadiness,\n codex: codexReadiness,\n gemini_cli: { configDir: \".gemini\" },\n grok_cli: { configDir: \".grok\" },\n kiro: { configDir: \".kiro\" },\n antigravity_cli: { configDir: \".gemini/antigravity-cli\" },\n opencode: openCodeReadiness,\n copilot: copilotReadiness,\n pi: piReadiness,\n devin: devinReadiness,\n muse: museReadiness,\n};\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, createReadinessRuntime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<AgentReadinessReport> {\n const profile = READINESS_PROFILES[agent];\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, runtime),\n directoryCheck(profile.configDir, runtime),\n builtInSkillsCheck(agent, runtime),\n profile.auth?.(runtime),\n profile.integration?.(runtime),\n ]);\n return {\n type: agent,\n executable,\n globalConfig,\n builtInSkills,\n auth,\n integration,\n status: worstReadinessStatus([\n executable.status,\n globalConfig.status,\n ...(auth ? [auth.status] : []),\n ...(integration ? [integration.status] : []),\n ]),\n };\n}\n\nexport async function getAgentReadinessReports(\n options: AgentReadinessOptions = {},\n): Promise<Record<ReadinessAgentType, AgentReadinessReport>> {\n const runtime = createReadinessRuntime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(\n async (agent) => [agent, await agentReadiness(agent, runtime)] as const,\n ),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n\nexport { worstReadinessStatus } from \"./checks.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n ReadinessAgentType,\n ReadinessStatus,\n} from \"./types.js\";\n"],"names":["claudeReadiness","codexReadiness","copilotReadiness","openCodeReadiness","piReadiness","devinReadiness","museReadiness","builtInSkillsCheck","createReadinessRuntime","directoryCheck","executableCheck","worstReadinessStatus","READINESS_AGENT_TYPES","READINESS_PROFILES","claude","codex","gemini_cli","configDir","grok_cli","kiro","antigravity_cli","opencode","copilot","pi","devin","muse","getAgentReadinessReport","agent","options","agentReadiness","runtime","profile","executable","globalConfig","builtInSkills","auth","integration","Promise","all","type","status","getAgentReadinessReports","entries","map","Object","fromEntries"],"mappings":"AAAA,SAASA,eAAe,QAAQ,yBAAyB;AACzD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,aAAa,QAAQ,uBAAuB;AACrD,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,cAAc,EACdC,eAAe,EACfC,oBAAoB,QACf,cAAc;AACrB,SACEC,qBAAqB,QAMhB,aAAa;AAEpB,MAAMC,qBAA0E;IAC9EC,QAAQd;IACRe,OAAOd;IACPe,YAAY;QAAEC,WAAW;IAAU;IACnCC,UAAU;QAAED,WAAW;IAAQ;IAC/BE,MAAM;QAAEF,WAAW;IAAQ;IAC3BG,iBAAiB;QAAEH,WAAW;IAA0B;IACxDI,UAAUlB;IACVmB,SAASpB;IACTqB,IAAInB;IACJoB,OAAOnB;IACPoB,MAAMnB;AACR;AAEA,OAAO,eAAeoB,wBACpBC,KAAyB,EACzBC,UAAiC,CAAC,CAAC;IAEnC,OAAOC,eAAeF,OAAOnB,uBAAuBoB;AACtD;AAEA,eAAeC,eACbF,KAAyB,EACzBG,OAAyB;IAEzB,MAAMC,UAAUlB,kBAAkB,CAACc,MAAM;IACzC,MAAM,CAACK,YAAYC,cAAcC,eAAeC,MAAMC,YAAY,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACrF5B,gBAAgBiB,OAAOG;QACvBrB,eAAesB,QAAQd,SAAS,EAAEa;QAClCvB,mBAAmBoB,OAAOG;QAC1BC,QAAQI,IAAI,GAAGL;QACfC,QAAQK,WAAW,GAAGN;KACvB;IACD,OAAO;QACLS,MAAMZ;QACNK;QACAC;QACAC;QACAC;QACAC;QACAI,QAAQ7B,qBAAqB;YAC3BqB,WAAWQ,MAAM;YACjBP,aAAaO,MAAM;eACfL,OAAO;gBAACA,KAAKK,MAAM;aAAC,GAAG,EAAE;eACzBJ,cAAc;gBAACA,YAAYI,MAAM;aAAC,GAAG,EAAE;SAC5C;IACH;AACF;AAEA,OAAO,eAAeC,yBACpBb,UAAiC,CAAC,CAAC;IAEnC,MAAME,UAAUtB,uBAAuBoB;IACvC,MAAMc,UAAU,MAAML,QAAQC,GAAG,CAC/B1B,sBAAsB+B,GAAG,CACvB,OAAOhB,QAAU;YAACA;YAAO,MAAME,eAAeF,OAAOG;SAAS;IAGlE,OAAOc,OAAOC,WAAW,CAACH;AAC5B;AAEA,SAAS/B,oBAAoB,QAAQ,cAAc"}
@@ -1,4 +1,4 @@
1
- export declare const READINESS_AGENT_TYPES: readonly ["claude", "codex", "gemini_cli", "grok_cli", "kiro", "antigravity_cli", "opencode", "copilot", "pi", "devin"];
1
+ export declare const READINESS_AGENT_TYPES: readonly ["claude", "codex", "gemini_cli", "grok_cli", "kiro", "antigravity_cli", "opencode", "copilot", "pi", "devin", "muse"];
2
2
  export type ReadinessStatus = "pass" | "warn" | "fail";
3
3
  export type ReadinessAuthState = "authenticated" | "unauthenticated" | "unknown";
4
4
  export type ReadinessAgentType = (typeof READINESS_AGENT_TYPES)[number];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeProfiles.d.ts","sourceRoot":"","sources":["../../src/harnesses/runtimeProfiles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAWtF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAGzF"}
1
+ {"version":3,"file":"runtimeProfiles.d.ts","sourceRoot":"","sources":["../../src/harnesses/runtimeProfiles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAYtF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAGzF"}
@@ -27,7 +27,8 @@ export const HARNESS_RUNTIME_PROFILES = {
27
27
  "kiro_cli",
28
28
  "kiro-cli"
29
29
  ]),
30
- devin: profile("devin", matchArgv0("devin"))
30
+ devin: profile("devin", matchArgv0("devin")),
31
+ muse: profile("muse", matchArgv0Name("muse"))
31
32
  };
32
33
  export function runtimeAgentMatchesHarness(runtimeAgent, type) {
33
34
  if (type === "other") return runtimeAgent.toLowerCase() === "other";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/harnesses/runtimeProfiles.ts"],"sourcesContent":["import path from \"node:path\";\nimport { AGENT_TYPES, type AgentType } from \"../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../utils/process.js\";\n\nexport type StartableAgentType = (typeof AGENT_TYPES)[number];\n\nexport interface HarnessRuntimeProfile {\n command: string;\n runtimeKind: string;\n discoveryAliases: readonly string[];\n matches: (psCommand: string) => boolean;\n}\n\nexport const HARNESS_RUNTIME_PROFILES: Record<StartableAgentType, HarnessRuntimeProfile> = {\n claude: profile(\"claude\", matchArgv0(\"claude\")),\n codex: profile(\"codex\", matchArgv0(\"codex\")),\n copilot: profile(\"copilot\", matchArgv0Name(\"copilot-cli\")),\n gemini_cli: profile(\"gemini\", matchAnyBasename([\"gemini\"]), [\"gemini_cli\"]),\n grok_cli: profile(\"grok\", matchArgv0(\"grok\"), [\"grok_cli\"]),\n antigravity_cli: profile(\"agy\", matchArgv0(\"agy\"), [\"antigravity\", \"antigravity_cli\"]),\n opencode: profile(\"opencode\", matchArgv0(\"opencode\")),\n pi: profile(\"pi\", matchAnyBasename([\"pi\"])),\n kiro: profile(\"kiro\", matchAnyBasename([\"kiro-cli\", \"kiro\"]), [\"kiro_cli\", \"kiro-cli\"]),\n devin: profile(\"devin\", matchArgv0(\"devin\")),\n};\n\nexport function runtimeAgentMatchesHarness(runtimeAgent: string, type: AgentType): boolean {\n if (type === \"other\") return runtimeAgent.toLowerCase() === \"other\";\n return HARNESS_RUNTIME_PROFILES[type].discoveryAliases.includes(runtimeAgent.toLowerCase());\n}\n\nfunction profile(\n runtimeKind: string,\n matches: (psCommand: string) => boolean,\n extraAliases: readonly string[] = [],\n): HarnessRuntimeProfile {\n return {\n command: runtimeKind === \"kiro\" ? \"kiro-cli\" : runtimeKind,\n runtimeKind,\n discoveryAliases: [runtimeKind, ...extraAliases],\n matches,\n };\n}\n\nconst ABSOLUTE_PATH = /^(?:\\/|[a-zA-Z]:[\\\\/])/;\nconst PATH_SEPARATOR = /[\\\\/]/;\n\nfunction basenameOf(token: string): string {\n return path.basename(token).toLowerCase();\n}\n\nfunction tokensOf(psCommand: string): string[] {\n return psCommand.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction splitArgv0(psCommand: string): { argv0: string; args: string[] } {\n const command = psCommand.trim();\n const argv0 = executablePath(command);\n return { argv0, args: tokensOf(command.slice(argv0.length)) };\n}\n\nfunction mayContinueArgv0(tokens: string[], test: (token: string) => boolean): boolean {\n return (\n ABSOLUTE_PATH.test(tokens[0]) &&\n tokens.slice(1).some((token) => PATH_SEPARATOR.test(token) && test(token))\n );\n}\n\nfunction matchArgv0(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => basenameOf(token) === lower;\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchArgv0Name(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => token.toLowerCase().includes(lower);\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchAnyBasename(names: string[]): (psCommand: string) => boolean {\n const lowers = new Set(names.map((name) => name.toLowerCase()));\n const test = (token: string) => lowers.has(basenameOf(token));\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n if (!tokens.slice(1).some(test)) return false;\n if (!ABSOLUTE_PATH.test(tokens[0])) return true;\n\n const { argv0, args } = splitArgv0(psCommand);\n return test(argv0) || args.some(test);\n };\n}\n"],"names":["path","executablePath","HARNESS_RUNTIME_PROFILES","claude","profile","matchArgv0","codex","copilot","matchArgv0Name","gemini_cli","matchAnyBasename","grok_cli","antigravity_cli","opencode","pi","kiro","devin","runtimeAgentMatchesHarness","runtimeAgent","type","toLowerCase","discoveryAliases","includes","runtimeKind","matches","extraAliases","command","ABSOLUTE_PATH","PATH_SEPARATOR","basenameOf","token","basename","tokensOf","psCommand","trim","split","filter","Boolean","splitArgv0","argv0","args","slice","length","mayContinueArgv0","tokens","test","some","name","lower","names","lowers","Set","map","has"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/harnesses/runtimeProfiles.ts"],"sourcesContent":["import path from \"node:path\";\nimport { AGENT_TYPES, type AgentType } from \"../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../utils/process.js\";\n\nexport type StartableAgentType = (typeof AGENT_TYPES)[number];\n\nexport interface HarnessRuntimeProfile {\n command: string;\n runtimeKind: string;\n discoveryAliases: readonly string[];\n matches: (psCommand: string) => boolean;\n}\n\nexport const HARNESS_RUNTIME_PROFILES: Record<StartableAgentType, HarnessRuntimeProfile> = {\n claude: profile(\"claude\", matchArgv0(\"claude\")),\n codex: profile(\"codex\", matchArgv0(\"codex\")),\n copilot: profile(\"copilot\", matchArgv0Name(\"copilot-cli\")),\n gemini_cli: profile(\"gemini\", matchAnyBasename([\"gemini\"]), [\"gemini_cli\"]),\n grok_cli: profile(\"grok\", matchArgv0(\"grok\"), [\"grok_cli\"]),\n antigravity_cli: profile(\"agy\", matchArgv0(\"agy\"), [\"antigravity\", \"antigravity_cli\"]),\n opencode: profile(\"opencode\", matchArgv0(\"opencode\")),\n pi: profile(\"pi\", matchAnyBasename([\"pi\"])),\n kiro: profile(\"kiro\", matchAnyBasename([\"kiro-cli\", \"kiro\"]), [\"kiro_cli\", \"kiro-cli\"]),\n devin: profile(\"devin\", matchArgv0(\"devin\")),\n muse: profile(\"muse\", matchArgv0Name(\"muse\")),\n};\n\nexport function runtimeAgentMatchesHarness(runtimeAgent: string, type: AgentType): boolean {\n if (type === \"other\") return runtimeAgent.toLowerCase() === \"other\";\n return HARNESS_RUNTIME_PROFILES[type].discoveryAliases.includes(runtimeAgent.toLowerCase());\n}\n\nfunction profile(\n runtimeKind: string,\n matches: (psCommand: string) => boolean,\n extraAliases: readonly string[] = [],\n): HarnessRuntimeProfile {\n return {\n command: runtimeKind === \"kiro\" ? \"kiro-cli\" : runtimeKind,\n runtimeKind,\n discoveryAliases: [runtimeKind, ...extraAliases],\n matches,\n };\n}\n\nconst ABSOLUTE_PATH = /^(?:\\/|[a-zA-Z]:[\\\\/])/;\nconst PATH_SEPARATOR = /[\\\\/]/;\n\nfunction basenameOf(token: string): string {\n return path.basename(token).toLowerCase();\n}\n\nfunction tokensOf(psCommand: string): string[] {\n return psCommand.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction splitArgv0(psCommand: string): { argv0: string; args: string[] } {\n const command = psCommand.trim();\n const argv0 = executablePath(command);\n return { argv0, args: tokensOf(command.slice(argv0.length)) };\n}\n\nfunction mayContinueArgv0(tokens: string[], test: (token: string) => boolean): boolean {\n return (\n ABSOLUTE_PATH.test(tokens[0]) &&\n tokens.slice(1).some((token) => PATH_SEPARATOR.test(token) && test(token))\n );\n}\n\nfunction matchArgv0(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => basenameOf(token) === lower;\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchArgv0Name(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => token.toLowerCase().includes(lower);\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchAnyBasename(names: string[]): (psCommand: string) => boolean {\n const lowers = new Set(names.map((name) => name.toLowerCase()));\n const test = (token: string) => lowers.has(basenameOf(token));\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n if (!tokens.slice(1).some(test)) return false;\n if (!ABSOLUTE_PATH.test(tokens[0])) return true;\n\n const { argv0, args } = splitArgv0(psCommand);\n return test(argv0) || args.some(test);\n };\n}\n"],"names":["path","executablePath","HARNESS_RUNTIME_PROFILES","claude","profile","matchArgv0","codex","copilot","matchArgv0Name","gemini_cli","matchAnyBasename","grok_cli","antigravity_cli","opencode","pi","kiro","devin","muse","runtimeAgentMatchesHarness","runtimeAgent","type","toLowerCase","discoveryAliases","includes","runtimeKind","matches","extraAliases","command","ABSOLUTE_PATH","PATH_SEPARATOR","basenameOf","token","basename","tokensOf","psCommand","trim","split","filter","Boolean","splitArgv0","argv0","args","slice","length","mayContinueArgv0","tokens","test","some","name","lower","names","lowers","Set","map","has"],"mappings":"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"}
@@ -18,7 +18,7 @@ export interface HarnessProcesses {
18
18
  * capture when called standalone. `relevant` also keeps helper processes
19
19
  * (e.g. a harness's child runtime) that detection may need to walk through.
20
20
  */
21
- export declare function findHarnessProcesses(adapter: Pick<AgentAdapter, "canHandle"> & {
21
+ export declare function findHarnessProcesses(adapter: Pick<AgentAdapter, "canHandle" | "processNamePrefixes"> & {
22
22
  readonly processNames: readonly string[];
23
23
  }, context?: AgentDetectionContext): Promise<HarnessProcesses>;
24
24
  /** Whether argv[0]'s basename is `name` or `name.exe`. */
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/harnesses/shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,WAAW,EACZ,MAAM,6BAA6B,CAAC;AASrC,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,wEAAwE;IACxE,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EACvF,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAa3B;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,WAAW,EACxB,EAAE,OAAO,EAAE,GAA2B,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E,SAAS,CAWX;AAED,wBAAgB,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,SAAa,GAAG,OAAO,CAElE;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAQ1D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAU1D"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/harnesses/shared.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,WAAW,EACZ,MAAM,6BAA6B,CAAC;AAUrC,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,6EAA6E;IAC7E,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,wEAAwE;IACxE,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,qBAAqB,CAAC,GAAG;IACjE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C,EACD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAe3B;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,WAAW,EACxB,EAAE,OAAO,EAAE,GAA2B,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E,SAAS,CAWX;AAED,wBAAgB,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,SAAa,GAAG,OAAO,CAElE;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,GAAG,IAAI,CAQ1D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAU1D"}