@clawos-dev/clawd 0.2.220 → 0.2.221-beta.432.4424967

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.
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Clawd 分享</title>
7
- <script type="module" crossorigin src="/share-ui/assets/guest-DqLSkH6e.js"></script>
7
+ <script type="module" crossorigin src="/share-ui/assets/guest-ZjGuFfc2.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/share-ui/assets/guest-CuXP1xCR.css">
9
9
  </head>
10
10
  <body style="margin: 0">
@@ -6899,7 +6899,9 @@ __export(mcp_server_exports, {
6899
6899
  handleOpenPr: () => handleOpenPr,
6900
6900
  handleReleaseTicket: () => handleReleaseTicket,
6901
6901
  handleStartTicket: () => handleStartTicket,
6902
- handleUpdateTicket: () => handleUpdateTicket
6902
+ handleUpdateTicket: () => handleUpdateTicket,
6903
+ makeCallerAwareHandler: () => makeCallerAwareHandler,
6904
+ resolveTicketCaller: () => resolveTicketCaller
6903
6905
  });
6904
6906
  module.exports = __toCommonJS(mcp_server_exports);
6905
6907
  var import_node_fs = __toESM(require("fs"), 1);
@@ -21236,36 +21238,75 @@ async function handleOpenPr(input, client) {
21236
21238
  async function handleAbandonTicket(input, client) {
21237
21239
  return unwrap(await client.call("POST", `/tickets/${encodeURIComponent(input.id)}/abandon`, {}));
21238
21240
  }
21239
- function readCtxFromEnv() {
21240
- const apiUrl = process.env.CLAWD_TICKET_API_URL ?? "";
21241
- const apiKey = process.env.CLAWD_TICKET_API_KEY ?? "";
21242
- const did = process.env.CLAWD_TICKET_DID ?? "";
21243
- const name = process.env.CLAWD_TICKET_NAME ?? "";
21244
- const sceneRaw = process.env.CLAWD_TICKET_SCENE ?? "persona";
21245
- const scene = sceneRaw === "daemon" || sceneRaw === "ci" || sceneRaw === "persona" ? sceneRaw : "persona";
21246
- if (!apiUrl || !apiKey || !did) {
21247
- logLine("startup: missing env", {
21248
- hasApiUrl: !!apiUrl,
21249
- hasApiKey: !!apiKey,
21250
- hasDid: !!did,
21251
- hasName: !!name,
21252
- scene
21241
+ async function resolveTicketCaller(opts = {}) {
21242
+ const daemonUrl = process.env.CLAWD_DAEMON_URL;
21243
+ const sessionId = process.env.CLAWD_SESSION_ID;
21244
+ if (!daemonUrl || !sessionId) {
21245
+ logLine("resolveCaller: env missing", { hasDaemonUrl: !!daemonUrl, hasSessionId: !!sessionId });
21246
+ return null;
21247
+ }
21248
+ const f = opts.fetch ?? fetch;
21249
+ let res;
21250
+ try {
21251
+ res = await f(`${daemonUrl}/api/rpc/session.currentTurnSender`, {
21252
+ method: "POST",
21253
+ headers: { "content-type": "application/json", "x-clawd-session-id": sessionId },
21254
+ body: "{}"
21253
21255
  });
21256
+ } catch (err) {
21257
+ logLine("resolveCaller: fetch threw", { err: String(err) });
21258
+ return null;
21254
21259
  }
21255
- return { apiUrl, apiKey, did, name, scene };
21260
+ if (!res.ok) {
21261
+ logLine("resolveCaller: non-2xx", { status: res.status });
21262
+ return null;
21263
+ }
21264
+ let json;
21265
+ try {
21266
+ json = await res.json();
21267
+ } catch {
21268
+ logLine("resolveCaller: non-JSON");
21269
+ return null;
21270
+ }
21271
+ const sender = json?.result?.sender;
21272
+ if (!sender?.did || !sender?.displayName) {
21273
+ logLine("resolveCaller: no active sender", { hasSender: !!sender });
21274
+ return null;
21275
+ }
21276
+ return { did: sender.did, name: sender.displayName };
21277
+ }
21278
+ function makeCallerAwareHandler(logic, deps = {}) {
21279
+ return async (input) => {
21280
+ const resolve = deps.resolveCaller ?? resolveTicketCaller;
21281
+ const caller = await resolve();
21282
+ if (!caller) {
21283
+ return fail(
21284
+ "no active sender: ticket call rejected (session.currentTurnSender returned no caller)"
21285
+ );
21286
+ }
21287
+ const sceneRaw = process.env.CLAWD_TICKET_SCENE ?? "persona";
21288
+ const scene = sceneRaw === "daemon" || sceneRaw === "ci" || sceneRaw === "persona" ? sceneRaw : "persona";
21289
+ const client = makeTicketApiClient({
21290
+ apiUrl: process.env.CLAWD_TICKET_API_URL ?? "",
21291
+ apiKey: process.env.CLAWD_TICKET_API_KEY ?? "",
21292
+ did: caller.did,
21293
+ name: caller.name,
21294
+ scene
21295
+ });
21296
+ return logic(input, client);
21297
+ };
21256
21298
  }
21257
21299
  async function main() {
21258
- const ctx = readCtxFromEnv();
21259
21300
  logLine("startup: server boot", {
21260
21301
  server: SERVER_NAME,
21261
21302
  version: SERVER_VERSION,
21262
- apiUrl: ctx.apiUrl,
21263
- did: ctx.did,
21264
- callerName: ctx.name,
21265
- scene: ctx.scene,
21303
+ apiUrl: process.env.CLAWD_TICKET_API_URL ?? "",
21304
+ hasApiKey: !!process.env.CLAWD_TICKET_API_KEY,
21305
+ daemonUrl: process.env.CLAWD_DAEMON_URL ?? "(missing)",
21306
+ sessionId: process.env.CLAWD_SESSION_ID ?? "(missing)",
21307
+ scene: process.env.CLAWD_TICKET_SCENE ?? "persona",
21266
21308
  logTarget: TICKET_LOG ?? "stderr (no CLAWD_TICKET_LOG env)"
21267
21309
  });
21268
- const client = makeTicketApiClient(ctx);
21269
21310
  const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
21270
21311
  const TICKET_STATUS_ENUM = [
21271
21312
  "open",
@@ -21284,7 +21325,7 @@ async function main() {
21284
21325
  summary: external_exports.string().min(1),
21285
21326
  type: external_exports.enum(TICKET_TYPE_ENUM)
21286
21327
  },
21287
- async (input) => handleCreateTicket(input, client)
21328
+ makeCallerAwareHandler(handleCreateTicket)
21288
21329
  );
21289
21330
  server.tool(
21290
21331
  "list_tickets",
@@ -21294,13 +21335,13 @@ async function main() {
21294
21335
  all: external_exports.boolean().optional(),
21295
21336
  version: external_exports.string().optional()
21296
21337
  },
21297
- async (input) => handleListTickets(input, client)
21338
+ makeCallerAwareHandler(handleListTickets)
21298
21339
  );
21299
21340
  server.tool(
21300
21341
  "get_ticket",
21301
21342
  "Get one ticket by id (T-<num>).",
21302
21343
  { id: external_exports.string().min(1) },
21303
- async (input) => handleGetTicket(input, client)
21344
+ makeCallerAwareHandler(handleGetTicket)
21304
21345
  );
21305
21346
  server.tool(
21306
21347
  "update_ticket",
@@ -21312,19 +21353,19 @@ async function main() {
21312
21353
  release_note: external_exports.string().nullable().optional(),
21313
21354
  type: external_exports.enum(TICKET_TYPE_ENUM).optional()
21314
21355
  },
21315
- async (input) => handleUpdateTicket(input, client)
21356
+ makeCallerAwareHandler(handleUpdateTicket)
21316
21357
  );
21317
21358
  server.tool(
21318
21359
  "claim_ticket",
21319
21360
  "Claim an unassigned ticket (status open \u2192 claimed). Fails 409 ASSIGNEE_LOCKED if already taken.",
21320
21361
  { id: external_exports.string().min(1) },
21321
- async (input) => handleClaimTicket(input, client)
21362
+ makeCallerAwareHandler(handleClaimTicket)
21322
21363
  );
21323
21364
  server.tool(
21324
21365
  "release_ticket",
21325
21366
  "Release a ticket back to unassigned (status \u2192 open). Only current assignee or requester can release. Precondition to reassigning (\u5148\u91CA\u653E\u518D\u8BA4\u9886).",
21326
21367
  { id: external_exports.string().min(1) },
21327
- async (input) => handleReleaseTicket(input, client)
21368
+ makeCallerAwareHandler(handleReleaseTicket)
21328
21369
  );
21329
21370
  server.tool(
21330
21371
  "assign_ticket",
@@ -21334,13 +21375,13 @@ async function main() {
21334
21375
  assignee_did: external_exports.string().min(1),
21335
21376
  assignee_name: external_exports.string().min(1)
21336
21377
  },
21337
- async (input) => handleAssignTicket(input, client)
21378
+ makeCallerAwareHandler(handleAssignTicket)
21338
21379
  );
21339
21380
  server.tool(
21340
21381
  "start_ticket",
21341
21382
  "Move a ticket claimed \u2192 in_progress. Only the current assignee can start.",
21342
21383
  { id: external_exports.string().min(1) },
21343
- async (input) => handleStartTicket(input, client)
21384
+ makeCallerAwareHandler(handleStartTicket)
21344
21385
  );
21345
21386
  server.tool(
21346
21387
  "open_pr",
@@ -21349,13 +21390,13 @@ async function main() {
21349
21390
  id: external_exports.string().min(1),
21350
21391
  pr_url: external_exports.string().url()
21351
21392
  },
21352
- async (input) => handleOpenPr(input, client)
21393
+ makeCallerAwareHandler(handleOpenPr)
21353
21394
  );
21354
21395
  server.tool(
21355
21396
  "abandon_ticket",
21356
21397
  "Requester abandons a ticket (any non-shipped status \u2192 abandoned). Terminal state.",
21357
21398
  { id: external_exports.string().min(1) },
21358
- async (input) => handleAbandonTicket(input, client)
21399
+ makeCallerAwareHandler(handleAbandonTicket)
21359
21400
  );
21360
21401
  const transport = new StdioServerTransport();
21361
21402
  await server.connect(transport);
@@ -21378,5 +21419,7 @@ if (require.main === module) {
21378
21419
  handleOpenPr,
21379
21420
  handleReleaseTicket,
21380
21421
  handleStartTicket,
21381
- handleUpdateTicket
21422
+ handleUpdateTicket,
21423
+ makeCallerAwareHandler,
21424
+ resolveTicketCaller
21382
21425
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clawos-dev/clawd",
3
- "version": "0.2.220",
3
+ "version": "0.2.221-beta.432.4424967",
4
4
  "description": "Standalone clawd daemon — Claude Code (and future Codex) session server over WebSocket",
5
5
  "type": "module",
6
6
  "license": "MIT",