openclaw-engram 0.2.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.
Files changed (90) hide show
  1. package/dist/availability.d.ts +34 -0
  2. package/dist/availability.d.ts.map +1 -0
  3. package/dist/availability.js +70 -0
  4. package/dist/availability.js.map +1 -0
  5. package/dist/client.d.ts +147 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +199 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/commands/memory.d.ts +11 -0
  10. package/dist/commands/memory.d.ts.map +1 -0
  11. package/dist/commands/memory.js +49 -0
  12. package/dist/commands/memory.js.map +1 -0
  13. package/dist/commands/remember.d.ts +15 -0
  14. package/dist/commands/remember.d.ts.map +1 -0
  15. package/dist/commands/remember.js +61 -0
  16. package/dist/commands/remember.js.map +1 -0
  17. package/dist/config.d.ts +73 -0
  18. package/dist/config.d.ts.map +1 -0
  19. package/dist/config.js +81 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/context/formatter.d.ts +33 -0
  22. package/dist/context/formatter.d.ts.map +1 -0
  23. package/dist/context/formatter.js +193 -0
  24. package/dist/context/formatter.js.map +1 -0
  25. package/dist/hooks/after-tool-call.d.ts +19 -0
  26. package/dist/hooks/after-tool-call.d.ts.map +1 -0
  27. package/dist/hooks/after-tool-call.js +53 -0
  28. package/dist/hooks/after-tool-call.js.map +1 -0
  29. package/dist/hooks/before-compaction.d.ts +19 -0
  30. package/dist/hooks/before-compaction.d.ts.map +1 -0
  31. package/dist/hooks/before-compaction.js +60 -0
  32. package/dist/hooks/before-compaction.js.map +1 -0
  33. package/dist/hooks/before-prompt-build.d.ts +20 -0
  34. package/dist/hooks/before-prompt-build.d.ts.map +1 -0
  35. package/dist/hooks/before-prompt-build.js +76 -0
  36. package/dist/hooks/before-prompt-build.js.map +1 -0
  37. package/dist/hooks/session-end.d.ts +18 -0
  38. package/dist/hooks/session-end.d.ts.map +1 -0
  39. package/dist/hooks/session-end.js +57 -0
  40. package/dist/hooks/session-end.js.map +1 -0
  41. package/dist/hooks/session-start.d.ts +17 -0
  42. package/dist/hooks/session-start.d.ts.map +1 -0
  43. package/dist/hooks/session-start.js +77 -0
  44. package/dist/hooks/session-start.js.map +1 -0
  45. package/dist/identity.d.ts +36 -0
  46. package/dist/identity.d.ts.map +1 -0
  47. package/dist/identity.js +106 -0
  48. package/dist/identity.js.map +1 -0
  49. package/dist/index.d.ts +24 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +208 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/services/file-watcher.d.ts +11 -0
  54. package/dist/services/file-watcher.d.ts.map +1 -0
  55. package/dist/services/file-watcher.js +139 -0
  56. package/dist/services/file-watcher.js.map +1 -0
  57. package/dist/tools/engram-decisions.d.ts +8 -0
  58. package/dist/tools/engram-decisions.d.ts.map +1 -0
  59. package/dist/tools/engram-decisions.js +70 -0
  60. package/dist/tools/engram-decisions.js.map +1 -0
  61. package/dist/tools/engram-remember.d.ts +9 -0
  62. package/dist/tools/engram-remember.d.ts.map +1 -0
  63. package/dist/tools/engram-remember.js +116 -0
  64. package/dist/tools/engram-remember.js.map +1 -0
  65. package/dist/tools/engram-search.d.ts +9 -0
  66. package/dist/tools/engram-search.d.ts.map +1 -0
  67. package/dist/tools/engram-search.js +62 -0
  68. package/dist/tools/engram-search.js.map +1 -0
  69. package/dist/tools/memory-forget.d.ts +10 -0
  70. package/dist/tools/memory-forget.d.ts.map +1 -0
  71. package/dist/tools/memory-forget.js +41 -0
  72. package/dist/tools/memory-forget.js.map +1 -0
  73. package/dist/tools/memory-get.d.ts +11 -0
  74. package/dist/tools/memory-get.d.ts.map +1 -0
  75. package/dist/tools/memory-get.js +86 -0
  76. package/dist/tools/memory-get.js.map +1 -0
  77. package/dist/tools/memory-migrate.d.ts +11 -0
  78. package/dist/tools/memory-migrate.d.ts.map +1 -0
  79. package/dist/tools/memory-migrate.js +180 -0
  80. package/dist/tools/memory-migrate.js.map +1 -0
  81. package/dist/types/openclaw.d.ts +212 -0
  82. package/dist/types/openclaw.d.ts.map +1 -0
  83. package/dist/types/openclaw.js +9 -0
  84. package/dist/types/openclaw.js.map +1 -0
  85. package/dist/utils/memory-files.d.ts +25 -0
  86. package/dist/utils/memory-files.d.ts.map +1 -0
  87. package/dist/utils/memory-files.js +187 -0
  88. package/dist/utils/memory-files.js.map +1 -0
  89. package/openclaw.plugin.json +86 -0
  90. package/package.json +45 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Local type definitions matching the real OpenClaw Plugin SDK.
3
+ *
4
+ * These are locally defined since no SDK package is published.
5
+ * Shapes match openclaw/openclaw:src/plugins/types.ts (verified via Nia research).
6
+ */
7
+ /** Logger provided by the SDK on the plugin API. */
8
+ export interface PluginLogger {
9
+ debug(message: string, ...args: unknown[]): void;
10
+ info(message: string, ...args: unknown[]): void;
11
+ warn(message: string, ...args: unknown[]): void;
12
+ error(message: string, ...args: unknown[]): void;
13
+ }
14
+ /** Runtime services exposed by the SDK. */
15
+ export interface PluginRuntime {
16
+ tools: {
17
+ createMemorySearchTool(): unknown;
18
+ };
19
+ }
20
+ /** OpenClaw global config (opaque to plugins). */
21
+ export type OpenClawConfig = Record<string, unknown>;
22
+ /** JSON Schema for plugin config (static, declared in plugin definition). */
23
+ export type OpenClawPluginConfigSchema = Record<string, unknown>;
24
+ export interface OpenClawPluginApi {
25
+ /** Plugin ID. */
26
+ id: string;
27
+ /** Plugin display name. */
28
+ name: string;
29
+ /** OpenClaw global config. */
30
+ config: OpenClawConfig;
31
+ /** Plugin-specific config from the user's OpenClaw settings. */
32
+ pluginConfig?: Record<string, unknown>;
33
+ /** Runtime services. */
34
+ runtime: PluginRuntime;
35
+ /** Logger scoped to this plugin. */
36
+ logger: PluginLogger;
37
+ /** Register a tool or tool factory. */
38
+ registerTool(toolOrFactory: AnyAgentTool | AnyAgentTool[] | ToolFactory, opts?: {
39
+ names?: string[];
40
+ }): void;
41
+ /** Register a lifecycle hook handler (typed). */
42
+ on<K extends PluginHookName>(hookName: K, handler: PluginHookHandler<K>, opts?: {
43
+ priority?: number;
44
+ }): void;
45
+ /** Register a CLI extension. */
46
+ registerCli(registrar: (ctx: {
47
+ program: CliProgram;
48
+ }) => void, opts?: {
49
+ commands?: string[];
50
+ }): void;
51
+ /** Register a background service. */
52
+ registerService(service: OpenClawPluginService): void;
53
+ /** Register a slash command. */
54
+ registerCommand(command: OpenClawPluginCommandDefinition): void;
55
+ /** Resolve a workspace-relative path safely. */
56
+ resolvePath(input: string): string;
57
+ }
58
+ export interface OpenClawPluginDefinition {
59
+ /** Unique plugin identifier. */
60
+ id: string;
61
+ /** Optional display name. */
62
+ name?: string;
63
+ /** Human-readable description. */
64
+ description?: string;
65
+ /** Version string. */
66
+ version?: string;
67
+ /** Plugin kind — "memory" is an exclusive slot. */
68
+ kind?: 'memory' | 'context-engine';
69
+ /** JSON Schema for plugin config (declared statically). */
70
+ configSchema?: OpenClawPluginConfigSchema;
71
+ /**
72
+ * Called once when the plugin is loaded. Register all hooks, tools,
73
+ * commands, and services here.
74
+ */
75
+ register?: (api: OpenClawPluginApi) => void | Promise<void>;
76
+ /** Optional activation phase (called after all plugins registered). */
77
+ activate?: (api: OpenClawPluginApi) => void | Promise<void>;
78
+ }
79
+ /** A TSchema-compatible object (from @sinclair/typebox). */
80
+ export type TSchema = Record<string, unknown>;
81
+ export interface AnyAgentTool {
82
+ name: string;
83
+ label?: string;
84
+ description: string;
85
+ /** TypeBox Type.Object schema for tool parameters. */
86
+ parameters: TSchema;
87
+ /** Execute the tool. Returns a string result. */
88
+ execute(toolCallId: string, params: Record<string, unknown>): Promise<string>;
89
+ }
90
+ /** Tool factory: receives context, returns array of tools. */
91
+ export type ToolFactory = (ctx: OpenClawPluginToolContext) => AnyAgentTool[];
92
+ export interface OpenClawPluginToolContext {
93
+ config?: OpenClawConfig;
94
+ workspaceDir?: string;
95
+ agentDir?: string;
96
+ agentId?: string;
97
+ sessionKey?: string;
98
+ /** Per-conversation ID, regenerated on /new and /reset. */
99
+ sessionId?: string;
100
+ messageChannel?: string;
101
+ }
102
+ export type PluginHookName = 'before_model_resolve' | 'before_prompt_build' | 'before_agent_start' | 'llm_input' | 'llm_output' | 'agent_end' | 'before_compaction' | 'after_compaction' | 'before_reset' | 'message_received' | 'message_sending' | 'message_sent' | 'before_tool_call' | 'after_tool_call' | 'tool_result_persist' | 'before_message_write' | 'session_start' | 'session_end' | 'subagent_spawning' | 'subagent_delivery_target' | 'subagent_spawned' | 'subagent_ended' | 'gateway_start' | 'gateway_stop';
103
+ /** Base fields present in every hook event. */
104
+ export interface BaseHookEvent {
105
+ agentId?: string;
106
+ sessionId?: string;
107
+ sessionKey?: string;
108
+ workspaceDir?: string;
109
+ timestamp?: string;
110
+ }
111
+ export interface SessionStartEvent extends BaseHookEvent {
112
+ initialPrompt?: string;
113
+ }
114
+ export interface BeforePromptBuildEvent extends BaseHookEvent {
115
+ prompt?: string;
116
+ turnIndex?: number;
117
+ }
118
+ export interface AfterToolCallEvent extends BaseHookEvent {
119
+ toolName?: string;
120
+ toolInput?: unknown;
121
+ toolResult?: unknown;
122
+ success?: boolean;
123
+ error?: string;
124
+ }
125
+ export interface BeforeCompactionEvent extends BaseHookEvent {
126
+ messages?: ConversationMessage[];
127
+ reason?: string;
128
+ }
129
+ export interface SessionEndEvent extends BaseHookEvent {
130
+ messages?: ConversationMessage[];
131
+ reason?: string;
132
+ }
133
+ export interface ConversationMessage {
134
+ role: 'user' | 'assistant' | 'system' | 'tool';
135
+ content: string;
136
+ }
137
+ export interface PromptBuildResult {
138
+ prependContext?: string;
139
+ appendSystemContext?: string;
140
+ }
141
+ export interface SessionStartResult {
142
+ appendSystemContext?: string;
143
+ }
144
+ export type HookResult = void | PromptBuildResult | SessionStartResult | undefined;
145
+ /** Map hook names to their event types (for hooks we use). */
146
+ export interface HookEventMap {
147
+ session_start: SessionStartEvent;
148
+ before_prompt_build: BeforePromptBuildEvent;
149
+ after_tool_call: AfterToolCallEvent;
150
+ before_compaction: BeforeCompactionEvent;
151
+ session_end: SessionEndEvent;
152
+ }
153
+ /** Generic hook handler type. */
154
+ export type PluginHookHandler<K extends PluginHookName> = K extends keyof HookEventMap ? (event: HookEventMap[K]) => HookResult | Promise<HookResult> : (event: BaseHookEvent) => HookResult | Promise<HookResult>;
155
+ export interface OpenClawPluginServiceContext {
156
+ logger: PluginLogger;
157
+ }
158
+ export interface OpenClawPluginService {
159
+ id: string;
160
+ start(ctx: OpenClawPluginServiceContext): Promise<void> | void;
161
+ stop(ctx: OpenClawPluginServiceContext): Promise<void> | void;
162
+ }
163
+ /**
164
+ * Context passed to plugin command handlers by the SDK.
165
+ * Commands are channel-facing (Telegram, Discord, etc.), not agent-facing.
166
+ */
167
+ export interface PluginCommandContext {
168
+ senderId?: string;
169
+ channel: string;
170
+ channelId?: string;
171
+ isAuthorizedSender: boolean;
172
+ /** Raw command arguments after the command name (single string, not array). */
173
+ args?: string;
174
+ commandBody: string;
175
+ config: OpenClawConfig;
176
+ from?: string;
177
+ to?: string;
178
+ accountId?: string;
179
+ messageThreadId?: number;
180
+ }
181
+ /**
182
+ * Result returned by a plugin command handler.
183
+ * Must contain `text` field (not `output`).
184
+ */
185
+ export interface PluginCommandResult {
186
+ text: string;
187
+ }
188
+ /**
189
+ * Handler function for plugin commands.
190
+ */
191
+ export type PluginCommandHandler = (ctx: PluginCommandContext) => PluginCommandResult | Promise<PluginCommandResult>;
192
+ export interface OpenClawPluginCommandDefinition {
193
+ name: string;
194
+ description: string;
195
+ /** Whether this command accepts arguments. */
196
+ acceptsArgs?: boolean;
197
+ /** Whether only authorized senders can use this command (default: true). */
198
+ requireAuth?: boolean;
199
+ /** The handler function — SDK checks typeof handler === "function". */
200
+ handler: PluginCommandHandler;
201
+ }
202
+ export interface CliProgram {
203
+ command(name: string): CliCommand;
204
+ }
205
+ export interface CliCommand {
206
+ command(name: string): CliCommand;
207
+ description(desc: string): CliCommand;
208
+ argument(name: string, desc?: string): CliCommand;
209
+ option(flags: string, desc?: string, defaultValue?: unknown): CliCommand;
210
+ action(fn: (...args: unknown[]) => void | Promise<void>): CliCommand;
211
+ }
212
+ //# sourceMappingURL=openclaw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/types/openclaw.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE;QACL,sBAAsB,IAAI,OAAO,CAAC;KACnC,CAAC;CACH;AAED,kDAAkD;AAClD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD,6EAA6E;AAC7E,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,iBAAiB;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,wBAAwB;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,oCAAoC;IACpC,MAAM,EAAE,YAAY,CAAC;IAErB,uCAAuC;IACvC,YAAY,CACV,aAAa,EAAE,YAAY,GAAG,YAAY,EAAE,GAAG,WAAW,EAC1D,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC1B,IAAI,CAAC;IAER,iDAAiD;IACjD,EAAE,CAAC,CAAC,SAAS,cAAc,EACzB,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,IAAI,CAAC;IAER,gCAAgC;IAChC,WAAW,CACT,SAAS,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,EACjD,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC7B,IAAI,CAAC;IAER,qCAAqC;IACrC,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAEtD,gCAAgC;IAChC,eAAe,CAAC,OAAO,EAAE,+BAA+B,GAAG,IAAI,CAAC;IAEhE,gDAAgD;IAChD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IACnC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,uEAAuE;IACvE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAMD,4DAA4D;AAC5D,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/E;AAED,8DAA8D;AAC9D,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,yBAAyB,KAAK,YAAY,EAAE,CAAC;AAE7E,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,MAAM,cAAc,GACtB,sBAAsB,GAAG,qBAAqB,GAAG,oBAAoB,GACrE,WAAW,GAAG,YAAY,GAAG,WAAW,GACxC,mBAAmB,GAAG,kBAAkB,GAAG,cAAc,GACzD,kBAAkB,GAAG,iBAAiB,GAAG,cAAc,GACvD,kBAAkB,GAAG,iBAAiB,GAAG,qBAAqB,GAC9D,sBAAsB,GAAG,eAAe,GAAG,aAAa,GACxD,mBAAmB,GAAG,0BAA0B,GAAG,kBAAkB,GACrE,gBAAgB,GAAG,eAAe,GAAG,cAAc,CAAC;AAExD,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEnF,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,iBAAiB,CAAC;IACjC,mBAAmB,EAAE,sBAAsB,CAAC;IAC5C,eAAe,EAAE,kBAAkB,CAAC;IACpC,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED,iCAAiC;AACjC,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,cAAc,IACpD,CAAC,SAAS,MAAM,YAAY,GACxB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,GAC5D,CAAC,KAAK,EAAE,aAAa,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAMjE,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,GAAG,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC/D;AAMD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,GAAG,EAAE,oBAAoB,KACtB,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExD,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uEAAuE;IACvE,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAMD,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACzE,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;CACtE"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Local type definitions matching the real OpenClaw Plugin SDK.
4
+ *
5
+ * These are locally defined since no SDK package is published.
6
+ * Shapes match openclaw/openclaw:src/plugins/types.ts (verified via Nia research).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=openclaw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/types/openclaw.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared memory file utilities — used by memory-migrate tool and file-watcher service.
3
+ *
4
+ * Provides chunking, marker file I/O, file discovery, and safe file reading.
5
+ */
6
+ export declare const MARKER_FILE = ".engram-migrated.json";
7
+ export declare const MAX_FILE_SIZE = 50000;
8
+ export interface MigrationMarker {
9
+ lastMigrated: string;
10
+ files: Record<string, string>;
11
+ }
12
+ export interface MemoryChunk {
13
+ title: string;
14
+ content: string;
15
+ sourcePath: string;
16
+ type: string;
17
+ }
18
+ export declare function splitIntoChunks(content: string, sourcePath: string): MemoryChunk[];
19
+ export declare function inferType(_sourcePath: string, content: string): string;
20
+ export declare function loadMarker(path: string): Promise<MigrationMarker | null>;
21
+ export declare function saveMarker(markerPath: string, marker: MigrationMarker): Promise<void>;
22
+ export declare function discoverMemoryFiles(workspaceDir: string): Promise<string[]>;
23
+ export declare function fileExists(path: string): Promise<boolean>;
24
+ export declare function safeReadFile(path: string): Promise<string | null>;
25
+ //# sourceMappingURL=memory-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-files.d.ts","sourceRoot":"","sources":["../../src/utils/memory-files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,WAAW,0BAA0B,CAAC;AACnD,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAMD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,EAAE,CA8DlF;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtE;AAMD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAW9E;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3F;AAMD,wBAAsB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBjF;AA2BD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvE"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ /**
3
+ * Shared memory file utilities — used by memory-migrate tool and file-watcher service.
4
+ *
5
+ * Provides chunking, marker file I/O, file discovery, and safe file reading.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.MAX_FILE_SIZE = exports.MARKER_FILE = void 0;
9
+ exports.splitIntoChunks = splitIntoChunks;
10
+ exports.inferType = inferType;
11
+ exports.loadMarker = loadMarker;
12
+ exports.saveMarker = saveMarker;
13
+ exports.discoverMemoryFiles = discoverMemoryFiles;
14
+ exports.fileExists = fileExists;
15
+ exports.safeReadFile = safeReadFile;
16
+ const promises_1 = require("node:fs/promises");
17
+ const node_path_1 = require("node:path");
18
+ exports.MARKER_FILE = '.engram-migrated.json';
19
+ exports.MAX_FILE_SIZE = 50_000; // 50KB limit per file
20
+ // ---------------------------------------------------------------------------
21
+ // Chunking
22
+ // ---------------------------------------------------------------------------
23
+ function splitIntoChunks(content, sourcePath) {
24
+ const chunks = [];
25
+ const lines = content.split('\n');
26
+ // Try splitting by ## headers
27
+ const sections = [];
28
+ let currentTitle = '';
29
+ let currentContent = [];
30
+ let inFence = false;
31
+ for (const line of lines) {
32
+ if (line.startsWith('```')) {
33
+ inFence = !inFence;
34
+ }
35
+ const headerMatch = !inFence ? line.match(/^##\s+(.+)/) : null;
36
+ if (headerMatch) {
37
+ if (currentContent.length > 0) {
38
+ sections.push({
39
+ title: currentTitle || sourcePath,
40
+ content: currentContent.join('\n').trim(),
41
+ });
42
+ }
43
+ currentTitle = headerMatch[1].trim();
44
+ currentContent = [];
45
+ }
46
+ else {
47
+ currentContent.push(line);
48
+ }
49
+ }
50
+ // Push last section
51
+ if (currentContent.length > 0) {
52
+ sections.push({
53
+ title: currentTitle || sourcePath,
54
+ content: currentContent.join('\n').trim(),
55
+ });
56
+ }
57
+ // If no ## headers found, treat whole file as one chunk
58
+ if (sections.length === 0) {
59
+ const trimmed = content.trim();
60
+ if (trimmed) {
61
+ chunks.push({
62
+ title: sourcePath,
63
+ content: trimmed,
64
+ sourcePath,
65
+ type: inferType(sourcePath, trimmed),
66
+ });
67
+ }
68
+ return chunks;
69
+ }
70
+ // Filter out empty sections and create chunks
71
+ for (const section of sections) {
72
+ if (!section.content)
73
+ continue;
74
+ chunks.push({
75
+ title: section.title,
76
+ content: section.content,
77
+ sourcePath,
78
+ type: inferType(sourcePath, section.content),
79
+ });
80
+ }
81
+ return chunks;
82
+ }
83
+ function inferType(_sourcePath, content) {
84
+ const lower = content.toLowerCase();
85
+ if (lower.includes('decision') || lower.includes('chose') || lower.includes('decided'))
86
+ return 'decision';
87
+ if (lower.includes('bug') || lower.includes('fix') || lower.includes('resolved'))
88
+ return 'bugfix';
89
+ if (lower.includes('pattern') || lower.includes('convention'))
90
+ return 'discovery';
91
+ return 'change';
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Marker file
95
+ // ---------------------------------------------------------------------------
96
+ async function loadMarker(path) {
97
+ try {
98
+ const raw = await (0, promises_1.readFile)(path, 'utf-8');
99
+ const parsed = JSON.parse(raw);
100
+ if (!parsed || typeof parsed !== 'object' || typeof parsed.files !== 'object') {
101
+ return null; // corrupted marker, treat as fresh
102
+ }
103
+ return parsed;
104
+ }
105
+ catch {
106
+ return null;
107
+ }
108
+ }
109
+ async function saveMarker(markerPath, marker) {
110
+ // Atomic write via temp file + rename to reduce race window when
111
+ // two agents migrate concurrently (last writer wins, no corruption).
112
+ const tmp = markerPath + '.tmp';
113
+ try {
114
+ await (0, promises_1.writeFile)(tmp, JSON.stringify(marker, null, 2), 'utf-8');
115
+ await (0, promises_1.rename)(tmp, markerPath);
116
+ }
117
+ catch (err) {
118
+ const msg = err instanceof Error ? err.message : String(err);
119
+ console.warn(`[engram] failed to save migration marker: ${msg}`);
120
+ }
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // File discovery
124
+ // ---------------------------------------------------------------------------
125
+ async function discoverMemoryFiles(workspaceDir) {
126
+ const files = [];
127
+ // Check MEMORY.md
128
+ const memoryMd = (0, node_path_1.join)(workspaceDir, 'MEMORY.md');
129
+ if (await fileExists(memoryMd)) {
130
+ files.push(memoryMd);
131
+ }
132
+ // Check memory/ directory recursively
133
+ const memoryDir = (0, node_path_1.join)(workspaceDir, 'memory');
134
+ if (await fileExists(memoryDir)) {
135
+ const mdFiles = await findMdFiles(memoryDir);
136
+ files.push(...mdFiles);
137
+ }
138
+ return files;
139
+ }
140
+ async function findMdFiles(dir, depth = 0) {
141
+ if (depth > 10)
142
+ return []; // Guard against excessive nesting
143
+ const results = [];
144
+ try {
145
+ const entries = await (0, promises_1.readdir)(dir, { withFileTypes: true });
146
+ for (const entry of entries) {
147
+ if (entry.isSymbolicLink())
148
+ continue; // Prevent symlink cycles
149
+ const fullPath = (0, node_path_1.join)(dir, entry.name);
150
+ if (entry.isDirectory()) {
151
+ const nested = await findMdFiles(fullPath, depth + 1);
152
+ results.push(...nested);
153
+ }
154
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
155
+ results.push(fullPath);
156
+ }
157
+ }
158
+ }
159
+ catch {
160
+ // Directory not readable — skip
161
+ }
162
+ return results;
163
+ }
164
+ // ---------------------------------------------------------------------------
165
+ // Helpers
166
+ // ---------------------------------------------------------------------------
167
+ async function fileExists(path) {
168
+ try {
169
+ await (0, promises_1.stat)(path);
170
+ return true;
171
+ }
172
+ catch {
173
+ return false;
174
+ }
175
+ }
176
+ async function safeReadFile(path) {
177
+ try {
178
+ const info = await (0, promises_1.stat)(path);
179
+ if (info.size > exports.MAX_FILE_SIZE)
180
+ return null;
181
+ return await (0, promises_1.readFile)(path, 'utf-8');
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ }
187
+ //# sourceMappingURL=memory-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-files.js","sourceRoot":"","sources":["../../src/utils/memory-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "engram",
3
+ "id": "engram",
4
+ "version": "0.2.0",
5
+ "displayName": "Engram Memory",
6
+ "description": "Connects OpenClaw agents to engram persistent memory server for long-term context retention",
7
+ "kind": "memory",
8
+ "author": "thebtf",
9
+ "main": "dist/index.js",
10
+ "configSchema": {
11
+ "type": "object",
12
+ "properties": {
13
+ "url": {
14
+ "type": "string",
15
+ "description": "Engram server URL (e.g. http://localhost:37777)",
16
+ "default": "http://localhost:37777"
17
+ },
18
+ "token": {
19
+ "type": "string",
20
+ "description": "Bearer token for engram API authentication",
21
+ "uiHints": { "sensitive": true }
22
+ },
23
+ "project": {
24
+ "type": "string",
25
+ "description": "Project scope override (defaults to auto-detected from workspace)"
26
+ },
27
+ "contextLimit": {
28
+ "type": "number",
29
+ "description": "Maximum observations to inject per prompt",
30
+ "default": 10
31
+ },
32
+ "sessionContextLimit": {
33
+ "type": "number",
34
+ "description": "Maximum observations to inject at session start",
35
+ "default": 20
36
+ },
37
+ "tokenBudget": {
38
+ "type": "number",
39
+ "description": "Maximum token budget for context injection (approx 4 chars per token)",
40
+ "default": 2000
41
+ },
42
+ "timeoutMs": {
43
+ "type": "number",
44
+ "description": "Per-request timeout in milliseconds",
45
+ "default": 5000
46
+ },
47
+ "autoExtract": {
48
+ "type": "boolean",
49
+ "description": "Enable automatic observation extraction on compaction/session-end",
50
+ "default": true
51
+ },
52
+ "logLevel": {
53
+ "type": "string",
54
+ "enum": ["debug", "info", "warn", "error"],
55
+ "description": "Log verbosity level",
56
+ "default": "warn"
57
+ }
58
+ },
59
+ "required": ["url", "token"]
60
+ },
61
+ "hooks": [
62
+ "session_start",
63
+ "before_prompt_build",
64
+ "after_tool_call",
65
+ "before_compaction",
66
+ "session_end"
67
+ ],
68
+ "tools": [
69
+ "engram_search",
70
+ "engram_remember",
71
+ "engram_decisions",
72
+ "memory_search",
73
+ "memory_store",
74
+ "memory_forget",
75
+ "memory_get",
76
+ "memory_migrate"
77
+ ],
78
+ "commands": [
79
+ "memory",
80
+ "remember",
81
+ "migrate"
82
+ ],
83
+ "cli": {
84
+ "commands": ["memory"]
85
+ }
86
+ }
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "openclaw-engram",
3
+ "version": "0.2.0",
4
+ "description": "OpenClaw plugin that connects to engram persistent memory server",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "typecheck": "tsc --noEmit",
10
+ "prepublishOnly": "npm run build"
11
+ },
12
+ "files": [
13
+ "dist/",
14
+ "openclaw.plugin.json"
15
+ ],
16
+ "keywords": [
17
+ "openclaw",
18
+ "engram",
19
+ "memory",
20
+ "plugin"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/thebtf/engram.git",
25
+ "directory": "plugin/openclaw-engram"
26
+ },
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@sinclair/typebox": "^0.34.0",
30
+ "chokidar": "^4.0.3",
31
+ "zod": "^3.25.76"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^18.19.0",
35
+ "typescript": "^5.9.3"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ },
40
+ "openclaw": {
41
+ "extensions": [
42
+ "dist/index.js"
43
+ ]
44
+ }
45
+ }