@ketd/gemini-cli-sdk 0.1.0 → 0.1.1
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/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -93,7 +93,7 @@ function buildCliArgs(options, prompt) {
|
|
|
93
93
|
if (options.debug) {
|
|
94
94
|
args.push("--debug");
|
|
95
95
|
}
|
|
96
|
-
args.push(
|
|
96
|
+
args.push(prompt);
|
|
97
97
|
return args;
|
|
98
98
|
}
|
|
99
99
|
function buildEnv(options) {
|
|
@@ -102,7 +102,7 @@ function buildEnv(options) {
|
|
|
102
102
|
...options.env
|
|
103
103
|
};
|
|
104
104
|
if (options.apiKey) {
|
|
105
|
-
env.
|
|
105
|
+
env.GEMINI_API_KEY = options.apiKey;
|
|
106
106
|
}
|
|
107
107
|
if (options.debug) {
|
|
108
108
|
env.DEBUG = "1";
|
|
@@ -113,9 +113,9 @@ async function* query(prompt, options) {
|
|
|
113
113
|
if (!options.pathToGeminiCLI) {
|
|
114
114
|
throw new GeminiSDKError("pathToGeminiCLI is required");
|
|
115
115
|
}
|
|
116
|
-
if (!options.apiKey && !process.env.
|
|
116
|
+
if (!options.apiKey && !process.env.GEMINI_API_KEY) {
|
|
117
117
|
throw new GeminiSDKError(
|
|
118
|
-
"apiKey is required (or set
|
|
118
|
+
"apiKey is required (or set GEMINI_API_KEY environment variable)"
|
|
119
119
|
);
|
|
120
120
|
}
|
|
121
121
|
const args = buildCliArgs(options, prompt);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/query.ts","../src/client.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus","spawn","readline","EventEmitter","fs","path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoGO,IAAK,mBAAA,qBAAAA,oBAAAA,KAAL;AAEL,EAAAA,qBAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,qBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,qBAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,qBAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,qBAAA,QAAA,CAAA,GAAS,QAAA;AAjBC,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAsHL,IAAK,QAAA,qBAAAC,SAAAA,KAAL;AAEL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,mBAAgB,CAAA,CAAA,GAAhB,eAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAGA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,sBAAmB,GAAA,CAAA,GAAnB,kBAAA;AAXU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAiBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AAGZ,EAAAA,eAAA,WAAA,CAAA,GAAY,WAAA;AAGZ,EAAAA,eAAA,OAAA,CAAA,GAAQ,OAAA;AAdE,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAoBL,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,KAAA,CAAM;AAAA,EACxC,WAAA,CACE,OAAA,EACO,IAAA,EACA,OAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHN,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,eAAc,CAAA;AAAA,EAC9C;AACF;;;AC3PA,SAAS,YAAA,CAAa,SAAwB,MAAA,EAA0B;AACtE,EAAA,MAAM,OAAiB,EAAC;AAGxB,EAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,aAAa,CAAA;AAG1C,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,OAAA,CAAQ,YAAY,CAAA;AAAA,EACnD;AAGA,EAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,OAAA,CAAQ,qBAAA,IAAyB,OAAA,CAAQ,qBAAA,CAAsB,SAAS,CAAA,EAAG;AAC7E,IAAA,IAAA,CAAK,KAAK,4BAAA,EAA8B,OAAA,CAAQ,qBAAA,CAAsB,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,eAAe,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,OAAA,CAAQ,kBAAA,IAAsB,OAAA,CAAQ,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACvE,IAAA,IAAA,CAAK,KAAK,uBAAA,EAAyB,OAAA,CAAQ,kBAAA,CAAmB,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACzE;AAGA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,EACrB;AAGA,EAAA,IAAA,CAAK,IAAA,CAAK,MAAM,MAAM,CAAA;AAEtB,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,SAAS,OAAA,EAA2C;AAC3D,EAAA,MAAM,GAAA,GAAyB;AAAA,IAC7B,GAAG,OAAA,CAAQ,GAAA;AAAA,IACX,GAAG,OAAA,CAAQ;AAAA,GACb;AAGA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,GAAA,CAAI,iBAAiB,OAAA,CAAQ,MAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,GAAA,CAAI,KAAA,GAAQ,GAAA;AAAA,EACd;AAEA,EAAA,OAAO,GAAA;AACT;AA0BA,gBAAuB,KAAA,CACrB,QACA,OAAA,EACiC;AAEjC,EAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,IAAA,MAAM,IAAI,eAAe,6BAA6B,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAA,CAAQ,IAAI,cAAA,EAAgB;AAClD,IAAA,MAAM,IAAI,cAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA;AACzC,EAAA,MAAM,GAAA,GAAM,SAAS,OAAO,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAGvC,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgBC,oBAAM,MAAA,EAAQ,CAAC,QAAQ,eAAA,EAAiB,GAAG,IAAI,CAAA,EAAG;AAAA,MAChE,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC9B,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,oCAAA,EAAsC,MAAA,EAAW,KAAK,CAAA;AAAA,EACjF;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,aAAA,CAAc,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACjD,IAAA,YAAA,CAAa,KAAK,IAAI,CAAA;AACtB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,OAAA,CAAQ,KAAA,CAAM,sBAAA,EAAwB,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,IACvD;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,IAC9B,CAAA,EAAG,QAAQ,OAAO,CAAA;AAAA,EACpB;AAGA,EAAA,MAAM,KAAcC,mBAAA,CAAA,eAAA,CAAgB;AAAA,IAClC,OAAO,aAAA,CAAc,MAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,IAAI;AAEF,IAAA,WAAA,MAAiB,QAAQ,EAAA,EAAI;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,MAAM,KAAA;AAAA,MACR,SAAS,UAAA,EAAY;AAEnB,QAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,UAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,IAAI,CAAA;AAC7D,UAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,UAAU,CAAA;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,cAAA,CAAe,uCAAA,EAAyC,MAAA,EAAW,KAAK,CAAA;AAAA,EACpF,CAAA,SAAE;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,MAAM,WAAW,MAAM,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AAC9D,IAAA,aAAA,CAAc,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,KAAW;AACzC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAA;AAAA,UACE,IAAI,cAAA;AAAA,YACF,6CAA6C,MAAM,CAAA,CAAA;AAAA,YAAA,GAAA;AAAA;AAErD,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,IAAA,CAAA,qBAA8B;AAAA,MACxC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,aAAA,CAAc,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACnC,MAAA,MAAA,CAAO,IAAI,cAAA,CAAe,0BAAA,EAA4B,MAAA,EAAW,KAAK,CAAC,CAAA;AAAA,IACzE,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAGD,EAAA,IAAI,QAAA,KAAA,CAAA,gBAA+B;AACjC,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AAC1D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA,4BAAA,EAA+B,QAAQ,CAAA,EAAG,YAAA,GAAe;AAAA,EAAK,YAAY,KAAK,EAAE,CAAA,CAAA;AAAA,MACjF,QAAA;AAAA,MACA,EAAE,QAAQ,YAAA;AAAa,KACzB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,YAAY,EAAE,QAAA,EAAS;AAC1D,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,oCAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,QAAQ,YAAA;AAAa,KACzB;AAAA,EACF;AACF;AC9LO,IAAM,YAAA,GAAN,cAA2BC,mBAAA,CAAa;AAAA,EAI7C,YAAoB,OAAA,EAAwB;AAC1C,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAEpB;AAAA,EALQ,MAAA,GAAA,MAAA;AAAA,EACA,gBAAA,GAAkC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY1C,OAAO,OAAO,MAAA,EAAiD;AAC7D,IAAA,IAAA,CAAK,MAAA,GAAA,SAAA;AACL,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAE/B,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAErD,QAAA,IAAI,MAAM,IAAA,KAAA,MAAA,aAAmC;AAC3C,UAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,UAAA;AAC9B,UAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,KAAA,CAAM,UAAU,CAAA;AAAA,QACvC;AAGA,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAGxB,QAAA,MAAM,KAAA;AAGN,QAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAAqC;AAC7C,UAAA,IAAA,CAAK,MAAA,GACH,MAAM,MAAA,KAAW,SAAA,GAAA,WAAA,mBAAA,OAAA;AACnB,UAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,MAAA,GAAA,OAAA;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,MAAA,EAAsC;AAChD,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,SAAA,EAAW,EAAA;AAAA,MACX,KAAA,EAAO,EAAA;AAAA,MACP,QAAA,EAAU,EAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAQvB;AAEF,IAAA,WAAA,MAAiB,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AAC7C,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAA,MAAA;AACE,UAAA,MAAA,CAAO,YAAY,KAAA,CAAM,UAAA;AACzB,UAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACrB,UAAA;AAAA,QAEF,KAAA,SAAA;AACE,UAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,YAAA,MAAA,CAAO,YAAY,KAAA,CAAM,OAAA;AAAA,UAC3B;AACA,UAAA;AAAA,QAEF,KAAA,UAAA;AACE,UAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAA,EAAS;AAAA,YAC9B,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,YAAY,KAAA,CAAM;AAAA,WACnB,CAAA;AACD,UAAA;AAAA,QAEF,KAAA,aAAA;AACE,UAAA;AACE,YAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/C,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,QAAA,CAAS,MAAA,GAAS,KAAA;AAClB,cAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,gBACpB,WAAW,QAAA,CAAS,SAAA;AAAA,gBACpB,SAAS,QAAA,CAAS,OAAA;AAAA,gBAClB,YAAY,QAAA,CAAS,UAAA;AAAA,gBACrB,MAAA,EAAQ;AAAA,kBACN,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,OAAO,KAAA,CAAM;AAAA;AACf,eACD,CAAA;AAAA,YACH;AAAA,UACF;AACA,UAAA;AAAA,QAEF,KAAA,QAAA;AACE,UAAA,MAAA,CAAO,SAAS,KAAA,CAAM,MAAA;AACtB,UAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AACrB,UAAA,IAAI,MAAM,KAAA,EAAO;AACf,YAAA,MAAA,CAAO,QAAQ,KAAA,CAAM,KAAA;AAAA,UACvB;AACA,UAAA;AAAA,QAEF,KAAA,OAAA;AAEE,UAAA,IAAA,CAAK,IAAA,CAAK,WAAW,KAAK,CAAA;AAC1B,UAAA;AAAA;AACJ,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAAuC;AAChD,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,OAAA,EAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAsC;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC3B;AACF;ACrLO,SAAS,aAAA,CAAc,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAW;AAEjE,EAAA,IAAI,OAAA,CAAQ,IAAI,eAAA,EAAiB;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,eAAA;AAC5B,IAAA,IAAOC,aAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,YAAiBC,eAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,SAAA,EAAW,YAAA,EAAc,UAAU,WAAW,CAAA;AAC/F,EAAA,IAAOD,aAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IAAI,UAAA,GAAa,GAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,UAAA,GAAkBC,eAAA,CAAA,IAAA;AAAA,MACtB,UAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAOD,aAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAiBC,wBAAQ,UAAU,CAAA;AACzC,IAAA,IAAI,cAAc,UAAA,EAAY;AAC9B,IAAA,UAAA,GAAa,SAAA;AAAA,EACf;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR;AAAA,GACF;AACF;AAQO,SAAS,eAAe,MAAA,EAA0B;AACvD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,cAAA;AAC3B,IAAA,OAAO,CAAC,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA;AACzB;AASO,SAAS,UAAU,MAAA,EAAyB;AACjD,EAAA,MAAM,GAAA,GAAM,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,cAAc,KAAA,EAAwB;AACpD,EAAA,MAAM,YAAA,GAAe,sBAAA;AACrB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,EAC7E;AAEA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,GAAG,EAAE,CAAA,EAAA,CAAA;AAAA,EACd;AACA,EAAA,IAAI,KAAK,GAAA,EAAO;AACd,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAK,CAAA;AACrC,EAAA,MAAM,OAAA,GAAA,CAAY,EAAA,GAAK,GAAA,GAAS,GAAA,EAAM,QAAQ,CAAC,CAAA;AAC/C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAC/B;AAQO,SAAS,aAAa,MAAA,EAAwB;AACnD,EAAA,OAAO,OAAO,cAAA,EAAe;AAC/B","file":"index.cjs","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Google AI API Key\n * Can also be set via GOOGLE_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request */\n TOOL_USE = 'tool_use',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolResultEvent\n | ErrorEvent\n | ResultEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n Error.captureStackTrace(this, GeminiSDKError);\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt\n args.push('--', prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // API Key\n if (options.apiKey) {\n env.GOOGLE_API_KEY = options.apiKey;\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GOOGLE_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GOOGLE_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options);\n const cwd = options.cwd || process.cwd();\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn('node', [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n if (options.debug) {\n console.error('[Gemini CLI stderr]:', data.toString());\n }\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n if (options.debug) {\n console.error('[Gemini SDK] Failed to parse JSON line:', line);\n console.error('[Gemini SDK] Parse error:', parseError);\n }\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n console.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/query.ts","../src/client.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus","spawn","readline","EventEmitter","fs","path"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request */\n TOOL_USE = 'tool_use',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolResultEvent\n | ErrorEvent\n | ResultEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n Error.captureStackTrace(this, GeminiSDKError);\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt (no -- needed)\n args.push(prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // API Key - Gemini CLI requires GEMINI_API_KEY\n if (options.apiKey) {\n env.GEMINI_API_KEY = options.apiKey;\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GEMINI_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GEMINI_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options);\n const cwd = options.cwd || process.cwd();\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn('node', [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n if (options.debug) {\n console.error('[Gemini CLI stderr]:', data.toString());\n }\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n if (options.debug) {\n console.error('[Gemini SDK] Failed to parse JSON line:', line);\n console.error('[Gemini SDK] Parse error:', parseError);\n }\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n console.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|
package/dist/index.d.cts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -69,7 +69,7 @@ function buildCliArgs(options, prompt) {
|
|
|
69
69
|
if (options.debug) {
|
|
70
70
|
args.push("--debug");
|
|
71
71
|
}
|
|
72
|
-
args.push(
|
|
72
|
+
args.push(prompt);
|
|
73
73
|
return args;
|
|
74
74
|
}
|
|
75
75
|
function buildEnv(options) {
|
|
@@ -78,7 +78,7 @@ function buildEnv(options) {
|
|
|
78
78
|
...options.env
|
|
79
79
|
};
|
|
80
80
|
if (options.apiKey) {
|
|
81
|
-
env.
|
|
81
|
+
env.GEMINI_API_KEY = options.apiKey;
|
|
82
82
|
}
|
|
83
83
|
if (options.debug) {
|
|
84
84
|
env.DEBUG = "1";
|
|
@@ -89,9 +89,9 @@ async function* query(prompt, options) {
|
|
|
89
89
|
if (!options.pathToGeminiCLI) {
|
|
90
90
|
throw new GeminiSDKError("pathToGeminiCLI is required");
|
|
91
91
|
}
|
|
92
|
-
if (!options.apiKey && !process.env.
|
|
92
|
+
if (!options.apiKey && !process.env.GEMINI_API_KEY) {
|
|
93
93
|
throw new GeminiSDKError(
|
|
94
|
-
"apiKey is required (or set
|
|
94
|
+
"apiKey is required (or set GEMINI_API_KEY environment variable)"
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
const args = buildCliArgs(options, prompt);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/query.ts","../src/client.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Google AI API Key\n * Can also be set via GOOGLE_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request */\n TOOL_USE = 'tool_use',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolResultEvent\n | ErrorEvent\n | ResultEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n Error.captureStackTrace(this, GeminiSDKError);\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt\n args.push('--', prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // API Key\n if (options.apiKey) {\n env.GOOGLE_API_KEY = options.apiKey;\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GOOGLE_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GOOGLE_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options);\n const cwd = options.cwd || process.cwd();\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn('node', [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n if (options.debug) {\n console.error('[Gemini CLI stderr]:', data.toString());\n }\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n if (options.debug) {\n console.error('[Gemini SDK] Failed to parse JSON line:', line);\n console.error('[Gemini SDK] Parse error:', parseError);\n }\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n console.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/query.ts","../src/client.ts","../src/utils.ts"],"names":["JsonStreamEventType","ExitCode","ProcessStatus"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Type definitions for Gemini CLI SDK\n *\n * Based on Gemini CLI v0.21.0+ interface specification\n */\n\n/**\n * Gemini CLI configuration options\n */\nexport interface GeminiOptions {\n /**\n * Path to Gemini CLI executable\n * @example 'node_modules/@google/gemini-cli/bundle/gemini.js'\n */\n pathToGeminiCLI: string;\n\n /**\n * Google AI API Key\n * Can also be set via GEMINI_API_KEY environment variable\n */\n apiKey?: string;\n\n /**\n * Model name\n * @default 'gemini-2.0-flash-exp'\n * @example 'gemini-2.0-flash-exp', 'gemini-1.5-pro'\n */\n model?: string;\n\n /**\n * Working directory for CLI execution\n * @default process.cwd()\n */\n cwd?: string;\n\n /**\n * System prompt (not directly supported by CLI, needs workaround)\n */\n systemPrompt?: string;\n\n /**\n * Approval mode for tool execution\n * - default: Prompt for approval\n * - auto_edit: Auto-approve edit tools\n * - yolo: Auto-approve all tools\n * @default 'default'\n */\n approvalMode?: 'default' | 'auto_edit' | 'yolo';\n\n /**\n * List of tools that can run without confirmation\n * @example ['read', 'write', 'bash']\n */\n allowedTools?: string[];\n\n /**\n * List of allowed MCP server names\n */\n allowedMcpServerNames?: string[];\n\n /**\n * Enable debug mode\n * @default false\n */\n debug?: boolean;\n\n /**\n * Session ID to resume\n * Use 'latest' to resume the most recent session\n */\n resumeSessionId?: string;\n\n /**\n * Enable sandbox mode\n * @default false\n */\n sandbox?: boolean;\n\n /**\n * Additional directories to include in workspace\n */\n includeDirectories?: string[];\n\n /**\n * Custom environment variables\n */\n env?: Record<string, string>;\n\n /**\n * Timeout in milliseconds\n * @default undefined (no timeout)\n */\n timeout?: number;\n}\n\n/**\n * JSON Stream Event Types\n *\n * Based on: @google/gemini-cli/packages/core/src/output/types.ts\n */\nexport enum JsonStreamEventType {\n /** Session initialization */\n INIT = 'init',\n\n /** Message content (user/assistant) */\n MESSAGE = 'message',\n\n /** Tool call request */\n TOOL_USE = 'tool_use',\n\n /** Tool execution result */\n TOOL_RESULT = 'tool_result',\n\n /** Error event */\n ERROR = 'error',\n\n /** Final result */\n RESULT = 'result',\n}\n\n/**\n * Base event interface\n */\nexport interface BaseJsonStreamEvent {\n type: JsonStreamEventType;\n timestamp: string; // ISO 8601 format\n}\n\n/**\n * Session initialization event\n */\nexport interface InitEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.INIT;\n session_id: string;\n model: string;\n}\n\n/**\n * Message event\n */\nexport interface MessageEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.MESSAGE;\n role: 'user' | 'assistant';\n content: string;\n delta?: boolean; // true for incremental content\n}\n\n/**\n * Tool call event\n */\nexport interface ToolUseEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_USE;\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n}\n\n/**\n * Tool execution result event\n */\nexport interface ToolResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.TOOL_RESULT;\n tool_id: string;\n status: 'success' | 'error';\n output?: string;\n error?: {\n type: string;\n message: string;\n };\n}\n\n/**\n * Error event\n */\nexport interface ErrorEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.ERROR;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/**\n * Stream statistics\n */\nexport interface StreamStats {\n total_tokens: number;\n input_tokens: number;\n output_tokens: number;\n duration_ms: number;\n tool_calls: number;\n}\n\n/**\n * Final result event\n */\nexport interface ResultEvent extends BaseJsonStreamEvent {\n type: JsonStreamEventType.RESULT;\n status: 'success' | 'error';\n error?: {\n type: string;\n message: string;\n };\n stats?: StreamStats;\n}\n\n/**\n * Union type of all JSON stream events\n */\nexport type JsonStreamEvent =\n | InitEvent\n | MessageEvent\n | ToolUseEvent\n | ToolResultEvent\n | ErrorEvent\n | ResultEvent;\n\n/**\n * Gemini CLI exit codes\n */\nexport enum ExitCode {\n /** Success */\n SUCCESS = 0,\n\n /** General error */\n GENERAL_ERROR = 1,\n\n /** Configuration error */\n CONFIG_ERROR = 2,\n\n /** User interrupted (Ctrl+C) */\n USER_INTERRUPTED = 130,\n}\n\n/**\n * CLI process status\n */\nexport enum ProcessStatus {\n /** Not started */\n IDLE = 'idle',\n\n /** Running */\n RUNNING = 'running',\n\n /** Completed successfully */\n COMPLETED = 'completed',\n\n /** Cancelled by user */\n CANCELLED = 'cancelled',\n\n /** Error occurred */\n ERROR = 'error',\n}\n\n/**\n * Gemini SDK Error\n */\nexport class GeminiSDKError extends Error {\n constructor(\n message: string,\n public code?: ExitCode,\n public details?: unknown,\n ) {\n super(message);\n this.name = 'GeminiSDKError';\n Error.captureStackTrace(this, GeminiSDKError);\n }\n}\n\n/**\n * Query result (accumulated from stream)\n */\nexport interface QueryResult {\n /** Session ID */\n sessionId: string;\n\n /** Model used */\n model: string;\n\n /** Full assistant response text */\n response: string;\n\n /** Tool calls made during the query */\n toolCalls: Array<{\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: {\n status: 'success' | 'error';\n output?: string;\n error?: { type: string; message: string };\n };\n }>;\n\n /** Final statistics */\n stats?: StreamStats;\n\n /** Final status */\n status: 'success' | 'error';\n\n /** Error if status is 'error' */\n error?: {\n type: string;\n message: string;\n };\n}\n","/**\n * Core query function for Gemini CLI SDK\n *\n * Spawns Gemini CLI as subprocess and streams JSON events\n */\n\nimport { spawn, type ChildProcess } from 'child_process';\nimport * as readline from 'readline';\nimport type { GeminiOptions, JsonStreamEvent } from './types';\nimport { GeminiSDKError, ExitCode } from './types';\n\n/**\n * Build CLI arguments from options\n */\nfunction buildCliArgs(options: GeminiOptions, prompt: string): string[] {\n const args: string[] = [];\n\n // Output format: always use stream-json\n args.push('--output-format', 'stream-json');\n\n // Model\n if (options.model) {\n args.push('--model', options.model);\n }\n\n // Approval mode\n if (options.approvalMode) {\n args.push('--approval-mode', options.approvalMode);\n }\n\n // Allowed tools\n if (options.allowedTools && options.allowedTools.length > 0) {\n args.push('--allowed-tools', options.allowedTools.join(','));\n }\n\n // Allowed MCP servers\n if (options.allowedMcpServerNames && options.allowedMcpServerNames.length > 0) {\n args.push('--allowed-mcp-server-names', options.allowedMcpServerNames.join(','));\n }\n\n // Resume session\n if (options.resumeSessionId) {\n args.push('--resume', options.resumeSessionId);\n }\n\n // Sandbox mode\n if (options.sandbox) {\n args.push('--sandbox');\n }\n\n // Include directories\n if (options.includeDirectories && options.includeDirectories.length > 0) {\n args.push('--include-directories', options.includeDirectories.join(','));\n }\n\n // Debug mode\n if (options.debug) {\n args.push('--debug');\n }\n\n // Positional argument: user prompt (no -- needed)\n args.push(prompt);\n\n return args;\n}\n\n/**\n * Build environment variables\n */\nfunction buildEnv(options: GeminiOptions): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {\n ...process.env,\n ...options.env,\n };\n\n // API Key - Gemini CLI requires GEMINI_API_KEY\n if (options.apiKey) {\n env.GEMINI_API_KEY = options.apiKey;\n }\n\n // Debug mode\n if (options.debug) {\n env.DEBUG = '1';\n }\n\n return env;\n}\n\n/**\n * Query Gemini CLI and stream JSON events\n *\n * @param prompt - User prompt\n * @param options - Gemini configuration options\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n *\n * @example\n * ```typescript\n * import { query } from '@google/gemini-cli-sdk';\n *\n * const stream = query('Hello, Gemini!', {\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * for await (const event of stream) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n * ```\n */\nexport async function* query(\n prompt: string,\n options: GeminiOptions,\n): AsyncGenerator<JsonStreamEvent> {\n // Validate required options\n if (!options.pathToGeminiCLI) {\n throw new GeminiSDKError('pathToGeminiCLI is required');\n }\n\n if (!options.apiKey && !process.env.GEMINI_API_KEY) {\n throw new GeminiSDKError(\n 'apiKey is required (or set GEMINI_API_KEY environment variable)',\n );\n }\n\n // Build CLI arguments and environment\n const args = buildCliArgs(options, prompt);\n const env = buildEnv(options);\n const cwd = options.cwd || process.cwd();\n\n // Spawn Gemini CLI subprocess\n let geminiProcess: ChildProcess;\n try {\n geminiProcess = spawn('node', [options.pathToGeminiCLI, ...args], {\n stdio: ['pipe', 'pipe', 'pipe'],\n env,\n cwd,\n });\n } catch (error) {\n throw new GeminiSDKError('Failed to spawn Gemini CLI process', undefined, error);\n }\n\n // Handle stderr (CLI internal logs)\n const stderrChunks: Buffer[] = [];\n geminiProcess.stderr?.on('data', (data: Buffer) => {\n stderrChunks.push(data);\n if (options.debug) {\n console.error('[Gemini CLI stderr]:', data.toString());\n }\n });\n\n // Setup timeout if specified\n let timeoutId: NodeJS.Timeout | undefined;\n if (options.timeout) {\n timeoutId = setTimeout(() => {\n geminiProcess.kill('SIGTERM');\n }, options.timeout);\n }\n\n // Create readline interface for stdout\n const rl = readline.createInterface({\n input: geminiProcess.stdout!,\n crlfDelay: Infinity,\n });\n\n // Track if we've yielded any events\n let hasYieldedEvents = false;\n\n try {\n // Stream JSON-Lines output\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as JsonStreamEvent;\n hasYieldedEvents = true;\n yield event;\n } catch (parseError) {\n // Log parse errors but continue processing\n if (options.debug) {\n console.error('[Gemini SDK] Failed to parse JSON line:', line);\n console.error('[Gemini SDK] Parse error:', parseError);\n }\n }\n }\n } catch (error) {\n throw new GeminiSDKError('Failed to read from Gemini CLI stdout', undefined, error);\n } finally {\n // Clear timeout\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n\n // Wait for process to exit\n const exitCode = await new Promise<number>((resolve, reject) => {\n geminiProcess.on('exit', (code, signal) => {\n if (signal) {\n reject(\n new GeminiSDKError(\n `Gemini CLI process was killed with signal ${signal}`,\n ExitCode.USER_INTERRUPTED,\n ),\n );\n } else {\n resolve(code ?? ExitCode.GENERAL_ERROR);\n }\n });\n\n geminiProcess.on('error', (error) => {\n reject(new GeminiSDKError('Gemini CLI process error', undefined, error));\n });\n });\n\n // Handle exit code\n if (exitCode !== ExitCode.SUCCESS) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n `Gemini CLI exited with code ${exitCode}${stderrOutput ? `\\n${stderrOutput}` : ''}`,\n exitCode as ExitCode,\n { stderr: stderrOutput },\n );\n }\n\n // If no events were yielded, something went wrong\n if (!hasYieldedEvents) {\n const stderrOutput = Buffer.concat(stderrChunks).toString();\n throw new GeminiSDKError(\n 'No events received from Gemini CLI',\n undefined,\n { stderr: stderrOutput },\n );\n }\n}\n","/**\n * Gemini CLI Client\n *\n * High-level client for interacting with Gemini CLI\n */\n\nimport { EventEmitter } from 'events';\nimport { query } from './query';\nimport type {\n GeminiOptions,\n JsonStreamEvent,\n QueryResult,\n ToolResultEvent,\n} from './types';\nimport { JsonStreamEventType, ProcessStatus } from './types';\n\n/**\n * Gemini CLI Client\n *\n * Provides a high-level API for interacting with Gemini CLI\n *\n * @example\n * ```typescript\n * import { GeminiClient } from '@google/gemini-cli-sdk';\n *\n * const client = new GeminiClient({\n * pathToGeminiCLI: './node_modules/@google/gemini-cli/bundle/gemini.js',\n * apiKey: process.env.GOOGLE_API_KEY,\n * model: 'gemini-2.0-flash-exp',\n * });\n *\n * // Stream events\n * for await (const event of client.stream('Hello, Gemini!')) {\n * if (event.type === 'message' && event.role === 'assistant' && event.delta) {\n * process.stdout.write(event.content);\n * }\n * }\n *\n * // Or get complete result\n * const result = await client.query('Explain TypeScript generics');\n * console.log(result.response);\n * ```\n */\nexport class GeminiClient extends EventEmitter {\n private status: ProcessStatus = ProcessStatus.IDLE;\n private currentSessionId: string | null = null;\n\n constructor(private options: GeminiOptions) {\n super();\n }\n\n /**\n * Stream events from Gemini CLI\n *\n * @param prompt - User prompt\n * @returns AsyncGenerator<JsonStreamEvent> - Stream of JSON events\n */\n async *stream(prompt: string): AsyncGenerator<JsonStreamEvent> {\n this.status = ProcessStatus.RUNNING;\n this.emit('status', this.status);\n\n try {\n for await (const event of query(prompt, this.options)) {\n // Track session ID\n if (event.type === JsonStreamEventType.INIT) {\n this.currentSessionId = event.session_id;\n this.emit('session', event.session_id);\n }\n\n // Emit event\n this.emit('event', event);\n\n // Yield to caller\n yield event;\n\n // Handle final result\n if (event.type === JsonStreamEventType.RESULT) {\n this.status =\n event.status === 'success' ? ProcessStatus.COMPLETED : ProcessStatus.ERROR;\n this.emit('status', this.status);\n }\n }\n } catch (error) {\n this.status = ProcessStatus.ERROR;\n this.emit('status', this.status);\n this.emit('error', error);\n throw error;\n }\n }\n\n /**\n * Query Gemini CLI and return complete result\n *\n * @param prompt - User prompt\n * @returns Promise<QueryResult> - Complete query result\n */\n async query(prompt: string): Promise<QueryResult> {\n const result: QueryResult = {\n sessionId: '',\n model: '',\n response: '',\n toolCalls: [],\n status: 'success',\n };\n\n const toolCallsMap = new Map<\n string,\n {\n tool_name: string;\n tool_id: string;\n parameters: Record<string, unknown>;\n result?: ToolResultEvent;\n }\n >();\n\n for await (const event of this.stream(prompt)) {\n switch (event.type) {\n case JsonStreamEventType.INIT:\n result.sessionId = event.session_id;\n result.model = event.model;\n break;\n\n case JsonStreamEventType.MESSAGE:\n if (event.role === 'assistant') {\n result.response += event.content;\n }\n break;\n\n case JsonStreamEventType.TOOL_USE:\n toolCallsMap.set(event.tool_id, {\n tool_name: event.tool_name,\n tool_id: event.tool_id,\n parameters: event.parameters,\n });\n break;\n\n case JsonStreamEventType.TOOL_RESULT:\n {\n const toolCall = toolCallsMap.get(event.tool_id);\n if (toolCall) {\n toolCall.result = event;\n result.toolCalls.push({\n tool_name: toolCall.tool_name,\n tool_id: toolCall.tool_id,\n parameters: toolCall.parameters,\n result: {\n status: event.status,\n output: event.output,\n error: event.error,\n },\n });\n }\n }\n break;\n\n case JsonStreamEventType.RESULT:\n result.status = event.status;\n result.stats = event.stats;\n if (event.error) {\n result.error = event.error;\n }\n break;\n\n case JsonStreamEventType.ERROR:\n // Log errors but don't fail the query\n this.emit('warning', event);\n break;\n }\n }\n\n return result;\n }\n\n /**\n * Get current process status\n */\n getStatus(): ProcessStatus {\n return this.status;\n }\n\n /**\n * Get current session ID\n */\n getSessionId(): string | null {\n return this.currentSessionId;\n }\n\n /**\n * Update options\n */\n setOptions(options: Partial<GeminiOptions>): void {\n this.options = { ...this.options, ...options };\n }\n\n /**\n * Get current options\n */\n getOptions(): Readonly<GeminiOptions> {\n return { ...this.options };\n }\n}\n","/**\n * Utility functions for Gemini CLI SDK\n */\n\nimport * as path from 'path';\nimport * as fs from 'fs';\n\n/**\n * Find Gemini CLI executable path\n *\n * Searches in common locations:\n * 1. node_modules/@google/gemini-cli/bundle/gemini.js\n * 2. Custom path from environment variable\n * 3. Global installation\n *\n * @param cwd - Current working directory\n * @returns string - Path to Gemini CLI executable\n * @throws Error if Gemini CLI is not found\n */\nexport function findGeminiCLI(cwd: string = process.cwd()): string {\n // 1. Check environment variable\n if (process.env.GEMINI_CLI_PATH) {\n const envPath = process.env.GEMINI_CLI_PATH;\n if (fs.existsSync(envPath)) {\n return envPath;\n }\n }\n\n // 2. Check local node_modules\n const localPath = path.join(cwd, 'node_modules', '@google', 'gemini-cli', 'bundle', 'gemini.js');\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n\n // 3. Check parent directories (monorepo support)\n let currentDir = cwd;\n for (let i = 0; i < 5; i++) {\n const parentPath = path.join(\n currentDir,\n 'node_modules',\n '@google',\n 'gemini-cli',\n 'bundle',\n 'gemini.js',\n );\n if (fs.existsSync(parentPath)) {\n return parentPath;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) break; // Reached root\n currentDir = parentDir;\n }\n\n throw new Error(\n 'Gemini CLI not found. Please install @google/gemini-cli or set GEMINI_CLI_PATH environment variable.',\n );\n}\n\n/**\n * Validate API key\n *\n * @param apiKey - API key to validate\n * @returns boolean - True if valid\n */\nexport function validateApiKey(apiKey?: string): boolean {\n if (!apiKey) {\n const envKey = process.env.GOOGLE_API_KEY;\n return !!envKey && envKey.length > 0;\n }\n return apiKey.length > 0;\n}\n\n/**\n * Get API key from environment or options\n *\n * @param apiKey - Optional API key from options\n * @returns string - API key\n * @throws Error if API key is not found\n */\nexport function getApiKey(apiKey?: string): string {\n const key = apiKey || process.env.GOOGLE_API_KEY;\n if (!key) {\n throw new Error(\n 'API key not found. Please provide apiKey option or set GOOGLE_API_KEY environment variable.',\n );\n }\n return key;\n}\n\n/**\n * Parse model name and validate\n *\n * @param model - Model name\n * @returns string - Validated model name\n */\nexport function validateModel(model?: string): string {\n const defaultModel = 'gemini-2.0-flash-exp';\n if (!model) {\n return defaultModel;\n }\n\n // Basic validation: should start with 'gemini-'\n if (!model.startsWith('gemini-')) {\n console.warn(`Warning: Model name \"${model}\" does not start with \"gemini-\"`);\n }\n\n return model;\n}\n\n/**\n * Format duration in milliseconds to human-readable string\n *\n * @param ms - Duration in milliseconds\n * @returns string - Formatted duration\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Format token count with commas\n *\n * @param tokens - Token count\n * @returns string - Formatted token count\n */\nexport function formatTokens(tokens: number): string {\n return tokens.toLocaleString();\n}\n"]}
|
package/package.json
CHANGED