@rudderhq/agent-runtime-gemini-local 0.1.0-canary.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 (60) hide show
  1. package/LICENSE +14 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +198 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +9 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +47 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/execute.d.ts +3 -0
  15. package/dist/server/execute.d.ts.map +1 -0
  16. package/dist/server/execute.js +489 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/index.d.ts +7 -0
  19. package/dist/server/index.d.ts.map +1 -0
  20. package/dist/server/index.js +62 -0
  21. package/dist/server/index.js.map +1 -0
  22. package/dist/server/parse.d.ts +38 -0
  23. package/dist/server/parse.d.ts.map +1 -0
  24. package/dist/server/parse.js +238 -0
  25. package/dist/server/parse.js.map +1 -0
  26. package/dist/server/skills.d.ts +7 -0
  27. package/dist/server/skills.d.ts.map +1 -0
  28. package/dist/server/skills.js +66 -0
  29. package/dist/server/skills.js.map +1 -0
  30. package/dist/server/test.d.ts +3 -0
  31. package/dist/server/test.d.ts.map +1 -0
  32. package/dist/server/test.js +219 -0
  33. package/dist/server/test.js.map +1 -0
  34. package/dist/server/utils.d.ts +2 -0
  35. package/dist/server/utils.d.ts.map +1 -0
  36. package/dist/server/utils.js +7 -0
  37. package/dist/server/utils.js.map +1 -0
  38. package/dist/ui/build-config.d.ts +3 -0
  39. package/dist/ui/build-config.d.ts.map +1 -0
  40. package/dist/ui/build-config.js +84 -0
  41. package/dist/ui/build-config.js.map +1 -0
  42. package/dist/ui/index.d.ts +3 -0
  43. package/dist/ui/index.d.ts.map +1 -0
  44. package/dist/ui/index.js +3 -0
  45. package/dist/ui/index.js.map +1 -0
  46. package/dist/ui/parse-stdout.d.ts +3 -0
  47. package/dist/ui/parse-stdout.d.ts.map +1 -0
  48. package/dist/ui/parse-stdout.js +247 -0
  49. package/dist/ui/parse-stdout.js.map +1 -0
  50. package/package.json +61 -0
  51. package/skills/para-memory-files/SKILL.md +114 -0
  52. package/skills/para-memory-files/references/schemas.md +35 -0
  53. package/skills/rudder/SKILL.md +265 -0
  54. package/skills/rudder/references/api-reference.md +253 -0
  55. package/skills/rudder/references/cli-reference.md +67 -0
  56. package/skills/rudder/references/organization-skills.md +155 -0
  57. package/skills/rudder-create-agent/SKILL.md +166 -0
  58. package/skills/rudder-create-agent/references/api-reference.md +172 -0
  59. package/skills/rudder-create-agent/references/cli-reference.md +126 -0
  60. package/skills/rudder-create-plugin/SKILL.md +103 -0
@@ -0,0 +1,84 @@
1
+ import { DEFAULT_GEMINI_LOCAL_MODEL } from "../index.js";
2
+ function parseCommaArgs(value) {
3
+ return value
4
+ .split(",")
5
+ .map((item) => item.trim())
6
+ .filter(Boolean);
7
+ }
8
+ function parseEnvVars(text) {
9
+ const env = {};
10
+ for (const line of text.split(/\r?\n/)) {
11
+ const trimmed = line.trim();
12
+ if (!trimmed || trimmed.startsWith("#"))
13
+ continue;
14
+ const eq = trimmed.indexOf("=");
15
+ if (eq <= 0)
16
+ continue;
17
+ const key = trimmed.slice(0, eq).trim();
18
+ const value = trimmed.slice(eq + 1);
19
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
20
+ continue;
21
+ env[key] = value;
22
+ }
23
+ return env;
24
+ }
25
+ function parseEnvBindings(bindings) {
26
+ if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings))
27
+ return {};
28
+ const env = {};
29
+ for (const [key, raw] of Object.entries(bindings)) {
30
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
31
+ continue;
32
+ if (typeof raw === "string") {
33
+ env[key] = { type: "plain", value: raw };
34
+ continue;
35
+ }
36
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
37
+ continue;
38
+ const rec = raw;
39
+ if (rec.type === "plain" && typeof rec.value === "string") {
40
+ env[key] = { type: "plain", value: rec.value };
41
+ continue;
42
+ }
43
+ if (rec.type === "secret_ref" && typeof rec.secretId === "string") {
44
+ env[key] = {
45
+ type: "secret_ref",
46
+ secretId: rec.secretId,
47
+ ...(typeof rec.version === "number" || rec.version === "latest"
48
+ ? { version: rec.version }
49
+ : {}),
50
+ };
51
+ }
52
+ }
53
+ return env;
54
+ }
55
+ export function buildGeminiLocalConfig(v) {
56
+ const ac = {};
57
+ if (v.cwd)
58
+ ac.cwd = v.cwd;
59
+ if (v.instructionsFilePath)
60
+ ac.instructionsFilePath = v.instructionsFilePath;
61
+ if (v.promptTemplate)
62
+ ac.promptTemplate = v.promptTemplate;
63
+ if (v.bootstrapPrompt)
64
+ ac.bootstrapPromptTemplate = v.bootstrapPrompt;
65
+ ac.model = v.model || DEFAULT_GEMINI_LOCAL_MODEL;
66
+ ac.timeoutSec = 0;
67
+ ac.graceSec = 15;
68
+ const env = parseEnvBindings(v.envBindings);
69
+ const legacy = parseEnvVars(v.envVars);
70
+ for (const [key, value] of Object.entries(legacy)) {
71
+ if (!Object.prototype.hasOwnProperty.call(env, key)) {
72
+ env[key] = { type: "plain", value };
73
+ }
74
+ }
75
+ if (Object.keys(env).length > 0)
76
+ ac.env = env;
77
+ ac.sandbox = !v.dangerouslyBypassSandbox;
78
+ if (v.command)
79
+ ac.command = v.command;
80
+ if (v.extraArgs)
81
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
82
+ return ac;
83
+ }
84
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseGeminiStdoutLine } from "./parse-stdout.js";
2
+ export { buildGeminiLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseGeminiStdoutLine } from "./parse-stdout.js";
2
+ export { buildGeminiLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@rudderhq/agent-runtime-utils";
2
+ export declare function parseGeminiStdoutLine(line: string, ts: string): TranscriptEntry[];
3
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAkNrE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CA+DjF"}
@@ -0,0 +1,247 @@
1
+ function safeJsonParse(text) {
2
+ try {
3
+ return JSON.parse(text);
4
+ }
5
+ catch {
6
+ return null;
7
+ }
8
+ }
9
+ function asRecord(value) {
10
+ if (typeof value !== "object" || value === null || Array.isArray(value))
11
+ return null;
12
+ return value;
13
+ }
14
+ function asString(value, fallback = "") {
15
+ return typeof value === "string" ? value : fallback;
16
+ }
17
+ function asNumber(value, fallback = 0) {
18
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
19
+ }
20
+ function stringifyUnknown(value) {
21
+ if (typeof value === "string")
22
+ return value;
23
+ if (value === null || value === undefined)
24
+ return "";
25
+ try {
26
+ return JSON.stringify(value, null, 2);
27
+ }
28
+ catch {
29
+ return String(value);
30
+ }
31
+ }
32
+ function errorText(value) {
33
+ if (typeof value === "string")
34
+ return value;
35
+ const rec = asRecord(value);
36
+ if (!rec)
37
+ return "";
38
+ const msg = (typeof rec.message === "string" && rec.message) ||
39
+ (typeof rec.error === "string" && rec.error) ||
40
+ (typeof rec.code === "string" && rec.code) ||
41
+ "";
42
+ if (msg)
43
+ return msg;
44
+ try {
45
+ return JSON.stringify(rec);
46
+ }
47
+ catch {
48
+ return "";
49
+ }
50
+ }
51
+ function collectTextEntries(messageRaw, ts, kind) {
52
+ if (typeof messageRaw === "string") {
53
+ const text = messageRaw.trim();
54
+ return text ? [{ kind, ts, text }] : [];
55
+ }
56
+ const message = asRecord(messageRaw);
57
+ if (!message)
58
+ return [];
59
+ const entries = [];
60
+ const directText = asString(message.text).trim();
61
+ if (directText)
62
+ entries.push({ kind, ts, text: directText });
63
+ const content = Array.isArray(message.content) ? message.content : [];
64
+ for (const partRaw of content) {
65
+ const part = asRecord(partRaw);
66
+ if (!part)
67
+ continue;
68
+ const type = asString(part.type).trim();
69
+ if (type !== "output_text" && type !== "text" && type !== "content")
70
+ continue;
71
+ const text = asString(part.text).trim() || asString(part.content).trim();
72
+ if (text)
73
+ entries.push({ kind, ts, text });
74
+ }
75
+ return entries;
76
+ }
77
+ function parseAssistantMessage(messageRaw, ts) {
78
+ if (typeof messageRaw === "string") {
79
+ const text = messageRaw.trim();
80
+ return text ? [{ kind: "assistant", ts, text }] : [];
81
+ }
82
+ const message = asRecord(messageRaw);
83
+ if (!message)
84
+ return [];
85
+ const entries = [];
86
+ const directText = asString(message.text).trim();
87
+ if (directText)
88
+ entries.push({ kind: "assistant", ts, text: directText });
89
+ const content = Array.isArray(message.content) ? message.content : [];
90
+ for (const partRaw of content) {
91
+ const part = asRecord(partRaw);
92
+ if (!part)
93
+ continue;
94
+ const type = asString(part.type).trim();
95
+ if (type === "output_text" || type === "text" || type === "content") {
96
+ const text = asString(part.text).trim() || asString(part.content).trim();
97
+ if (text)
98
+ entries.push({ kind: "assistant", ts, text });
99
+ continue;
100
+ }
101
+ if (type === "thinking") {
102
+ const text = asString(part.text).trim();
103
+ if (text)
104
+ entries.push({ kind: "thinking", ts, text });
105
+ continue;
106
+ }
107
+ if (type === "tool_call") {
108
+ const name = asString(part.name, asString(part.tool, "tool"));
109
+ entries.push({
110
+ kind: "tool_call",
111
+ ts,
112
+ name,
113
+ input: part.input ?? part.arguments ?? part.args ?? {},
114
+ });
115
+ continue;
116
+ }
117
+ if (type === "tool_result" || type === "tool_response") {
118
+ const toolUseId = asString(part.tool_use_id) ||
119
+ asString(part.toolUseId) ||
120
+ asString(part.call_id) ||
121
+ asString(part.id) ||
122
+ "tool_result";
123
+ const contentText = asString(part.output) ||
124
+ asString(part.text) ||
125
+ asString(part.result) ||
126
+ stringifyUnknown(part.output ?? part.result ?? part.text ?? part.response);
127
+ const isError = part.is_error === true || asString(part.status).toLowerCase() === "error";
128
+ entries.push({
129
+ kind: "tool_result",
130
+ ts,
131
+ toolUseId,
132
+ content: contentText,
133
+ isError,
134
+ });
135
+ }
136
+ }
137
+ return entries;
138
+ }
139
+ function parseTopLevelToolEvent(parsed, ts) {
140
+ const subtype = asString(parsed.subtype).trim().toLowerCase();
141
+ const callId = asString(parsed.call_id, asString(parsed.callId, asString(parsed.id, "tool_call")));
142
+ const toolCall = asRecord(parsed.tool_call ?? parsed.toolCall);
143
+ if (!toolCall) {
144
+ return [{ kind: "system", ts, text: `tool_call${subtype ? ` (${subtype})` : ""}` }];
145
+ }
146
+ const [toolName] = Object.keys(toolCall);
147
+ if (!toolName) {
148
+ return [{ kind: "system", ts, text: `tool_call${subtype ? ` (${subtype})` : ""}` }];
149
+ }
150
+ const payload = asRecord(toolCall[toolName]) ?? {};
151
+ if (subtype === "started" || subtype === "start") {
152
+ return [{
153
+ kind: "tool_call",
154
+ ts,
155
+ name: toolName,
156
+ input: payload.args ?? payload.input ?? payload.arguments ?? payload,
157
+ }];
158
+ }
159
+ if (subtype === "completed" || subtype === "complete" || subtype === "finished") {
160
+ const result = payload.result ?? payload.output ?? payload.error;
161
+ const isError = parsed.is_error === true ||
162
+ payload.is_error === true ||
163
+ payload.error !== undefined ||
164
+ asString(payload.status).toLowerCase() === "error";
165
+ return [{
166
+ kind: "tool_result",
167
+ ts,
168
+ toolUseId: callId,
169
+ content: result !== undefined ? stringifyUnknown(result) : `${toolName} completed`,
170
+ isError,
171
+ }];
172
+ }
173
+ return [{ kind: "system", ts, text: `tool_call${subtype ? ` (${subtype})` : ""}: ${toolName}` }];
174
+ }
175
+ function readSessionId(parsed) {
176
+ return (asString(parsed.session_id) ||
177
+ asString(parsed.sessionId) ||
178
+ asString(parsed.sessionID) ||
179
+ asString(parsed.checkpoint_id) ||
180
+ asString(parsed.thread_id));
181
+ }
182
+ function readUsage(parsed) {
183
+ const usage = asRecord(parsed.usage) ?? asRecord(parsed.usageMetadata);
184
+ const usageMetadata = asRecord(usage?.usageMetadata);
185
+ const source = usageMetadata ?? usage ?? {};
186
+ return {
187
+ inputTokens: asNumber(source.input_tokens, asNumber(source.inputTokens, asNumber(source.promptTokenCount))),
188
+ outputTokens: asNumber(source.output_tokens, asNumber(source.outputTokens, asNumber(source.candidatesTokenCount))),
189
+ cachedTokens: asNumber(source.cached_input_tokens, asNumber(source.cachedInputTokens, asNumber(source.cachedContentTokenCount))),
190
+ };
191
+ }
192
+ export function parseGeminiStdoutLine(line, ts) {
193
+ const parsed = asRecord(safeJsonParse(line));
194
+ if (!parsed) {
195
+ return [{ kind: "stdout", ts, text: line }];
196
+ }
197
+ const type = asString(parsed.type);
198
+ if (type === "system") {
199
+ const subtype = asString(parsed.subtype);
200
+ if (subtype === "init") {
201
+ const sessionId = readSessionId(parsed);
202
+ return [{ kind: "init", ts, model: asString(parsed.model, "gemini"), sessionId }];
203
+ }
204
+ if (subtype === "error") {
205
+ const text = errorText(parsed.error ?? parsed.message ?? parsed.detail);
206
+ return [{ kind: "stderr", ts, text: text || "error" }];
207
+ }
208
+ return [{ kind: "system", ts, text: `system: ${subtype || "event"}` }];
209
+ }
210
+ if (type === "assistant") {
211
+ return parseAssistantMessage(parsed.message, ts);
212
+ }
213
+ if (type === "user") {
214
+ return collectTextEntries(parsed.message, ts, "user");
215
+ }
216
+ if (type === "thinking") {
217
+ const text = asString(parsed.text).trim() || asString(asRecord(parsed.delta)?.text).trim();
218
+ return text ? [{ kind: "thinking", ts, text }] : [];
219
+ }
220
+ if (type === "tool_call") {
221
+ return parseTopLevelToolEvent(parsed, ts);
222
+ }
223
+ if (type === "result") {
224
+ const usage = readUsage(parsed);
225
+ const errors = parsed.is_error === true
226
+ ? [errorText(parsed.error ?? parsed.message ?? parsed.result)].filter(Boolean)
227
+ : [];
228
+ return [{
229
+ kind: "result",
230
+ ts,
231
+ text: asString(parsed.result) || asString(parsed.text) || asString(parsed.response),
232
+ inputTokens: usage.inputTokens,
233
+ outputTokens: usage.outputTokens,
234
+ cachedTokens: usage.cachedTokens,
235
+ costUsd: asNumber(parsed.total_cost_usd, asNumber(parsed.cost_usd, asNumber(parsed.cost))),
236
+ subtype: asString(parsed.subtype, "result"),
237
+ isError: parsed.is_error === true,
238
+ errors,
239
+ }];
240
+ }
241
+ if (type === "error") {
242
+ const text = errorText(parsed.error ?? parsed.message ?? parsed.detail);
243
+ return [{ kind: "stderr", ts, text: text || "error" }];
244
+ }
245
+ return [{ kind: "stdout", ts, text: line }];
246
+ }
247
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@rudderhq/agent-runtime-gemini-local",
3
+ "version": "0.1.0-canary.0",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "homepage": "https://github.com/Undertone0809/rudder",
6
+ "bugs": {
7
+ "url": "https://github.com/Undertone0809/rudder/issues"
8
+ },
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/Undertone0809/rudder",
12
+ "directory": "packages/agent-runtimes/gemini-local"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ ".": "./src/index.ts",
17
+ "./server": "./src/server/index.ts",
18
+ "./ui": "./src/ui/index.ts",
19
+ "./cli": "./src/cli/index.ts"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public",
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js"
27
+ },
28
+ "./server": {
29
+ "types": "./dist/server/index.d.ts",
30
+ "import": "./dist/server/index.js"
31
+ },
32
+ "./ui": {
33
+ "types": "./dist/ui/index.d.ts",
34
+ "import": "./dist/ui/index.js"
35
+ },
36
+ "./cli": {
37
+ "types": "./dist/cli/index.d.ts",
38
+ "import": "./dist/cli/index.js"
39
+ }
40
+ },
41
+ "main": "./dist/index.js",
42
+ "types": "./dist/index.d.ts"
43
+ },
44
+ "files": [
45
+ "dist",
46
+ "skills"
47
+ ],
48
+ "scripts": {
49
+ "build": "tsc",
50
+ "clean": "rm -rf dist",
51
+ "typecheck": "tsc --noEmit"
52
+ },
53
+ "dependencies": {
54
+ "@rudderhq/agent-runtime-utils": "0.1.0-canary.0",
55
+ "picocolors": "^1.1.1"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "^24.12.0",
59
+ "typescript": "^5.9.3"
60
+ }
61
+ }
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: para-memory-files
3
+ description: >
4
+ File-based memory system using Tiago Forte's PARA method. Use this skill
5
+ whenever you need to store, retrieve, update, or organize knowledge across
6
+ sessions. Covers three memory layers: (1) Knowledge graph in PARA folders
7
+ with atomic YAML facts, (2) Daily notes as raw timeline, (3) Tacit
8
+ knowledge about user patterns. Also handles planning files, memory decay,
9
+ weekly synthesis, and file-based recall. Trigger on any memory operation:
10
+ saving facts, writing daily notes, creating entities, running weekly
11
+ synthesis, recalling past context, or managing plans.
12
+ allowed-tools: []
13
+ disable: true
14
+ ---
15
+
16
+ # PARA Memory Files
17
+
18
+ Persistent, file-based memory organized by Tiago Forte's PARA method. Three layers: a knowledge graph, daily notes, and tacit knowledge. All paths are relative to `$AGENT_HOME`.
19
+
20
+ ## Three Memory Layers
21
+
22
+ ### Layer 1: Knowledge Graph (`$AGENT_HOME/life/` -- PARA)
23
+
24
+ Entity-based storage. Each entity gets a folder with two tiers:
25
+
26
+ 1. `summary.md` -- quick context, load first.
27
+ 2. `items.yaml` -- atomic facts, load on demand.
28
+
29
+ ```text
30
+ $AGENT_HOME/life/
31
+ projects/ # Active work with clear goals/deadlines
32
+ <name>/
33
+ summary.md
34
+ items.yaml
35
+ areas/ # Ongoing responsibilities, no end date
36
+ people/<name>/
37
+ companies/<name>/
38
+ resources/ # Reference material, topics of interest
39
+ <topic>/
40
+ archives/ # Inactive items from the other three
41
+ index.md
42
+ ```
43
+
44
+ **PARA rules:**
45
+
46
+ - **Projects** -- active work with a goal or deadline. Move to archives when complete.
47
+ - **Areas** -- ongoing (people, companies, responsibilities). No end date.
48
+ - **Resources** -- reference material, topics of interest.
49
+ - **Archives** -- inactive items from any category.
50
+
51
+ **Fact rules:**
52
+
53
+ - Save durable facts immediately to `items.yaml`.
54
+ - Weekly: rewrite `summary.md` from active facts.
55
+ - Never delete facts. Supersede instead (`status: superseded`, add `superseded_by`).
56
+ - When an entity goes inactive, move its folder to `$AGENT_HOME/life/archives/`.
57
+
58
+ **When to create an entity:**
59
+
60
+ - Mentioned 3+ times, OR
61
+ - Direct relationship to the user (family, coworker, partner, client), OR
62
+ - Significant project or company in the user's life.
63
+ - Otherwise, note it in daily notes.
64
+
65
+ For the atomic fact YAML schema and memory decay rules, see [references/schemas.md](references/schemas.md).
66
+
67
+ ### Layer 2: Daily Notes (`$AGENT_HOME/memory/YYYY-MM-DD.md`)
68
+
69
+ Raw timeline of events -- the "when" layer.
70
+
71
+ - Write continuously during conversations.
72
+ - Extract durable facts to Layer 1 during heartbeats.
73
+
74
+ ### Layer 3: Tacit Knowledge (`$AGENT_HOME/MEMORY.md`)
75
+
76
+ How the user operates -- patterns, preferences, lessons learned.
77
+
78
+ - Not facts about the world; facts about the user.
79
+ - Update whenever you learn new operating patterns.
80
+
81
+ ## Write It Down -- No Mental Notes
82
+
83
+ Memory does not survive session restarts. Files do.
84
+
85
+ - Want to remember something -> WRITE IT TO A FILE.
86
+ - "Remember this" -> update `$AGENT_HOME/memory/YYYY-MM-DD.md` or the relevant entity file.
87
+ - Learn a lesson -> update AGENTS.md, TOOLS.md, or the relevant skill file.
88
+ - Make a mistake -> document it so future-you does not repeat it.
89
+ - On-disk text files are always better than holding it in temporary context.
90
+
91
+ ## Memory Recall -- Use The Files Directly
92
+
93
+ Use the on-disk structure directly. Do not require a semantic index just to
94
+ recall memory.
95
+
96
+ Recall order:
97
+
98
+ 1. If you already know the entity, open `summary.md` first, then `items.yaml`
99
+ only if the summary is insufficient.
100
+ 2. For recent events, read today's and nearby `memory/YYYY-MM-DD.md` files.
101
+ 3. For unknown keywords or broad recall, use `rg` across `$AGENT_HOME/life/`
102
+ and `$AGENT_HOME/memory/`.
103
+
104
+ ```bash
105
+ rg -n "Christmas" "$AGENT_HOME/life" "$AGENT_HOME/memory"
106
+ rg -n "specific phrase" "$AGENT_HOME/life" "$AGENT_HOME/memory"
107
+ ```
108
+
109
+ The files are the source of truth. Search is only a way to locate the right
110
+ file, then verify against the stored fact or note.
111
+
112
+ ## Planning
113
+
114
+ Keep shared plans in timestamped files under `$RUDDER_ORG_PLANS_DIR` when that path is available, not in ad-hoc repo or project-root `plans/` folders. These plan files are shared workspace artifacts, not personal memory. Use `rg` to search plan files and prefer the newest dated file when several match. Plans go stale -- if a newer plan exists, do not confuse yourself with an older version. If you notice staleness, update the file to note what it is supersededBy.
@@ -0,0 +1,35 @@
1
+ # Schemas and Memory Decay
2
+
3
+ ## Atomic Fact Schema (items.yaml)
4
+
5
+ ```yaml
6
+ - id: entity-001
7
+ fact: "The actual fact"
8
+ category: relationship | milestone | status | preference
9
+ timestamp: "YYYY-MM-DD"
10
+ source: "YYYY-MM-DD"
11
+ status: active # active | superseded
12
+ superseded_by: null # e.g. entity-002
13
+ related_entities:
14
+ - companies/acme
15
+ - people/jeff
16
+ last_accessed: "YYYY-MM-DD"
17
+ access_count: 0
18
+ ```
19
+
20
+ ## Memory Decay
21
+
22
+ Facts decay in retrieval priority over time so stale info does not crowd out recent context.
23
+
24
+ **Access tracking:** When a fact is used in conversation, bump `access_count` and set `last_accessed` to today. During heartbeat extraction, scan the session for referenced entity facts and update their access metadata.
25
+
26
+ **Recency tiers (for summary.md rewriting):**
27
+
28
+ - **Hot** (accessed in last 7 days) -- include prominently in summary.md.
29
+ - **Warm** (8-30 days ago) -- include at lower priority.
30
+ - **Cold** (30+ days or never accessed) -- omit from summary.md. Still in items.yaml, retrievable on demand.
31
+ - High `access_count` resists decay -- frequently used facts stay warm longer.
32
+
33
+ **Weekly synthesis:** Sort by recency tier, then by access_count within tier. Cold facts drop out of the summary but remain in items.yaml. Accessing a cold fact reheats it.
34
+
35
+ No deletion. Decay only affects retrieval priority via summary.md curation. The full record always lives in items.yaml.