@runweave/server-linux-x64 0.1.14 → 0.1.17

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 (98) hide show
  1. package/manifest.json +189 -177
  2. package/native.tar.gz +0 -0
  3. package/package.json +1 -1
  4. package/payload/app-server/build-info.json +4 -4
  5. package/payload/app-server/configuration-compatibility.json +1 -1
  6. package/payload/app-server/index.cjs +1011 -637
  7. package/payload/app-server/index.cjs.map +1 -1
  8. package/payload/backend/activity-sqlite-worker.cjs +3 -1
  9. package/payload/backend/build-info.json +4 -4
  10. package/payload/backend/dev-resources/control.cjs +6 -2
  11. package/payload/backend/index.cjs +3307 -2163
  12. package/payload/backend/scheduled-tasks-sqlite-worker.cjs +14 -1
  13. package/payload/frontend/dist/assets/{_baseUniq-BqvkeJO_.js → _baseUniq-Rpr7ObZY.js} +1 -1
  14. package/payload/frontend/dist/assets/{access-DdS0UJde.js → access-BvxRY1pA.js} +1 -1
  15. package/payload/frontend/dist/assets/{advanced-BbcDBPNv.js → advanced-CZfrALGq.js} +1 -1
  16. package/payload/frontend/dist/assets/{appearance-BvmkpQdR.js → appearance-D0AwwNw_.js} +1 -1
  17. package/payload/frontend/dist/assets/{arc-C0XOrQvn.js → arc-BxzXVQYF.js} +1 -1
  18. package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-BPP9wqzx.js → architectureDiagram-Q4EWVU46-DTYJSSVX.js} +1 -1
  19. package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-C-tmnyfm.js → blockDiagram-DXYQGD6D-DaIImc6U.js} +1 -1
  20. package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-C6uI9h_3.js → c4Diagram-AHTNJAMY-DRS-zy_e.js} +1 -1
  21. package/payload/frontend/dist/assets/channel-hL0i3Xgx.js +1 -0
  22. package/payload/frontend/dist/assets/{chunk-4BX2VUAB-CCI-uz3D.js → chunk-4BX2VUAB-BxZHfjDE.js} +1 -1
  23. package/payload/frontend/dist/assets/{chunk-4TB4RGXK-CqUM0_7D.js → chunk-4TB4RGXK-BbTiOq_d.js} +1 -1
  24. package/payload/frontend/dist/assets/{chunk-55IACEB6-DDxrCLKB.js → chunk-55IACEB6-DSGNAzPL.js} +1 -1
  25. package/payload/frontend/dist/assets/{chunk-EDXVE4YY-LwYMVaGh.js → chunk-EDXVE4YY-C3VoLWVy.js} +1 -1
  26. package/payload/frontend/dist/assets/{chunk-FMBD7UC4-CQR_-5z5.js → chunk-FMBD7UC4-jgIQKRAn.js} +1 -1
  27. package/payload/frontend/dist/assets/{chunk-OYMX7WX6-DQ0IiFt5.js → chunk-OYMX7WX6-CR1nxjr3.js} +1 -1
  28. package/payload/frontend/dist/assets/{chunk-QZHKN3VN-BPX4TBXp.js → chunk-QZHKN3VN-BsZQAe-R.js} +1 -1
  29. package/payload/frontend/dist/assets/{chunk-YZCP3GAM-DqZhVlNy.js → chunk-YZCP3GAM-C7hytF3a.js} +1 -1
  30. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-Nr4qU3jt.js +1 -0
  31. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-Nr4qU3jt.js +1 -0
  32. package/payload/frontend/dist/assets/clone-ePxKteP6.js +1 -0
  33. package/payload/frontend/dist/assets/{connection-ToakGqMm.js → connection-Brx3p6gD.js} +1 -1
  34. package/payload/frontend/dist/assets/{connections-DD38aD2_.js → connections-DV6_2T4t.js} +1 -1
  35. package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-Bi6kn4wb.js → cose-bilkent-S5V4N54A-CrqquZt2.js} +1 -1
  36. package/payload/frontend/dist/assets/{dagre-KV5264BT-D7PPmb_h.js → dagre-KV5264BT-BOAEPW4D.js} +1 -1
  37. package/payload/frontend/dist/assets/{desktop-D80mAqEi.js → desktop-1i0ByIN_.js} +1 -1
  38. package/payload/frontend/dist/assets/{diagram-5BDNPKRD-2Fg0LDFB.js → diagram-5BDNPKRD-NVdwMJnF.js} +1 -1
  39. package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-DDht1hGL.js → diagram-G4DWMVQ6-RKmkTTau.js} +1 -1
  40. package/payload/frontend/dist/assets/{diagram-MMDJMWI5-_slCo5qd.js → diagram-MMDJMWI5-B0Or1DIY.js} +1 -1
  41. package/payload/frontend/dist/assets/{diagram-TYMM5635-BibhtXBj.js → diagram-TYMM5635-CoJGPUQX.js} +1 -1
  42. package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-Tb9JdHm7.js → erDiagram-SMLLAGMA-DHK_lg3E.js} +1 -1
  43. package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-DmV0VUHI.js → flowDiagram-DWJPFMVM-CzirUF-x.js} +1 -1
  44. package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-boTSPZL8.js → ganttDiagram-T4ZO3ILL-DGY2KYoN.js} +1 -1
  45. package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-3Akku_ak.js → gitGraphDiagram-UUTBAWPF-BI5lNHKC.js} +1 -1
  46. package/payload/frontend/dist/assets/{graph-GAq0lcsb.js → graph-CxjgBe1N.js} +1 -1
  47. package/payload/frontend/dist/assets/{image-PejzD76r.js → image-LArOi_ON.js} +1 -1
  48. package/payload/frontend/dist/assets/{index-BBNE8InR.js → index-CLYrzd8Y.js} +5 -5
  49. package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-TrixGt-D.js → infoDiagram-42DDH7IO-DTRl6YSd.js} +1 -1
  50. package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-BYKU82ro.js → ishikawaDiagram-UXIWVN3A-DCnBRtVx.js} +1 -1
  51. package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-BL_50q1o.js → journeyDiagram-VCZTEJTY-ChVgjvDs.js} +1 -1
  52. package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-Clxk3CDg.js → kanban-definition-6JOO6SKY-skToH2-J.js} +1 -1
  53. package/payload/frontend/dist/assets/{layout-BbxLzgiJ.js → layout-B4V_ctSo.js} +1 -1
  54. package/payload/frontend/dist/assets/{linear-DWemxXgm.js → linear-DYom329p.js} +1 -1
  55. package/payload/frontend/dist/assets/{main-BHwOPARZ.js → main-C_6tTN_b.js} +5 -5
  56. package/payload/frontend/dist/assets/{min-DIL93Hib.js → min-EMXbJh1s.js} +1 -1
  57. package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-DlfLczjR.js → mindmap-definition-QFDTVHPH-DLHGcrEw.js} +1 -1
  58. package/payload/frontend/dist/assets/{monitoring-B6pQ-P1J.js → monitoring-Bvfy9Q9G.js} +1 -1
  59. package/payload/frontend/dist/assets/{notifications-B9lXATqv.js → notifications-CdkYtTCy.js} +1 -1
  60. package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-BaU_H2x3.js → pieDiagram-DEJITSTG-LrDfLpSu.js} +1 -1
  61. package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-D3nVMaXv.js → quadrantDiagram-34T5L4WZ-uV9sfVKm.js} +1 -1
  62. package/payload/frontend/dist/assets/{record-content-Dn6GE_dv.js → record-content-B3qVdcq-.js} +1 -1
  63. package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-C7J-xGnU.js → requirementDiagram-MS252O5E-Cf_SmlxS.js} +1 -1
  64. package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-BAkualMS.js → sankeyDiagram-XADWPNL6-DSLCPq2l.js} +1 -1
  65. package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-BYWAdS9C.js → sequenceDiagram-FGHM5R23-CAAjivQf.js} +1 -1
  66. package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-C3qD8m-7.js → stateDiagram-FHFEXIEX-DNMUe2-F.js} +1 -1
  67. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-Ca5k1Q3K.js +1 -0
  68. package/payload/frontend/dist/assets/{status-MDvjSQ51.js → status-BPA1tGcF.js} +1 -1
  69. package/payload/frontend/dist/assets/suiji-ZMTJOgTp.js +1 -0
  70. package/payload/frontend/dist/assets/{svg-C0XZL3qU.js → svg-BbHfpNxC.js} +1 -1
  71. package/payload/frontend/dist/assets/{tabs-Y-BEbPyW.js → tabs-DkuqaUwz.js} +1 -1
  72. package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-JER6Qyhn.js → timeline-definition-GMOUNBTQ-DNJNPFK4.js} +1 -1
  73. package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-kRp3Wh4r.js → vennDiagram-DHZGUBPP-BycjIB3y.js} +1 -1
  74. package/payload/frontend/dist/assets/{wardley-RL74JXVD-Dnh_rEyA.js → wardley-RL74JXVD-Bq01rln7.js} +1 -1
  75. package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-DxiIy5IP.js → wardleyDiagram-NUSXRM2D-D4_m8ewM.js} +1 -1
  76. package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-DcckHE39.js → xychartDiagram-5P7HB3ND-CovxGnwH.js} +1 -1
  77. package/payload/frontend/dist/build-info.json +4 -4
  78. package/payload/frontend/dist/companion.html +1 -1
  79. package/payload/frontend/dist/index.html +2 -2
  80. package/payload/packages/agent-bridge/src/install-pi.mjs +1 -0
  81. package/payload/plugins/pi/dist/bridge/runweave-hook-bridge.cjs +21 -4
  82. package/payload/plugins/pi/dist/bridge/runweave-hook-claude.cjs +68 -0
  83. package/payload/plugins/pi/dist/bridge/runweave-hook-completion.cjs +16 -4
  84. package/payload/plugins/pi/dist/bridge/runweave-hook-payload.cjs +1 -0
  85. package/payload/plugins/toolkit/.codex-plugin/plugin.json +1 -1
  86. package/payload/plugins/toolkit/hooks/runweave-hook-bridge.cjs +21 -4
  87. package/payload/plugins/toolkit/hooks/runweave-hook-claude.cjs +68 -0
  88. package/payload/plugins/toolkit/hooks/runweave-hook-completion.cjs +16 -4
  89. package/payload/plugins/toolkit/hooks/runweave-hook-payload.cjs +1 -0
  90. package/payload/plugins/toolkit-release.json +1 -1
  91. package/payload/pty-host/index.cjs +3 -1
  92. package/payload/server/index.cjs +5 -1
  93. package/payload/frontend/dist/assets/channel-DaIQFY7W.js +0 -1
  94. package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-TM6ckD19.js +0 -1
  95. package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-TM6ckD19.js +0 -1
  96. package/payload/frontend/dist/assets/clone-BoG338Z7.js +0 -1
  97. package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-C18IEkog.js +0 -1
  98. package/payload/frontend/dist/assets/suiji-B6w3AzG7.js +0 -1
@@ -1,7 +1,6 @@
1
- /* global fetch, module, require */
1
+ /* global fetch, module, require, AbortSignal */
2
2
  /* eslint-disable @typescript-eslint/no-require-imports */
3
- const { buildCompletionHookBody } = require("./runweave-hook-payload.cjs");
4
-
3
+ const { buildCompletionHookBody, extractUserPrompt, isFeishuAttentionHook, readNotificationType } = require("./runweave-hook-payload.cjs");
5
4
  async function postCompletionHook({
6
5
  endpoint,
7
6
  token,
@@ -20,6 +19,18 @@ async function postCompletionHook({
20
19
  rawEvent,
21
20
  commandName,
22
21
  });
22
+ if (source === "claude") {
23
+ if (!endpoint) return { accepted: false };
24
+ const instanceId = payload.claude?.instanceId;
25
+ if (!instanceId || payload.agent_id || payload.agent_transcript_path) return { accepted: false };
26
+ const notificationType = readNotificationType(payload);
27
+ const event = String(rawEvent).toLowerCase().replace(/[_\s-]/g, "");
28
+ body.claude = { instanceId, eventId: payload.runweaveHookEventId,
29
+ ...(notificationType ? { notificationType } : {}),
30
+ ...(event === "userpromptsubmit" ? { query: extractUserPrompt(payload) || "" } : {}) };
31
+ body.completionReason = event === "permissionrequest" ||
32
+ (notificationType !== "idle_prompt" && isFeishuAttentionHook(payload, source)) ? "notify" : "hook_stop";
33
+ }
23
34
  try {
24
35
  const response = await fetch(endpoint, {
25
36
  method: "POST",
@@ -28,9 +39,10 @@ async function postCompletionHook({
28
39
  "X-Runweave-Hook-Token": token,
29
40
  },
30
41
  body: JSON.stringify(body),
42
+ ...(source === "claude" ? { signal: AbortSignal.timeout(5000), redirect: "error" } : {}),
31
43
  });
32
44
  const result = await response.json().catch(() => null);
33
- return { ok: response.ok, status: response.status, accepted: Boolean(result?.event || result?.notificationId) && !result?.ignored, notificationId: result?.notificationId ?? (result?.event?.payload?.completionRevision ? String(result.event.payload.completionRevision) : undefined) };
45
+ return { summary: result?.event?.payload?.summary, ok: response.ok, status: response.status, accepted: Boolean(result?.event || result?.notificationId) && !result?.ignored, notificationId: result?.notificationId ?? (result?.event?.payload?.completionRevision ? String(result.event.payload.completionRevision) : undefined) };
34
46
  } catch (error) {
35
47
  return {
36
48
  ok: false,
@@ -528,6 +528,7 @@ function buildAppServerBaseEvent({
528
528
  payload: {
529
529
  source,
530
530
  ...(source === "pi" && payload.pi ? { pi: payload.pi } : {}),
531
+ ...(source === "claude" && payload.claude ? { claude: payload.claude } : {}),
531
532
  threadId,
532
533
  rawHookEvent: String(rawEvent || "Unknown"),
533
534
  normalizedEvent,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toolkit",
3
- "version": "0.2.0+codex.e6c654a0a35a7c845cef6dccbc3a01e8c5c80c6ca2fedb13c14915076ccef52b",
3
+ "version": "0.2.0+codex.1e1b247f9ff295236b4a62855f1ca6b63035bb43bd51b14a095e2aeee09a5fea",
4
4
  "description": "Runweave Toolkit plugin for project-specific skills and automation extensions.",
5
5
  "author": {
6
6
  "name": "Runweave"
@@ -7,6 +7,7 @@ const { setTimeout } = require("node:timers");
7
7
  const fs = require("node:fs");
8
8
  const path = require("node:path");
9
9
  const crypto = require("node:crypto");
10
+ const { readClaudeContext } = require("./runweave-hook-claude.cjs");
10
11
  const { postCompletionHook } = require("./runweave-hook-completion.cjs");
11
12
  const {
12
13
  STOP_EVENTS,
@@ -221,10 +222,12 @@ async function postAgentHook({
221
222
  activityEventId,
222
223
  operationId,
223
224
  pi,
225
+ claude,
224
226
  }) {
225
227
  let body = JSON.stringify({
226
228
  activityEventId,
227
229
  ...(pi ? { pi } : {}),
230
+ ...(claude ? { claude } : {}),
228
231
  ...(operationId ? { operationId } : {}),
229
232
  terminalSessionId,
230
233
  projectId: process.env.RUNWEAVE_PROJECT_ID || undefined,
@@ -322,8 +325,11 @@ async function main() {
322
325
  }
323
326
  const completionReason = normalizeReason(args.reason);
324
327
  const threadId = readThreadId(payload);
325
- const stateHookEvent =
326
- ["pi", "codex", "trae", "traecli", "traex"].includes(source)
328
+ payload.runweaveHookEventId = crypto.randomUUID();
329
+ if (source === "claude") payload.claude = readClaudeContext(payload, payload.runweaveHookEventId);
330
+ const stateHookEvent = source === "claude"
331
+ ? (payload.claude ? toAgentHookStateEvent(normalizedEvent) || "AgentMetadata" : null)
332
+ : ["pi", "codex", "trae", "traecli", "traex"].includes(source)
327
333
  ? toAgentHookStateEvent(normalizedEvent)
328
334
  : null;
329
335
  // Compaction continues the turn; child CLIs do not own the parent terminal.
@@ -350,7 +356,9 @@ async function main() {
350
356
  const effectiveCompletionReason = isTraexAttentionNotification
351
357
  ? "notify"
352
358
  : completionReason;
353
- const shouldRecordCompletion = (source !== "pi" || payload.pi?.outcome === "completed") && (
359
+ // Claude Stop is only a candidate; its notification adapter waits for native
360
+ // idle confirmation and publishes through the Backend's canonical feed.
361
+ const shouldRecordCompletion = source !== "claude" && (source !== "pi" || payload.pi?.outcome === "completed") && (
354
362
  isTraexAttentionNotification ||
355
363
  effectiveCompletionReason !== "hook_stop" ||
356
364
  STOP_EVENTS.has(normalizedEvent));
@@ -416,7 +424,6 @@ async function main() {
416
424
  const summary = extractCompletionSummary(payload);
417
425
  if (summary) payload.last_assistant_message = summary;
418
426
  }
419
- payload.runweaveHookEventId = crypto.randomUUID();
420
427
  const appServerClient = await discoverAppServer();
421
428
  if (!appServerClient) {
422
429
  appendDebugLog("hook bridge app-server unavailable", {
@@ -482,6 +489,7 @@ async function main() {
482
489
  : undefined,
483
490
  activityEventId,
484
491
  ...(source === "pi" ? { pi: payload.pi } : {}),
492
+ ...(source === "claude" ? { claude: payload.claude } : {}),
485
493
  operationId: process.env.RUNWEAVE_TERMINAL_AGENT_OPERATION_ID || null,
486
494
  });
487
495
  appendDebugLog("hook bridge posted agent hook", {
@@ -492,6 +500,15 @@ async function main() {
492
500
  });
493
501
  }
494
502
 
503
+ if (source === "claude") {
504
+ const result = await postCompletionHook({ endpoint: completionEndpoint, token, terminalSessionId,
505
+ payload, source, completionReason, rawEvent, commandName });
506
+ if (result.accepted) notifyFeishu({ ...payload, hook_event_name: "Stop",
507
+ last_assistant_message: result.summary || "任务需要你确认或处理,请回到对应终端。",
508
+ feishuNotificationId: result.notificationId }, source, terminalSessionId, terminalPanelId);
509
+ return;
510
+ }
511
+
495
512
  if (isFeishuAttentionHook(payload, source) && !shouldRecordCompletion && completionEndpoint) {
496
513
  const attentionPayload = { ...payload, feishuNotificationOnly: true, last_assistant_message: "任务需要你确认或处理,请回到对应终端。" };
497
514
  const result = await postCompletionHook({ endpoint: completionEndpoint, token, terminalSessionId,
@@ -0,0 +1,68 @@
1
+ /* global module, process, require */
2
+ /* eslint-disable @typescript-eslint/no-require-imports */
3
+ const { spawnSync } = require("node:child_process");
4
+ const { performance } = require("node:perf_hooks");
5
+ const path = require("node:path");
6
+
7
+ // Use process birth, before stdin/network work, so delayed delivery cannot roll state back.
8
+ const observedAt = performance.timeOrigin;
9
+
10
+ function readClaudeIdentity() {
11
+ const options = { encoding: "utf8", timeout: 3000, maxBuffer: 4 * 1024 * 1024, windowsHide: true };
12
+ const processes = new Map();
13
+ if (process.platform === "win32") {
14
+ const script = 'Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,@{Name="StartedAt";Expression={if ($_.CreationDate) {([DateTimeOffset]$_.CreationDate).ToUnixTimeMilliseconds()} else {0}}} | ConvertTo-Json -Compress';
15
+ const result = spawnSync("powershell.exe", ["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", script], options);
16
+ if (result.error || result.status !== 0) return null;
17
+ try {
18
+ const rows = JSON.parse(String(result.stdout).replace(/^\uFEFF/, ""));
19
+ for (const row of Array.isArray(rows) ? rows : [rows]) {
20
+ processes.set(row.ProcessId, { parent: row.ParentProcessId,
21
+ command: String(row.Name).toLowerCase().replace(/\.(exe|cmd|bat)$/, ""), startedAt: row.StartedAt });
22
+ }
23
+ } catch { return null; }
24
+ } else {
25
+ const result = spawnSync("ps", ["-axo", "pid=,ppid=,comm="], options);
26
+ if (result.error || result.status !== 0) return null;
27
+ for (const line of String(result.stdout).split(/\r?\n/)) {
28
+ const match = /^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/.exec(line);
29
+ if (match) processes.set(Number(match[1]), { parent: Number(match[2]), command: path.basename(match[3]) });
30
+ }
31
+ }
32
+ let claudePid = null;
33
+ const visited = new Set();
34
+ for (let pid = process.ppid; pid > 1; ) {
35
+ if (visited.has(pid)) return null;
36
+ visited.add(pid);
37
+ const entry = processes.get(pid);
38
+ if (!entry) return null;
39
+ if (["claude", "codex", "trae", "traex", "traecli", "pi"].includes(entry.command)) {
40
+ if (claudePid || entry.command !== "claude") return null;
41
+ claudePid = pid;
42
+ }
43
+ pid = entry.parent;
44
+ }
45
+ if (!claudePid) return null;
46
+ let startedAt = processes.get(claudePid).startedAt;
47
+ if (process.platform !== "win32") {
48
+ const result = spawnSync("ps", ["-p", String(claudePid), "-o", "lstart="], {
49
+ ...options, env: { TZ: "UTC", LC_ALL: "C" },
50
+ });
51
+ if (result.error || result.status !== 0) return null;
52
+ startedAt = Date.parse(`${String(result.stdout).trim()} UTC`);
53
+ }
54
+ if (!Number.isFinite(startedAt) || startedAt <= 0 || startedAt > observedAt) return null;
55
+ return { instanceId: `${claudePid}:${startedAt}`, startedAt };
56
+ }
57
+
58
+ function readClaudeContext(payload, eventId) {
59
+ if (payload.agent_id || payload.agent_transcript_path || !payload.session_id) return null;
60
+ const identity = readClaudeIdentity();
61
+ if (!identity) return null;
62
+ return { version: 1, ...identity, observedAt, eventId, sessionId: payload.session_id,
63
+ event: String(payload.hook_event_name || "").toLowerCase().replace(/[_\s-]/g, ""),
64
+ ...(payload.source ? { sessionSource: payload.source } : {}),
65
+ ...(payload.notification_type ? { notificationType: payload.notification_type } : {}) };
66
+ }
67
+
68
+ module.exports = { readClaudeContext };
@@ -1,7 +1,6 @@
1
- /* global fetch, module, require */
1
+ /* global fetch, module, require, AbortSignal */
2
2
  /* eslint-disable @typescript-eslint/no-require-imports */
3
- const { buildCompletionHookBody } = require("./runweave-hook-payload.cjs");
4
-
3
+ const { buildCompletionHookBody, extractUserPrompt, isFeishuAttentionHook, readNotificationType } = require("./runweave-hook-payload.cjs");
5
4
  async function postCompletionHook({
6
5
  endpoint,
7
6
  token,
@@ -20,6 +19,18 @@ async function postCompletionHook({
20
19
  rawEvent,
21
20
  commandName,
22
21
  });
22
+ if (source === "claude") {
23
+ if (!endpoint) return { accepted: false };
24
+ const instanceId = payload.claude?.instanceId;
25
+ if (!instanceId || payload.agent_id || payload.agent_transcript_path) return { accepted: false };
26
+ const notificationType = readNotificationType(payload);
27
+ const event = String(rawEvent).toLowerCase().replace(/[_\s-]/g, "");
28
+ body.claude = { instanceId, eventId: payload.runweaveHookEventId,
29
+ ...(notificationType ? { notificationType } : {}),
30
+ ...(event === "userpromptsubmit" ? { query: extractUserPrompt(payload) || "" } : {}) };
31
+ body.completionReason = event === "permissionrequest" ||
32
+ (notificationType !== "idle_prompt" && isFeishuAttentionHook(payload, source)) ? "notify" : "hook_stop";
33
+ }
23
34
  try {
24
35
  const response = await fetch(endpoint, {
25
36
  method: "POST",
@@ -28,9 +39,10 @@ async function postCompletionHook({
28
39
  "X-Runweave-Hook-Token": token,
29
40
  },
30
41
  body: JSON.stringify(body),
42
+ ...(source === "claude" ? { signal: AbortSignal.timeout(5000), redirect: "error" } : {}),
31
43
  });
32
44
  const result = await response.json().catch(() => null);
33
- return { ok: response.ok, status: response.status, accepted: Boolean(result?.event || result?.notificationId) && !result?.ignored, notificationId: result?.notificationId ?? (result?.event?.payload?.completionRevision ? String(result.event.payload.completionRevision) : undefined) };
45
+ return { summary: result?.event?.payload?.summary, ok: response.ok, status: response.status, accepted: Boolean(result?.event || result?.notificationId) && !result?.ignored, notificationId: result?.notificationId ?? (result?.event?.payload?.completionRevision ? String(result.event.payload.completionRevision) : undefined) };
34
46
  } catch (error) {
35
47
  return {
36
48
  ok: false,
@@ -528,6 +528,7 @@ function buildAppServerBaseEvent({
528
528
  payload: {
529
529
  source,
530
530
  ...(source === "pi" && payload.pi ? { pi: payload.pi } : {}),
531
+ ...(source === "claude" && payload.claude ? { claude: payload.claude } : {}),
531
532
  threadId,
532
533
  rawHookEvent: String(rawEvent || "Unknown"),
533
534
  normalizedEvent,
@@ -1 +1 @@
1
- {"version":"0.2.0+codex.e6c654a0a35a7c845cef6dccbc3a01e8c5c80c6ca2fedb13c14915076ccef52b","digest":"e6c654a0a35a7c845cef6dccbc3a01e8c5c80c6ca2fedb13c14915076ccef52b"}
1
+ {"version":"0.2.0+codex.1e1b247f9ff295236b4a62855f1ca6b63035bb43bd51b14a095e2aeee09a5fea","digest":"1e1b247f9ff295236b4a62855f1ca6b63035bb43bd51b14a095e2aeee09a5fea"}
@@ -14760,6 +14760,8 @@ var CONFIGURATION_FIELDS = [
14760
14760
  { "path": "services.feishu.legacyWebhook.transport", "type": "string", "domain": "services.feishu", "sensitive": false, "remote": true, "apply": "restart", "description": "\u65E7\u901A\u77E5 hook \u53D1\u9001\u65B9\u5F0F", "environmentKeys": ["FEISHU_NOTIFY_TRANSPORT"], "owner": "cli/feishu", "scope": "instance", "storage": "settings.yaml", "default": { "value": null }, "migrationSources": ["FEISHU_NOTIFY_TRANSPORT"] },
14761
14761
  { "path": "agents.codex.binary", "type": "string", "domain": "agents.codex", "sensitive": false, "remote": false, "apply": "restart", "description": "Codex \u53EF\u6267\u884C\u6587\u4EF6", "environmentKeys": ["CODEX_BIN", "RUNWEAVE_CODEX_BIN"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u672A\u6307\u5B9A\u65F6\u901A\u8FC7 PATH / \u5E73\u53F0\u5B89\u88C5\u4F4D\u7F6E\u67E5\u627E codex\uFF1B\u663E\u5F0F\u914D\u7F6E\u6307\u5411\u540C\u4E00\u53EF\u6267\u884C\u7A0B\u5E8F\u3002" }, "migrationSources": ["CODEX_BIN", "RUNWEAVE_CODEX_BIN"] },
14762
14762
  { "path": "agents.traex.binary", "type": "string", "domain": "agents.traex", "sensitive": false, "remote": false, "apply": "restart", "description": "Trae \u53EF\u6267\u884C\u6587\u4EF6\uFF1B\u591A\u4E2A\u5165\u53E3\u7EDF\u4E00", "environmentKeys": ["TRAEX_BIN", "RUNWEAVE_TRAE_BIN"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u672A\u6307\u5B9A\u65F6\u901A\u8FC7 PATH / \u5E73\u53F0\u5B89\u88C5\u4F4D\u7F6E\u67E5\u627E traex\uFF1B\u663E\u5F0F\u914D\u7F6E\u6307\u5411\u540C\u4E00\u53EF\u6267\u884C\u7A0B\u5E8F\u3002" }, "migrationSources": ["TRAEX_BIN", "RUNWEAVE_TRAE_BIN"] },
14763
+ { "path": "agents.claude.binary", "type": "string", "domain": "agents.claude", "sensitive": false, "remote": false, "apply": "restart", "description": "Claude Code \u53EF\u6267\u884C\u6587\u4EF6\uFF1B\u4EC5\u9650\u7A0B\u5E8F\u540D\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u63A5\u53D7\u547D\u4EE4\u53C2\u6570", "environmentKeys": [], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u4F7F\u7528\u5F53\u524D Backend \u7684 PATH \u67E5\u627E claude\uFF1B\u4E0D\u6539\u53D8\u73B0\u6709\u9ED8\u8BA4 provider\u3002" }, "migrationSources": ["new-field:no-legacy-source"] },
14764
+ { "path": "agents.claude.configDirectory", "type": "string", "domain": "agents.claude", "sensitive": false, "remote": false, "apply": "restart", "description": "Claude \u539F\u751F\u914D\u7F6E\u76EE\u5F55\u7684\u5916\u90E8\u5F15\u7528\uFF1B\u4F1A\u8BDD\u6839\u4E3A\u5176 projects \u5B50\u76EE\u5F55\uFF0C\u4E0D\u590D\u5236\u51ED\u636E", "environmentKeys": ["CLAUDE_CONFIG_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u663E\u5F0F\u5B9E\u4F8B\u76EE\u5F55\u4F18\u5148\uFF0C\u5426\u5219\u5F15\u7528\u5916\u90E8 CLAUDE_CONFIG_DIR \u6216\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .claude\uFF1B\u5FC5\u987B\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u3002" }, "migrationSources": ["CLAUDE_CONFIG_DIR"] },
14763
14765
  { "path": "agents.companion.binary", "type": "string", "domain": "agents.companion", "sensitive": false, "remote": false, "apply": "restart", "description": "\u4F34\u968F\u7A97\u53E3 Agent \u53EF\u6267\u884C\u6587\u4EF6", "environmentKeys": ["RUNWEAVE_COMPANION_AGENT_EXECUTABLE"], "owner": "electron/companion", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u4F7F\u7528\u5DF2\u5B89\u88C5 Codex App \u81EA\u5E26\u6267\u884C\u5165\u53E3\uFF1B\u663E\u5F0F\u503C\u5FC5\u987B\u53EF\u6267\u884C\u3002" }, "migrationSources": ["RUNWEAVE_COMPANION_AGENT_EXECUTABLE"] },
14764
14766
  { "path": "agents.codex.sessionsDirectory", "type": "string", "domain": "agents.codex", "sensitive": false, "remote": false, "apply": "restart", "description": "\u5916\u90E8 Codex \u4F1A\u8BDD\u76EE\u5F55\u5F15\u7528", "environmentKeys": ["RUNWEAVE_CODEX_SESSIONS_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u5916\u90E8\u5DE5\u5177\u62E5\u6709\u7684 CODEX_HOME/sessions \u6216\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .codex/sessions\uFF0C\u4EC5\u5F15\u7528\u3002" }, "migrationSources": ["RUNWEAVE_CODEX_SESSIONS_DIR"] },
14765
14767
  { "path": "agents.traex.sessionsDirectory", "type": "string", "domain": "agents.traex", "sensitive": false, "remote": false, "apply": "restart", "description": "\u5916\u90E8 Trae \u4F1A\u8BDD\u76EE\u5F55\u5F15\u7528", "environmentKeys": ["RUNWEAVE_TRAE_SESSIONS_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .trae/cli/sessions\uFF0C\u4EC5\u5F15\u7528\u3002" }, "migrationSources": ["RUNWEAVE_TRAE_SESSIONS_DIR"] },
@@ -14887,7 +14889,7 @@ var CONFIGURATION_COMPATIBILITY = {
14887
14889
  };
14888
14890
  var APP_SERVER_CONFIGURATION_COMPATIBILITY = {
14889
14891
  ...CONFIGURATION_COMPATIBILITY,
14890
- domainVersions: Object.fromEntries(["appServer", "agents.codex", "agents.traex"].map((domain) => [domain, [CONFIGURATION_DOMAIN_VERSIONS[domain]]]))
14892
+ domainVersions: Object.fromEntries(["appServer", "agents.codex", "agents.traex", "agents.claude"].map((domain) => [domain, [CONFIGURATION_DOMAIN_VERSIONS[domain]]]))
14891
14893
  };
14892
14894
 
14893
14895
  // packages/config-node/src/store.ts
@@ -7633,6 +7633,8 @@ var CONFIGURATION_FIELDS = [
7633
7633
  { "path": "services.feishu.legacyWebhook.transport", "type": "string", "domain": "services.feishu", "sensitive": false, "remote": true, "apply": "restart", "description": "\u65E7\u901A\u77E5 hook \u53D1\u9001\u65B9\u5F0F", "environmentKeys": ["FEISHU_NOTIFY_TRANSPORT"], "owner": "cli/feishu", "scope": "instance", "storage": "settings.yaml", "default": { "value": null }, "migrationSources": ["FEISHU_NOTIFY_TRANSPORT"] },
7634
7634
  { "path": "agents.codex.binary", "type": "string", "domain": "agents.codex", "sensitive": false, "remote": false, "apply": "restart", "description": "Codex \u53EF\u6267\u884C\u6587\u4EF6", "environmentKeys": ["CODEX_BIN", "RUNWEAVE_CODEX_BIN"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u672A\u6307\u5B9A\u65F6\u901A\u8FC7 PATH / \u5E73\u53F0\u5B89\u88C5\u4F4D\u7F6E\u67E5\u627E codex\uFF1B\u663E\u5F0F\u914D\u7F6E\u6307\u5411\u540C\u4E00\u53EF\u6267\u884C\u7A0B\u5E8F\u3002" }, "migrationSources": ["CODEX_BIN", "RUNWEAVE_CODEX_BIN"] },
7635
7635
  { "path": "agents.traex.binary", "type": "string", "domain": "agents.traex", "sensitive": false, "remote": false, "apply": "restart", "description": "Trae \u53EF\u6267\u884C\u6587\u4EF6\uFF1B\u591A\u4E2A\u5165\u53E3\u7EDF\u4E00", "environmentKeys": ["TRAEX_BIN", "RUNWEAVE_TRAE_BIN"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u672A\u6307\u5B9A\u65F6\u901A\u8FC7 PATH / \u5E73\u53F0\u5B89\u88C5\u4F4D\u7F6E\u67E5\u627E traex\uFF1B\u663E\u5F0F\u914D\u7F6E\u6307\u5411\u540C\u4E00\u53EF\u6267\u884C\u7A0B\u5E8F\u3002" }, "migrationSources": ["TRAEX_BIN", "RUNWEAVE_TRAE_BIN"] },
7636
+ { "path": "agents.claude.binary", "type": "string", "domain": "agents.claude", "sensitive": false, "remote": false, "apply": "restart", "description": "Claude Code \u53EF\u6267\u884C\u6587\u4EF6\uFF1B\u4EC5\u9650\u7A0B\u5E8F\u540D\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u4E0D\u63A5\u53D7\u547D\u4EE4\u53C2\u6570", "environmentKeys": [], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u4F7F\u7528\u5F53\u524D Backend \u7684 PATH \u67E5\u627E claude\uFF1B\u4E0D\u6539\u53D8\u73B0\u6709\u9ED8\u8BA4 provider\u3002" }, "migrationSources": ["new-field:no-legacy-source"] },
7637
+ { "path": "agents.claude.configDirectory", "type": "string", "domain": "agents.claude", "sensitive": false, "remote": false, "apply": "restart", "description": "Claude \u539F\u751F\u914D\u7F6E\u76EE\u5F55\u7684\u5916\u90E8\u5F15\u7528\uFF1B\u4F1A\u8BDD\u6839\u4E3A\u5176 projects \u5B50\u76EE\u5F55\uFF0C\u4E0D\u590D\u5236\u51ED\u636E", "environmentKeys": ["CLAUDE_CONFIG_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u663E\u5F0F\u5B9E\u4F8B\u76EE\u5F55\u4F18\u5148\uFF0C\u5426\u5219\u5F15\u7528\u5916\u90E8 CLAUDE_CONFIG_DIR \u6216\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .claude\uFF1B\u5FC5\u987B\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u3002" }, "migrationSources": ["CLAUDE_CONFIG_DIR"] },
7636
7638
  { "path": "agents.companion.binary", "type": "string", "domain": "agents.companion", "sensitive": false, "remote": false, "apply": "restart", "description": "\u4F34\u968F\u7A97\u53E3 Agent \u53EF\u6267\u884C\u6587\u4EF6", "environmentKeys": ["RUNWEAVE_COMPANION_AGENT_EXECUTABLE"], "owner": "electron/companion", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u4F7F\u7528\u5DF2\u5B89\u88C5 Codex App \u81EA\u5E26\u6267\u884C\u5165\u53E3\uFF1B\u663E\u5F0F\u503C\u5FC5\u987B\u53EF\u6267\u884C\u3002" }, "migrationSources": ["RUNWEAVE_COMPANION_AGENT_EXECUTABLE"] },
7637
7639
  { "path": "agents.codex.sessionsDirectory", "type": "string", "domain": "agents.codex", "sensitive": false, "remote": false, "apply": "restart", "description": "\u5916\u90E8 Codex \u4F1A\u8BDD\u76EE\u5F55\u5F15\u7528", "environmentKeys": ["RUNWEAVE_CODEX_SESSIONS_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u5916\u90E8\u5DE5\u5177\u62E5\u6709\u7684 CODEX_HOME/sessions \u6216\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .codex/sessions\uFF0C\u4EC5\u5F15\u7528\u3002" }, "migrationSources": ["RUNWEAVE_CODEX_SESSIONS_DIR"] },
7638
7640
  { "path": "agents.traex.sessionsDirectory", "type": "string", "domain": "agents.traex", "sensitive": false, "remote": false, "apply": "restart", "description": "\u5916\u90E8 Trae \u4F1A\u8BDD\u76EE\u5F55\u5F15\u7528", "environmentKeys": ["RUNWEAVE_TRAE_SESSIONS_DIR"], "owner": "backend+app-server", "scope": "instance", "storage": "settings.yaml", "default": { "rule": "\u64CD\u4F5C\u7CFB\u7EDF\u7528\u6237\u76EE\u5F55\u4E0B .trae/cli/sessions\uFF0C\u4EC5\u5F15\u7528\u3002" }, "migrationSources": ["RUNWEAVE_TRAE_SESSIONS_DIR"] },
@@ -7760,7 +7762,7 @@ var CONFIGURATION_COMPATIBILITY = {
7760
7762
  };
7761
7763
  var APP_SERVER_CONFIGURATION_COMPATIBILITY = {
7762
7764
  ...CONFIGURATION_COMPATIBILITY,
7763
- domainVersions: Object.fromEntries(["appServer", "agents.codex", "agents.traex"].map((domain) => [domain, [CONFIGURATION_DOMAIN_VERSIONS[domain]]]))
7765
+ domainVersions: Object.fromEntries(["appServer", "agents.codex", "agents.traex", "agents.claude"].map((domain) => [domain, [CONFIGURATION_DOMAIN_VERSIONS[domain]]]))
7764
7766
  };
7765
7767
  function supportsConfiguration(target, value) {
7766
7768
  if (!target || typeof target !== "object") return false;
@@ -7963,6 +7965,8 @@ function validateDomains(value, context) {
7963
7965
  if (["backend.taskSupervision.model", "terminal.defaultShell.command"].includes(key) && typeof entry === "string" && !entry.trim()) issue(key, "CONFIG_FIELD_VALUE_INVALID");
7964
7966
  if (key === "terminal.defaultShell.command" && typeof entry === "string" && /[\\/]/.test(entry) && !import_node_path3.default.isAbsolute(entry.trim())) issue(key, "CONFIG_FIELD_VALUE_INVALID");
7965
7967
  if (key.startsWith("terminal.defaultShell.") && (typeof entry === "string" ? entry.includes("\0") : Array.isArray(entry) && entry.some((item) => typeof item === "string" && item.includes("\0")))) issue(key, "CONFIG_FIELD_VALUE_INVALID");
7968
+ if (key === "agents.claude.binary" && typeof entry === "string" && (!entry.trim() || entry !== entry.trim() || [...entry].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127) || !import_node_path3.default.isAbsolute(entry) && !/^[A-Za-z0-9_][A-Za-z0-9_.+-]*$/.test(entry))) issue(key, "CONFIG_FIELD_VALUE_INVALID");
7969
+ if (key === "agents.claude.configDirectory" && typeof entry === "string" && (!import_node_path3.default.isAbsolute(entry) || [...entry].some((character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127))) issue(key, "CONFIG_FIELD_VALUE_INVALID");
7966
7970
  if (CONFIGURATION_ENUMS[key] && !CONFIGURATION_ENUMS[key].includes(String(entry))) issue(key, "CONFIG_FIELD_ENUM_INVALID");
7967
7971
  if (configurationServiceOrigin(key) && typeof entry === "string") {
7968
7972
  try {
@@ -1 +0,0 @@
1
- import{U as a,M as n}from"./index-BBNE8InR.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-CqUM0_7D.js";import{_ as i}from"./index-BBNE8InR.js";import"./chunk-FMBD7UC4-CQR_-5z5.js";import"./chunk-YZCP3GAM-DqZhVlNy.js";import"./chunk-55IACEB6-DDxrCLKB.js";import"./chunk-EDXVE4YY-LwYMVaGh.js";import"./main-BHwOPARZ.js";import"./index-D9-cSGu-.js";import"./record-content-Dn6GE_dv.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
@@ -1 +0,0 @@
1
- import{s as a,c as s,a as e,C as t}from"./chunk-4TB4RGXK-CqUM0_7D.js";import{_ as i}from"./index-BBNE8InR.js";import"./chunk-FMBD7UC4-CQR_-5z5.js";import"./chunk-YZCP3GAM-DqZhVlNy.js";import"./chunk-55IACEB6-DDxrCLKB.js";import"./chunk-EDXVE4YY-LwYMVaGh.js";import"./main-BHwOPARZ.js";import"./index-D9-cSGu-.js";import"./record-content-Dn6GE_dv.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
@@ -1 +0,0 @@
1
- import{b as r}from"./graph-GAq0lcsb.js";var e=4;function a(o){return r(o,e)}export{a as c};
@@ -1 +0,0 @@
1
- import{s as r,b as e,a,S as s}from"./chunk-OYMX7WX6-DQ0IiFt5.js";import{_ as i}from"./index-BBNE8InR.js";import"./chunk-55IACEB6-DDxrCLKB.js";import"./chunk-EDXVE4YY-LwYMVaGh.js";import"./index-D9-cSGu-.js";import"./main-BHwOPARZ.js";import"./record-content-Dn6GE_dv.js";var n={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{n as diagram};
@@ -1 +0,0 @@
1
- import{j as t}from"./index-D9-cSGu-.js";import o from"./connection-ToakGqMm.js";import"./main-BHwOPARZ.js";import"./record-content-Dn6GE_dv.js";function n(){return t.jsx(o,{accountOnly:!0})}export{n as default};