imgx-mcp 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.0 (2026-03-04)
4
+
5
+ ### Added
6
+
7
+ - **Session-based `clear_history`** — MCP `clear_history` tool accepts optional `session_id` parameter to clear a single session instead of all sessions
8
+ - **Managed path protection** — MCP `clear_history` with `delete_files` only deletes files inside managed directories (`.imgx/` or `~/Pictures/imgx/`); files saved to custom output paths are never deleted
9
+ - **`clearSession()` API** — new function to remove a single session from history
10
+ - **`isManagedPath()` API** — determines whether a file path is inside a managed directory
11
+ - **CLI `history clear <session-id>`** — clear a specific session from CLI (errors on `--all` + session ID combo)
12
+ - **Uninstall cleanup documentation** — README uninstall section now documents data that `npm uninstall` does not remove
13
+ - 7 new tests for `clearSession` and `isManagedPath` (total: 66 tests)
14
+
15
+ ### Changed
16
+
17
+ - **`historyDir()` exported** — previously private, now available for managed path detection
18
+ - **MCP `clear_history` response** — now includes `skippedFiles` count for files outside managed directories
19
+
3
20
  ## 1.2.0 (2026-03-04)
4
21
 
5
22
  ### Added
package/README.md CHANGED
@@ -438,7 +438,9 @@ Delete the `image-generation/` directory from `.claude/skills/` or `~/.claude/sk
438
438
  npm uninstall -g imgx-mcp
439
439
  ```
440
440
 
441
- ### Clean up configuration (optional)
441
+ `npm uninstall` removes the package but does not delete configuration or generated files. Remove them manually if needed:
442
+
443
+ **Global configuration:**
442
444
 
443
445
  ```bash
444
446
  # Linux / macOS
@@ -448,6 +450,12 @@ rm -rf ~/.config/imgx/
448
450
  Remove-Item -Recurse -Force "$env:APPDATA\imgx"
449
451
  ```
450
452
 
453
+ **Project history and images:** Each project may have a `.imgx/` directory containing edit history and generated images. Remove it from each project as needed.
454
+
455
+ ```bash
456
+ rm -rf <project-root>/.imgx/
457
+ ```
458
+
451
459
  ## License
452
460
 
453
461
  MIT — [SOMA COFFEE KYOTO](https://github.com/somacoffeekyoto)
@@ -303,7 +303,7 @@ var require_p_retry = __commonJS({
303
303
  return error;
304
304
  };
305
305
  var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
306
- var pRetry2 = (input, options) => new Promise((resolve5, reject) => {
306
+ var pRetry2 = (input, options) => new Promise((resolve6, reject) => {
307
307
  options = {
308
308
  onFailedAttempt: () => {
309
309
  },
@@ -313,7 +313,7 @@ var require_p_retry = __commonJS({
313
313
  const operation = retry.operation(options);
314
314
  operation.attempt(async (attemptNumber) => {
315
315
  try {
316
- resolve5(await input(attemptNumber));
316
+ resolve6(await input(attemptNumber));
317
317
  } catch (error) {
318
318
  if (!(error instanceof Error)) {
319
319
  reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));
@@ -850,8 +850,8 @@ var require_retry3 = __commonJS({
850
850
  }
851
851
  const delay = getNextRetryDelay(config);
852
852
  err.config.retryConfig.currentRetryAttempt += 1;
853
- const backoff = config.retryBackoff ? config.retryBackoff(err, delay) : new Promise((resolve5) => {
854
- setTimeout(resolve5, delay);
853
+ const backoff = config.retryBackoff ? config.retryBackoff(err, delay) : new Promise((resolve6) => {
854
+ setTimeout(resolve6, delay);
855
855
  });
856
856
  if (config.onRetryAttempt) {
857
857
  await config.onRetryAttempt(err);
@@ -1627,8 +1627,8 @@ var require_helpers = __commonJS({
1627
1627
  function req(url, opts = {}) {
1628
1628
  const href = typeof url === "string" ? url : url.href;
1629
1629
  const req2 = (href.startsWith("https:") ? https2 : http3).request(url, opts);
1630
- const promise = new Promise((resolve5, reject) => {
1631
- req2.once("response", resolve5).once("error", reject).end();
1630
+ const promise = new Promise((resolve6, reject) => {
1631
+ req2.once("response", resolve6).once("error", reject).end();
1632
1632
  });
1633
1633
  req2.then = promise.then.bind(promise);
1634
1634
  return req2;
@@ -1805,7 +1805,7 @@ var require_parse_proxy_response = __commonJS({
1805
1805
  var debug_1 = __importDefault(require_src());
1806
1806
  var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response");
1807
1807
  function parseProxyResponse(socket) {
1808
- return new Promise((resolve5, reject) => {
1808
+ return new Promise((resolve6, reject) => {
1809
1809
  let buffersLength = 0;
1810
1810
  const buffers = [];
1811
1811
  function read() {
@@ -1871,7 +1871,7 @@ var require_parse_proxy_response = __commonJS({
1871
1871
  }
1872
1872
  debug("got proxy server response: %o %o", firstLine, headers);
1873
1873
  cleanup();
1874
- resolve5({
1874
+ resolve6({
1875
1875
  connect: {
1876
1876
  statusCode,
1877
1877
  statusText,
@@ -2113,7 +2113,7 @@ var require_ponyfill_es2018 = __commonJS({
2113
2113
  return new originalPromise(executor);
2114
2114
  }
2115
2115
  function promiseResolvedWith(value) {
2116
- return newPromise((resolve5) => resolve5(value));
2116
+ return newPromise((resolve6) => resolve6(value));
2117
2117
  }
2118
2118
  function promiseRejectedWith(reason) {
2119
2119
  return originalPromiseReject(reason);
@@ -2283,8 +2283,8 @@ var require_ponyfill_es2018 = __commonJS({
2283
2283
  return new TypeError("Cannot " + name + " a stream using a released reader");
2284
2284
  }
2285
2285
  function defaultReaderClosedPromiseInitialize(reader) {
2286
- reader._closedPromise = newPromise((resolve5, reject) => {
2287
- reader._closedPromise_resolve = resolve5;
2286
+ reader._closedPromise = newPromise((resolve6, reject) => {
2287
+ reader._closedPromise_resolve = resolve6;
2288
2288
  reader._closedPromise_reject = reject;
2289
2289
  });
2290
2290
  }
@@ -2458,8 +2458,8 @@ var require_ponyfill_es2018 = __commonJS({
2458
2458
  }
2459
2459
  let resolvePromise;
2460
2460
  let rejectPromise;
2461
- const promise = newPromise((resolve5, reject) => {
2462
- resolvePromise = resolve5;
2461
+ const promise = newPromise((resolve6, reject) => {
2462
+ resolvePromise = resolve6;
2463
2463
  rejectPromise = reject;
2464
2464
  });
2465
2465
  const readRequest = {
@@ -2564,8 +2564,8 @@ var require_ponyfill_es2018 = __commonJS({
2564
2564
  const reader = this._reader;
2565
2565
  let resolvePromise;
2566
2566
  let rejectPromise;
2567
- const promise = newPromise((resolve5, reject) => {
2568
- resolvePromise = resolve5;
2567
+ const promise = newPromise((resolve6, reject) => {
2568
+ resolvePromise = resolve6;
2569
2569
  rejectPromise = reject;
2570
2570
  });
2571
2571
  const readRequest = {
@@ -3584,8 +3584,8 @@ var require_ponyfill_es2018 = __commonJS({
3584
3584
  }
3585
3585
  let resolvePromise;
3586
3586
  let rejectPromise;
3587
- const promise = newPromise((resolve5, reject) => {
3588
- resolvePromise = resolve5;
3587
+ const promise = newPromise((resolve6, reject) => {
3588
+ resolvePromise = resolve6;
3589
3589
  rejectPromise = reject;
3590
3590
  });
3591
3591
  const readIntoRequest = {
@@ -3897,10 +3897,10 @@ var require_ponyfill_es2018 = __commonJS({
3897
3897
  wasAlreadyErroring = true;
3898
3898
  reason = void 0;
3899
3899
  }
3900
- const promise = newPromise((resolve5, reject) => {
3900
+ const promise = newPromise((resolve6, reject) => {
3901
3901
  stream._pendingAbortRequest = {
3902
3902
  _promise: void 0,
3903
- _resolve: resolve5,
3903
+ _resolve: resolve6,
3904
3904
  _reject: reject,
3905
3905
  _reason: reason,
3906
3906
  _wasAlreadyErroring: wasAlreadyErroring
@@ -3917,9 +3917,9 @@ var require_ponyfill_es2018 = __commonJS({
3917
3917
  if (state === "closed" || state === "errored") {
3918
3918
  return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`));
3919
3919
  }
3920
- const promise = newPromise((resolve5, reject) => {
3920
+ const promise = newPromise((resolve6, reject) => {
3921
3921
  const closeRequest = {
3922
- _resolve: resolve5,
3922
+ _resolve: resolve6,
3923
3923
  _reject: reject
3924
3924
  };
3925
3925
  stream._closeRequest = closeRequest;
@@ -3932,9 +3932,9 @@ var require_ponyfill_es2018 = __commonJS({
3932
3932
  return promise;
3933
3933
  }
3934
3934
  function WritableStreamAddWriteRequest(stream) {
3935
- const promise = newPromise((resolve5, reject) => {
3935
+ const promise = newPromise((resolve6, reject) => {
3936
3936
  const writeRequest = {
3937
- _resolve: resolve5,
3937
+ _resolve: resolve6,
3938
3938
  _reject: reject
3939
3939
  };
3940
3940
  stream._writeRequests.push(writeRequest);
@@ -4550,8 +4550,8 @@ var require_ponyfill_es2018 = __commonJS({
4550
4550
  return new TypeError("Cannot " + name + " a stream using a released writer");
4551
4551
  }
4552
4552
  function defaultWriterClosedPromiseInitialize(writer) {
4553
- writer._closedPromise = newPromise((resolve5, reject) => {
4554
- writer._closedPromise_resolve = resolve5;
4553
+ writer._closedPromise = newPromise((resolve6, reject) => {
4554
+ writer._closedPromise_resolve = resolve6;
4555
4555
  writer._closedPromise_reject = reject;
4556
4556
  writer._closedPromiseState = "pending";
4557
4557
  });
@@ -4587,8 +4587,8 @@ var require_ponyfill_es2018 = __commonJS({
4587
4587
  writer._closedPromiseState = "resolved";
4588
4588
  }
4589
4589
  function defaultWriterReadyPromiseInitialize(writer) {
4590
- writer._readyPromise = newPromise((resolve5, reject) => {
4591
- writer._readyPromise_resolve = resolve5;
4590
+ writer._readyPromise = newPromise((resolve6, reject) => {
4591
+ writer._readyPromise_resolve = resolve6;
4592
4592
  writer._readyPromise_reject = reject;
4593
4593
  });
4594
4594
  writer._readyPromiseState = "pending";
@@ -4675,7 +4675,7 @@ var require_ponyfill_es2018 = __commonJS({
4675
4675
  source._disturbed = true;
4676
4676
  let shuttingDown = false;
4677
4677
  let currentWrite = promiseResolvedWith(void 0);
4678
- return newPromise((resolve5, reject) => {
4678
+ return newPromise((resolve6, reject) => {
4679
4679
  let abortAlgorithm;
4680
4680
  if (signal !== void 0) {
4681
4681
  abortAlgorithm = () => {
@@ -4820,7 +4820,7 @@ var require_ponyfill_es2018 = __commonJS({
4820
4820
  if (isError) {
4821
4821
  reject(error);
4822
4822
  } else {
4823
- resolve5(void 0);
4823
+ resolve6(void 0);
4824
4824
  }
4825
4825
  return null;
4826
4826
  }
@@ -5101,8 +5101,8 @@ var require_ponyfill_es2018 = __commonJS({
5101
5101
  let branch1;
5102
5102
  let branch2;
5103
5103
  let resolveCancelPromise;
5104
- const cancelPromise = newPromise((resolve5) => {
5105
- resolveCancelPromise = resolve5;
5104
+ const cancelPromise = newPromise((resolve6) => {
5105
+ resolveCancelPromise = resolve6;
5106
5106
  });
5107
5107
  function pullAlgorithm() {
5108
5108
  if (reading) {
@@ -5193,8 +5193,8 @@ var require_ponyfill_es2018 = __commonJS({
5193
5193
  let branch1;
5194
5194
  let branch2;
5195
5195
  let resolveCancelPromise;
5196
- const cancelPromise = newPromise((resolve5) => {
5197
- resolveCancelPromise = resolve5;
5196
+ const cancelPromise = newPromise((resolve6) => {
5197
+ resolveCancelPromise = resolve6;
5198
5198
  });
5199
5199
  function forwardReaderError(thisReader) {
5200
5200
  uponRejection(thisReader._closedPromise, (r2) => {
@@ -5974,8 +5974,8 @@ var require_ponyfill_es2018 = __commonJS({
5974
5974
  const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
5975
5975
  const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
5976
5976
  let startPromise_resolve;
5977
- const startPromise = newPromise((resolve5) => {
5978
- startPromise_resolve = resolve5;
5977
+ const startPromise = newPromise((resolve6) => {
5978
+ startPromise_resolve = resolve6;
5979
5979
  });
5980
5980
  InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
5981
5981
  SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
@@ -6068,8 +6068,8 @@ var require_ponyfill_es2018 = __commonJS({
6068
6068
  if (stream._backpressureChangePromise !== void 0) {
6069
6069
  stream._backpressureChangePromise_resolve();
6070
6070
  }
6071
- stream._backpressureChangePromise = newPromise((resolve5) => {
6072
- stream._backpressureChangePromise_resolve = resolve5;
6071
+ stream._backpressureChangePromise = newPromise((resolve6) => {
6072
+ stream._backpressureChangePromise_resolve = resolve6;
6073
6073
  });
6074
6074
  stream._backpressure = backpressure;
6075
6075
  }
@@ -6237,8 +6237,8 @@ var require_ponyfill_es2018 = __commonJS({
6237
6237
  return controller._finishPromise;
6238
6238
  }
6239
6239
  const readable = stream._readable;
6240
- controller._finishPromise = newPromise((resolve5, reject) => {
6241
- controller._finishPromise_resolve = resolve5;
6240
+ controller._finishPromise = newPromise((resolve6, reject) => {
6241
+ controller._finishPromise_resolve = resolve6;
6242
6242
  controller._finishPromise_reject = reject;
6243
6243
  });
6244
6244
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -6264,8 +6264,8 @@ var require_ponyfill_es2018 = __commonJS({
6264
6264
  return controller._finishPromise;
6265
6265
  }
6266
6266
  const readable = stream._readable;
6267
- controller._finishPromise = newPromise((resolve5, reject) => {
6268
- controller._finishPromise_resolve = resolve5;
6267
+ controller._finishPromise = newPromise((resolve6, reject) => {
6268
+ controller._finishPromise_resolve = resolve6;
6269
6269
  controller._finishPromise_reject = reject;
6270
6270
  });
6271
6271
  const flushPromise = controller._flushAlgorithm();
@@ -6295,8 +6295,8 @@ var require_ponyfill_es2018 = __commonJS({
6295
6295
  return controller._finishPromise;
6296
6296
  }
6297
6297
  const writable = stream._writable;
6298
- controller._finishPromise = newPromise((resolve5, reject) => {
6299
- controller._finishPromise_resolve = resolve5;
6298
+ controller._finishPromise = newPromise((resolve6, reject) => {
6299
+ controller._finishPromise_resolve = resolve6;
6300
6300
  controller._finishPromise_reject = reject;
6301
6301
  });
6302
6302
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -8247,7 +8247,7 @@ import zlib from "node:zlib";
8247
8247
  import Stream2, { PassThrough as PassThrough2, pipeline as pump } from "node:stream";
8248
8248
  import { Buffer as Buffer3 } from "node:buffer";
8249
8249
  async function fetch2(url, options_) {
8250
- return new Promise((resolve5, reject) => {
8250
+ return new Promise((resolve6, reject) => {
8251
8251
  const request = new Request(url, options_);
8252
8252
  const { parsedURL, options } = getNodeRequestOptions(request);
8253
8253
  if (!supportedSchemas.has(parsedURL.protocol)) {
@@ -8256,7 +8256,7 @@ async function fetch2(url, options_) {
8256
8256
  if (parsedURL.protocol === "data:") {
8257
8257
  const data = dist_default(request.url);
8258
8258
  const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } });
8259
- resolve5(response2);
8259
+ resolve6(response2);
8260
8260
  return;
8261
8261
  }
8262
8262
  const send = (parsedURL.protocol === "https:" ? https : http2).request;
@@ -8378,7 +8378,7 @@ async function fetch2(url, options_) {
8378
8378
  if (responseReferrerPolicy) {
8379
8379
  requestOptions.referrerPolicy = responseReferrerPolicy;
8380
8380
  }
8381
- resolve5(fetch2(new Request(locationURL, requestOptions)));
8381
+ resolve6(fetch2(new Request(locationURL, requestOptions)));
8382
8382
  finalize();
8383
8383
  return;
8384
8384
  }
@@ -8411,7 +8411,7 @@ async function fetch2(url, options_) {
8411
8411
  const codings = headers.get("Content-Encoding");
8412
8412
  if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) {
8413
8413
  response = new Response2(body, responseOptions);
8414
- resolve5(response);
8414
+ resolve6(response);
8415
8415
  return;
8416
8416
  }
8417
8417
  const zlibOptions = {
@@ -8425,7 +8425,7 @@ async function fetch2(url, options_) {
8425
8425
  }
8426
8426
  });
8427
8427
  response = new Response2(body, responseOptions);
8428
- resolve5(response);
8428
+ resolve6(response);
8429
8429
  return;
8430
8430
  }
8431
8431
  if (codings === "deflate" || codings === "x-deflate") {
@@ -8449,12 +8449,12 @@ async function fetch2(url, options_) {
8449
8449
  });
8450
8450
  }
8451
8451
  response = new Response2(body, responseOptions);
8452
- resolve5(response);
8452
+ resolve6(response);
8453
8453
  });
8454
8454
  raw.once("end", () => {
8455
8455
  if (!response) {
8456
8456
  response = new Response2(body, responseOptions);
8457
- resolve5(response);
8457
+ resolve6(response);
8458
8458
  }
8459
8459
  });
8460
8460
  return;
@@ -8466,11 +8466,11 @@ async function fetch2(url, options_) {
8466
8466
  }
8467
8467
  });
8468
8468
  response = new Response2(body, responseOptions);
8469
- resolve5(response);
8469
+ resolve6(response);
8470
8470
  return;
8471
8471
  }
8472
8472
  response = new Response2(body, responseOptions);
8473
- resolve5(response);
8473
+ resolve6(response);
8474
8474
  });
8475
8475
  writeToStream(request_, request).catch(reject);
8476
8476
  });
@@ -14540,7 +14540,7 @@ var require_jwtaccess = __commonJS({
14540
14540
  }
14541
14541
  }
14542
14542
  fromStreamAsync(inputStream) {
14543
- return new Promise((resolve5, reject) => {
14543
+ return new Promise((resolve6, reject) => {
14544
14544
  if (!inputStream) {
14545
14545
  reject(new Error("Must pass in a stream containing the service account auth settings."));
14546
14546
  }
@@ -14549,7 +14549,7 @@ var require_jwtaccess = __commonJS({
14549
14549
  try {
14550
14550
  const data = JSON.parse(s2);
14551
14551
  this.fromJSON(data);
14552
- resolve5();
14552
+ resolve6();
14553
14553
  } catch (err) {
14554
14554
  reject(err);
14555
14555
  }
@@ -14788,7 +14788,7 @@ var require_jwtclient = __commonJS({
14788
14788
  }
14789
14789
  }
14790
14790
  fromStreamAsync(inputStream) {
14791
- return new Promise((resolve5, reject) => {
14791
+ return new Promise((resolve6, reject) => {
14792
14792
  if (!inputStream) {
14793
14793
  throw new Error("Must pass in a stream containing the service account auth settings.");
14794
14794
  }
@@ -14797,7 +14797,7 @@ var require_jwtclient = __commonJS({
14797
14797
  try {
14798
14798
  const data = JSON.parse(s2);
14799
14799
  this.fromJSON(data);
14800
- resolve5();
14800
+ resolve6();
14801
14801
  } catch (e2) {
14802
14802
  reject(e2);
14803
14803
  }
@@ -14930,7 +14930,7 @@ var require_refreshclient = __commonJS({
14930
14930
  }
14931
14931
  }
14932
14932
  async fromStreamAsync(inputStream) {
14933
- return new Promise((resolve5, reject) => {
14933
+ return new Promise((resolve6, reject) => {
14934
14934
  if (!inputStream) {
14935
14935
  return reject(new Error("Must pass in a stream containing the user refresh token."));
14936
14936
  }
@@ -14939,7 +14939,7 @@ var require_refreshclient = __commonJS({
14939
14939
  try {
14940
14940
  const data = JSON.parse(s2);
14941
14941
  this.fromJSON(data);
14942
- return resolve5();
14942
+ return resolve6();
14943
14943
  } catch (err) {
14944
14944
  return reject(err);
14945
14945
  }
@@ -16772,7 +16772,7 @@ var require_pluggable_auth_handler = __commonJS({
16772
16772
  * @return A promise that resolves with the executable response.
16773
16773
  */
16774
16774
  retrieveResponseFromExecutable(envMap) {
16775
- return new Promise((resolve5, reject) => {
16775
+ return new Promise((resolve6, reject) => {
16776
16776
  const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {
16777
16777
  env: { ...process.env, ...Object.fromEntries(envMap) }
16778
16778
  });
@@ -16794,7 +16794,7 @@ var require_pluggable_auth_handler = __commonJS({
16794
16794
  try {
16795
16795
  const responseJson = JSON.parse(output);
16796
16796
  const response = new executable_response_1.ExecutableResponse(responseJson);
16797
- return resolve5(response);
16797
+ return resolve6(response);
16798
16798
  } catch (error) {
16799
16799
  if (error instanceof executable_response_1.ExecutableResponseError) {
16800
16800
  return reject(error);
@@ -17697,7 +17697,7 @@ var require_googleauth = __commonJS({
17697
17697
  }
17698
17698
  }
17699
17699
  fromStreamAsync(inputStream, options) {
17700
- return new Promise((resolve5, reject) => {
17700
+ return new Promise((resolve6, reject) => {
17701
17701
  if (!inputStream) {
17702
17702
  throw new Error("Must pass in a stream containing the Google auth settings.");
17703
17703
  }
@@ -17707,7 +17707,7 @@ var require_googleauth = __commonJS({
17707
17707
  try {
17708
17708
  const data = JSON.parse(chunks.join(""));
17709
17709
  const r2 = this._cacheClientFromJSON(data, options);
17710
- return resolve5(r2);
17710
+ return resolve6(r2);
17711
17711
  } catch (err) {
17712
17712
  if (!this.keyFilename)
17713
17713
  throw err;
@@ -17717,7 +17717,7 @@ var require_googleauth = __commonJS({
17717
17717
  });
17718
17718
  this.cachedCredential = client;
17719
17719
  this.setGapicJWTValues(client);
17720
- return resolve5(client);
17720
+ return resolve6(client);
17721
17721
  }
17722
17722
  } catch (err) {
17723
17723
  return reject(err);
@@ -17753,17 +17753,17 @@ var require_googleauth = __commonJS({
17753
17753
  * Run the Google Cloud SDK command that prints the default project ID
17754
17754
  */
17755
17755
  async getDefaultServiceProjectId() {
17756
- return new Promise((resolve5) => {
17756
+ return new Promise((resolve6) => {
17757
17757
  (0, child_process_1.exec)("gcloud config config-helper --format json", (err, stdout) => {
17758
17758
  if (!err && stdout) {
17759
17759
  try {
17760
17760
  const projectId = JSON.parse(stdout).configuration.properties.core.project;
17761
- resolve5(projectId);
17761
+ resolve6(projectId);
17762
17762
  return;
17763
17763
  } catch (e2) {
17764
17764
  }
17765
17765
  }
17766
- resolve5(null);
17766
+ resolve6(null);
17767
17767
  });
17768
17768
  });
17769
17769
  }
@@ -26913,14 +26913,14 @@ function __asyncValues(o) {
26913
26913
  }, i2);
26914
26914
  function verb(n) {
26915
26915
  i2[n] = o[n] && function(v) {
26916
- return new Promise(function(resolve5, reject) {
26917
- v = o[n](v), settle(resolve5, reject, v.done, v.value);
26916
+ return new Promise(function(resolve6, reject) {
26917
+ v = o[n](v), settle(resolve6, reject, v.done, v.value);
26918
26918
  });
26919
26919
  };
26920
26920
  }
26921
- function settle(resolve5, reject, d, v) {
26921
+ function settle(resolve6, reject, d, v) {
26922
26922
  Promise.resolve(v).then(function(v2) {
26923
- resolve5({ value: v2, done: d });
26923
+ resolve6({ value: v2, done: d });
26924
26924
  }, reject);
26925
26925
  }
26926
26926
  }
@@ -32891,8 +32891,8 @@ var LiveMusic = class {
32891
32891
  const url = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
32892
32892
  let onopenResolve = () => {
32893
32893
  };
32894
- const onopenPromise = new Promise((resolve5) => {
32895
- onopenResolve = resolve5;
32894
+ const onopenPromise = new Promise((resolve6) => {
32895
+ onopenResolve = resolve6;
32896
32896
  });
32897
32897
  const callbacks = params.callbacks;
32898
32898
  const onopenAwaitedCallback = function() {
@@ -33132,8 +33132,8 @@ var Live = class {
33132
33132
  }
33133
33133
  let onopenResolve = () => {
33134
33134
  };
33135
- const onopenPromise = new Promise((resolve5) => {
33136
- onopenResolve = resolve5;
33135
+ const onopenPromise = new Promise((resolve6) => {
33136
+ onopenResolve = resolve6;
33137
33137
  });
33138
33138
  const callbacks = params.callbacks;
33139
33139
  const onopenAwaitedCallback = function() {
@@ -36075,7 +36075,7 @@ var safeJSON = (text) => {
36075
36075
  return void 0;
36076
36076
  }
36077
36077
  };
36078
- var sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
36078
+ var sleep$1 = (ms) => new Promise((resolve6) => setTimeout(resolve6, ms));
36079
36079
  var VERSION = "0.0.1";
36080
36080
  function getDetectedPlatform() {
36081
36081
  if (typeof Deno !== "undefined" && Deno.build != null) {
@@ -36995,8 +36995,8 @@ async function defaultParseResponse(client, props) {
36995
36995
  }
36996
36996
  var APIPromise = class _APIPromise extends Promise {
36997
36997
  constructor(client, responsePromise, parseResponse = defaultParseResponse) {
36998
- super((resolve5) => {
36999
- resolve5(null);
36998
+ super((resolve6) => {
36999
+ resolve6(null);
37000
37000
  });
37001
37001
  this.responsePromise = responsePromise;
37002
37002
  this.parseResponse = parseResponse;
@@ -39586,7 +39586,7 @@ function initOpenAI() {
39586
39586
 
39587
39587
  // build/core/history.js
39588
39588
  import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, mkdirSync as mkdirSync3 } from "node:fs";
39589
- import { join as join3 } from "node:path";
39589
+ import { join as join3, resolve as resolve3, sep } from "node:path";
39590
39590
  import { homedir as homedir3, platform as platform2 } from "node:os";
39591
39591
  import { randomUUID as randomUUID2 } from "node:crypto";
39592
39592
  var HISTORY_FILE = "output-history.json";
@@ -39732,6 +39732,20 @@ function clearHistory() {
39732
39732
  saveHistory(history);
39733
39733
  return { filePaths };
39734
39734
  }
39735
+ function clearSession(sessionId) {
39736
+ const history = loadHistory();
39737
+ const idx = history.sessions.findIndex((s2) => s2.id === sessionId);
39738
+ if (idx === -1)
39739
+ throw new Error(`Session not found: ${sessionId}`);
39740
+ const [removed] = history.sessions.splice(idx, 1);
39741
+ const filePaths = [];
39742
+ for (const entry of removed.entries)
39743
+ filePaths.push(...entry.filePaths);
39744
+ if (history.activeSessionId === sessionId)
39745
+ history.activeSessionId = null;
39746
+ saveHistory(history);
39747
+ return { filePaths };
39748
+ }
39735
39749
  function clearGlobalHistory() {
39736
39750
  const globalPath = join3(globalHistoryDir(), HISTORY_FILE);
39737
39751
  try {
@@ -39765,7 +39779,7 @@ function updateHistoryPaths(oldBase, newBase) {
39765
39779
 
39766
39780
  // build/cli/commands/init.js
39767
39781
  import { existsSync as existsSync2, writeFileSync as writeFileSync4 } from "node:fs";
39768
- import { resolve as resolve3 } from "node:path";
39782
+ import { resolve as resolve4 } from "node:path";
39769
39783
 
39770
39784
  // build/cli/output.js
39771
39785
  function success(data) {
@@ -39786,7 +39800,7 @@ var TEMPLATE = {
39786
39800
  }
39787
39801
  };
39788
39802
  function runInit() {
39789
- const filePath = resolve3(".imgxrc");
39803
+ const filePath = resolve4(".imgxrc");
39790
39804
  if (existsSync2(filePath)) {
39791
39805
  fail(".imgxrc already exists in current directory");
39792
39806
  }
@@ -39871,7 +39885,7 @@ async function runEdit(provider, args) {
39871
39885
  // build/cli/commands/config.js
39872
39886
  import { createInterface } from "node:readline";
39873
39887
  import { existsSync as existsSync3, readdirSync, cpSync, rmSync, mkdirSync as mkdirSync4 } from "node:fs";
39874
- import { resolve as resolve4 } from "node:path";
39888
+ import { resolve as resolve5 } from "node:path";
39875
39889
  import { homedir as homedir4 } from "node:os";
39876
39890
  function extractProvider(args) {
39877
39891
  const rest = [];
@@ -39973,8 +39987,8 @@ function setKey(key, value, provider) {
39973
39987
  }
39974
39988
  function setOutputDir(newDir, skipConfirm, noMove) {
39975
39989
  const config = loadConfig();
39976
- const oldDir = config.defaults?.outputDir || resolve4(homedir4(), "Pictures", "imgx");
39977
- const resolvedNew = resolve4(newDir);
39990
+ const oldDir = config.defaults?.outputDir || resolve5(homedir4(), "Pictures", "imgx");
39991
+ const resolvedNew = resolve5(newDir);
39978
39992
  if (!config.defaults)
39979
39993
  config.defaults = {};
39980
39994
  config.defaults.outputDir = resolvedNew;
@@ -40095,10 +40109,14 @@ function runHistory(args) {
40095
40109
  return;
40096
40110
  }
40097
40111
  if (sub === "clear") {
40112
+ const positional = args.slice(1).filter((a) => !a.startsWith("--"));
40113
+ const sessionId = positional[0];
40098
40114
  const hasYes = args.includes("--yes");
40099
40115
  const hasKeepFiles = args.includes("--keep-files");
40100
40116
  const hasAll = args.includes("--all");
40101
- runClear(hasYes, hasKeepFiles, hasAll);
40117
+ if (sessionId && hasAll)
40118
+ return fail("Cannot use --all with session ID");
40119
+ runClear(hasYes, hasKeepFiles, hasAll, sessionId);
40102
40120
  return;
40103
40121
  }
40104
40122
  fail(`Unknown history subcommand: ${sub}. Use: switch, clear`);
@@ -40126,12 +40144,12 @@ function showHistory() {
40126
40144
  }))
40127
40145
  });
40128
40146
  }
40129
- function runClear(skipConfirm, keepFiles, clearAll) {
40147
+ function runClear(skipConfirm, keepFiles, clearAll, sessionId) {
40130
40148
  if (clearAll) {
40131
40149
  runClearAll(keepFiles);
40132
40150
  return;
40133
40151
  }
40134
- const result = clearHistory();
40152
+ const result = sessionId ? clearSession(sessionId) : clearHistory();
40135
40153
  if (keepFiles || result.filePaths.length === 0) {
40136
40154
  return success({ cleared: true, filesDeleted: 0 });
40137
40155
  }
@@ -40219,7 +40237,7 @@ function runRedo() {
40219
40237
  }
40220
40238
 
40221
40239
  // build/cli/index.js
40222
- var VERSION2 = "1.2.0";
40240
+ var VERSION2 = "1.3.0";
40223
40241
  var HELP = `imgx v${VERSION2} \u2014 AI image generation and editing for MCP-compatible AI agents
40224
40242
 
40225
40243
  Commands: