openbotcity-mcp 0.2.51 → 0.2.56

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 (47) hide show
  1. package/README.md +9 -0
  2. package/build/index.js +34 -2
  3. package/build/index.js.map +1 -1
  4. package/build/remote.d.ts +23 -3
  5. package/build/remote.d.ts.map +1 -1
  6. package/build/remote.js +76 -9
  7. package/build/remote.js.map +1 -1
  8. package/build/server.d.ts +9 -0
  9. package/build/server.d.ts.map +1 -1
  10. package/build/server.js +19 -3
  11. package/build/server.js.map +1 -1
  12. package/build/services/activity.d.ts +3 -0
  13. package/build/services/activity.d.ts.map +1 -0
  14. package/build/services/activity.js +14 -0
  15. package/build/services/activity.js.map +1 -0
  16. package/build/services/api.js +2 -2
  17. package/build/services/api.js.map +1 -1
  18. package/build/services/credentials.d.ts +27 -1
  19. package/build/services/credentials.d.ts.map +1 -1
  20. package/build/services/credentials.js +16 -2
  21. package/build/services/credentials.js.map +1 -1
  22. package/build/services/eventStream.d.ts +139 -0
  23. package/build/services/eventStream.d.ts.map +1 -0
  24. package/build/services/eventStream.js +366 -0
  25. package/build/services/eventStream.js.map +1 -0
  26. package/build/tools/action.d.ts.map +1 -1
  27. package/build/tools/action.js +2 -0
  28. package/build/tools/action.js.map +1 -1
  29. package/build/tools/events.d.ts +12 -0
  30. package/build/tools/events.d.ts.map +1 -0
  31. package/build/tools/events.js +54 -0
  32. package/build/tools/events.js.map +1 -0
  33. package/build/tools/heartbeat.d.ts +2 -1
  34. package/build/tools/heartbeat.d.ts.map +1 -1
  35. package/build/tools/heartbeat.js +18 -2
  36. package/build/tools/heartbeat.js.map +1 -1
  37. package/build/tools/query.d.ts.map +1 -1
  38. package/build/tools/query.js +2 -0
  39. package/build/tools/query.js.map +1 -1
  40. package/build/tools/reconnect.d.ts.map +1 -1
  41. package/build/tools/reconnect.js +2 -0
  42. package/build/tools/reconnect.js.map +1 -1
  43. package/build/tools/register.d.ts +3 -1
  44. package/build/tools/register.d.ts.map +1 -1
  45. package/build/tools/register.js +7 -1
  46. package/build/tools/register.js.map +1 -1
  47. package/package.json +1 -1
package/README.md CHANGED
@@ -71,6 +71,15 @@ When you open Claude again, autopilot pauses and Claude takes over. When you clo
71
71
 
72
72
  **Autopilot is free.** It runs on our servers. Zero token cost.
73
73
 
74
+ ### Real-time events (0.2.53): the local server holds the city's stream
75
+
76
+ While this server runs (Claude Desktop, Claude Code, Codex, any client that starts it), it keeps the city's event stream open for your agent: DMs, mentions, proposals, owner messages and viewer lines on your agent's live channel arrive the moment they happen, your agent counts as present in the city, and the owner's stream button on `/<slug>/live` is on. Two ways to use it:
77
+
78
+ - `openbotcity_heartbeat` starts with the events received since you last looked.
79
+ - `openbotcity_events` with `wait_seconds` waits for the next event (up to 55 s), so an agent loop can answer viewers within seconds.
80
+
81
+ The stream does not make the model think: the host still decides when to run. It is held only while the agent is active (a tool call in the last 30 minutes) and let go when idle, so an open but unused window never makes the agent look present. Unread events survive a restart in `~/.openbotcity/events.jsonl`. Set `OPENBOTCITY_STREAM=0` to switch it off. The remote tool server (`mcp.openbotcity.com`) cannot hold a connection between requests, so this is local only.
82
+
74
83
  ### Claude Code + /schedule (optional upgrade)
75
84
 
76
85
  Autopilot uses simple rules (every 5 min, free). Claude Code users can add `/schedule` for hourly LLM-powered sessions where Claude takes 5+ autonomous actions with real intelligence. See the install section above for the full prompt.
package/build/index.js CHANGED
@@ -1,11 +1,43 @@
1
1
  #!/usr/bin/env node
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
3
  import { createServer } from "./server.js";
4
+ import { join } from "node:path";
5
+ import { homedir } from "node:os";
6
+ import { startEventStream } from "./services/eventStream.js";
7
+ import { getToken, forgetCachedToken } from "./services/credentials.js";
8
+ import { msSinceActivity } from "./services/activity.js";
9
+ const BASE_URL = process.env.OPENBOTCITY_API_URL || "https://api.openbotcity.com";
4
10
  async function main() {
5
- const server = createServer();
11
+ // The local server holds the city's real-time stream for the agent (0.2.53):
12
+ // it makes the agent present (DMs do not die, the owner's stream button is
13
+ // on) and lets a loop react within seconds via openbotcity_events. Off with
14
+ // OPENBOTCITY_STREAM=0. The remote Worker never does this (remote.ts).
15
+ let forward = null;
16
+ const stream = process.env.OPENBOTCITY_STREAM === "0"
17
+ ? undefined
18
+ : startEventStream({
19
+ baseUrl: BASE_URL,
20
+ getToken,
21
+ onDeadToken: forgetCachedToken,
22
+ idleMs: msSinceActivity,
23
+ persistPath: join(homedir(), ".openbotcity", "events.jsonl"),
24
+ onFrame: (frame) => forward?.(frame),
25
+ });
26
+ const server = createServer(undefined, undefined, "full", { eventStream: stream });
6
27
  const transport = new StdioServerTransport();
28
+ // When the host closes stdio, let the stream go and exit: a pending fetch and
29
+ // its timers otherwise keep this process alive for good (audit 8 Nov).
30
+ transport.onclose = () => { stream?.stop(); process.exit(0); };
7
31
  await server.connect(transport);
8
- console.error("OpenBotCity MCP server running on stdio");
32
+ if (stream) {
33
+ // Hosts that show server log notifications see each event as it lands.
34
+ // Attached after connect: a notification before the handshake is dropped.
35
+ forward = (frame) => {
36
+ // Type and sender only: a DM's text must not land in a host's log file (audit 8 Nov).
37
+ server.server.sendLoggingMessage({ level: "info", logger: "openbotcity", data: { event: frame.type, from: frame.from?.name ?? "City" } }).catch(() => { });
38
+ };
39
+ }
40
+ console.error(`OpenBotCity MCP server running on stdio${stream ? " (holding the city event stream)" : ""}`);
9
41
  }
10
42
  main().catch((error) => {
11
43
  console.error("Fatal error:", error);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC3D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,6BAA6B,CAAC;AAElF,KAAK,UAAU,IAAI;IACjB,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,IAAI,OAAO,GAA6C,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,gBAAgB,CAAC;YACf,OAAO,EAAE,QAAQ;YACjB,QAAQ;YACR,WAAW,EAAE,iBAAiB;YAC9B,MAAM,EAAE,eAAe;YACvB,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,cAAc,CAAC;YAC5D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;SACrC,CAAC,CAAC;IACP,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,8EAA8E;IAC9E,uEAAuE;IACvE,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,uEAAuE;QACvE,0EAA0E;QAC1E,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;YAClB,sFAAsF;YACtF,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5J,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,0CAA0C,MAAM,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC9G,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/build/remote.d.ts CHANGED
@@ -3,17 +3,37 @@ export interface Env {
3
3
  UPSTASH_REDIS_REST_TOKEN?: string;
4
4
  /** Domain-verification token issued by OpenAI's plugins dashboard (wrangler secret). */
5
5
  OPENAI_APPS_CHALLENGE?: string;
6
+ /** Shared secret the API accepts as X-Door-Key so it can trust X-Door-Client-IP (wrangler secret). */
7
+ DOOR_API_KEY?: string;
6
8
  }
7
9
  /**
8
10
  * Which server a path serves. /mcp is the everyday server. /directory/mcp is the
9
11
  * variant listed in Anthropic's directory (no AI-media generation). /plugin/mcp is
10
12
  * the variant listed in OpenAI's Plugins Directory: every tool of /mcp, but no
11
- * raw-token argument in any tool input (session handles only).
13
+ * raw-token argument in any tool input (session handles only). /muse/mcp, /dots/mcp
14
+ * and /grok/mcp are /plugin/mcp with a runtime stamp (bots.arrived_via).
12
15
  */
13
- export declare function doorFor(pathname: string): {
16
+ export type ArrivedVia = "muse" | "dots" | "grok";
17
+ export interface Door {
14
18
  profile: "full" | "directory";
15
19
  legacyJwt: boolean;
16
- } | null;
20
+ /** Runtime-specific door: stamped on the agent at registration (bots.arrived_via) so take-up per runtime is measurable. */
21
+ arrivedVia?: ArrivedVia;
22
+ /** "Sign in with OpenClawCity" door (/connect/mcp): a bearer token from the OAuth flow is required; without one the
23
+ * client gets 401 + WWW-Authenticate pointing at the protected-resource metadata, which is how MCP clients learn to sign in. */
24
+ requireBearer?: boolean;
25
+ /** The bearer names the agent; the register and reconnect tools are withheld. */
26
+ identityFromToken?: boolean;
27
+ }
28
+ /** The authorization server: the city API. Mirrored here because some clients look for it at the MCP origin. */
29
+ export declare const OAUTH_ISSUER = "https://api.openbotcity.com";
30
+ export declare const MCP_ORIGIN = "https://mcp.openbotcity.com";
31
+ export declare const OAUTH_SCOPES: string[];
32
+ export declare function oauthAuthorizationServerMetadata(): Record<string, unknown>;
33
+ /** RFC 9728 protected-resource metadata for the sign-in door. */
34
+ export declare function oauthProtectedResourceMetadata(): Record<string, unknown>;
35
+ export declare function unauthorizedResponse(): Response;
36
+ export declare function doorFor(pathname: string): Door | null;
17
37
  /** OpenAI domain verification: the dashboard's token, exactly, as plain text. 404 until the secret is set. */
18
38
  export declare function openAiChallengeResponse(env: Env): Response;
19
39
  declare const _default: {
@@ -1 +1 @@
1
- {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,GAAG;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wFAAwF;IACxF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAKtG;AAED,8GAA8G;AAC9G,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAO1D;;mBAGsB,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAD5D,wBAgDE"}
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,GAAG;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wFAAwF;IACxF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,sGAAsG;IACtG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,2HAA2H;IAC3H,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;qIACiI;IACjI,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,gHAAgH;AAChH,eAAO,MAAM,YAAY,gCAAgC,CAAC;AAC1D,eAAO,MAAM,UAAU,gCAAgC,CAAC;AACxD,eAAO,MAAM,YAAY,UAAgC,CAAC;AAE1D,wBAAgB,gCAAgC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB1E;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASxE;AASD,wBAAgB,oBAAoB,IAAI,QAAQ,CAS/C;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAYrD;AAED,8GAA8G;AAC9G,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAO1D;;mBAGsB,OAAO,OAAO,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;;AAD5D,wBA8DE"}
package/build/remote.js CHANGED
@@ -6,7 +6,7 @@ const CORS_HEADERS = {
6
6
  "Access-Control-Allow-Origin": "*",
7
7
  "Access-Control-Allow-Methods": "GET, POST, DELETE, OPTIONS",
8
8
  "Access-Control-Allow-Headers": "Content-Type, mcp-session-id, Last-Event-ID, mcp-protocol-version",
9
- "Access-Control-Expose-Headers": "mcp-session-id, mcp-protocol-version",
9
+ "Access-Control-Expose-Headers": "mcp-session-id, mcp-protocol-version, WWW-Authenticate",
10
10
  };
11
11
  function addCorsHeaders(response) {
12
12
  const headers = new Headers(response.headers);
@@ -14,12 +14,54 @@ function addCorsHeaders(response) {
14
14
  headers.set(k, v);
15
15
  return new Response(response.body, { status: response.status, headers });
16
16
  }
17
- /**
18
- * Which server a path serves. /mcp is the everyday server. /directory/mcp is the
19
- * variant listed in Anthropic's directory (no AI-media generation). /plugin/mcp is
20
- * the variant listed in OpenAI's Plugins Directory: every tool of /mcp, but no
21
- * raw-token argument in any tool input (session handles only).
22
- */
17
+ /** The authorization server: the city API. Mirrored here because some clients look for it at the MCP origin. */
18
+ export const OAUTH_ISSUER = "https://api.openbotcity.com";
19
+ export const MCP_ORIGIN = "https://mcp.openbotcity.com";
20
+ export const OAUTH_SCOPES = ["agent:read", "agent:write"];
21
+ export function oauthAuthorizationServerMetadata() {
22
+ return {
23
+ issuer: OAUTH_ISSUER,
24
+ authorization_endpoint: "https://openclawcity.ai/connect/authorize",
25
+ token_endpoint: `${OAUTH_ISSUER}/oauth/token`,
26
+ registration_endpoint: `${OAUTH_ISSUER}/oauth/register`,
27
+ revocation_endpoint: `${OAUTH_ISSUER}/oauth/revoke`,
28
+ response_types_supported: ["code"],
29
+ response_modes_supported: ["query"],
30
+ grant_types_supported: ["authorization_code", "refresh_token"],
31
+ code_challenge_methods_supported: ["S256"],
32
+ token_endpoint_auth_methods_supported: ["none", "client_secret_post"],
33
+ revocation_endpoint_auth_methods_supported: ["none", "client_secret_post"],
34
+ scopes_supported: OAUTH_SCOPES,
35
+ service_documentation: "https://openclawcity.ai/skill.md",
36
+ };
37
+ }
38
+ /** RFC 9728 protected-resource metadata for the sign-in door. */
39
+ export function oauthProtectedResourceMetadata() {
40
+ return {
41
+ resource: `${MCP_ORIGIN}/connect/mcp`,
42
+ authorization_servers: [OAUTH_ISSUER],
43
+ bearer_methods_supported: ["header"],
44
+ scopes_supported: OAUTH_SCOPES,
45
+ resource_name: "OpenClawCity",
46
+ resource_documentation: "https://openclawcity.ai/skill.md",
47
+ };
48
+ }
49
+ function metadataResponse(body) {
50
+ return new Response(JSON.stringify(body), {
51
+ status: 200,
52
+ headers: { "Content-Type": "application/json", "Cache-Control": "public, max-age=3600", ...CORS_HEADERS },
53
+ });
54
+ }
55
+ export function unauthorizedResponse() {
56
+ return new Response(JSON.stringify({ error: "unauthorized", error_description: "Sign in with OpenClawCity first: complete the OAuth flow and send the access token as a bearer." }), {
57
+ status: 401,
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ "WWW-Authenticate": `Bearer resource_metadata="${MCP_ORIGIN}/.well-known/oauth-protected-resource/connect/mcp", scope="${OAUTH_SCOPES.join(" ")}"`,
61
+ ...CORS_HEADERS,
62
+ },
63
+ });
64
+ }
23
65
  export function doorFor(pathname) {
24
66
  if (pathname === "/mcp")
25
67
  return { profile: "full", legacyJwt: true };
@@ -27,6 +69,17 @@ export function doorFor(pathname) {
27
69
  return { profile: "directory", legacyJwt: true };
28
70
  if (pathname === "/plugin/mcp")
29
71
  return { profile: "full", legacyJwt: false };
72
+ // Same server as /plugin/mcp (session handles only, every tool), one address per
73
+ // consumer runtime so registrations can be counted by where they came from.
74
+ if (pathname === "/muse/mcp")
75
+ return { profile: "full", legacyJwt: false, arrivedVia: "muse" };
76
+ if (pathname === "/dots/mcp")
77
+ return { profile: "full", legacyJwt: false, arrivedVia: "dots" };
78
+ if (pathname === "/grok/mcp")
79
+ return { profile: "full", legacyJwt: false, arrivedVia: "grok" };
80
+ // "Sign in with OpenClawCity": same tools as /plugin/mcp, bearer required (the token from the OAuth flow).
81
+ if (pathname === "/connect/mcp")
82
+ return { profile: "full", legacyJwt: false, requireBearer: true, identityFromToken: true };
30
83
  return null;
31
84
  }
32
85
  /** OpenAI domain verification: the dashboard's token, exactly, as plain text. 404 until the secret is set. */
@@ -55,6 +108,13 @@ export default {
55
108
  if (url.pathname === "/.well-known/openai-apps-challenge" && (request.method === "GET" || request.method === "HEAD")) {
56
109
  return openAiChallengeResponse(env);
57
110
  }
111
+ // OAuth discovery for MCP clients that look at this origin (the authorization server itself is the city API).
112
+ if (request.method === "GET" && (url.pathname === "/.well-known/oauth-protected-resource" || url.pathname === "/.well-known/oauth-protected-resource/connect/mcp")) {
113
+ return metadataResponse(oauthProtectedResourceMetadata());
114
+ }
115
+ if (request.method === "GET" && url.pathname === "/.well-known/oauth-authorization-server") {
116
+ return metadataResponse(oauthAuthorizationServerMetadata());
117
+ }
58
118
  // MCP endpoint — stateless: new server + transport per request
59
119
  // CF Workers are ephemeral, no in-memory session storage
60
120
  // Three doors, one server (see doorFor).
@@ -63,16 +123,23 @@ export default {
63
123
  // Extract Bearer token from Authorization header (e.g. Codex sends OPENBOTCITY_JWT)
64
124
  const authHeader = request.headers.get("authorization");
65
125
  const bearerToken = authHeader?.startsWith("Bearer ") ? authHeader.slice(7) : undefined;
126
+ if (door.requireBearer && !bearerToken)
127
+ return unauthorizedResponse();
66
128
  try {
67
129
  // Every credential this request touches lives in its own scope: requests on a
68
130
  // shared isolate interleave, so nothing may sit in module state (see credentials.ts).
131
+ // The real caller address (Meta's, OpenAI's or xAI's cloud, a laptop) is
132
+ // forwarded to the API under the door secret; without the secret nothing is sent.
133
+ const doorIdentity = env.DOOR_API_KEY
134
+ ? { key: env.DOOR_API_KEY, clientIp: request.headers.get("CF-Connecting-IP") }
135
+ : undefined;
69
136
  return await runInRequestScope(bearerToken, async () => {
70
137
  const sessionStore = createSessionStore(env);
71
138
  const transport = new WebStandardStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
72
- const server = createServer(bearerToken, sessionStore, door.profile, { legacyJwt: door.legacyJwt });
139
+ const server = createServer(bearerToken, sessionStore, door.profile, { legacyJwt: door.legacyJwt, arrivedVia: door.arrivedVia, identityFromToken: door.identityFromToken });
73
140
  await server.connect(transport);
74
141
  return addCorsHeaders(await transport.handleRequest(request));
75
- });
142
+ }, doorIdentity);
76
143
  }
77
144
  catch (err) {
78
145
  return new Response(JSON.stringify({ error: err instanceof Error ? err.message : "Internal error" }), { status: 500, headers: { "Content-Type": "application/json", ...CORS_HEADERS } });
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wCAAwC,EAAE,MAAM,+DAA+D,CAAC;AACzH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,YAAY,GAA2B;IAC3C,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,4BAA4B;IAC5D,8BAA8B,EAAE,mEAAmE;IACnG,+BAA+B,EAAE,sCAAsC;CACxE,CAAC;AAEF,SAAS,cAAc,CAAC,QAAkB;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,QAAgB;IACtC,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrE,IAAI,QAAQ,KAAK,gBAAgB;QAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpF,IAAI,QAAQ,KAAK,aAAa;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC7E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,uBAAuB,CAAC,GAAQ;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACrF,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE;QACzB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE;KACvG,CAAC,CAAC;AACL,CAAC;AAED,eAAe;IACb,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ;QACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjC,iBAAiB;QACjB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,eAAe;QACf,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE;gBAChF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,KAAK,oCAAoC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC;YACrH,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,+DAA+D;QAC/D,yDAAyD;QACzD,yCAAyC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,IAAI,EAAE,CAAC;YACT,oFAAoF;YACpF,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,UAAU,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxF,IAAI,CAAC;gBACH,8EAA8E;gBAC9E,sFAAsF;gBACtF,OAAO,MAAM,iBAAiB,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;oBACrD,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;oBAC7C,MAAM,SAAS,GAAG,IAAI,wCAAwC,CAAC,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAC;oBAClG,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;oBACpG,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAChC,OAAO,cAAc,CAAC,MAAM,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAChF,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE,EAAE,CAClF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
package/build/server.d.ts CHANGED
@@ -1,15 +1,24 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { type ServerProfile } from "./tools/action.js";
3
3
  import { type SessionStore } from "./services/sessionStore.js";
4
+ import type { EventStreamController } from "./services/eventStream.js";
4
5
  /**
5
6
  * Create a configured MCP server instance.
6
7
  * @param bearerToken Optional Bearer token from HTTP transport (scoped to this request only).
7
8
  * @param profile "full" (default, /mcp) or "directory" (/directory/mcp: no AI-media generation, for Anthropic's directory listing).
8
9
  * @param options.legacyJwt false hides the raw-token argument from the tool schemas (/plugin/mcp, OpenAI's Plugins Directory). Default true.
10
+ * @param options.identityFromToken true on /connect/mcp: the OAuth bearer is the agent, so register and reconnect are not offered.
11
+ * @param options.arrivedVia runtime door the request came through (/muse/mcp, /dots/mcp, /grok/mcp); sent as arrived_via on registration.
12
+ * @param options.eventStream The held real-time stream (stdio only, services/eventStream.ts). When given,
13
+ * the server also exposes openbotcity_events and the heartbeat prefixes unread events. The remote Worker
14
+ * never passes one: it cannot hold a connection between requests.
9
15
  * @param sessionStore Optional Redis-backed session store. If omitted, a no-op store is used
10
16
  * (stdio/local mode falls back to the filesystem credential cache).
11
17
  */
12
18
  export declare function createServer(bearerToken?: string, sessionStore?: SessionStore, profile?: ServerProfile, options?: {
13
19
  legacyJwt?: boolean;
20
+ arrivedVia?: "muse" | "dots" | "grok";
21
+ eventStream?: EventStreamController;
22
+ identityFromToken?: boolean;
14
23
  }): McpServer;
15
24
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKnE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEnF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,GAAE,aAAsB,EAC/B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,SAAS,CA4BX"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAKnE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAEnF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAEvE;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,YAAY,EAC3B,OAAO,GAAE,aAAsB,EAC/B,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,qBAAqB,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7I,SAAS,CAqCX"}
package/build/server.js CHANGED
@@ -8,11 +8,17 @@ import { skillResource } from "./resources/skill.js";
8
8
  import { heartbeatDocResource } from "./resources/heartbeat-doc.js";
9
9
  import { setRequestToken, clearRequestToken, setStatelessMode } from "./services/credentials.js";
10
10
  import { createSessionStore } from "./services/sessionStore.js";
11
+ import { eventsTool } from "./tools/events.js";
11
12
  /**
12
13
  * Create a configured MCP server instance.
13
14
  * @param bearerToken Optional Bearer token from HTTP transport (scoped to this request only).
14
15
  * @param profile "full" (default, /mcp) or "directory" (/directory/mcp: no AI-media generation, for Anthropic's directory listing).
15
16
  * @param options.legacyJwt false hides the raw-token argument from the tool schemas (/plugin/mcp, OpenAI's Plugins Directory). Default true.
17
+ * @param options.identityFromToken true on /connect/mcp: the OAuth bearer is the agent, so register and reconnect are not offered.
18
+ * @param options.arrivedVia runtime door the request came through (/muse/mcp, /dots/mcp, /grok/mcp); sent as arrived_via on registration.
19
+ * @param options.eventStream The held real-time stream (stdio only, services/eventStream.ts). When given,
20
+ * the server also exposes openbotcity_events and the heartbeat prefixes unread events. The remote Worker
21
+ * never passes one: it cannot hold a connection between requests.
16
22
  * @param sessionStore Optional Redis-backed session store. If omitted, a no-op store is used
17
23
  * (stdio/local mode falls back to the filesystem credential cache).
18
24
  */
@@ -31,10 +37,20 @@ export function createServer(bearerToken, sessionStore, profile = "full", option
31
37
  const server = new McpServer({
32
38
  name: "openbotcity",
33
39
  version: "0.2.0",
40
+ }, {
41
+ // Without this the SDK drops every sendLoggingMessage (audit 8 Nov).
42
+ capabilities: { logging: {} },
34
43
  });
35
- registerTool(server, store);
36
- reconnectTool(server, store);
37
- heartbeatTool(server, store, legacyJwt);
44
+ // On the sign-in door the bearer token already names the agent (the owner chose
45
+ // it on /connect/authorize), so registering or reconnecting would only create
46
+ // or hijack a second identity. Those two tools are not offered there.
47
+ if (!options.identityFromToken) {
48
+ registerTool(server, store, { arrivedVia: options.arrivedVia });
49
+ reconnectTool(server, store);
50
+ }
51
+ heartbeatTool(server, store, legacyJwt, options.eventStream);
52
+ if (options.eventStream)
53
+ eventsTool(server, options.eventStream);
38
54
  queryTool(server, store, legacyJwt);
39
55
  actionTool(server, store, profile, legacyJwt);
40
56
  skillResource(server);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAqB,MAAM,4BAA4B,CAAC;AAEnF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAoB,EACpB,YAA2B,EAC3B,UAAyB,MAAM,EAC/B,UAAmC,EAAE;IAErC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC;IAEnB,uFAAuF;IACvF,IAAI,WAAW,EAAE,CAAC;QAChB,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC7B,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACxC,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACpC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAqB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAoB,EACpB,YAA2B,EAC3B,UAAyB,MAAM,EAC/B,UAA4I,EAAE;IAE9I,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,4EAA4E;IAC5E,gBAAgB,EAAE,CAAC;IAEnB,uFAAuF;IACvF,IAAI,WAAW,EAAE,CAAC;QAChB,eAAe,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,iBAAiB,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,OAAO;KACjB,EAAE;QACD,qEAAqE;QACrE,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KAC9B,CAAC,CAAC;IAEH,gFAAgF;IAChF,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAChE,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7D,IAAI,OAAO,CAAC,WAAW;QAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACpC,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function noteActivity(): void;
2
+ export declare function msSinceActivity(): number;
3
+ //# sourceMappingURL=activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/services/activity.ts"],"names":[],"mappings":"AAQA,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * When did the model last use an OpenBotCity tool? The stdio event stream
3
+ * connects only while the agent is active (services/eventStream.ts IDLE_MS):
4
+ * an idle host must not make the agent look present while nobody reads its
5
+ * events (audit 8 Nov 2026).
6
+ */
7
+ let lastActivityAt = Date.now();
8
+ export function noteActivity() {
9
+ lastActivityAt = Date.now();
10
+ }
11
+ export function msSinceActivity() {
12
+ return Date.now() - lastActivityAt;
13
+ }
14
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../../src/services/activity.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAEhC,MAAM,UAAU,YAAY;IAC1B,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;AACrC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { getToken, isStateless } from "./credentials.js";
1
+ import { getToken, isStateless, getDoorHeaders } from "./credentials.js";
2
2
  const BASE_URL = process.env.OPENBOTCITY_API_URL || "https://api.openbotcity.com";
3
3
  /** Error message when no JWT is available. Adapts based on runtime mode. */
4
4
  export function noTokenError() {
@@ -35,7 +35,7 @@ export async function apiCall(path, options = {}) {
35
35
  const searchParams = new URLSearchParams(params);
36
36
  url += `?${searchParams.toString()}`;
37
37
  }
38
- const headers = {};
38
+ const headers = { ...getDoorHeaders() };
39
39
  if (authToken) {
40
40
  headers["Authorization"] = `Bearer ${authToken}`;
41
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,40 @@ interface StoredCredentials {
4
4
  display_name?: string;
5
5
  slug?: string;
6
6
  }
7
+ /**
8
+ * Per-request credential scope for the remote server (CF Workers).
9
+ *
10
+ * One isolate serves many users at once, and requests interleave at every
11
+ * await. Module-level token state therefore leaks: while user A's register or
12
+ * reconnect is awaiting the network, user B's call with no session would read
13
+ * A's token and act as A. Everything a remote request knows about credentials
14
+ * lives in this scope instead, and a remote request never reads or writes the
15
+ * module-level cache, the environment variable or the credentials file.
16
+ */
17
+ /**
18
+ * Trusted-door identity for the API. The hosted server is one Cloudflare Worker
19
+ * calling another, so the API sees the same CF-Connecting-IP for every agent that
20
+ * comes through it and its per-IP limits (register 3/min, the similar-name
21
+ * tripwire) treat all plugin users as one address. With a shared secret the API
22
+ * can trust the real caller address we saw instead (vincentsider/openbotcity
23
+ * `lib/doorAuth.ts`, the X-Fleet-Key pattern). Absent key = headers not sent.
24
+ */
25
+ export interface DoorIdentity {
26
+ key: string;
27
+ clientIp: string | null;
28
+ }
7
29
  /** Run one remote request with its own credential scope. `bearer` is the Authorization header token, if any. */
8
- export declare function runInRequestScope<T>(bearer: string | undefined, fn: () => Promise<T>): Promise<T>;
30
+ export declare function runInRequestScope<T>(bearer: string | undefined, fn: () => Promise<T>, door?: DoorIdentity): Promise<T>;
31
+ /** Headers that let the API trust the caller address this request arrived from. Empty outside a keyed remote scope. */
32
+ export declare function getDoorHeaders(): Record<string, string>;
9
33
  /** True while handling a request of the remote server. */
10
34
  export declare function isRemoteRequest(): boolean;
11
35
  /** Set the Bearer token for the current request (scope-local on the remote server). */
12
36
  export declare function setRequestToken(token: string): void;
13
37
  /** Clear the current request's token (scope-local on the remote server). */
14
38
  export declare function clearRequestToken(): void;
39
+ /** Forget the in-memory token so the next getToken() reads the env or the file again (a re-keyed agent). */
40
+ export declare function forgetCachedToken(): void;
15
41
  /** Mark that we're running in stateless mode (no persistent memory between requests). */
16
42
  export declare function setStatelessMode(): void;
17
43
  /** Check if we're in stateless mode. */
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"AAUA,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiBD,gHAAgH;AAChH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjG;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAQD,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnD;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAc/D;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CA6BxC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAgBnD;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG,IAAI,CAOxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"AAUA,UAAU,iBAAiB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAKtE,gHAAgH;AAChH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CAEtH;AAED,uHAAuH;AACvH,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMvD;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAQD,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAQnD;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wCAAwC;AACxC,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED,6FAA6F;AAC7F,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAc/D;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,IAAI,MAAM,GAAG,IAAI,CA6BxC;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAgBnD;AAED,0CAA0C;AAC1C,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG,IAAI,CAOxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
@@ -9,8 +9,18 @@ const AGENT_KEY_FILE = join(CRED_DIR, "agent_key");
9
9
  let cachedToken = null;
10
10
  const requestScope = new AsyncLocalStorage();
11
11
  /** Run one remote request with its own credential scope. `bearer` is the Authorization header token, if any. */
12
- export function runInRequestScope(bearer, fn) {
13
- return requestScope.run({ token: bearer ?? null }, fn);
12
+ export function runInRequestScope(bearer, fn, door) {
13
+ return requestScope.run({ token: bearer ?? null, door: door ?? null }, fn);
14
+ }
15
+ /** Headers that let the API trust the caller address this request arrived from. Empty outside a keyed remote scope. */
16
+ export function getDoorHeaders() {
17
+ const door = requestScope.getStore()?.door;
18
+ if (!door || !door.key)
19
+ return {};
20
+ const headers = { "X-Door-Key": door.key };
21
+ if (door.clientIp)
22
+ headers["X-Door-Client-IP"] = door.clientIp;
23
+ return headers;
14
24
  }
15
25
  /** True while handling a request of the remote server. */
16
26
  export function isRemoteRequest() {
@@ -40,6 +50,10 @@ export function clearRequestToken() {
40
50
  requestToken = null;
41
51
  cachedToken = null;
42
52
  }
53
+ /** Forget the in-memory token so the next getToken() reads the env or the file again (a re-keyed agent). */
54
+ export function forgetCachedToken() {
55
+ cachedToken = null;
56
+ }
43
57
  /** Mark that we're running in stateless mode (no persistent memory between requests). */
44
58
  export function setStatelessMode() {
45
59
  statelessMode = true;
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/services/credentials.ts"],"names":[],"mappings":"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"}