@ken-jo/agent-connector 0.4.6 → 0.4.8
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.
- package/dist/{action-EV63GAPY.js → action-RWPRIZIC.js} +10 -10
- package/dist/{amazon-q-COAL3764.js → amazon-q-5LJOB5L3.js} +6 -18
- package/dist/amazon-q-5LJOB5L3.js.map +1 -0
- package/dist/{amp-XJQ4TDAU.js → amp-PU4LFSY6.js} +16 -48
- package/dist/amp-PU4LFSY6.js.map +1 -0
- package/dist/{antigravity-AMKKKHS4.js → antigravity-DWW35HZO.js} +6 -5
- package/dist/{antigravity-cli-XERXEH5W.js → antigravity-cli-VTQ6DNWL.js} +6 -5
- package/dist/{antigravity-cli-XERXEH5W.js.map → antigravity-cli-VTQ6DNWL.js.map} +1 -1
- package/dist/{chunk-F5RX62T7.js → chunk-7QRUZAUG.js} +2 -2
- package/dist/{chunk-G5CQHVQG.js → chunk-7TVBFRVI.js} +12 -15
- package/dist/chunk-7TVBFRVI.js.map +1 -0
- package/dist/{chunk-QC5A3TFQ.js → chunk-A2T4Q7RM.js} +18 -18
- package/dist/{chunk-2X4EH2D7.js → chunk-CDVOBKSG.js} +4 -4
- package/dist/{chunk-RQPKL62M.js → chunk-CENEXP7K.js} +9 -38
- package/dist/chunk-CENEXP7K.js.map +1 -0
- package/dist/chunk-FBJQGRET.js +38 -0
- package/dist/chunk-FBJQGRET.js.map +1 -0
- package/dist/{chunk-WZA4CSGJ.js → chunk-H53QZQJI.js} +15 -2
- package/dist/chunk-H53QZQJI.js.map +1 -0
- package/dist/{chunk-DCK5FADX.js → chunk-HOE2MN36.js} +2 -2
- package/dist/{chunk-7L6ITC4T.js → chunk-IEGR4TP3.js} +22 -6
- package/dist/chunk-IEGR4TP3.js.map +1 -0
- package/dist/{chunk-CPLK7GTE.js → chunk-KG6T3YNJ.js} +353 -36
- package/dist/chunk-KG6T3YNJ.js.map +1 -0
- package/dist/{chunk-MZF2YCXX.js → chunk-MOW2RKHX.js} +2 -2
- package/dist/{chunk-EXLS7BSI.js → chunk-NLFPH4S2.js} +10 -2
- package/dist/chunk-NLFPH4S2.js.map +1 -0
- package/dist/{chunk-EROJDXMW.js → chunk-NYR55UT7.js} +2 -2
- package/dist/{chunk-SRVAA2VN.js → chunk-OZ5EXXQV.js} +2 -2
- package/dist/{chunk-I5MLE6S7.js → chunk-TO57WYBB.js} +15 -1
- package/dist/chunk-TO57WYBB.js.map +1 -0
- package/dist/chunk-UM5S7DKK.js +33 -0
- package/dist/chunk-UM5S7DKK.js.map +1 -0
- package/dist/{chunk-5G4EPJ4Y.js → chunk-VRKTVCYJ.js} +7 -7
- package/dist/{chunk-QOGMDOUX.js → chunk-WI6YSXOC.js} +3 -3
- package/dist/{chunk-BMD7ANKF.js → chunk-XQUUNAGC.js} +36 -36
- package/dist/{chunk-LQRAPXS4.js → chunk-YS2NYJ6R.js} +15 -49
- package/dist/chunk-YS2NYJ6R.js.map +1 -0
- package/dist/{chunk-H67V7DEL.js → chunk-YYISBXOM.js} +7 -7
- package/dist/{claude-code-T2LPFNC3.js → claude-code-64X6RR2S.js} +46 -133
- package/dist/claude-code-64X6RR2S.js.map +1 -0
- package/dist/cli/sdk.js +4 -4
- package/dist/cli.js +1 -1
- package/dist/{cline-WRYMNS7Z.js → cline-T7ZDJYZQ.js} +15 -47
- package/dist/cline-T7ZDJYZQ.js.map +1 -0
- package/dist/{codebuff-PODYPOOP.js → codebuff-PPPY3SJV.js} +9 -40
- package/dist/codebuff-PPPY3SJV.js.map +1 -0
- package/dist/{codex-O4G7D7KK.js → codex-EEVN43C2.js} +115 -172
- package/dist/codex-EEVN43C2.js.map +1 -0
- package/dist/{continue-K43SUHLQ.js → continue-VLLZO4PM.js} +12 -33
- package/dist/continue-VLLZO4PM.js.map +1 -0
- package/dist/{copilot-cli-Q3SSPT4V.js → copilot-cli-A7G5WB4N.js} +17 -64
- package/dist/copilot-cli-A7G5WB4N.js.map +1 -0
- package/dist/{crush-MBEH2R3I.js → crush-AH24GDDB.js} +17 -42
- package/dist/crush-AH24GDDB.js.map +1 -0
- package/dist/{cursor-TMBXDYR4.js → cursor-GJBSMXI6.js} +61 -183
- package/dist/cursor-GJBSMXI6.js.map +1 -0
- package/dist/{detect-AHJIUMBO.js → detect-YDCZNV4W.js} +4 -4
- package/dist/{doctor-G5MLCPAB.js → doctor-DGC7P3P7.js} +13 -12
- package/dist/{doctor-G5MLCPAB.js.map → doctor-DGC7P3P7.js.map} +1 -1
- package/dist/{droid-JC2NT6S4.js → droid-RBWCFKL3.js} +63 -144
- package/dist/droid-RBWCFKL3.js.map +1 -0
- package/dist/{gemini-cli-ILR7M5X3.js → gemini-cli-CFPFEJEA.js} +20 -63
- package/dist/gemini-cli-CFPFEJEA.js.map +1 -0
- package/dist/{goose-SFO5BBGW.js → goose-UBJVQFUE.js} +107 -183
- package/dist/goose-UBJVQFUE.js.map +1 -0
- package/dist/{hermes-3N7WN4WS.js → hermes-6FXGXLNL.js} +41 -83
- package/dist/hermes-6FXGXLNL.js.map +1 -0
- package/dist/{hook-76JBKTUX.js → hook-CDGSCASQ.js} +10 -10
- package/dist/index.js +2 -2
- package/dist/{install-R7252QFH.js → install-2D3UKEME.js} +13 -12
- package/dist/{install-R7252QFH.js.map → install-2D3UKEME.js.map} +1 -1
- package/dist/{jetbrains-copilot-NRZHI5PC.js → jetbrains-copilot-K26KMA3U.js} +12 -37
- package/dist/jetbrains-copilot-K26KMA3U.js.map +1 -0
- package/dist/{kilo-IX4T3OHJ.js → kilo-BKZJ26RM.js} +26 -90
- package/dist/kilo-BKZJ26RM.js.map +1 -0
- package/dist/{kilo-cli-2AYCXBQD.js → kilo-cli-6UVWCXQD.js} +17 -48
- package/dist/kilo-cli-6UVWCXQD.js.map +1 -0
- package/dist/{kimi-2YFK2GBA.js → kimi-QALYPSRR.js} +20 -31
- package/dist/kimi-QALYPSRR.js.map +1 -0
- package/dist/{kiro-YL6AWUYG.js → kiro-J5J42I5Z.js} +12 -31
- package/dist/kiro-J5J42I5Z.js.map +1 -0
- package/dist/{leaderboard-V6VWA5ZV.js → leaderboard-VZQXNWTX.js} +2 -2
- package/dist/{mimo-code-FTMGSKMQ.js → mimo-code-BEE622P2.js} +22 -87
- package/dist/mimo-code-BEE622P2.js.map +1 -0
- package/dist/{mux-5XZFB44C.js → mux-5HTNKK4K.js} +10 -54
- package/dist/mux-5HTNKK4K.js.map +1 -0
- package/dist/{nemoclaw-CQYXZVQN.js → nemoclaw-DNFIZFDF.js} +5 -5
- package/dist/{omp-2QMEY6HD.js → omp-I3UTRBNP.js} +16 -48
- package/dist/omp-I3UTRBNP.js.map +1 -0
- package/dist/{openclaw-UZC437RW.js → openclaw-QE2LMWIF.js} +5 -5
- package/dist/{opencode-L4BGFP25.js → opencode-ZFSUYJXI.js} +22 -88
- package/dist/opencode-ZFSUYJXI.js.map +1 -0
- package/dist/{package-DNLQTPNN.js → package-BSCCMW4E.js} +8 -8
- package/dist/{pi-PVVPVWKG.js → pi-H2KBBDDJ.js} +4 -4
- package/dist/{qwen-code-G4CXKUHR.js → qwen-code-5LE34FNE.js} +63 -152
- package/dist/qwen-code-5LE34FNE.js.map +1 -0
- package/dist/{roo-code-67TYJIQR.js → roo-code-XH4GCYIS.js} +15 -52
- package/dist/roo-code-XH4GCYIS.js.map +1 -0
- package/dist/runtime/index.js +8 -8
- package/dist/sdk/index.js +3 -3
- package/dist/sdk/test.js +5 -5
- package/dist/{serve-EOVWYBGZ.js → serve-MQNGPY2H.js} +10 -10
- package/dist/{status-VTD6XXLW.js → status-MRHVRDFY.js} +8 -7
- package/dist/{status-VTD6XXLW.js.map → status-MRHVRDFY.js.map} +1 -1
- package/dist/{statusline-3ET5YPQ5.js → statusline-IYWA75TR.js} +9 -9
- package/dist/{telemetry-QCTMKDBQ.js → telemetry-IONIOMLC.js} +5 -5
- package/dist/{trae-7CZZGOGI.js → trae-RVNRSV7X.js} +10 -39
- package/dist/trae-RVNRSV7X.js.map +1 -0
- package/dist/{uninstall-FL3SH2DT.js → uninstall-ESLSVCLE.js} +13 -12
- package/dist/{uninstall-FL3SH2DT.js.map → uninstall-ESLSVCLE.js.map} +1 -1
- package/dist/{upgrade-SLFG2FCT.js → upgrade-VICY5T64.js} +13 -12
- package/dist/{upgrade-SLFG2FCT.js.map → upgrade-VICY5T64.js.map} +1 -1
- package/dist/{usage-IRBLVUZM.js → usage-TCUWV2YZ.js} +2 -2
- package/dist/{usage-event-VFF77WYY.js → usage-event-CBZZP37Q.js} +9 -9
- package/dist/{vscode-copilot-MF2CDNMT.js → vscode-copilot-B2QBBHJW.js} +17 -65
- package/dist/vscode-copilot-B2QBBHJW.js.map +1 -0
- package/dist/{warp-VKG55TAT.js → warp-5R54ST3N.js} +7 -19
- package/dist/warp-5R54ST3N.js.map +1 -0
- package/dist/{windsurf-FU5G4SHF.js → windsurf-L32UEOLY.js} +6 -18
- package/dist/windsurf-L32UEOLY.js.map +1 -0
- package/dist/{zed-SFUHL3GS.js → zed-FDJHJZKD.js} +11 -21
- package/dist/zed-FDJHJZKD.js.map +1 -0
- package/package.json +1 -1
- package/dist/amazon-q-COAL3764.js.map +0 -1
- package/dist/amp-XJQ4TDAU.js.map +0 -1
- package/dist/chunk-7L6ITC4T.js.map +0 -1
- package/dist/chunk-CPLK7GTE.js.map +0 -1
- package/dist/chunk-EXLS7BSI.js.map +0 -1
- package/dist/chunk-G5CQHVQG.js.map +0 -1
- package/dist/chunk-I5MLE6S7.js.map +0 -1
- package/dist/chunk-LQRAPXS4.js.map +0 -1
- package/dist/chunk-RQPKL62M.js.map +0 -1
- package/dist/chunk-WZA4CSGJ.js.map +0 -1
- package/dist/claude-code-T2LPFNC3.js.map +0 -1
- package/dist/cline-WRYMNS7Z.js.map +0 -1
- package/dist/codebuff-PODYPOOP.js.map +0 -1
- package/dist/codex-O4G7D7KK.js.map +0 -1
- package/dist/continue-K43SUHLQ.js.map +0 -1
- package/dist/copilot-cli-Q3SSPT4V.js.map +0 -1
- package/dist/crush-MBEH2R3I.js.map +0 -1
- package/dist/cursor-TMBXDYR4.js.map +0 -1
- package/dist/droid-JC2NT6S4.js.map +0 -1
- package/dist/gemini-cli-ILR7M5X3.js.map +0 -1
- package/dist/goose-SFO5BBGW.js.map +0 -1
- package/dist/hermes-3N7WN4WS.js.map +0 -1
- package/dist/jetbrains-copilot-NRZHI5PC.js.map +0 -1
- package/dist/kilo-IX4T3OHJ.js.map +0 -1
- package/dist/kilo-cli-2AYCXBQD.js.map +0 -1
- package/dist/kimi-2YFK2GBA.js.map +0 -1
- package/dist/kiro-YL6AWUYG.js.map +0 -1
- package/dist/mimo-code-FTMGSKMQ.js.map +0 -1
- package/dist/mux-5XZFB44C.js.map +0 -1
- package/dist/omp-2QMEY6HD.js.map +0 -1
- package/dist/opencode-L4BGFP25.js.map +0 -1
- package/dist/qwen-code-G4CXKUHR.js.map +0 -1
- package/dist/roo-code-67TYJIQR.js.map +0 -1
- package/dist/trae-7CZZGOGI.js.map +0 -1
- package/dist/vscode-copilot-MF2CDNMT.js.map +0 -1
- package/dist/warp-VKG55TAT.js.map +0 -1
- package/dist/windsurf-FU5G4SHF.js.map +0 -1
- package/dist/zed-SFUHL3GS.js.map +0 -1
- /package/dist/{action-EV63GAPY.js.map → action-RWPRIZIC.js.map} +0 -0
- /package/dist/{antigravity-AMKKKHS4.js.map → antigravity-DWW35HZO.js.map} +0 -0
- /package/dist/{chunk-F5RX62T7.js.map → chunk-7QRUZAUG.js.map} +0 -0
- /package/dist/{chunk-QC5A3TFQ.js.map → chunk-A2T4Q7RM.js.map} +0 -0
- /package/dist/{chunk-2X4EH2D7.js.map → chunk-CDVOBKSG.js.map} +0 -0
- /package/dist/{chunk-DCK5FADX.js.map → chunk-HOE2MN36.js.map} +0 -0
- /package/dist/{chunk-MZF2YCXX.js.map → chunk-MOW2RKHX.js.map} +0 -0
- /package/dist/{chunk-EROJDXMW.js.map → chunk-NYR55UT7.js.map} +0 -0
- /package/dist/{chunk-SRVAA2VN.js.map → chunk-OZ5EXXQV.js.map} +0 -0
- /package/dist/{chunk-5G4EPJ4Y.js.map → chunk-VRKTVCYJ.js.map} +0 -0
- /package/dist/{chunk-QOGMDOUX.js.map → chunk-WI6YSXOC.js.map} +0 -0
- /package/dist/{chunk-BMD7ANKF.js.map → chunk-XQUUNAGC.js.map} +0 -0
- /package/dist/{chunk-H67V7DEL.js.map → chunk-YYISBXOM.js.map} +0 -0
- /package/dist/{detect-AHJIUMBO.js.map → detect-YDCZNV4W.js.map} +0 -0
- /package/dist/{hook-76JBKTUX.js.map → hook-CDGSCASQ.js.map} +0 -0
- /package/dist/{leaderboard-V6VWA5ZV.js.map → leaderboard-VZQXNWTX.js.map} +0 -0
- /package/dist/{nemoclaw-CQYXZVQN.js.map → nemoclaw-DNFIZFDF.js.map} +0 -0
- /package/dist/{openclaw-UZC437RW.js.map → openclaw-QE2LMWIF.js.map} +0 -0
- /package/dist/{package-DNLQTPNN.js.map → package-BSCCMW4E.js.map} +0 -0
- /package/dist/{pi-PVVPVWKG.js.map → pi-H2KBBDDJ.js.map} +0 -0
- /package/dist/{serve-EOVWYBGZ.js.map → serve-MQNGPY2H.js.map} +0 -0
- /package/dist/{statusline-3ET5YPQ5.js.map → statusline-IYWA75TR.js.map} +0 -0
- /package/dist/{telemetry-QCTMKDBQ.js.map → telemetry-IONIOMLC.js.map} +0 -0
- /package/dist/{usage-IRBLVUZM.js.map → usage-TCUWV2YZ.js.map} +0 -0
- /package/dist/{usage-event-VFF77WYY.js.map → usage-event-CBZZP37Q.js.map} +0 -0
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
readYaml,
|
|
4
|
-
|
|
5
|
-
} from "./chunk-
|
|
4
|
+
yamlObjectMapCodec
|
|
5
|
+
} from "./chunk-NLFPH4S2.js";
|
|
6
|
+
import {
|
|
7
|
+
roamingAppData
|
|
8
|
+
} from "./chunk-UM5S7DKK.js";
|
|
9
|
+
import {
|
|
10
|
+
normalizeSessionSource
|
|
11
|
+
} from "./chunk-H53QZQJI.js";
|
|
6
12
|
import {
|
|
7
13
|
resolveEnvRefsDeep
|
|
8
14
|
} from "./chunk-DBQMX75U.js";
|
|
9
15
|
import {
|
|
10
|
-
BaseAdapter
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
BaseAdapter,
|
|
17
|
+
removeFromObjectMap,
|
|
18
|
+
upsertInObjectMap
|
|
19
|
+
} from "./chunk-KG6T3YNJ.js";
|
|
13
20
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
isHomeBinHookCommand,
|
|
17
|
-
shouldWrapForTelemetry
|
|
18
|
-
} from "./chunk-I5MLE6S7.js";
|
|
19
|
-
import "./chunk-N6HH7K6P.js";
|
|
21
|
+
renderSkillMd
|
|
22
|
+
} from "./chunk-IEGR4TP3.js";
|
|
20
23
|
import {
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
buildWrappedStdio,
|
|
25
|
+
isHomeBinHookCommand
|
|
26
|
+
} from "./chunk-TO57WYBB.js";
|
|
27
|
+
import "./chunk-N6HH7K6P.js";
|
|
28
|
+
import "./chunk-TRQKHP7D.js";
|
|
23
29
|
|
|
24
30
|
// src/adapters/goose/index.ts
|
|
25
|
-
import { existsSync
|
|
31
|
+
import { existsSync } from "fs";
|
|
26
32
|
import { homedir } from "os";
|
|
27
33
|
import { dirname, join } from "path";
|
|
28
34
|
var HOST = "goose";
|
|
@@ -127,8 +133,7 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
127
133
|
*/
|
|
128
134
|
userConfigPath() {
|
|
129
135
|
if (process.platform === "win32") {
|
|
130
|
-
|
|
131
|
-
return join(appData, "Block", "goose", "config", "config.yaml");
|
|
136
|
+
return join(roamingAppData(), "Block", "goose", "config", "config.yaml");
|
|
132
137
|
}
|
|
133
138
|
return join(homedir(), ".config", "goose", "config.yaml");
|
|
134
139
|
}
|
|
@@ -166,41 +171,32 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
166
171
|
];
|
|
167
172
|
}
|
|
168
173
|
const entry = this.renderExtension(ctx, server);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
writeYaml(path, cfg, dryRun);
|
|
182
|
-
}
|
|
183
|
-
return [{ platform: this.id, action, path, detail: `${MCP_ROOT_KEY}.${connector.id}` }];
|
|
174
|
+
return [
|
|
175
|
+
upsertInObjectMap({
|
|
176
|
+
codec: yamlObjectMapCodec(),
|
|
177
|
+
rootKey: MCP_ROOT_KEY,
|
|
178
|
+
policy: "coerce",
|
|
179
|
+
platform: this.id,
|
|
180
|
+
configPath: path,
|
|
181
|
+
entryId: connector.id,
|
|
182
|
+
entry,
|
|
183
|
+
dryRun
|
|
184
|
+
})
|
|
185
|
+
];
|
|
184
186
|
}
|
|
185
187
|
uninstallServer(ctx) {
|
|
186
188
|
const { connector, dryRun } = ctx;
|
|
187
189
|
const path = this.getServerConfigPath(ctx);
|
|
188
|
-
const cfg = readYaml(path);
|
|
189
|
-
const bucketRaw = cfg?.[MCP_ROOT_KEY];
|
|
190
|
-
if (!cfg || !bucketRaw || typeof bucketRaw !== "object" || Array.isArray(bucketRaw) || !(connector.id in bucketRaw)) {
|
|
191
|
-
return [
|
|
192
|
-
{
|
|
193
|
-
platform: this.id,
|
|
194
|
-
action: "skip",
|
|
195
|
-
path,
|
|
196
|
-
detail: `${MCP_ROOT_KEY}.${connector.id} absent`
|
|
197
|
-
}
|
|
198
|
-
];
|
|
199
|
-
}
|
|
200
|
-
delete bucketRaw[connector.id];
|
|
201
|
-
writeYaml(path, cfg, dryRun);
|
|
202
190
|
return [
|
|
203
|
-
{
|
|
191
|
+
removeFromObjectMap({
|
|
192
|
+
codec: yamlObjectMapCodec(),
|
|
193
|
+
rootKey: MCP_ROOT_KEY,
|
|
194
|
+
policy: "coerce",
|
|
195
|
+
platform: this.id,
|
|
196
|
+
configPath: path,
|
|
197
|
+
entryId: connector.id,
|
|
198
|
+
dryRun
|
|
199
|
+
})
|
|
204
200
|
];
|
|
205
201
|
}
|
|
206
202
|
/**
|
|
@@ -211,18 +207,7 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
211
207
|
renderExtension(ctx, server) {
|
|
212
208
|
let cmd = server.command ?? "";
|
|
213
209
|
let args = [...server.args ?? []];
|
|
214
|
-
|
|
215
|
-
const wrapped = buildServeWrapperCommand(
|
|
216
|
-
ctx.homeBinPath,
|
|
217
|
-
ctx.connector.id,
|
|
218
|
-
cmd,
|
|
219
|
-
args,
|
|
220
|
-
ctx.scope,
|
|
221
|
-
this.id
|
|
222
|
-
);
|
|
223
|
-
cmd = wrapped.command;
|
|
224
|
-
args = wrapped.args;
|
|
225
|
-
}
|
|
210
|
+
({ command: cmd, args } = buildWrappedStdio(ctx, server, this.id, cmd, args));
|
|
226
211
|
cmd = resolveEnvRefsDeep(cmd);
|
|
227
212
|
args = resolveEnvRefsDeep(args);
|
|
228
213
|
const timeoutMs = server.timeoutMs;
|
|
@@ -245,111 +230,81 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
245
230
|
}
|
|
246
231
|
// ── Hook install / uninstall (JSON Open-Plugins hooks.json) ───────────────
|
|
247
232
|
installHooks(ctx) {
|
|
248
|
-
const { connector
|
|
233
|
+
const { connector } = ctx;
|
|
249
234
|
const path = this.getHookConfigPath(ctx);
|
|
250
235
|
if (connector.platforms[HOST]?.hooks === false) {
|
|
251
236
|
return [{ platform: this.id, action: "skip", path, detail: "hooks disabled for goose" }];
|
|
252
237
|
}
|
|
253
|
-
|
|
254
|
-
if (events.length === 0) {
|
|
238
|
+
if (connector.hookEvents.length === 0) {
|
|
255
239
|
return [{ platform: this.id, action: "skip", path, detail: "connector declares no hooks" }];
|
|
256
240
|
}
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
changes.push({
|
|
263
|
-
platform: this.id,
|
|
264
|
-
action: "warn",
|
|
265
|
-
path,
|
|
266
|
-
detail: `${event} unsupported on goose \u2014 skipped`
|
|
267
|
-
});
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
const command = buildHomeBinHookCommand(ctx.homeBinPath, HOST, event, connector.id);
|
|
271
|
-
const matcher = connector.hooks[event]?.matcher ?? "";
|
|
272
|
-
const desired = {
|
|
273
|
-
matcher,
|
|
274
|
-
hooks: [{ type: "command", command }]
|
|
275
|
-
};
|
|
276
|
-
const bucket = file.hooks[event] ??= [];
|
|
277
|
-
const idx = bucket.findIndex((rule) => this.ruleHasOurCommand(rule, ctx));
|
|
278
|
-
if (idx >= 0) {
|
|
279
|
-
if (JSON.stringify(bucket[idx]) === JSON.stringify(desired)) {
|
|
280
|
-
changes.push({ platform: this.id, action: "skip", path, detail: `hooks.${event}` });
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
bucket[idx] = desired;
|
|
284
|
-
changes.push({ platform: this.id, action: "update", path, detail: `hooks.${event}` });
|
|
285
|
-
} else {
|
|
286
|
-
bucket.push(desired);
|
|
287
|
-
changes.push({ platform: this.id, action: "create", path, detail: `hooks.${event}` });
|
|
288
|
-
}
|
|
289
|
-
mutated = true;
|
|
290
|
-
}
|
|
291
|
-
if (mutated) this.writeHooksFile(path, file, dryRun);
|
|
292
|
-
return changes;
|
|
241
|
+
const pending = connector.hookEvents.map((event) => ({
|
|
242
|
+
event,
|
|
243
|
+
matcher: connector.hooks[event]?.matcher ?? ""
|
|
244
|
+
}));
|
|
245
|
+
return this.upsertHookEntries(ctx, path, pending, this.hookDescriptor(ctx));
|
|
293
246
|
}
|
|
294
247
|
uninstallHooks(ctx) {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
248
|
+
return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Goose's hook-merge descriptor for the shared object-map engine. Goose's hook
|
|
252
|
+
* file is the DEDICATED per-connector `.agents/plugins/<id>/hooks/hooks.json`
|
|
253
|
+
* (NESTED rule shape `{ matcher?, hooks:[{type,command}] }`), so every
|
|
254
|
+
* observable string + ownership predicate is carried here to reproduce the
|
|
255
|
+
* prior in-adapter loop byte-for-byte:
|
|
256
|
+
* - malformedPolicy "coerce" — a present-but-malformed `hooks` root (array /
|
|
257
|
+
* primitive, hand-edited) and a non-array event bucket are coerced to fresh
|
|
258
|
+
* containers, matching the old readHooksFile coerce + the `??=` bucket fill.
|
|
259
|
+
* - mapEvent = the CAPABILITY FILTER: an event Goose's Open-Plugins runtime
|
|
260
|
+
* does not deliver (e.g. UserPromptSubmit, PreCompact) maps to undefined →
|
|
261
|
+
* the engine emits the `<event> unsupported on goose — skipped` warn and
|
|
262
|
+
* never writes it; supported events map to themselves (identity).
|
|
263
|
+
* - entryOwnsCommand is connector-GENERIC (ANY of our commands in the nested
|
|
264
|
+
* inner `hooks`) — the old ruleHasOurCommand.
|
|
265
|
+
* - uninstall is NESTED: ownsEntryForRemove is never-true so the engine only
|
|
266
|
+
* runs stripInner — strip our owned inner commands, keep foreign ones, drop
|
|
267
|
+
* emptied rules. The rebuilt rule OMITS `matcher` when it was undefined
|
|
268
|
+
* (distinct from claude/droid/qwen, which always emit a matcher); `removed`
|
|
269
|
+
* is the inner-command count, surfaced in the `(<n>)` remove detail.
|
|
270
|
+
*/
|
|
271
|
+
hookDescriptor(ctx) {
|
|
272
|
+
return {
|
|
273
|
+
malformedPolicy: "coerce",
|
|
274
|
+
// CAPABILITY FILTER → identity-or-undefined: supported events map to
|
|
275
|
+
// themselves; an unsupported one (capability !== true) maps to undefined,
|
|
276
|
+
// routing it to the warn-skip path.
|
|
277
|
+
mapEvent: (e) => this.capabilities[EVENT_CAPABILITY[e]] === true ? e : void 0,
|
|
278
|
+
unmappedWarnDetail: (e) => `${e} unsupported on goose \u2014 skipped`,
|
|
279
|
+
// NESTED rule, matcher-FIRST key order (matches the old `desired`).
|
|
280
|
+
renderEntry: (_event, matcher, command) => ({
|
|
281
|
+
matcher,
|
|
282
|
+
hooks: [{ type: "command", command }]
|
|
283
|
+
}),
|
|
284
|
+
// Connector-generic find (= the old ruleHasOurCommand): ANY inner command ours.
|
|
285
|
+
entryOwnsCommand: (rule, _command) => (rule.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx)),
|
|
286
|
+
// NESTED: never drop a whole rule; inner-strip only.
|
|
287
|
+
ownsEntryForRemove: () => () => false,
|
|
288
|
+
stripInner: (c) => (rule) => {
|
|
308
289
|
const innerBefore = rule.hooks?.length ?? 0;
|
|
309
|
-
const inner = (rule.hooks ?? []).filter((h) => !this.isOurCommand(h.command,
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
path,
|
|
323
|
-
detail: `hooks.${event} (${removed})`
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
if (mutated) this.writeHooksFile(path, file, ctx.dryRun);
|
|
327
|
-
if (changes.length === 0) {
|
|
328
|
-
return [{ platform: this.id, action: "skip", path, detail: "no matching hook entries" }];
|
|
329
|
-
}
|
|
330
|
-
return changes;
|
|
290
|
+
const inner = (rule.hooks ?? []).filter((h) => !this.isOurCommand(h.command, c));
|
|
291
|
+
return {
|
|
292
|
+
// MATCHER-OMITTED-WHEN-UNDEFINED: reproduce the old rebuild exactly —
|
|
293
|
+
// key order is `matcher` (only when present) then `hooks`.
|
|
294
|
+
next: inner.length > 0 ? { ...rule.matcher !== void 0 ? { matcher: rule.matcher } : {}, hooks: inner } : null,
|
|
295
|
+
removed: innerBefore - inner.length
|
|
296
|
+
};
|
|
297
|
+
},
|
|
298
|
+
skipDetail: (e) => `hooks.${e}`,
|
|
299
|
+
removeDetail: (e, n) => `hooks.${e} (${n})`,
|
|
300
|
+
absentDetail: "no hooks.json",
|
|
301
|
+
noMatchDetail: "no matching hook entries"
|
|
302
|
+
};
|
|
331
303
|
}
|
|
332
304
|
/** True when a hook command is ours (anchored home-bin + connector id). */
|
|
333
305
|
isOurCommand(command, ctx) {
|
|
334
306
|
return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);
|
|
335
307
|
}
|
|
336
|
-
/** True when any inner command of a nested rule is ours. */
|
|
337
|
-
ruleHasOurCommand(rule, ctx) {
|
|
338
|
-
return (rule.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx));
|
|
339
|
-
}
|
|
340
|
-
readHooksFile(path) {
|
|
341
|
-
const existing = this.readJson(path);
|
|
342
|
-
if (existing && existing.hooks && typeof existing.hooks === "object") {
|
|
343
|
-
return { hooks: existing.hooks };
|
|
344
|
-
}
|
|
345
|
-
return { hooks: {} };
|
|
346
|
-
}
|
|
347
|
-
writeHooksFile(path, file, dryRun) {
|
|
348
|
-
if (dryRun) return;
|
|
349
|
-
ensureDir(dirname(path));
|
|
350
|
-
writeFileSync(path, `${JSON.stringify(file, null, 2)}
|
|
351
|
-
`, "utf8");
|
|
352
|
-
}
|
|
353
308
|
// ── Diagnostics ──────────────────────────────────────────────────────────
|
|
354
309
|
getHealthChecks(ctx) {
|
|
355
310
|
const serverPath = this.getServerConfigPath(ctx);
|
|
@@ -425,7 +380,7 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
425
380
|
for (const skill of connector.skills) {
|
|
426
381
|
const dir = this.skillDir(ctx, skill.name);
|
|
427
382
|
changes.push(
|
|
428
|
-
this.writeContentFile(join(dir, "SKILL.md"),
|
|
383
|
+
this.writeContentFile(join(dir, "SKILL.md"), renderSkillMd(skill), ctx.dryRun)
|
|
429
384
|
);
|
|
430
385
|
for (const [rel, contents] of Object.entries(skill.resources ?? {})) {
|
|
431
386
|
const target = this.resolveWithin(dir, rel);
|
|
@@ -460,25 +415,6 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
460
415
|
}
|
|
461
416
|
return changes;
|
|
462
417
|
}
|
|
463
|
-
/**
|
|
464
|
-
* Render a skill's SKILL.md: frontmatter (name, description + optional model,
|
|
465
|
-
* allowed-tools, disable-model-invocation) + body. UNIFORM with every other
|
|
466
|
-
* skill-supporting platform — only the parent dir differs.
|
|
467
|
-
*/
|
|
468
|
-
renderSkill(skill) {
|
|
469
|
-
const frontmatter = {
|
|
470
|
-
name: skill.name,
|
|
471
|
-
description: skill.description
|
|
472
|
-
};
|
|
473
|
-
if (skill.model !== void 0) frontmatter.model = skill.model;
|
|
474
|
-
const allow = skill.tools?.allow;
|
|
475
|
-
if (allow && allow.length > 0) frontmatter["allowed-tools"] = allow.join(", ");
|
|
476
|
-
if (skill.disableModelInvocation !== void 0) {
|
|
477
|
-
frontmatter["disable-model-invocation"] = skill.disableModelInvocation;
|
|
478
|
-
}
|
|
479
|
-
if (skill.extra) Object.assign(frontmatter, skill.extra);
|
|
480
|
-
return this.renderFrontmatterMd(frontmatter, skill.body);
|
|
481
|
-
}
|
|
482
418
|
// ── Runtime: parse Goose stdin JSON → normalized event ───────────────────
|
|
483
419
|
parseEvent(event, raw) {
|
|
484
420
|
const input = raw ?? {};
|
|
@@ -510,7 +446,7 @@ var GooseAdapter = class extends BaseAdapter {
|
|
|
510
446
|
return ev;
|
|
511
447
|
}
|
|
512
448
|
case "SessionStart": {
|
|
513
|
-
const ev = { ...base, source:
|
|
449
|
+
const ev = { ...base, source: normalizeSessionSource(input.source) };
|
|
514
450
|
return ev;
|
|
515
451
|
}
|
|
516
452
|
case "SessionEnd": {
|
|
@@ -619,18 +555,6 @@ function toolResponseToString(value) {
|
|
|
619
555
|
return String(value);
|
|
620
556
|
}
|
|
621
557
|
}
|
|
622
|
-
function normalizeSource(raw) {
|
|
623
|
-
switch (raw) {
|
|
624
|
-
case "compact":
|
|
625
|
-
return "compact";
|
|
626
|
-
case "resume":
|
|
627
|
-
return "resume";
|
|
628
|
-
case "clear":
|
|
629
|
-
return "clear";
|
|
630
|
-
default:
|
|
631
|
-
return "startup";
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
558
|
var adapter = new GooseAdapter();
|
|
635
559
|
var goose_default = adapter;
|
|
636
560
|
export {
|
|
@@ -638,4 +562,4 @@ export {
|
|
|
638
562
|
adapter,
|
|
639
563
|
goose_default as default
|
|
640
564
|
};
|
|
641
|
-
//# sourceMappingURL=goose-
|
|
565
|
+
//# sourceMappingURL=goose-UBJVQFUE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/goose/index.ts"],"sourcesContent":["/**\n * adapters/goose — Block's Goose platform adapter for agent-connector.\n *\n * Goose is a json-stdio host, but its two config surfaces use DIFFERENT formats:\n *\n * - MCP servers (Goose calls them \"extensions\") live in a YAML config under the\n * root key `extensions`. The native stdio entry shape is Goose-specific:\n * { type: \"stdio\", cmd: <exe>, args: [...], envs: {...}, timeout, enabled }\n * NOTE the field is `cmd` (NOT `command`) and the env map is `envs` (NOT\n * `env`). Because the file is YAML, the BaseAdapter JSON helpers do not apply\n * — we merge via core/yaml's readYaml/writeYaml, preserving any other config.\n *\n * - Hooks use Goose's Open Plugins system, which stores hook registrations in\n * JSON at <root>/.agents/plugins/<plugin-name>/hooks/hooks.json (project root\n * = <projectDir>/.agents; user root = ~/.agents):\n * { hooks: { <Event>: [ { matcher?, hooks:[{ type:\"command\", command }] } ] } }\n * The shape is the Claude-style NESTED rule (an optional `matcher` plus an\n * inner `hooks` array), and there is NO top-level `version` key. This file is\n * plain JSON, so the standard fs/JSON helpers are used for it.\n *\n * Wire protocol (parse) is Claude-compatible JSON on stdin, except Goose names\n * the working directory field `working_dir` (not `cwd`). The deny reply is\n * Goose's `{ decision: \"block\", reason }` (NOT Claude's hookSpecificOutput\n * permissionDecision shape).\n *\n * Native config locations (user scope):\n * - Linux/macOS: ~/.config/goose/config.yaml\n * - Windows: %APPDATA%/Block/goose/config/config.yaml\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { BaseAdapter, type HookMergeDescriptor } from \"../base.js\";\nimport type { Adapter, HookReply, InstallContext, MemoryTarget, NormalizedEvent } from \"../spi.js\";\nimport type {\n ChangeRecord,\n DetectedPlatform,\n HealthCheck,\n HookEventName,\n HookParadigm,\n HookResponse,\n NotificationEvent,\n PlatformCapabilities,\n PlatformId,\n PostToolUseEvent,\n PostToolUseFailureEvent,\n PreCompactEvent,\n PreToolUseEvent,\n SessionEndEvent,\n SessionStartEvent,\n ServerDef,\n StopEvent,\n UserPromptSubmitEvent,\n} from \"../../core/types.js\";\nimport { removeFromObjectMap, upsertInObjectMap } from \"../../core/object-map.js\";\nimport { roamingAppData } from \"../../core/host-paths.js\";\nimport { readYaml, yamlObjectMapCodec } from \"../../core/yaml.js\";\nimport { resolveEnvRefsDeep } from \"../../core/interpolate.js\";\nimport {\n buildHomeBinHookCommand,\n buildWrappedStdio,\n isHomeBinHookCommand,\n} from \"../../core/spawn.js\";\nimport { renderSkillMd } from \"../claude-code/render.js\";\nimport { normalizeSessionSource } from \"../claude-code/wire.js\";\n\nconst HOST: PlatformId = \"goose\";\n/** Root key under which Goose stores MCP servers (\"extensions\") in config.yaml. */\nconst MCP_ROOT_KEY = \"extensions\";\n\n/**\n * Map each normalized hook event to the matching capability flag on this\n * adapter. The adapter's own `capabilities` literal is the single source of\n * truth for what Goose's Open-Plugins runtime delivers (PreToolUse/PostToolUse/\n * SessionStart/PostToolUseFailure); installHooks filters declared events\n * through this map so an unsupported event (e.g. UserPromptSubmit) is never\n * written verbatim into hooks.json — it is reported as a graceful warn/skip\n * instead.\n */\nconst EVENT_CAPABILITY: Record<HookEventName, keyof PlatformCapabilities> = {\n SessionStart: \"sessionStart\",\n SessionEnd: \"sessionEnd\",\n UserPromptSubmit: \"userPromptSubmit\",\n PreToolUse: \"preToolUse\",\n PostToolUse: \"postToolUse\",\n PreCompact: \"preCompact\",\n Stop: \"stop\",\n Notification: \"notification\",\n // Newer events. Goose's hooks system ships a dedicated PostToolUseFailure;\n // it has NO permission-dialog or subagent lifecycle events, so those three\n // flags stay unset on `capabilities` and warn-skip at install.\n PermissionRequest: \"permissionRequest\",\n PostToolUseFailure: \"postToolUseFailure\",\n SubagentStart: \"subagentStart\",\n SubagentStop: \"subagentStop\",\n // Goose has no post-compaction hook either — postCompact stays unset on\n // `capabilities`, so a declared PostCompact warn-skips at install.\n PostCompact: \"postCompact\",\n};\n\n/**\n * Goose extension (MCP server) entry — note the Goose-specific field names:\n * `cmd` (not `command`) and `envs` (not `env`).\n */\ninterface GooseStdioExtension {\n type: \"stdio\";\n cmd: string;\n args: string[];\n envs?: Record<string, string>;\n timeout: number;\n enabled: boolean;\n}\n\n/** One inner command entry inside a hook rule. */\ninterface GooseHookCommand {\n type: \"command\";\n command: string;\n}\n\n/**\n * One nested-rule entry under a hook event. Goose's Open Plugins spec uses the\n * Claude-shaped nested rule: an optional `matcher` plus an inner `hooks` array\n * of `{ type, command }` commands (NOT a flat list of commands).\n */\ninterface GooseHookRule {\n matcher?: string;\n hooks: GooseHookCommand[];\n}\n\n/**\n * Goose Open-Plugins hooks.json shape: `{ hooks: { <Event>: [ rule, ... ] } }`.\n * There is NO top-level `version` key in the spec.\n */\ninterface GooseHooksFile {\n hooks: Record<string, GooseHookRule[]>;\n}\n\n/** Raw Goose hook stdin payload (Claude-compatible JSON). */\ninterface GooseWireInput {\n session_id?: string;\n /** Goose names the working directory `working_dir`; `cwd` is a fallback. */\n working_dir?: string;\n cwd?: string;\n hook_event_name?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_response?: unknown;\n // PostToolUseFailure (Claude-compatible failure fields)\n tool_use_id?: string;\n error?: string;\n is_interrupt?: boolean;\n duration_ms?: number;\n source?: string;\n reason?: string;\n prompt?: string;\n trigger?: string;\n stop_hook_active?: boolean;\n message?: string;\n is_error?: boolean;\n /** Injected by the entrypoint so the runtime knows which connector to dispatch. */\n connector?: string;\n}\n\nexport class GooseAdapter extends BaseAdapter implements Adapter {\n readonly id: PlatformId = HOST;\n readonly name = \"Goose\";\n readonly paradigm: HookParadigm = \"json-stdio\";\n\n readonly capabilities: PlatformCapabilities = {\n // Memory surface: AGENTS.md-first managed block (project <projectDir>/AGENTS.md\n // via the base default — goose reads AGENTS.md AND .goosehints at each level,\n // .goosehints left untouched; user scope → the global .goosehints below).\n supportsMemory: true,\n preToolUse: true,\n postToolUse: true,\n preCompact: false,\n sessionStart: true,\n // Goose's Open Plugins runtime fires SessionEnd / UserPromptSubmit / Stop\n // (goose-docs.ai/blog/2026/05/14/goose-hooks/); parseEvent + the wire types\n // already handle all three, so they are wired (were incorrectly gated false).\n sessionEnd: true,\n userPromptSubmit: true,\n stop: true,\n notification: false,\n // Newer events: Goose ships a dedicated PostToolUseFailure hook (feedback\n // beside the error; the failure itself is not blockable). Goose has no\n // permission-dialog event and no subagent lifecycle hooks, so\n // permissionRequest / subagentStart / subagentStop stay unset — install\n // reports the standard skip-warn for them.\n postToolUseFailure: true,\n // Open Plugins documents PreToolUse/PostToolUse/SessionStart; argument\n // rewrite is not guaranteed across versions, so default to the safe value.\n canModifyArgs: false,\n canModifyOutput: false,\n canInjectSessionContext: true,\n transports: [\"stdio\", \"sse\", \"http\"],\n // Content surfaces: goose reads SKILL.md from the cross-agent .agents dir\n // skill → <projectDir>/.agents/skills/<name>/SKILL.md (project)\n // skill → ~/.agents/skills/<name>/SKILL.md (user)\n // (NOT ~/.config/goose). Commands/subagents have no confirmed native dir, so\n // those flags stay unset and warn-skip via the BaseAdapter default.\n supportsSkills: true,\n };\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n detectInstalled(_projectDir: string): DetectedPlatform {\n const configPath = this.userConfigPath();\n const configDir = dirname(configPath);\n const installed = existsSync(configDir) || existsSync(configPath);\n return {\n id: this.id,\n name: this.name,\n installed,\n paradigm: this.paradigm,\n capabilities: this.capabilities,\n configPath,\n scope: \"user\",\n reason: installed\n ? `found Goose config at ${configPath}`\n : `no Goose config at ${configPath}`,\n confidence: installed ? \"high\" : \"low\",\n };\n }\n\n // ── Native paths ─────────────────────────────────────────────────────────\n\n override getConfigDir(_ctx: InstallContext): string {\n return dirname(this.userConfigPath());\n }\n\n /** MCP config: the YAML config.yaml (user scope). */\n override getServerConfigPath(_ctx: InstallContext): string {\n return this.userConfigPath();\n }\n\n /**\n * Hooks: Open-Plugins hooks.json under the `.agents/plugins/<plugin-name>/`\n * dir. The connector id is the plugin name. Project scope roots at\n * `<projectDir>/.agents`; user scope roots at `~/.agents`.\n */\n override getHookConfigPath(ctx: InstallContext): string {\n const root = ctx.scope === \"project\" ? ctx.projectDir : homedir();\n return join(root, \".agents\", \"plugins\", ctx.connector.id, \"hooks\", \"hooks.json\");\n }\n\n /**\n * OS-correct user config.yaml path:\n * - Windows: %APPDATA%/Block/goose/config/config.yaml\n * - macOS/Linux: ~/.config/goose/config.yaml\n */\n private userConfigPath(): string {\n if (process.platform === \"win32\") {\n return join(roamingAppData(), \"Block\", \"goose\", \"config\", \"config.yaml\");\n }\n return join(homedir(), \".config\", \"goose\", \"config.yaml\");\n }\n\n // ── Memory surface: global .goosehints at user scope ────────────────────\n // Project scope stays on the AGENTS.md base default (goose reads project\n // AGENTS.md and .goosehints at each level by default — one canonical copy in\n // the standard file; the user's .goosehints is never touched). User scope:\n // goose's only documented global memory file is the .goosehints next to\n // config.yaml (~/.config/goose/.goosehints; Windows under\n // %APPDATA%\\Block\\goose\\config — adapter-corroborated, verify per version).\n protected override memoryTargets(ctx: InstallContext): MemoryTarget[] {\n if (this.memoryOverride(ctx)?.path || ctx.scope !== \"user\") {\n return super.memoryTargets(ctx);\n }\n return [\n {\n path: join(dirname(this.userConfigPath()), \".goosehints\"),\n reason: \"goose global hints file (.goosehints beside config.yaml)\",\n },\n ];\n }\n\n // ── MCP server install / uninstall (YAML — merge via readYaml/writeYaml) ──\n\n override installServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n const server = this.effectiveServer(ctx);\n\n if (!server) {\n return [\n {\n platform: this.id,\n action: \"skip\",\n path,\n detail: connector.server\n ? \"server registration disabled for goose\"\n : \"connector declares no MCP server\",\n },\n ];\n }\n\n const entry = this.renderExtension(ctx, server);\n\n // Merge into existing YAML, preserving every other config key + extension.\n return [\n upsertInObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n entry,\n dryRun,\n }),\n ];\n }\n\n override uninstallServer(ctx: InstallContext): ChangeRecord[] {\n const { connector, dryRun } = ctx;\n const path = this.getServerConfigPath(ctx);\n return [\n removeFromObjectMap({\n codec: yamlObjectMapCodec(),\n rootKey: MCP_ROOT_KEY,\n policy: \"coerce\",\n platform: this.id,\n configPath: path,\n entryId: connector.id,\n dryRun,\n }),\n ];\n }\n\n /**\n * Render a normalized ServerDef into Goose's native extension entry. Goose has\n * no native env interpolation, so `${env:VAR}` refs are resolved to literals at\n * install time. Honors the telemetry serve-wrapper (cmd=homeBin, args=[serve…]).\n */\n private renderExtension(ctx: InstallContext, server: ServerDef): GooseStdioExtension {\n let cmd = server.command ?? \"\";\n let args = [...(server.args ?? [])];\n\n ({ command: cmd, args } = buildWrappedStdio(ctx, server, this.id, cmd, args));\n\n cmd = resolveEnvRefsDeep(cmd);\n args = resolveEnvRefsDeep(args);\n\n const timeoutMs = server.timeoutMs;\n const timeout =\n typeof timeoutMs === \"number\" && timeoutMs > 0 ? Math.round(timeoutMs / 1000) : 300;\n\n const entry: GooseStdioExtension = {\n type: \"stdio\",\n cmd,\n args,\n timeout,\n enabled: server.enabled !== false,\n };\n\n if (server.env && Object.keys(server.env).length > 0) {\n const envs: Record<string, string> = {};\n for (const [k, v] of Object.entries(resolveEnvRefsDeep(server.env))) {\n envs[k] = String(v);\n }\n entry.envs = envs;\n }\n return entry;\n }\n\n // ── Hook install / uninstall (JSON Open-Plugins hooks.json) ───────────────\n\n override installHooks(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n const path = this.getHookConfigPath(ctx);\n\n if (connector.platforms[HOST]?.hooks === false) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"hooks disabled for goose\" }];\n }\n if (connector.hookEvents.length === 0) {\n return [{ platform: this.id, action: \"skip\", path, detail: \"connector declares no hooks\" }];\n }\n\n const pending = connector.hookEvents.map((event) => ({\n event,\n matcher: connector.hooks[event]?.matcher ?? \"\",\n }));\n return this.upsertHookEntries(ctx, path, pending, this.hookDescriptor(ctx));\n }\n\n override uninstallHooks(ctx: InstallContext): ChangeRecord[] {\n return this.removeHookEntries(ctx, this.getHookConfigPath(ctx), this.hookDescriptor(ctx));\n }\n\n /**\n * Goose's hook-merge descriptor for the shared object-map engine. Goose's hook\n * file is the DEDICATED per-connector `.agents/plugins/<id>/hooks/hooks.json`\n * (NESTED rule shape `{ matcher?, hooks:[{type,command}] }`), so every\n * observable string + ownership predicate is carried here to reproduce the\n * prior in-adapter loop byte-for-byte:\n * - malformedPolicy \"coerce\" — a present-but-malformed `hooks` root (array /\n * primitive, hand-edited) and a non-array event bucket are coerced to fresh\n * containers, matching the old readHooksFile coerce + the `??=` bucket fill.\n * - mapEvent = the CAPABILITY FILTER: an event Goose's Open-Plugins runtime\n * does not deliver (e.g. UserPromptSubmit, PreCompact) maps to undefined →\n * the engine emits the `<event> unsupported on goose — skipped` warn and\n * never writes it; supported events map to themselves (identity).\n * - entryOwnsCommand is connector-GENERIC (ANY of our commands in the nested\n * inner `hooks`) — the old ruleHasOurCommand.\n * - uninstall is NESTED: ownsEntryForRemove is never-true so the engine only\n * runs stripInner — strip our owned inner commands, keep foreign ones, drop\n * emptied rules. The rebuilt rule OMITS `matcher` when it was undefined\n * (distinct from claude/droid/qwen, which always emit a matcher); `removed`\n * is the inner-command count, surfaced in the `(<n>)` remove detail.\n */\n private hookDescriptor(ctx: InstallContext): HookMergeDescriptor<GooseHookRule> {\n return {\n malformedPolicy: \"coerce\",\n // CAPABILITY FILTER → identity-or-undefined: supported events map to\n // themselves; an unsupported one (capability !== true) maps to undefined,\n // routing it to the warn-skip path.\n mapEvent: (e) =>\n this.capabilities[EVENT_CAPABILITY[e as HookEventName]] === true ? e : undefined,\n unmappedWarnDetail: (e) => `${e} unsupported on goose — skipped`,\n // NESTED rule, matcher-FIRST key order (matches the old `desired`).\n renderEntry: (_event, matcher, command) => ({\n matcher,\n hooks: [{ type: \"command\", command }],\n }),\n // Connector-generic find (= the old ruleHasOurCommand): ANY inner command ours.\n entryOwnsCommand: (rule, _command) =>\n (rule.hooks ?? []).some((h) => this.isOurCommand(h.command, ctx)),\n // NESTED: never drop a whole rule; inner-strip only.\n ownsEntryForRemove: () => () => false,\n stripInner: (c) => (rule) => {\n const innerBefore = rule.hooks?.length ?? 0;\n const inner = (rule.hooks ?? []).filter((h) => !this.isOurCommand(h.command, c));\n return {\n // MATCHER-OMITTED-WHEN-UNDEFINED: reproduce the old rebuild exactly —\n // key order is `matcher` (only when present) then `hooks`.\n next:\n inner.length > 0\n ? { ...(rule.matcher !== undefined ? { matcher: rule.matcher } : {}), hooks: inner }\n : null,\n removed: innerBefore - inner.length,\n };\n },\n skipDetail: (e) => `hooks.${e}`,\n removeDetail: (e, n) => `hooks.${e} (${n})`,\n absentDetail: \"no hooks.json\",\n noMatchDetail: \"no matching hook entries\",\n };\n }\n\n /** True when a hook command is ours (anchored home-bin + connector id). */\n private isOurCommand(command: string | undefined, ctx: InstallContext): boolean {\n return isHomeBinHookCommand(command, ctx.homeBinPath, ctx.connector.id);\n }\n\n // ── Diagnostics ──────────────────────────────────────────────────────────\n\n override getHealthChecks(ctx: InstallContext): readonly HealthCheck[] {\n const serverPath = this.getServerConfigPath(ctx);\n const hookPath = this.getHookConfigPath(ctx);\n const id = ctx.connector.id;\n const homeBin = ctx.homeBinPath;\n const hookEvents = ctx.connector.hookEvents;\n const checks: HealthCheck[] = [\n {\n name: `${this.name}: config.yaml present`,\n check: () =>\n existsSync(serverPath)\n ? { status: \"OK\", detail: serverPath }\n : { status: \"FAIL\", detail: `not found: ${serverPath}` },\n },\n {\n name: `${this.name}: ${MCP_ROOT_KEY}.${id} registered`,\n check: () => {\n if (!ctx.connector.server) return { status: \"OK\", detail: \"no MCP server declared\" };\n const cfg = readYaml<Record<string, unknown>>(serverPath);\n const bucket = cfg?.[MCP_ROOT_KEY];\n const present =\n typeof bucket === \"object\" &&\n bucket !== null &&\n !Array.isArray(bucket) &&\n id in (bucket as Record<string, unknown>);\n return present\n ? { status: \"OK\", detail: `${MCP_ROOT_KEY}.${id}` }\n : { status: \"FAIL\", detail: `${MCP_ROOT_KEY}.${id} not found in ${serverPath}` };\n },\n },\n {\n name: `${this.name}: hook command registered`,\n check: () => {\n if (hookEvents.length === 0) return { status: \"OK\", detail: \"no hooks declared\" };\n const file = this.readJson<GooseHooksFile>(hookPath);\n if (!file || !file.hooks) {\n return { status: \"FAIL\", detail: `cannot read ${hookPath}` };\n }\n const registered = Object.values(file.hooks).some((bucket) =>\n (bucket ?? []).some((rule) =>\n (rule.hooks ?? []).some((h) => isHomeBinHookCommand(h.command, homeBin, id)),\n ),\n );\n return registered\n ? { status: \"OK\", detail: \"hook command present\" }\n : { status: \"FAIL\", detail: `no hook for ${id} in ${hookPath}` };\n },\n },\n ];\n\n // Content-surface checks: assert presence only for skills this connector\n // declares (goose skills live under the .agents skills dir at either scope).\n for (const skill of ctx.connector.skills) {\n const p = join(this.skillDir(ctx, skill.name), \"SKILL.md\");\n checks.push({\n name: `${this.name}: skill ${skill.name} present`,\n check: () =>\n existsSync(p) ? { status: \"OK\", detail: p } : { status: \"FAIL\", detail: `not found: ${p}` },\n });\n }\n return checks;\n }\n\n // ── Content surface: skills ───────────────────────────────────────────────\n // CONTENT-ONLY: pure native-file writer. No runtime dispatch, no home-bin\n // pointer, no telemetry wrap. Idempotent (byte-identical → skip) via\n // writeContentFile and reversible via removeContentFile + removeDirIfEmpty.\n // Honors platforms[\"goose\"].skills === false to skip.\n //\n // goose reads SKILL.md from the cross-agent .agents dir (NOT ~/.config/goose):\n // project scope → <projectDir>/.agents/skills/<name>/SKILL.md\n // user scope → ~/.agents/skills/<name>/SKILL.md\n\n private skillsDir(ctx: InstallContext): string {\n return ctx.scope === \"project\"\n ? join(ctx.projectDir, \".agents\", \"skills\")\n : join(homedir(), \".agents\", \"skills\");\n }\n\n private skillDir(ctx: InstallContext, name: string): string {\n return join(this.skillsDir(ctx), name);\n }\n\n override installSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.platforms[HOST]?.skills === false) {\n return [{ platform: this.id, action: \"skip\", detail: \"skills disabled for goose\" }];\n }\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n changes.push(\n this.writeContentFile(join(dir, \"SKILL.md\"), renderSkillMd(skill), ctx.dryRun),\n );\n // Bundle any resource files beside SKILL.md (relative path → contents).\n // Defense-in-depth: skip+warn on any key that escapes the skill dir\n // (config-time validation already rejects these, but never trust input).\n for (const [rel, contents] of Object.entries(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) {\n changes.push({\n platform: this.id,\n action: \"warn\",\n detail: `skill resource \"${rel}\" escapes the skill dir; skipped`,\n });\n continue;\n }\n changes.push(this.writeContentFile(target, contents, ctx.dryRun));\n }\n }\n return changes;\n }\n\n override uninstallSkills(ctx: InstallContext): ChangeRecord[] {\n const { connector } = ctx;\n if (connector.skills.length === 0) {\n return [{ platform: this.id, action: \"skip\", detail: \"connector declares no skills\" }];\n }\n const changes: ChangeRecord[] = [];\n for (const skill of connector.skills) {\n const dir = this.skillDir(ctx, skill.name);\n // Remove only the files we wrote (SKILL.md + declared resources), then the\n // skill dir itself when we own its full contents.\n changes.push(this.removeContentFile(join(dir, \"SKILL.md\"), ctx.dryRun));\n for (const rel of Object.keys(skill.resources ?? {})) {\n const target = this.resolveWithin(dir, rel);\n if (target === null) continue; // never delete outside the skill dir\n changes.push(this.removeContentFile(target, ctx.dryRun));\n }\n // Only remove the skill dir when WE own its full contents — never rm -rf a\n // dir that still holds user-added / sibling-tool / shared files.\n changes.push(this.removeDirIfEmpty(dir, ctx.dryRun));\n }\n return changes;\n }\n\n // ── Runtime: parse Goose stdin JSON → normalized event ───────────────────\n\n parseEvent(event: HookEventName, raw: unknown): NormalizedEvent {\n const input = (raw ?? {}) as GooseWireInput;\n // Goose sends the working directory as `working_dir`; fall back to `cwd`.\n const projectDir =\n typeof input.working_dir === \"string\"\n ? input.working_dir\n : typeof input.cwd === \"string\"\n ? input.cwd\n : undefined;\n const base = {\n hostPlatform: HOST,\n connectorId: typeof input.connector === \"string\" ? input.connector : \"\",\n sessionId: typeof input.session_id === \"string\" ? input.session_id : \"\",\n ...(projectDir !== undefined ? { projectDir } : {}),\n raw,\n } as const;\n\n switch (event) {\n case \"PreToolUse\": {\n const ev: PreToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n };\n return ev;\n }\n case \"PostToolUse\": {\n const ev: PostToolUseEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n ...(toolResponseToString(input.tool_response) !== undefined\n ? { toolOutput: toolResponseToString(input.tool_response) }\n : {}),\n ...(typeof input.is_error === \"boolean\" ? { isError: input.is_error } : {}),\n };\n return ev;\n }\n case \"SessionStart\": {\n const ev: SessionStartEvent = { ...base, source: normalizeSessionSource(input.source) };\n return ev;\n }\n case \"SessionEnd\": {\n const ev: SessionEndEvent = {\n ...base,\n ...(typeof input.reason === \"string\" ? { reason: input.reason } : {}),\n };\n return ev;\n }\n case \"UserPromptSubmit\": {\n const ev: UserPromptSubmitEvent = {\n ...base,\n prompt: typeof input.prompt === \"string\" ? input.prompt : \"\",\n };\n return ev;\n }\n case \"PreCompact\": {\n const ev: PreCompactEvent = {\n ...base,\n ...(input.trigger === \"auto\" || input.trigger === \"manual\"\n ? { trigger: input.trigger }\n : {}),\n };\n return ev;\n }\n case \"Stop\": {\n const ev: StopEvent = {\n ...base,\n ...(typeof input.stop_hook_active === \"boolean\"\n ? { stopHookActive: input.stop_hook_active }\n : {}),\n };\n return ev;\n }\n case \"Notification\": {\n const ev: NotificationEvent = {\n ...base,\n message: typeof input.message === \"string\" ? input.message : \"\",\n };\n return ev;\n }\n case \"PostToolUseFailure\": {\n const ev: PostToolUseFailureEvent = {\n ...base,\n toolName: input.tool_name ?? \"\",\n toolInput: input.tool_input ?? {},\n error: typeof input.error === \"string\" ? input.error : \"\",\n ...(typeof input.tool_use_id === \"string\"\n ? { toolUseId: input.tool_use_id }\n : {}),\n ...(typeof input.is_interrupt === \"boolean\"\n ? { isInterrupt: input.is_interrupt }\n : {}),\n ...(typeof input.duration_ms === \"number\"\n ? { durationMs: input.duration_ms }\n : {}),\n };\n return ev;\n }\n case \"PermissionRequest\":\n case \"SubagentStart\":\n case \"SubagentStop\":\n case \"PostCompact\": {\n // No Goose analog (no permission-dialog event, no subagent lifecycle\n // hooks, no post-compaction hook). Install already skip-warns these via\n // EVENT_CAPABILITY; a runtime dispatch is a mis-route — fail loudly.\n throw new Error(`unsupported goose hook event: ${String(event)}`);\n }\n default: {\n const _never: never = event;\n throw new Error(`unsupported goose hook event: ${String(_never)}`);\n }\n }\n }\n\n // ── Runtime: normalized response → Goose native hook reply (Claude-shaped) ─\n\n formatReply(event: HookEventName, response: HookResponse): HookReply {\n const decision = response.decision ?? \"allow\";\n\n // PostToolUseFailure is feedback-only (the tool already failed, nothing is\n // blockable): \"context\" injects additionalContext beside the error, and a\n // \"deny\" DEGRADES to the same shape carrying the reason — it must never\n // render as `{ decision: \"block\" }`.\n if (event === \"PostToolUseFailure\") {\n const context =\n decision === \"context\"\n ? response.additionalContext\n : decision === \"deny\"\n ? response.reason ?? response.additionalContext\n : undefined;\n if (context) return this.stdout({ additionalContext: context });\n return { exitCode: 0 };\n }\n\n // deny → Goose blocks via `{ decision: \"block\", reason }` on stdout JSON\n // (NOT Claude's hookSpecificOutput.permissionDecision shape).\n if (decision === \"deny\") {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Blocked by hook\",\n });\n }\n\n // ask → Goose has no native \"ask\"; degrade to block to stay fail-safe.\n if (decision === \"ask\") {\n return this.stdout({\n decision: \"block\",\n reason: response.reason ?? \"Confirmation required by hook\",\n });\n }\n\n if (decision === \"context\" && response.additionalContext) {\n return this.stdout({ additionalContext: response.additionalContext });\n }\n\n // allow / modify (unsupported) / void → pass through.\n return { exitCode: 0 };\n }\n\n private stdout(payload: unknown): HookReply {\n return { exitCode: 0, stdout: JSON.stringify(payload) };\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Resolve the per-platform server override into an effective ServerDef. */\n private effectiveServer(ctx: InstallContext): ServerDef | undefined {\n const override = ctx.connector.platforms[this.id]?.server;\n if (override === false) return undefined;\n const base = ctx.connector.server;\n if (!base) return undefined;\n return override && typeof override === \"object\" ? { ...base, ...override } : base;\n }\n}\n\n/** Coerce a Goose PostToolUse `tool_response` into a string. */\nfunction toolResponseToString(value: unknown): string | undefined {\n if (value == null) return undefined;\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const adapter = new GooseAdapter();\nexport default adapter;\n"],"mappings":"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","names":[]}
|