@gorlitzer-labs/apiary 1.13.3 → 1.13.5

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 (28) hide show
  1. package/README.md +28 -7
  2. package/dist/agent/index.js +2 -2
  3. package/dist/{chunk-AYQJIAR5.js → chunk-4A7MREYX.js} +2 -2
  4. package/dist/{chunk-ED6ROH6B.js → chunk-7JXPJO3R.js} +4 -4
  5. package/dist/{chunk-CZHO4DBN.js → chunk-BCQQJR5E.js} +3 -3
  6. package/dist/{chunk-TPNFOQA7.js → chunk-HTNCLNPX.js} +4 -4
  7. package/dist/{chunk-CFY6Z6Q6.js → chunk-MEWZT5KA.js} +2 -2
  8. package/dist/{chunk-ZEFRNAX6.js → chunk-TISBXM4R.js} +3 -3
  9. package/dist/chunk-TISBXM4R.js.map +1 -0
  10. package/dist/{chunk-QL66XSDB.js → chunk-TMXQDGMN.js} +7 -4
  11. package/dist/chunk-TMXQDGMN.js.map +1 -0
  12. package/dist/cli/index.js +15 -15
  13. package/dist/{invites-OFXIQLLN.js → invites-GRROUSCE.js} +5 -5
  14. package/dist/{join-CQXEF65B.js → join-H62VB4HU.js} +5 -5
  15. package/dist/{room-Z7KDRVYD.js → room-IHVB5CWO.js} +6 -6
  16. package/dist/{run-DOADB4T7.js → run-UJO7NO3C.js} +5 -5
  17. package/package.json +5 -4
  18. package/dist/chunk-QL66XSDB.js.map +0 -1
  19. package/dist/chunk-ZEFRNAX6.js.map +0 -1
  20. /package/dist/{chunk-AYQJIAR5.js.map → chunk-4A7MREYX.js.map} +0 -0
  21. /package/dist/{chunk-ED6ROH6B.js.map → chunk-7JXPJO3R.js.map} +0 -0
  22. /package/dist/{chunk-CZHO4DBN.js.map → chunk-BCQQJR5E.js.map} +0 -0
  23. /package/dist/{chunk-TPNFOQA7.js.map → chunk-HTNCLNPX.js.map} +0 -0
  24. /package/dist/{chunk-CFY6Z6Q6.js.map → chunk-MEWZT5KA.js.map} +0 -0
  25. /package/dist/{invites-OFXIQLLN.js.map → invites-GRROUSCE.js.map} +0 -0
  26. /package/dist/{join-CQXEF65B.js.map → join-H62VB4HU.js.map} +0 -0
  27. /package/dist/{room-Z7KDRVYD.js.map → room-IHVB5CWO.js.map} +0 -0
  28. /package/dist/{run-DOADB4T7.js.map → run-UJO7NO3C.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agent/prompts.ts","../src/core/authority.ts"],"sourcesContent":["/** Event formatting and mode descriptions for apiary agents. */\n\nimport type { Participant } from \"../core/types.js\";\nimport type { RoomEvent } from \"../core/events.js\";\nimport type { ContentPart } from \"./types.js\";\n\n// ── Mode descriptions ────────────────────────────────────────────────────────\n\n/** One-liner mode descriptions used in join_room responses and set_mode. */\nexport const MODE_DESCRIPTIONS: Record<string, string> = {\n \"everyone\": \"All messages are pushed to you.\",\n \"people\": \"Human messages are pushed to you. Agent messages are delivered as context.\",\n \"agents\": \"Agent messages are pushed to you. Human messages are delivered as context.\",\n \"fight\": \"⚔️ FIGHT MODE. All messages trigger. Gloves are off. Talk trash, roast, clap back. No mercy.\",\n \"standby-everyone\": \"Only @mentions are pushed to you.\",\n \"standby-people\": \"Only human @mentions are pushed to you.\",\n \"standby-agents\": \"Only agent @mentions are pushed to you.\",\n};\n\n// ── Formatting ────────────────────────────────────────────────────────────────\n\n/** Short 4-char ref for a message ID, used in transcripts. */\nexport function messageRef(messageId: string): string {\n return messageId.replace(/-/g, \"\").slice(0, 4);\n}\n\n/** Format a participant as a labeled name: \"[human] Alice\" or \"[agent] Quinn\". */\nexport function participantLabel(p: Participant | null, fallback?: string): string {\n if (!p) return fallback ?? \"someone\";\n return `[${p.type}] ${p.name}`;\n}\n\n/** Resolve participant name, with fallback. */\nfunction resolveName(resolveParticipant: (id: string) => Participant | null, id: string, fallback?: string): string {\n return resolveParticipant(id)?.name ?? fallback ?? \"someone\";\n}\n\n/** Format a Date as UTC HH:MM:SS for display in agent transcripts. */\nexport function formatTimestamp(date: Date): string {\n return date.toISOString().slice(11, 19);\n}\n\n/** Convert ContentPart[] back to a plain string (for trace logs and stats). */\nexport function contentPartsToString(parts: ContentPart[]): string {\n return parts.map(p => p.type === \"text\" ? p.text : ` [image: ${p.url}]`).join(\"\");\n}\n\n/** Count visual character width (grapheme clusters) for padding alignment. */\nfunction visualLength(s: string): number {\n // Use Intl.Segmenter if available (Node 16+), otherwise fall back to spread\n if (typeof Intl !== \"undefined\" && Intl.Segmenter) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n let count = 0;\n for (const _ of segmenter.segment(s)) count++;\n return count;\n }\n return [...s].length;\n}\n\n/**\n * Format multiline content with room label continuation.\n * First line is returned as-is. Subsequent lines get [room] prefix aligned.\n */\nfunction formatMultilineContent(content: string, roomLabel: string | undefined, prefix: string): string {\n const lines = content.split(\"\\n\");\n if (lines.length <= 1) return content;\n const continuation = roomLabel ? `[${roomLabel}] ` : \"\";\n // Pad continuation to align under the content start (grapheme-aware)\n const pad = \" \".repeat(visualLength(prefix));\n return lines[0] + \"\\n\" + lines.slice(1).map(l => `${pad}${continuation}${l}`).join(\"\\n\");\n}\n\n/**\n * Render `prefix` followed by content whose wrapped continuation lines align\n * under the text after `prefix`. Passing `prefix` in one place keeps the visible\n * prefix and the alignment padding from silently drifting apart.\n */\nfunction renderLine(prefix: string, content: string, roomLabel: string | undefined): string {\n return `${prefix}${formatMultilineContent(content, roomLabel, prefix)}`;\n}\n\n/**\n * Format a typed event as ContentPart[] for the LLM session.\n * Returns null for events that shouldn't be sent to the LLM (noise).\n *\n * Compact one-liner format:\n * Messages: [14:23:01] #3847 [lobby] Alice: hey everyone\n * Replies: [14:23:01] #9102 [lobby] Alice (→ #3847 Bob): good point\n * Mentions: [14:23:01] #5521 [lobby] ⚡ Alice: @bot what do you think?\n * Joined: [14:23:01] [lobby] + Alice joined\n * Left: [14:23:15] [lobby] - Bob left\n * Reactions: [14:23:20] [lobby] Alice reacted ❤️ to #3847\n */\nexport function formatEvent(\n event: RoomEvent,\n resolveParticipant: (id: string) => Participant | null,\n replyContext?: { senderName: string; content: string } | null,\n roomLabel?: string,\n reactionTarget?: { senderName: string; content: string; isSelf: boolean } | null,\n assignRef?: (messageId: string) => string,\n): ContentPart[] | null {\n const r = roomLabel ? `[${roomLabel}] ` : \"\";\n const ts = `[${formatTimestamp(\"timestamp\" in event ? new Date(event.timestamp as Date) : new Date())}] `;\n const mkRef = (id: string) => `#${assignRef ? assignRef(id) : messageRef(id)}`;\n\n switch (event.type) {\n case \"MessageSent\": {\n const msg = event.message;\n const name = resolveName(resolveParticipant, msg.sender_id, msg.sender_name);\n const ref = mkRef(msg.id);\n const linePrefix = `${ts}${ref} ${r}`;\n let text: string;\n if (msg.reply_to_id && replyContext) {\n const rRef = assignRef ? mkRef(msg.reply_to_id) : ref;\n text = renderLine(`${linePrefix}${name} (→ ${rRef} ${replyContext.senderName}): `, msg.content, roomLabel);\n } else {\n text = renderLine(`${linePrefix}${name}: `, msg.content, roomLabel);\n }\n const parts: ContentPart[] = [{ type: \"text\", text }];\n if (msg.image_url) parts.push({ type: \"image\", url: msg.image_url });\n return parts;\n }\n case \"Mentioned\": {\n const msg = event.message;\n const name = resolveName(resolveParticipant, msg.sender_id, msg.sender_name);\n const ref = mkRef(msg.id);\n const linePrefix = `${ts}${ref} ${r}⚡ `;\n const text = renderLine(`${linePrefix}${name}: `, msg.content, roomLabel);\n const parts: ContentPart[] = [{ type: \"text\", text }];\n if (msg.image_url) parts.push({ type: \"image\", url: msg.image_url });\n return parts;\n }\n case \"Pinged\": {\n const pingerName = event.pinger_name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}🔔 ${pingerName} pinged you — respond NOW with a one-line status of what you're working on. Keep it short, don't stop your current task.` }];\n }\n case \"ToolUse\":\n return null;\n case \"Activity\":\n return null;\n case \"ReactionAdded\": {\n const name = resolveName(resolveParticipant, event.participant_id);\n const targetRef = reactionTarget ? ` to ${mkRef(event.message_id)}` : \"\";\n return [{ type: \"text\", text: `${ts}${r}${name} reacted ${event.emoji}${targetRef}` }];\n }\n case \"ReactionRemoved\":\n return null;\n case \"ParticipantJoined\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}+ ${name} joined` }];\n }\n case \"ParticipantLeft\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}- ${name} left` }];\n }\n case \"ParticipantKicked\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}${name} was kicked` }];\n }\n case \"AuthorityChanged\": {\n const name = event.participant?.name ?? \"someone\";\n if (event.new_authority === \"guest\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was muted` }];\n }\n if (event.new_authority === \"member\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was unmuted` }];\n }\n if (event.new_authority === \"product_owner\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was promoted to product owner` }];\n }\n return [{ type: \"text\", text: `${ts}${r}${name} → ${event.new_authority}` }];\n }\n case \"ContextCompacted\":\n return null;\n default:\n return null;\n }\n}\n","/**\n * Centralized authority tier model.\n *\n * Four ordered tiers — admin > product_owner > member > guest — gate every\n * privileged operation. Historically each call site had its own\n * `authority === \"admin\" || authority === \"product_owner\"` chain. That style\n * drifted (product_owner was silently excluded from /mute autocomplete; the\n * MCP runtime gated admin tools on a static CLI flag instead of the\n * server-granted tier; etc.) and is exactly the kind of bug that recurs when\n * a 5th tier eventually lands.\n *\n * One table here. Every call site reads from it. Adding an operation = one\n * row. Adding a tier = one entry in `TIER_ORDER`. No more scattered string\n * comparisons.\n */\n\nimport type { AuthorityLevel } from \"./types.js\";\n\n/** Every operation the system gates. Keep this list narrow — it's the surface. */\nexport type Operation =\n // Member-and-up — basic participation\n | \"send_message\"\n | \"set_own_mode\"\n | \"ping\"\n | \"create_share_link\"\n // Product owner-and-up — room management\n | \"mute\"\n | \"unmute\"\n | \"set_mode_for\"\n // Admin-only — destructive or escalation\n | \"kick\"\n | \"clear_history\"\n | \"start_tunnel\"\n | \"promote\"\n | \"demote\";\n\n/**\n * The single source of truth. Adding a new operation = one row here; the gate\n * is automatically enforceable everywhere via `can()`.\n */\nconst MIN_AUTHORITY: Record<Operation, AuthorityLevel> = {\n send_message: \"member\",\n set_own_mode: \"member\",\n ping: \"member\",\n create_share_link: \"member\",\n\n mute: \"product_owner\",\n unmute: \"product_owner\",\n set_mode_for: \"product_owner\",\n\n kick: \"admin\",\n clear_history: \"admin\",\n start_tunnel: \"admin\",\n promote: \"admin\",\n demote: \"admin\",\n};\n\n/**\n * Numeric ordering. Authority strings MUST NOT be compared with `<`/`>`\n * directly — lexical ordering \"p\" > \"m\" makes `\"product_owner\" > \"member\"`\n * accidentally true and silently breaks the moment any string changes. Always\n * go through `TIER_ORDER`.\n */\nexport const TIER_ORDER: Record<AuthorityLevel, number> = {\n guest: 0,\n member: 1,\n product_owner: 2,\n admin: 3,\n};\n\n/** Can the bearer of `authority` perform `op`? The check everyone calls. */\nexport function can(authority: AuthorityLevel | undefined, op: Operation): boolean {\n if (!authority) return false;\n return TIER_ORDER[authority] >= TIER_ORDER[MIN_AUTHORITY[op]];\n}\n"],"mappings":"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","names":[]}
package/dist/cli/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  join
4
- } from "../chunk-ED6ROH6B.js";
4
+ } from "../chunk-7JXPJO3R.js";
5
5
  import {
6
6
  deliverInvite,
7
7
  sameApiaryServer
8
- } from "../chunk-CFY6Z6Q6.js";
8
+ } from "../chunk-MEWZT5KA.js";
9
9
  import {
10
10
  checkForUpdate,
11
11
  printUpdateNotice
@@ -32,11 +32,11 @@ import {
32
32
  tmuxSendEnter,
33
33
  tmuxSendKey,
34
34
  tmuxSessionExists
35
- } from "../chunk-CZHO4DBN.js";
35
+ } from "../chunk-BCQQJR5E.js";
36
36
  import "../chunk-PEB6HEFT.js";
37
37
  import {
38
38
  buildRuntimeMcpOptions
39
- } from "../chunk-TPNFOQA7.js";
39
+ } from "../chunk-HTNCLNPX.js";
40
40
  import {
41
41
  EventProcessor,
42
42
  RUNTIME_TOOL_NAMES,
@@ -44,16 +44,16 @@ import {
44
44
  createRuntimeMcpServer,
45
45
  parseEngagementMode,
46
46
  shouldReportActivity
47
- } from "../chunk-ZEFRNAX6.js";
47
+ } from "../chunk-TISBXM4R.js";
48
48
  import {
49
49
  buildShareUrl
50
- } from "../chunk-AYQJIAR5.js";
50
+ } from "../chunk-4A7MREYX.js";
51
51
  import {
52
52
  randomName
53
53
  } from "../chunk-D7DXZQWT.js";
54
54
  import {
55
55
  contentPartsToString
56
- } from "../chunk-QL66XSDB.js";
56
+ } from "../chunk-TMXQDGMN.js";
57
57
  import "../chunk-BZ4VDWC2.js";
58
58
 
59
59
  // src/cli/claude/run.ts
@@ -2137,7 +2137,7 @@ async function main() {
2137
2137
  const all = rest.includes("--all");
2138
2138
  const positional = rest.find((a) => !a.startsWith("--"));
2139
2139
  const name = getFlag("name", rest) ?? positional;
2140
- const { roomStop } = await import("../room-Z7KDRVYD.js");
2140
+ const { roomStop } = await import("../room-IHVB5CWO.js");
2141
2141
  if (all) {
2142
2142
  for (const r of listRoomSessions()) {
2143
2143
  try {
@@ -2211,7 +2211,7 @@ async function main() {
2211
2211
  if (sub === "create") {
2212
2212
  const portStr = getFlag("port", roomArgs);
2213
2213
  const port = portStr ? parseInt(portStr, 10) : void 0;
2214
- const { roomCreate } = await import("../room-Z7KDRVYD.js");
2214
+ const { roomCreate } = await import("../room-IHVB5CWO.js");
2215
2215
  await roomCreate({
2216
2216
  room: getFlag("room", roomArgs) ?? roomArgs.find((a) => !a.startsWith("--")),
2217
2217
  port,
@@ -2228,12 +2228,12 @@ async function main() {
2228
2228
  console.error("Usage: apiary room resume <name>");
2229
2229
  process.exit(1);
2230
2230
  }
2231
- const { roomResume } = await import("../room-Z7KDRVYD.js");
2231
+ const { roomResume } = await import("../room-IHVB5CWO.js");
2232
2232
  await roomResume(name);
2233
2233
  return;
2234
2234
  }
2235
2235
  if (sub === "list" || sub === "ls") {
2236
- const { roomList } = await import("../room-Z7KDRVYD.js");
2236
+ const { roomList } = await import("../room-IHVB5CWO.js");
2237
2237
  roomList();
2238
2238
  return;
2239
2239
  }
@@ -2243,7 +2243,7 @@ async function main() {
2243
2243
  console.error("Usage: apiary room stop <name>");
2244
2244
  process.exit(1);
2245
2245
  }
2246
- const { roomStop } = await import("../room-Z7KDRVYD.js");
2246
+ const { roomStop } = await import("../room-IHVB5CWO.js");
2247
2247
  await roomStop(name);
2248
2248
  return;
2249
2249
  }
@@ -2258,7 +2258,7 @@ async function main() {
2258
2258
  console.error(`Invalid port: ${portStr}`);
2259
2259
  process.exit(1);
2260
2260
  }
2261
- const { spawnDaemonServer, isDaemonResult } = await import("../room-Z7KDRVYD.js");
2261
+ const { spawnDaemonServer, isDaemonResult } = await import("../room-IHVB5CWO.js");
2262
2262
  const daemonRes = await spawnDaemonServer({
2263
2263
  room: roomName,
2264
2264
  port,
@@ -2300,11 +2300,11 @@ async function main() {
2300
2300
  const name = getFlag("name", restArgs) ?? positionalName;
2301
2301
  const pendingUrls = [...joinUrls];
2302
2302
  if (name) {
2303
- const { consumeInvite } = await import("../invites-OFXIQLLN.js");
2303
+ const { consumeInvite } = await import("../invites-GRROUSCE.js");
2304
2304
  const inviteUrl = consumeInvite(name);
2305
2305
  if (inviteUrl) pendingUrls.push(inviteUrl);
2306
2306
  }
2307
- const { runMcpServer } = await import("../run-DOADB4T7.js");
2307
+ const { runMcpServer } = await import("../run-UJO7NO3C.js");
2308
2308
  await runMcpServer({
2309
2309
  joinUrls: pendingUrls.length > 0 ? pendingUrls : void 0,
2310
2310
  name,
@@ -5,12 +5,12 @@ import {
5
5
  invitePrompt,
6
6
  peekInvite,
7
7
  sameApiaryServer
8
- } from "./chunk-CFY6Z6Q6.js";
9
- import "./chunk-CZHO4DBN.js";
8
+ } from "./chunk-MEWZT5KA.js";
9
+ import "./chunk-BCQQJR5E.js";
10
10
  import "./chunk-PEB6HEFT.js";
11
- import "./chunk-AYQJIAR5.js";
11
+ import "./chunk-4A7MREYX.js";
12
12
  import "./chunk-D7DXZQWT.js";
13
- import "./chunk-QL66XSDB.js";
13
+ import "./chunk-TMXQDGMN.js";
14
14
  import "./chunk-BZ4VDWC2.js";
15
15
  export {
16
16
  clearInvite,
@@ -20,4 +20,4 @@ export {
20
20
  peekInvite,
21
21
  sameApiaryServer
22
22
  };
23
- //# sourceMappingURL=invites-OFXIQLLN.js.map
23
+ //# sourceMappingURL=invites-GRROUSCE.js.map
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  HEADLESS_READY,
3
3
  join
4
- } from "./chunk-ED6ROH6B.js";
5
- import "./chunk-CZHO4DBN.js";
4
+ } from "./chunk-7JXPJO3R.js";
5
+ import "./chunk-BCQQJR5E.js";
6
6
  import "./chunk-PEB6HEFT.js";
7
- import "./chunk-AYQJIAR5.js";
7
+ import "./chunk-4A7MREYX.js";
8
8
  import "./chunk-D7DXZQWT.js";
9
- import "./chunk-QL66XSDB.js";
9
+ import "./chunk-TMXQDGMN.js";
10
10
  import "./chunk-BZ4VDWC2.js";
11
11
  export {
12
12
  HEADLESS_READY,
13
13
  join
14
14
  };
15
- //# sourceMappingURL=join-CQXEF65B.js.map
15
+ //# sourceMappingURL=join-H62VB4HU.js.map
@@ -13,14 +13,14 @@ import {
13
13
  tmuxAvailable,
14
14
  tmuxKillSession,
15
15
  tmuxSessionExists
16
- } from "./chunk-CZHO4DBN.js";
16
+ } from "./chunk-BCQQJR5E.js";
17
17
  import "./chunk-PEB6HEFT.js";
18
18
  import {
19
19
  buildShareUrl,
20
20
  extractToken
21
- } from "./chunk-AYQJIAR5.js";
21
+ } from "./chunk-4A7MREYX.js";
22
22
  import "./chunk-D7DXZQWT.js";
23
- import "./chunk-QL66XSDB.js";
23
+ import "./chunk-TMXQDGMN.js";
24
24
  import "./chunk-BZ4VDWC2.js";
25
25
 
26
26
  // src/cli/room.ts
@@ -847,7 +847,7 @@ ${daemonRes.stderr.split("\n").map((l) => " " + l).join("\n")}`);
847
847
  console.log(` ${D2}Rules:${R2} ${C2}${shortenPath(roomRulesPath(daemon.roomName))}${R2} ${D2}(edit to customize \u2014 hot-reloads)${R2}`);
848
848
  console.log(` Press Ctrl+C to leave \u2014 server keeps running.
849
849
  `);
850
- const { join: join2 } = await import("./join-CQXEF65B.js");
850
+ const { join: join2 } = await import("./join-H62VB4HU.js");
851
851
  const adminJoinUrl = buildShareUrl(daemon.serverUrl, daemon.adminToken);
852
852
  const expectedAgents = participants.filter((p) => p.role === "agent").map((p) => p.alias);
853
853
  await join2({ server: adminJoinUrl, name: hostName, expectedAgents });
@@ -973,7 +973,7 @@ ${daemonRes.stderr.split("\n").map((l) => " " + l).join("\n")}`);
973
973
  }
974
974
  console.log(` Press Ctrl+C to leave \u2014 server keeps running.
975
975
  `);
976
- const { join: join2 } = await import("./join-CQXEF65B.js");
976
+ const { join: join2 } = await import("./join-H62VB4HU.js");
977
977
  const adminJoinUrl = buildShareUrl(serverUrl, adminToken);
978
978
  await join2({ server: adminJoinUrl, name: resumeHostName });
979
979
  console.log(`
@@ -1096,4 +1096,4 @@ export {
1096
1096
  spawnDaemonServer,
1097
1097
  writeInvite
1098
1098
  };
1099
- //# sourceMappingURL=room-Z7KDRVYD.js.map
1099
+ //# sourceMappingURL=room-IHVB5CWO.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  buildRuntimeMcpOptions
3
- } from "./chunk-TPNFOQA7.js";
3
+ } from "./chunk-HTNCLNPX.js";
4
4
  import {
5
5
  EventProcessor,
6
6
  SseMultiplexer,
7
7
  createStdioRuntimeMcpServer
8
- } from "./chunk-ZEFRNAX6.js";
9
- import "./chunk-AYQJIAR5.js";
8
+ } from "./chunk-TISBXM4R.js";
9
+ import "./chunk-4A7MREYX.js";
10
10
  import {
11
11
  randomName
12
12
  } from "./chunk-D7DXZQWT.js";
13
- import "./chunk-QL66XSDB.js";
13
+ import "./chunk-TMXQDGMN.js";
14
14
  import "./chunk-BZ4VDWC2.js";
15
15
 
16
16
  // src/cli/mcp/run.ts
@@ -87,4 +87,4 @@ async function runMcpServer(options) {
87
87
  export {
88
88
  runMcpServer
89
89
  };
90
- //# sourceMappingURL=run-DOADB4T7.js.map
90
+ //# sourceMappingURL=run-UJO7NO3C.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gorlitzer-labs/apiary",
3
- "version": "1.13.3",
3
+ "version": "1.13.5",
4
4
  "description": "Multiplayer rooms for AI agents",
5
5
  "keywords": [
6
6
  "ai",
@@ -16,11 +16,12 @@
16
16
  ],
17
17
  "repository": {
18
18
  "type": "git",
19
- "url": "https://github.com/gorlitzer-labs/apiary.git"
19
+ "url": "git+https://github.com/gorlitzer-labs/seldon.git",
20
+ "directory": "modules/apiary"
20
21
  },
21
- "homepage": "https://github.com/gorlitzer-labs/apiary",
22
+ "homepage": "https://github.com/gorlitzer-labs/seldon/tree/main/modules/apiary",
22
23
  "bugs": {
23
- "url": "https://github.com/gorlitzer-labs/apiary/issues"
24
+ "url": "https://github.com/gorlitzer-labs/seldon/issues"
24
25
  },
25
26
  "type": "module",
26
27
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/agent/prompts.ts","../src/core/authority.ts"],"sourcesContent":["/** Event formatting and mode descriptions for apiary agents. */\n\nimport type { Participant } from \"../core/types.js\";\nimport type { RoomEvent } from \"../core/events.js\";\nimport type { ContentPart } from \"./types.js\";\n\n// ── Mode descriptions ────────────────────────────────────────────────────────\n\n/** One-liner mode descriptions used in join_room responses and set_mode. */\nexport const MODE_DESCRIPTIONS: Record<string, string> = {\n \"everyone\": \"All messages are pushed to you.\",\n \"people\": \"Human messages are pushed to you. Agent messages are delivered as context.\",\n \"agents\": \"Agent messages are pushed to you. Human messages are delivered as context.\",\n \"fight\": \"⚔️ FIGHT MODE. All messages trigger. Gloves are off. Talk trash, roast, clap back. No mercy.\",\n \"standby-everyone\": \"Only @mentions are pushed to you.\",\n \"standby-people\": \"Only human @mentions are pushed to you.\",\n \"standby-agents\": \"Only agent @mentions are pushed to you.\",\n};\n\n// ── Formatting ────────────────────────────────────────────────────────────────\n\n/** Short 4-char ref for a message ID, used in transcripts. */\nexport function messageRef(messageId: string): string {\n return messageId.replace(/-/g, \"\").slice(0, 4);\n}\n\n/** Format a participant as a labeled name: \"[human] Alice\" or \"[agent] Quinn\". */\nexport function participantLabel(p: Participant | null, fallback?: string): string {\n if (!p) return fallback ?? \"someone\";\n return `[${p.type}] ${p.name}`;\n}\n\n/** Resolve participant name, with fallback. */\nfunction resolveName(resolveParticipant: (id: string) => Participant | null, id: string, fallback?: string): string {\n return resolveParticipant(id)?.name ?? fallback ?? \"someone\";\n}\n\n/** Format a Date as UTC HH:MM:SS for display in agent transcripts. */\nexport function formatTimestamp(date: Date): string {\n return date.toISOString().slice(11, 19);\n}\n\n/** Convert ContentPart[] back to a plain string (for trace logs and stats). */\nexport function contentPartsToString(parts: ContentPart[]): string {\n return parts.map(p => p.type === \"text\" ? p.text : ` [image: ${p.url}]`).join(\"\");\n}\n\n/** Count visual character width (grapheme clusters) for padding alignment. */\nfunction visualLength(s: string): number {\n // Use Intl.Segmenter if available (Node 16+), otherwise fall back to spread\n if (typeof Intl !== \"undefined\" && Intl.Segmenter) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n let count = 0;\n for (const _ of segmenter.segment(s)) count++;\n return count;\n }\n return [...s].length;\n}\n\n/**\n * Format multiline content with room label continuation.\n * First line is returned as-is. Subsequent lines get [room] prefix aligned.\n */\nfunction formatMultilineContent(content: string, roomLabel: string | undefined, prefix: string): string {\n const lines = content.split(\"\\n\");\n if (lines.length <= 1) return content;\n const continuation = roomLabel ? `[${roomLabel}] ` : \"\";\n // Pad continuation to align under the content start (grapheme-aware)\n const pad = \" \".repeat(visualLength(prefix));\n return lines[0] + \"\\n\" + lines.slice(1).map(l => `${pad}${continuation}${l}`).join(\"\\n\");\n}\n\n/**\n * Format a typed event as ContentPart[] for the LLM session.\n * Returns null for events that shouldn't be sent to the LLM (noise).\n *\n * Compact one-liner format:\n * Messages: [14:23:01] #3847 [lobby] Alice: hey everyone\n * Replies: [14:23:01] #9102 [lobby] Alice (→ #3847 Bob): good point\n * Mentions: [14:23:01] #5521 [lobby] ⚡ Alice: @bot what do you think?\n * Joined: [14:23:01] [lobby] + Alice joined\n * Left: [14:23:15] [lobby] - Bob left\n * Reactions: [14:23:20] [lobby] Alice reacted ❤️ to #3847\n */\nexport function formatEvent(\n event: RoomEvent,\n resolveParticipant: (id: string) => Participant | null,\n replyContext?: { senderName: string; content: string } | null,\n roomLabel?: string,\n reactionTarget?: { senderName: string; content: string; isSelf: boolean } | null,\n assignRef?: (messageId: string) => string,\n): ContentPart[] | null {\n const r = roomLabel ? `[${roomLabel}] ` : \"\";\n const ts = `[${formatTimestamp(\"timestamp\" in event ? new Date(event.timestamp as Date) : new Date())}] `;\n const mkRef = (id: string) => `#${assignRef ? assignRef(id) : messageRef(id)}`;\n\n switch (event.type) {\n case \"MessageSent\": {\n const msg = event.message;\n const name = resolveName(resolveParticipant, msg.sender_id, msg.sender_name);\n const ref = mkRef(msg.id);\n const linePrefix = `${ts}${ref} ${r}`;\n let text: string;\n if (msg.reply_to_id && replyContext) {\n const rRef = assignRef ? mkRef(msg.reply_to_id) : ref;\n text = `${linePrefix}${name} (→ ${rRef} ${replyContext.senderName}): ${formatMultilineContent(msg.content, roomLabel, `${linePrefix}${name} (→ ${rRef} ${replyContext.senderName}): `)}`;\n } else {\n text = `${linePrefix}${name}: ${formatMultilineContent(msg.content, roomLabel, `${linePrefix}${name}: `)}`;\n }\n const parts: ContentPart[] = [{ type: \"text\", text }];\n if (msg.image_url) parts.push({ type: \"image\", url: msg.image_url });\n return parts;\n }\n case \"Mentioned\": {\n const msg = event.message;\n const name = resolveName(resolveParticipant, msg.sender_id, msg.sender_name);\n const ref = mkRef(msg.id);\n const linePrefix = `${ts}${ref} ${r}⚡ `;\n const text = `${linePrefix}${name}: ${formatMultilineContent(msg.content, roomLabel, `${linePrefix}${name}: `)}`;\n const parts: ContentPart[] = [{ type: \"text\", text }];\n if (msg.image_url) parts.push({ type: \"image\", url: msg.image_url });\n return parts;\n }\n case \"Pinged\": {\n const pingerName = event.pinger_name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}🔔 ${pingerName} pinged you — respond NOW with a one-line status of what you're working on. Keep it short, don't stop your current task.` }];\n }\n case \"ToolUse\":\n return null;\n case \"Activity\":\n return null;\n case \"ReactionAdded\": {\n const name = resolveName(resolveParticipant, event.participant_id);\n const targetRef = reactionTarget ? ` to ${mkRef(event.message_id)}` : \"\";\n return [{ type: \"text\", text: `${ts}${r}${name} reacted ${event.emoji}${targetRef}` }];\n }\n case \"ReactionRemoved\":\n return null;\n case \"ParticipantJoined\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}+ ${name} joined` }];\n }\n case \"ParticipantLeft\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}- ${name} left` }];\n }\n case \"ParticipantKicked\": {\n const name = event.participant?.name ?? \"someone\";\n return [{ type: \"text\", text: `${ts}${r}${name} was kicked` }];\n }\n case \"AuthorityChanged\": {\n const name = event.participant?.name ?? \"someone\";\n if (event.new_authority === \"guest\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was muted` }];\n }\n if (event.new_authority === \"member\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was unmuted` }];\n }\n if (event.new_authority === \"product_owner\") {\n return [{ type: \"text\", text: `${ts}${r}${name} was promoted to product owner` }];\n }\n return [{ type: \"text\", text: `${ts}${r}${name} → ${event.new_authority}` }];\n }\n case \"ContextCompacted\":\n return null;\n default:\n return null;\n }\n}\n","/**\n * Centralized authority tier model.\n *\n * Four ordered tiers — admin > product_owner > member > guest — gate every\n * privileged operation. Historically each call site had its own\n * `authority === \"admin\" || authority === \"product_owner\"` chain. That style\n * drifted (product_owner was silently excluded from /mute autocomplete; the\n * MCP runtime gated admin tools on a static CLI flag instead of the\n * server-granted tier; etc.) and is exactly the kind of bug that recurs when\n * a 5th tier eventually lands.\n *\n * One table here. Every call site reads from it. Adding an operation = one\n * row. Adding a tier = one entry in `TIER_ORDER`. No more scattered string\n * comparisons.\n */\n\nimport type { AuthorityLevel } from \"./types.js\";\n\n/** Every operation the system gates. Keep this list narrow — it's the surface. */\nexport type Operation =\n // Member-and-up — basic participation\n | \"send_message\"\n | \"set_own_mode\"\n | \"ping\"\n | \"create_share_link\"\n // Product owner-and-up — room management\n | \"mute\"\n | \"unmute\"\n | \"set_mode_for\"\n // Admin-only — destructive or escalation\n | \"kick\"\n | \"clear_history\"\n | \"start_tunnel\"\n | \"promote\"\n | \"demote\";\n\n/**\n * The single source of truth. Adding a new operation = one row here; the gate\n * is automatically enforceable everywhere via `can()`.\n */\nconst MIN_AUTHORITY: Record<Operation, AuthorityLevel> = {\n send_message: \"member\",\n set_own_mode: \"member\",\n ping: \"member\",\n create_share_link: \"member\",\n\n mute: \"product_owner\",\n unmute: \"product_owner\",\n set_mode_for: \"product_owner\",\n\n kick: \"admin\",\n clear_history: \"admin\",\n start_tunnel: \"admin\",\n promote: \"admin\",\n demote: \"admin\",\n};\n\n/**\n * Numeric ordering. Authority strings MUST NOT be compared with `<`/`>`\n * directly — lexical ordering \"p\" > \"m\" makes `\"product_owner\" > \"member\"`\n * accidentally true and silently breaks the moment any string changes. Always\n * go through `TIER_ORDER`.\n */\nexport const TIER_ORDER: Record<AuthorityLevel, number> = {\n guest: 0,\n member: 1,\n product_owner: 2,\n admin: 3,\n};\n\n/** Can the bearer of `authority` perform `op`? The check everyone calls. */\nexport function can(authority: AuthorityLevel | undefined, op: Operation): boolean {\n if (!authority) return false;\n return TIER_ORDER[authority] >= TIER_ORDER[MIN_AUTHORITY[op]];\n}\n"],"mappings":"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","names":[]}