gnosys 5.5.0 → 5.7.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 (99) hide show
  1. package/README.md +44 -0
  2. package/dist/cli.js +959 -438
  3. package/dist/cli.js.map +1 -1
  4. package/dist/lib/audit.d.ts +13 -0
  5. package/dist/lib/audit.d.ts.map +1 -1
  6. package/dist/lib/audit.js +42 -0
  7. package/dist/lib/audit.js.map +1 -1
  8. package/dist/lib/chat/choose.d.ts +75 -0
  9. package/dist/lib/chat/choose.d.ts.map +1 -0
  10. package/dist/lib/chat/choose.js +146 -0
  11. package/dist/lib/chat/choose.js.map +1 -0
  12. package/dist/lib/chat/commands.d.ts +96 -0
  13. package/dist/lib/chat/commands.d.ts.map +1 -0
  14. package/dist/lib/chat/commands.js +367 -0
  15. package/dist/lib/chat/commands.js.map +1 -0
  16. package/dist/lib/chat/focus.d.ts +70 -0
  17. package/dist/lib/chat/focus.d.ts.map +1 -0
  18. package/dist/lib/chat/focus.js +120 -0
  19. package/dist/lib/chat/focus.js.map +1 -0
  20. package/dist/lib/chat/index.d.ts +32 -0
  21. package/dist/lib/chat/index.d.ts.map +1 -0
  22. package/dist/lib/chat/index.js +151 -0
  23. package/dist/lib/chat/index.js.map +1 -0
  24. package/dist/lib/chat/intent.d.ts +100 -0
  25. package/dist/lib/chat/intent.d.ts.map +1 -0
  26. package/dist/lib/chat/intent.js +192 -0
  27. package/dist/lib/chat/intent.js.map +1 -0
  28. package/dist/lib/chat/llmTurn.d.ts +55 -0
  29. package/dist/lib/chat/llmTurn.d.ts.map +1 -0
  30. package/dist/lib/chat/llmTurn.js +103 -0
  31. package/dist/lib/chat/llmTurn.js.map +1 -0
  32. package/dist/lib/chat/recall.d.ts +58 -0
  33. package/dist/lib/chat/recall.d.ts.map +1 -0
  34. package/dist/lib/chat/recall.js +109 -0
  35. package/dist/lib/chat/recall.js.map +1 -0
  36. package/dist/lib/chat/render.d.ts +30 -0
  37. package/dist/lib/chat/render.d.ts.map +1 -0
  38. package/dist/lib/chat/render.js +755 -0
  39. package/dist/lib/chat/render.js.map +1 -0
  40. package/dist/lib/chat/session.d.ts +121 -0
  41. package/dist/lib/chat/session.d.ts.map +1 -0
  42. package/dist/lib/chat/session.js +148 -0
  43. package/dist/lib/chat/session.js.map +1 -0
  44. package/dist/lib/chat/toolFence.d.ts +54 -0
  45. package/dist/lib/chat/toolFence.d.ts.map +1 -0
  46. package/dist/lib/chat/toolFence.js +90 -0
  47. package/dist/lib/chat/toolFence.js.map +1 -0
  48. package/dist/lib/chat/tools.d.ts +48 -0
  49. package/dist/lib/chat/tools.d.ts.map +1 -0
  50. package/dist/lib/chat/tools.js +338 -0
  51. package/dist/lib/chat/tools.js.map +1 -0
  52. package/dist/lib/chat/types.d.ts +42 -0
  53. package/dist/lib/chat/types.d.ts.map +1 -0
  54. package/dist/lib/chat/types.js +6 -0
  55. package/dist/lib/chat/types.js.map +1 -0
  56. package/dist/lib/chat/write.d.ts +66 -0
  57. package/dist/lib/chat/write.d.ts.map +1 -0
  58. package/dist/lib/chat/write.js +203 -0
  59. package/dist/lib/chat/write.js.map +1 -0
  60. package/dist/lib/db.d.ts +41 -1
  61. package/dist/lib/db.d.ts.map +1 -1
  62. package/dist/lib/db.js +136 -28
  63. package/dist/lib/db.js.map +1 -1
  64. package/dist/lib/exportProject.d.ts +51 -0
  65. package/dist/lib/exportProject.d.ts.map +1 -0
  66. package/dist/lib/exportProject.js +72 -0
  67. package/dist/lib/exportProject.js.map +1 -0
  68. package/dist/lib/importProject.d.ts +35 -0
  69. package/dist/lib/importProject.d.ts.map +1 -0
  70. package/dist/lib/importProject.js +135 -0
  71. package/dist/lib/importProject.js.map +1 -0
  72. package/dist/lib/remote.d.ts +23 -0
  73. package/dist/lib/remote.d.ts.map +1 -1
  74. package/dist/lib/remote.js +88 -0
  75. package/dist/lib/remote.js.map +1 -1
  76. package/dist/lib/remoteWizard.d.ts.map +1 -1
  77. package/dist/lib/remoteWizard.js +13 -17
  78. package/dist/lib/remoteWizard.js.map +1 -1
  79. package/dist/lib/setup/sections/ides.d.ts +20 -0
  80. package/dist/lib/setup/sections/ides.d.ts.map +1 -0
  81. package/dist/lib/setup/sections/ides.js +124 -0
  82. package/dist/lib/setup/sections/ides.js.map +1 -0
  83. package/dist/lib/setup/sections/preferences.d.ts +30 -0
  84. package/dist/lib/setup/sections/preferences.d.ts.map +1 -0
  85. package/dist/lib/setup/sections/preferences.js +128 -0
  86. package/dist/lib/setup/sections/preferences.js.map +1 -0
  87. package/dist/lib/setup/sections/routing.d.ts +21 -0
  88. package/dist/lib/setup/sections/routing.d.ts.map +1 -0
  89. package/dist/lib/setup/sections/routing.js +160 -0
  90. package/dist/lib/setup/sections/routing.js.map +1 -0
  91. package/dist/lib/setup/summary.d.ts +42 -0
  92. package/dist/lib/setup/summary.d.ts.map +1 -0
  93. package/dist/lib/setup/summary.js +206 -0
  94. package/dist/lib/setup/summary.js.map +1 -0
  95. package/dist/lib/timeline.d.ts +7 -0
  96. package/dist/lib/timeline.d.ts.map +1 -1
  97. package/dist/lib/timeline.js +19 -5
  98. package/dist/lib/timeline.js.map +1 -1
  99. package/package.json +7 -1
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Chat-side tool catalog.
3
+ *
4
+ * The LLM in `gnosys chat` can call gnosys functions directly via a fenced
5
+ * protocol (gnosys-tool). Each tool is a small read-only query into the
6
+ * central DB; the result is injected back into the conversation as a system
7
+ * turn before the LLM's next response.
8
+ *
9
+ * Why a fenced protocol instead of native tool_use APIs:
10
+ * - Provider-agnostic: works with Anthropic, OpenAI, Groq, Ollama, LM Studio,
11
+ * and anything that streams plain text. Same approach as gnosys-choose.
12
+ * - Same in-process function calls the MCP server uses internally — no MCP
13
+ * roundtrip, no schema duplication.
14
+ * - The model can chain tool calls naturally (call list_projects, then
15
+ * briefing on a name) because each tool result is a normal turn.
16
+ *
17
+ * Format the model emits:
18
+ *
19
+ * ```gnosys-tool
20
+ * tool: list_projects
21
+ * ```
22
+ *
23
+ * ```gnosys-tool
24
+ * tool: search
25
+ * query: ULID encoding
26
+ * limit: 5
27
+ * ```
28
+ *
29
+ * ```gnosys-tool
30
+ * tool: read
31
+ * id: deci-037
32
+ * ```
33
+ *
34
+ * The fence syntax is parsed by toolFence.ts.
35
+ */
36
+ import { GnosysDB } from "../db.js";
37
+ import { federatedSearch } from "../federated.js";
38
+ const TOOLS = [
39
+ {
40
+ name: "list_projects",
41
+ description: "List every registered project across the central DB",
42
+ params: {},
43
+ run: async () => {
44
+ const db = GnosysDB.openCentral();
45
+ try {
46
+ const projects = db.getAllProjects();
47
+ if (projects.length === 0)
48
+ return "No projects registered.";
49
+ const lines = ["Projects:"];
50
+ for (const p of projects) {
51
+ const memCount = db.getMemoriesByProject(p.id).length;
52
+ lines.push(`- ${p.name} (id: \`${p.id}\`, ${memCount} active memories) — ${p.working_directory}`);
53
+ }
54
+ return lines.join("\n");
55
+ }
56
+ finally {
57
+ db.close();
58
+ }
59
+ },
60
+ },
61
+ {
62
+ name: "search",
63
+ description: "Search memories by free text. Federated across project/user/global with tier boosting.",
64
+ params: {
65
+ query: "the search string (required)",
66
+ limit: "max results (default 10)",
67
+ project_id: "optional — filter to a project ID",
68
+ },
69
+ run: async (args) => {
70
+ if (!args.query)
71
+ return "Error: `query` is required for the search tool.";
72
+ const db = GnosysDB.openCentral();
73
+ try {
74
+ const results = federatedSearch(db, args.query, {
75
+ limit: args.limit ? parseInt(args.limit, 10) : 10,
76
+ projectId: args.project_id ?? null,
77
+ });
78
+ if (results.length === 0)
79
+ return `No matches for "${args.query}".`;
80
+ const lines = [`Results for "${args.query}" (${results.length}):`];
81
+ for (const r of results) {
82
+ const score = r.score.toFixed(2);
83
+ lines.push(`- [${r.id}] ${r.title} (${r.scope}, score=${score})`);
84
+ lines.push(` ${r.snippet.slice(0, 140)}${r.snippet.length > 140 ? "..." : ""}`);
85
+ }
86
+ return lines.join("\n");
87
+ }
88
+ finally {
89
+ db.close();
90
+ }
91
+ },
92
+ },
93
+ {
94
+ name: "read",
95
+ description: "Read a specific memory by ID. Use after `search` to fetch full content.",
96
+ params: {
97
+ id: "the memory ID (required)",
98
+ },
99
+ run: async (args) => {
100
+ if (!args.id)
101
+ return "Error: `id` is required for the read tool.";
102
+ const db = GnosysDB.openCentral();
103
+ try {
104
+ const mem = db.getMemory(args.id);
105
+ if (!mem)
106
+ return `Memory not found: \`${args.id}\``;
107
+ const tags = (() => {
108
+ try {
109
+ const t = JSON.parse(mem.tags || "[]");
110
+ return Array.isArray(t) ? t.join(", ") : "—";
111
+ }
112
+ catch {
113
+ return "—";
114
+ }
115
+ })();
116
+ return [
117
+ `# ${mem.title}`,
118
+ `id: ${mem.id} · category: ${mem.category} · scope: ${mem.scope} · confidence: ${mem.confidence}`,
119
+ `tags: ${tags}`,
120
+ "",
121
+ mem.content,
122
+ ].join("\n");
123
+ }
124
+ finally {
125
+ db.close();
126
+ }
127
+ },
128
+ },
129
+ {
130
+ name: "briefing",
131
+ description: "Generate a project briefing — categories, recent activity, top tags. Pass project_id OR project_name (current project if neither given).",
132
+ params: {
133
+ project_id: "the project ID (optional)",
134
+ project_name: "the project name (optional, looked up if id not given)",
135
+ },
136
+ run: async (args) => {
137
+ const db = GnosysDB.openCentral();
138
+ try {
139
+ const { generateBriefing, detectCurrentProject } = await import("../federated.js");
140
+ let pid = args.project_id ?? null;
141
+ if (!pid && args.project_name) {
142
+ const all = db.getAllProjects();
143
+ const found = all.find((p) => p.name === args.project_name);
144
+ if (found)
145
+ pid = found.id;
146
+ }
147
+ if (!pid)
148
+ pid = await detectCurrentProject(db, undefined);
149
+ if (!pid)
150
+ return "No project specified or detected.";
151
+ const briefing = generateBriefing(db, pid);
152
+ if (!briefing)
153
+ return `Project not found: ${pid}`;
154
+ return briefing.summary;
155
+ }
156
+ finally {
157
+ db.close();
158
+ }
159
+ },
160
+ },
161
+ {
162
+ name: "stats",
163
+ description: "Memory counts by project (active, archived, reinforcements). The 'how many memories?' tool.",
164
+ params: {},
165
+ run: async () => {
166
+ const db = GnosysDB.openCentral();
167
+ try {
168
+ const projects = db.getAllProjects();
169
+ const all = db.getAllMemories();
170
+ const lines = ["Project statistics:"];
171
+ let totalActive = 0;
172
+ for (const p of projects) {
173
+ const ms = all.filter((m) => m.project_id === p.id);
174
+ const active = ms.filter((m) => m.tier === "active" && m.status === "active").length;
175
+ const archived = ms.filter((m) => m.tier === "archive").length;
176
+ totalActive += active;
177
+ lines.push(`- ${p.name}: ${active} active, ${archived} archived`);
178
+ }
179
+ const userScope = all.filter((m) => !m.project_id && m.scope === "user").length;
180
+ const globalScope = all.filter((m) => !m.project_id && m.scope === "global").length;
181
+ if (userScope > 0)
182
+ lines.push(`- (user-scope): ${userScope}`);
183
+ if (globalScope > 0)
184
+ lines.push(`- (global): ${globalScope}`);
185
+ lines.push(`Total active: ${totalActive + userScope + globalScope}`);
186
+ return lines.join("\n");
187
+ }
188
+ finally {
189
+ db.close();
190
+ }
191
+ },
192
+ },
193
+ {
194
+ name: "tags",
195
+ description: "List all tags used across memories with their occurrence counts.",
196
+ params: {
197
+ limit: "max tags to return (default 30)",
198
+ },
199
+ run: async (args) => {
200
+ const db = GnosysDB.openCentral();
201
+ try {
202
+ const all = db.getActiveMemories();
203
+ const counts = new Map();
204
+ for (const m of all) {
205
+ try {
206
+ const tags = JSON.parse(m.tags || "[]");
207
+ if (Array.isArray(tags)) {
208
+ for (const t of tags)
209
+ counts.set(t, (counts.get(t) ?? 0) + 1);
210
+ }
211
+ }
212
+ catch { /* skip malformed */ }
213
+ }
214
+ const limit = args.limit ? parseInt(args.limit, 10) : 30;
215
+ const sorted = [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, limit);
216
+ if (sorted.length === 0)
217
+ return "No tags found.";
218
+ return ["Tags (most common):", ...sorted.map(([t, n]) => `- ${t}: ${n}`)].join("\n");
219
+ }
220
+ finally {
221
+ db.close();
222
+ }
223
+ },
224
+ },
225
+ {
226
+ name: "audit",
227
+ description: "Recent operations from the audit log (writes, reads, dream cycles). Useful for 'what did you do recently?'",
228
+ params: {
229
+ days: "look back N days (default 7)",
230
+ operation: "filter by operation (write, read, recall, dream_complete, etc.)",
231
+ limit: "max entries (default 20)",
232
+ },
233
+ run: async (args) => {
234
+ const db = GnosysDB.openCentral();
235
+ try {
236
+ const days = args.days ? parseInt(args.days, 10) : 7;
237
+ const cutoff = new Date();
238
+ cutoff.setDate(cutoff.getDate() - days);
239
+ const limit = args.limit ? parseInt(args.limit, 10) : 20;
240
+ const entries = db.queryAuditLog({
241
+ sinceIso: cutoff.toISOString(),
242
+ operation: args.operation,
243
+ limit,
244
+ });
245
+ if (entries.length === 0)
246
+ return `No audit entries in the last ${days} day(s).`;
247
+ const lines = [`Recent ${entries.length} audit entr${entries.length === 1 ? "y" : "ies"} (last ${days} days):`];
248
+ for (const e of entries) {
249
+ const memRef = e.memory_id ? ` → ${e.memory_id}` : "";
250
+ const dur = e.duration_ms ? ` (${e.duration_ms}ms)` : "";
251
+ lines.push(`- ${e.timestamp.slice(0, 19)} ${e.operation}${memRef}${dur}`);
252
+ }
253
+ return lines.join("\n");
254
+ }
255
+ finally {
256
+ db.close();
257
+ }
258
+ },
259
+ },
260
+ {
261
+ name: "recent_memories",
262
+ description: "Memories created or modified recently. Useful for 'what's the latest in project X?'",
263
+ params: {
264
+ project_name: "filter to a project name (optional)",
265
+ project_id: "filter to a project ID (optional)",
266
+ days: "look back N days (default 7)",
267
+ limit: "max results (default 20)",
268
+ },
269
+ run: async (args) => {
270
+ const db = GnosysDB.openCentral();
271
+ try {
272
+ const days = args.days ? parseInt(args.days, 10) : 7;
273
+ const limit = args.limit ? parseInt(args.limit, 10) : 20;
274
+ const cutoff = new Date();
275
+ cutoff.setDate(cutoff.getDate() - days);
276
+ const cutoffStr = cutoff.toISOString().slice(0, 10);
277
+ let pid = args.project_id ?? null;
278
+ if (!pid && args.project_name) {
279
+ const found = db.getAllProjects().find((p) => p.name === args.project_name);
280
+ if (found)
281
+ pid = found.id;
282
+ }
283
+ const all = pid
284
+ ? db.getMemoriesByProject(pid)
285
+ : db.getActiveMemories();
286
+ const recent = all
287
+ .filter((m) => (m.modified || m.created) >= cutoffStr)
288
+ .sort((a, b) => (b.modified || b.created).localeCompare(a.modified || a.created))
289
+ .slice(0, limit);
290
+ if (recent.length === 0) {
291
+ return `No memories modified in the last ${days} day(s)${pid ? " for that project" : ""}.`;
292
+ }
293
+ const lines = [`Recent ${recent.length} memor${recent.length === 1 ? "y" : "ies"} (last ${days} days):`];
294
+ for (const m of recent) {
295
+ lines.push(`- [${m.id}] ${m.title} (${m.modified || m.created})`);
296
+ }
297
+ return lines.join("\n");
298
+ }
299
+ finally {
300
+ db.close();
301
+ }
302
+ },
303
+ },
304
+ ];
305
+ // ─── Public API ────────────────────────────────────────────────────────────
306
+ const TOOL_INDEX = new Map(TOOLS.map((t) => [t.name, t]));
307
+ export function findTool(name) {
308
+ return TOOL_INDEX.get(name);
309
+ }
310
+ export function listTools() {
311
+ return [...TOOLS];
312
+ }
313
+ /** System prompt addendum that teaches the LLM the tool-fence syntax. */
314
+ export function buildToolsSystemPrompt() {
315
+ const lines = [
316
+ "",
317
+ "You can call gnosys functions to look up live data the user is asking about. Emit a fenced block:",
318
+ "",
319
+ "```gnosys-tool",
320
+ "tool: <name>",
321
+ "<param>: <value>",
322
+ "```",
323
+ "",
324
+ "After the fence, STOP. The runtime will execute the tool and inject the result before your next message. Then continue your reply naturally, citing the tool result.",
325
+ "",
326
+ "Available tools:",
327
+ ];
328
+ for (const t of TOOLS) {
329
+ const params = Object.keys(t.params).length > 0
330
+ ? ` (params: ${Object.entries(t.params).map(([k, d]) => `${k} — ${d}`).join("; ")})`
331
+ : "";
332
+ lines.push(`- ${t.name}: ${t.description}${params}`);
333
+ }
334
+ lines.push("");
335
+ lines.push("Don't make up data — call a tool when the user asks anything specific about projects, memories, recent activity, tags, or stats.");
336
+ return lines.join("\n");
337
+ }
338
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/lib/chat/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared types for the chat TUI. Kept separate from session.ts so the
3
+ * React/ink components can import without pulling fs/path dependencies.
4
+ */
5
+ export type Turn = {
6
+ role: "user";
7
+ text: string;
8
+ ts: string;
9
+ } | {
10
+ role: "assistant";
11
+ text: string;
12
+ ts: string;
13
+ provider?: string;
14
+ model?: string;
15
+ tokensIn?: number;
16
+ tokensOut?: number;
17
+ citedMemoryIds?: string[];
18
+ } | {
19
+ role: "system";
20
+ text: string;
21
+ ts: string;
22
+ };
23
+ export type ChatStatus = {
24
+ kind: "idle";
25
+ } | {
26
+ kind: "thinking";
27
+ } | {
28
+ kind: "streaming";
29
+ partial: string;
30
+ } | {
31
+ kind: "error";
32
+ message: string;
33
+ };
34
+ export interface ChatHeaderInfo {
35
+ sessionId: string;
36
+ projectName?: string;
37
+ provider: string;
38
+ model: string;
39
+ tokensIn: number;
40
+ tokensOut: number;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/chat/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,IAAI,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACpJ;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Shared types for the chat TUI. Kept separate from session.ts so the
3
+ * React/ink components can import without pulling fs/path dependencies.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/chat/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Chat-side memory writing — promote chat content to gnosys memories.
3
+ *
4
+ * Handles three triggers:
5
+ * /remember <text> explicit user-marked insight
6
+ * /save-turn distill the last user+assistant exchange
7
+ * /attach <file> ingest a file via the multimodal pipeline
8
+ *
9
+ * All promoted memories carry session provenance:
10
+ * tags.session: [<sessionId>]
11
+ * tags.from-chat: ["true"]
12
+ * tags.source: ["remember" | "save-turn" | "auto" | "attach"]
13
+ */
14
+ import { GnosysDB } from "../db.js";
15
+ import { GnosysConfig } from "../config.js";
16
+ import { Turn } from "./types.js";
17
+ export type PromoteSource = "remember" | "save-turn" | "auto" | "attach";
18
+ export interface PromoteOptions {
19
+ /** Free-form text to save. */
20
+ content: string;
21
+ /** Optional override for category (default depends on source). */
22
+ category?: string;
23
+ /** Optional override for title (default: derived from first line / LLM). */
24
+ title?: string;
25
+ /** Source trigger — recorded as a tag for provenance. */
26
+ source: PromoteSource;
27
+ /** Session ID for provenance. */
28
+ sessionId: string;
29
+ /** Project ID to scope the memory to (null → user scope). */
30
+ projectId: string | null;
31
+ /** Optional structuring config (when LLM is available). Set to null to skip LLM. */
32
+ config?: GnosysConfig | null;
33
+ }
34
+ export interface PromoteResult {
35
+ id: string;
36
+ title: string;
37
+ category: string;
38
+ }
39
+ /**
40
+ * Write a chat-sourced memory to the central DB. Returns the assigned ID.
41
+ *
42
+ * Uses LLM structuring when config is provided and the structuring provider
43
+ * is reachable; falls back to a heuristic title + category otherwise.
44
+ */
45
+ export declare function promoteToMemory(db: GnosysDB, opts: PromoteOptions): Promise<PromoteResult>;
46
+ /** Build the content for /save-turn from the most recent user+assistant exchange. */
47
+ export declare function lastExchange(buffer: Turn[]): {
48
+ user: string;
49
+ assistant: string;
50
+ } | null;
51
+ /** Format a save-turn pair as a markdown exchange suitable for memory content. */
52
+ export declare function formatExchange(pair: {
53
+ user: string;
54
+ assistant: string;
55
+ }): string;
56
+ export interface AutoPromoteHint {
57
+ reason: string;
58
+ match: string;
59
+ }
60
+ /**
61
+ * Scan a user turn for "looks like a decision/insight worth saving" patterns.
62
+ * Returns a hint that the TUI can surface as an inline confirm prompt.
63
+ * Returns null when nothing matches.
64
+ */
65
+ export declare function detectAutoPromote(userText: string): AutoPromoteHint | null;
66
+ //# sourceMappingURL=write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../../src/lib/chat/write.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,QAAQ,EAAY,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,MAAM,EAAE,aAAa,CAAC;IACtB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oFAAoF;IACpF,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgFD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,aAAa,CAAC,CA8DxB;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBvF;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAEhF;AAUD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAQ1E"}