praana 0.5.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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +124 -0
  3. package/bin/praana.js +17 -0
  4. package/bin/pran.js +17 -0
  5. package/dist/app-banner.d.ts +11 -0
  6. package/dist/app-banner.js +161 -0
  7. package/dist/app-controller.d.ts +44 -0
  8. package/dist/app-controller.js +143 -0
  9. package/dist/app-identity.d.ts +18 -0
  10. package/dist/app-identity.js +52 -0
  11. package/dist/auto-compact.d.ts +16 -0
  12. package/dist/auto-compact.js +101 -0
  13. package/dist/cli-args.d.ts +14 -0
  14. package/dist/cli-args.js +69 -0
  15. package/dist/compile-classic.d.ts +21 -0
  16. package/dist/compile-classic.js +106 -0
  17. package/dist/compiler.d.ts +75 -0
  18. package/dist/compiler.js +406 -0
  19. package/dist/config.d.ts +3 -0
  20. package/dist/config.js +433 -0
  21. package/dist/context-engine/activity-log.d.ts +9 -0
  22. package/dist/context-engine/activity-log.js +109 -0
  23. package/dist/context-engine/artifact-store.d.ts +32 -0
  24. package/dist/context-engine/artifact-store.js +272 -0
  25. package/dist/context-engine/bm25.d.ts +3 -0
  26. package/dist/context-engine/bm25.js +32 -0
  27. package/dist/context-engine/checkpoint.d.ts +34 -0
  28. package/dist/context-engine/checkpoint.js +430 -0
  29. package/dist/context-engine/classify.d.ts +3 -0
  30. package/dist/context-engine/classify.js +60 -0
  31. package/dist/context-engine/db.d.ts +73 -0
  32. package/dist/context-engine/db.js +505 -0
  33. package/dist/context-engine/distiller.d.ts +30 -0
  34. package/dist/context-engine/distiller.js +67 -0
  35. package/dist/context-engine/engine-compiler.d.ts +23 -0
  36. package/dist/context-engine/engine-compiler.js +297 -0
  37. package/dist/context-engine/error-tracker.d.ts +21 -0
  38. package/dist/context-engine/error-tracker.js +74 -0
  39. package/dist/context-engine/event-lineage.d.ts +26 -0
  40. package/dist/context-engine/event-lineage.js +120 -0
  41. package/dist/context-engine/extraction.d.ts +26 -0
  42. package/dist/context-engine/extraction.js +83 -0
  43. package/dist/context-engine/index.d.ts +82 -0
  44. package/dist/context-engine/index.js +238 -0
  45. package/dist/context-engine/scoring.d.ts +13 -0
  46. package/dist/context-engine/scoring.js +47 -0
  47. package/dist/context-engine/state-snapshot.d.ts +8 -0
  48. package/dist/context-engine/state-snapshot.js +50 -0
  49. package/dist/context-engine/summarize.d.ts +6 -0
  50. package/dist/context-engine/summarize.js +32 -0
  51. package/dist/context-engine/telemetry.d.ts +25 -0
  52. package/dist/context-engine/telemetry.js +64 -0
  53. package/dist/context-engine/turn-digest.d.ts +50 -0
  54. package/dist/context-engine/turn-digest.js +250 -0
  55. package/dist/context-engine/turn-ledger.d.ts +18 -0
  56. package/dist/context-engine/turn-ledger.js +184 -0
  57. package/dist/context-engine/turn-recorder.d.ts +24 -0
  58. package/dist/context-engine/turn-recorder.js +88 -0
  59. package/dist/context-engine/types.d.ts +201 -0
  60. package/dist/context-engine/types.js +4 -0
  61. package/dist/context-pressure.d.ts +19 -0
  62. package/dist/context-pressure.js +36 -0
  63. package/dist/distillers/generic.d.ts +14 -0
  64. package/dist/distillers/generic.js +93 -0
  65. package/dist/distillers/git-diff.d.ts +8 -0
  66. package/dist/distillers/git-diff.js +119 -0
  67. package/dist/distillers/index.d.ts +2 -0
  68. package/dist/distillers/index.js +16 -0
  69. package/dist/distillers/npm-test.d.ts +8 -0
  70. package/dist/distillers/npm-test.js +50 -0
  71. package/dist/distillers/rg-results.d.ts +8 -0
  72. package/dist/distillers/rg-results.js +28 -0
  73. package/dist/distillers/tsc-errors.d.ts +8 -0
  74. package/dist/distillers/tsc-errors.js +52 -0
  75. package/dist/event-log.d.ts +56 -0
  76. package/dist/event-log.js +214 -0
  77. package/dist/llm.d.ts +29 -0
  78. package/dist/llm.js +155 -0
  79. package/dist/logger.d.ts +94 -0
  80. package/dist/logger.js +287 -0
  81. package/dist/main.d.ts +1 -0
  82. package/dist/main.js +54 -0
  83. package/dist/memory/confidence.d.ts +7 -0
  84. package/dist/memory/confidence.js +37 -0
  85. package/dist/memory/consolidation.d.ts +26 -0
  86. package/dist/memory/consolidation.js +166 -0
  87. package/dist/memory/db.d.ts +40 -0
  88. package/dist/memory/db.js +283 -0
  89. package/dist/memory/dedup.d.ts +6 -0
  90. package/dist/memory/dedup.js +50 -0
  91. package/dist/memory/embedder-factory.d.ts +3 -0
  92. package/dist/memory/embedder-factory.js +81 -0
  93. package/dist/memory/embeddings.d.ts +15 -0
  94. package/dist/memory/embeddings.js +67 -0
  95. package/dist/memory/index.d.ts +9 -0
  96. package/dist/memory/index.js +11 -0
  97. package/dist/memory/ollama-summarizer.d.ts +19 -0
  98. package/dist/memory/ollama-summarizer.js +72 -0
  99. package/dist/memory/openai-summarizer.d.ts +21 -0
  100. package/dist/memory/openai-summarizer.js +51 -0
  101. package/dist/memory/store.d.ts +61 -0
  102. package/dist/memory/store.js +502 -0
  103. package/dist/memory/summarizer-factory.d.ts +3 -0
  104. package/dist/memory/summarizer-factory.js +69 -0
  105. package/dist/memory/summarizer.d.ts +4 -0
  106. package/dist/memory/summarizer.js +112 -0
  107. package/dist/memory/types.d.ts +87 -0
  108. package/dist/memory/types.js +17 -0
  109. package/dist/model-context.d.ts +15 -0
  110. package/dist/model-context.js +212 -0
  111. package/dist/project-detector.d.ts +37 -0
  112. package/dist/project-detector.js +604 -0
  113. package/dist/render.d.ts +15 -0
  114. package/dist/render.js +46 -0
  115. package/dist/session.d.ts +118 -0
  116. package/dist/session.js +809 -0
  117. package/dist/skills/index.d.ts +69 -0
  118. package/dist/skills/index.js +885 -0
  119. package/dist/skills/types.d.ts +93 -0
  120. package/dist/skills/types.js +8 -0
  121. package/dist/slash-commands.d.ts +14 -0
  122. package/dist/slash-commands.js +301 -0
  123. package/dist/state-graph.d.ts +38 -0
  124. package/dist/state-graph.js +255 -0
  125. package/dist/status-bar.d.ts +54 -0
  126. package/dist/status-bar.js +184 -0
  127. package/dist/thinking-display.d.ts +21 -0
  128. package/dist/thinking-display.js +37 -0
  129. package/dist/tool-summary.d.ts +4 -0
  130. package/dist/tool-summary.js +67 -0
  131. package/dist/tools/index.d.ts +925 -0
  132. package/dist/tools/index.js +86 -0
  133. package/dist/tools/knowledge.d.ts +140 -0
  134. package/dist/tools/knowledge.js +260 -0
  135. package/dist/tools/memory.d.ts +39 -0
  136. package/dist/tools/memory.js +300 -0
  137. package/dist/tools/search-code.d.ts +134 -0
  138. package/dist/tools/search-code.js +390 -0
  139. package/dist/tools/system.d.ts +16 -0
  140. package/dist/tools/system.js +499 -0
  141. package/dist/tools/tool-def.d.ts +6 -0
  142. package/dist/tools/tool-def.js +3 -0
  143. package/dist/turn-control.d.ts +51 -0
  144. package/dist/turn-control.js +210 -0
  145. package/dist/turn.d.ts +20 -0
  146. package/dist/turn.js +624 -0
  147. package/dist/types.d.ts +233 -0
  148. package/dist/types.js +4 -0
  149. package/dist/ui/readline-ui.d.ts +2 -0
  150. package/dist/ui/readline-ui.js +176 -0
  151. package/dist/ui/tui/app.d.ts +13 -0
  152. package/dist/ui/tui/app.js +270 -0
  153. package/dist/ui/tui/busy-indicator.d.ts +2 -0
  154. package/dist/ui/tui/busy-indicator.js +13 -0
  155. package/dist/ui/tui/components/gutter-rule.d.ts +5 -0
  156. package/dist/ui/tui/components/gutter-rule.js +9 -0
  157. package/dist/ui/tui/components/inline-tool-row.d.ts +10 -0
  158. package/dist/ui/tui/components/inline-tool-row.js +8 -0
  159. package/dist/ui/tui/components/prompt-input.d.ts +20 -0
  160. package/dist/ui/tui/components/prompt-input.js +120 -0
  161. package/dist/ui/tui/components/system-line.d.ts +5 -0
  162. package/dist/ui/tui/components/system-line.js +6 -0
  163. package/dist/ui/tui/components/thinking-block.d.ts +11 -0
  164. package/dist/ui/tui/components/thinking-block.js +31 -0
  165. package/dist/ui/tui/components/toast-line.d.ts +4 -0
  166. package/dist/ui/tui/components/toast-line.js +8 -0
  167. package/dist/ui/tui/components/tool-result-line.d.ts +5 -0
  168. package/dist/ui/tui/components/tool-result-line.js +6 -0
  169. package/dist/ui/tui/components/turn-footer.d.ts +5 -0
  170. package/dist/ui/tui/components/turn-footer.js +7 -0
  171. package/dist/ui/tui/components/user-block.d.ts +6 -0
  172. package/dist/ui/tui/components/user-block.js +6 -0
  173. package/dist/ui/tui/logo-banner.d.ts +5 -0
  174. package/dist/ui/tui/logo-banner.js +8 -0
  175. package/dist/ui/tui/markdown-render.d.ts +16 -0
  176. package/dist/ui/tui/markdown-render.js +218 -0
  177. package/dist/ui/tui/palette.d.ts +12 -0
  178. package/dist/ui/tui/palette.js +13 -0
  179. package/dist/ui/tui/reasoning-summary.d.ts +12 -0
  180. package/dist/ui/tui/reasoning-summary.js +27 -0
  181. package/dist/ui/tui/reducer.d.ts +92 -0
  182. package/dist/ui/tui/reducer.js +260 -0
  183. package/dist/ui/tui/run.d.ts +3 -0
  184. package/dist/ui/tui/run.js +40 -0
  185. package/dist/ui/tui/sink.d.ts +4 -0
  186. package/dist/ui/tui/sink.js +89 -0
  187. package/dist/ui/tui/status-bar-view.d.ts +5 -0
  188. package/dist/ui/tui/status-bar-view.js +44 -0
  189. package/dist/ui/tui/terminal-height.d.ts +12 -0
  190. package/dist/ui/tui/terminal-height.js +20 -0
  191. package/dist/ui/tui/terminal-width.d.ts +2 -0
  192. package/dist/ui/tui/terminal-width.js +5 -0
  193. package/dist/ui/tui/tool-display.d.ts +23 -0
  194. package/dist/ui/tui/tool-display.js +217 -0
  195. package/dist/ui/tui/transcript-line.d.ts +12 -0
  196. package/dist/ui/tui/transcript-line.js +43 -0
  197. package/dist/ui/tui/transcript-replay.d.ts +12 -0
  198. package/dist/ui/tui/transcript-replay.js +117 -0
  199. package/dist/ui-events.d.ts +39 -0
  200. package/dist/ui-events.js +33 -0
  201. package/dist/ui.d.ts +77 -0
  202. package/dist/ui.js +179 -0
  203. package/package.json +73 -0
  204. package/praana.config.example.toml +231 -0
@@ -0,0 +1,86 @@
1
+ import { createMemoryTools } from "./memory.js";
2
+ import { createKnowledgeTools } from "./knowledge.js";
3
+ import { createSystemTools } from "./system.js";
4
+ import { createSearchCodeTool } from "./search-code.js";
5
+ export function createAllTools(ctx) {
6
+ const classicMode = ctx.classicMode ?? false;
7
+ const memoryTools = createMemoryTools({
8
+ eventLog: ctx.eventLog,
9
+ stateGraph: ctx.stateGraph,
10
+ includeWorkingMemoryTools: !classicMode,
11
+ searchTurnEvents: ctx.contextEngine
12
+ ? (query, limit, currentTurn) => ctx.contextEngine.searchTurnEvents(query, limit, currentTurn ?? ctx.getCurrentTurn?.() ?? 0)
13
+ : undefined,
14
+ });
15
+ const knowledgeTools = createKnowledgeTools({
16
+ eventLog: ctx.eventLog,
17
+ memoryStore: ctx.memoryStore,
18
+ memoryEnabled: ctx.memoryEnabled,
19
+ incognito: ctx.incognito,
20
+ contextEngine: ctx.contextEngine,
21
+ getCurrentTurn: ctx.getCurrentTurn ?? (() => 0),
22
+ });
23
+ const systemTools = createSystemTools({
24
+ cwd: ctx.cwd,
25
+ getAbortSignal: ctx.getAbortSignal,
26
+ sandbox: ctx.sandbox,
27
+ editConfirm: ctx.editConfirm,
28
+ });
29
+ const searchCodeTools = createSearchCodeTool({
30
+ cwd: ctx.cwd,
31
+ getAbortSignal: ctx.getAbortSignal,
32
+ sandbox: ctx.sandbox,
33
+ rgPath: ctx.searchCode?.rg_path,
34
+ });
35
+ return {
36
+ ...memoryTools,
37
+ ...knowledgeTools,
38
+ ...systemTools,
39
+ ...searchCodeTools,
40
+ };
41
+ }
42
+ const WORKING_MEMORY_TOOL_DESCRIPTIONS = [
43
+ "create_task(title, description?) — Create a new task",
44
+ "complete_task(id) — Mark a task as done",
45
+ "retract_task(id) — Retract a task/object from working memory (tombstone)",
46
+ "add_constraint(text) — Add a constraint",
47
+ "decide(summary, rationale) — Record a decision",
48
+ "add_note(text) — Add a note",
49
+ "soft_unload(id) — Demote object to soft tier",
50
+ "hard_unload(id) — Demote object to hard tier",
51
+ "hydrate(id) — Promote object back to active",
52
+ "list_state() — List all state objects",
53
+ "focus_task(id) — Pin a task/object as current focus",
54
+ ];
55
+ const SHARED_TOOL_DESCRIPTIONS = [
56
+ "search_session_log(query, kinds?, limit?) — Search current session event log (not cross-session recall)",
57
+ "read_and_summarize(path) — Read file and return structured summary (exports, imports, metrics)",
58
+ "recall(query, mode?, kinds?) — Search cross-session memory",
59
+ "remember(content, kind?, certainty?, scope?) — Store in cross-session memory (kinds: fact, preference, decision, pattern, mistake, constraint)",
60
+ "forget_memory(id) — Retract a cross-session memory entry (tombstone)",
61
+ "shell(command, timeout?) — Execute a shell command",
62
+ "read_file(path, offset?, limit?) — Read a file",
63
+ "write_file(path, content) — Write or overwrite a file",
64
+ "edit_file(path, oldText, newText) — Replace text in a file",
65
+ "batch_write(files) — Write multiple files atomically",
66
+ "batch_edit(edits) — Edit multiple files atomically",
67
+ "search_code(pattern, path?, glob?, glob_exclude?, case_insensitive?, context?, max_results?, file_type?, include_hidden?, no_ignore?, multiline?, timeout?) — Structured ripgrep-backed code search (file:line:column matches with context and stats)",
68
+ ];
69
+ const ENGINE_TOOL_DESCRIPTIONS = [
70
+ "search_turn_events(query, limit?) — BM25 search over structured turn ledger",
71
+ 'retrieve_artifact(id, grep?, lineStart?, lineEnd?, jsonPath?) — Retrieve full raw content for a stored tool-output artifact',
72
+ "context_summary() — Current session checkpoint, open errors, and recent activity",
73
+ "event_lineage(artifactId) — Trace artifact provenance, related decisions, and linked artifacts/files",
74
+ ];
75
+ /** Build a human-readable list of tool descriptions for the system prompt. */
76
+ export function describeTools(options) {
77
+ const classicMode = options?.classicMode ?? options?.contextEngineEnabled === false;
78
+ if (classicMode) {
79
+ return [...SHARED_TOOL_DESCRIPTIONS];
80
+ }
81
+ const tools = [...WORKING_MEMORY_TOOL_DESCRIPTIONS, ...SHARED_TOOL_DESCRIPTIONS];
82
+ if (options?.contextEngineEnabled) {
83
+ tools.push(...ENGINE_TOOL_DESCRIPTIONS);
84
+ }
85
+ return tools;
86
+ }
@@ -0,0 +1,140 @@
1
+ import type { MemoryStore } from "../memory/index.js";
2
+ import type { EventLog } from "../event-log.js";
3
+ import type { ContextEngine } from "../context-engine/index.js";
4
+ export interface KnowledgeToolContext {
5
+ eventLog: EventLog;
6
+ memoryStore: MemoryStore | null;
7
+ memoryEnabled: boolean;
8
+ incognito: boolean;
9
+ contextEngine: ContextEngine | null;
10
+ getCurrentTurn: () => number;
11
+ }
12
+ export declare function createKnowledgeTools(ctx: KnowledgeToolContext): {
13
+ forget_memory: import("./tool-def.js").ToolDefinition;
14
+ event_lineage: import("./tool-def.js").ToolDefinition;
15
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
16
+ context_summary: import("./tool-def.js").ToolDefinition;
17
+ search_turn_events: import("./tool-def.js").ToolDefinition;
18
+ recall: import("./tool-def.js").ToolDefinition;
19
+ remember: import("./tool-def.js").ToolDefinition;
20
+ } | {
21
+ forget_memory: import("./tool-def.js").ToolDefinition;
22
+ event_lineage?: undefined;
23
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
24
+ context_summary: import("./tool-def.js").ToolDefinition;
25
+ search_turn_events: import("./tool-def.js").ToolDefinition;
26
+ recall: import("./tool-def.js").ToolDefinition;
27
+ remember: import("./tool-def.js").ToolDefinition;
28
+ } | {
29
+ forget_memory: import("./tool-def.js").ToolDefinition;
30
+ event_lineage: import("./tool-def.js").ToolDefinition;
31
+ retrieve_artifact?: undefined;
32
+ context_summary: import("./tool-def.js").ToolDefinition;
33
+ search_turn_events: import("./tool-def.js").ToolDefinition;
34
+ recall: import("./tool-def.js").ToolDefinition;
35
+ remember: import("./tool-def.js").ToolDefinition;
36
+ } | {
37
+ forget_memory: import("./tool-def.js").ToolDefinition;
38
+ event_lineage?: undefined;
39
+ retrieve_artifact?: undefined;
40
+ context_summary: import("./tool-def.js").ToolDefinition;
41
+ search_turn_events: import("./tool-def.js").ToolDefinition;
42
+ recall: import("./tool-def.js").ToolDefinition;
43
+ remember: import("./tool-def.js").ToolDefinition;
44
+ } | {
45
+ forget_memory: import("./tool-def.js").ToolDefinition;
46
+ event_lineage: import("./tool-def.js").ToolDefinition;
47
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
48
+ context_summary?: undefined;
49
+ search_turn_events: import("./tool-def.js").ToolDefinition;
50
+ recall: import("./tool-def.js").ToolDefinition;
51
+ remember: import("./tool-def.js").ToolDefinition;
52
+ } | {
53
+ forget_memory: import("./tool-def.js").ToolDefinition;
54
+ event_lineage?: undefined;
55
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
56
+ context_summary?: undefined;
57
+ search_turn_events: import("./tool-def.js").ToolDefinition;
58
+ recall: import("./tool-def.js").ToolDefinition;
59
+ remember: import("./tool-def.js").ToolDefinition;
60
+ } | {
61
+ forget_memory: import("./tool-def.js").ToolDefinition;
62
+ event_lineage: import("./tool-def.js").ToolDefinition;
63
+ retrieve_artifact?: undefined;
64
+ context_summary?: undefined;
65
+ search_turn_events: import("./tool-def.js").ToolDefinition;
66
+ recall: import("./tool-def.js").ToolDefinition;
67
+ remember: import("./tool-def.js").ToolDefinition;
68
+ } | {
69
+ forget_memory: import("./tool-def.js").ToolDefinition;
70
+ event_lineage?: undefined;
71
+ retrieve_artifact?: undefined;
72
+ context_summary?: undefined;
73
+ search_turn_events: import("./tool-def.js").ToolDefinition;
74
+ recall: import("./tool-def.js").ToolDefinition;
75
+ remember: import("./tool-def.js").ToolDefinition;
76
+ } | {
77
+ forget_memory: import("./tool-def.js").ToolDefinition;
78
+ event_lineage: import("./tool-def.js").ToolDefinition;
79
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
80
+ context_summary: import("./tool-def.js").ToolDefinition;
81
+ search_turn_events?: undefined;
82
+ recall: import("./tool-def.js").ToolDefinition;
83
+ remember: import("./tool-def.js").ToolDefinition;
84
+ } | {
85
+ forget_memory: import("./tool-def.js").ToolDefinition;
86
+ event_lineage?: undefined;
87
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
88
+ context_summary: import("./tool-def.js").ToolDefinition;
89
+ search_turn_events?: undefined;
90
+ recall: import("./tool-def.js").ToolDefinition;
91
+ remember: import("./tool-def.js").ToolDefinition;
92
+ } | {
93
+ forget_memory: import("./tool-def.js").ToolDefinition;
94
+ event_lineage: import("./tool-def.js").ToolDefinition;
95
+ retrieve_artifact?: undefined;
96
+ context_summary: import("./tool-def.js").ToolDefinition;
97
+ search_turn_events?: undefined;
98
+ recall: import("./tool-def.js").ToolDefinition;
99
+ remember: import("./tool-def.js").ToolDefinition;
100
+ } | {
101
+ forget_memory: import("./tool-def.js").ToolDefinition;
102
+ event_lineage?: undefined;
103
+ retrieve_artifact?: undefined;
104
+ context_summary: import("./tool-def.js").ToolDefinition;
105
+ search_turn_events?: undefined;
106
+ recall: import("./tool-def.js").ToolDefinition;
107
+ remember: import("./tool-def.js").ToolDefinition;
108
+ } | {
109
+ forget_memory: import("./tool-def.js").ToolDefinition;
110
+ event_lineage: import("./tool-def.js").ToolDefinition;
111
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
112
+ context_summary?: undefined;
113
+ search_turn_events?: undefined;
114
+ recall: import("./tool-def.js").ToolDefinition;
115
+ remember: import("./tool-def.js").ToolDefinition;
116
+ } | {
117
+ forget_memory: import("./tool-def.js").ToolDefinition;
118
+ event_lineage?: undefined;
119
+ retrieve_artifact: import("./tool-def.js").ToolDefinition;
120
+ context_summary?: undefined;
121
+ search_turn_events?: undefined;
122
+ recall: import("./tool-def.js").ToolDefinition;
123
+ remember: import("./tool-def.js").ToolDefinition;
124
+ } | {
125
+ forget_memory: import("./tool-def.js").ToolDefinition;
126
+ event_lineage: import("./tool-def.js").ToolDefinition;
127
+ retrieve_artifact?: undefined;
128
+ context_summary?: undefined;
129
+ search_turn_events?: undefined;
130
+ recall: import("./tool-def.js").ToolDefinition;
131
+ remember: import("./tool-def.js").ToolDefinition;
132
+ } | {
133
+ forget_memory: import("./tool-def.js").ToolDefinition;
134
+ event_lineage?: undefined;
135
+ retrieve_artifact?: undefined;
136
+ context_summary?: undefined;
137
+ search_turn_events?: undefined;
138
+ recall: import("./tool-def.js").ToolDefinition;
139
+ remember: import("./tool-def.js").ToolDefinition;
140
+ };
@@ -0,0 +1,260 @@
1
+ import { defineTool } from "./tool-def.js";
2
+ import { z } from "zod";
3
+ export function createKnowledgeTools(ctx) {
4
+ const { eventLog, memoryStore, memoryEnabled, incognito, contextEngine, getCurrentTurn } = ctx;
5
+ const searchTurnEvents = contextEngine
6
+ ? {
7
+ search_turn_events: defineTool({
8
+ description: "Search the structured turn ledger for this session using BM25 ranking. " +
9
+ "Returns turn summaries with artifact IDs, files touched, and errors — faster than scanning raw events.jsonl.",
10
+ parameters: z.object({
11
+ query: z.string().describe("Search query"),
12
+ limit: z
13
+ .number()
14
+ .int()
15
+ .min(1)
16
+ .max(50)
17
+ .default(20)
18
+ .describe("Max matches to return"),
19
+ }),
20
+ execute: async ({ query, limit }) => {
21
+ const matches = contextEngine.searchTurnEvents(query, limit ?? 20, getCurrentTurn());
22
+ eventLog.append({
23
+ kind: "system_note",
24
+ actor: "kernel",
25
+ payload: {
26
+ type: "turn_ledger_search",
27
+ query,
28
+ hits: matches.length,
29
+ },
30
+ });
31
+ return {
32
+ ok: true,
33
+ query,
34
+ matchCount: matches.length,
35
+ matches,
36
+ };
37
+ },
38
+ }),
39
+ }
40
+ : {};
41
+ const contextSummary = contextEngine
42
+ ? {
43
+ context_summary: defineTool({
44
+ description: "Return the current session checkpoint summary: active intent, recent decisions, open errors, and recent activity.",
45
+ parameters: z.object({}),
46
+ execute: async () => {
47
+ const summary = contextEngine.renderContextSummary();
48
+ eventLog.append({
49
+ kind: "system_note",
50
+ actor: "kernel",
51
+ payload: { type: "context_summary" },
52
+ });
53
+ return { ok: true, summary };
54
+ },
55
+ }),
56
+ }
57
+ : {};
58
+ const retrieveArtifact = contextEngine
59
+ ? {
60
+ retrieve_artifact: defineTool({
61
+ description: "Retrieve the full raw content of a stored tool-output artifact by ID. Use when an artifact card in the prompt is insufficient.",
62
+ parameters: z.object({
63
+ id: z.string().describe("Artifact ID (e.g. art_abc123def456)"),
64
+ grep: z.string().optional().describe("Keep only lines matching this regex"),
65
+ lineStart: z.number().int().positive().optional().describe("First line to return (1-based)"),
66
+ lineEnd: z.number().int().positive().optional().describe("Last line to return (1-based)"),
67
+ jsonPath: z.string().optional().describe("Extract a value from JSON content (dot-separated path)"),
68
+ }),
69
+ execute: async ({ id, grep, lineStart, lineEnd, jsonPath }) => {
70
+ const retrieved = contextEngine.retrieveArtifact(id, getCurrentTurn(), {
71
+ grep,
72
+ lineStart,
73
+ lineEnd,
74
+ jsonPath,
75
+ });
76
+ if (!retrieved.ok) {
77
+ return { ok: false, error: retrieved.error };
78
+ }
79
+ eventLog.append({
80
+ kind: "system_note",
81
+ actor: "kernel",
82
+ payload: {
83
+ type: "artifact_retrieve",
84
+ id,
85
+ grep: grep ?? null,
86
+ lineStart: lineStart ?? null,
87
+ lineEnd: lineEnd ?? null,
88
+ jsonPath: jsonPath ?? null,
89
+ },
90
+ });
91
+ return { ok: true, id, content: retrieved.content };
92
+ },
93
+ }),
94
+ }
95
+ : {};
96
+ const eventLineage = contextEngine
97
+ ? {
98
+ event_lineage: defineTool({
99
+ description: "Trace an artifact back to the turn, tool call, decisions, and related artifacts/files that produced or used it.",
100
+ parameters: z.object({
101
+ artifactId: z.string().describe("Artifact ID (e.g. art_abc123def456)"),
102
+ }),
103
+ execute: async ({ artifactId }) => {
104
+ const result = contextEngine.eventLineage(artifactId, getCurrentTurn());
105
+ if (!result.ok) {
106
+ return { ok: false, error: result.error };
107
+ }
108
+ eventLog.append({
109
+ kind: "system_note",
110
+ actor: "kernel",
111
+ payload: {
112
+ type: "event_lineage",
113
+ artifactId,
114
+ producedTurn: result.lineage.producedTurn,
115
+ },
116
+ });
117
+ return {
118
+ ok: true,
119
+ lineage: result.lineage,
120
+ text: result.text,
121
+ };
122
+ },
123
+ }),
124
+ }
125
+ : {};
126
+ return {
127
+ recall: defineTool({
128
+ description: "Search your cross-session memory for past learnings, decisions, preferences, or patterns. Use when you need context from previous sessions.",
129
+ parameters: z.object({
130
+ query: z.string().describe("Search query"),
131
+ mode: z
132
+ .enum(["standard", "causal_chain"])
133
+ .optional()
134
+ .describe("Search mode"),
135
+ kinds: z
136
+ .array(z.string())
137
+ .optional()
138
+ .describe("Filter by kinds (fact, preference, decision, pattern, mistake, constraint)"),
139
+ }),
140
+ execute: async ({ query, kinds }) => {
141
+ if (!memoryEnabled || !memoryStore) {
142
+ return {
143
+ ok: false,
144
+ error: incognito
145
+ ? "Incognito mode is active — cross-session memory is disabled for this session."
146
+ : "Cross-session memory is not available.",
147
+ };
148
+ }
149
+ try {
150
+ const result = await memoryStore.recall(query, { limit: 10, kinds: kinds });
151
+ eventLog.append({
152
+ kind: "system_note",
153
+ actor: "kernel",
154
+ payload: {
155
+ type: "memory_recall",
156
+ query,
157
+ hits: result.entries.length,
158
+ },
159
+ });
160
+ if (result.entries.length === 0) {
161
+ return {
162
+ ok: true,
163
+ entries: [],
164
+ note: "No cross-session matches. If this was discussed earlier in this same session, use search_session_log(query, kinds?, limit?) to recover it from events.jsonl.",
165
+ };
166
+ }
167
+ return { ok: true, entries: result.entries };
168
+ }
169
+ catch (err) {
170
+ const message = err?.message ?? "Recall failed";
171
+ return {
172
+ ok: false,
173
+ error: `${message}. For same-session history, use search_session_log(query, kinds?, limit?) instead of recall.`,
174
+ };
175
+ }
176
+ },
177
+ }),
178
+ remember: defineTool({
179
+ description: "Store a fact, preference, decision, mistake, or pattern in your cross-session memory for future sessions.",
180
+ parameters: z.object({
181
+ content: z.string().describe("What to remember"),
182
+ kind: z
183
+ .enum(["preference", "context_fact", "decision", "mistake", "pattern", "fact", "constraint"])
184
+ .optional()
185
+ .describe("Type of knowledge"),
186
+ certainty: z
187
+ .enum(["high", "medium", "low"])
188
+ .optional()
189
+ .describe("How certain you are"),
190
+ scope: z
191
+ .array(z.string())
192
+ .optional()
193
+ .describe("Scope labels to isolate this memory (e.g. ['context:my-project']). Defaults to automatic scopes."),
194
+ }),
195
+ execute: async ({ content, kind, certainty, scope }) => {
196
+ if (!memoryEnabled || !memoryStore) {
197
+ return {
198
+ ok: false,
199
+ error: incognito
200
+ ? "Incognito mode is active — cross-session memory writes are disabled."
201
+ : "Cross-session memory is not available.",
202
+ };
203
+ }
204
+ try {
205
+ // Map bodha-style kinds to our kinds
206
+ const mappedKind = kind === "context_fact" ? "fact" :
207
+ kind ?? "fact";
208
+ const result = await memoryStore.remember(content, {
209
+ kind: mappedKind,
210
+ certainty: certainty ?? "medium",
211
+ scope: scope ?? undefined,
212
+ });
213
+ return { ok: true, id: result.id };
214
+ }
215
+ catch (err) {
216
+ return { ok: false, error: err?.message ?? "Remember failed" };
217
+ }
218
+ },
219
+ }),
220
+ ...searchTurnEvents,
221
+ ...contextSummary,
222
+ ...retrieveArtifact,
223
+ ...eventLineage,
224
+ forget_memory: defineTool({
225
+ description: "Retract (tombstone) a cross-session memory entry. The memory is excluded from future recall and digest, but retained for audit.",
226
+ parameters: z.object({
227
+ id: z.string().describe("Memory entry ID to retract"),
228
+ }),
229
+ execute: async ({ id }) => {
230
+ if (incognito) {
231
+ return {
232
+ ok: false,
233
+ error: "Memory is disabled in incognito mode.",
234
+ };
235
+ }
236
+ if (!memoryEnabled || !memoryStore) {
237
+ return {
238
+ ok: false,
239
+ error: "Cross-session memory is not available.",
240
+ };
241
+ }
242
+ try {
243
+ if (!memoryStore.hasEntry(id)) {
244
+ return { ok: false, error: `Memory ${id} not found` };
245
+ }
246
+ memoryStore.retractMemory(id);
247
+ eventLog.append({
248
+ kind: "system_note",
249
+ actor: "kernel",
250
+ payload: { type: "memory_forget", id },
251
+ });
252
+ return { ok: true, id };
253
+ }
254
+ catch (err) {
255
+ return { ok: false, error: err?.message ?? "Forget failed" };
256
+ }
257
+ },
258
+ }),
259
+ };
260
+ }
@@ -0,0 +1,39 @@
1
+ import type { EventLog } from "../event-log.js";
2
+ import type { StateGraph } from "../state-graph.js";
3
+ import type { TurnSearchMatch } from "../context-engine/types.js";
4
+ export interface MemoryToolContext {
5
+ eventLog: EventLog;
6
+ stateGraph: StateGraph;
7
+ searchTurnEvents?: (query: string, limit?: number, currentTurn?: number) => TurnSearchMatch[];
8
+ /** false in classic mode — StateGraph tools are not registered. */
9
+ includeWorkingMemoryTools?: boolean;
10
+ }
11
+ export declare function createMemoryTools(ctx: MemoryToolContext): {
12
+ search_session_log: import("./tool-def.js").ToolDefinition;
13
+ create_task: import("./tool-def.js").ToolDefinition;
14
+ complete_task: import("./tool-def.js").ToolDefinition;
15
+ retract_task: import("./tool-def.js").ToolDefinition;
16
+ add_constraint: import("./tool-def.js").ToolDefinition;
17
+ decide: import("./tool-def.js").ToolDefinition;
18
+ add_note: import("./tool-def.js").ToolDefinition;
19
+ soft_unload: import("./tool-def.js").ToolDefinition;
20
+ hard_unload: import("./tool-def.js").ToolDefinition;
21
+ hydrate: import("./tool-def.js").ToolDefinition;
22
+ list_state: import("./tool-def.js").ToolDefinition;
23
+ focus_task: import("./tool-def.js").ToolDefinition;
24
+ } | {
25
+ search_session_log: import("./tool-def.js").ToolDefinition;
26
+ create_task?: undefined;
27
+ complete_task?: undefined;
28
+ retract_task?: undefined;
29
+ add_constraint?: undefined;
30
+ decide?: undefined;
31
+ add_note?: undefined;
32
+ soft_unload?: undefined;
33
+ hard_unload?: undefined;
34
+ hydrate?: undefined;
35
+ list_state?: undefined;
36
+ focus_task?: undefined;
37
+ };
38
+ /** Warn when a note looks like an activity log instead of a semantic finding. */
39
+ export declare function detectActivityLogNote(text: string): string | null;