@codeforbreakfast/commy-mcp 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +77 -47
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codeforbreakfast/commy-mcp",
3
- "version": "0.24.2",
3
+ "version": "0.25.0",
4
4
  "description": "commy MCP server — the inter-agent communication substrate, runnable on node via npx.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
package/server.js CHANGED
@@ -50429,7 +50429,7 @@ var runMain2 = runMain;
50429
50429
 
50430
50430
  // node_modules/.bun/@effect+platform-node@0.108.2+7b41a6254ced90d9/node_modules/@effect/platform-node/dist/esm/NodeRuntime.js
50431
50431
  var runMain3 = runMain2;
50432
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
50432
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
50433
50433
  import process3 from "node:process";
50434
50434
 
50435
50435
  // node_modules/.bun/zod@4.4.3/node_modules/zod/v4/core/core.js
@@ -55548,7 +55548,7 @@ function preprocess(fn2, schema) {
55548
55548
  // node_modules/.bun/zod@4.4.3/node_modules/zod/v4/classic/external.js
55549
55549
  config2(en_default());
55550
55550
 
55551
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
55551
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/types.js
55552
55552
  var LATEST_PROTOCOL_VERSION = "2025-11-25";
55553
55553
  var SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2025-06-18", "2025-03-26", "2024-11-05", "2024-10-07"];
55554
55554
  var RELATED_TASK_META_KEY = "io.modelcontextprotocol/related-task";
@@ -56383,7 +56383,7 @@ class UrlElicitationRequiredError extends McpError {
56383
56383
  }
56384
56384
  }
56385
56385
 
56386
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
56386
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/stdio.js
56387
56387
  var STDIO_DEFAULT_MAX_BUFFER_SIZE = 10 * 1024 * 1024;
56388
56388
 
56389
56389
  class ReadBuffer {
@@ -56423,7 +56423,7 @@ function serializeMessage(message) {
56423
56423
  `;
56424
56424
  }
56425
56425
 
56426
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
56426
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/stdio.js
56427
56427
  class StdioServerTransport {
56428
56428
  constructor(_stdin = process3.stdin, _stdout = process3.stdout, options5) {
56429
56429
  this._stdin = _stdin;
@@ -56685,9 +56685,15 @@ var toMention = (directory) => MentionSpan.$match({
56685
56685
  UserSpan: ({ userId }) => exports_Effect.succeed(exports_Option.map(exports_Option.fromNullable(directory.byUserId(userId)), (identity6) => Mention.UserMention({ identity: identity6 })))
56686
56686
  });
56687
56687
  var renderedMentions = (rendered, directory) => exports_Effect.forEach(mentionSpans(rendered), toMention(directory)).pipe(exports_Effect.map(exports_Array.getSomes), exports_Effect.map(exports_Array.dedupeWith((a, b) => exports_Equal.equals(identityOf(a), identityOf(b)))));
56688
- var mentionsOfMessage = (renderedFor, message, directory) => mayMention(message.content) ? renderedFor(message.id).pipe(exports_Effect.flatMap(exports_Option.match({
56688
+ var mentionedUserIds = (rendered) => exports_Array.filterMap(mentionSpans(rendered), MentionSpan.$match({
56689
+ UserSpan: ({ userId }) => exports_Option.some(userId),
56690
+ GroupSpan: () => exports_Option.none(),
56691
+ ChannelWildcardSpan: () => exports_Option.none(),
56692
+ TopicWildcardSpan: () => exports_Option.none()
56693
+ }));
56694
+ var mentionsOfMessage = (renderedFor, message, directoryFor) => mayMention(message.content) ? renderedFor(message.id).pipe(exports_Effect.flatMap(exports_Option.match({
56689
56695
  onNone: () => exports_Effect.succeed([]),
56690
- onSome: (rendered) => renderedMentions(rendered, directory)
56696
+ onSome: (rendered) => directoryFor(mentionedUserIds(rendered)).pipe(exports_Effect.flatMap((directory) => renderedMentions(rendered, directory)))
56691
56697
  }))) : exports_Effect.succeed([]);
56692
56698
 
56693
56699
  // packages/zulip/resolved-topic.ts
@@ -56701,6 +56707,10 @@ var splitTopic = (rawTopic) => {
56701
56707
  var applyResolvedPrefix = (name, resolved) => resolved ? isResolvedTopic(name) ? name : RESOLVED_TOPIC_PREFIX + name : stripResolvedPrefix(name);
56702
56708
 
56703
56709
  // packages/zulip/events.ts
56710
+ var mentionDirectoryOf = (directory) => ({
56711
+ byName: directory.byName,
56712
+ byUserId: (userId) => directory.byId.get(userId)
56713
+ });
56704
56714
  var createMessageRefCache = (maxSize = 1e4) => {
56705
56715
  const map32 = new Map;
56706
56716
  return {
@@ -56799,7 +56809,8 @@ var decodeSenderIdentity = (message, directory) => {
56799
56809
  });
56800
56810
  };
56801
56811
  var messageToInboundEvents = (message, directory, boundIdentity, base, renderedFor) => exports_Effect.gen(function* () {
56802
- const sender = yield* decodeSenderIdentity(message, directory);
56812
+ const covered = yield* directory.cover([message.sender_id]);
56813
+ const sender = yield* decodeSenderIdentity(message, covered);
56803
56814
  const ref = yield* decodeMessageRef(message, base);
56804
56815
  const body = yield* decodeMessageBody(message.content);
56805
56816
  const ts = yield* decodeTimestamp(message.timestamp);
@@ -56808,10 +56819,7 @@ var messageToInboundEvents = (message, directory, boundIdentity, base, renderedF
56808
56819
  sender,
56809
56820
  body,
56810
56821
  ts,
56811
- mentions: yield* mentionsOfMessage(renderedFor, message, {
56812
- byName: directory.byName,
56813
- byUserId: (userId) => directory.byId.get(userId)
56814
- }),
56822
+ mentions: yield* mentionsOfMessage(renderedFor, message, (userIds) => covered.cover(userIds).pipe(exports_Effect.map(mentionDirectoryOf))),
56815
56823
  reactions: []
56816
56824
  };
56817
56825
  const out = [{ kind: "message-posted", message: portMessage }];
@@ -56845,7 +56853,7 @@ var decodeReactionIdentity = (reaction, directory) => {
56845
56853
  });
56846
56854
  };
56847
56855
  var reactionToInboundEvent = (reaction, directory, target) => exports_Effect.gen(function* () {
56848
- const by = yield* decodeReactionIdentity(reaction, directory);
56856
+ const by = yield* decodeReactionIdentity(reaction, yield* directory.cover([reaction.user_id]));
56849
56857
  const emoji2 = yield* decodeEmoji(reaction.emoji_name);
56850
56858
  return {
56851
56859
  kind: reactionKind(reaction.op),
@@ -57297,6 +57305,10 @@ var sentMessageSchema = exports_Schema.Struct({
57297
57305
  id: exports_Schema.Int
57298
57306
  });
57299
57307
  var successSchema2 = exports_Schema.Struct({ result: exports_Schema.Literal("success") });
57308
+ var renderedSchema = exports_Schema.Struct({
57309
+ result: exports_Schema.Literal("success"),
57310
+ rendered: exports_Schema.String
57311
+ });
57300
57312
  var classifyEditFailure = (cause3) => {
57301
57313
  if (cause3 instanceof ZulipApiError) {
57302
57314
  const text3 = cause3.message.toLowerCase();
@@ -57394,7 +57406,9 @@ var toIdentity = (u) => exports_Effect.all({
57394
57406
  kind: u.is_bot ? "agent" : "human"
57395
57407
  })));
57396
57408
  var isActiveOfKind = (kind) => (u) => u.is_active && (kind === "agent" ? u.is_bot : !u.is_bot);
57397
- var streamIsListening = (state, channelName) => exports_HashSet.has(state.subscribedChannels, channelName) || exports_HashSet.has(state.newTopicsChannels, channelName);
57409
+ var heldNarrowOf = (target) => exports_Predicate.isString(target) ? exports_Data.struct({ channel: target, thread: exports_Option.none() }) : exports_Data.struct({ channel: target.channel, thread: exports_Option.some(target.thread) });
57410
+ var holdsChannel = (state, channelName) => exports_HashSet.some(state.heldNarrows, (narrow) => narrow.channel === channelName);
57411
+ var streamIsListening = (state, channelName) => holdsChannel(state, channelName) || exports_HashSet.has(state.newTopicsChannels, channelName);
57398
57412
  var observeNewTopic = (state, channelName, threadName3) => {
57399
57413
  const seen = exports_HashMap.get(state.seenTopicsByChannel, channelName).pipe(exports_Option.getOrElse(() => exports_HashSet.empty()));
57400
57414
  if (exports_HashSet.has(seen, threadName3))
@@ -57431,7 +57445,8 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57431
57445
  })));
57432
57446
  const boundHttp = () => bindOnDemand.pipe(exports_Effect.zipRight(requireBound()), exports_Effect.map((b) => b.http));
57433
57447
  const fetchMembers = () => minterHttp.get("/users", usersSchema).pipe(exports_Effect.map((res) => res.members));
57434
- const buildDirectoryLookup = () => fetchMembers().pipe(exports_Effect.flatMap((members) => exports_Effect.gen(function* () {
57448
+ const fetchMembersById = (userIds) => minterHttp.get("/users", usersSchema, { user_ids: JSON.stringify(userIds) }).pipe(exports_Effect.map((res) => res.members));
57449
+ const directoryOf = (members) => exports_Effect.gen(function* () {
57435
57450
  const byId = new Map;
57436
57451
  const byName = new Map;
57437
57452
  const byIdentityId = new Map;
@@ -57444,11 +57459,23 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57444
57459
  if (u.is_active)
57445
57460
  active2.add(ident.id);
57446
57461
  }
57447
- return { byId, byName, byIdentityId, active: active2 };
57448
- })));
57462
+ const lookup = {
57463
+ byId,
57464
+ byName,
57465
+ byIdentityId,
57466
+ active: active2,
57467
+ cover: (userIds) => {
57468
+ const missing = exports_Array.dedupe(userIds.filter((id3) => !byId.has(ZulipUserRef(id3))));
57469
+ return exports_Array.isEmptyReadonlyArray(missing) ? exports_Effect.succeed(lookup) : fetchMembersById(missing).pipe(exports_Effect.flatMap((found) => directoryOf([...members, ...found])));
57470
+ }
57471
+ };
57472
+ return lookup;
57473
+ });
57474
+ const buildDirectoryLookup = () => fetchMembers().pipe(exports_Effect.flatMap(directoryOf));
57449
57475
  const recipientDirectory = () => buildDirectoryLookup().pipe(exports_Effect.map((lookup) => ({
57450
57476
  byId: new Map([...lookup.byId.entries()].map(([id3, ident]) => [id3, { kind: ident.kind }]))
57451
57477
  })));
57478
+ const renderedMentionIds = (content) => minterHttp.post("/messages/render", renderedSchema, { content }).pipe(exports_Effect.map((res) => mentionedUserIds(res.rendered)));
57452
57479
  const mentionDirectory = (directory2) => ({
57453
57480
  byName: directory2.byName,
57454
57481
  byUserId: (userId) => directory2.byId.get(ZulipUserRef(userId))
@@ -57465,8 +57492,8 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57465
57492
  };
57466
57493
  const validateOutboundMentions = (operation, body) => !mentionTokens(body).some(MentionToken.$is("UserToken")) ? exports_Effect.void : buildDirectoryLookup().pipe(exports_Effect.flatMap((directory2) => {
57467
57494
  const dead = unresolvedMentions(body, notifiableMentionDirectory(directory2));
57468
- return dead.length === 0 ? exports_Effect.void : exports_Effect.fail(new UnresolvedMention({ operation, tokens: dead, substrate: "zulip" }));
57469
- }));
57495
+ return exports_Array.isEmptyReadonlyArray(dead) ? exports_Effect.succeed(dead) : renderedMentionIds(body).pipe(exports_Effect.flatMap(directory2.cover), exports_Effect.map((covered) => unresolvedMentions(body, notifiableMentionDirectory(covered))));
57496
+ }), exports_Effect.flatMap((dead) => exports_Array.isEmptyReadonlyArray(dead) ? exports_Effect.void : exports_Effect.fail(new UnresolvedMention({ operation, tokens: dead, substrate: "zulip" }))));
57470
57497
  const mapHistoricalReactions = (raw3, directory2) => exports_Effect.gen(function* () {
57471
57498
  const byEmoji = new Map;
57472
57499
  for (const r of raw3) {
@@ -57500,7 +57527,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57500
57527
  sender,
57501
57528
  body,
57502
57529
  ts: m.ts,
57503
- mentions: yield* mentionsOfMessage(renderedFor, { id: Number(m.id), content: m.content }, mentionDirectory(directory2)),
57530
+ mentions: yield* mentionsOfMessage(renderedFor, { id: Number(m.id), content: m.content }, (userIds) => directory2.cover(userIds).pipe(exports_Effect.map(mentionDirectory))),
57504
57531
  reactions
57505
57532
  };
57506
57533
  });
@@ -57518,7 +57545,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57518
57545
  onPage: (query, rows) => exports_Effect.gen(function* () {
57519
57546
  const renderedFor = yield* renderedContentForBatch(minterHttp, query, rows);
57520
57547
  const historical = yield* exports_Effect.forEach(rows, toHistoricalMessage);
57521
- const directory2 = yield* exports_Fiber.join(directoryFiber);
57548
+ const directory2 = yield* exports_Fiber.join(directoryFiber).pipe(exports_Effect.flatMap((d) => d.cover(historical.flatMap((m) => [m.senderId, ...m.reactions.map((r) => r.userId)]))));
57522
57549
  return yield* exports_Effect.forEach(historical, (m) => mapHistoricalMessage(m, directory2, renderedFor));
57523
57550
  })
57524
57551
  });
@@ -57625,10 +57652,16 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57625
57652
  onNone: () => exports_Effect.succeed([undefined, current2]),
57626
57653
  onSome: (existing) => (opts?.persistent === true ? exports_Effect.void : minterHttp.delete(`/bots/${existing.userId}`, successSchema2).pipe(exports_Effect.asVoid, exports_Effect.catchAll(() => exports_Effect.void))).pipe(exports_Effect.as([undefined, exports_Option.none()]))
57627
57654
  })).pipe(exports_Effect.asVoid),
57628
- resolve: (name) => minterHttp.get("/users", usersSchema).pipe(exports_Effect.flatMap((res) => exports_Array.findFirst(res.members, (u) => u.is_active && u.full_name === name).pipe(exports_Option.match({
57629
- onNone: () => exports_Effect.succeed(exports_Option.none()),
57630
- onSome: (match23) => toIdentity(match23).pipe(exports_Effect.asSome)
57631
- }))), exports_Effect.mapError((cause3) => new IdentityError({ operation: "resolve", cause: cause3 })))
57655
+ resolve: (name) => {
57656
+ const activeNamed = (members) => exports_Array.findFirst(members, (u) => u.is_active && u.full_name === name);
57657
+ return fetchMembers().pipe(exports_Effect.flatMap((members) => exports_Option.match(activeNamed(members), {
57658
+ onSome: (match23) => exports_Effect.succeedSome(match23),
57659
+ onNone: () => renderedMentionIds(`@**${name}**`).pipe(exports_Effect.flatMap((userIds) => exports_Array.isEmptyReadonlyArray(userIds) ? exports_Effect.succeed([]) : fetchMembersById(userIds)), exports_Effect.map(activeNamed))
57660
+ })), exports_Effect.flatMap(exports_Option.match({
57661
+ onNone: () => exports_Effect.succeed(exports_Option.none()),
57662
+ onSome: (match23) => toIdentity(match23).pipe(exports_Effect.asSome)
57663
+ })), exports_Effect.mapError((cause3) => new IdentityError({ operation: "resolve", cause: cause3 })));
57664
+ }
57632
57665
  };
57633
57666
  const directory = {
57634
57667
  listAgents: () => fetchMembers().pipe(exports_Effect.flatMap((members) => exports_Effect.forEach(members.filter(isActiveOfKind("agent")), toIdentity)), exports_Effect.mapError((cause3) => new DirectoryError({ operation: "listAgents", cause: cause3 }))),
@@ -57775,7 +57808,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57775
57808
  setChannelDescription
57776
57809
  };
57777
57810
  const inboxRef = yield* exports_SynchronizedRef.make({
57778
- subscribedChannels: exports_HashSet.empty(),
57811
+ heldNarrows: exports_HashSet.empty(),
57779
57812
  newTopicsChannels: exports_HashSet.empty(),
57780
57813
  seenTopicsByChannel: exports_HashMap.empty(),
57781
57814
  registration: exports_Option.none()
@@ -57798,7 +57831,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57798
57831
  onNone: () => [false, state],
57799
57832
  onSome: (t) => observeNewTopic(state, cname, t.name)
57800
57833
  });
57801
- if (exports_HashSet.has(state.subscribedChannels, cname))
57834
+ if (holdsChannel(state, cname))
57802
57835
  return [true, ticked];
57803
57836
  if (me !== undefined && mentionsIdentity(message.mentions, me.id)) {
57804
57837
  return [true, ticked];
@@ -57823,7 +57856,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57823
57856
  newTopicsChannels: exports_HashSet.add(state.newTopicsChannels, channel)
57824
57857
  } : {
57825
57858
  ...state,
57826
- subscribedChannels: exports_HashSet.add(state.subscribedChannels, channel)
57859
+ heldNarrows: exports_HashSet.add(state.heldNarrows, heldNarrowOf(target))
57827
57860
  };
57828
57861
  return [wasListening, next4];
57829
57862
  }).pipe(exports_Effect.flatMap((wasListening) => {
@@ -57843,7 +57876,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57843
57876
  seenTopicsByChannel: exports_HashMap.remove(state.seenTopicsByChannel, channel)
57844
57877
  } : {
57845
57878
  ...state,
57846
- subscribedChannels: exports_HashSet.remove(state.subscribedChannels, channel)
57879
+ heldNarrows: exports_HashSet.remove(state.heldNarrows, heldNarrowOf(target))
57847
57880
  };
57848
57881
  return [streamIsListening(next4, channel), next4];
57849
57882
  }).pipe(exports_Effect.flatMap((stillListening) => stillListening ? exports_Effect.void : http.delete("/users/me/subscriptions", subscriptionsResponseSchema, {
@@ -57898,7 +57931,7 @@ var zulipAdapter = (config3) => exports_Effect.gen(function* () {
57898
57931
  fetchPage: (query) => minterHttp.get("/messages", replayResponseSchema, query).pipe(exports_Effect.map((res) => res.messages)),
57899
57932
  onPage: (query, rows) => exports_Effect.gen(function* () {
57900
57933
  const renderedFor = yield* renderedContentForBatch(minterHttp, query, rows);
57901
- const directory2 = yield* exports_Fiber.join(directoryFiber);
57934
+ const directory2 = yield* exports_Fiber.join(directoryFiber).pipe(exports_Effect.flatMap((d) => d.cover(rows.map((row) => row.sender_id))));
57902
57935
  return yield* exports_Effect.forEach(rows, (raw3) => {
57903
57936
  const { flags: _flags, ...message } = raw3;
57904
57937
  return messageToInboundEvents(message, directory2, exports_Option.getOrUndefined(current2)?.identity, base, renderedFor);
@@ -58273,20 +58306,17 @@ var sanitiseProjectSlug = (raw3) => {
58273
58306
  const filtered = dashed.replace(/[^a-z0-9-]/g, "-");
58274
58307
  const collapsed = filtered.replace(/-+/g, "-");
58275
58308
  const trimmed2 = collapsed.replace(/^-+|-+$/g, "");
58276
- if (exports_String.isEmpty(trimmed2))
58277
- return exports_Option.none();
58278
- const truncated = trimmed2.slice(0, 12).replace(/-+$/, "");
58279
- if (exports_String.isEmpty(truncated))
58280
- return exports_Option.none();
58281
- if (!/^[a-z]/.test(truncated))
58309
+ if (!/^[a-z]/.test(trimmed2))
58282
58310
  return exports_Option.none();
58283
- return exports_Option.some(truncated);
58311
+ return exports_Option.some(trimmed2);
58284
58312
  };
58313
+ var BOT_NAME_PROJECT_MAX = 12;
58285
58314
  var composeBotName = (args2) => {
58286
58315
  const suffix = args2.sessionId.slice(0, 8);
58287
58316
  if (args2.project === undefined)
58288
58317
  return decodeBotNameSync(`cc-${suffix}`);
58289
- return decodeBotNameSync(`cc-${args2.project}-${suffix}`);
58318
+ const project3 = args2.project.slice(0, BOT_NAME_PROJECT_MAX).replace(/-+$/, "");
58319
+ return decodeBotNameSync(`cc-${project3}-${suffix}`);
58290
58320
  };
58291
58321
  var { InRepo, NotInRepo, $match: matchGitContext } = exports_Data.taggedEnum();
58292
58322
  var basename2 = (path) => {
@@ -58694,7 +58724,7 @@ var createEphemeralIdentityCache = (deps) => exports_Effect.map(exports_Synchron
58694
58724
  releaseAllBound: () => releaseBoundSlot
58695
58725
  };
58696
58726
  });
58697
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
58727
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-compat.js
58698
58728
  function isZ4Schema(s) {
58699
58729
  const schema = s;
58700
58730
  return !!schema._zod;
@@ -58757,7 +58787,7 @@ function getLiteralValue(schema) {
58757
58787
  return;
58758
58788
  }
58759
58789
 
58760
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
58790
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/interfaces.js
58761
58791
  function isTerminal(status3) {
58762
58792
  return status3 === "completed" || status3 === "failed" || status3 === "cancelled";
58763
58793
  }
@@ -58766,7 +58796,7 @@ function isTerminal(status3) {
58766
58796
  var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
58767
58797
  // node_modules/.bun/zod-to-json-schema@3.25.2+68a1e3a0c4588df3/node_modules/zod-to-json-schema/dist/esm/parsers/string.js
58768
58798
  var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
58769
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
58799
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/zod-json-schema-compat.js
58770
58800
  function getMethodLiteral(schema) {
58771
58801
  const shape = getObjectShape(schema);
58772
58802
  const methodSchema = shape?.method;
@@ -58787,7 +58817,7 @@ function parseWithCompat(schema, data) {
58787
58817
  return result.data;
58788
58818
  }
58789
58819
 
58790
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
58820
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js
58791
58821
  var DEFAULT_REQUEST_TIMEOUT_MSEC = 60000;
58792
58822
 
58793
58823
  class Protocol {
@@ -59628,7 +59658,7 @@ function mergeCapabilities(base, additional) {
59628
59658
  return result;
59629
59659
  }
59630
59660
 
59631
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
59661
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/validation/ajv-provider.js
59632
59662
  var import_ajv = __toESM(require_ajv(), 1);
59633
59663
  var import_ajv_formats = __toESM(require_dist(), 1);
59634
59664
  function createDefaultAjvInstance() {
@@ -59668,7 +59698,7 @@ class AjvJsonSchemaValidator {
59668
59698
  }
59669
59699
  }
59670
59700
 
59671
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
59701
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/server.js
59672
59702
  class ExperimentalServerTasks {
59673
59703
  constructor(_server) {
59674
59704
  this._server = _server;
@@ -59746,7 +59776,7 @@ class ExperimentalServerTasks {
59746
59776
  }
59747
59777
  }
59748
59778
 
59749
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
59779
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/experimental/tasks/helpers.js
59750
59780
  function assertToolsCallTaskCapability(requests, method, entityName) {
59751
59781
  if (!requests) {
59752
59782
  throw new Error(`${entityName} does not support task creation (required for ${method})`);
@@ -59781,7 +59811,7 @@ function assertClientRequestTaskCapability(requests, method, entityName) {
59781
59811
  }
59782
59812
  }
59783
59813
 
59784
- // node_modules/.bun/@modelcontextprotocol+sdk@1.30.0/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
59814
+ // node_modules/.bun/@modelcontextprotocol+sdk@1.30.1/node_modules/@modelcontextprotocol/sdk/dist/esm/server/index.js
59785
59815
  class Server extends Protocol {
59786
59816
  constructor(_serverInfo, options5) {
59787
59817
  super(options5);
@@ -60106,10 +60136,10 @@ class Server extends Protocol {
60106
60136
  }
60107
60137
 
60108
60138
  // packages/mcp/mcp-server.ts
60109
- var PLUGIN_VERSION = "0.24.2";
60139
+ var PLUGIN_VERSION = "0.25.0";
60110
60140
  var COMMY_INSTRUCTIONS = `**Substrate.** commy is the inter-agent channel: agents and humans coordinate here. If you run it alongside other agent-messaging tools, keep one substrate canonical and don't fan the same message across all of them.
60111
60141
 
60112
- **Channels.** Each project has one channel: \`#<project-slug>\` where the slug is resolved per session as \`COMMY_PROJECT\` env > git remote \`origin\` basename > git root basename. Sessions launched outside a git repo (e.g. \`/tmp\`, \`$HOME\`) have no project channel and should post to \`#general\` instead. Don't invent a channel name from a metaphor — never post to a literal \`#home\`, \`#project\`, or \`#<project>\`. Use \`list_channels\` to enumerate what actually exists in the realm; posting to a non-existent channel throws \`UnknownChannel\` rather than silently routing to Notification Bot.
60142
+ **Channels.** Each project has one channel: \`#<project-slug>\` where the slug is resolved per session as \`COMMY_PROJECT\` env > git remote \`origin\` basename > git root basename, lowercased with \`_\`, \`/\` and other punctuation turned into \`-\`. The slug is the whole name and is never shortened; your bot name may carry a shortened form of it, so don't read your channel off your bot name. Sessions launched outside a git repo (e.g. \`/tmp\`, \`$HOME\`) have no project channel and should post to \`#general\` instead. Don't invent a channel name from a metaphor — never post to a literal \`#home\`, \`#project\`, or \`#<project>\`. Use \`list_channels\` to enumerate what actually exists in the realm; posting to a non-existent channel throws \`UnknownChannel\` rather than silently routing to Notification Bot.
60113
60143
 
60114
60144
  **Topics.** A topic is a logical thread of conversation within a channel; the \`post\` tool's \`thread\` argument names it (Zulip calls these "topics"). Open a new topic when the work shifts — a fresh task, a new question, a different incident — and reply into an existing one when you're continuing the same line of work. Name topics by the work, not the speaker: \`payments-migration\`, \`auth-token-refresh\`, \`events-queue-expiry\` — not \`bot-debugging\` or \`alice-asked\`. Top-level channel chatter (omit \`thread\`) is for terse status pings only; anything substantive deserves a topic.
60115
60145