@ken-jo/agent-connector 0.3.1 → 0.4.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 (163) hide show
  1. package/README.md +178 -14
  2. package/dist/action-PLZW5BGX.js +54 -0
  3. package/dist/action-PLZW5BGX.js.map +1 -0
  4. package/dist/{amp-YGV66GJT.js → amp-B524U6LO.js} +81 -5
  5. package/dist/amp-B524U6LO.js.map +1 -0
  6. package/dist/{antigravity-7IBYFO6P.js → antigravity-ANDKF3K7.js} +4 -4
  7. package/dist/{antigravity-cli-JEOUP2VN.js → antigravity-cli-LLRPDDOT.js} +4 -4
  8. package/dist/chunk-22Y24V7O.js +21 -0
  9. package/dist/chunk-22Y24V7O.js.map +1 -0
  10. package/dist/chunk-3PFFTFCU.js +190 -0
  11. package/dist/chunk-3PFFTFCU.js.map +1 -0
  12. package/dist/{chunk-SCVBYSF7.js → chunk-6XHB6BE3.js} +1 -1
  13. package/dist/chunk-76FUSVIA.js +43 -0
  14. package/dist/chunk-76FUSVIA.js.map +1 -0
  15. package/dist/{chunk-GSGDG2BV.js → chunk-ADTHT2FN.js} +109 -16
  16. package/dist/chunk-ADTHT2FN.js.map +1 -0
  17. package/dist/{chunk-ZAM4M7LI.js → chunk-BHUCB6LY.js} +135 -296
  18. package/dist/chunk-BHUCB6LY.js.map +1 -0
  19. package/dist/{chunk-MEH7GC7R.js → chunk-BXGFUENQ.js} +20 -3
  20. package/dist/chunk-BXGFUENQ.js.map +1 -0
  21. package/dist/chunk-CIRDOY2V.js +351 -0
  22. package/dist/chunk-CIRDOY2V.js.map +1 -0
  23. package/dist/{chunk-KMAKDD3Z.js → chunk-G3ER4SY5.js} +37 -12
  24. package/dist/chunk-G3ER4SY5.js.map +1 -0
  25. package/dist/{chunk-PD4VFEBY.js → chunk-IW77FFNX.js} +39 -1
  26. package/dist/chunk-IW77FFNX.js.map +1 -0
  27. package/dist/chunk-J3D5W5T2.js +83 -0
  28. package/dist/chunk-J3D5W5T2.js.map +1 -0
  29. package/dist/{openclaw-UZ5BMCGQ.js → chunk-KGGBNKI4.js} +125 -33
  30. package/dist/chunk-KGGBNKI4.js.map +1 -0
  31. package/dist/{chunk-3JCRUROU.js → chunk-KGJWE6A2.js} +13 -4
  32. package/dist/chunk-KGJWE6A2.js.map +1 -0
  33. package/dist/{chunk-3RBLIHPZ.js → chunk-KGXDYGNJ.js} +26 -16
  34. package/dist/chunk-KGXDYGNJ.js.map +1 -0
  35. package/dist/{chunk-KVAAFYRR.js → chunk-KHO5WNTP.js} +2 -18
  36. package/dist/chunk-KHO5WNTP.js.map +1 -0
  37. package/dist/{chunk-KQSNDFBN.js → chunk-LL4OBGRU.js} +3 -3
  38. package/dist/{chunk-WNREHWKL.js → chunk-MAH6QQTO.js} +3 -3
  39. package/dist/{claude-code-4275HQU4.js → claude-code-MLWS7CW6.js} +180 -28
  40. package/dist/claude-code-MLWS7CW6.js.map +1 -0
  41. package/dist/cli/sdk.js +4 -3
  42. package/dist/cli/sdk.js.map +1 -1
  43. package/dist/cli.js +1 -1
  44. package/dist/{codebuff-LE3KBZGM.js → codebuff-SH2S3QAN.js} +102 -5
  45. package/dist/codebuff-SH2S3QAN.js.map +1 -0
  46. package/dist/{codex-4BY2ZJIW.js → codex-BXA4FIF4.js} +3 -3
  47. package/dist/{copilot-cli-IPISKO3V.js → copilot-cli-ROIBTTDT.js} +3 -3
  48. package/dist/{crush-X3E25EQG.js → crush-QLEFLHUC.js} +3 -3
  49. package/dist/{cursor-UH3W622V.js → cursor-ASJPWZ4R.js} +6 -3
  50. package/dist/cursor-ASJPWZ4R.js.map +1 -0
  51. package/dist/{detect-U3E7NVNW.js → detect-ZIIS55LD.js} +4 -3
  52. package/dist/{detect-U3E7NVNW.js.map → detect-ZIIS55LD.js.map} +1 -1
  53. package/dist/{doctor-DZTWED4O.js → doctor-TJUGSQ5C.js} +16 -12
  54. package/dist/doctor-TJUGSQ5C.js.map +1 -0
  55. package/dist/{droid-T5VBRXZF.js → droid-NCSS3B5Y.js} +170 -4
  56. package/dist/droid-NCSS3B5Y.js.map +1 -0
  57. package/dist/{gemini-cli-ZSUK55UA.js → gemini-cli-SLVWLXJW.js} +3 -3
  58. package/dist/{goose-M3RR3CZG.js → goose-PBA7KTE5.js} +100 -5
  59. package/dist/goose-PBA7KTE5.js.map +1 -0
  60. package/dist/{hermes-CUNKIAR5.js → hermes-ONDCECP2.js} +3 -3
  61. package/dist/{hook-EVY7LOUQ.js → hook-OU522ABV.js} +12 -9
  62. package/dist/{hook-EVY7LOUQ.js.map → hook-OU522ABV.js.map} +1 -1
  63. package/dist/index.d.ts +71 -3
  64. package/dist/index.js +22 -3
  65. package/dist/{install-OWAS5UIE.js → install-UDCBL7HP.js} +11 -9
  66. package/dist/{install-OWAS5UIE.js.map → install-UDCBL7HP.js.map} +1 -1
  67. package/dist/introspect-DuZSPSHB.d.ts +53 -0
  68. package/dist/{jetbrains-copilot-C3HDGGML.js → jetbrains-copilot-YABZ3HFA.js} +3 -3
  69. package/dist/{kilo-PKAJCWPX.js → kilo-F3ZDZKCT.js} +3 -3
  70. package/dist/{kilo-cli-QWUVXG2O.js → kilo-cli-3HWPWBY4.js} +3 -3
  71. package/dist/{kimi-EVD7YKXS.js → kimi-NV72FVAO.js} +3 -3
  72. package/dist/{kiro-UQRY6EIO.js → kiro-C5W6AGDR.js} +3 -3
  73. package/dist/{leaderboard-CSWHI4UY.js → leaderboard-TIBVONVT.js} +3 -3
  74. package/dist/mimo-code-IMM5YM3M.js +754 -0
  75. package/dist/mimo-code-IMM5YM3M.js.map +1 -0
  76. package/dist/{mux-5CI5FP2W.js → mux-DSSH4AFS.js} +3 -3
  77. package/dist/nemoclaw-3EVNKD3I.js +58 -0
  78. package/dist/nemoclaw-3EVNKD3I.js.map +1 -0
  79. package/dist/{omp-AXA7XY22.js → omp-Z6FRNDPN.js} +3 -3
  80. package/dist/openclaw-7G437NT7.js +18 -0
  81. package/dist/openclaw-7G437NT7.js.map +1 -0
  82. package/dist/{opencode-NZBRLJN3.js → opencode-Q6KBSAKW.js} +3 -3
  83. package/dist/{package-WFOS4QVU.js → package-RMPN57YZ.js} +7 -6
  84. package/dist/{package-WFOS4QVU.js.map → package-RMPN57YZ.js.map} +1 -1
  85. package/dist/{pi-WMTUX6ES.js → pi-LZT6WWAZ.js} +2 -2
  86. package/dist/{qwen-code-MRRIUQ3P.js → qwen-code-WQBKRPWJ.js} +3 -3
  87. package/dist/{roo-code-NI5UU6JB.js → roo-code-GWSNU3OW.js} +137 -4
  88. package/dist/roo-code-GWSNU3OW.js.map +1 -0
  89. package/dist/runtime/index.d.ts +96 -2
  90. package/dist/runtime/index.js +18 -10
  91. package/dist/sdk/index.d.ts +52 -0
  92. package/dist/sdk/index.js +81 -0
  93. package/dist/sdk/index.js.map +1 -0
  94. package/dist/sdk/test.d.ts +74 -0
  95. package/dist/sdk/test.js +291 -0
  96. package/dist/sdk/test.js.map +1 -0
  97. package/dist/{serve-3C2VFPAY.js → serve-D3GO36UT.js} +12 -9
  98. package/dist/{serve-3C2VFPAY.js.map → serve-D3GO36UT.js.map} +1 -1
  99. package/dist/{status-MKQYX5MW.js → status-KOSKCETC.js} +9 -7
  100. package/dist/{status-MKQYX5MW.js.map → status-KOSKCETC.js.map} +1 -1
  101. package/dist/statusline-ZNTCL5YC.js +59 -0
  102. package/dist/statusline-ZNTCL5YC.js.map +1 -0
  103. package/dist/{telemetry-3DN6XGYB.js → telemetry-XIKUUGTQ.js} +5 -4
  104. package/dist/{telemetry-3DN6XGYB.js.map → telemetry-XIKUUGTQ.js.map} +1 -1
  105. package/dist/{trae-CQC72RHH.js → trae-NWT3TMSZ.js} +99 -5
  106. package/dist/trae-NWT3TMSZ.js.map +1 -0
  107. package/dist/{types-CNigfEuR.d.ts → types-BEKsAium.d.ts} +268 -6
  108. package/dist/{uninstall-WG6PFWF3.js → uninstall-2LBLQVFA.js} +11 -9
  109. package/dist/{uninstall-WG6PFWF3.js.map → uninstall-2LBLQVFA.js.map} +1 -1
  110. package/dist/{upgrade-32NC2RKI.js → upgrade-ZC2S7VRN.js} +11 -9
  111. package/dist/{upgrade-32NC2RKI.js.map → upgrade-ZC2S7VRN.js.map} +1 -1
  112. package/dist/{usage-CJOM2WQM.js → usage-E2A4O2CY.js} +3 -3
  113. package/dist/{usage-event-472X3DOY.js → usage-event-JKMC4QC4.js} +11 -8
  114. package/dist/{usage-event-472X3DOY.js.map → usage-event-JKMC4QC4.js.map} +1 -1
  115. package/dist/{vscode-copilot-4RVRTCKV.js → vscode-copilot-ALV45XF6.js} +3 -3
  116. package/dist/{warp-X6MB67NT.js → warp-H6IX4U3J.js} +3 -3
  117. package/dist/{zed-NTCYW4V2.js → zed-RH34TNSW.js} +3 -3
  118. package/package.json +9 -1
  119. package/dist/amp-YGV66GJT.js.map +0 -1
  120. package/dist/chunk-3JCRUROU.js.map +0 -1
  121. package/dist/chunk-3RBLIHPZ.js.map +0 -1
  122. package/dist/chunk-GSGDG2BV.js.map +0 -1
  123. package/dist/chunk-KMAKDD3Z.js.map +0 -1
  124. package/dist/chunk-KVAAFYRR.js.map +0 -1
  125. package/dist/chunk-MEH7GC7R.js.map +0 -1
  126. package/dist/chunk-NJU275US.js +0 -238
  127. package/dist/chunk-NJU275US.js.map +0 -1
  128. package/dist/chunk-PD4VFEBY.js.map +0 -1
  129. package/dist/chunk-ZAM4M7LI.js.map +0 -1
  130. package/dist/claude-code-4275HQU4.js.map +0 -1
  131. package/dist/codebuff-LE3KBZGM.js.map +0 -1
  132. package/dist/cursor-UH3W622V.js.map +0 -1
  133. package/dist/doctor-DZTWED4O.js.map +0 -1
  134. package/dist/droid-T5VBRXZF.js.map +0 -1
  135. package/dist/goose-M3RR3CZG.js.map +0 -1
  136. package/dist/openclaw-UZ5BMCGQ.js.map +0 -1
  137. package/dist/roo-code-NI5UU6JB.js.map +0 -1
  138. package/dist/trae-CQC72RHH.js.map +0 -1
  139. /package/dist/{antigravity-7IBYFO6P.js.map → antigravity-ANDKF3K7.js.map} +0 -0
  140. /package/dist/{antigravity-cli-JEOUP2VN.js.map → antigravity-cli-LLRPDDOT.js.map} +0 -0
  141. /package/dist/{chunk-SCVBYSF7.js.map → chunk-6XHB6BE3.js.map} +0 -0
  142. /package/dist/{chunk-KQSNDFBN.js.map → chunk-LL4OBGRU.js.map} +0 -0
  143. /package/dist/{chunk-WNREHWKL.js.map → chunk-MAH6QQTO.js.map} +0 -0
  144. /package/dist/{codex-4BY2ZJIW.js.map → codex-BXA4FIF4.js.map} +0 -0
  145. /package/dist/{copilot-cli-IPISKO3V.js.map → copilot-cli-ROIBTTDT.js.map} +0 -0
  146. /package/dist/{crush-X3E25EQG.js.map → crush-QLEFLHUC.js.map} +0 -0
  147. /package/dist/{gemini-cli-ZSUK55UA.js.map → gemini-cli-SLVWLXJW.js.map} +0 -0
  148. /package/dist/{hermes-CUNKIAR5.js.map → hermes-ONDCECP2.js.map} +0 -0
  149. /package/dist/{jetbrains-copilot-C3HDGGML.js.map → jetbrains-copilot-YABZ3HFA.js.map} +0 -0
  150. /package/dist/{kilo-PKAJCWPX.js.map → kilo-F3ZDZKCT.js.map} +0 -0
  151. /package/dist/{kilo-cli-QWUVXG2O.js.map → kilo-cli-3HWPWBY4.js.map} +0 -0
  152. /package/dist/{kimi-EVD7YKXS.js.map → kimi-NV72FVAO.js.map} +0 -0
  153. /package/dist/{kiro-UQRY6EIO.js.map → kiro-C5W6AGDR.js.map} +0 -0
  154. /package/dist/{leaderboard-CSWHI4UY.js.map → leaderboard-TIBVONVT.js.map} +0 -0
  155. /package/dist/{mux-5CI5FP2W.js.map → mux-DSSH4AFS.js.map} +0 -0
  156. /package/dist/{omp-AXA7XY22.js.map → omp-Z6FRNDPN.js.map} +0 -0
  157. /package/dist/{opencode-NZBRLJN3.js.map → opencode-Q6KBSAKW.js.map} +0 -0
  158. /package/dist/{pi-WMTUX6ES.js.map → pi-LZT6WWAZ.js.map} +0 -0
  159. /package/dist/{qwen-code-MRRIUQ3P.js.map → qwen-code-WQBKRPWJ.js.map} +0 -0
  160. /package/dist/{usage-CJOM2WQM.js.map → usage-E2A4O2CY.js.map} +0 -0
  161. /package/dist/{vscode-copilot-4RVRTCKV.js.map → vscode-copilot-ALV45XF6.js.map} +0 -0
  162. /package/dist/{warp-X6MB67NT.js.map → warp-H6IX4U3J.js.map} +0 -0
  163. /package/dist/{zed-NTCYW4V2.js.map → zed-RH34TNSW.js.map} +0 -0
@@ -0,0 +1,190 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/adapters/registry.ts
4
+ var ADAPTER_REGISTRY = [
5
+ {
6
+ id: "claude-code",
7
+ load: () => import("./claude-code-MLWS7CW6.js").then((m) => m.default)
8
+ },
9
+ {
10
+ id: "codex",
11
+ load: () => import("./codex-BXA4FIF4.js").then((m) => m.default)
12
+ },
13
+ {
14
+ id: "cursor",
15
+ load: () => import("./cursor-ASJPWZ4R.js").then((m) => m.default)
16
+ },
17
+ // vscode-copilot after cursor: cursor is a VS Code fork, so the fork's runtime
18
+ // markers must be checked first during host detection.
19
+ {
20
+ id: "vscode-copilot",
21
+ load: () => import("./vscode-copilot-ALV45XF6.js").then((m) => m.default)
22
+ },
23
+ {
24
+ id: "copilot-cli",
25
+ load: () => import("./copilot-cli-ROIBTTDT.js").then((m) => m.default)
26
+ },
27
+ {
28
+ id: "gemini-cli",
29
+ load: () => import("./gemini-cli-SLVWLXJW.js").then((m) => m.default)
30
+ },
31
+ {
32
+ id: "warp",
33
+ load: () => import("./warp-H6IX4U3J.js").then((m) => m.default)
34
+ },
35
+ // ts-plugin paradigm: OpenCode loads a generated plugin module that bridges
36
+ // its in-process events to the universal hook entrypoint.
37
+ {
38
+ id: "opencode",
39
+ load: () => import("./opencode-Q6KBSAKW.js").then((m) => m.default)
40
+ },
41
+ // mimo-code is Xiaomi's MiMoCode (@mimo-ai/cli, bin `mimo`) — an OpenCode FORK
42
+ // (ts-plugin, MCP root key "mcp", ~/.config/mimocode/mimocode.json). Grouped
43
+ // beside the OpenCode family whose config dialect + plugin contract it shares;
44
+ // detected via the DISTINCT ~/.config/mimocode dir, so there is no fork-ordering
45
+ // constraint vs opencode (no shared config file to disambiguate).
46
+ {
47
+ id: "mimo-code",
48
+ load: () => import("./mimo-code-IMM5YM3M.js").then((m) => m.default)
49
+ },
50
+ // kilo-cli is the SQLite-backed OpenCode FORK command-line product (ts-plugin,
51
+ // loads @kilocode/plugin modules registered in kilo.jsonc's "plugin" array;
52
+ // MCP root key "mcp", ~/.config/kilo/kilo.jsonc). Grouped beside the OpenCode
53
+ // family whose plugin contract + config dialect it shares; distinct host from
54
+ // the "kilo" extension so there is no fork-ordering constraint between them.
55
+ {
56
+ id: "kilo-cli",
57
+ load: () => import("./kilo-cli-3HWPWBY4.js").then((m) => m.default)
58
+ },
59
+ // Wave 1 — mcp-only adapters (no lifecycle hooks; MCP registration only).
60
+ {
61
+ id: "droid",
62
+ load: () => import("./droid-NCSS3B5Y.js").then((m) => m.default)
63
+ },
64
+ {
65
+ id: "roo-code",
66
+ load: () => import("./roo-code-GWSNU3OW.js").then((m) => m.default)
67
+ },
68
+ // kilo is the Kilo Code VS Code extension (kilocode.kilo-code) — a Roo/Cline
69
+ // fork, so it sits beside roo-code (mcp-only, root key "mcpServers", VS Code
70
+ // globalStorage / .kilocode project scope). Distinct host from "kilo-cli".
71
+ {
72
+ id: "kilo",
73
+ load: () => import("./kilo-F3ZDZKCT.js").then((m) => m.default)
74
+ },
75
+ {
76
+ id: "trae",
77
+ load: () => import("./trae-NWT3TMSZ.js").then((m) => m.default)
78
+ },
79
+ // antigravity-cli BEFORE antigravity: the `agy` CLI is a fork of the IDE
80
+ // adapter with its own runtime markers (the universal hook command tags the
81
+ // host as "antigravity-cli"), so the more-specific CLI marker must be checked
82
+ // before the IDE/parent during host detection.
83
+ {
84
+ id: "antigravity-cli",
85
+ load: () => import("./antigravity-cli-LLRPDDOT.js").then((m) => m.default)
86
+ },
87
+ {
88
+ id: "antigravity",
89
+ load: () => import("./antigravity-ANDKF3K7.js").then((m) => m.default)
90
+ },
91
+ {
92
+ id: "zed",
93
+ load: () => import("./zed-RH34TNSW.js").then((m) => m.default)
94
+ },
95
+ {
96
+ id: "amp",
97
+ load: () => import("./amp-B524U6LO.js").then((m) => m.default)
98
+ },
99
+ {
100
+ id: "codebuff",
101
+ load: () => import("./codebuff-SH2S3QAN.js").then((m) => m.default)
102
+ },
103
+ {
104
+ id: "mux",
105
+ load: () => import("./mux-DSSH4AFS.js").then((m) => m.default)
106
+ },
107
+ // Pi — mcp-only host with no writable MCP config; drives the Agent Skills
108
+ // surface only (writes <piDir>/skills/<name>/SKILL.md).
109
+ {
110
+ id: "pi",
111
+ load: () => import("./pi-LZT6WWAZ.js").then((m) => m.default)
112
+ },
113
+ // Wave 2 — json-stdio adapters (full hook dispatch via the universal entrypoint).
114
+ // jetbrains-copilot before vscode-copilot is unnecessary (distinct hosts); grouped here.
115
+ {
116
+ id: "jetbrains-copilot",
117
+ load: () => import("./jetbrains-copilot-YABZ3HFA.js").then((m) => m.default)
118
+ },
119
+ {
120
+ id: "qwen-code",
121
+ load: () => import("./qwen-code-WQBKRPWJ.js").then((m) => m.default)
122
+ },
123
+ {
124
+ id: "kiro",
125
+ load: () => import("./kiro-C5W6AGDR.js").then((m) => m.default)
126
+ },
127
+ {
128
+ id: "kimi",
129
+ load: () => import("./kimi-NV72FVAO.js").then((m) => m.default)
130
+ },
131
+ {
132
+ id: "crush",
133
+ load: () => import("./crush-QLEFLHUC.js").then((m) => m.default)
134
+ },
135
+ // Wave 3 — json-stdio adapters with YAML config (MCP in YAML; hooks per host).
136
+ {
137
+ id: "goose",
138
+ load: () => import("./goose-PBA7KTE5.js").then((m) => m.default)
139
+ },
140
+ {
141
+ id: "hermes",
142
+ load: () => import("./hermes-ONDCECP2.js").then((m) => m.default)
143
+ },
144
+ // Wave 4 — ts-plugin adapters (generate a bridge module to the universal entrypoint).
145
+ {
146
+ id: "omp",
147
+ load: () => import("./omp-Z6FRNDPN.js").then((m) => m.default)
148
+ },
149
+ // nemoclaw BEFORE openclaw (fork-before-parent convention). NVIDIA NemoClaw
150
+ // wraps OpenClaw and DRIVES the SAME ~/.openclaw/openclaw.json, so a NemoClaw
151
+ // box carries BOTH the ~/.nemoclaw/ and ~/.openclaw/ markers. Exclusivity is
152
+ // enforced at the SOURCE: OpenClawAdapter.detectInstalled BOWS OUT when
153
+ // ~/.nemoclaw/ is present, so the shared config is never double-targeted as two
154
+ // platforms. This ordering is the deterministic tie-break (matching the
155
+ // antigravity-cli/antigravity precedent). nemoclaw extends OpenClawAdapter
156
+ // (id/name/detection overridden), so inherited server/hook registration still
157
+ // lands in the wrapped openclaw.json.
158
+ {
159
+ id: "nemoclaw",
160
+ load: () => import("./nemoclaw-3EVNKD3I.js").then((m) => m.default)
161
+ },
162
+ {
163
+ id: "openclaw",
164
+ load: () => import("./openclaw-7G437NT7.js").then((m) => m.default)
165
+ }
166
+ ];
167
+ var REGISTRY_BY_ID = new Map(
168
+ ADAPTER_REGISTRY.map((factory) => [factory.id, factory])
169
+ );
170
+ var REGISTERED_PLATFORM_IDS = new Set(
171
+ ADAPTER_REGISTRY.map((factory) => factory.id)
172
+ );
173
+ function getFactory(id) {
174
+ return REGISTRY_BY_ID.get(id);
175
+ }
176
+ async function loadAdapter(id) {
177
+ const factory = getFactory(id);
178
+ return factory ? factory.load() : void 0;
179
+ }
180
+ async function allAdapters() {
181
+ return Promise.all(ADAPTER_REGISTRY.map((factory) => factory.load()));
182
+ }
183
+
184
+ export {
185
+ ADAPTER_REGISTRY,
186
+ REGISTERED_PLATFORM_IDS,
187
+ loadAdapter,
188
+ allAdapters
189
+ };
190
+ //# sourceMappingURL=chunk-3PFFTFCU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/registry.ts"],"sourcesContent":["/**\n * adapters/registry — single source of truth for the platforms agent-connector\n * targets. Generalized from context-mode's `ADAPTER_REGISTRY` pattern, adapted\n * to our `Adapter` / `AdapterFactory` contract (adapters/spi.ts).\n *\n * In context-mode the same platform set was redeclared in four places (env-var\n * detection, session-dir lookup, the lazy adapter loader, and per-adapter base\n * constructors); adding a platform meant editing all of them and missing one\n * was silent. Here the list lives ONCE below: each platform is one entry with a\n * lazy `load()` thunk that resolves the adapter singleton. Adding a platform is\n * a single new entry — `getFactory` / `loadAdapter` / `allAdapters` and the\n * detection cascade in detect.ts all derive from this list.\n *\n * `load()` returns the module's default export, which every adapter file is\n * required to provide as its singleton (`export default adapter;`). It is a\n * function (not an eager import) so module loading stays lazy: an adapter is\n * only imported when it is actually needed, keeping startup cheap.\n *\n * Order is load-bearing for runtime host detection (detect.ts iterates env\n * markers in registry order): forks MUST precede their parent so a session\n * running inside a derived shell is not misclassified as the parent. For the\n * three Phase-1 adapters this is moot, but the ordering convention is fixed now\n * so later additions (cursor is a VS Code fork, etc.) slot in correctly.\n */\n\nimport type { PlatformId } from \"../core/types.js\";\nimport type { Adapter, AdapterFactory } from \"./spi.js\";\n\n/**\n * Authoritative list of installable platforms. One entry per platform; the\n * `load` thunk lazily imports the adapter module and returns its default-export\n * singleton. To add a platform: drop its `src/adapters/<id>/index.ts` in place\n * (default-exporting an `Adapter`) and add one entry here.\n */\nexport const ADAPTER_REGISTRY: readonly AdapterFactory[] = [\n {\n id: \"claude-code\",\n load: () => import(\"./claude-code/index.js\").then((m) => m.default),\n },\n {\n id: \"codex\",\n load: () => import(\"./codex/index.js\").then((m) => m.default),\n },\n {\n id: \"cursor\",\n load: () => import(\"./cursor/index.js\").then((m) => m.default),\n },\n // vscode-copilot after cursor: cursor is a VS Code fork, so the fork's runtime\n // markers must be checked first during host detection.\n {\n id: \"vscode-copilot\",\n load: () => import(\"./vscode-copilot/index.js\").then((m) => m.default),\n },\n {\n id: \"copilot-cli\",\n load: () => import(\"./copilot-cli/index.js\").then((m) => m.default),\n },\n {\n id: \"gemini-cli\",\n load: () => import(\"./gemini-cli/index.js\").then((m) => m.default),\n },\n {\n id: \"warp\",\n load: () => import(\"./warp/index.js\").then((m) => m.default),\n },\n // ts-plugin paradigm: OpenCode loads a generated plugin module that bridges\n // its in-process events to the universal hook entrypoint.\n {\n id: \"opencode\",\n load: () => import(\"./opencode/index.js\").then((m) => m.default),\n },\n // mimo-code is Xiaomi's MiMoCode (@mimo-ai/cli, bin `mimo`) — an OpenCode FORK\n // (ts-plugin, MCP root key \"mcp\", ~/.config/mimocode/mimocode.json). Grouped\n // beside the OpenCode family whose config dialect + plugin contract it shares;\n // detected via the DISTINCT ~/.config/mimocode dir, so there is no fork-ordering\n // constraint vs opencode (no shared config file to disambiguate).\n {\n id: \"mimo-code\",\n load: () => import(\"./mimo-code/index.js\").then((m) => m.default),\n },\n // kilo-cli is the SQLite-backed OpenCode FORK command-line product (ts-plugin,\n // loads @kilocode/plugin modules registered in kilo.jsonc's \"plugin\" array;\n // MCP root key \"mcp\", ~/.config/kilo/kilo.jsonc). Grouped beside the OpenCode\n // family whose plugin contract + config dialect it shares; distinct host from\n // the \"kilo\" extension so there is no fork-ordering constraint between them.\n {\n id: \"kilo-cli\",\n load: () => import(\"./kilo-cli/index.js\").then((m) => m.default),\n },\n // Wave 1 — mcp-only adapters (no lifecycle hooks; MCP registration only).\n {\n id: \"droid\",\n load: () => import(\"./droid/index.js\").then((m) => m.default),\n },\n {\n id: \"roo-code\",\n load: () => import(\"./roo-code/index.js\").then((m) => m.default),\n },\n // kilo is the Kilo Code VS Code extension (kilocode.kilo-code) — a Roo/Cline\n // fork, so it sits beside roo-code (mcp-only, root key \"mcpServers\", VS Code\n // globalStorage / .kilocode project scope). Distinct host from \"kilo-cli\".\n {\n id: \"kilo\",\n load: () => import(\"./kilo/index.js\").then((m) => m.default),\n },\n {\n id: \"trae\",\n load: () => import(\"./trae/index.js\").then((m) => m.default),\n },\n // antigravity-cli BEFORE antigravity: the `agy` CLI is a fork of the IDE\n // adapter with its own runtime markers (the universal hook command tags the\n // host as \"antigravity-cli\"), so the more-specific CLI marker must be checked\n // before the IDE/parent during host detection.\n {\n id: \"antigravity-cli\",\n load: () => import(\"./antigravity-cli/index.js\").then((m) => m.default),\n },\n {\n id: \"antigravity\",\n load: () => import(\"./antigravity/index.js\").then((m) => m.default),\n },\n {\n id: \"zed\",\n load: () => import(\"./zed/index.js\").then((m) => m.default),\n },\n {\n id: \"amp\",\n load: () => import(\"./amp/index.js\").then((m) => m.default),\n },\n {\n id: \"codebuff\",\n load: () => import(\"./codebuff/index.js\").then((m) => m.default),\n },\n {\n id: \"mux\",\n load: () => import(\"./mux/index.js\").then((m) => m.default),\n },\n // Pi — mcp-only host with no writable MCP config; drives the Agent Skills\n // surface only (writes <piDir>/skills/<name>/SKILL.md).\n {\n id: \"pi\",\n load: () => import(\"./pi/index.js\").then((m) => m.default),\n },\n // Wave 2 — json-stdio adapters (full hook dispatch via the universal entrypoint).\n // jetbrains-copilot before vscode-copilot is unnecessary (distinct hosts); grouped here.\n {\n id: \"jetbrains-copilot\",\n load: () => import(\"./jetbrains-copilot/index.js\").then((m) => m.default),\n },\n {\n id: \"qwen-code\",\n load: () => import(\"./qwen-code/index.js\").then((m) => m.default),\n },\n {\n id: \"kiro\",\n load: () => import(\"./kiro/index.js\").then((m) => m.default),\n },\n {\n id: \"kimi\",\n load: () => import(\"./kimi/index.js\").then((m) => m.default),\n },\n {\n id: \"crush\",\n load: () => import(\"./crush/index.js\").then((m) => m.default),\n },\n // Wave 3 — json-stdio adapters with YAML config (MCP in YAML; hooks per host).\n {\n id: \"goose\",\n load: () => import(\"./goose/index.js\").then((m) => m.default),\n },\n {\n id: \"hermes\",\n load: () => import(\"./hermes/index.js\").then((m) => m.default),\n },\n // Wave 4 — ts-plugin adapters (generate a bridge module to the universal entrypoint).\n {\n id: \"omp\",\n load: () => import(\"./omp/index.js\").then((m) => m.default),\n },\n // nemoclaw BEFORE openclaw (fork-before-parent convention). NVIDIA NemoClaw\n // wraps OpenClaw and DRIVES the SAME ~/.openclaw/openclaw.json, so a NemoClaw\n // box carries BOTH the ~/.nemoclaw/ and ~/.openclaw/ markers. Exclusivity is\n // enforced at the SOURCE: OpenClawAdapter.detectInstalled BOWS OUT when\n // ~/.nemoclaw/ is present, so the shared config is never double-targeted as two\n // platforms. This ordering is the deterministic tie-break (matching the\n // antigravity-cli/antigravity precedent). nemoclaw extends OpenClawAdapter\n // (id/name/detection overridden), so inherited server/hook registration still\n // lands in the wrapped openclaw.json.\n {\n id: \"nemoclaw\",\n load: () => import(\"./nemoclaw/index.js\").then((m) => m.default),\n },\n {\n id: \"openclaw\",\n load: () => import(\"./openclaw/index.js\").then((m) => m.default),\n },\n];\n\n/** O(1) lookup index, built once at module-load time. */\nconst REGISTRY_BY_ID: ReadonlyMap<PlatformId, AdapterFactory> = new Map(\n ADAPTER_REGISTRY.map((factory) => [factory.id, factory] as const),\n);\n\n/** Every platform id present in the registry (useful for matrix tests). */\nexport const REGISTERED_PLATFORM_IDS: ReadonlySet<PlatformId> = new Set(\n ADAPTER_REGISTRY.map((factory) => factory.id),\n);\n\n/**\n * Look up the lazy factory for a platform id. Returns `undefined` for ids that\n * are not registered (including `\"unknown\"` and typos) so callers can fall back\n * deliberately rather than crash.\n */\nexport function getFactory(id: PlatformId | string): AdapterFactory | undefined {\n return REGISTRY_BY_ID.get(id as PlatformId);\n}\n\n/**\n * Resolve a platform id to its adapter singleton. Returns `undefined` when the\n * id is not registered — callers decide whether to skip or fall back.\n */\nexport async function loadAdapter(id: PlatformId | string): Promise<Adapter | undefined> {\n const factory = getFactory(id);\n return factory ? factory.load() : undefined;\n}\n\n/**\n * Load every registered adapter. Imports run in parallel; the result preserves\n * registry order so downstream detection/install logic sees forks before\n * parents.\n */\nexport async function allAdapters(): Promise<Adapter[]> {\n return Promise.all(ADAPTER_REGISTRY.map((factory) => factory.load()));\n}\n"],"mappings":"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","names":[]}
@@ -354,4 +354,4 @@ export {
354
354
  hostLeaderboard,
355
355
  formatHostLeaderboard
356
356
  };
357
- //# sourceMappingURL=chunk-SCVBYSF7.js.map
357
+ //# sourceMappingURL=chunk-6XHB6BE3.js.map
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ allAdapters,
4
+ loadAdapter
5
+ } from "./chunk-3PFFTFCU.js";
6
+
7
+ // src/sdk/introspect.ts
8
+ var SURFACE_PREDICATES = {
9
+ server: (c) => c.transports.length > 0,
10
+ hooks: (c) => c.sessionStart || c.preToolUse || c.postToolUse || c.userPromptSubmit || c.stop || c.sessionEnd || c.preCompact || c.notification || (c.permissionRequest ?? false) || (c.postToolUseFailure ?? false) || (c.subagentStart ?? false) || (c.subagentStop ?? false),
11
+ commands: (c) => c.supportsCommands ?? false,
12
+ skills: (c) => c.supportsSkills ?? false,
13
+ subagents: (c) => c.supportsSubagents ?? false,
14
+ memory: (c) => c.supportsMemory ?? false,
15
+ statusline: (c) => c.supportsStatusline ?? false,
16
+ // v1: no adapter sets supportsActions (no affordance emitter yet), so this is
17
+ // false everywhere and explain() marks actions skip-warn on every host — the
18
+ // honest state until the affordance emitter ships.
19
+ actions: (c) => c.supportsActions ?? false,
20
+ configPatch: (c) => c.supportsConfigPatch ?? false,
21
+ nativeHooks: (c) => c.supportsNativeHooks ?? false
22
+ };
23
+ async function capabilitiesOf(host) {
24
+ const adapter = await loadAdapter(host);
25
+ return adapter?.capabilities;
26
+ }
27
+ async function hostsSupporting(surface) {
28
+ const predicate = SURFACE_PREDICATES[surface];
29
+ const adapters = await allAdapters();
30
+ return adapters.filter((adapter) => predicate(adapter.capabilities)).map((adapter) => adapter.id).sort();
31
+ }
32
+ async function surfaceSupport(host, surface) {
33
+ const capabilities = await capabilitiesOf(host);
34
+ return capabilities ? SURFACE_PREDICATES[surface](capabilities) : false;
35
+ }
36
+
37
+ export {
38
+ SURFACE_PREDICATES,
39
+ capabilitiesOf,
40
+ hostsSupporting,
41
+ surfaceSupport
42
+ };
43
+ //# sourceMappingURL=chunk-76FUSVIA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sdk/introspect.ts"],"sourcesContent":["/**\n * sdk/introspect — host-capability introspection over the adapter registry.\n *\n * A thin, READ-ONLY query layer above {@link loadAdapter} / {@link allAdapters}:\n * \"which hosts can honor surface X?\" and \"what can host Y do?\". It exists so a\n * connector author (or a docs/CLI surface) can answer those questions WITHOUT\n * reaching into adapter internals or re-deriving the per-surface capability\n * rules — the predicates below are the single source of truth for mapping the\n * raw {@link PlatformCapabilities} flags onto the developer-facing surface names.\n *\n * Everything is async because adapters load lazily (one entry per platform in\n * the registry, imported only when queried).\n */\n\nimport type { PlatformCapabilities, PlatformId } from \"../core/types.js\";\nimport { allAdapters, loadAdapter } from \"../adapters/registry.js\";\n\n/**\n * The developer-facing surface names a connector can declare. These mirror the\n * top-level {@link import(\"../core/types.js\").ConnectorConfig} keys (server,\n * hooks, commands, …) plus the platform-scoped `configPatch` / `nativeHooks`\n * escape hatches — the same vocabulary the install diff and `explain` use.\n */\nexport type SurfaceName =\n | \"server\"\n | \"hooks\"\n | \"commands\"\n | \"skills\"\n | \"subagents\"\n | \"memory\"\n | \"statusline\"\n | \"actions\"\n | \"configPatch\"\n | \"nativeHooks\";\n\n/**\n * Pure capability predicate per surface — `true` when the host can NATIVELY\n * honor that surface. The optional capability flags are read as `?? false`\n * (the supportsCommands precedent in core/types), so a host that simply leaves\n * a flag unset reports the surface as unsupported (the installer skip-warns it).\n *\n * `hooks` is satisfied by ANY normalized hook event (i.e. the host has at least\n * one event it can dispatch); the per-event flags map 1:1 onto the\n * {@link import(\"../core/types.js\").HookEventName} union.\n */\nexport const SURFACE_PREDICATES: Record<\n SurfaceName,\n (c: PlatformCapabilities) => boolean\n> = {\n server: (c) => c.transports.length > 0,\n hooks: (c) =>\n c.sessionStart ||\n c.preToolUse ||\n c.postToolUse ||\n c.userPromptSubmit ||\n c.stop ||\n c.sessionEnd ||\n c.preCompact ||\n c.notification ||\n (c.permissionRequest ?? false) ||\n (c.postToolUseFailure ?? false) ||\n (c.subagentStart ?? false) ||\n (c.subagentStop ?? false),\n commands: (c) => c.supportsCommands ?? false,\n skills: (c) => c.supportsSkills ?? false,\n subagents: (c) => c.supportsSubagents ?? false,\n memory: (c) => c.supportsMemory ?? false,\n statusline: (c) => c.supportsStatusline ?? false,\n // v1: no adapter sets supportsActions (no affordance emitter yet), so this is\n // false everywhere and explain() marks actions skip-warn on every host — the\n // honest state until the affordance emitter ships.\n actions: (c) => c.supportsActions ?? false,\n configPatch: (c) => c.supportsConfigPatch ?? false,\n nativeHooks: (c) => c.supportsNativeHooks ?? false,\n};\n\n/**\n * The {@link PlatformCapabilities} a host advertises, or `undefined` for an id\n * that is not in the registry (`\"unknown\"`, a usage-only id like `\"synthetic\"`,\n * or a typo) — callers branch on undefined rather than crash.\n */\nexport async function capabilitiesOf(\n host: PlatformId | string,\n): Promise<PlatformCapabilities | undefined> {\n const adapter = await loadAdapter(host);\n return adapter?.capabilities;\n}\n\n/**\n * Every registered host that can NATIVELY honor `surface`, as a sorted id list\n * (stable output for snapshots/docs). Loads all adapters in parallel and keeps\n * only those whose capabilities pass {@link SURFACE_PREDICATES}.\n */\nexport async function hostsSupporting(surface: SurfaceName): Promise<PlatformId[]> {\n const predicate = SURFACE_PREDICATES[surface];\n const adapters = await allAdapters();\n return adapters\n .filter((adapter) => predicate(adapter.capabilities))\n .map((adapter) => adapter.id)\n .sort();\n}\n\n/**\n * Convenience: does `host` natively support `surface`? `false` for an unknown\n * id (no capabilities → cannot support anything).\n */\nexport async function surfaceSupport(\n host: PlatformId | string,\n surface: SurfaceName,\n): Promise<boolean> {\n const capabilities = await capabilitiesOf(host);\n return capabilities ? SURFACE_PREDICATES[surface](capabilities) : false;\n}\n"],"mappings":";;;;;;;AA6CO,IAAM,qBAGT;AAAA,EACF,QAAQ,CAAC,MAAM,EAAE,WAAW,SAAS;AAAA,EACrC,OAAO,CAAC,MACN,EAAE,gBACF,EAAE,cACF,EAAE,eACF,EAAE,oBACF,EAAE,QACF,EAAE,cACF,EAAE,cACF,EAAE,iBACD,EAAE,qBAAqB,WACvB,EAAE,sBAAsB,WACxB,EAAE,iBAAiB,WACnB,EAAE,gBAAgB;AAAA,EACrB,UAAU,CAAC,MAAM,EAAE,oBAAoB;AAAA,EACvC,QAAQ,CAAC,MAAM,EAAE,kBAAkB;AAAA,EACnC,WAAW,CAAC,MAAM,EAAE,qBAAqB;AAAA,EACzC,QAAQ,CAAC,MAAM,EAAE,kBAAkB;AAAA,EACnC,YAAY,CAAC,MAAM,EAAE,sBAAsB;AAAA;AAAA;AAAA;AAAA,EAI3C,SAAS,CAAC,MAAM,EAAE,mBAAmB;AAAA,EACrC,aAAa,CAAC,MAAM,EAAE,uBAAuB;AAAA,EAC7C,aAAa,CAAC,MAAM,EAAE,uBAAuB;AAC/C;AAOA,eAAsB,eACpB,MAC2C;AAC3C,QAAM,UAAU,MAAM,YAAY,IAAI;AACtC,SAAO,SAAS;AAClB;AAOA,eAAsB,gBAAgB,SAA6C;AACjF,QAAM,YAAY,mBAAmB,OAAO;AAC5C,QAAM,WAAW,MAAM,YAAY;AACnC,SAAO,SACJ,OAAO,CAAC,YAAY,UAAU,QAAQ,YAAY,CAAC,EACnD,IAAI,CAAC,YAAY,QAAQ,EAAE,EAC3B,KAAK;AACV;AAMA,eAAsB,eACpB,MACA,SACkB;AAClB,QAAM,eAAe,MAAM,eAAe,IAAI;AAC9C,SAAO,eAAe,mBAAmB,OAAO,EAAE,YAAY,IAAI;AACpE;","names":[]}
@@ -1,4 +1,7 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ REGISTERED_PLATFORM_IDS
4
+ } from "./chunk-3PFFTFCU.js";
2
5
  import {
3
6
  MANAGED_BLOCK_BEGIN_TOKEN,
4
7
  MANAGED_BLOCK_END_TOKEN,
@@ -49,6 +52,9 @@ function configPatchNamespaceViolation(key) {
49
52
  if (head === "mcpServers" || head === "enableAllProjectMcpServers" || head === "enabledMcpjsonServers" || head === "disabledMcpjsonServers") {
50
53
  return `"${key}" targets MCP server registration agent-connector already models; declare it via \`server\` / \`platforms.<id>.server\` / \`extra\` instead`;
51
54
  }
55
+ if (head === "statusLine") {
56
+ return `"${key}" is modeled by the statusline surface; declare it via \`statusline: { render }\` instead`;
57
+ }
52
58
  return null;
53
59
  }
54
60
  function configPatchManualEdit(patch) {
@@ -228,15 +234,17 @@ function defineConnector(config) {
228
234
  const hasSkills = Array.isArray(config.skills) && config.skills.length > 0;
229
235
  const hasSubagents = Array.isArray(config.subagents) && config.subagents.length > 0;
230
236
  const hasMemory = Array.isArray(config.memory) && config.memory.length > 0;
237
+ const hasStatusline = config.statusline != null;
238
+ const hasActions = Array.isArray(config.actions) && config.actions.length > 0;
231
239
  const hasNativeHooks = Object.values(config.platforms ?? {}).some(
232
240
  (override) => override?.nativeHooks != null && Object.keys(override.nativeHooks).length > 0
233
241
  );
234
242
  const hasConfigPatch = Object.values(config.platforms ?? {}).some(
235
243
  (override) => Array.isArray(override?.configPatch) && override.configPatch.length > 0
236
244
  );
237
- if (!config.server && !config.hooks && !hasCommands && !hasSkills && !hasSubagents && !hasMemory && !hasNativeHooks && !hasConfigPatch) {
245
+ if (!config.server && !config.hooks && !hasCommands && !hasSkills && !hasSubagents && !hasMemory && !hasStatusline && !hasActions && !hasNativeHooks && !hasConfigPatch) {
238
246
  throw new ConnectorConfigError(
239
- "a connector must declare at least one of `server`, `hooks`, `commands`, `skills`, `subagents`, `memory`, or a per-platform `nativeHooks` / `configPatch` declaration"
247
+ "a connector must declare at least one of `server`, `hooks`, `commands`, `skills`, `subagents`, `memory`, `statusline`, `actions`, or a per-platform `nativeHooks` / `configPatch` declaration"
240
248
  );
241
249
  }
242
250
  if (config.server) {
@@ -261,6 +269,7 @@ function defineConnector(config) {
261
269
  if (def != null && typeof def.handler !== "function") {
262
270
  throw new ConnectorConfigError(`hooks.${ev}.handler must be a function`);
263
271
  }
272
+ validateHostsMap(def?.hosts, `hooks.${ev}.hosts`, "handler");
264
273
  }
265
274
  }
266
275
  validateNativeHooks(config.platforms);
@@ -269,6 +278,8 @@ function defineConnector(config) {
269
278
  const skills = normalizeSkills(config.skills);
270
279
  const subagents = normalizeSubagents(config.subagents);
271
280
  const memory = normalizeMemory(config.memory);
281
+ const statusline = normalizeStatusline(config.statusline);
282
+ const actions = normalizeActions(config.actions);
272
283
  const t = config.telemetry ?? {};
273
284
  const resolved = {
274
285
  id: config.id,
@@ -293,6 +304,8 @@ function defineConnector(config) {
293
304
  skills,
294
305
  subagents,
295
306
  memory,
307
+ ...statusline ? { statusline } : {},
308
+ actions,
296
309
  platforms: config.platforms ?? {},
297
310
  targets: config.targets ?? "auto",
298
311
  ...config.publish ? { publish: normalizePublish(config.publish) } : {}
@@ -300,6 +313,27 @@ function defineConnector(config) {
300
313
  return resolved;
301
314
  }
302
315
  var NORMALIZED_EVENT_SET = new Set(ALL_EVENTS);
316
+ function validateHostsMap(map, surfaceLabel, implField) {
317
+ if (map == null) return;
318
+ if (typeof map !== "object" || Array.isArray(map)) {
319
+ throw new ConnectorConfigError(
320
+ `${surfaceLabel} must be an object keyed by platform id`
321
+ );
322
+ }
323
+ for (const [platformId, entry] of Object.entries(map)) {
324
+ if (!REGISTERED_PLATFORM_IDS.has(platformId)) {
325
+ const valid = [...REGISTERED_PLATFORM_IDS].sort().join(", ");
326
+ throw new ConnectorConfigError(
327
+ `unknown platform id "${platformId}" in hosts map for ${surfaceLabel}; valid ids: ${valid}`
328
+ );
329
+ }
330
+ if (entry == null || typeof entry !== "object" || typeof entry[implField] !== "function") {
331
+ throw new ConnectorConfigError(
332
+ `${surfaceLabel}.${platformId}.${implField} must be a function`
333
+ );
334
+ }
335
+ }
336
+ }
303
337
  function validateNativeHooks(platforms) {
304
338
  if (platforms == null) return;
305
339
  for (const [platformId, override] of Object.entries(platforms)) {
@@ -394,10 +428,10 @@ function normalizePublish(publish) {
394
428
  }
395
429
  return { ...publish };
396
430
  }
397
- function assertSurfaceName(surface, name, index) {
431
+ function assertSurfaceName(surface, name, index, field = "name") {
398
432
  if (typeof name !== "string" || !SURFACE_NAME_RE.test(name)) {
399
433
  throw new ConnectorConfigError(
400
- `${surface}[${index}].name must be kebab-case matching ${SURFACE_NAME_RE} (got ${JSON.stringify(name)})`
434
+ `${surface}[${index}].${field} must be kebab-case matching ${SURFACE_NAME_RE} (got ${JSON.stringify(name)})`
401
435
  );
402
436
  }
403
437
  return name;
@@ -408,9 +442,9 @@ function assertNonEmptyString(surface, index, field, value) {
408
442
  }
409
443
  return value;
410
444
  }
411
- function assertNoDuplicate(surface, seen, name, index) {
445
+ function assertNoDuplicate(surface, seen, name, index, field = "name") {
412
446
  if (seen.has(name)) {
413
- throw new ConnectorConfigError(`${surface}[${index}] duplicate name "${name}"`);
447
+ throw new ConnectorConfigError(`${surface}[${index}] duplicate ${field} "${name}"`);
414
448
  }
415
449
  seen.add(name);
416
450
  }
@@ -511,6 +545,56 @@ function normalizeMemory(input) {
511
545
  return { ...entry, name };
512
546
  });
513
547
  }
548
+ var STATUSLINE_DEFAULT_NAME = "statusline";
549
+ function normalizeStatusline(input) {
550
+ if (input == null) return void 0;
551
+ if (typeof input !== "object" || Array.isArray(input)) {
552
+ throw new ConnectorConfigError("statusline must be an object");
553
+ }
554
+ if (typeof input.render !== "function") {
555
+ throw new ConnectorConfigError("statusline.render must be a function");
556
+ }
557
+ const name = input.name === void 0 ? STATUSLINE_DEFAULT_NAME : assertSurfaceName("statusline", input.name, 0);
558
+ if (input.description !== void 0 && typeof input.description !== "string") {
559
+ throw new ConnectorConfigError("statusline.description must be a string");
560
+ }
561
+ validateHostsMap(input.hosts, "statusline.hosts", "render");
562
+ return { ...input, name };
563
+ }
564
+ function normalizeActions(input) {
565
+ if (input == null) return [];
566
+ if (!Array.isArray(input)) {
567
+ throw new ConnectorConfigError("actions must be an array");
568
+ }
569
+ const seen = /* @__PURE__ */ new Set();
570
+ return input.map((action, i) => {
571
+ if (!action || typeof action !== "object" || Array.isArray(action)) {
572
+ throw new ConnectorConfigError(`actions[${i}] must be an object`);
573
+ }
574
+ const id = assertSurfaceName("actions", action.id, i, "id");
575
+ assertNoDuplicate("actions", seen, id, i, "id");
576
+ if (typeof action.run !== "function") {
577
+ throw new ConnectorConfigError(`actions[${i}].run must be a function`);
578
+ }
579
+ if (action.description !== void 0 && typeof action.description !== "string") {
580
+ throw new ConnectorConfigError(`actions[${i}].description must be a string`);
581
+ }
582
+ validateHostsMap(action.hosts, `actions.${id}.hosts`, "run");
583
+ return { ...action, id };
584
+ });
585
+ }
586
+ var defineStatusline = (def) => def;
587
+ var defineHook = (event, def) => {
588
+ void event;
589
+ return def;
590
+ };
591
+ var defineCommand = (def) => def;
592
+ var defineSkill = (def) => def;
593
+ var defineSubagent = (def) => def;
594
+ var defineMemory = (def) => def;
595
+ var defineAction = (def) => def;
596
+ var defineConfigPatch = (def) => def;
597
+ var defineNativeHook = (def) => def;
514
598
  function normalizeSubagents(input) {
515
599
  if (input == null) return [];
516
600
  if (!Array.isArray(input)) {
@@ -540,14 +624,6 @@ function normalizeServer(server) {
540
624
  }
541
625
 
542
626
  export {
543
- MCP_SERVER_SCHEMA_URL,
544
- MCPB_MANIFEST_VERSION,
545
- MCP_PROTOCOL_VERSION,
546
- NPM_REGISTRY_BASE_URL,
547
- registryTransportType,
548
- isConcreteSemver,
549
- isPlaceholderVersion,
550
- REGISTRY_NAME_RE,
551
627
  isValidConfigPatchKey,
552
628
  configPatchNamespaceViolation,
553
629
  configPatchManualEdit,
@@ -562,7 +638,24 @@ export {
562
638
  addLedgerOwner,
563
639
  removeLedgerOwner,
564
640
  dropLedgerEntry,
641
+ MCP_SERVER_SCHEMA_URL,
642
+ MCPB_MANIFEST_VERSION,
643
+ MCP_PROTOCOL_VERSION,
644
+ NPM_REGISTRY_BASE_URL,
645
+ registryTransportType,
646
+ isConcreteSemver,
647
+ isPlaceholderVersion,
648
+ REGISTRY_NAME_RE,
565
649
  ConnectorConfigError,
566
- defineConnector
650
+ defineConnector,
651
+ defineStatusline,
652
+ defineHook,
653
+ defineCommand,
654
+ defineSkill,
655
+ defineSubagent,
656
+ defineMemory,
657
+ defineAction,
658
+ defineConfigPatch,
659
+ defineNativeHook
567
660
  };
568
- //# sourceMappingURL=chunk-GSGDG2BV.js.map
661
+ //# sourceMappingURL=chunk-ADTHT2FN.js.map