@gorlitzer-labs/apiary 1.13.3 → 1.13.4
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/README.md +27 -7
- package/dist/agent/index.js +2 -2
- package/dist/{chunk-AYQJIAR5.js → chunk-4A7MREYX.js} +2 -2
- package/dist/{chunk-ED6ROH6B.js → chunk-7JXPJO3R.js} +4 -4
- package/dist/{chunk-CZHO4DBN.js → chunk-BCQQJR5E.js} +3 -3
- package/dist/{chunk-TPNFOQA7.js → chunk-HTNCLNPX.js} +4 -4
- package/dist/{chunk-CFY6Z6Q6.js → chunk-MEWZT5KA.js} +2 -2
- package/dist/{chunk-ZEFRNAX6.js → chunk-TISBXM4R.js} +3 -3
- package/dist/chunk-TISBXM4R.js.map +1 -0
- package/dist/{chunk-QL66XSDB.js → chunk-TMXQDGMN.js} +7 -4
- package/dist/chunk-TMXQDGMN.js.map +1 -0
- package/dist/cli/index.js +15 -15
- package/dist/{invites-OFXIQLLN.js → invites-GRROUSCE.js} +5 -5
- package/dist/{join-CQXEF65B.js → join-H62VB4HU.js} +5 -5
- package/dist/{room-Z7KDRVYD.js → room-IHVB5CWO.js} +6 -6
- package/dist/{run-DOADB4T7.js → run-UJO7NO3C.js} +5 -5
- package/package.json +5 -4
- package/dist/chunk-QL66XSDB.js.map +0 -1
- package/dist/chunk-ZEFRNAX6.js.map +0 -1
- /package/dist/{chunk-AYQJIAR5.js.map → chunk-4A7MREYX.js.map} +0 -0
- /package/dist/{chunk-ED6ROH6B.js.map → chunk-7JXPJO3R.js.map} +0 -0
- /package/dist/{chunk-CZHO4DBN.js.map → chunk-BCQQJR5E.js.map} +0 -0
- /package/dist/{chunk-TPNFOQA7.js.map → chunk-HTNCLNPX.js.map} +0 -0
- /package/dist/{chunk-CFY6Z6Q6.js.map → chunk-MEWZT5KA.js.map} +0 -0
- /package/dist/{invites-OFXIQLLN.js.map → invites-GRROUSCE.js.map} +0 -0
- /package/dist/{join-CQXEF65B.js.map → join-H62VB4HU.js.map} +0 -0
- /package/dist/{room-Z7KDRVYD.js.map → room-IHVB5CWO.js.map} +0 -0
- /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-
|
|
4
|
+
} from "../chunk-7JXPJO3R.js";
|
|
5
5
|
import {
|
|
6
6
|
deliverInvite,
|
|
7
7
|
sameApiaryServer
|
|
8
|
-
} from "../chunk-
|
|
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-
|
|
35
|
+
} from "../chunk-BCQQJR5E.js";
|
|
36
36
|
import "../chunk-PEB6HEFT.js";
|
|
37
37
|
import {
|
|
38
38
|
buildRuntimeMcpOptions
|
|
39
|
-
} from "../chunk-
|
|
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-
|
|
47
|
+
} from "../chunk-TISBXM4R.js";
|
|
48
48
|
import {
|
|
49
49
|
buildShareUrl
|
|
50
|
-
} from "../chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-MEWZT5KA.js";
|
|
9
|
+
import "./chunk-BCQQJR5E.js";
|
|
10
10
|
import "./chunk-PEB6HEFT.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-4A7MREYX.js";
|
|
12
12
|
import "./chunk-D7DXZQWT.js";
|
|
13
|
-
import "./chunk-
|
|
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-
|
|
23
|
+
//# sourceMappingURL=invites-GRROUSCE.js.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
HEADLESS_READY,
|
|
3
3
|
join
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-7JXPJO3R.js";
|
|
5
|
+
import "./chunk-BCQQJR5E.js";
|
|
6
6
|
import "./chunk-PEB6HEFT.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-4A7MREYX.js";
|
|
8
8
|
import "./chunk-D7DXZQWT.js";
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
15
|
+
//# sourceMappingURL=join-H62VB4HU.js.map
|
|
@@ -13,14 +13,14 @@ import {
|
|
|
13
13
|
tmuxAvailable,
|
|
14
14
|
tmuxKillSession,
|
|
15
15
|
tmuxSessionExists
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-BCQQJR5E.js";
|
|
17
17
|
import "./chunk-PEB6HEFT.js";
|
|
18
18
|
import {
|
|
19
19
|
buildShareUrl,
|
|
20
20
|
extractToken
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4A7MREYX.js";
|
|
22
22
|
import "./chunk-D7DXZQWT.js";
|
|
23
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
1099
|
+
//# sourceMappingURL=room-IHVB5CWO.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildRuntimeMcpOptions
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HTNCLNPX.js";
|
|
4
4
|
import {
|
|
5
5
|
EventProcessor,
|
|
6
6
|
SseMultiplexer,
|
|
7
7
|
createStdioRuntimeMcpServer
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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
|
+
"version": "1.13.4",
|
|
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/
|
|
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/
|
|
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":[]}
|