@ai-devkit/agent-manager 0.38.0 → 0.39.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 (94) hide show
  1. package/dist/__tests__/harnesses/devin/DevinAdapter.test.js +597 -0
  2. package/dist/__tests__/harnesses/devin/DevinAdapter.test.js.map +1 -0
  3. package/dist/__tests__/harnesses/devin/DevinAgentMapper.test.js +91 -0
  4. package/dist/__tests__/harnesses/devin/DevinAgentMapper.test.js.map +1 -0
  5. package/dist/__tests__/harnesses/devin/DevinSessionLocator.test.js +192 -0
  6. package/dist/__tests__/harnesses/devin/DevinSessionLocator.test.js.map +1 -0
  7. package/dist/__tests__/harnesses/devin/DevinSessionParser.test.js +407 -0
  8. package/dist/__tests__/harnesses/devin/DevinSessionParser.test.js.map +1 -0
  9. package/dist/__tests__/harnesses/devin/fixtures.js +95 -0
  10. package/dist/__tests__/harnesses/devin/fixtures.js.map +1 -0
  11. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js +64 -1
  12. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -1
  13. package/dist/__tests__/terminal/GhosttyBackend.test.js +334 -0
  14. package/dist/__tests__/terminal/GhosttyBackend.test.js.map +1 -0
  15. package/dist/adapters/AgentAdapter.d.ts +1 -1
  16. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  17. package/dist/adapters/AgentAdapter.js +2 -1
  18. package/dist/adapters/AgentAdapter.js.map +1 -1
  19. package/dist/harnesses/devin/DevinAdapter.d.ts +39 -0
  20. package/dist/harnesses/devin/DevinAdapter.d.ts.map +1 -0
  21. package/dist/harnesses/devin/DevinAdapter.js +177 -0
  22. package/dist/harnesses/devin/DevinAdapter.js.map +1 -0
  23. package/dist/harnesses/devin/DevinAgentMapper.d.ts +11 -0
  24. package/dist/harnesses/devin/DevinAgentMapper.d.ts.map +1 -0
  25. package/dist/harnesses/devin/DevinAgentMapper.js +35 -0
  26. package/dist/harnesses/devin/DevinAgentMapper.js.map +1 -0
  27. package/dist/harnesses/devin/DevinSessionLocator.d.ts +46 -0
  28. package/dist/harnesses/devin/DevinSessionLocator.d.ts.map +1 -0
  29. package/dist/harnesses/devin/DevinSessionLocator.js +176 -0
  30. package/dist/harnesses/devin/DevinSessionLocator.js.map +1 -0
  31. package/dist/harnesses/devin/DevinSessionParser.d.ts +29 -0
  32. package/dist/harnesses/devin/DevinSessionParser.d.ts.map +1 -0
  33. package/dist/harnesses/devin/DevinSessionParser.js +166 -0
  34. package/dist/harnesses/devin/DevinSessionParser.js.map +1 -0
  35. package/dist/harnesses/devin/readiness.d.ts +3 -0
  36. package/dist/harnesses/devin/readiness.d.ts.map +1 -0
  37. package/dist/harnesses/devin/readiness.js +39 -0
  38. package/dist/harnesses/devin/readiness.js.map +1 -0
  39. package/dist/harnesses/index.d.ts.map +1 -1
  40. package/dist/harnesses/index.js +3 -1
  41. package/dist/harnesses/index.js.map +1 -1
  42. package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -1
  43. package/dist/harnesses/readiness/AgentReadiness.js +3 -1
  44. package/dist/harnesses/readiness/AgentReadiness.js.map +1 -1
  45. package/dist/harnesses/readiness/types.d.ts +1 -1
  46. package/dist/harnesses/readiness/types.d.ts.map +1 -1
  47. package/dist/harnesses/runtimeProfiles.d.ts.map +1 -1
  48. package/dist/harnesses/runtimeProfiles.js +2 -1
  49. package/dist/harnesses/runtimeProfiles.js.map +1 -1
  50. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  51. package/dist/terminal/TtyWriter.js +4 -3
  52. package/dist/terminal/TtyWriter.js.map +1 -1
  53. package/dist/terminal/backends/ghostty.d.ts +3 -0
  54. package/dist/terminal/backends/ghostty.d.ts.map +1 -0
  55. package/dist/terminal/backends/ghostty.js +161 -0
  56. package/dist/terminal/backends/ghostty.js.map +1 -0
  57. package/dist/terminal/backends/index.d.ts.map +1 -1
  58. package/dist/terminal/backends/index.js +2 -0
  59. package/dist/terminal/backends/index.js.map +1 -1
  60. package/dist/terminal/backends/shared.d.ts +2 -0
  61. package/dist/terminal/backends/shared.d.ts.map +1 -1
  62. package/dist/terminal/backends/shared.js +4 -1
  63. package/dist/terminal/backends/shared.js.map +1 -1
  64. package/dist/terminal/types.d.ts +1 -0
  65. package/dist/terminal/types.d.ts.map +1 -1
  66. package/dist/terminal/types.js +1 -0
  67. package/dist/terminal/types.js.map +1 -1
  68. package/dist/utils/process.d.ts +2 -0
  69. package/dist/utils/process.d.ts.map +1 -1
  70. package/dist/utils/process.js +3 -0
  71. package/dist/utils/process.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/__tests__/harnesses/devin/DevinAdapter.test.ts +292 -0
  74. package/src/__tests__/harnesses/devin/DevinAgentMapper.test.ts +88 -0
  75. package/src/__tests__/harnesses/devin/DevinSessionLocator.test.ts +139 -0
  76. package/src/__tests__/harnesses/devin/DevinSessionParser.test.ts +218 -0
  77. package/src/__tests__/harnesses/devin/fixtures.ts +144 -0
  78. package/src/__tests__/harnesses/readiness/AgentReadiness.test.ts +41 -0
  79. package/src/__tests__/terminal/GhosttyBackend.test.ts +271 -0
  80. package/src/adapters/AgentAdapter.ts +1 -0
  81. package/src/harnesses/devin/DevinAdapter.ts +224 -0
  82. package/src/harnesses/devin/DevinAgentMapper.ts +43 -0
  83. package/src/harnesses/devin/DevinSessionLocator.ts +230 -0
  84. package/src/harnesses/devin/DevinSessionParser.ts +236 -0
  85. package/src/harnesses/devin/readiness.ts +36 -0
  86. package/src/harnesses/index.ts +2 -0
  87. package/src/harnesses/readiness/AgentReadiness.ts +2 -0
  88. package/src/harnesses/runtimeProfiles.ts +1 -0
  89. package/src/terminal/TtyWriter.ts +5 -5
  90. package/src/terminal/backends/ghostty.ts +180 -0
  91. package/src/terminal/backends/index.ts +2 -0
  92. package/src/terminal/backends/shared.ts +6 -1
  93. package/src/terminal/types.ts +1 -0
  94. package/src/utils/process.ts +5 -0
@@ -0,0 +1,166 @@
1
+ import { sliceTail } from "../../utils/jsonlTail.js";
2
+ import { SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
3
+ const EMPTY_STATS = {
4
+ lastRole: null,
5
+ lastTimeUpdated: 0,
6
+ summary: ""
7
+ };
8
+ /** Rows fetched per requested tail message; revisions/tools eat into the window. */ const TAIL_OVERFETCH = 8;
9
+ const TOOL_CONTENT_MAX = 500;
10
+ export class DevinSessionParser {
11
+ getConversation(db, sessionId, options) {
12
+ const verbose = options?.verbose ?? false;
13
+ const tail = options?.tail && Number.isInteger(options.tail) && options.tail > 0 ? options.tail : undefined;
14
+ try {
15
+ // LIMIT -1 = unbounded in SQLite; one query serves the full and tail paths.
16
+ const limit = tail ? tail * TAIL_OVERFETCH : -1;
17
+ const rows = db.prepare(`
18
+ SELECT node_id, chat_message
19
+ FROM message_nodes
20
+ WHERE session_id = ?
21
+ ORDER BY node_id DESC
22
+ LIMIT ?
23
+ `).all(sessionId, limit).reverse();
24
+ const messages = [];
25
+ const latestNodeByMessageId = new Map();
26
+ const parsed = [];
27
+ for (const row of rows){
28
+ const message = this.parseChatMessage(row.chat_message);
29
+ if (!message) continue;
30
+ parsed.push({
31
+ nodeId: row.node_id,
32
+ message
33
+ });
34
+ if (message.message_id) {
35
+ latestNodeByMessageId.set(message.message_id, Math.max(latestNodeByMessageId.get(message.message_id) ?? 0, row.node_id));
36
+ }
37
+ }
38
+ for (const { nodeId, message } of parsed){
39
+ if (message.message_id && latestNodeByMessageId.get(message.message_id) !== nodeId) {
40
+ continue;
41
+ }
42
+ const role = message.role;
43
+ if (role === "system") continue;
44
+ const content = typeof message.content === "string" ? message.content : "";
45
+ if (role === "user") {
46
+ if (message.metadata?.is_user_input === false || !content.trim()) continue;
47
+ messages.push({
48
+ role: "user",
49
+ content
50
+ });
51
+ continue;
52
+ }
53
+ if (role === "assistant") {
54
+ const thinking = typeof message.thinking === "string" ? message.thinking : message.thinking?.thinking;
55
+ if (verbose && thinking) {
56
+ messages.push({
57
+ role: "assistant",
58
+ content: `[thinking] ${thinking}`
59
+ });
60
+ }
61
+ if (content.trim()) messages.push({
62
+ role: "assistant",
63
+ content
64
+ });
65
+ if (verbose) {
66
+ for (const call of message.tool_calls ?? []){
67
+ const name = call.function?.name ?? call.name ?? "tool";
68
+ messages.push({
69
+ role: "assistant",
70
+ content: `[tool: ${name}]`
71
+ });
72
+ }
73
+ }
74
+ continue;
75
+ }
76
+ if (role === "tool" && verbose) {
77
+ const label = message.name ? `[tool: ${message.name}]` : "[tool]";
78
+ messages.push({
79
+ role: "assistant",
80
+ content: `${label} ${truncate(content.trim(), TOOL_CONTENT_MAX)}`.trim()
81
+ });
82
+ }
83
+ }
84
+ return sliceTail(messages, tail);
85
+ } catch {
86
+ return [];
87
+ }
88
+ }
89
+ getSessionStats(db, sessionId) {
90
+ try {
91
+ const frontier = db.prepare(`
92
+ SELECT chat_message
93
+ FROM message_nodes
94
+ WHERE session_id = ?
95
+ ORDER BY node_id DESC
96
+ LIMIT 1
97
+ `).get(sessionId);
98
+ const heartbeat = db.prepare(`
99
+ SELECT MAX(created_at) AS maxCreated
100
+ FROM message_nodes
101
+ WHERE session_id = ?
102
+ `).get(sessionId);
103
+ return {
104
+ lastRole: this.parseChatMessage(frontier?.chat_message ?? "")?.role ?? null,
105
+ lastTimeUpdated: (heartbeat?.maxCreated ?? 0) * 1000,
106
+ summary: this.getLastUserPrompt(db, sessionId)
107
+ };
108
+ } catch {
109
+ return EMPTY_STATS;
110
+ }
111
+ }
112
+ /**
113
+ * Most recent typed prompt for the "working on" summary, matching the
114
+ * last-user-message convention of the other adapters.
115
+ */ getLastUserPrompt(db, sessionId) {
116
+ return this.userPrompt(db, sessionId, "DESC");
117
+ }
118
+ /**
119
+ * First typed prompt for session-list identity (`firstUserMessage`).
120
+ */ getFirstUserMessage(db, sessionId) {
121
+ return this.userPrompt(db, sessionId, "ASC");
122
+ }
123
+ /**
124
+ * Typed prompt in the given direction. `prompt_history` is authoritative;
125
+ * shell `!` commands and `/` slash commands are skipped. Falls back to a
126
+ * bounded `is_user_input` node scan in the same direction.
127
+ */ userPrompt(db, sessionId, direction) {
128
+ try {
129
+ const prompt = db.prepare(`
130
+ SELECT content
131
+ FROM prompt_history
132
+ WHERE session_id = ? AND is_shell = 0 AND content NOT LIKE '/%'
133
+ ORDER BY timestamp ${direction}
134
+ LIMIT 1
135
+ `).get(sessionId);
136
+ if (prompt?.content?.trim()) return truncate(prompt.content.trim(), SUMMARY_MAX_LENGTH);
137
+ } catch {
138
+ /* fall through to message_nodes */ }
139
+ try {
140
+ const rows = db.prepare(`
141
+ SELECT chat_message
142
+ FROM message_nodes
143
+ WHERE session_id = ? AND json_extract(chat_message, '$.role') = 'user'
144
+ ORDER BY node_id ${direction}
145
+ LIMIT 8
146
+ `).all(sessionId);
147
+ for (const row of rows){
148
+ const message = this.parseChatMessage(row.chat_message);
149
+ if (message?.role === "user" && message.metadata?.is_user_input !== false && typeof message.content === "string" && message.content.trim()) {
150
+ return truncate(message.content.trim(), SUMMARY_MAX_LENGTH);
151
+ }
152
+ }
153
+ } catch {
154
+ /* ignore */ }
155
+ return "";
156
+ }
157
+ parseChatMessage(raw) {
158
+ try {
159
+ return JSON.parse(raw);
160
+ } catch {
161
+ return null;
162
+ }
163
+ }
164
+ }
165
+
166
+ //# sourceMappingURL=DevinSessionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/devin/DevinSessionParser.ts"],"sourcesContent":["import type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { sliceTail } from \"../../utils/jsonlTail.js\";\nimport { SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\nimport type Database from \"better-sqlite3\";\n\nexport interface DevinSessionStats {\n lastRole: string | null;\n /** Epoch milliseconds of the newest message node. */\n lastTimeUpdated: number;\n summary: string;\n}\n\ninterface DevinChatMessage {\n message_id?: string;\n role?: string;\n content?: unknown;\n tool_calls?: { name?: string; function?: { name?: string } }[];\n thinking?: { thinking?: string } | string;\n name?: string;\n metadata?: { is_user_input?: boolean };\n}\n\ninterface MessageNodeRow {\n node_id: number;\n chat_message: string;\n}\n\nconst EMPTY_STATS: DevinSessionStats = {\n lastRole: null,\n lastTimeUpdated: 0,\n summary: \"\",\n};\n\n/** Rows fetched per requested tail message; revisions/tools eat into the window. */\nconst TAIL_OVERFETCH = 8;\nconst TOOL_CONTENT_MAX = 500;\n\nexport class DevinSessionParser {\n getConversation(\n db: Database.Database,\n sessionId: string,\n options?: ConversationOptions,\n ): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const tail =\n options?.tail && Number.isInteger(options.tail) && options.tail > 0\n ? options.tail\n : undefined;\n\n try {\n // LIMIT -1 = unbounded in SQLite; one query serves the full and tail paths.\n const limit = tail ? tail * TAIL_OVERFETCH : -1;\n const rows = db\n .prepare<[string, number], MessageNodeRow>(`\n SELECT node_id, chat_message\n FROM message_nodes\n WHERE session_id = ?\n ORDER BY node_id DESC\n LIMIT ?\n `)\n .all(sessionId, limit)\n .reverse();\n\n const messages: ConversationMessage[] = [];\n const latestNodeByMessageId = new Map<string, number>();\n const parsed: { nodeId: number; message: DevinChatMessage }[] = [];\n\n for (const row of rows) {\n const message = this.parseChatMessage(row.chat_message);\n if (!message) continue;\n parsed.push({ nodeId: row.node_id, message });\n if (message.message_id) {\n latestNodeByMessageId.set(\n message.message_id,\n Math.max(latestNodeByMessageId.get(message.message_id) ?? 0, row.node_id),\n );\n }\n }\n\n for (const { nodeId, message } of parsed) {\n if (\n message.message_id &&\n latestNodeByMessageId.get(message.message_id) !== nodeId\n ) {\n continue;\n }\n\n const role = message.role;\n if (role === \"system\") continue;\n\n const content = typeof message.content === \"string\" ? message.content : \"\";\n\n if (role === \"user\") {\n if (message.metadata?.is_user_input === false || !content.trim()) continue;\n messages.push({ role: \"user\", content });\n continue;\n }\n\n if (role === \"assistant\") {\n const thinking =\n typeof message.thinking === \"string\"\n ? message.thinking\n : message.thinking?.thinking;\n if (verbose && thinking) {\n messages.push({ role: \"assistant\", content: `[thinking] ${thinking}` });\n }\n if (content.trim()) messages.push({ role: \"assistant\", content });\n if (verbose) {\n for (const call of message.tool_calls ?? []) {\n const name = call.function?.name ?? call.name ?? \"tool\";\n messages.push({ role: \"assistant\", content: `[tool: ${name}]` });\n }\n }\n continue;\n }\n\n if (role === \"tool\" && verbose) {\n const label = message.name ? `[tool: ${message.name}]` : \"[tool]\";\n messages.push({\n role: \"assistant\",\n content: `${label} ${truncate(content.trim(), TOOL_CONTENT_MAX)}`.trim(),\n });\n }\n }\n\n return sliceTail(messages, tail);\n } catch {\n return [];\n }\n }\n\n getSessionStats(db: Database.Database, sessionId: string): DevinSessionStats {\n try {\n const frontier = db\n .prepare<[string], { chat_message: string }>(`\n SELECT chat_message\n FROM message_nodes\n WHERE session_id = ?\n ORDER BY node_id DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const heartbeat = db\n .prepare<[string], { maxCreated: number | null }>(`\n SELECT MAX(created_at) AS maxCreated\n FROM message_nodes\n WHERE session_id = ?\n `)\n .get(sessionId);\n\n return {\n lastRole: this.parseChatMessage(frontier?.chat_message ?? \"\")?.role ?? null,\n lastTimeUpdated: (heartbeat?.maxCreated ?? 0) * 1000,\n summary: this.getLastUserPrompt(db, sessionId),\n };\n } catch {\n return EMPTY_STATS;\n }\n }\n\n /**\n * Most recent typed prompt for the \"working on\" summary, matching the\n * last-user-message convention of the other adapters.\n */\n getLastUserPrompt(db: Database.Database, sessionId: string): string {\n return this.userPrompt(db, sessionId, \"DESC\");\n }\n\n /**\n * First typed prompt for session-list identity (`firstUserMessage`).\n */\n getFirstUserMessage(db: Database.Database, sessionId: string): string {\n return this.userPrompt(db, sessionId, \"ASC\");\n }\n\n /**\n * Typed prompt in the given direction. `prompt_history` is authoritative;\n * shell `!` commands and `/` slash commands are skipped. Falls back to a\n * bounded `is_user_input` node scan in the same direction.\n */\n private userPrompt(\n db: Database.Database,\n sessionId: string,\n direction: \"ASC\" | \"DESC\",\n ): string {\n try {\n const prompt = db\n .prepare<[string], { content: string }>(`\n SELECT content\n FROM prompt_history\n WHERE session_id = ? AND is_shell = 0 AND content NOT LIKE '/%'\n ORDER BY timestamp ${direction}\n LIMIT 1\n `)\n .get(sessionId);\n if (prompt?.content?.trim()) return truncate(prompt.content.trim(), SUMMARY_MAX_LENGTH);\n } catch {\n /* fall through to message_nodes */\n }\n\n try {\n const rows = db\n .prepare<[string], { chat_message: string }>(`\n SELECT chat_message\n FROM message_nodes\n WHERE session_id = ? AND json_extract(chat_message, '$.role') = 'user'\n ORDER BY node_id ${direction}\n LIMIT 8\n `)\n .all(sessionId);\n for (const row of rows) {\n const message = this.parseChatMessage(row.chat_message);\n if (\n message?.role === \"user\" &&\n message.metadata?.is_user_input !== false &&\n typeof message.content === \"string\" &&\n message.content.trim()\n ) {\n return truncate(message.content.trim(), SUMMARY_MAX_LENGTH);\n }\n }\n } catch {\n /* ignore */\n }\n return \"\";\n }\n\n private parseChatMessage(raw: string): DevinChatMessage | null {\n try {\n return JSON.parse(raw) as DevinChatMessage;\n } catch {\n return null;\n }\n }\n}\n"],"names":["sliceTail","SUMMARY_MAX_LENGTH","truncate","EMPTY_STATS","lastRole","lastTimeUpdated","summary","TAIL_OVERFETCH","TOOL_CONTENT_MAX","DevinSessionParser","getConversation","db","sessionId","options","verbose","tail","Number","isInteger","undefined","limit","rows","prepare","all","reverse","messages","latestNodeByMessageId","Map","parsed","row","message","parseChatMessage","chat_message","push","nodeId","node_id","message_id","set","Math","max","get","role","content","metadata","is_user_input","trim","thinking","call","tool_calls","name","function","label","getSessionStats","frontier","heartbeat","maxCreated","getLastUserPrompt","userPrompt","getFirstUserMessage","direction","prompt","raw","JSON","parse"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { HarnessReadinessProfile } from "../readiness/types.js";
2
+ export declare const devinReadiness: HarnessReadinessProfile;
3
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/devin/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AA4B/B,eAAO,MAAM,cAAc,EAAE,uBAG5B,CAAC"}
@@ -0,0 +1,39 @@
1
+ const LOGGED_IN_PATTERN = /^Logged in/m;
2
+ async function authCheck(runtime) {
3
+ try {
4
+ const result = await runtime.runCommand("devin", [
5
+ "auth",
6
+ "status"
7
+ ]);
8
+ const authenticated = LOGGED_IN_PATTERN.test(result.stdout);
9
+ return {
10
+ state: authenticated ? "authenticated" : "unauthenticated",
11
+ source: "devin auth status",
12
+ provider: null,
13
+ availableProviders: authenticated ? [
14
+ "devin"
15
+ ] : [],
16
+ status: authenticated ? "pass" : "fail",
17
+ errors: authenticated ? [] : [
18
+ "Devin is not logged in"
19
+ ]
20
+ };
21
+ } catch {
22
+ return {
23
+ state: "unknown",
24
+ source: "devin auth status",
25
+ provider: null,
26
+ availableProviders: [],
27
+ status: "warn",
28
+ errors: [
29
+ "Devin authentication probe failed"
30
+ ]
31
+ };
32
+ }
33
+ }
34
+ export const devinReadiness = {
35
+ configDir: ".config/devin",
36
+ auth: authCheck
37
+ };
38
+
39
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/devin/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nconst LOGGED_IN_PATTERN = /^Logged in/m;\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"devin\", [\"auth\", \"status\"]);\n const authenticated = LOGGED_IN_PATTERN.test(result.stdout);\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"devin auth status\",\n provider: null,\n availableProviders: authenticated ? [\"devin\"] : [],\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"Devin is not logged in\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"devin auth status\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Devin authentication probe failed\"],\n };\n }\n}\n\nexport const devinReadiness: HarnessReadinessProfile = {\n configDir: \".config/devin\",\n auth: authCheck,\n};\n"],"names":["LOGGED_IN_PATTERN","authCheck","runtime","result","runCommand","authenticated","test","stdout","state","source","provider","availableProviders","status","errors","devinReadiness","configDir","auth"],"mappings":"AAMA,MAAMA,oBAAoB;AAE1B,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,SAAS;YAAC;YAAQ;SAAS;QACnE,MAAMC,gBAAgBL,kBAAkBM,IAAI,CAACH,OAAOI,MAAM;QAC1D,OAAO;YACLC,OAAOH,gBAAgB,kBAAkB;YACzCI,QAAQ;YACRC,UAAU;YACVC,oBAAoBN,gBAAgB;gBAAC;aAAQ,GAAG,EAAE;YAClDO,QAAQP,gBAAgB,SAAS;YACjCQ,QAAQR,gBAAgB,EAAE,GAAG;gBAAC;aAAyB;QACzD;IACF,EAAE,OAAM;QACN,OAAO;YACLG,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAoC;QAC/C;IACF;AACF;AAEA,OAAO,MAAMC,iBAA0C;IACrDC,WAAW;IACXC,MAAMf;AACR,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAWhE;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAYtD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAYhE;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAatD"}
@@ -7,6 +7,7 @@ import { GrokCliAdapter } from "./grok/GrokCliAdapter.js";
7
7
  import { KiroAdapter } from "./kiro/KiroAdapter.js";
8
8
  import { OpenCodeAdapter } from "./opencode/OpenCodeAdapter.js";
9
9
  import { PiAdapter } from "./pi/PiAdapter.js";
10
+ import { DevinAdapter } from "./devin/DevinAdapter.js";
10
11
  /**
11
12
  * One instance of every built-in harness adapter, in registration order
12
13
  * (which is also the order agents are listed in). Register a new harness here.
@@ -20,7 +21,8 @@ import { PiAdapter } from "./pi/PiAdapter.js";
20
21
  new KiroAdapter(),
21
22
  new AntigravityCliAdapter(),
22
23
  new OpenCodeAdapter(),
23
- new PiAdapter()
24
+ new PiAdapter(),
25
+ new DevinAdapter()
24
26
  ];
25
27
  }
26
28
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;AAE9C;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO;QACL,IAAIR;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIN;QACJ,IAAIO;QACJ,IAAIC;KACL;AACH"}
1
+ {"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\nimport { DevinAdapter } from \"./devin/DevinAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n new DevinAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","DevinAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,YAAY,QAAQ,0BAA0B;AAEvD;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO;QACL,IAAIT;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIN;QACJ,IAAIO;QACJ,IAAIC;QACJ,IAAIC;KACL;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AAcpB,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":"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"}
@@ -3,6 +3,7 @@ import { codexReadiness } from "../codex/readiness.js";
3
3
  import { copilotReadiness } from "../copilot/readiness.js";
4
4
  import { openCodeReadiness } from "../opencode/readiness.js";
5
5
  import { piReadiness } from "../pi/readiness.js";
6
+ import { devinReadiness } from "../devin/readiness.js";
6
7
  import { builtInSkillsCheck, createReadinessRuntime, directoryCheck, executableCheck, worstReadinessStatus } from "./checks.js";
7
8
  import { READINESS_AGENT_TYPES } from "./types.js";
8
9
  const READINESS_PROFILES = {
@@ -22,7 +23,8 @@ const READINESS_PROFILES = {
22
23
  },
23
24
  opencode: openCodeReadiness,
24
25
  copilot: copilotReadiness,
25
- pi: piReadiness
26
+ pi: piReadiness,
27
+ devin: devinReadiness
26
28
  };
27
29
  export async function getAgentReadinessReport(agent, options = {}) {
28
30
  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 {\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};\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","builtInSkillsCheck","createReadinessRuntime","directoryCheck","executableCheck","worstReadinessStatus","READINESS_AGENT_TYPES","READINESS_PROFILES","claude","codex","gemini_cli","configDir","grok_cli","kiro","antigravity_cli","opencode","copilot","pi","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,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,cAAc,EACdC,eAAe,EACfC,oBAAoB,QACf,cAAc;AACrB,SACEC,qBAAqB,QAMhB,aAAa;AAEpB,MAAMC,qBAA0E;IAC9EC,QAAQZ;IACRa,OAAOZ;IACPa,YAAY;QAAEC,WAAW;IAAU;IACnCC,UAAU;QAAED,WAAW;IAAQ;IAC/BE,MAAM;QAAEF,WAAW;IAAQ;IAC3BG,iBAAiB;QAAEH,WAAW;IAA0B;IACxDI,UAAUhB;IACViB,SAASlB;IACTmB,IAAIjB;AACN;AAEA,OAAO,eAAekB,wBACpBC,KAAyB,EACzBC,UAAiC,CAAC,CAAC;IAEnC,OAAOC,eAAeF,OAAOjB,uBAAuBkB;AACtD;AAEA,eAAeC,eACbF,KAAyB,EACzBG,OAAyB;IAEzB,MAAMC,UAAUhB,kBAAkB,CAACY,MAAM;IACzC,MAAM,CAACK,YAAYC,cAAcC,eAAeC,MAAMC,YAAY,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACrF1B,gBAAgBe,OAAOG;QACvBnB,eAAeoB,QAAQZ,SAAS,EAAEW;QAClCrB,mBAAmBkB,OAAOG;QAC1BC,QAAQI,IAAI,GAAGL;QACfC,QAAQK,WAAW,GAAGN;KACvB;IACD,OAAO;QACLS,MAAMZ;QACNK;QACAC;QACAC;QACAC;QACAC;QACAI,QAAQ3B,qBAAqB;YAC3BmB,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,UAAUpB,uBAAuBkB;IACvC,MAAMc,UAAU,MAAML,QAAQC,GAAG,CAC/BxB,sBAAsB6B,GAAG,CACvB,OAAOhB,QAAU;YAACA;YAAO,MAAME,eAAeF,OAAOG;SAAS;IAGlE,OAAOc,OAAOC,WAAW,CAACH;AAC5B;AAEA,SAAS7B,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 {\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,4 +1,4 @@
1
- export declare const READINESS_AGENT_TYPES: readonly ["claude", "codex", "gemini_cli", "grok_cli", "kiro", "antigravity_cli", "opencode", "copilot", "pi"];
1
+ export declare const READINESS_AGENT_TYPES: readonly ["claude", "codex", "gemini_cli", "grok_cli", "kiro", "antigravity_cli", "opencode", "copilot", "pi", "devin"];
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":"AAEA,eAAO,MAAM,qBAAqB,gHAAc,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AACvD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;AACjF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AACxE,KAAK,mBAAmB,GAAG,eAAe,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3D,MAAM,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AACtE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAErF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,mBAAmB,GAAG,eAAe;IAC7E,MAAM,EAAE,CAAC,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,2BAA4B,SAAQ,cAAc,CAAC,MAAM,CAAC;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,UAAU,EAAE,wBAAwB,CAAC;IACrC,YAAY,EAAE,uBAAuB,CAAC;IACtC,aAAa,EAAE,2BAA2B,CAAC;IAC3C,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC3C;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACrC,IAAI,CAAC,qBAAqB,EAAE,WAAW,GAAG,mBAAmB,GAAG,YAAY,CAAC,CAC9E,GAAG;IACF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC5F,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,gBAAgB,KACtB,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAExC,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,WAAW,CAAC,EAAE,yBAAyB,CAAC;CACzC"}
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,CAUtF,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,CAWtF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAGzF"}
@@ -26,7 +26,8 @@ export const HARNESS_RUNTIME_PROFILES = {
26
26
  ]), [
27
27
  "kiro_cli",
28
28
  "kiro-cli"
29
- ])
29
+ ]),
30
+ devin: profile("devin", matchArgv0("devin"))
30
31
  };
31
32
  export function runtimeAgentMatchesHarness(runtimeAgent, type) {
32
33
  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};\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","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};\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 +1 @@
1
- {"version":3,"file":"TtyWriter.d.ts","sourceRoot":"","sources":["../../src/terminal/TtyWriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,qBAAa,SAAS;WACP,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAWhE,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU7E"}
1
+ {"version":3,"file":"TtyWriter.d.ts","sourceRoot":"","sources":["../../src/terminal/TtyWriter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,qBAAa,SAAS;WACP,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAUhE,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS7E"}
@@ -1,16 +1,17 @@
1
- import { terminalBackendFor } from "./backends/index.js";
1
+ import { TERMINAL_BACKENDS, terminalBackendFor } from "./backends/index.js";
2
+ const SUPPORTED = `Supported: ${TERMINAL_BACKENDS.map((backend)=>backend.label).join(", ")}.`;
2
3
  export class TtyWriter {
3
4
  static async send(location, message) {
4
5
  const backend = terminalBackendFor(location.type);
5
6
  if (!backend) {
6
- throw new Error(`Cannot send input: unsupported terminal type "${location.type}". ` + "Supported: tmux, WezTerm, iTerm2, Terminal.app.");
7
+ throw new Error(`Cannot send input: unsupported terminal type "${location.type}". ${SUPPORTED}`);
7
8
  }
8
9
  await backend.send(location, message);
9
10
  }
10
11
  static async sendKey(location, key) {
11
12
  const backend = terminalBackendFor(location.type);
12
13
  if (!backend) {
13
- throw new Error(`Cannot send key: unsupported terminal type "${location.type}". ` + "Supported: tmux, WezTerm, iTerm2, Terminal.app.");
14
+ throw new Error(`Cannot send key: unsupported terminal type "${location.type}". ${SUPPORTED}`);
14
15
  }
15
16
  await backend.sendKey(location, key);
16
17
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/terminal/TtyWriter.ts"],"sourcesContent":["import { terminalBackendFor } from \"./backends/index.js\";\nimport type { TerminalLocation } from \"./types.js\";\n\nexport class TtyWriter {\n static async send(location: TerminalLocation, message: string): Promise<void> {\n const backend = terminalBackendFor(location.type);\n if (!backend) {\n throw new Error(\n `Cannot send input: unsupported terminal type \"${location.type}\". ` +\n \"Supported: tmux, WezTerm, iTerm2, Terminal.app.\",\n );\n }\n await backend.send(location, message);\n }\n\n static async sendKey(location: TerminalLocation, key: string): Promise<void> {\n const backend = terminalBackendFor(location.type);\n if (!backend) {\n throw new Error(\n `Cannot send key: unsupported terminal type \"${location.type}\". ` +\n \"Supported: tmux, WezTerm, iTerm2, Terminal.app.\",\n );\n }\n await backend.sendKey(location, key);\n }\n}\n"],"names":["terminalBackendFor","TtyWriter","send","location","message","backend","type","Error","sendKey","key"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,sBAAsB;AAGzD,OAAO,MAAMC;IACX,aAAaC,KAAKC,QAA0B,EAAEC,OAAe,EAAiB;QAC5E,MAAMC,UAAUL,mBAAmBG,SAASG,IAAI;QAChD,IAAI,CAACD,SAAS;YACZ,MAAM,IAAIE,MACR,CAAC,8CAA8C,EAAEJ,SAASG,IAAI,CAAC,GAAG,CAAC,GACjE;QAEN;QACA,MAAMD,QAAQH,IAAI,CAACC,UAAUC;IAC/B;IAEA,aAAaI,QAAQL,QAA0B,EAAEM,GAAW,EAAiB;QAC3E,MAAMJ,UAAUL,mBAAmBG,SAASG,IAAI;QAChD,IAAI,CAACD,SAAS;YACZ,MAAM,IAAIE,MACR,CAAC,4CAA4C,EAAEJ,SAASG,IAAI,CAAC,GAAG,CAAC,GAC/D;QAEN;QACA,MAAMD,QAAQG,OAAO,CAACL,UAAUM;IAClC;AACF"}
1
+ {"version":3,"sources":["../../src/terminal/TtyWriter.ts"],"sourcesContent":["import { TERMINAL_BACKENDS, terminalBackendFor } from \"./backends/index.js\";\nimport type { TerminalLocation } from \"./types.js\";\n\nconst SUPPORTED = `Supported: ${TERMINAL_BACKENDS.map((backend) => backend.label).join(\", \")}.`;\n\nexport class TtyWriter {\n static async send(location: TerminalLocation, message: string): Promise<void> {\n const backend = terminalBackendFor(location.type);\n if (!backend) {\n throw new Error(\n `Cannot send input: unsupported terminal type \"${location.type}\". ${SUPPORTED}`,\n );\n }\n await backend.send(location, message);\n }\n\n static async sendKey(location: TerminalLocation, key: string): Promise<void> {\n const backend = terminalBackendFor(location.type);\n if (!backend) {\n throw new Error(\n `Cannot send key: unsupported terminal type \"${location.type}\". ${SUPPORTED}`,\n );\n }\n await backend.sendKey(location, key);\n }\n}\n"],"names":["TERMINAL_BACKENDS","terminalBackendFor","SUPPORTED","map","backend","label","join","TtyWriter","send","location","message","type","Error","sendKey","key"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,kBAAkB,QAAQ,sBAAsB;AAG5E,MAAMC,YAAY,CAAC,WAAW,EAAEF,kBAAkBG,GAAG,CAAC,CAACC,UAAYA,QAAQC,KAAK,EAAEC,IAAI,CAAC,MAAM,CAAC,CAAC;AAE/F,OAAO,MAAMC;IACX,aAAaC,KAAKC,QAA0B,EAAEC,OAAe,EAAiB;QAC5E,MAAMN,UAAUH,mBAAmBQ,SAASE,IAAI;QAChD,IAAI,CAACP,SAAS;YACZ,MAAM,IAAIQ,MACR,CAAC,8CAA8C,EAAEH,SAASE,IAAI,CAAC,GAAG,EAAET,WAAW;QAEnF;QACA,MAAME,QAAQI,IAAI,CAACC,UAAUC;IAC/B;IAEA,aAAaG,QAAQJ,QAA0B,EAAEK,GAAW,EAAiB;QAC3E,MAAMV,UAAUH,mBAAmBQ,SAASE,IAAI;QAChD,IAAI,CAACP,SAAS;YACZ,MAAM,IAAIQ,MACR,CAAC,4CAA4C,EAAEH,SAASE,IAAI,CAAC,GAAG,EAAET,WAAW;QAEjF;QACA,MAAME,QAAQS,OAAO,CAACJ,UAAUK;IAClC;AACF"}
@@ -0,0 +1,3 @@
1
+ import { type TerminalBackend } from "../types.js";
2
+ export declare const ghosttyBackend: TerminalBackend;
3
+ //# sourceMappingURL=ghostty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghostty.d.ts","sourceRoot":"","sources":["../../../src/terminal/backends/ghostty.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgB,KAAK,eAAe,EAAyB,MAAM,aAAa,CAAC;AA2IxF,eAAO,MAAM,cAAc,EAAE,eAmC5B,CAAC"}