@susu-eng/gralkor 26.0.0
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/.env.example +32 -0
- package/README.md +429 -0
- package/config.yaml +16 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +89 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +118 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +24 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/install.d.ts +8 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +105 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +68 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/lib/config.d.ts +7 -0
- package/dist/cli/lib/config.d.ts.map +1 -0
- package/dist/cli/lib/config.js +38 -0
- package/dist/cli/lib/config.js.map +1 -0
- package/dist/cli/lib/openclaw.d.ts +21 -0
- package/dist/cli/lib/openclaw.d.ts.map +1 -0
- package/dist/cli/lib/openclaw.js +93 -0
- package/dist/cli/lib/openclaw.js.map +1 -0
- package/dist/cli/lib/output.d.ts +9 -0
- package/dist/cli/lib/output.d.ts.map +1 -0
- package/dist/cli/lib/output.js +36 -0
- package/dist/cli/lib/output.js.map +1 -0
- package/dist/cli/lib/version.d.ts +9 -0
- package/dist/cli/lib/version.d.ts.map +1 -0
- package/dist/cli/lib/version.js +51 -0
- package/dist/cli/lib/version.js.map +1 -0
- package/dist/client.d.ts +72 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +85 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +69 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +163 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks.d.ts +131 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +458 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +184 -0
- package/dist/index.js.map +1 -0
- package/dist/native-memory.d.ts +67 -0
- package/dist/native-memory.d.ts.map +1 -0
- package/dist/native-memory.js +79 -0
- package/dist/native-memory.js.map +1 -0
- package/dist/register.d.ts +10 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +150 -0
- package/dist/register.js.map +1 -0
- package/dist/server-manager.d.ts +19 -0
- package/dist/server-manager.d.ts.map +1 -0
- package/dist/server-manager.js +238 -0
- package/dist/server-manager.js.map +1 -0
- package/dist/tools.d.ts +32 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +56 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +48 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/docker-compose.yml +34 -0
- package/openclaw.plugin.json +99 -0
- package/package.json +65 -0
- package/server/Dockerfile +7 -0
- package/server/main.py +763 -0
- package/server/pyproject.toml +19 -0
- package/server/requirements.txt +5 -0
- package/server/uv.lock +1162 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/** Read CLI version from package.json (single source of truth). */
|
|
5
|
+
export function getCLIVersion() {
|
|
6
|
+
try {
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, "..", "..", "..", "package.json"), "utf-8"));
|
|
9
|
+
return pkg.version ?? "unknown";
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return "unknown";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Tarball naming patterns:
|
|
17
|
+
* susu-eng-gralkor-memory-{version}.tgz (make pack output)
|
|
18
|
+
* susu-eng-gralkor-{version}.tgz (pnpm pack output)
|
|
19
|
+
*/
|
|
20
|
+
const TARBALL_PATTERNS = [
|
|
21
|
+
/susu-eng-gralkor-memory-(\d+\.\d+\.\d+)\.tgz$/,
|
|
22
|
+
/susu-eng-gralkor-(\d+\.\d+\.\d+)\.tgz$/,
|
|
23
|
+
];
|
|
24
|
+
/** Extract semver from a tarball filename or path. Returns null if no match. */
|
|
25
|
+
export function extractVersionFromTarball(filenameOrPath) {
|
|
26
|
+
const basename = filenameOrPath.split("/").pop() ?? filenameOrPath;
|
|
27
|
+
for (const pattern of TARBALL_PATTERNS) {
|
|
28
|
+
const match = basename.match(pattern);
|
|
29
|
+
if (match)
|
|
30
|
+
return match[1];
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
/** Extract version from an npm package reference like `@susu-eng/gralkor@19.0.4`. */
|
|
35
|
+
export function extractVersionFromNpmRef(ref) {
|
|
36
|
+
const match = ref.match(/@(\d+\.\d+\.\d+)$/);
|
|
37
|
+
return match ? match[1] : null;
|
|
38
|
+
}
|
|
39
|
+
/** Compare two semver strings. Returns -1 (a < b), 0 (equal), or 1 (a > b). */
|
|
40
|
+
export function compareVersions(a, b) {
|
|
41
|
+
const pa = a.split(".").map(Number);
|
|
42
|
+
const pb = b.split(".").map(Number);
|
|
43
|
+
for (let i = 0; i < 3; i++) {
|
|
44
|
+
if (pa[i] < pb[i])
|
|
45
|
+
return -1;
|
|
46
|
+
if (pa[i] > pb[i])
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/cli/lib/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mEAAmE;AACnE,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACjG,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,gBAAgB,GAAG;IACvB,+CAA+C;IAC/C,wCAAwC;CACzC,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,cAAsB;IAC9D,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,cAAc,CAAC;IACnE,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export interface Episode {
|
|
2
|
+
uuid: string;
|
|
3
|
+
name: string;
|
|
4
|
+
content: string;
|
|
5
|
+
source_description: string;
|
|
6
|
+
group_id: string;
|
|
7
|
+
created_at: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Fact {
|
|
10
|
+
uuid: string;
|
|
11
|
+
name: string;
|
|
12
|
+
fact: string;
|
|
13
|
+
group_id: string;
|
|
14
|
+
valid_at: string | null;
|
|
15
|
+
invalid_at: string | null;
|
|
16
|
+
expired_at: string | null;
|
|
17
|
+
created_at: string;
|
|
18
|
+
}
|
|
19
|
+
/** A filtered content block for episode ingestion. */
|
|
20
|
+
export interface EpisodeBlock {
|
|
21
|
+
type: "text" | "thinking" | "tool_use" | "tool_result";
|
|
22
|
+
text: string;
|
|
23
|
+
}
|
|
24
|
+
/** A filtered message for episode ingestion. */
|
|
25
|
+
export interface EpisodeMessage {
|
|
26
|
+
role: "user" | "assistant";
|
|
27
|
+
content: EpisodeBlock[];
|
|
28
|
+
}
|
|
29
|
+
export interface AddEpisodeParams {
|
|
30
|
+
name: string;
|
|
31
|
+
episode_body: string;
|
|
32
|
+
source_description: string;
|
|
33
|
+
group_id: string;
|
|
34
|
+
source?: "message" | "text" | "json";
|
|
35
|
+
}
|
|
36
|
+
export interface IngestMessagesParams {
|
|
37
|
+
name: string;
|
|
38
|
+
source_description: string;
|
|
39
|
+
group_id: string;
|
|
40
|
+
messages: EpisodeMessage[];
|
|
41
|
+
}
|
|
42
|
+
export interface SearchResults {
|
|
43
|
+
facts: Fact[];
|
|
44
|
+
}
|
|
45
|
+
export interface HealthResponse {
|
|
46
|
+
status: string;
|
|
47
|
+
graph?: {
|
|
48
|
+
connected: boolean;
|
|
49
|
+
node_count?: number;
|
|
50
|
+
edge_count?: number;
|
|
51
|
+
error?: string;
|
|
52
|
+
};
|
|
53
|
+
data_dir?: string;
|
|
54
|
+
}
|
|
55
|
+
export interface GraphitiClientOptions {
|
|
56
|
+
baseUrl: string;
|
|
57
|
+
timeoutMs?: number;
|
|
58
|
+
maxRetries?: number;
|
|
59
|
+
}
|
|
60
|
+
export declare class GraphitiClient {
|
|
61
|
+
private baseUrl;
|
|
62
|
+
private timeoutMs;
|
|
63
|
+
private maxRetries;
|
|
64
|
+
constructor(options: GraphitiClientOptions);
|
|
65
|
+
private request;
|
|
66
|
+
health(): Promise<HealthResponse>;
|
|
67
|
+
addEpisode(params: AddEpisodeParams): Promise<Episode>;
|
|
68
|
+
ingestMessages(params: IngestMessagesParams): Promise<Episode>;
|
|
69
|
+
search(query: string, groupIds: string[], limit?: number): Promise<SearchResults>;
|
|
70
|
+
clearGraph(groupId: string): Promise<void>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gDAAgD;AAChD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,qBAAqB;YAM5B,OAAO;IAwDf,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;IAIjC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9D,MAAM,CACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,SAAK,GACT,OAAO,CAAC,aAAa,CAAC;IAQnB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjD"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export class GraphitiClient {
|
|
2
|
+
baseUrl;
|
|
3
|
+
timeoutMs;
|
|
4
|
+
maxRetries;
|
|
5
|
+
constructor(options) {
|
|
6
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
7
|
+
this.timeoutMs = options.timeoutMs ?? 30_000;
|
|
8
|
+
this.maxRetries = options.maxRetries ?? 2;
|
|
9
|
+
}
|
|
10
|
+
async request(method, path, body) {
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
13
|
+
const controller = new AbortController();
|
|
14
|
+
const timer = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
15
|
+
let clientError;
|
|
16
|
+
try {
|
|
17
|
+
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
18
|
+
method,
|
|
19
|
+
headers: body ? { "Content-Type": "application/json" } : undefined,
|
|
20
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
21
|
+
signal: controller.signal,
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
const text = await res.text().catch(() => "").then((t) => t.slice(0, 500));
|
|
25
|
+
const err = new Error(`Graphiti ${method} ${path} returned ${res.status}: ${text}`);
|
|
26
|
+
// Don't retry client errors (4xx) — only server errors are transient
|
|
27
|
+
if (res.status >= 400 && res.status < 500) {
|
|
28
|
+
clientError = err;
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
lastError = err;
|
|
32
|
+
if (attempt < this.maxRetries) {
|
|
33
|
+
await new Promise((r) => setTimeout(r, 500 * (attempt + 1)));
|
|
34
|
+
}
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
38
|
+
if (contentType.includes("application/json")) {
|
|
39
|
+
return (await res.json());
|
|
40
|
+
}
|
|
41
|
+
return (await res.text());
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (clientError)
|
|
45
|
+
throw clientError;
|
|
46
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
47
|
+
if (attempt < this.maxRetries) {
|
|
48
|
+
await new Promise((r) => setTimeout(r, 500 * (attempt + 1)));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
throw lastError;
|
|
56
|
+
}
|
|
57
|
+
async health() {
|
|
58
|
+
return this.request("GET", "/health");
|
|
59
|
+
}
|
|
60
|
+
async addEpisode(params) {
|
|
61
|
+
return this.request("POST", "/episodes", {
|
|
62
|
+
...params,
|
|
63
|
+
idempotency_key: crypto.randomUUID(),
|
|
64
|
+
reference_time: new Date().toISOString(),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async ingestMessages(params) {
|
|
68
|
+
return this.request("POST", "/ingest-messages", {
|
|
69
|
+
...params,
|
|
70
|
+
idempotency_key: crypto.randomUUID(),
|
|
71
|
+
reference_time: new Date().toISOString(),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
async search(query, groupIds, limit = 10) {
|
|
75
|
+
return this.request("POST", "/search", {
|
|
76
|
+
query,
|
|
77
|
+
group_ids: groupIds,
|
|
78
|
+
num_results: limit,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async clearGraph(groupId) {
|
|
82
|
+
await this.request("POST", "/clear", { group_id: groupId });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface ModelConfig {
|
|
2
|
+
provider: string;
|
|
3
|
+
model: string;
|
|
4
|
+
}
|
|
5
|
+
export type OntologyAttributeValue = string | string[] | {
|
|
6
|
+
type: "string" | "int" | "float" | "bool" | "datetime";
|
|
7
|
+
description: string;
|
|
8
|
+
} | {
|
|
9
|
+
enum: string[];
|
|
10
|
+
description: string;
|
|
11
|
+
};
|
|
12
|
+
export interface OntologyTypeDef {
|
|
13
|
+
description: string;
|
|
14
|
+
attributes?: Record<string, OntologyAttributeValue>;
|
|
15
|
+
}
|
|
16
|
+
export interface OntologyConfig {
|
|
17
|
+
entities?: Record<string, OntologyTypeDef>;
|
|
18
|
+
edges?: Record<string, OntologyTypeDef>;
|
|
19
|
+
edgeMap?: Record<string, string[]>;
|
|
20
|
+
excludedEntityTypes?: string[];
|
|
21
|
+
}
|
|
22
|
+
export declare function validateOntologyConfig(ontology?: OntologyConfig): void;
|
|
23
|
+
export declare const PROVIDER_ENV_KEYS: Record<string, string>;
|
|
24
|
+
export interface ConfigCheckResult {
|
|
25
|
+
ok: boolean;
|
|
26
|
+
checks: Array<{
|
|
27
|
+
label: string;
|
|
28
|
+
status: "pass" | "fail" | "warn";
|
|
29
|
+
message: string;
|
|
30
|
+
}>;
|
|
31
|
+
}
|
|
32
|
+
export declare function validateConfig(config: GralkorConfig): Promise<ConfigCheckResult>;
|
|
33
|
+
export declare const GRAPHITI_URL = "http://127.0.0.1:8001";
|
|
34
|
+
export declare const GRAPHITI_PORT = 8001;
|
|
35
|
+
export declare const DEFAULT_LLM_PROVIDER = "gemini";
|
|
36
|
+
export declare const DEFAULT_LLM_MODEL = "gemini-3.1-flash-lite-preview";
|
|
37
|
+
export declare const DEFAULT_EMBEDDER_PROVIDER = "gemini";
|
|
38
|
+
export declare const DEFAULT_EMBEDDER_MODEL = "gemini-embedding-2-preview";
|
|
39
|
+
export interface GralkorConfig {
|
|
40
|
+
autoCapture: {
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
};
|
|
43
|
+
autoRecall: {
|
|
44
|
+
enabled: boolean;
|
|
45
|
+
maxResults: number;
|
|
46
|
+
};
|
|
47
|
+
idleTimeoutMs: number;
|
|
48
|
+
llm?: ModelConfig;
|
|
49
|
+
embedder?: ModelConfig;
|
|
50
|
+
ontology?: OntologyConfig;
|
|
51
|
+
dataDir?: string;
|
|
52
|
+
test?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export declare const defaultConfig: GralkorConfig;
|
|
55
|
+
export declare function resolveConfig(raw?: Partial<GralkorConfig>): GralkorConfig;
|
|
56
|
+
export declare function resolveProviders(config: GralkorConfig): {
|
|
57
|
+
llmProvider: string;
|
|
58
|
+
llmModel: string;
|
|
59
|
+
embedderProvider: string;
|
|
60
|
+
embedderModel: string;
|
|
61
|
+
};
|
|
62
|
+
export interface ReadyGate {
|
|
63
|
+
isReady(): boolean;
|
|
64
|
+
resolve(): void;
|
|
65
|
+
}
|
|
66
|
+
export declare function createReadyGate(): ReadyGate;
|
|
67
|
+
/** Reset ready state. Only used in tests. */
|
|
68
|
+
export declare function resetReadyGate(): void;
|
|
69
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,MAAM,EAAE,GACR;IAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAaD,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,IAAI,CAoDtE;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKpD,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwCtF;AAED,eAAO,MAAM,YAAY,0BAA0B,CAAC;AACpD,eAAO,MAAM,aAAa,OAAO,CAAC;AAElC,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAClD,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAClC,UAAU,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,EAAE,aAI3B,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,aAAa,CAiB7E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa;;;;;EAOrD;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;CACjB;AAeD,wBAAgB,eAAe,IAAI,SAAS,CAK3C;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
const RESERVED_ENTITY_NAMES = new Set(["Entity", "Episodic", "Community", "Saga"]);
|
|
2
|
+
const PROTECTED_ENTITY_ATTRS = new Set([
|
|
3
|
+
"uuid", "name", "group_id", "labels", "created_at", "summary", "attributes", "name_embedding",
|
|
4
|
+
]);
|
|
5
|
+
const PROTECTED_EDGE_ATTRS = new Set([
|
|
6
|
+
"uuid", "group_id", "source_node_uuid", "target_node_uuid", "created_at",
|
|
7
|
+
"name", "fact", "fact_embedding", "episodes", "expired_at", "valid_at", "invalid_at", "attributes",
|
|
8
|
+
]);
|
|
9
|
+
export function validateOntologyConfig(ontology) {
|
|
10
|
+
if (!ontology)
|
|
11
|
+
return;
|
|
12
|
+
const entityNames = new Set(Object.keys(ontology.entities ?? {}));
|
|
13
|
+
const edgeNames = new Set(Object.keys(ontology.edges ?? {}));
|
|
14
|
+
for (const name of entityNames) {
|
|
15
|
+
if (RESERVED_ENTITY_NAMES.has(name)) {
|
|
16
|
+
throw new Error(`Reserved entity name: '${name}' is used internally by Graphiti`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
for (const [name, def] of Object.entries(ontology.entities ?? {})) {
|
|
20
|
+
for (const attr of Object.keys(def.attributes ?? {})) {
|
|
21
|
+
if (PROTECTED_ENTITY_ATTRS.has(attr)) {
|
|
22
|
+
throw new Error(`Protected attribute '${attr}' on entity '${name}'`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
for (const [name, def] of Object.entries(ontology.edges ?? {})) {
|
|
27
|
+
for (const attr of Object.keys(def.attributes ?? {})) {
|
|
28
|
+
if (PROTECTED_EDGE_ATTRS.has(attr)) {
|
|
29
|
+
throw new Error(`Protected attribute '${attr}' on edge '${name}'`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (const [key, edgeTypes] of Object.entries(ontology.edgeMap ?? {})) {
|
|
34
|
+
const parts = key.split(",");
|
|
35
|
+
if (parts.length !== 2) {
|
|
36
|
+
throw new Error(`Invalid edgeMap key '${key}': expected 'EntityA,EntityB'`);
|
|
37
|
+
}
|
|
38
|
+
for (const part of parts) {
|
|
39
|
+
if (!entityNames.has(part)) {
|
|
40
|
+
throw new Error(`edgeMap references undeclared entity '${part}'`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (const edge of edgeTypes) {
|
|
44
|
+
if (!edgeNames.has(edge)) {
|
|
45
|
+
throw new Error(`edgeMap references undeclared edge '${edge}'`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (ontology.excludedEntityTypes) {
|
|
50
|
+
for (const name of ontology.excludedEntityTypes) {
|
|
51
|
+
if (entityNames.has(name)) {
|
|
52
|
+
throw new Error(`excludedEntityTypes contains declared entity '${name}' — contradictory`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export const PROVIDER_ENV_KEYS = {
|
|
58
|
+
openai: "OPENAI_API_KEY",
|
|
59
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
60
|
+
gemini: "GOOGLE_API_KEY",
|
|
61
|
+
groq: "GROQ_API_KEY",
|
|
62
|
+
};
|
|
63
|
+
export async function validateConfig(config) {
|
|
64
|
+
const checks = [];
|
|
65
|
+
// LLM provider check
|
|
66
|
+
const llmProvider = config.llm?.provider ?? DEFAULT_LLM_PROVIDER;
|
|
67
|
+
const llmEnvKey = PROVIDER_ENV_KEYS[llmProvider];
|
|
68
|
+
if (!llmEnvKey) {
|
|
69
|
+
checks.push({ label: "LLM provider", status: "warn", message: `Unknown provider '${llmProvider}' — cannot verify API key` });
|
|
70
|
+
}
|
|
71
|
+
else if (process.env[llmEnvKey]) {
|
|
72
|
+
checks.push({ label: "LLM provider", status: "pass", message: `${llmProvider} (${llmEnvKey} set)` });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
checks.push({ label: "LLM provider", status: "fail", message: `${llmProvider} requires ${llmEnvKey}` });
|
|
76
|
+
}
|
|
77
|
+
// Embedder provider check
|
|
78
|
+
const embedderProvider = config.embedder?.provider ?? DEFAULT_EMBEDDER_PROVIDER;
|
|
79
|
+
const embedderEnvKey = PROVIDER_ENV_KEYS[embedderProvider];
|
|
80
|
+
if (!embedderEnvKey) {
|
|
81
|
+
checks.push({ label: "Embedder provider", status: "warn", message: `Unknown provider '${embedderProvider}' — cannot verify API key` });
|
|
82
|
+
}
|
|
83
|
+
else if (process.env[embedderEnvKey]) {
|
|
84
|
+
checks.push({ label: "Embedder provider", status: "pass", message: `${embedderProvider} (${embedderEnvKey} set)` });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
checks.push({ label: "Embedder provider", status: "fail", message: `${embedderProvider} requires ${embedderEnvKey}` });
|
|
88
|
+
}
|
|
89
|
+
// uv check
|
|
90
|
+
try {
|
|
91
|
+
const { execFile } = await import("node:child_process");
|
|
92
|
+
const { promisify } = await import("node:util");
|
|
93
|
+
const execFileAsync = promisify(execFile);
|
|
94
|
+
await execFileAsync("uv", ["--version"]);
|
|
95
|
+
checks.push({ label: "uv", status: "pass", message: "found on PATH" });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
checks.push({ label: "uv", status: "fail", message: "not found on PATH — install: curl -LsSf https://astral.sh/uv/install.sh | sh" });
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
ok: checks.every(c => c.status !== "fail"),
|
|
102
|
+
checks,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export const GRAPHITI_URL = "http://127.0.0.1:8001";
|
|
106
|
+
export const GRAPHITI_PORT = 8001;
|
|
107
|
+
export const DEFAULT_LLM_PROVIDER = "gemini";
|
|
108
|
+
export const DEFAULT_LLM_MODEL = "gemini-3.1-flash-lite-preview";
|
|
109
|
+
export const DEFAULT_EMBEDDER_PROVIDER = "gemini";
|
|
110
|
+
export const DEFAULT_EMBEDDER_MODEL = "gemini-embedding-2-preview";
|
|
111
|
+
export const defaultConfig = {
|
|
112
|
+
autoCapture: { enabled: true },
|
|
113
|
+
idleTimeoutMs: 5 * 60 * 1000,
|
|
114
|
+
autoRecall: { enabled: true, maxResults: 10 },
|
|
115
|
+
};
|
|
116
|
+
export function resolveConfig(raw = {}) {
|
|
117
|
+
return {
|
|
118
|
+
autoCapture: {
|
|
119
|
+
enabled: raw.autoCapture?.enabled ?? defaultConfig.autoCapture.enabled,
|
|
120
|
+
},
|
|
121
|
+
idleTimeoutMs: raw.idleTimeoutMs ?? defaultConfig.idleTimeoutMs,
|
|
122
|
+
autoRecall: {
|
|
123
|
+
enabled: raw.autoRecall?.enabled ?? defaultConfig.autoRecall.enabled,
|
|
124
|
+
maxResults: raw.autoRecall?.maxResults ?? defaultConfig.autoRecall.maxResults,
|
|
125
|
+
},
|
|
126
|
+
llm: raw.llm,
|
|
127
|
+
embedder: raw.embedder,
|
|
128
|
+
ontology: raw.ontology,
|
|
129
|
+
dataDir: raw.dataDir,
|
|
130
|
+
test: raw.test ?? false,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function resolveProviders(config) {
|
|
134
|
+
return {
|
|
135
|
+
llmProvider: config.llm?.provider ?? DEFAULT_LLM_PROVIDER,
|
|
136
|
+
llmModel: config.llm?.model ?? DEFAULT_LLM_MODEL,
|
|
137
|
+
embedderProvider: config.embedder?.provider ?? DEFAULT_EMBEDDER_PROVIDER,
|
|
138
|
+
embedderModel: config.embedder?.model ?? DEFAULT_EMBEDDER_MODEL,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Module-level ready gate — shared across all plugin instances within the
|
|
143
|
+
* same process. This is critical because OpenClaw reloads the plugin 4+
|
|
144
|
+
* times per event, each creating a new instance. If the gate were per-
|
|
145
|
+
* instance, only the instance whose service `start()` ran would have a
|
|
146
|
+
* resolved gate; hooks/tools from newer instances would see `false` and
|
|
147
|
+
* silently skip graph calls even though the server is running fine.
|
|
148
|
+
*
|
|
149
|
+
* By making it module-level, the first `start()` resolves it and all
|
|
150
|
+
* subsequent reloads inherit the resolved state.
|
|
151
|
+
*/
|
|
152
|
+
let moduleReady = false;
|
|
153
|
+
export function createReadyGate() {
|
|
154
|
+
return {
|
|
155
|
+
isReady: () => moduleReady,
|
|
156
|
+
resolve: () => { moduleReady = true; },
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/** Reset ready state. Only used in tests. */
|
|
160
|
+
export function resetReadyGate() {
|
|
161
|
+
moduleReady = false;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAuBA,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB;CAC9F,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,YAAY;IACxE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY;CACnG,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CAAC,QAAyB;IAC9D,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7D,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,kCAAkC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACrD,IAAI,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,gBAAgB,IAAI,GAAG,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YACrD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,cAAc,IAAI,GAAG,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,+BAA+B,CAAC,CAAC;QAC9E,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,GAAG,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAChD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,mBAAmB,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,MAAM,EAAE,gBAAgB;IACxB,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,gBAAgB;IACxB,IAAI,EAAE,cAAc;CACrB,CAAC;AAOF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAqB;IACxD,MAAM,MAAM,GAAgC,EAAE,CAAC;IAE/C,qBAAqB;IACrB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,oBAAoB,CAAC;IACjE,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,WAAW,2BAA2B,EAAE,CAAC,CAAC;IAC/H,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,KAAK,SAAS,OAAO,EAAE,CAAC,CAAC;IACvG,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,aAAa,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,0BAA0B;IAC1B,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,yBAAyB,CAAC;IAChF,MAAM,cAAc,GAAG,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC3D,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,gBAAgB,2BAA2B,EAAE,CAAC,CAAC;IACzI,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,KAAK,cAAc,OAAO,EAAE,CAAC,CAAC;IACtH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,aAAa,cAAc,EAAE,EAAE,CAAC,CAAC;IACzH,CAAC;IAED,WAAW;IACX,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,8EAA8E,EAAE,CAAC,CAAC;IACxI,CAAC;IAED,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;QAC1C,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AACjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAClD,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AAanE,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;IAC9B,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI;IAC5B,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;CAC9C,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAA8B,EAAE;IAC5D,OAAO;QACL,WAAW,EAAE;YACX,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO;SACvE;QACD,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,aAAa,CAAC,aAAa;QAC/D,UAAU,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,aAAa,CAAC,UAAU,CAAC,OAAO;YACpE,UAAU,EACR,GAAG,CAAC,UAAU,EAAE,UAAU,IAAI,aAAa,CAAC,UAAU,CAAC,UAAU;SACpE;QACD,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAqB;IACpD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,oBAAoB;QACzD,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,IAAI,iBAAiB;QAChD,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,yBAAyB;QACxE,aAAa,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI,sBAAsB;KAChE,CAAC;AACJ,CAAC;AAOD;;;;;;;;;;GAUG;AACH,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW;QAC1B,OAAO,EAAE,GAAG,EAAE,GAAG,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,cAAc;IAC5B,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { GraphitiClient, EpisodeMessage } from "./client.js";
|
|
2
|
+
import type { GralkorConfig } from "./config.js";
|
|
3
|
+
import { type ReadyGate } from "./config.js";
|
|
4
|
+
/**
|
|
5
|
+
* A content block inside a message entry.
|
|
6
|
+
*/
|
|
7
|
+
interface ContentBlock {
|
|
8
|
+
type: string;
|
|
9
|
+
text?: string;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A message entry in the OpenClaw messages array.
|
|
14
|
+
*/
|
|
15
|
+
interface MessageEntry {
|
|
16
|
+
role: string;
|
|
17
|
+
content: string | ContentBlock[];
|
|
18
|
+
}
|
|
19
|
+
/** before_prompt_build event — prompt and messages always present. */
|
|
20
|
+
export interface PromptBuildEvent {
|
|
21
|
+
prompt: string;
|
|
22
|
+
messages: MessageEntry[];
|
|
23
|
+
}
|
|
24
|
+
/** agent_end event — messages always present. */
|
|
25
|
+
export interface AgentEndEvent {
|
|
26
|
+
messages: MessageEntry[];
|
|
27
|
+
success?: boolean;
|
|
28
|
+
error?: unknown;
|
|
29
|
+
durationMs?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Hook agent context — the second argument passed to agent hook handlers.
|
|
33
|
+
* Contains per-agent identity and session info.
|
|
34
|
+
*/
|
|
35
|
+
export interface HookAgentContext {
|
|
36
|
+
agentId?: string;
|
|
37
|
+
sessionKey?: string;
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
workspaceDir?: string;
|
|
40
|
+
messageProvider?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Hook session context — passed to session hooks (session_start, session_end).
|
|
44
|
+
* Has required sessionId unlike HookAgentContext.
|
|
45
|
+
*/
|
|
46
|
+
export interface HookSessionContext {
|
|
47
|
+
agentId?: string;
|
|
48
|
+
sessionId: string;
|
|
49
|
+
sessionKey?: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract the user's actual message from event.prompt.
|
|
53
|
+
*
|
|
54
|
+
* The prompt may be wrapped in metadata:
|
|
55
|
+
* "Sender (untrusted metadata):\n```json\n{...}\n```\n\nActual message"
|
|
56
|
+
*
|
|
57
|
+
* System prompts (e.g. "A new session was started via /new") are not user messages.
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractUserMessageFromPrompt(event: PromptBuildEvent): string;
|
|
60
|
+
/**
|
|
61
|
+
* Extract the last user message text from the messages array.
|
|
62
|
+
* Used as fallback when the prompt contains only metadata wrapper.
|
|
63
|
+
*/
|
|
64
|
+
export declare function extractLastUserMessageFromMessages(messages: MessageEntry[]): string;
|
|
65
|
+
/**
|
|
66
|
+
* Extract and filter messages for episode ingestion.
|
|
67
|
+
*
|
|
68
|
+
* Filters the raw OpenClaw message array down to user and assistant messages
|
|
69
|
+
* with only text/output_text/thinking blocks. Cleans user messages of system
|
|
70
|
+
* noise (session-start instructions, metadata wrappers, gralkor-memory XML).
|
|
71
|
+
* Serializes toolCall/toolUse/functionCall blocks as tool_use blocks.
|
|
72
|
+
* Converts toolResult messages to assistant messages with truncated tool_result blocks.
|
|
73
|
+
*
|
|
74
|
+
* The server handles transcript formatting and thinking distillation.
|
|
75
|
+
*/
|
|
76
|
+
export declare function extractMessagesFromCtx(event: AgentEndEvent): EpisodeMessage[];
|
|
77
|
+
/**
|
|
78
|
+
* Count actual results in a native search response.
|
|
79
|
+
* Native memory_search returns JSON with metadata even when results are empty:
|
|
80
|
+
* { "results": [], "provider": "...", ... }
|
|
81
|
+
* For non-JSON strings, returns 1 if non-empty (opaque content).
|
|
82
|
+
*/
|
|
83
|
+
export declare function countNativeResults(nativeResult: string | null): number;
|
|
84
|
+
export type NativeSearchFn = (query: string) => Promise<string>;
|
|
85
|
+
export interface RecallOpts {
|
|
86
|
+
setGroupId?: (id: string) => void;
|
|
87
|
+
getNativeSearch?: () => NativeSearchFn | null;
|
|
88
|
+
serverReady?: ReadyGate;
|
|
89
|
+
}
|
|
90
|
+
export declare function createBeforePromptBuildHandler(client: GraphitiClient, config: GralkorConfig, opts?: RecallOpts): (event: PromptBuildEvent, ctx?: HookAgentContext) => Promise<{
|
|
91
|
+
prependContext?: string;
|
|
92
|
+
} | void>;
|
|
93
|
+
/**
|
|
94
|
+
* Session buffer entry — holds the latest message snapshot for a session,
|
|
95
|
+
* flushed as a single episode on session boundary events.
|
|
96
|
+
*/
|
|
97
|
+
export interface SessionBuffer {
|
|
98
|
+
messages: MessageEntry[];
|
|
99
|
+
agentId?: string;
|
|
100
|
+
sessionKey?: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Keyed debouncer: stores a value per key and flushes it after idle timeout.
|
|
104
|
+
* Each `set()` resets the timer. `flush()` forces immediate delivery.
|
|
105
|
+
* At most one flush per key — whichever fires first (idle or explicit) wins.
|
|
106
|
+
*/
|
|
107
|
+
export declare class DebouncedFlush<T> {
|
|
108
|
+
private delayMs;
|
|
109
|
+
private onFlush;
|
|
110
|
+
private entries;
|
|
111
|
+
private timers;
|
|
112
|
+
constructor(delayMs: number, onFlush: (key: string, value: T) => Promise<void>);
|
|
113
|
+
set(key: string, value: T): void;
|
|
114
|
+
flush(key: string): Promise<void>;
|
|
115
|
+
flushAll(): Promise<void>;
|
|
116
|
+
has(key: string): boolean;
|
|
117
|
+
get pendingCount(): number;
|
|
118
|
+
get timerCount(): number;
|
|
119
|
+
dispose(): void;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Flush a session buffer → episode. Retries up to 3 times with exponential backoff.
|
|
123
|
+
*/
|
|
124
|
+
export declare function flushSessionBuffer(key: string, buffer: SessionBuffer, client: GraphitiClient, { retryDelayMs, test }?: {
|
|
125
|
+
retryDelayMs?: number;
|
|
126
|
+
test?: boolean;
|
|
127
|
+
}): Promise<void>;
|
|
128
|
+
export declare function createAgentEndHandler(config: GralkorConfig, debouncer: DebouncedFlush<SessionBuffer>): (event: AgentEndEvent, ctx?: HookAgentContext) => Promise<void>;
|
|
129
|
+
export declare function createSessionEndHandler(debouncer: DebouncedFlush<SessionBuffer>): (_event: unknown, ctx: HookSessionContext) => Promise<void>;
|
|
130
|
+
export {};
|
|
131
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|