@alexandrgreen/anchorclaw 0.0.3
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/LICENSE +21 -0
- package/NOTICE +9 -0
- package/README.md +252 -0
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +3 -0
- package/dist/api.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +309 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +100 -0
- package/dist/config.test.js.map +1 -0
- package/dist/identity-policy.d.ts +3 -0
- package/dist/identity-policy.d.ts.map +1 -0
- package/dist/identity-policy.js +7 -0
- package/dist/identity-policy.js.map +1 -0
- package/dist/identity-policy.test.d.ts +2 -0
- package/dist/identity-policy.test.d.ts.map +1 -0
- package/dist/identity-policy.test.js +23 -0
- package/dist/identity-policy.test.js.map +1 -0
- package/dist/identity.d.ts +22 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +113 -0
- package/dist/identity.js.map +1 -0
- package/dist/identity.test.d.ts +2 -0
- package/dist/identity.test.d.ts.map +1 -0
- package/dist/identity.test.js +22 -0
- package/dist/identity.test.js.map +1 -0
- package/dist/importer.d.ts +12 -0
- package/dist/importer.d.ts.map +1 -0
- package/dist/importer.js +297 -0
- package/dist/importer.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +770 -0
- package/dist/index.test.js.map +1 -0
- package/dist/memory/forget.d.ts +22 -0
- package/dist/memory/forget.d.ts.map +1 -0
- package/dist/memory/forget.js +84 -0
- package/dist/memory/forget.js.map +1 -0
- package/dist/memory/get.d.ts +36 -0
- package/dist/memory/get.d.ts.map +1 -0
- package/dist/memory/get.js +282 -0
- package/dist/memory/get.js.map +1 -0
- package/dist/memory/get.test.d.ts +2 -0
- package/dist/memory/get.test.d.ts.map +1 -0
- package/dist/memory/get.test.js +180 -0
- package/dist/memory/get.test.js.map +1 -0
- package/dist/memory/limits.d.ts +10 -0
- package/dist/memory/limits.d.ts.map +1 -0
- package/dist/memory/limits.js +18 -0
- package/dist/memory/limits.js.map +1 -0
- package/dist/memory/manager.d.ts +93 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +344 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/manager.test.d.ts +2 -0
- package/dist/memory/manager.test.d.ts.map +1 -0
- package/dist/memory/manager.test.js +201 -0
- package/dist/memory/manager.test.js.map +1 -0
- package/dist/memory/paths.d.ts +12 -0
- package/dist/memory/paths.d.ts.map +1 -0
- package/dist/memory/paths.js +31 -0
- package/dist/memory/paths.js.map +1 -0
- package/dist/memory/paths.test.d.ts +2 -0
- package/dist/memory/paths.test.d.ts.map +1 -0
- package/dist/memory/paths.test.js +35 -0
- package/dist/memory/paths.test.js.map +1 -0
- package/dist/memory/prompt.d.ts +37 -0
- package/dist/memory/prompt.d.ts.map +1 -0
- package/dist/memory/prompt.js +152 -0
- package/dist/memory/prompt.js.map +1 -0
- package/dist/memory/prompt.test.d.ts +2 -0
- package/dist/memory/prompt.test.d.ts.map +1 -0
- package/dist/memory/prompt.test.js +47 -0
- package/dist/memory/prompt.test.js.map +1 -0
- package/dist/memory/read-file-shared.d.ts +17 -0
- package/dist/memory/read-file-shared.d.ts.map +1 -0
- package/dist/memory/read-file-shared.js +53 -0
- package/dist/memory/read-file-shared.js.map +1 -0
- package/dist/memory/read-file-shared.test.d.ts +2 -0
- package/dist/memory/read-file-shared.test.d.ts.map +1 -0
- package/dist/memory/read-file-shared.test.js +82 -0
- package/dist/memory/read-file-shared.test.js.map +1 -0
- package/dist/memory/recall.d.ts +22 -0
- package/dist/memory/recall.d.ts.map +1 -0
- package/dist/memory/recall.js +58 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/memory/search.d.ts +30 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +110 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/search.test.d.ts +2 -0
- package/dist/memory/search.test.d.ts.map +1 -0
- package/dist/memory/search.test.js +103 -0
- package/dist/memory/search.test.js.map +1 -0
- package/dist/memory/sessions-index-sync.d.ts +28 -0
- package/dist/memory/sessions-index-sync.d.ts.map +1 -0
- package/dist/memory/sessions-index-sync.js +253 -0
- package/dist/memory/sessions-index-sync.js.map +1 -0
- package/dist/memory/sessions-index-sync.test.d.ts +2 -0
- package/dist/memory/sessions-index-sync.test.d.ts.map +1 -0
- package/dist/memory/sessions-index-sync.test.js +280 -0
- package/dist/memory/sessions-index-sync.test.js.map +1 -0
- package/dist/memory/sessions-index.d.ts +30 -0
- package/dist/memory/sessions-index.d.ts.map +1 -0
- package/dist/memory/sessions-index.js +238 -0
- package/dist/memory/sessions-index.js.map +1 -0
- package/dist/memory/sessions-index.test.d.ts +2 -0
- package/dist/memory/sessions-index.test.d.ts.map +1 -0
- package/dist/memory/sessions-index.test.js +266 -0
- package/dist/memory/sessions-index.test.js.map +1 -0
- package/dist/memory/sessions-visibility.d.ts +18 -0
- package/dist/memory/sessions-visibility.d.ts.map +1 -0
- package/dist/memory/sessions-visibility.js +110 -0
- package/dist/memory/sessions-visibility.js.map +1 -0
- package/dist/memory/sessions-visibility.test.d.ts +2 -0
- package/dist/memory/sessions-visibility.test.d.ts.map +1 -0
- package/dist/memory/sessions-visibility.test.js +137 -0
- package/dist/memory/sessions-visibility.test.js.map +1 -0
- package/dist/memory/sessions.d.ts +26 -0
- package/dist/memory/sessions.d.ts.map +1 -0
- package/dist/memory/sessions.js +250 -0
- package/dist/memory/sessions.js.map +1 -0
- package/dist/memory/sessions.test.d.ts +2 -0
- package/dist/memory/sessions.test.d.ts.map +1 -0
- package/dist/memory/sessions.test.js +257 -0
- package/dist/memory/sessions.test.js.map +1 -0
- package/dist/memory/store.d.ts +25 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +176 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/migrations-fs.d.ts +5 -0
- package/dist/migrations-fs.d.ts.map +1 -0
- package/dist/migrations-fs.js +19 -0
- package/dist/migrations-fs.js.map +1 -0
- package/dist/migrations.d.ts +17 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +44 -0
- package/dist/migrations.js.map +1 -0
- package/dist/migrations.test.d.ts +2 -0
- package/dist/migrations.test.d.ts.map +1 -0
- package/dist/migrations.test.js +66 -0
- package/dist/migrations.test.js.map +1 -0
- package/dist/plugin/capability.d.ts +7 -0
- package/dist/plugin/capability.d.ts.map +1 -0
- package/dist/plugin/capability.js +92 -0
- package/dist/plugin/capability.js.map +1 -0
- package/dist/plugin/capability.test.d.ts +2 -0
- package/dist/plugin/capability.test.d.ts.map +1 -0
- package/dist/plugin/capability.test.js +75 -0
- package/dist/plugin/capability.test.js.map +1 -0
- package/dist/plugin/lifecycle.d.ts +6 -0
- package/dist/plugin/lifecycle.d.ts.map +1 -0
- package/dist/plugin/lifecycle.js +31 -0
- package/dist/plugin/lifecycle.js.map +1 -0
- package/dist/plugin/prompt-cache.d.ts +10 -0
- package/dist/plugin/prompt-cache.d.ts.map +1 -0
- package/dist/plugin/prompt-cache.js +58 -0
- package/dist/plugin/prompt-cache.js.map +1 -0
- package/dist/plugin/runtime-context.d.ts +27 -0
- package/dist/plugin/runtime-context.d.ts.map +1 -0
- package/dist/plugin/runtime-context.js +91 -0
- package/dist/plugin/runtime-context.js.map +1 -0
- package/dist/plugin/runtime-helpers.d.ts +3 -0
- package/dist/plugin/runtime-helpers.d.ts.map +1 -0
- package/dist/plugin/runtime-helpers.js +12 -0
- package/dist/plugin/runtime-helpers.js.map +1 -0
- package/dist/plugin/session-delta-helpers.d.ts +11 -0
- package/dist/plugin/session-delta-helpers.d.ts.map +1 -0
- package/dist/plugin/session-delta-helpers.js +62 -0
- package/dist/plugin/session-delta-helpers.js.map +1 -0
- package/dist/plugin/session-delta.d.ts +12 -0
- package/dist/plugin/session-delta.d.ts.map +1 -0
- package/dist/plugin/session-delta.js +307 -0
- package/dist/plugin/session-delta.js.map +1 -0
- package/dist/plugin/tools/common.d.ts +7 -0
- package/dist/plugin/tools/common.d.ts.map +1 -0
- package/dist/plugin/tools/common.js +2 -0
- package/dist/plugin/tools/common.js.map +1 -0
- package/dist/plugin/tools/index.d.ts +3 -0
- package/dist/plugin/tools/index.d.ts.map +1 -0
- package/dist/plugin/tools/index.js +16 -0
- package/dist/plugin/tools/index.js.map +1 -0
- package/dist/plugin/tools/memory-forget.d.ts +3 -0
- package/dist/plugin/tools/memory-forget.d.ts.map +1 -0
- package/dist/plugin/tools/memory-forget.js +80 -0
- package/dist/plugin/tools/memory-forget.js.map +1 -0
- package/dist/plugin/tools/memory-forget.test.d.ts +2 -0
- package/dist/plugin/tools/memory-forget.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-forget.test.js +58 -0
- package/dist/plugin/tools/memory-forget.test.js.map +1 -0
- package/dist/plugin/tools/memory-get.d.ts +3 -0
- package/dist/plugin/tools/memory-get.d.ts.map +1 -0
- package/dist/plugin/tools/memory-get.js +136 -0
- package/dist/plugin/tools/memory-get.js.map +1 -0
- package/dist/plugin/tools/memory-recall.d.ts +3 -0
- package/dist/plugin/tools/memory-recall.d.ts.map +1 -0
- package/dist/plugin/tools/memory-recall.js +176 -0
- package/dist/plugin/tools/memory-recall.js.map +1 -0
- package/dist/plugin/tools/memory-recall.test.d.ts +2 -0
- package/dist/plugin/tools/memory-recall.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-recall.test.js +169 -0
- package/dist/plugin/tools/memory-recall.test.js.map +1 -0
- package/dist/plugin/tools/memory-search.d.ts +3 -0
- package/dist/plugin/tools/memory-search.d.ts.map +1 -0
- package/dist/plugin/tools/memory-search.js +332 -0
- package/dist/plugin/tools/memory-search.js.map +1 -0
- package/dist/plugin/tools/memory-search.test.d.ts +2 -0
- package/dist/plugin/tools/memory-search.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-search.test.js +205 -0
- package/dist/plugin/tools/memory-search.test.js.map +1 -0
- package/dist/plugin/tools/memory-status.d.ts +3 -0
- package/dist/plugin/tools/memory-status.d.ts.map +1 -0
- package/dist/plugin/tools/memory-status.js +134 -0
- package/dist/plugin/tools/memory-status.js.map +1 -0
- package/dist/plugin/tools/memory-store.d.ts +3 -0
- package/dist/plugin/tools/memory-store.d.ts.map +1 -0
- package/dist/plugin/tools/memory-store.js +88 -0
- package/dist/plugin/tools/memory-store.js.map +1 -0
- package/dist/plugin/tools/memory-store.test.d.ts +2 -0
- package/dist/plugin/tools/memory-store.test.d.ts.map +1 -0
- package/dist/plugin/tools/memory-store.test.js +64 -0
- package/dist/plugin/tools/memory-store.test.js.map +1 -0
- package/dist/plugin/tools/memory-visible-output.d.ts +20 -0
- package/dist/plugin/tools/memory-visible-output.d.ts.map +1 -0
- package/dist/plugin/tools/memory-visible-output.js +61 -0
- package/dist/plugin/tools/memory-visible-output.js.map +1 -0
- package/dist/plugin/types.d.ts +61 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +2 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/postgres.d.ts +7 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +55 -0
- package/dist/postgres.js.map +1 -0
- package/migrations/0001_init.sql +228 -0
- package/migrations/0002_session_index.sql +71 -0
- package/openclaw.plugin.json +314 -0
- package/package.json +63 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { applyMigrations } from "./migrations.js";
|
|
3
|
+
describe("applyMigrations", () => {
|
|
4
|
+
it("runs each migration inside a dedicated client transaction", async () => {
|
|
5
|
+
const clientCalls = [];
|
|
6
|
+
const client = {
|
|
7
|
+
query: vi.fn(async (sql, args = []) => {
|
|
8
|
+
clientCalls.push({ sql, args });
|
|
9
|
+
return { rows: [] };
|
|
10
|
+
}),
|
|
11
|
+
release: vi.fn(),
|
|
12
|
+
};
|
|
13
|
+
const poolQuery = vi.fn(async (sql) => {
|
|
14
|
+
if (sql.includes("SELECT id, applied_at FROM schema_migrations")) {
|
|
15
|
+
return { rows: [] };
|
|
16
|
+
}
|
|
17
|
+
return { rows: [] };
|
|
18
|
+
});
|
|
19
|
+
const pool = {
|
|
20
|
+
query: poolQuery,
|
|
21
|
+
connect: vi.fn(async () => client),
|
|
22
|
+
};
|
|
23
|
+
const got = await applyMigrations({
|
|
24
|
+
pool,
|
|
25
|
+
migrations: [{ filename: "0001_init.sql", sql: "CREATE TABLE demo(id int);" }],
|
|
26
|
+
});
|
|
27
|
+
expect(got).toEqual({ applied: ["0001"] });
|
|
28
|
+
expect(pool.connect).toHaveBeenCalledTimes(1);
|
|
29
|
+
expect(clientCalls.map((call) => call.sql)).toEqual([
|
|
30
|
+
"BEGIN",
|
|
31
|
+
"CREATE TABLE demo(id int);",
|
|
32
|
+
"INSERT INTO schema_migrations (id) VALUES ($1)",
|
|
33
|
+
"COMMIT",
|
|
34
|
+
]);
|
|
35
|
+
expect(client.release).toHaveBeenCalledTimes(1);
|
|
36
|
+
});
|
|
37
|
+
it("rolls back and releases the client when a migration query fails", async () => {
|
|
38
|
+
const clientCalls = [];
|
|
39
|
+
const client = {
|
|
40
|
+
query: vi.fn(async (sql) => {
|
|
41
|
+
clientCalls.push(sql);
|
|
42
|
+
if (sql === "BROKEN SQL") {
|
|
43
|
+
throw new Error("boom");
|
|
44
|
+
}
|
|
45
|
+
return { rows: [] };
|
|
46
|
+
}),
|
|
47
|
+
release: vi.fn(),
|
|
48
|
+
};
|
|
49
|
+
const pool = {
|
|
50
|
+
query: vi.fn(async (sql) => {
|
|
51
|
+
if (sql.includes("SELECT id, applied_at FROM schema_migrations")) {
|
|
52
|
+
return { rows: [] };
|
|
53
|
+
}
|
|
54
|
+
return { rows: [] };
|
|
55
|
+
}),
|
|
56
|
+
connect: vi.fn(async () => client),
|
|
57
|
+
};
|
|
58
|
+
await expect(applyMigrations({
|
|
59
|
+
pool,
|
|
60
|
+
migrations: [{ filename: "0001_init.sql", sql: "BROKEN SQL" }],
|
|
61
|
+
})).rejects.toThrow("boom");
|
|
62
|
+
expect(clientCalls).toEqual(["BEGIN", "BROKEN SQL", "ROLLBACK"]);
|
|
63
|
+
expect(client.release).toHaveBeenCalledTimes(1);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=migrations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../src/migrations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PluginRuntimeContext } from "./runtime-context.js";
|
|
2
|
+
export declare function registerAnchorClawMemoryCapability(params: {
|
|
3
|
+
ctx: PluginRuntimeContext;
|
|
4
|
+
refreshPromptCache: () => void;
|
|
5
|
+
ensureSessionsIndexBootstrapped: () => Promise<void>;
|
|
6
|
+
}): void;
|
|
7
|
+
//# sourceMappingURL=capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../src/plugin/capability.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE;IACzD,GAAG,EAAE,oBAAoB,CAAC;IAC1B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,+BAA+B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,QA6FA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { registerMemoryCapability } from "../api.js";
|
|
2
|
+
import { createAnchorClawMemorySearchManager, } from "../memory/manager.js";
|
|
3
|
+
export function registerAnchorClawMemoryCapability(params) {
|
|
4
|
+
const { ctx, refreshPromptCache, ensureSessionsIndexBootstrapped } = params;
|
|
5
|
+
const api = ctx.api;
|
|
6
|
+
registerMemoryCapability("anchorclaw", {
|
|
7
|
+
promptBuilder: (params) => {
|
|
8
|
+
if (ctx.disabledReason) {
|
|
9
|
+
return [`AnchorClaw memory is disabled until configured (${ctx.disabledReason}).`];
|
|
10
|
+
}
|
|
11
|
+
if (!ctx.promptCache.lines && !ctx.promptCache.error) {
|
|
12
|
+
refreshPromptCache();
|
|
13
|
+
}
|
|
14
|
+
const cached = ctx.promptCache.lines ?? [];
|
|
15
|
+
const cacheNotice = ctx.promptCache.error
|
|
16
|
+
? [`[AnchorClaw durable memory cache unavailable: ${ctx.promptCache.error}]`, ""]
|
|
17
|
+
: cached.length === 0
|
|
18
|
+
? ["[AnchorClaw durable memory cache is warming up...]", ""]
|
|
19
|
+
: [];
|
|
20
|
+
const sdkNotice = ctx.sdkHealth.degraded
|
|
21
|
+
? [
|
|
22
|
+
`[AnchorClaw sessions SDK is degraded: ${ctx.sdkHealth.reason ?? "unknown error"}; operation=${ctx.sdkHealth.affectedOperation ?? "unknown"}]`,
|
|
23
|
+
"",
|
|
24
|
+
]
|
|
25
|
+
: [];
|
|
26
|
+
const hasMemorySearch = Boolean(params?.availableTools?.has?.("memory_search"));
|
|
27
|
+
const hasMemoryGet = Boolean(params?.availableTools?.has?.("memory_get"));
|
|
28
|
+
let toolGuidance = "";
|
|
29
|
+
if (hasMemorySearch && hasMemoryGet) {
|
|
30
|
+
toolGuidance =
|
|
31
|
+
"Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search; then use memory_get to pull only the needed lines. For one exact marker/id/key value questions, prioritize literal evidence from memory_search/memory_recall. If any memory_search or memory_recall result has details.meta.exactTop1=true, return details.meta.exactTop1Value verbatim immediately; do not substitute nearby/recent markers. Never use empty memory_recall as a tie-breaker for exact lookups. If no exactTop1 is found, say you checked and give the best candidate with uncertainty. For broad agreement/policy/decision questions, use memory_search/memory_recall to gather closest evidence; if no direct agreement record is found, report not found with a brief summary of closest evidence.";
|
|
32
|
+
}
|
|
33
|
+
else if (hasMemorySearch) {
|
|
34
|
+
toolGuidance =
|
|
35
|
+
"Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search and answer from matching results. For one exact marker/id/key value questions, prioritize literal evidence from memory_search/memory_recall. If any memory_search or memory_recall result has details.meta.exactTop1=true, return details.meta.exactTop1Value verbatim immediately; do not substitute nearby/recent markers. Never use empty memory_recall as a tie-breaker for exact lookups. If no exactTop1 is found, say you checked and give the best candidate with uncertainty. For broad agreement/policy/decision questions, use memory_search/memory_recall to gather closest evidence; if no direct agreement record is found, report not found with a brief summary of closest evidence.";
|
|
36
|
+
}
|
|
37
|
+
else if (hasMemoryGet) {
|
|
38
|
+
toolGuidance =
|
|
39
|
+
"Before answering anything about prior work, decisions, dates, people, preferences, or todos that already point to a specific memory item: run memory_get to pull only the needed lines. If low confidence after reading them, say you checked.";
|
|
40
|
+
}
|
|
41
|
+
const citationsMode = params?.citationsMode ?? "inline";
|
|
42
|
+
const citationsLine = citationsMode === "off"
|
|
43
|
+
? "Citations are disabled: do not mention file paths or line numbers in replies unless the user explicitly asks."
|
|
44
|
+
: "Citations: include Source: <path#line> when it helps the user verify memory snippets.";
|
|
45
|
+
return [
|
|
46
|
+
"AnchorClaw durable memory is enabled (Postgres-backed).",
|
|
47
|
+
"",
|
|
48
|
+
...(toolGuidance ? ["## Memory Recall", toolGuidance, citationsLine, ""] : []),
|
|
49
|
+
"MVP usage rules:",
|
|
50
|
+
"- Save durable memory with memory_store({ content, canonicalKey?, type? }).",
|
|
51
|
+
"- Use canonicalKey only for updateable facts/preferences/settings (so updates overwrite instead of duplicating).",
|
|
52
|
+
"- Find memory with memory_search({ query, corpus? }).",
|
|
53
|
+
"- Read items with memory_get({ lookup: \"db-memory/items/<uuid>.md\" | \"sessions/<agentId>/<file>\", fromLine?, lineCount? }).",
|
|
54
|
+
"- Shortcut recall: memory_recall({ query? }) (without query returns top important recent items).",
|
|
55
|
+
"- Forget items with memory_forget({ lookup }) or memory_forget({ id }).",
|
|
56
|
+
"",
|
|
57
|
+
"Notes:",
|
|
58
|
+
"- memory_search supports corpus=\"memory\" (Postgres durable), corpus=\"sessions\" (Postgres sessions index, DB-first), and corpus=\"all\" (merge). corpus=\"wiki\" is deferred; use wiki_search/wiki_get when installed.",
|
|
59
|
+
"",
|
|
60
|
+
...cacheNotice,
|
|
61
|
+
...sdkNotice,
|
|
62
|
+
...cached,
|
|
63
|
+
];
|
|
64
|
+
},
|
|
65
|
+
runtime: {
|
|
66
|
+
async getMemorySearchManager(params) {
|
|
67
|
+
if (ctx.disabledReason) {
|
|
68
|
+
return {
|
|
69
|
+
manager: null,
|
|
70
|
+
error: `anchorclaw: disabled until configured (${ctx.disabledReason})`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
ctx.getPool();
|
|
74
|
+
return {
|
|
75
|
+
manager: createAnchorClawMemorySearchManager({
|
|
76
|
+
api,
|
|
77
|
+
cfg: ctx.cfg,
|
|
78
|
+
ensureReady: ctx.ensureReady,
|
|
79
|
+
ensureSessionsIndexBootstrapped,
|
|
80
|
+
getPool: ctx.getPool,
|
|
81
|
+
agentId: params.agentId,
|
|
82
|
+
purpose: params.purpose,
|
|
83
|
+
}),
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
resolveMemoryBackendConfig(_params) {
|
|
87
|
+
return { backend: "builtin" };
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=capability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/plugin/capability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.test.d.ts","sourceRoot":"","sources":["../../src/plugin/capability.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
const { registerMemoryCapabilityMock, managerFactoryMock } = vi.hoisted(() => ({
|
|
3
|
+
registerMemoryCapabilityMock: vi.fn(),
|
|
4
|
+
managerFactoryMock: vi.fn(() => ({})),
|
|
5
|
+
}));
|
|
6
|
+
vi.mock("../api.js", () => ({
|
|
7
|
+
registerMemoryCapability: registerMemoryCapabilityMock,
|
|
8
|
+
}));
|
|
9
|
+
vi.mock("../memory/manager.js", () => ({
|
|
10
|
+
createAnchorClawMemorySearchManager: managerFactoryMock,
|
|
11
|
+
}));
|
|
12
|
+
import { registerAnchorClawMemoryCapability } from "./capability.js";
|
|
13
|
+
describe("registerAnchorClawMemoryCapability prompt guidance", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.clearAllMocks();
|
|
16
|
+
});
|
|
17
|
+
it("uses narrow one-exact-value guidance for marker/id/key questions", () => {
|
|
18
|
+
const ctx = {
|
|
19
|
+
api: {},
|
|
20
|
+
disabledReason: null,
|
|
21
|
+
promptCache: { lines: ["(cached memory block)"], error: null },
|
|
22
|
+
sdkHealth: { degraded: false },
|
|
23
|
+
cfg: {},
|
|
24
|
+
ensureReady: vi.fn(async () => undefined),
|
|
25
|
+
getPool: vi.fn(() => ({ query: vi.fn() })),
|
|
26
|
+
};
|
|
27
|
+
registerAnchorClawMemoryCapability({
|
|
28
|
+
ctx,
|
|
29
|
+
refreshPromptCache: vi.fn(),
|
|
30
|
+
ensureSessionsIndexBootstrapped: vi.fn(async () => undefined),
|
|
31
|
+
});
|
|
32
|
+
expect(registerMemoryCapabilityMock).toHaveBeenCalledTimes(1);
|
|
33
|
+
const capabilityDef = registerMemoryCapabilityMock.mock.calls[0]?.[1];
|
|
34
|
+
const lines = capabilityDef.promptBuilder({
|
|
35
|
+
availableTools: new Set(["memory_search", "memory_get"]),
|
|
36
|
+
citationsMode: "inline",
|
|
37
|
+
});
|
|
38
|
+
const text = lines.join("\n");
|
|
39
|
+
expect(text).toContain("For one exact marker/id/key value questions");
|
|
40
|
+
expect(text).toContain("prioritize literal evidence from memory_search/memory_recall");
|
|
41
|
+
expect(text).toContain("If any memory_search or memory_recall result has details.meta.exactTop1=true");
|
|
42
|
+
expect(text).toContain("Never use empty memory_recall as a tie-breaker for exact lookups.");
|
|
43
|
+
expect(text).toContain("If no exactTop1 is found, say you checked and give the best candidate with uncertainty.");
|
|
44
|
+
expect(text).not.toContain("For exact marker/id/key questions");
|
|
45
|
+
expect(text).not.toContain("make at most two memory_search/memory_recall attempts");
|
|
46
|
+
});
|
|
47
|
+
it("keeps broad-memory-search guidance for non-exact overview questions", () => {
|
|
48
|
+
const ctx = {
|
|
49
|
+
api: {},
|
|
50
|
+
disabledReason: null,
|
|
51
|
+
promptCache: { lines: ["(cached memory block)"], error: null },
|
|
52
|
+
sdkHealth: { degraded: false },
|
|
53
|
+
cfg: {},
|
|
54
|
+
ensureReady: vi.fn(async () => undefined),
|
|
55
|
+
getPool: vi.fn(() => ({ query: vi.fn() })),
|
|
56
|
+
};
|
|
57
|
+
registerAnchorClawMemoryCapability({
|
|
58
|
+
ctx,
|
|
59
|
+
refreshPromptCache: vi.fn(),
|
|
60
|
+
ensureSessionsIndexBootstrapped: vi.fn(async () => undefined),
|
|
61
|
+
});
|
|
62
|
+
const capabilityDef = registerMemoryCapabilityMock.mock.calls[0]?.[1];
|
|
63
|
+
const lines = capabilityDef.promptBuilder({
|
|
64
|
+
availableTools: new Set(["memory_search", "memory_get"]),
|
|
65
|
+
citationsMode: "inline",
|
|
66
|
+
});
|
|
67
|
+
const text = lines.join("\n");
|
|
68
|
+
expect(text).toContain("Before answering anything about prior work, decisions, dates, people, preferences, or todos: run memory_search; then use memory_get to pull only the needed lines.");
|
|
69
|
+
expect(text).toContain("If no exactTop1 is found, say you checked and give the best candidate with uncertainty.");
|
|
70
|
+
expect(text).toContain("For broad agreement/policy/decision questions, use memory_search/memory_recall to gather closest evidence");
|
|
71
|
+
expect(text).toContain("if no direct agreement record is found, report not found with a brief summary of closest evidence.");
|
|
72
|
+
expect(text).not.toContain("cap retrieval at two memory_search queries plus at most one memory_recall fallback");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=capability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability.test.js","sourceRoot":"","sources":["../../src/plugin/capability.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/plugin/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,GAAG,EAAE,iBAAiB,CAAC;IACvB,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACjC,QAiCA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function registerSessionDeltaLifecycle(params) {
|
|
2
|
+
const { api, cleanupSessionDelta } = params;
|
|
3
|
+
const registerRuntimeLifecycle = api?.lifecycle?.registerRuntimeLifecycle;
|
|
4
|
+
const registerRuntimeLifecycleCompat = typeof registerRuntimeLifecycle === "function"
|
|
5
|
+
? registerRuntimeLifecycle.bind(api.lifecycle)
|
|
6
|
+
: typeof api?.registerRuntimeLifecycle === "function"
|
|
7
|
+
? api.registerRuntimeLifecycle.bind(api)
|
|
8
|
+
: null;
|
|
9
|
+
if (typeof registerRuntimeLifecycle === "function") {
|
|
10
|
+
api.logger.info("anchorclaw: runtime lifecycle API detected (api.lifecycle.registerRuntimeLifecycle)");
|
|
11
|
+
}
|
|
12
|
+
else if (typeof api?.registerRuntimeLifecycle === "function") {
|
|
13
|
+
api.logger.warn("anchorclaw: using legacy runtime lifecycle API (api.registerRuntimeLifecycle); host SDK appears older than grouped lifecycle surface");
|
|
14
|
+
}
|
|
15
|
+
else if (!registerRuntimeLifecycleCompat) {
|
|
16
|
+
const logError = typeof api.logger?.error === "function"
|
|
17
|
+
? api.logger.error.bind(api.logger)
|
|
18
|
+
: api.logger.warn.bind(api.logger);
|
|
19
|
+
logError("anchorclaw: no runtime lifecycle registration API available; listener cleanup on reload/disable is unavailable");
|
|
20
|
+
}
|
|
21
|
+
if (registerRuntimeLifecycleCompat) {
|
|
22
|
+
registerRuntimeLifecycleCompat({
|
|
23
|
+
id: "anchorclaw-sessions-delta-listener",
|
|
24
|
+
description: "Cleans up transcript update listener and pending debounce timer.",
|
|
25
|
+
cleanup: async () => {
|
|
26
|
+
cleanupSessionDelta();
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/plugin/lifecycle.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,6BAA6B,CAAC,MAG7C;IACC,MAAM,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,wBAAwB,GAAI,GAAW,EAAE,SAAS,EAAE,wBAAwB,CAAC;IACnF,MAAM,8BAA8B,GAClC,OAAO,wBAAwB,KAAK,UAAU;QAC5C,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAE,GAAW,CAAC,SAAS,CAAC;QACvD,CAAC,CAAC,OAAQ,GAAW,EAAE,wBAAwB,KAAK,UAAU;YAC5D,CAAC,CAAE,GAAW,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC;IACb,IAAI,OAAO,wBAAwB,KAAK,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IACzG,CAAC;SAAM,IAAI,OAAQ,GAAW,EAAE,wBAAwB,KAAK,UAAU,EAAE,CAAC;QACxE,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,sIAAsI,CACvI,CAAC;IACJ,CAAC;SAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;QAC3C,MAAM,QAAQ,GACZ,OAAQ,GAAG,CAAC,MAAc,EAAE,KAAK,KAAK,UAAU;YAC9C,CAAC,CAAE,GAAG,CAAC,MAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAC5C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,QAAQ,CACN,gHAAgH,CACjH,CAAC;IACJ,CAAC;IACD,IAAI,8BAA8B,EAAE,CAAC;QACnC,8BAA8B,CAAC;YAC7B,EAAE,EAAE,oCAAoC;YACxC,WAAW,EAAE,kEAAkE;YAC/E,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,mBAAmB,EAAE,CAAC;YACxB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from "../api.js";
|
|
2
|
+
import type { PluginRuntimeContext } from "./runtime-context.js";
|
|
3
|
+
export type PromptCacheRuntime = {
|
|
4
|
+
refreshPromptCache: () => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function createPromptCacheRuntime(params: {
|
|
7
|
+
api: OpenClawPluginApi;
|
|
8
|
+
ctx: PluginRuntimeContext;
|
|
9
|
+
}): PromptCacheRuntime;
|
|
10
|
+
//# sourceMappingURL=prompt-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.d.ts","sourceRoot":"","sources":["../../src/plugin/prompt-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,oBAAoB,CAAC;CAC3B,GAAG,kBAAkB,CAsDrB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { resolveUserAndWorkspaceScope } from "../identity.js";
|
|
2
|
+
import { buildPromptMemorySection, queryPromptMemoryItems } from "../memory/prompt.js";
|
|
3
|
+
export function createPromptCacheRuntime(params) {
|
|
4
|
+
const { api, ctx } = params;
|
|
5
|
+
const refreshPromptCache = () => {
|
|
6
|
+
if (!ctx.cfg) {
|
|
7
|
+
ctx.promptCache.lines = null;
|
|
8
|
+
ctx.promptCache.error = ctx.disabledReason ?? "invalid config";
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (ctx.promptCache.refreshPromise) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
ctx.promptCache.refreshPromise = (async () => {
|
|
15
|
+
try {
|
|
16
|
+
await ctx.ensureReady();
|
|
17
|
+
const scope = await resolveUserAndWorkspaceScope({
|
|
18
|
+
api,
|
|
19
|
+
pool: ctx.getPool(),
|
|
20
|
+
agentId: api?.runtime?.agentId,
|
|
21
|
+
sessionKey: api?.runtime?.sessionKey,
|
|
22
|
+
configuredExternalId: ctx.cfg?.identity?.externalId,
|
|
23
|
+
});
|
|
24
|
+
const items = await queryPromptMemoryItems({
|
|
25
|
+
pool: ctx.getPool(),
|
|
26
|
+
userId: scope.userId,
|
|
27
|
+
workspaceId: scope.workspaceId,
|
|
28
|
+
limit: 50,
|
|
29
|
+
// MVP: durable injection focuses on facts and notes.
|
|
30
|
+
// TODO: extend prompt injection policy for other types:
|
|
31
|
+
// profile/config/skill/summary/automation (safe ordering + size budgets + canonicalKey conventions).
|
|
32
|
+
types: ["fact", "note"],
|
|
33
|
+
});
|
|
34
|
+
ctx.promptCache.lines = buildPromptMemorySection({
|
|
35
|
+
items,
|
|
36
|
+
maxTotalChars: 12_000,
|
|
37
|
+
maxTitleChars: 120,
|
|
38
|
+
policy: {
|
|
39
|
+
// MVP: durable injection focuses on facts and notes.
|
|
40
|
+
maxItemsByType: { fact: 6, note: 4 },
|
|
41
|
+
defaultMaxItemChars: 1_200,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
ctx.promptCache.error = null;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
ctx.promptCache.lines = null;
|
|
48
|
+
ctx.promptCache.error = error instanceof Error ? error.message : String(error);
|
|
49
|
+
api.logger.warn(`anchorclaw: prompt cache refresh failed (${ctx.promptCache.error})`);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
ctx.promptCache.refreshPromise = null;
|
|
53
|
+
}
|
|
54
|
+
})();
|
|
55
|
+
};
|
|
56
|
+
return { refreshPromptCache };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=prompt-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.js","sourceRoot":"","sources":["../../src/plugin/prompt-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAOvF,MAAM,UAAU,wBAAwB,CAAC,MAGxC;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;IAE5B,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;YAC7B,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG,CAAC,cAAc,IAAI,gBAAgB,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,CAAC,cAAc,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,GAAG,CAAC,WAAW,CAAC,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,4BAA4B,CAAC;oBAC/C,GAAG;oBACH,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE;oBACnB,OAAO,EAAG,GAAW,EAAE,OAAO,EAAE,OAAO;oBACvC,UAAU,EAAG,GAAW,EAAE,OAAO,EAAE,UAAU;oBAC7C,oBAAoB,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU;iBACpD,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC;oBACzC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE;oBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,KAAK,EAAE,EAAE;oBACT,qDAAqD;oBACrD,wDAAwD;oBACxD,qGAAqG;oBACrG,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;iBACxB,CAAC,CAAC;gBACH,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,wBAAwB,CAAC;oBAC/C,KAAK;oBACL,aAAa,EAAE,MAAM;oBACrB,aAAa,EAAE,GAAG;oBAClB,MAAM,EAAE;wBACN,qDAAqD;wBACrD,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;wBACpC,mBAAmB,EAAE,KAAK;qBAC3B;iBACF,CAAC,CAAC;gBACH,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;gBAC7B,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/E,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,GAAG,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;YACxF,CAAC;oBAAS,CAAC;gBACT,GAAG,CAAC,WAAW,CAAC,cAAc,GAAG,IAAI,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from "../api.js";
|
|
2
|
+
import type { AnchorClawConfig } from "../config.js";
|
|
3
|
+
import { type PostgresPool } from "../postgres.js";
|
|
4
|
+
import type { PromptCacheState, SdkHealthState, SessionDeltaRuntimeState, SessionsIndexState } from "./types.js";
|
|
5
|
+
export type PluginRuntimeContext = {
|
|
6
|
+
api: OpenClawPluginApi;
|
|
7
|
+
cfg: AnchorClawConfig | undefined;
|
|
8
|
+
disabledReason: string | undefined;
|
|
9
|
+
pool: PostgresPool | undefined;
|
|
10
|
+
migrationsApplied: Promise<void> | undefined;
|
|
11
|
+
promptCache: PromptCacheState;
|
|
12
|
+
sessionsIndex: SessionsIndexState;
|
|
13
|
+
sessionDelta: SessionDeltaRuntimeState;
|
|
14
|
+
sdkHealth: SdkHealthState;
|
|
15
|
+
resolveActor: () => string;
|
|
16
|
+
getPool: () => PostgresPool;
|
|
17
|
+
ensureReady: () => Promise<void>;
|
|
18
|
+
markSdkError: (operation: string, error: unknown) => void;
|
|
19
|
+
markSdkSuccess: () => void;
|
|
20
|
+
listVisibleAgentIds: () => Promise<string[]>;
|
|
21
|
+
};
|
|
22
|
+
export declare function createPluginRuntimeContext(params: {
|
|
23
|
+
api: OpenClawPluginApi;
|
|
24
|
+
cfg: AnchorClawConfig | undefined;
|
|
25
|
+
disabledReason: string | undefined;
|
|
26
|
+
}): PluginRuntimeContext;
|
|
27
|
+
//# sourceMappingURL=runtime-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/plugin/runtime-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,kBAAkB,CAAC;IAClC,YAAY,EAAE,wBAAwB,CAAC;IACvC,SAAS,EAAE,cAAc,CAAC;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,YAAY,CAAC;IAC5B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,mBAAmB,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,GAAG,EAAE,iBAAiB,CAAC;IACvB,GAAG,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAClC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,GAAG,oBAAoB,CA0FvB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { resolveActor } from "./runtime-helpers.js";
|
|
2
|
+
import { createPostgresPool, } from "../postgres.js";
|
|
3
|
+
import { loadBundledMigrationsFromDisk } from "../migrations-fs.js";
|
|
4
|
+
import { applyMigrations } from "../migrations.js";
|
|
5
|
+
import { listKnownAgentIds } from "../memory/sessions.js";
|
|
6
|
+
const SDK_RECOVERY_SUCCESS_THRESHOLD = 3;
|
|
7
|
+
export function createPluginRuntimeContext(params) {
|
|
8
|
+
const ctx = {
|
|
9
|
+
api: params.api,
|
|
10
|
+
cfg: params.cfg,
|
|
11
|
+
disabledReason: params.disabledReason,
|
|
12
|
+
pool: undefined,
|
|
13
|
+
migrationsApplied: undefined,
|
|
14
|
+
promptCache: {
|
|
15
|
+
lines: null,
|
|
16
|
+
error: null,
|
|
17
|
+
refreshPromise: null,
|
|
18
|
+
},
|
|
19
|
+
sessionsIndex: {
|
|
20
|
+
bootstrapPromise: null,
|
|
21
|
+
bootstrapped: false,
|
|
22
|
+
},
|
|
23
|
+
sessionDelta: {
|
|
24
|
+
pendingFiles: new Set(),
|
|
25
|
+
timer: null,
|
|
26
|
+
syncInFlight: null,
|
|
27
|
+
unsubscribe: null,
|
|
28
|
+
closed: false,
|
|
29
|
+
ignoredPathCounts: new Map(),
|
|
30
|
+
stateByPath: new Map(),
|
|
31
|
+
},
|
|
32
|
+
sdkHealth: {
|
|
33
|
+
degraded: false,
|
|
34
|
+
consecutiveSuccesses: 0,
|
|
35
|
+
},
|
|
36
|
+
resolveActor: () => resolveActor(params.api),
|
|
37
|
+
getPool: () => {
|
|
38
|
+
if (!ctx.cfg) {
|
|
39
|
+
throw new Error(`anchorclaw: disabled until configured (${ctx.disabledReason ?? "invalid config"})`);
|
|
40
|
+
}
|
|
41
|
+
ctx.pool ??= createPostgresPool({ cfg: ctx.cfg });
|
|
42
|
+
ctx.migrationsApplied ??= (async () => {
|
|
43
|
+
if (ctx.cfg?.postgres?.schema) {
|
|
44
|
+
const schema = ctx.cfg.postgres.schema.trim();
|
|
45
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(schema)) {
|
|
46
|
+
throw new Error("postgres.schema must be a simple identifier (letters/numbers/underscore)");
|
|
47
|
+
}
|
|
48
|
+
await ctx.pool.query(`CREATE SCHEMA IF NOT EXISTS ${schema}`);
|
|
49
|
+
}
|
|
50
|
+
const migrations = await loadBundledMigrationsFromDisk();
|
|
51
|
+
const result = await applyMigrations({ pool: ctx.pool, migrations });
|
|
52
|
+
if (result.applied.length > 0) {
|
|
53
|
+
params.api.logger.info(`anchorclaw: applied migrations: ${result.applied.join(", ")}`);
|
|
54
|
+
}
|
|
55
|
+
})();
|
|
56
|
+
return ctx.pool;
|
|
57
|
+
},
|
|
58
|
+
ensureReady: async () => {
|
|
59
|
+
ctx.getPool();
|
|
60
|
+
await ctx.migrationsApplied;
|
|
61
|
+
},
|
|
62
|
+
markSdkError: (operation, error) => {
|
|
63
|
+
ctx.sdkHealth.degraded = true;
|
|
64
|
+
ctx.sdkHealth.consecutiveSuccesses = 0;
|
|
65
|
+
ctx.sdkHealth.affectedOperation = operation;
|
|
66
|
+
ctx.sdkHealth.reason = error instanceof Error ? error.message : String(error);
|
|
67
|
+
ctx.sdkHealth.lastErrorAt = new Date().toISOString();
|
|
68
|
+
},
|
|
69
|
+
markSdkSuccess: () => {
|
|
70
|
+
if (!ctx.sdkHealth.degraded) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
ctx.sdkHealth.consecutiveSuccesses += 1;
|
|
74
|
+
if (ctx.sdkHealth.consecutiveSuccesses < SDK_RECOVERY_SUCCESS_THRESHOLD) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
ctx.sdkHealth.degraded = false;
|
|
78
|
+
ctx.sdkHealth.reason = undefined;
|
|
79
|
+
ctx.sdkHealth.affectedOperation = undefined;
|
|
80
|
+
ctx.sdkHealth.lastErrorAt = undefined;
|
|
81
|
+
ctx.sdkHealth.consecutiveSuccesses = 0;
|
|
82
|
+
},
|
|
83
|
+
listVisibleAgentIds: async () => {
|
|
84
|
+
const currentAgentId = String(params.api?.runtime?.agentId ?? "main");
|
|
85
|
+
const agentIds = await listKnownAgentIds();
|
|
86
|
+
return [currentAgentId, ...agentIds.filter((agentId) => agentId !== currentAgentId)];
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
return ctx;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=runtime-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/plugin/runtime-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-helpers.d.ts","sourceRoot":"","sources":["../../src/plugin/runtime-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,wBAAgB,YAAY,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAU3D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function resolveActor(api) {
|
|
2
|
+
const agentId = api?.runtime?.agentId;
|
|
3
|
+
if (typeof agentId === "string" && agentId.trim()) {
|
|
4
|
+
return `openclaw:agent:${agentId.trim()}`;
|
|
5
|
+
}
|
|
6
|
+
const sessionKey = api?.runtime?.sessionKey;
|
|
7
|
+
if (typeof sessionKey === "string" && sessionKey.trim()) {
|
|
8
|
+
return `openclaw:session:${sessionKey.trim()}`;
|
|
9
|
+
}
|
|
10
|
+
return "openclaw";
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=runtime-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-helpers.js","sourceRoot":"","sources":["../../src/plugin/runtime-helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,GAAsB;IACjD,MAAM,OAAO,GAAI,GAAW,EAAE,OAAO,EAAE,OAAO,CAAC;IAC/C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,OAAO,kBAAkB,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,UAAU,GAAI,GAAW,EAAE,OAAO,EAAE,UAAU,CAAC;IACrD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACxD,OAAO,oBAAoB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type AnchorClawConfig } from "../config.js";
|
|
2
|
+
import type { SessionDeltaThresholds } from "./types.js";
|
|
3
|
+
export declare function isSessionArchiveArtifactPath(sessionFile: string): boolean;
|
|
4
|
+
export declare function countNewlinesFromChunk(chunk: string): number;
|
|
5
|
+
export declare function countNewlinesInRange(params: {
|
|
6
|
+
filePath: string;
|
|
7
|
+
start: number;
|
|
8
|
+
end: number;
|
|
9
|
+
}): Promise<number>;
|
|
10
|
+
export declare function resolveSessionDeltaThresholds(cfg: AnchorClawConfig | undefined): SessionDeltaThresholds;
|
|
11
|
+
//# sourceMappingURL=session-delta-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-delta-helpers.d.ts","sourceRoot":"","sources":["../../src/plugin/session-delta-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAMtB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAIzD,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAMzE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BlB;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAChC,sBAAsB,CAaxB"}
|