@clawtrail/context-graph-openclaw 0.7.5 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -56
- package/dist/OpenClawAdapter.d.ts +6 -6
- package/dist/OpenClawAdapter.d.ts.map +1 -1
- package/dist/OpenClawAdapter.js +46 -36
- package/dist/OpenClawAdapter.js.map +1 -1
- package/dist/detectors/BuildDetector.js +11 -11
- package/dist/detectors/HttpDetector.d.ts.map +1 -1
- package/dist/detectors/HttpDetector.js +20 -17
- package/dist/detectors/HttpDetector.js.map +1 -1
- package/dist/detectors/TestDetector.js +9 -9
- package/dist/hooks/lifecycle.d.ts +1 -1
- package/dist/hooks/lifecycle.js +4 -4
- package/dist/hooks/llmOutput.d.ts +2 -2
- package/dist/hooks/llmOutput.js +5 -5
- package/dist/hooks/toolCall.d.ts +3 -3
- package/dist/hooks/toolCall.d.ts.map +1 -1
- package/dist/hooks/toolCall.js +4 -4
- package/dist/hooks/toolCall.js.map +1 -1
- package/dist/index.d.ts +29 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -18
- package/dist/index.js.map +1 -1
- package/dist/mappers/MapperRegistry.d.ts +4 -0
- package/dist/mappers/MapperRegistry.d.ts.map +1 -1
- package/dist/mappers/MapperRegistry.js +8 -0
- package/dist/mappers/MapperRegistry.js.map +1 -1
- package/dist/mappers/browser.d.ts +11 -0
- package/dist/mappers/browser.d.ts.map +1 -0
- package/dist/mappers/browser.js +66 -0
- package/dist/mappers/browser.js.map +1 -0
- package/dist/mappers/document.d.ts +7 -0
- package/dist/mappers/document.d.ts.map +1 -0
- package/dist/mappers/document.js +49 -0
- package/dist/mappers/document.js.map +1 -0
- package/dist/mappers/fallback.d.ts +1 -1
- package/dist/mappers/fallback.js +3 -3
- package/dist/mappers/fs.d.ts +1 -1
- package/dist/mappers/fs.d.ts.map +1 -1
- package/dist/mappers/fs.js +11 -11
- package/dist/mappers/fs.js.map +1 -1
- package/dist/mappers/git.d.ts +1 -1
- package/dist/mappers/git.d.ts.map +1 -1
- package/dist/mappers/git.js +21 -14
- package/dist/mappers/git.js.map +1 -1
- package/dist/mappers/message.d.ts +11 -0
- package/dist/mappers/message.d.ts.map +1 -0
- package/dist/mappers/message.js +72 -0
- package/dist/mappers/message.js.map +1 -0
- package/dist/mappers/session.d.ts +12 -0
- package/dist/mappers/session.d.ts.map +1 -0
- package/dist/mappers/session.js +71 -0
- package/dist/mappers/session.js.map +1 -0
- package/dist/mappers/shell.d.ts +4 -4
- package/dist/mappers/shell.d.ts.map +1 -1
- package/dist/mappers/shell.js +17 -15
- package/dist/mappers/shell.js.map +1 -1
- package/dist/mappers/web.d.ts +11 -0
- package/dist/mappers/web.d.ts.map +1 -0
- package/dist/mappers/web.js +89 -0
- package/dist/mappers/web.js.map +1 -0
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +195 -17
- package/dist/register.js.map +1 -1
- package/dist/rules/openclaw-rules.d.ts +7 -1
- package/dist/rules/openclaw-rules.d.ts.map +1 -1
- package/dist/rules/openclaw-rules.js +321 -120
- package/dist/rules/openclaw-rules.js.map +1 -1
- package/dist/tools/status.d.ts +1 -1
- package/dist/tools/status.js +3 -3
- package/dist/tools/summarize.d.ts +1 -1
- package/dist/tools/summarize.d.ts.map +1 -1
- package/dist/tools/summarize.js +5 -5
- package/dist/tools/summarize.js.map +1 -1
- package/dist/util/hash.d.ts +1 -1
- package/dist/util/hash.d.ts.map +1 -1
- package/dist/util/hash.js +52 -43
- package/dist/util/hash.js.map +1 -1
- package/openclaw.plugin.json +5 -1
- package/package.json +6 -4
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
const frameworks = [
|
|
6
6
|
{
|
|
7
|
-
framework:
|
|
7
|
+
framework: "jest",
|
|
8
8
|
cmdPatterns: [/\bjest\b/, /\bvitest\b/],
|
|
9
9
|
parseOutput(stdout, stderr) {
|
|
10
|
-
const combined = stdout +
|
|
10
|
+
const combined = stdout + "\n" + stderr;
|
|
11
11
|
// Jest/Vitest outputs counts in variable order: "5 passed, 2 failed, 7 total"
|
|
12
12
|
const passedMatch = combined.match(/(\d+)\s+passed/i);
|
|
13
13
|
const failedMatch = combined.match(/(\d+)\s+failed/i);
|
|
@@ -24,7 +24,7 @@ const frameworks = [
|
|
|
24
24
|
},
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
framework:
|
|
27
|
+
framework: "mocha",
|
|
28
28
|
cmdPatterns: [/\bmocha\b/],
|
|
29
29
|
parseOutput(stdout) {
|
|
30
30
|
// Mocha: "5 passing", "2 failing"
|
|
@@ -41,7 +41,7 @@ const frameworks = [
|
|
|
41
41
|
},
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
framework:
|
|
44
|
+
framework: "pytest",
|
|
45
45
|
cmdPatterns: [/\bpytest\b/, /python\s+-m\s+pytest/],
|
|
46
46
|
parseOutput(stdout) {
|
|
47
47
|
// pytest: "5 passed, 2 failed, 1 skipped"
|
|
@@ -57,7 +57,7 @@ const frameworks = [
|
|
|
57
57
|
},
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
|
-
framework:
|
|
60
|
+
framework: "cargo-test",
|
|
61
61
|
cmdPatterns: [/\bcargo\s+test\b/],
|
|
62
62
|
parseOutput(stdout) {
|
|
63
63
|
// Cargo: "test result: ok. 5 passed; 0 failed;"
|
|
@@ -73,7 +73,7 @@ const frameworks = [
|
|
|
73
73
|
},
|
|
74
74
|
},
|
|
75
75
|
{
|
|
76
|
-
framework:
|
|
76
|
+
framework: "go-test",
|
|
77
77
|
cmdPatterns: [/\bgo\s+test\b/],
|
|
78
78
|
parseOutput(stdout) {
|
|
79
79
|
// Go: "ok package 0.5s" or "FAIL package 0.5s"
|
|
@@ -86,7 +86,7 @@ const frameworks = [
|
|
|
86
86
|
},
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
framework:
|
|
89
|
+
framework: "hardhat",
|
|
90
90
|
cmdPatterns: [/\bhardhat\s+test\b/],
|
|
91
91
|
parseOutput(stdout) {
|
|
92
92
|
// Hardhat uses Mocha output
|
|
@@ -116,8 +116,8 @@ export class TestDetector {
|
|
|
116
116
|
const parsed = fw.parseOutput(stdout, stderr);
|
|
117
117
|
// Determine framework name (vitest vs jest)
|
|
118
118
|
let fwName = fw.framework;
|
|
119
|
-
if (fwName ===
|
|
120
|
-
fwName =
|
|
119
|
+
if (fwName === "jest" && /\bvitest\b/.test(cmd)) {
|
|
120
|
+
fwName = "vitest";
|
|
121
121
|
}
|
|
122
122
|
return {
|
|
123
123
|
framework: fwName,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Lifecycle hooks — wired into OpenClaw's session_start / session_end events.
|
|
3
3
|
*/
|
|
4
|
-
import type { ContextGraph, Session } from
|
|
4
|
+
import type { ContextGraph, Session } from "@clawtrail/context-graph";
|
|
5
5
|
export interface OpenClawSessionContext {
|
|
6
6
|
sessionKey: string;
|
|
7
7
|
initialMessage?: string;
|
package/dist/hooks/lifecycle.js
CHANGED
|
@@ -8,18 +8,18 @@ export function createLifecycleHandlers(cg, config) {
|
|
|
8
8
|
async onSessionStart(ctx) {
|
|
9
9
|
await cg.init();
|
|
10
10
|
const session = await cg.startSession({
|
|
11
|
-
task: ctx.initialMessage ||
|
|
11
|
+
task: ctx.initialMessage || "OpenClaw session",
|
|
12
12
|
actorId: config.agentId || `agent:openclaw:${ctx.sessionKey}`,
|
|
13
13
|
policy: config.policyPath,
|
|
14
14
|
});
|
|
15
|
-
ctx.set(
|
|
15
|
+
ctx.set("cg:session_id", session.meta.session_id);
|
|
16
16
|
return session;
|
|
17
17
|
},
|
|
18
18
|
async onSessionEnd(ctx) {
|
|
19
|
-
const sessionId = ctx.get(
|
|
19
|
+
const sessionId = ctx.get("cg:session_id");
|
|
20
20
|
if (!sessionId)
|
|
21
21
|
return;
|
|
22
|
-
await cg.endSession(sessionId, { status:
|
|
22
|
+
await cg.endSession(sessionId, { status: "COMPLETED" });
|
|
23
23
|
},
|
|
24
24
|
};
|
|
25
25
|
}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
*
|
|
9
9
|
* URLs are always hashed — raw URLs are never persisted.
|
|
10
10
|
*/
|
|
11
|
-
import type { ContextGraph } from
|
|
12
|
-
import type { OpenClawSessionContext } from
|
|
11
|
+
import type { ContextGraph } from "@clawtrail/context-graph";
|
|
12
|
+
import type { OpenClawSessionContext } from "./lifecycle.js";
|
|
13
13
|
export interface LlmHttpReference {
|
|
14
14
|
urlHash: string;
|
|
15
15
|
hostHash: string;
|
package/dist/hooks/llmOutput.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { sha256 } from
|
|
1
|
+
import { sha256 } from "../util/hash.js";
|
|
2
2
|
const URL_PATTERN = /https?:\/\/[^\s'"<>\])}]+/g;
|
|
3
3
|
// Look for HTTP method words immediately before a URL
|
|
4
4
|
const METHOD_BEFORE_URL = /\b(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(?:to\s+|from\s+)?https?:\/\//gi;
|
|
@@ -15,7 +15,7 @@ export function extractHttpReferences(content) {
|
|
|
15
15
|
// Build a map of URL → method from context
|
|
16
16
|
const methodMap = new Map();
|
|
17
17
|
let match;
|
|
18
|
-
const methodRegex = new RegExp(METHOD_BEFORE_URL.source,
|
|
18
|
+
const methodRegex = new RegExp(METHOD_BEFORE_URL.source, "gi");
|
|
19
19
|
while ((match = methodRegex.exec(content)) !== null) {
|
|
20
20
|
// Find the URL that follows this method keyword
|
|
21
21
|
const afterMethod = content.slice(match.index + match[1].length);
|
|
@@ -25,7 +25,7 @@ export function extractHttpReferences(content) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
return unique.map((rawUrl) => {
|
|
28
|
-
let hostHash = sha256(
|
|
28
|
+
let hostHash = sha256("unknown");
|
|
29
29
|
try {
|
|
30
30
|
const parsed = new URL(rawUrl);
|
|
31
31
|
hostHash = sha256(parsed.hostname);
|
|
@@ -46,7 +46,7 @@ export function extractHttpReferences(content) {
|
|
|
46
46
|
export function createLlmOutputHandlers(cg) {
|
|
47
47
|
return {
|
|
48
48
|
async onLlmOutput(content, ctx) {
|
|
49
|
-
const sessionId = ctx.get(
|
|
49
|
+
const sessionId = ctx.get("cg:session_id");
|
|
50
50
|
if (!sessionId)
|
|
51
51
|
return;
|
|
52
52
|
const refs = extractHttpReferences(content);
|
|
@@ -54,7 +54,7 @@ export function createLlmOutputHandlers(cg) {
|
|
|
54
54
|
return;
|
|
55
55
|
const session = await cg.getSession(sessionId);
|
|
56
56
|
await session.logEvent({
|
|
57
|
-
type:
|
|
57
|
+
type: "LLM_HTTP_REFERENCE",
|
|
58
58
|
data: {
|
|
59
59
|
reference_count: refs.length,
|
|
60
60
|
references: refs.map((r) => ({
|
package/dist/hooks/toolCall.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tool call hooks — wired into OpenClaw's before_tool_call / after_tool_call events.
|
|
3
3
|
*/
|
|
4
|
-
import type { ContextGraph } from
|
|
5
|
-
import type { MapperRegistry } from
|
|
6
|
-
import type { OpenClawSessionContext } from
|
|
4
|
+
import type { ContextGraph } from "@clawtrail/context-graph";
|
|
5
|
+
import type { MapperRegistry } from "../mappers/MapperRegistry.js";
|
|
6
|
+
import type { OpenClawSessionContext } from "./lifecycle.js";
|
|
7
7
|
export interface ToolCallEvent {
|
|
8
8
|
toolName: string;
|
|
9
9
|
params: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolCall.d.ts","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"toolCall.d.ts","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,cAAc;4BAIZ,aAAa,OACf,sBAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC;2BAeP,aAAa,OACf,sBAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC;EAwBnB"}
|
package/dist/hooks/toolCall.js
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
export function createToolCallHandlers(cg, mappers) {
|
|
2
2
|
return {
|
|
3
3
|
async onBeforeToolCall(event, ctx) {
|
|
4
|
-
const sessionId = ctx.get(
|
|
4
|
+
const sessionId = ctx.get("cg:session_id");
|
|
5
5
|
if (!sessionId)
|
|
6
6
|
return;
|
|
7
7
|
const session = await cg.getSession(sessionId);
|
|
8
8
|
const mapped = mappers.mapStart(event.toolName, event.params);
|
|
9
9
|
await session.logEvent({
|
|
10
10
|
type: mapped.type,
|
|
11
|
-
status:
|
|
11
|
+
status: "STARTED",
|
|
12
12
|
data: mapped.data,
|
|
13
13
|
});
|
|
14
14
|
},
|
|
15
15
|
async onAfterToolCall(event, ctx) {
|
|
16
|
-
const sessionId = ctx.get(
|
|
16
|
+
const sessionId = ctx.get("cg:session_id");
|
|
17
17
|
if (!sessionId)
|
|
18
18
|
return;
|
|
19
19
|
const session = await cg.getSession(sessionId);
|
|
20
20
|
const mapped = mappers.mapEnd(event.toolName, event.params, event.result ?? null, event.error);
|
|
21
21
|
await session.logEvent({
|
|
22
22
|
type: mapped.type,
|
|
23
|
-
status: (event.error ?
|
|
23
|
+
status: (event.error ? "FAILED" : "SUCCEEDED"),
|
|
24
24
|
data: {
|
|
25
25
|
...mapped.data,
|
|
26
26
|
...(event.durationMs !== undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolCall.js","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toolCall.js","sourceRoot":"","sources":["../../src/hooks/toolCall.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,sBAAsB,CACpC,EAAgB,EAChB,OAAuB;IAEvB,OAAO;QACL,KAAK,CAAC,gBAAgB,CACpB,KAAoB,EACpB,GAA2B;YAE3B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;YACjE,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9D,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,SAAwB;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,eAAe,CACnB,KAAoB,EACpB,GAA2B;YAE3B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,eAAe,CAAuB,CAAC;YACjE,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,MAAM,IAAI,IAAI,EACpB,KAAK,CAAC,KAAK,CACZ,CAAC;YAEF,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAgB;gBAC7D,IAAI,EAAE;oBACJ,GAAG,MAAM,CAAC,IAAI;oBACd,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;wBAChC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,EAAE;wBACnC,CAAC,CAAC,EAAE,CAAC;iBACR;aACF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,33 +5,33 @@
|
|
|
5
5
|
* Captures agent execution traces as PROV-O events with
|
|
6
6
|
* hash chain integrity and signed submissions.
|
|
7
7
|
*/
|
|
8
|
-
export { OpenClawAdapter } from
|
|
9
|
-
export type { AdapterConfig, SignedSubmission } from
|
|
10
|
-
export { MapperRegistry } from
|
|
11
|
-
export type { EventMapper, MappedEvent } from
|
|
12
|
-
export { ShellMapper } from
|
|
13
|
-
export { FsMapper } from
|
|
14
|
-
export { GitMapper } from
|
|
15
|
-
export { FallbackMapper } from
|
|
16
|
-
export { TestDetector } from
|
|
17
|
-
export type { TestResult } from
|
|
18
|
-
export { BuildDetector } from
|
|
19
|
-
export type { BuildResult } from
|
|
20
|
-
export { HttpDetector } from
|
|
21
|
-
export type { HttpResult } from
|
|
22
|
-
export { createLifecycleHandlers } from
|
|
23
|
-
export type { OpenClawSessionContext, LifecycleEvent } from
|
|
24
|
-
export { createToolCallHandlers } from
|
|
25
|
-
export type { ToolCallEvent } from
|
|
26
|
-
export { createLlmOutputHandlers } from
|
|
27
|
-
export type { LlmHttpReference } from
|
|
28
|
-
export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool, CanCallApis, CanHandleHttpErrors, CanCreateContent, CanEngageCommunity, CanRespondToNotifications, CanMakeDecisions, IsConsistentlyActive, } from
|
|
29
|
-
export { getStatus } from
|
|
30
|
-
export type { StatusResult } from
|
|
31
|
-
export { summarizeSession } from
|
|
32
|
-
export type { SummarizeResult } from
|
|
33
|
-
export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from
|
|
34
|
-
export { loadChainState, saveChainState } from
|
|
35
|
-
export type { ChainState, ChainStateSubmission } from
|
|
36
|
-
export { default as register } from
|
|
8
|
+
export { OpenClawAdapter } from "./OpenClawAdapter.js";
|
|
9
|
+
export type { AdapterConfig, SignedSubmission } from "./OpenClawAdapter.js";
|
|
10
|
+
export { MapperRegistry } from "./mappers/MapperRegistry.js";
|
|
11
|
+
export type { EventMapper, MappedEvent } from "./mappers/MapperRegistry.js";
|
|
12
|
+
export { ShellMapper } from "./mappers/shell.js";
|
|
13
|
+
export { FsMapper } from "./mappers/fs.js";
|
|
14
|
+
export { GitMapper } from "./mappers/git.js";
|
|
15
|
+
export { FallbackMapper } from "./mappers/fallback.js";
|
|
16
|
+
export { TestDetector } from "./detectors/TestDetector.js";
|
|
17
|
+
export type { TestResult } from "./detectors/TestDetector.js";
|
|
18
|
+
export { BuildDetector } from "./detectors/BuildDetector.js";
|
|
19
|
+
export type { BuildResult } from "./detectors/BuildDetector.js";
|
|
20
|
+
export { HttpDetector } from "./detectors/HttpDetector.js";
|
|
21
|
+
export type { HttpResult } from "./detectors/HttpDetector.js";
|
|
22
|
+
export { createLifecycleHandlers } from "./hooks/lifecycle.js";
|
|
23
|
+
export type { OpenClawSessionContext, LifecycleEvent, } from "./hooks/lifecycle.js";
|
|
24
|
+
export { createToolCallHandlers } from "./hooks/toolCall.js";
|
|
25
|
+
export type { ToolCallEvent } from "./hooks/toolCall.js";
|
|
26
|
+
export { createLlmOutputHandlers } from "./hooks/llmOutput.js";
|
|
27
|
+
export type { LlmHttpReference } from "./hooks/llmOutput.js";
|
|
28
|
+
export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool, CanCallApis, CanHandleHttpErrors, CanCreateContent, CanEngageCommunity, CanRespondToNotifications, CanMakeDecisions, IsConsistentlyActive, } from "./rules/openclaw-rules.js";
|
|
29
|
+
export { getStatus } from "./tools/status.js";
|
|
30
|
+
export type { StatusResult } from "./tools/status.js";
|
|
31
|
+
export { summarizeSession } from "./tools/summarize.js";
|
|
32
|
+
export type { SummarizeResult } from "./tools/summarize.js";
|
|
33
|
+
export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage, } from "./util/hash.js";
|
|
34
|
+
export { loadChainState, saveChainState } from "./chain-state.js";
|
|
35
|
+
export type { ChainState, ChainStateSubmission } from "./chain-state.js";
|
|
36
|
+
export { default as register } from "./register.js";
|
|
37
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EACL,QAAQ,EACR,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGzE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,30 +6,30 @@
|
|
|
6
6
|
* hash chain integrity and signed submissions.
|
|
7
7
|
*/
|
|
8
8
|
// Adapter
|
|
9
|
-
export { OpenClawAdapter } from
|
|
9
|
+
export { OpenClawAdapter } from "./OpenClawAdapter.js";
|
|
10
10
|
// Mappers
|
|
11
|
-
export { MapperRegistry } from
|
|
12
|
-
export { ShellMapper } from
|
|
13
|
-
export { FsMapper } from
|
|
14
|
-
export { GitMapper } from
|
|
15
|
-
export { FallbackMapper } from
|
|
11
|
+
export { MapperRegistry } from "./mappers/MapperRegistry.js";
|
|
12
|
+
export { ShellMapper } from "./mappers/shell.js";
|
|
13
|
+
export { FsMapper } from "./mappers/fs.js";
|
|
14
|
+
export { GitMapper } from "./mappers/git.js";
|
|
15
|
+
export { FallbackMapper } from "./mappers/fallback.js";
|
|
16
16
|
// Detectors
|
|
17
|
-
export { TestDetector } from
|
|
18
|
-
export { BuildDetector } from
|
|
19
|
-
export { HttpDetector } from
|
|
17
|
+
export { TestDetector } from "./detectors/TestDetector.js";
|
|
18
|
+
export { BuildDetector } from "./detectors/BuildDetector.js";
|
|
19
|
+
export { HttpDetector } from "./detectors/HttpDetector.js";
|
|
20
20
|
// Hooks
|
|
21
|
-
export { createLifecycleHandlers } from
|
|
22
|
-
export { createToolCallHandlers } from
|
|
23
|
-
export { createLlmOutputHandlers } from
|
|
21
|
+
export { createLifecycleHandlers } from "./hooks/lifecycle.js";
|
|
22
|
+
export { createToolCallHandlers } from "./hooks/toolCall.js";
|
|
23
|
+
export { createLlmOutputHandlers } from "./hooks/llmOutput.js";
|
|
24
24
|
// Rules
|
|
25
|
-
export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool, CanCallApis, CanHandleHttpErrors, CanCreateContent, CanEngageCommunity, CanRespondToNotifications, CanMakeDecisions, IsConsistentlyActive, } from
|
|
25
|
+
export { openclawRules, CanFixBuild, CanFixTests, CanRunTests, CanRecoverFromError, CanWriteCode, CanUseFramework, CanUseTool, CanCallApis, CanHandleHttpErrors, CanCreateContent, CanEngageCommunity, CanRespondToNotifications, CanMakeDecisions, IsConsistentlyActive, } from "./rules/openclaw-rules.js";
|
|
26
26
|
// Tools
|
|
27
|
-
export { getStatus } from
|
|
28
|
-
export { summarizeSession } from
|
|
27
|
+
export { getStatus } from "./tools/status.js";
|
|
28
|
+
export { summarizeSession } from "./tools/summarize.js";
|
|
29
29
|
// Utilities
|
|
30
|
-
export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage } from
|
|
30
|
+
export { hashArgs, hashCommand, hashFileContent, extractBaseCommand, mimeFromExtension, extensionToLanguage, } from "./util/hash.js";
|
|
31
31
|
// Chain State
|
|
32
|
-
export { loadChainState, saveChainState } from
|
|
32
|
+
export { loadChainState, saveChainState } from "./chain-state.js";
|
|
33
33
|
// OpenClaw Plugin Entry Point
|
|
34
|
-
export { default as register } from
|
|
34
|
+
export { default as register } from "./register.js";
|
|
35
35
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,QAAQ;AACR,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,UAAU;AACV,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,UAAU;AACV,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,QAAQ;AACR,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAK/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,QAAQ;AACR,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,UAAU,EACV,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,QAAQ;AACR,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,YAAY;AACZ,OAAO,EACL,QAAQ,EACR,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlE,8BAA8B;AAC9B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -21,6 +21,10 @@ export declare class MapperRegistry {
|
|
|
21
21
|
register(mapper: EventMapper): void;
|
|
22
22
|
/** Find the mapper for a tool name */
|
|
23
23
|
getMapper(toolName: string): EventMapper;
|
|
24
|
+
/** Check if a tool name has a dedicated mapper (not fallback) */
|
|
25
|
+
hasMapper(toolName: string): boolean;
|
|
26
|
+
/** Get all registered tool names (excluding fallback) */
|
|
27
|
+
registeredToolNames(): string[];
|
|
24
28
|
/** Map a tool call start */
|
|
25
29
|
mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
|
|
26
30
|
/** Map a tool call end */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapperRegistry.d.ts","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;IACzE,wDAAwD;IACxD,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAAc;gBAElB,QAAQ,EAAE,WAAW;IAIjC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMnC,sCAAsC;IACtC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIxC,4BAA4B;IAC5B,QAAQ,
|
|
1
|
+
{"version":3,"file":"MapperRegistry.d.ts","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,8CAA8C;IAC9C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC;IACzE,wDAAwD;IACxD,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAAC;CAChB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,QAAQ,CAAc;gBAElB,QAAQ,EAAE,WAAW;IAIjC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMnC,sCAAsC;IACtC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAIxC,iEAAiE;IACjE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpC,yDAAyD;IACzD,mBAAmB,IAAI,MAAM,EAAE;IAI/B,4BAA4B;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAIxE,0BAA0B;IAC1B,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW;CAGf"}
|
|
@@ -17,6 +17,14 @@ export class MapperRegistry {
|
|
|
17
17
|
getMapper(toolName) {
|
|
18
18
|
return this.mappers.get(toolName) ?? this.fallback;
|
|
19
19
|
}
|
|
20
|
+
/** Check if a tool name has a dedicated mapper (not fallback) */
|
|
21
|
+
hasMapper(toolName) {
|
|
22
|
+
return this.mappers.has(toolName);
|
|
23
|
+
}
|
|
24
|
+
/** Get all registered tool names (excluding fallback) */
|
|
25
|
+
registeredToolNames() {
|
|
26
|
+
return [...this.mappers.keys()];
|
|
27
|
+
}
|
|
20
28
|
/** Map a tool call start */
|
|
21
29
|
mapStart(toolName, params) {
|
|
22
30
|
return this.getMapper(toolName).mapStart(toolName, params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapperRegistry.js","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,MAAM,OAAO,cAAc;IACjB,OAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC9C,QAAQ,CAAc;IAE9B,YAAY,QAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oDAAoD;IACpD,QAAQ,CAAC,MAAmB;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED,4BAA4B;IAC5B,QAAQ,
|
|
1
|
+
{"version":3,"file":"MapperRegistry.js","sourceRoot":"","sources":["../../src/mappers/MapperRegistry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,MAAM,OAAO,cAAc;IACjB,OAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC9C,QAAQ,CAAc;IAE9B,YAAY,QAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oDAAoD;IACpD,QAAQ,CAAC,MAAmB;QAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED,iEAAiE;IACjE,SAAS,CAAC,QAAgB;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,yDAAyD;IACzD,mBAAmB;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,4BAA4B;IAC5B,QAAQ,CAAC,QAAgB,EAAE,MAA+B;QACxD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,0BAA0B;IAC1B,MAAM,CACJ,QAAgB,EAChB,MAA+B,EAC/B,MAAsC,EACtC,KAAa;QAEb,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser mapper — maps browser tool calls to BROWSER_ACTION events.
|
|
3
|
+
* Captures action type, URL visited, and screenshot flag without raw content.
|
|
4
|
+
*/
|
|
5
|
+
import type { EventMapper, MappedEvent } from "./MapperRegistry.js";
|
|
6
|
+
export declare class BrowserMapper implements EventMapper {
|
|
7
|
+
toolNames: string[];
|
|
8
|
+
mapStart(_toolName: string, params: Record<string, unknown>): MappedEvent;
|
|
9
|
+
mapEnd(_toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, _error?: Error): MappedEvent;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/mappers/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAoCpE,qBAAa,aAAc,YAAW,WAAW;IAC/C,SAAS,WAAe;IAExB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAezE,MAAM,CACJ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;CAgBf"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { sha256 } from "../util/hash.js";
|
|
2
|
+
/** Safely coerce unknown values to string */
|
|
3
|
+
function str(val) {
|
|
4
|
+
if (typeof val === "string")
|
|
5
|
+
return val;
|
|
6
|
+
if (Array.isArray(val))
|
|
7
|
+
return val.join(" ");
|
|
8
|
+
return val == null ? "" : String(val);
|
|
9
|
+
}
|
|
10
|
+
/** Navigation actions that involve a URL */
|
|
11
|
+
const NAV_ACTIONS = new Set(["navigate", "open"]);
|
|
12
|
+
/** Screenshot-related actions */
|
|
13
|
+
const SCREENSHOT_ACTIONS = new Set(["screenshot", "snapshot", "pdf"]);
|
|
14
|
+
/** Classify the browser action into a high-level category */
|
|
15
|
+
function classifyAction(action) {
|
|
16
|
+
if (NAV_ACTIONS.has(action))
|
|
17
|
+
return "navigate";
|
|
18
|
+
if (SCREENSHOT_ACTIONS.has(action))
|
|
19
|
+
return "capture";
|
|
20
|
+
if (["click", "type", "press", "hover", "drag", "fill", "select", "upload"].includes(action))
|
|
21
|
+
return "interact";
|
|
22
|
+
if (["start", "stop", "close", "tabs", "tab", "focus"].includes(action))
|
|
23
|
+
return "session";
|
|
24
|
+
return action;
|
|
25
|
+
}
|
|
26
|
+
/** Extract hostname from a URL string */
|
|
27
|
+
function hostFromUrl(raw) {
|
|
28
|
+
try {
|
|
29
|
+
return new URL(raw).hostname;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class BrowserMapper {
|
|
36
|
+
toolNames = ["browser"];
|
|
37
|
+
mapStart(_toolName, params) {
|
|
38
|
+
const action = str(params.action || params.command || "");
|
|
39
|
+
const url = str(params.url || params.target || "");
|
|
40
|
+
return {
|
|
41
|
+
type: "BROWSER_ACTION",
|
|
42
|
+
data: {
|
|
43
|
+
action: classifyAction(action),
|
|
44
|
+
action_detail: action,
|
|
45
|
+
url_hash: url ? sha256(url) : undefined,
|
|
46
|
+
host_display: url ? hostFromUrl(url) : undefined,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
mapEnd(_toolName, params, result, _error) {
|
|
51
|
+
const action = str(params.action || params.command || "");
|
|
52
|
+
const url = str(params.url || params.target || result?.url || "");
|
|
53
|
+
return {
|
|
54
|
+
type: "BROWSER_ACTION",
|
|
55
|
+
data: {
|
|
56
|
+
action: classifyAction(action),
|
|
57
|
+
action_detail: action,
|
|
58
|
+
url_hash: url ? sha256(url) : undefined,
|
|
59
|
+
host_display: url ? hostFromUrl(url) : undefined,
|
|
60
|
+
screenshot_taken: SCREENSHOT_ACTIONS.has(action),
|
|
61
|
+
profile: str(params.profile) || undefined,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/mappers/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EventMapper, MappedEvent } from "./MapperRegistry.js";
|
|
2
|
+
export declare class DocumentMapper implements EventMapper {
|
|
3
|
+
toolNames: string[];
|
|
4
|
+
mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
|
|
5
|
+
mapEnd(toolName: string, params: Record<string, unknown>, result: Record<string, unknown> | null, _error?: Error): MappedEvent;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=document.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/mappers/document.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUpE,qBAAa,cAAe,YAAW,WAAW;IAChD,SAAS,WAAoB;IAE7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAaxE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;CAsBf"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document mapper — maps pdf and image tool calls to DOCUMENT_ANALYSIS events.
|
|
3
|
+
* Captures document type and metadata without raw content.
|
|
4
|
+
*/
|
|
5
|
+
import { extname } from "node:path";
|
|
6
|
+
import { sha256 } from "../util/hash.js";
|
|
7
|
+
/** Safely coerce unknown values to string */
|
|
8
|
+
function str(val) {
|
|
9
|
+
if (typeof val === "string")
|
|
10
|
+
return val;
|
|
11
|
+
if (Array.isArray(val))
|
|
12
|
+
return val.join(" ");
|
|
13
|
+
return val == null ? "" : String(val);
|
|
14
|
+
}
|
|
15
|
+
export class DocumentMapper {
|
|
16
|
+
toolNames = ["pdf", "image"];
|
|
17
|
+
mapStart(toolName, params) {
|
|
18
|
+
const docType = toolName === "pdf" ? "pdf" : "image";
|
|
19
|
+
const source = str(params.path || params.file || params.image || params.url || "");
|
|
20
|
+
return {
|
|
21
|
+
type: "DOCUMENT_ANALYSIS",
|
|
22
|
+
data: {
|
|
23
|
+
doc_type: docType,
|
|
24
|
+
source_hash: source ? sha256(source) : undefined,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
mapEnd(toolName, params, result, _error) {
|
|
29
|
+
const docType = toolName === "pdf" ? "pdf" : "image";
|
|
30
|
+
const source = str(params.path || params.file || params.image || params.url || "");
|
|
31
|
+
const ext = source ? extname(source).toLowerCase() : "";
|
|
32
|
+
return {
|
|
33
|
+
type: "DOCUMENT_ANALYSIS",
|
|
34
|
+
data: {
|
|
35
|
+
doc_type: docType,
|
|
36
|
+
source_hash: source ? sha256(source) : undefined,
|
|
37
|
+
file_extension: ext || undefined,
|
|
38
|
+
page_count: docType === "pdf" && typeof result?.pageCount === "number"
|
|
39
|
+
? result.pageCount
|
|
40
|
+
: docType === "pdf" && typeof result?.pages === "number"
|
|
41
|
+
? result.pages
|
|
42
|
+
: undefined,
|
|
43
|
+
has_prompt: !!params.prompt,
|
|
44
|
+
model: str(params.model) || undefined,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/mappers/document.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,6CAA6C;AAC7C,SAAS,GAAG,CAAC,GAAY;IACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,cAAc;IACzB,SAAS,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE7B,QAAQ,CAAC,QAAgB,EAAE,MAA+B;QACxD,MAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAEnF,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE;gBACJ,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;aACjD;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,QAAgB,EAChB,MAA+B,EAC/B,MAAsC,EACtC,MAAc;QAEd,MAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAExD,OAAO;YACL,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE;gBACJ,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBAChD,cAAc,EAAE,GAAG,IAAI,SAAS;gBAChC,UAAU,EACR,OAAO,KAAK,KAAK,IAAI,OAAO,MAAM,EAAE,SAAS,KAAK,QAAQ;oBACxD,CAAC,CAAC,MAAM,CAAC,SAAS;oBAClB,CAAC,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,MAAM,EAAE,KAAK,KAAK,QAAQ;wBACtD,CAAC,CAAC,MAAM,CAAC,KAAK;wBACd,CAAC,CAAC,SAAS;gBACjB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;gBAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS;aACtC;SACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Fallback mapper — catches any tool not handled by a specific mapper.
|
|
3
3
|
* Produces generic TOOL_CALL events.
|
|
4
4
|
*/
|
|
5
|
-
import type { EventMapper, MappedEvent } from
|
|
5
|
+
import type { EventMapper, MappedEvent } from "./MapperRegistry.js";
|
|
6
6
|
export declare class FallbackMapper implements EventMapper {
|
|
7
7
|
toolNames: never[];
|
|
8
8
|
mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
|
package/dist/mappers/fallback.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { hashArgs, hashContent } from
|
|
1
|
+
import { hashArgs, hashContent } from "../util/hash.js";
|
|
2
2
|
export class FallbackMapper {
|
|
3
3
|
toolNames = []; // Never matched directly — used as the registry fallback
|
|
4
4
|
mapStart(toolName, params) {
|
|
5
5
|
return {
|
|
6
|
-
type:
|
|
6
|
+
type: "TOOL_CALL",
|
|
7
7
|
data: {
|
|
8
8
|
tool: toolName,
|
|
9
9
|
args_hash: hashArgs(params),
|
|
@@ -12,7 +12,7 @@ export class FallbackMapper {
|
|
|
12
12
|
}
|
|
13
13
|
mapEnd(toolName, params, result, error) {
|
|
14
14
|
return {
|
|
15
|
-
type:
|
|
15
|
+
type: "TOOL_CALL",
|
|
16
16
|
data: {
|
|
17
17
|
tool: toolName,
|
|
18
18
|
args_hash: hashArgs(params),
|
package/dist/mappers/fs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EventMapper, MappedEvent } from
|
|
1
|
+
import type { EventMapper, MappedEvent } from "./MapperRegistry.js";
|
|
2
2
|
export declare class FsMapper implements EventMapper {
|
|
3
3
|
toolNames: string[];
|
|
4
4
|
mapStart(toolName: string, params: Record<string, unknown>): MappedEvent;
|
package/dist/mappers/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/mappers/fs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUpE,qBAAa,QAAS,YAAW,WAAW;IAC1C,SAAS,WAA6B;IAEtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAexE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/mappers/fs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAUpE,qBAAa,QAAS,YAAW,WAAW;IAC1C,SAAS,WAA6B;IAEtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAexE,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACtC,MAAM,CAAC,EAAE,KAAK,GACb,WAAW;CAkCf"}
|