@getplumb/openclaw-plugin 0.1.0 → 0.1.2
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/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/hooks/post-exchange.d.ts +5 -1
- package/dist/hooks/post-exchange.d.ts.map +1 -1
- package/dist/hooks/post-exchange.js +13 -3
- package/dist/hooks/post-exchange.js.map +1 -1
- package/dist/hooks/pre-response.d.ts +2 -1
- package/dist/hooks/pre-response.d.ts.map +1 -1
- package/dist/hooks/pre-response.js +15 -1
- package/dist/hooks/pre-response.js.map +1 -1
- package/dist/plugin-module.d.ts.map +1 -1
- package/dist/plugin-module.js +22 -3
- package/dist/plugin-module.js.map +1 -1
- package/package.json +13 -9
package/dist/config.d.ts
CHANGED
|
@@ -9,6 +9,12 @@ export interface PlumbPluginConfig {
|
|
|
9
9
|
dbPath?: string;
|
|
10
10
|
/** If true: retrieve but don't inject (for validation). Default: false. */
|
|
11
11
|
shadowMode: boolean;
|
|
12
|
+
/** LLM provider for fact extraction: 'openai', 'anthropic', 'ollama', 'openai-compatible'. */
|
|
13
|
+
llmProvider?: string;
|
|
14
|
+
/** LLM model ID for fact extraction. Defaults vary by provider. */
|
|
15
|
+
llmModel?: string;
|
|
16
|
+
/** API key for LLM provider. Overrides env vars when set. */
|
|
17
|
+
llmApiKey?: string;
|
|
12
18
|
}
|
|
13
19
|
export declare const DEFAULT_CONFIG: PlumbPluginConfig;
|
|
14
20
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IAEf,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IAEjB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,+EAA+E;IAC/E,aAAa,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IAEf,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IAEjB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;IAEpB,8FAA8F;IAC9F,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,iBAK5B,CAAC"}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,aAAa,EAAE,WAAW;IAC1B,MAAM,EAAE,SAAS;IACjB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,KAAK;CAClB,CAAC"}
|
|
@@ -25,7 +25,11 @@ type PluginHookAgentContext = {
|
|
|
25
25
|
*
|
|
26
26
|
* Fire-and-forget pattern: returns void synchronously, ingests in background.
|
|
27
27
|
* Errors are caught and logged silently to avoid disrupting the agent flow.
|
|
28
|
+
*
|
|
29
|
+
* @param store LocalStore instance for ingestion
|
|
30
|
+
* @param userId User ID for the exchange
|
|
31
|
+
* @param pendingPrompts Shared map containing user prompts stored by pre-response hook
|
|
28
32
|
*/
|
|
29
|
-
export declare function createPostExchangeHook(store: LocalStore, userId: string): (event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext) => void;
|
|
33
|
+
export declare function createPostExchangeHook(store: LocalStore, userId: string, pendingPrompts?: Map<string, string>): (event: PluginHookLlmOutputEvent, ctx: PluginHookAgentContext) => void;
|
|
30
34
|
export {};
|
|
31
35
|
//# sourceMappingURL=post-exchange.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-exchange.d.ts","sourceRoot":"","sources":["../../src/hooks/post-exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"post-exchange.d.ts","sourceRoot":"","sources":["../../src/hooks/post-exchange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,KAAK,wBAAwB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAE5B,OAAO,wBAAwB,EAAE,KAAK,sBAAsB,KAAG,IAAI,CAoD5E"}
|
|
@@ -4,15 +4,25 @@ import { appendError } from '../error-logger.js';
|
|
|
4
4
|
*
|
|
5
5
|
* Fire-and-forget pattern: returns void synchronously, ingests in background.
|
|
6
6
|
* Errors are caught and logged silently to avoid disrupting the agent flow.
|
|
7
|
+
*
|
|
8
|
+
* @param store LocalStore instance for ingestion
|
|
9
|
+
* @param userId User ID for the exchange
|
|
10
|
+
* @param pendingPrompts Shared map containing user prompts stored by pre-response hook
|
|
7
11
|
*/
|
|
8
|
-
export function createPostExchangeHook(store, userId) {
|
|
12
|
+
export function createPostExchangeHook(store, userId, pendingPrompts) {
|
|
9
13
|
return (event, ctx) => {
|
|
14
|
+
const sessionId = ctx.sessionId ?? event.sessionId ?? crypto.randomUUID();
|
|
15
|
+
// Retrieve and clear the user message from shared state
|
|
16
|
+
const userMessage = pendingPrompts?.get(sessionId) ?? '';
|
|
17
|
+
if (pendingPrompts && sessionId) {
|
|
18
|
+
pendingPrompts.delete(sessionId);
|
|
19
|
+
}
|
|
10
20
|
const exchange = {
|
|
11
21
|
id: crypto.randomUUID(),
|
|
12
22
|
userId,
|
|
13
|
-
sessionId
|
|
23
|
+
sessionId,
|
|
14
24
|
sessionLabel: ctx.sessionKey,
|
|
15
|
-
userMessage
|
|
25
|
+
userMessage,
|
|
16
26
|
agentResponse: event.assistantTexts.join('\n'),
|
|
17
27
|
timestamp: new Date().toISOString(),
|
|
18
28
|
source: 'openclaw',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-exchange.js","sourceRoot":"","sources":["../../src/hooks/post-exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0BjD
|
|
1
|
+
{"version":3,"file":"post-exchange.js","sourceRoot":"","sources":["../../src/hooks/post-exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA0BjD;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAiB,EACjB,MAAc,EACd,cAAoC;IAEpC,OAAO,CAAC,KAA+B,EAAE,GAA2B,EAAQ,EAAE;QAC5E,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAE1E,wDAAwD;QACxD,MAAM,WAAW,GAAG,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,cAAc,IAAI,SAAS,EAAE,CAAC;YAChC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,MAAM;YACN,SAAS;YACT,YAAY,EAAE,GAAG,CAAC,UAAU;YAC5B,WAAW;YACX,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,UAAmB;SAC5B,CAAC;QAEF,iDAAiD;QACjD,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,CAAC;oBACjB,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,aAAa,EAAE,QAAQ,CAAC,aAAa;oBACrC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACvC,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC;iBACtE,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAU,EAAE,CAAC;gBACpB,iDAAiD;gBACjD,MAAM,UAAU,GAAG;oBACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnD,OAAO,EAAE;wBACP,SAAS,EAAE,QAAQ,CAAC,SAAS;wBAC7B,MAAM;wBACN,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACxB;oBACD,GAAG,CAAC,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7D,CAAC;gBAEF,WAAW,CAAC,UAAU,CAAC,CAAC;gBAExB,kEAAkE;gBAClE,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -24,8 +24,9 @@ type PluginHookAgentContext = {
|
|
|
24
24
|
* @param store LocalStore instance for memory retrieval
|
|
25
25
|
* @param nudgeManager NudgeManager instance for contextual upgrade nudges
|
|
26
26
|
* @param shadowMode If true, retrieves and logs what would be injected but doesn't actually inject
|
|
27
|
+
* @param pendingPrompts Shared map for storing prompts to be consumed by post-exchange hook
|
|
27
28
|
* @returns Hook handler for before_prompt_build event
|
|
28
29
|
*/
|
|
29
|
-
export declare function createPreResponseHook(store: LocalStore | null, nudgeManager: NudgeManager | null, shadowMode?: boolean): (event: PluginHookBeforePromptBuildEvent, ctx: PluginHookAgentContext) => Promise<PluginHookBeforePromptBuildResult | void>;
|
|
30
|
+
export declare function createPreResponseHook(store: LocalStore | null, nudgeManager: NudgeManager | null, shadowMode?: boolean, pendingPrompts?: Map<string, string>): (event: PluginHookBeforePromptBuildEvent, ctx: PluginHookAgentContext) => Promise<PluginHookBeforePromptBuildResult | void>;
|
|
30
31
|
export {};
|
|
31
32
|
//# sourceMappingURL=pre-response.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-response.d.ts","sourceRoot":"","sources":["../../src/hooks/pre-response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,iCAAiC,GAAG;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;
|
|
1
|
+
{"version":3,"file":"pre-response.d.ts","sourceRoot":"","sources":["../../src/hooks/pre-response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,KAAK,gCAAgC,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,KAAK,iCAAiC,GAAG;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,KAAK,sBAAsB,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAKF;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,UAAU,UAAQ,EAClB,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAGlC,OAAO,gCAAgC,EACvC,KAAK,sBAAsB,KAC1B,OAAO,CAAC,iCAAiC,GAAG,IAAI,CAAC,CA6FrD"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { buildMemoryContext, formatContextBlock } from '@getplumb/core';
|
|
2
2
|
const INJECTION_TIMEOUT_MS = 800;
|
|
3
|
+
const MAX_PENDING_PROMPTS = 1000; // Prevent memory leaks
|
|
3
4
|
/**
|
|
4
5
|
* Creates a hook handler that retrieves and injects memory context before each agent response.
|
|
5
6
|
*
|
|
@@ -9,10 +10,23 @@ const INJECTION_TIMEOUT_MS = 800;
|
|
|
9
10
|
* @param store LocalStore instance for memory retrieval
|
|
10
11
|
* @param nudgeManager NudgeManager instance for contextual upgrade nudges
|
|
11
12
|
* @param shadowMode If true, retrieves and logs what would be injected but doesn't actually inject
|
|
13
|
+
* @param pendingPrompts Shared map for storing prompts to be consumed by post-exchange hook
|
|
12
14
|
* @returns Hook handler for before_prompt_build event
|
|
13
15
|
*/
|
|
14
|
-
export function createPreResponseHook(store, nudgeManager, shadowMode = false) {
|
|
16
|
+
export function createPreResponseHook(store, nudgeManager, shadowMode = false, pendingPrompts) {
|
|
15
17
|
return async (event, ctx) => {
|
|
18
|
+
// Store the user prompt in shared state for the post-exchange hook
|
|
19
|
+
if (pendingPrompts && ctx.sessionId && event.prompt) {
|
|
20
|
+
// Prevent memory leaks by enforcing a size cap
|
|
21
|
+
if (pendingPrompts.size >= MAX_PENDING_PROMPTS) {
|
|
22
|
+
// Remove the oldest entry (first entry in the map)
|
|
23
|
+
const firstKey = pendingPrompts.keys().next().value;
|
|
24
|
+
if (firstKey) {
|
|
25
|
+
pendingPrompts.delete(firstKey);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
pendingPrompts.set(ctx.sessionId, event.prompt);
|
|
29
|
+
}
|
|
16
30
|
if (!store) {
|
|
17
31
|
return;
|
|
18
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pre-response.js","sourceRoot":"","sources":["../../src/hooks/pre-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAuBxE,MAAM,oBAAoB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"pre-response.js","sourceRoot":"","sources":["../../src/hooks/pre-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-module.d.ts","sourceRoot":"","sources":["../src/plugin-module.ts"],"names":[],"mappings":"AAQA,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,mBAAmB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACnE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACvC,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KACzB,IAAI,CAAC;CACX,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-module.d.ts","sourceRoot":"","sources":["../src/plugin-module.ts"],"names":[],"mappings":"AAQA,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5D,mBAAmB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACnE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,CAAC,CAAC,SAAS,MAAM,oBAAoB,EACvC,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,KACzB,IAAI,CAAC;CACX,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAIF;;;;;GAKG;AACH,eAAO,MAAM,MAAM,EAAE,wBAyDpB,CAAC"}
|
package/dist/plugin-module.js
CHANGED
|
@@ -20,13 +20,32 @@ export const plugin = {
|
|
|
20
20
|
const dbPath = api.pluginConfig?.dbPath ?? DEFAULT_DB_PATH;
|
|
21
21
|
const userId = api.pluginConfig?.userId ?? 'default';
|
|
22
22
|
const shadowMode = api.pluginConfig?.shadowMode ?? false;
|
|
23
|
+
const llmProvider = api.pluginConfig?.llmProvider;
|
|
24
|
+
const llmModel = api.pluginConfig?.llmModel;
|
|
25
|
+
const llmApiKey = api.pluginConfig?.llmApiKey;
|
|
26
|
+
// Build llmConfig from pluginConfig if any LLM values are provided.
|
|
27
|
+
// Passed directly to LocalStore so no process.env mutation is needed.
|
|
28
|
+
const llmConfig = (llmProvider ?? llmModel ?? llmApiKey)
|
|
29
|
+
? {
|
|
30
|
+
...(llmProvider !== undefined && { provider: llmProvider }),
|
|
31
|
+
...(llmModel !== undefined && { model: llmModel }),
|
|
32
|
+
...(llmApiKey !== undefined && { apiKey: llmApiKey }),
|
|
33
|
+
}
|
|
34
|
+
: undefined;
|
|
23
35
|
api.logger.info(`[plumb] Activating with dbPath=${dbPath}, userId=${userId}, shadowMode=${shadowMode}`);
|
|
24
|
-
const store = new LocalStore({
|
|
36
|
+
const store = new LocalStore({
|
|
37
|
+
dbPath,
|
|
38
|
+
userId,
|
|
39
|
+
...(llmConfig !== undefined && { llmConfig }),
|
|
40
|
+
});
|
|
25
41
|
const nudgeManager = new NudgeManager();
|
|
42
|
+
// Shared state map for threading user prompts from before_prompt_build to llm_output
|
|
43
|
+
// Key: sessionId, Value: user message prompt
|
|
44
|
+
const pendingPrompts = new Map();
|
|
26
45
|
// Register the llm_output hook for auto-ingest
|
|
27
|
-
api.on('llm_output', createPostExchangeHook(store, userId));
|
|
46
|
+
api.on('llm_output', createPostExchangeHook(store, userId, pendingPrompts));
|
|
28
47
|
// Register the before_prompt_build hook for memory injection
|
|
29
|
-
api.on('before_prompt_build', createPreResponseHook(store, nudgeManager, shadowMode));
|
|
48
|
+
api.on('before_prompt_build', createPreResponseHook(store, nudgeManager, shadowMode, pendingPrompts));
|
|
30
49
|
// Clean up on session end
|
|
31
50
|
api.on('session_end', async () => {
|
|
32
51
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-module.js","sourceRoot":"","sources":["../src/plugin-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqC1C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAA6B;IAC9C,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,cAAc;IACpB,OAAO,EAAE,OAAO;IAChB,IAAI,EAAE,QAAQ;IAEd,KAAK,CAAC,QAAQ,CAAC,GAAsB;QACnC,MAAM,MAAM,GAAI,GAAG,CAAC,YAAY,EAAE,MAA6B,IAAI,eAAe,CAAC;QACnF,MAAM,MAAM,GAAI,GAAG,CAAC,YAAY,EAAE,MAA6B,IAAI,SAAS,CAAC;QAC7E,MAAM,UAAU,GAAI,GAAG,CAAC,YAAY,EAAE,UAAkC,IAAI,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-module.js","sourceRoot":"","sources":["../src/plugin-module.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getplumb/openclaw-plugin",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Plumb OpenClaw plugin — auto-ingest and memory injection for OpenClaw",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -20,9 +20,19 @@
|
|
|
20
20
|
"types": "./dist/index.d.ts"
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
|
+
"openclaw": {
|
|
24
|
+
"extensions": ["./dist/index.js"]
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"prepublishOnly": "pnpm build",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"lint": "echo \"No lint yet\" && exit 0",
|
|
31
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
32
|
+
},
|
|
23
33
|
"dependencies": {
|
|
24
34
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
25
|
-
"@getplumb/core": "0.1.
|
|
35
|
+
"@getplumb/core": "^0.1.1"
|
|
26
36
|
},
|
|
27
37
|
"devDependencies": {
|
|
28
38
|
"@types/better-sqlite3": "^7.6.13",
|
|
@@ -30,11 +40,5 @@
|
|
|
30
40
|
"openclaw": "^2026.3.2",
|
|
31
41
|
"typescript": "^5.4.0",
|
|
32
42
|
"vitest": "^4.0.18"
|
|
33
|
-
},
|
|
34
|
-
"scripts": {
|
|
35
|
-
"build": "tsc",
|
|
36
|
-
"test": "vitest run",
|
|
37
|
-
"lint": "echo \"No lint yet\" && exit 0",
|
|
38
|
-
"clean": "rm -rf dist *.tsbuildinfo"
|
|
39
43
|
}
|
|
40
|
-
}
|
|
44
|
+
}
|