@runweave/server-linux-x64 0.1.16 → 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.
- package/manifest.json +178 -167
- package/native.tar.gz +0 -0
- package/package.json +1 -1
- package/payload/app-server/build-info.json +4 -4
- package/payload/app-server/index.cjs +33 -1
- package/payload/app-server/index.cjs.map +1 -1
- package/payload/backend/build-info.json +4 -4
- package/payload/backend/index.cjs +2368 -1674
- package/payload/backend/scheduled-tasks-sqlite-worker.cjs +11 -0
- package/payload/frontend/dist/assets/{_baseUniq-PiWEH-yN.js → _baseUniq-Rpr7ObZY.js} +1 -1
- package/payload/frontend/dist/assets/{access-khJ9m2er.js → access-BvxRY1pA.js} +1 -1
- package/payload/frontend/dist/assets/{advanced-DGKohnXi.js → advanced-CZfrALGq.js} +1 -1
- package/payload/frontend/dist/assets/{appearance-U-Ug7IyD.js → appearance-D0AwwNw_.js} +1 -1
- package/payload/frontend/dist/assets/{arc-BRbsuNBv.js → arc-BxzXVQYF.js} +1 -1
- package/payload/frontend/dist/assets/{architectureDiagram-Q4EWVU46-nAa6CrLt.js → architectureDiagram-Q4EWVU46-DTYJSSVX.js} +1 -1
- package/payload/frontend/dist/assets/{blockDiagram-DXYQGD6D-B32hMZsU.js → blockDiagram-DXYQGD6D-DaIImc6U.js} +1 -1
- package/payload/frontend/dist/assets/{c4Diagram-AHTNJAMY-BF-z05RQ.js → c4Diagram-AHTNJAMY-DRS-zy_e.js} +1 -1
- package/payload/frontend/dist/assets/channel-hL0i3Xgx.js +1 -0
- package/payload/frontend/dist/assets/{chunk-4BX2VUAB-CpsbjQI6.js → chunk-4BX2VUAB-BxZHfjDE.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-4TB4RGXK-CczITrGa.js → chunk-4TB4RGXK-BbTiOq_d.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-55IACEB6-CpJ67cqM.js → chunk-55IACEB6-DSGNAzPL.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-EDXVE4YY-DbBbY4zX.js → chunk-EDXVE4YY-C3VoLWVy.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-FMBD7UC4-D7OUnmzc.js → chunk-FMBD7UC4-jgIQKRAn.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-OYMX7WX6-XW9wc5RB.js → chunk-OYMX7WX6-CR1nxjr3.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-QZHKN3VN-BGTWWiWa.js → chunk-QZHKN3VN-BsZQAe-R.js} +1 -1
- package/payload/frontend/dist/assets/{chunk-YZCP3GAM-aDPViitX.js → chunk-YZCP3GAM-C7hytF3a.js} +1 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-Nr4qU3jt.js +1 -0
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-Nr4qU3jt.js +1 -0
- package/payload/frontend/dist/assets/clone-ePxKteP6.js +1 -0
- package/payload/frontend/dist/assets/{connection-C6WeK41z.js → connection-Brx3p6gD.js} +1 -1
- package/payload/frontend/dist/assets/{connections-DNdN1RmN.js → connections-DV6_2T4t.js} +1 -1
- package/payload/frontend/dist/assets/{cose-bilkent-S5V4N54A-Cwz2NhpB.js → cose-bilkent-S5V4N54A-CrqquZt2.js} +1 -1
- package/payload/frontend/dist/assets/{dagre-KV5264BT-BwQKFZOx.js → dagre-KV5264BT-BOAEPW4D.js} +1 -1
- package/payload/frontend/dist/assets/{desktop-pR36qBdU.js → desktop-1i0ByIN_.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-5BDNPKRD-S0AGOE5T.js → diagram-5BDNPKRD-NVdwMJnF.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-G4DWMVQ6-DovkRf9p.js → diagram-G4DWMVQ6-RKmkTTau.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-MMDJMWI5-Dq5WNwQl.js → diagram-MMDJMWI5-B0Or1DIY.js} +1 -1
- package/payload/frontend/dist/assets/{diagram-TYMM5635-CCnuStVI.js → diagram-TYMM5635-CoJGPUQX.js} +1 -1
- package/payload/frontend/dist/assets/{erDiagram-SMLLAGMA-BDMaPGeI.js → erDiagram-SMLLAGMA-DHK_lg3E.js} +1 -1
- package/payload/frontend/dist/assets/{flowDiagram-DWJPFMVM-BDv6vMkM.js → flowDiagram-DWJPFMVM-CzirUF-x.js} +1 -1
- package/payload/frontend/dist/assets/{ganttDiagram-T4ZO3ILL-CY8dWNYQ.js → ganttDiagram-T4ZO3ILL-DGY2KYoN.js} +1 -1
- package/payload/frontend/dist/assets/{gitGraphDiagram-UUTBAWPF-oc3kHd5q.js → gitGraphDiagram-UUTBAWPF-BI5lNHKC.js} +1 -1
- package/payload/frontend/dist/assets/{graph-DKuyIZob.js → graph-CxjgBe1N.js} +1 -1
- package/payload/frontend/dist/assets/{image-Dc8RoLU8.js → image-LArOi_ON.js} +1 -1
- package/payload/frontend/dist/assets/{index-yjpBPGaI.js → index-CLYrzd8Y.js} +5 -5
- package/payload/frontend/dist/assets/{infoDiagram-42DDH7IO-BLcpWdtJ.js → infoDiagram-42DDH7IO-DTRl6YSd.js} +1 -1
- package/payload/frontend/dist/assets/{ishikawaDiagram-UXIWVN3A-BA51Kxg1.js → ishikawaDiagram-UXIWVN3A-DCnBRtVx.js} +1 -1
- package/payload/frontend/dist/assets/{journeyDiagram-VCZTEJTY-DihQv76o.js → journeyDiagram-VCZTEJTY-ChVgjvDs.js} +1 -1
- package/payload/frontend/dist/assets/{kanban-definition-6JOO6SKY-f8IFXcQ8.js → kanban-definition-6JOO6SKY-skToH2-J.js} +1 -1
- package/payload/frontend/dist/assets/{layout-CXtaqE_c.js → layout-B4V_ctSo.js} +1 -1
- package/payload/frontend/dist/assets/{linear-M-kNw4GE.js → linear-DYom329p.js} +1 -1
- package/payload/frontend/dist/assets/{main-2Qq7QDN9.js → main-C_6tTN_b.js} +5 -5
- package/payload/frontend/dist/assets/{min-CA0jPMDz.js → min-EMXbJh1s.js} +1 -1
- package/payload/frontend/dist/assets/{mindmap-definition-QFDTVHPH-swU906Iz.js → mindmap-definition-QFDTVHPH-DLHGcrEw.js} +1 -1
- package/payload/frontend/dist/assets/{monitoring-BXwlTH4w.js → monitoring-Bvfy9Q9G.js} +1 -1
- package/payload/frontend/dist/assets/{notifications-HSWJoZsd.js → notifications-CdkYtTCy.js} +1 -1
- package/payload/frontend/dist/assets/{pieDiagram-DEJITSTG-9HEe0TSS.js → pieDiagram-DEJITSTG-LrDfLpSu.js} +1 -1
- package/payload/frontend/dist/assets/{quadrantDiagram-34T5L4WZ-D6XYJZTB.js → quadrantDiagram-34T5L4WZ-uV9sfVKm.js} +1 -1
- package/payload/frontend/dist/assets/{record-content-BeTlb4At.js → record-content-B3qVdcq-.js} +1 -1
- package/payload/frontend/dist/assets/{requirementDiagram-MS252O5E-WEqUAT3C.js → requirementDiagram-MS252O5E-Cf_SmlxS.js} +1 -1
- package/payload/frontend/dist/assets/{sankeyDiagram-XADWPNL6-aArdTOj7.js → sankeyDiagram-XADWPNL6-DSLCPq2l.js} +1 -1
- package/payload/frontend/dist/assets/{sequenceDiagram-FGHM5R23-CDeRkIe0.js → sequenceDiagram-FGHM5R23-CAAjivQf.js} +1 -1
- package/payload/frontend/dist/assets/{stateDiagram-FHFEXIEX-1imZLfkb.js → stateDiagram-FHFEXIEX-DNMUe2-F.js} +1 -1
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-Ca5k1Q3K.js +1 -0
- package/payload/frontend/dist/assets/{status-CoUwjZ7k.js → status-BPA1tGcF.js} +1 -1
- package/payload/frontend/dist/assets/suiji-ZMTJOgTp.js +1 -0
- package/payload/frontend/dist/assets/{svg-5T9dQhUs.js → svg-BbHfpNxC.js} +1 -1
- package/payload/frontend/dist/assets/{tabs-yWf361z8.js → tabs-DkuqaUwz.js} +1 -1
- package/payload/frontend/dist/assets/{timeline-definition-GMOUNBTQ-TPyxkidk.js → timeline-definition-GMOUNBTQ-DNJNPFK4.js} +1 -1
- package/payload/frontend/dist/assets/{vennDiagram-DHZGUBPP-NmkcMXEI.js → vennDiagram-DHZGUBPP-BycjIB3y.js} +1 -1
- package/payload/frontend/dist/assets/{wardley-RL74JXVD-B_n5wDkw.js → wardley-RL74JXVD-Bq01rln7.js} +1 -1
- package/payload/frontend/dist/assets/{wardleyDiagram-NUSXRM2D-xyfZ4Ot2.js → wardleyDiagram-NUSXRM2D-D4_m8ewM.js} +1 -1
- package/payload/frontend/dist/assets/{xychartDiagram-5P7HB3ND-L0NM-pq_.js → xychartDiagram-5P7HB3ND-CovxGnwH.js} +1 -1
- package/payload/frontend/dist/build-info.json +4 -4
- package/payload/frontend/dist/companion.html +1 -1
- package/payload/frontend/dist/index.html +2 -2
- package/payload/packages/agent-bridge/src/install-pi.mjs +1 -0
- package/payload/plugins/pi/dist/bridge/runweave-hook-bridge.cjs +9 -3
- package/payload/plugins/pi/dist/bridge/runweave-hook-claude.cjs +68 -0
- package/payload/plugins/pi/dist/bridge/runweave-hook-completion.cjs +3 -37
- package/payload/plugins/pi/dist/bridge/runweave-hook-payload.cjs +1 -0
- package/payload/plugins/toolkit/.codex-plugin/plugin.json +1 -1
- package/payload/plugins/toolkit/hooks/runweave-hook-bridge.cjs +9 -3
- package/payload/plugins/toolkit/hooks/runweave-hook-claude.cjs +68 -0
- package/payload/plugins/toolkit/hooks/runweave-hook-completion.cjs +3 -37
- package/payload/plugins/toolkit/hooks/runweave-hook-payload.cjs +1 -0
- package/payload/plugins/toolkit-release.json +1 -1
- package/payload/frontend/dist/assets/channel-BbKg1_I_.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-6PBFFD2Q-CQ2mrjxw.js +0 -1
- package/payload/frontend/dist/assets/classDiagram-v2-HSJHXN6E-CQ2mrjxw.js +0 -1
- package/payload/frontend/dist/assets/clone-B-rmfNeZ.js +0 -1
- package/payload/frontend/dist/assets/stateDiagram-v2-QKLJ7IA2-DafDrUDX.js +0 -1
- package/payload/frontend/dist/assets/suiji-Dch5gUBM.js +0 -1
|
@@ -1,40 +1,6 @@
|
|
|
1
|
-
/* global fetch, module, require,
|
|
1
|
+
/* global fetch, module, require, AbortSignal */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
3
3
|
const { buildCompletionHookBody, extractUserPrompt, isFeishuAttentionHook, readNotificationType } = require("./runweave-hook-payload.cjs");
|
|
4
|
-
const { spawnSync } = require("node:child_process");
|
|
5
|
-
const { randomUUID } = require("node:crypto");
|
|
6
|
-
const path = require("node:path");
|
|
7
|
-
|
|
8
|
-
function readClaudeInstance(spawnSync) {
|
|
9
|
-
const result = spawnSync("ps", ["-axo", "pid=,ppid=,comm="], {
|
|
10
|
-
encoding: "utf8", timeout: 1000, maxBuffer: 2 * 1024 * 1024,
|
|
11
|
-
});
|
|
12
|
-
if (result.error || result.status !== 0) return null;
|
|
13
|
-
const processes = new Map();
|
|
14
|
-
for (const line of String(result.stdout).split(/\r?\n/)) {
|
|
15
|
-
const match = line.match(/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/);
|
|
16
|
-
if (match) processes.set(Number(match[1]), { parent: Number(match[2]), command: path.basename(match[3]) });
|
|
17
|
-
}
|
|
18
|
-
let claudePid = null;
|
|
19
|
-
const visited = new Set();
|
|
20
|
-
for (let pid = process.ppid; pid > 1 && !visited.has(pid); ) {
|
|
21
|
-
visited.add(pid);
|
|
22
|
-
const entry = processes.get(pid);
|
|
23
|
-
if (!entry) return null;
|
|
24
|
-
if (["claude", "codex", "trae", "traex", "pi"].includes(entry.command)) {
|
|
25
|
-
if (claudePid || entry.command !== "claude") return null;
|
|
26
|
-
claudePid = pid;
|
|
27
|
-
}
|
|
28
|
-
pid = entry.parent;
|
|
29
|
-
}
|
|
30
|
-
if (!claudePid) return null;
|
|
31
|
-
const started = spawnSync("ps", ["-p", String(claudePid), "-o", "lstart="], {
|
|
32
|
-
encoding: "utf8", timeout: 1000,
|
|
33
|
-
});
|
|
34
|
-
const stamp = String(started.stdout || "").trim();
|
|
35
|
-
return !started.error && started.status === 0 && stamp ? `${claudePid}:${stamp}` : null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
4
|
async function postCompletionHook({
|
|
39
5
|
endpoint,
|
|
40
6
|
token,
|
|
@@ -55,11 +21,11 @@ async function postCompletionHook({
|
|
|
55
21
|
});
|
|
56
22
|
if (source === "claude") {
|
|
57
23
|
if (!endpoint) return { accepted: false };
|
|
58
|
-
const instanceId =
|
|
24
|
+
const instanceId = payload.claude?.instanceId;
|
|
59
25
|
if (!instanceId || payload.agent_id || payload.agent_transcript_path) return { accepted: false };
|
|
60
26
|
const notificationType = readNotificationType(payload);
|
|
61
27
|
const event = String(rawEvent).toLowerCase().replace(/[_\s-]/g, "");
|
|
62
|
-
body.claude = { instanceId, eventId: payload.runweaveHookEventId
|
|
28
|
+
body.claude = { instanceId, eventId: payload.runweaveHookEventId,
|
|
63
29
|
...(notificationType ? { notificationType } : {}),
|
|
64
30
|
...(event === "userpromptsubmit" ? { query: extractUserPrompt(payload) || "" } : {}) };
|
|
65
31
|
body.completionReason = event === "permissionrequest" ||
|
|
@@ -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.
|
|
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
|
-
|
|
326
|
-
|
|
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.
|
|
@@ -418,7 +424,6 @@ async function main() {
|
|
|
418
424
|
const summary = extractCompletionSummary(payload);
|
|
419
425
|
if (summary) payload.last_assistant_message = summary;
|
|
420
426
|
}
|
|
421
|
-
payload.runweaveHookEventId = crypto.randomUUID();
|
|
422
427
|
const appServerClient = await discoverAppServer();
|
|
423
428
|
if (!appServerClient) {
|
|
424
429
|
appendDebugLog("hook bridge app-server unavailable", {
|
|
@@ -484,6 +489,7 @@ async function main() {
|
|
|
484
489
|
: undefined,
|
|
485
490
|
activityEventId,
|
|
486
491
|
...(source === "pi" ? { pi: payload.pi } : {}),
|
|
492
|
+
...(source === "claude" ? { claude: payload.claude } : {}),
|
|
487
493
|
operationId: process.env.RUNWEAVE_TERMINAL_AGENT_OPERATION_ID || null,
|
|
488
494
|
});
|
|
489
495
|
appendDebugLog("hook bridge posted agent hook", {
|
|
@@ -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,40 +1,6 @@
|
|
|
1
|
-
/* global fetch, module, require,
|
|
1
|
+
/* global fetch, module, require, AbortSignal */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
3
3
|
const { buildCompletionHookBody, extractUserPrompt, isFeishuAttentionHook, readNotificationType } = require("./runweave-hook-payload.cjs");
|
|
4
|
-
const { spawnSync } = require("node:child_process");
|
|
5
|
-
const { randomUUID } = require("node:crypto");
|
|
6
|
-
const path = require("node:path");
|
|
7
|
-
|
|
8
|
-
function readClaudeInstance(spawnSync) {
|
|
9
|
-
const result = spawnSync("ps", ["-axo", "pid=,ppid=,comm="], {
|
|
10
|
-
encoding: "utf8", timeout: 1000, maxBuffer: 2 * 1024 * 1024,
|
|
11
|
-
});
|
|
12
|
-
if (result.error || result.status !== 0) return null;
|
|
13
|
-
const processes = new Map();
|
|
14
|
-
for (const line of String(result.stdout).split(/\r?\n/)) {
|
|
15
|
-
const match = line.match(/^\s*(\d+)\s+(\d+)\s+(.+?)\s*$/);
|
|
16
|
-
if (match) processes.set(Number(match[1]), { parent: Number(match[2]), command: path.basename(match[3]) });
|
|
17
|
-
}
|
|
18
|
-
let claudePid = null;
|
|
19
|
-
const visited = new Set();
|
|
20
|
-
for (let pid = process.ppid; pid > 1 && !visited.has(pid); ) {
|
|
21
|
-
visited.add(pid);
|
|
22
|
-
const entry = processes.get(pid);
|
|
23
|
-
if (!entry) return null;
|
|
24
|
-
if (["claude", "codex", "trae", "traex", "pi"].includes(entry.command)) {
|
|
25
|
-
if (claudePid || entry.command !== "claude") return null;
|
|
26
|
-
claudePid = pid;
|
|
27
|
-
}
|
|
28
|
-
pid = entry.parent;
|
|
29
|
-
}
|
|
30
|
-
if (!claudePid) return null;
|
|
31
|
-
const started = spawnSync("ps", ["-p", String(claudePid), "-o", "lstart="], {
|
|
32
|
-
encoding: "utf8", timeout: 1000,
|
|
33
|
-
});
|
|
34
|
-
const stamp = String(started.stdout || "").trim();
|
|
35
|
-
return !started.error && started.status === 0 && stamp ? `${claudePid}:${stamp}` : null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
4
|
async function postCompletionHook({
|
|
39
5
|
endpoint,
|
|
40
6
|
token,
|
|
@@ -55,11 +21,11 @@ async function postCompletionHook({
|
|
|
55
21
|
});
|
|
56
22
|
if (source === "claude") {
|
|
57
23
|
if (!endpoint) return { accepted: false };
|
|
58
|
-
const instanceId =
|
|
24
|
+
const instanceId = payload.claude?.instanceId;
|
|
59
25
|
if (!instanceId || payload.agent_id || payload.agent_transcript_path) return { accepted: false };
|
|
60
26
|
const notificationType = readNotificationType(payload);
|
|
61
27
|
const event = String(rawEvent).toLowerCase().replace(/[_\s-]/g, "");
|
|
62
|
-
body.claude = { instanceId, eventId: payload.runweaveHookEventId
|
|
28
|
+
body.claude = { instanceId, eventId: payload.runweaveHookEventId,
|
|
63
29
|
...(notificationType ? { notificationType } : {}),
|
|
64
30
|
...(event === "userpromptsubmit" ? { query: extractUserPrompt(payload) || "" } : {}) };
|
|
65
31
|
body.completionReason = event === "permissionrequest" ||
|
|
@@ -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.
|
|
1
|
+
{"version":"0.2.0+codex.1e1b247f9ff295236b4a62855f1ca6b63035bb43bd51b14a095e2aeee09a5fea","digest":"1e1b247f9ff295236b4a62855f1ca6b63035bb43bd51b14a095e2aeee09a5fea"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,M as n}from"./index-yjpBPGaI.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-CczITrGa.js";import{_ as i}from"./index-yjpBPGaI.js";import"./chunk-FMBD7UC4-D7OUnmzc.js";import"./chunk-YZCP3GAM-aDPViitX.js";import"./chunk-55IACEB6-CpJ67cqM.js";import"./chunk-EDXVE4YY-DbBbY4zX.js";import"./main-2Qq7QDN9.js";import"./index-D9-cSGu-.js";import"./record-content-BeTlb4At.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-CczITrGa.js";import{_ as i}from"./index-yjpBPGaI.js";import"./chunk-FMBD7UC4-D7OUnmzc.js";import"./chunk-YZCP3GAM-aDPViitX.js";import"./chunk-55IACEB6-CpJ67cqM.js";import"./chunk-EDXVE4YY-DbBbY4zX.js";import"./main-2Qq7QDN9.js";import"./index-D9-cSGu-.js";import"./record-content-BeTlb4At.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-DKuyIZob.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-XW9wc5RB.js";import{_ as i}from"./index-yjpBPGaI.js";import"./chunk-55IACEB6-CpJ67cqM.js";import"./chunk-EDXVE4YY-DbBbY4zX.js";import"./index-D9-cSGu-.js";import"./main-2Qq7QDN9.js";import"./record-content-BeTlb4At.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-C6WeK41z.js";import"./main-2Qq7QDN9.js";import"./record-content-BeTlb4At.js";function n(){return t.jsx(o,{accountOnly:!0})}export{n as default};
|