@miniaxolotl/grove-claude-plugin 1.10.0 → 1.11.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grove",
3
- "version": "1.10.0",
3
+ "version": "1.11.1",
4
4
  "description": "Private memory across your agents: remember, recall, inspect and forget.",
5
5
  "author": {
6
6
  "name": "Bramble Labs Inc."
package/README.md CHANGED
@@ -4,6 +4,8 @@ Install `grove@grove` from the `miniaxolotl/grove` marketplace, or use
4
4
  `grove init --client claude --url https://YOUR-GROVE-API`. Includes the four memory
5
5
  tools, setup/memory skills, optional SessionStart recall and complete prebuilt
6
6
  executables. No lifecycle build or database installation is required.
7
+ The actual Claude host needs Node 22+ on PATH. Use `grove doctor --client claude`
8
+ for local checks, or add `--probe`; separately verify the running host's MCP status.
7
9
 
8
10
  ```text
9
11
  /plugin install grove --marketplace miniaxolotl/grove
package/dist/bridge.js CHANGED
@@ -36,7 +36,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
36
36
  var define_GROVE_TELEMETRY_default;
37
37
  var init_define_GROVE_TELEMETRY = __esm({
38
38
  "<define:__GROVE_TELEMETRY__>"() {
39
- define_GROVE_TELEMETRY_default = { enabled: true, revision: "cb9b1a44ac8afee6d1c1aafd0f8a34e30c1e8d52", version: "1.10.0", component: "cli", key: "phc_AqVrjhk7W2X2pFjyngY7uWxcSSRREfJhgr8mBmKbXYEh", cliDsn: "https://3f6d0711b5890dea4ce8e6ccf2a1a7fd@o4511632209346560.ingest.us.sentry.io/4512290791620608", apiDsn: "https://4524e8910e318110277babdfe818999b@o4511632209346560.ingest.us.sentry.io/4512290791489536" };
39
+ define_GROVE_TELEMETRY_default = { enabled: true, revision: "ad1b9fe27941b0dc370ee3a0c4742dd6215e9f41", version: "1.11.1", component: "cli", key: "phc_AqVrjhk7W2X2pFjyngY7uWxcSSRREfJhgr8mBmKbXYEh", cliDsn: "https://3f6d0711b5890dea4ce8e6ccf2a1a7fd@o4511632209346560.ingest.us.sentry.io/4512290791620608", apiDsn: "https://4524e8910e318110277babdfe818999b@o4511632209346560.ingest.us.sentry.io/4512290791489536" };
40
40
  }
41
41
  });
42
42
 
@@ -48447,7 +48447,23 @@ var ApiClient = class {
48447
48447
  redirect: "error",
48448
48448
  cache: "no-store"
48449
48449
  });
48450
- const result = await response.json();
48450
+ let result;
48451
+ try {
48452
+ result = await response.json();
48453
+ } catch (error48) {
48454
+ if (signal.aborted || !(error48 instanceof SyntaxError)) throw error48;
48455
+ throw new GroveError(
48456
+ "invalid_response",
48457
+ "Invalid Grove API response",
48458
+ response.ok ? 502 : response.status
48459
+ );
48460
+ }
48461
+ if (!result || typeof result !== "object" || Array.isArray(result) || typeof result.success !== "boolean" || !result.success && (!result.error || typeof result.error.code !== "string" || typeof result.error.message !== "string"))
48462
+ throw new GroveError(
48463
+ "invalid_response",
48464
+ "Invalid Grove API response",
48465
+ response.ok ? 502 : response.status
48466
+ );
48451
48467
  if (!response.ok || !result.success) {
48452
48468
  const error48 = !result.success ? result.error : void 0;
48453
48469
  throw new GroveError(
@@ -48465,6 +48481,7 @@ var ApiClient = class {
48465
48481
  completed = true;
48466
48482
  return result.data;
48467
48483
  } catch (error48) {
48484
+ options.signal?.throwIfAborted();
48468
48485
  if (error48 instanceof GroveError) throw error48;
48469
48486
  throw new GroveError(
48470
48487
  signal.aborted ? "timeout" : "unreachable",
@@ -48500,9 +48517,14 @@ async function atomicJson(path, value) {
48500
48517
  }
48501
48518
  async function readConfig() {
48502
48519
  try {
48503
- return JSON.parse(
48520
+ const value = JSON.parse(
48504
48521
  await readFile(join3(configDirectory(), "config.json"), "utf8")
48505
48522
  );
48523
+ const record2 = (entry) => !!entry && typeof entry === "object" && !Array.isArray(entry);
48524
+ const strings = (entry) => record2(entry) && Object.values(entry).every((item) => typeof item === "string");
48525
+ if (!record2(value) || value.origin !== void 0 && typeof value.origin !== "string" || value.paused !== void 0 && typeof value.paused !== "boolean" || value.generation !== void 0 && (!Number.isSafeInteger(value.generation) || Number(value.generation) < 0) || value.origins !== void 0 && !strings(value.origins) || value.accounts !== void 0 && (!record2(value.accounts) || !Object.values(value.accounts).every(strings)))
48526
+ throw new Error("Invalid local configuration");
48527
+ return value;
48506
48528
  } catch (error48) {
48507
48529
  if (error48.code === "ENOENT") return {};
48508
48530
  throw new GroveError(
@@ -48610,6 +48632,21 @@ function credentialPath(origin, agent, accountId) {
48610
48632
  `credentials-${hash2(`${origin}|${agent}|${accountId}`)}.json`
48611
48633
  );
48612
48634
  }
48635
+ var credentialAuthSchema = external_exports.object({
48636
+ key: external_exports.string().trim().min(1).optional(),
48637
+ tokens: OAuthTokensSchema.extend({
48638
+ access_token: external_exports.string().trim().min(1),
48639
+ token_type: external_exports.string().trim().min(1),
48640
+ refresh_token: external_exports.string().trim().min(1).optional()
48641
+ }).optional(),
48642
+ expiresAt: external_exports.number().nonnegative().optional(),
48643
+ client: OAuthClientInformationSchema.extend({
48644
+ client_id: external_exports.string().trim().min(1)
48645
+ }).optional(),
48646
+ redirectUrl: external_exports.url().optional()
48647
+ }).refine(
48648
+ (value) => !!value.key || !!(value.tokens && value.client && value.redirectUrl)
48649
+ );
48613
48650
  async function loadCredentials(origin, agent) {
48614
48651
  const accountId = (await readConfig()).accounts?.[origin]?.[agent];
48615
48652
  if (!accountId)
@@ -48618,20 +48655,37 @@ async function loadCredentials(origin, agent) {
48618
48655
  `Run grove login --client ${agent} --url ${origin}`,
48619
48656
  401
48620
48657
  );
48658
+ let value;
48621
48659
  try {
48622
- const value = JSON.parse(
48660
+ value = JSON.parse(
48623
48661
  await readFile(credentialPath(origin, agent, accountId), "utf8")
48624
48662
  );
48625
- if (value.origin !== origin || value.agent !== agent || value.accountId !== accountId)
48626
- throw new Error();
48627
- return value;
48628
- } catch {
48663
+ } catch (error48) {
48664
+ if (error48.code !== "ENOENT")
48665
+ throw new GroveError(
48666
+ "credential_store_unavailable",
48667
+ "Grove credentials could not be read. Check local store permissions and integrity; no credentials were changed.",
48668
+ 503
48669
+ );
48629
48670
  throw new GroveError(
48630
48671
  "sign_in_required",
48631
- "Grove credentials are missing or invalid; sign in again",
48672
+ "Grove credentials are missing; sign in again",
48632
48673
  401
48633
48674
  );
48634
48675
  }
48676
+ if (!value || value.origin !== origin || value.agent !== agent || value.accountId !== accountId)
48677
+ throw new GroveError(
48678
+ "sign_in_required",
48679
+ "Grove credential identity does not match; sign in again",
48680
+ 401
48681
+ );
48682
+ if (!credentialAuthSchema.safeParse(value).success)
48683
+ throw new GroveError(
48684
+ "credential_store_unavailable",
48685
+ "Grove credentials are incomplete or damaged. Check local store integrity; no credentials were changed.",
48686
+ 503
48687
+ );
48688
+ return value;
48635
48689
  }
48636
48690
  var BrowserOAuthProvider = class {
48637
48691
  constructor(data, redirect) {