gnosys 4.0.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.
- package/LICENSE +21 -0
- package/README.md +1387 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3753 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2267 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/archive.d.ts +95 -0
- package/dist/lib/archive.d.ts.map +1 -0
- package/dist/lib/archive.js +311 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/ask.d.ts +77 -0
- package/dist/lib/ask.d.ts.map +1 -0
- package/dist/lib/ask.js +316 -0
- package/dist/lib/ask.js.map +1 -0
- package/dist/lib/audit.d.ts +47 -0
- package/dist/lib/audit.d.ts.map +1 -0
- package/dist/lib/audit.js +136 -0
- package/dist/lib/audit.js.map +1 -0
- package/dist/lib/bootstrap.d.ts +56 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +163 -0
- package/dist/lib/bootstrap.js.map +1 -0
- package/dist/lib/config.d.ts +239 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +371 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/dashboard.d.ts +81 -0
- package/dist/lib/dashboard.d.ts.map +1 -0
- package/dist/lib/dashboard.js +314 -0
- package/dist/lib/dashboard.js.map +1 -0
- package/dist/lib/db.d.ts +182 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +620 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/dbSearch.d.ts +65 -0
- package/dist/lib/dbSearch.d.ts.map +1 -0
- package/dist/lib/dbSearch.js +239 -0
- package/dist/lib/dbSearch.js.map +1 -0
- package/dist/lib/dbWrite.d.ts +56 -0
- package/dist/lib/dbWrite.d.ts.map +1 -0
- package/dist/lib/dbWrite.js +171 -0
- package/dist/lib/dbWrite.js.map +1 -0
- package/dist/lib/dream.d.ts +170 -0
- package/dist/lib/dream.d.ts.map +1 -0
- package/dist/lib/dream.js +706 -0
- package/dist/lib/dream.js.map +1 -0
- package/dist/lib/embeddings.d.ts +84 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +226 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/export.d.ts +92 -0
- package/dist/lib/export.d.ts.map +1 -0
- package/dist/lib/export.js +362 -0
- package/dist/lib/export.js.map +1 -0
- package/dist/lib/federated.d.ts +113 -0
- package/dist/lib/federated.d.ts.map +1 -0
- package/dist/lib/federated.js +346 -0
- package/dist/lib/federated.js.map +1 -0
- package/dist/lib/graph.d.ts +50 -0
- package/dist/lib/graph.d.ts.map +1 -0
- package/dist/lib/graph.js +118 -0
- package/dist/lib/graph.js.map +1 -0
- package/dist/lib/history.d.ts +39 -0
- package/dist/lib/history.d.ts.map +1 -0
- package/dist/lib/history.js +112 -0
- package/dist/lib/history.js.map +1 -0
- package/dist/lib/hybridSearch.d.ts +80 -0
- package/dist/lib/hybridSearch.d.ts.map +1 -0
- package/dist/lib/hybridSearch.js +296 -0
- package/dist/lib/hybridSearch.js.map +1 -0
- package/dist/lib/import.d.ts +52 -0
- package/dist/lib/import.d.ts.map +1 -0
- package/dist/lib/import.js +365 -0
- package/dist/lib/import.js.map +1 -0
- package/dist/lib/ingest.d.ts +51 -0
- package/dist/lib/ingest.d.ts.map +1 -0
- package/dist/lib/ingest.js +144 -0
- package/dist/lib/ingest.js.map +1 -0
- package/dist/lib/lensing.d.ts +35 -0
- package/dist/lib/lensing.d.ts.map +1 -0
- package/dist/lib/lensing.js +85 -0
- package/dist/lib/lensing.js.map +1 -0
- package/dist/lib/llm.d.ts +84 -0
- package/dist/lib/llm.d.ts.map +1 -0
- package/dist/lib/llm.js +386 -0
- package/dist/lib/llm.js.map +1 -0
- package/dist/lib/lock.d.ts +28 -0
- package/dist/lib/lock.d.ts.map +1 -0
- package/dist/lib/lock.js +145 -0
- package/dist/lib/lock.js.map +1 -0
- package/dist/lib/maintenance.d.ts +124 -0
- package/dist/lib/maintenance.d.ts.map +1 -0
- package/dist/lib/maintenance.js +587 -0
- package/dist/lib/maintenance.js.map +1 -0
- package/dist/lib/migrate.d.ts +19 -0
- package/dist/lib/migrate.d.ts.map +1 -0
- package/dist/lib/migrate.js +260 -0
- package/dist/lib/migrate.js.map +1 -0
- package/dist/lib/preferences.d.ts +49 -0
- package/dist/lib/preferences.d.ts.map +1 -0
- package/dist/lib/preferences.js +149 -0
- package/dist/lib/preferences.js.map +1 -0
- package/dist/lib/projectIdentity.d.ts +66 -0
- package/dist/lib/projectIdentity.d.ts.map +1 -0
- package/dist/lib/projectIdentity.js +148 -0
- package/dist/lib/projectIdentity.js.map +1 -0
- package/dist/lib/recall.d.ts +82 -0
- package/dist/lib/recall.d.ts.map +1 -0
- package/dist/lib/recall.js +289 -0
- package/dist/lib/recall.js.map +1 -0
- package/dist/lib/resolver.d.ts +116 -0
- package/dist/lib/resolver.d.ts.map +1 -0
- package/dist/lib/resolver.js +372 -0
- package/dist/lib/resolver.js.map +1 -0
- package/dist/lib/retry.d.ts +24 -0
- package/dist/lib/retry.d.ts.map +1 -0
- package/dist/lib/retry.js +60 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/rulesGen.d.ts +51 -0
- package/dist/lib/rulesGen.d.ts.map +1 -0
- package/dist/lib/rulesGen.js +167 -0
- package/dist/lib/rulesGen.js.map +1 -0
- package/dist/lib/search.d.ts +51 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +190 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/staticSearch.d.ts +70 -0
- package/dist/lib/staticSearch.d.ts.map +1 -0
- package/dist/lib/staticSearch.js +162 -0
- package/dist/lib/staticSearch.js.map +1 -0
- package/dist/lib/store.d.ts +79 -0
- package/dist/lib/store.d.ts.map +1 -0
- package/dist/lib/store.js +227 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/structuredIngest.d.ts +37 -0
- package/dist/lib/structuredIngest.d.ts.map +1 -0
- package/dist/lib/structuredIngest.js +208 -0
- package/dist/lib/structuredIngest.js.map +1 -0
- package/dist/lib/tags.d.ts +26 -0
- package/dist/lib/tags.d.ts.map +1 -0
- package/dist/lib/tags.js +109 -0
- package/dist/lib/tags.js.map +1 -0
- package/dist/lib/timeline.d.ts +34 -0
- package/dist/lib/timeline.d.ts.map +1 -0
- package/dist/lib/timeline.js +116 -0
- package/dist/lib/timeline.js.map +1 -0
- package/dist/lib/trace.d.ts +42 -0
- package/dist/lib/trace.d.ts.map +1 -0
- package/dist/lib/trace.js +338 -0
- package/dist/lib/trace.js.map +1 -0
- package/dist/lib/webIndex.d.ts +28 -0
- package/dist/lib/webIndex.d.ts.map +1 -0
- package/dist/lib/webIndex.js +208 -0
- package/dist/lib/webIndex.js.map +1 -0
- package/dist/lib/webIngest.d.ts +51 -0
- package/dist/lib/webIngest.d.ts.map +1 -0
- package/dist/lib/webIngest.js +533 -0
- package/dist/lib/webIngest.js.map +1 -0
- package/dist/lib/wikilinks.d.ts +63 -0
- package/dist/lib/wikilinks.d.ts.map +1 -0
- package/dist/lib/wikilinks.js +146 -0
- package/dist/lib/wikilinks.js.map +1 -0
- package/dist/sandbox/client.d.ts +82 -0
- package/dist/sandbox/client.d.ts.map +1 -0
- package/dist/sandbox/client.js +128 -0
- package/dist/sandbox/client.js.map +1 -0
- package/dist/sandbox/helper-template.d.ts +14 -0
- package/dist/sandbox/helper-template.d.ts.map +1 -0
- package/dist/sandbox/helper-template.js +285 -0
- package/dist/sandbox/helper-template.js.map +1 -0
- package/dist/sandbox/index.d.ts +10 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/manager.d.ts +40 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +220 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/server.d.ts +44 -0
- package/dist/sandbox/server.d.ts.map +1 -0
- package/dist/sandbox/server.js +661 -0
- package/dist/sandbox/server.js.map +1 -0
- package/package.json +103 -0
- package/prompts/synthesize.md +21 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Wikilinks — Obsidian-compatible cross-references between memories.
|
|
3
|
+
*
|
|
4
|
+
* Scans memory content for [[wikilinks]] and builds a link graph.
|
|
5
|
+
* Supports both [[title]] and [[path|display text]] formats.
|
|
6
|
+
*/
|
|
7
|
+
// Regex to match [[target]] or [[target|display text]]
|
|
8
|
+
const WIKILINK_RE = /\[\[([^\]|]+?)(?:\|([^\]]+?))?\]\]/g;
|
|
9
|
+
/**
|
|
10
|
+
* Extract all wikilinks from a memory's content.
|
|
11
|
+
*/
|
|
12
|
+
export function extractLinks(memory) {
|
|
13
|
+
const links = [];
|
|
14
|
+
let match;
|
|
15
|
+
// Reset regex state
|
|
16
|
+
WIKILINK_RE.lastIndex = 0;
|
|
17
|
+
while ((match = WIKILINK_RE.exec(memory.content)) !== null) {
|
|
18
|
+
links.push({
|
|
19
|
+
target: match[1].trim(),
|
|
20
|
+
displayText: match[2]?.trim() || null,
|
|
21
|
+
sourcePath: memory.relativePath,
|
|
22
|
+
sourceTitle: memory.frontmatter.title,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return links;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a wikilink target to a memory.
|
|
29
|
+
* Tries matching by: exact relative path, title (case-insensitive), id.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveLink(target, memories) {
|
|
32
|
+
// 1. Exact relative path match
|
|
33
|
+
const byPath = memories.find((m) => m.relativePath === target);
|
|
34
|
+
if (byPath)
|
|
35
|
+
return byPath;
|
|
36
|
+
// 2. Path with .md extension
|
|
37
|
+
const withMd = memories.find((m) => m.relativePath === target + ".md");
|
|
38
|
+
if (withMd)
|
|
39
|
+
return withMd;
|
|
40
|
+
// 3. Filename match (target might be just the filename without category dir)
|
|
41
|
+
const byFilename = memories.find((m) => {
|
|
42
|
+
const filename = m.relativePath.split("/").pop()?.replace(/\.md$/, "");
|
|
43
|
+
return filename === target;
|
|
44
|
+
});
|
|
45
|
+
if (byFilename)
|
|
46
|
+
return byFilename;
|
|
47
|
+
// 4. Title match (case-insensitive)
|
|
48
|
+
const lowerTarget = target.toLowerCase();
|
|
49
|
+
const byTitle = memories.find((m) => m.frontmatter.title.toLowerCase() === lowerTarget);
|
|
50
|
+
if (byTitle)
|
|
51
|
+
return byTitle;
|
|
52
|
+
// 5. ID match
|
|
53
|
+
const byId = memories.find((m) => m.frontmatter.id === target);
|
|
54
|
+
if (byId)
|
|
55
|
+
return byId;
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a full link graph from all memories.
|
|
60
|
+
*/
|
|
61
|
+
export function buildLinkGraph(memories) {
|
|
62
|
+
const nodes = new Map();
|
|
63
|
+
const orphanedLinks = [];
|
|
64
|
+
let totalLinks = 0;
|
|
65
|
+
// Initialize nodes for all memories
|
|
66
|
+
for (const m of memories) {
|
|
67
|
+
nodes.set(m.relativePath, {
|
|
68
|
+
path: m.relativePath,
|
|
69
|
+
title: m.frontmatter.title,
|
|
70
|
+
outgoing: [],
|
|
71
|
+
incoming: [],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Extract links and resolve them
|
|
75
|
+
for (const m of memories) {
|
|
76
|
+
const links = extractLinks(m);
|
|
77
|
+
totalLinks += links.length;
|
|
78
|
+
for (const link of links) {
|
|
79
|
+
const resolved = resolveLink(link.target, memories);
|
|
80
|
+
if (resolved) {
|
|
81
|
+
// Add outgoing link to source
|
|
82
|
+
const sourceNode = nodes.get(m.relativePath);
|
|
83
|
+
sourceNode.outgoing.push(link);
|
|
84
|
+
// Add backlink to target
|
|
85
|
+
const targetNode = nodes.get(resolved.relativePath);
|
|
86
|
+
targetNode.incoming.push(link);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
orphanedLinks.push(link);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { nodes, totalLinks, orphanedLinks };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get backlinks for a specific memory.
|
|
97
|
+
*/
|
|
98
|
+
export function getBacklinks(memories, targetPath) {
|
|
99
|
+
const graph = buildLinkGraph(memories);
|
|
100
|
+
const node = graph.nodes.get(targetPath);
|
|
101
|
+
return node?.incoming || [];
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get outgoing links for a specific memory.
|
|
105
|
+
*/
|
|
106
|
+
export function getOutgoingLinks(memories, sourcePath) {
|
|
107
|
+
const graph = buildLinkGraph(memories);
|
|
108
|
+
const node = graph.nodes.get(sourcePath);
|
|
109
|
+
return node?.outgoing || [];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format the link graph as a simple text summary.
|
|
113
|
+
*/
|
|
114
|
+
export function formatGraphSummary(graph) {
|
|
115
|
+
const lines = [];
|
|
116
|
+
lines.push(`Link Graph: ${graph.totalLinks} total links, ${graph.orphanedLinks.length} orphaned\n`);
|
|
117
|
+
// Find most-connected nodes
|
|
118
|
+
const connected = Array.from(graph.nodes.values())
|
|
119
|
+
.filter((n) => n.outgoing.length > 0 || n.incoming.length > 0)
|
|
120
|
+
.sort((a, b) => (b.incoming.length + b.outgoing.length) - (a.incoming.length + a.outgoing.length));
|
|
121
|
+
if (connected.length === 0) {
|
|
122
|
+
lines.push("No cross-references found. Use [[Title]] in memory content to create links.");
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
for (const node of connected) {
|
|
126
|
+
lines.push(`**${node.title}** (${node.path})`);
|
|
127
|
+
lines.push(` → ${node.outgoing.length} outgoing, ← ${node.incoming.length} backlinks`);
|
|
128
|
+
if (node.outgoing.length > 0) {
|
|
129
|
+
const targets = node.outgoing.map((l) => l.displayText || l.target).join(", ");
|
|
130
|
+
lines.push(` Links to: ${targets}`);
|
|
131
|
+
}
|
|
132
|
+
if (node.incoming.length > 0) {
|
|
133
|
+
const sources = node.incoming.map((l) => l.sourceTitle).join(", ");
|
|
134
|
+
lines.push(` Referenced by: ${sources}`);
|
|
135
|
+
}
|
|
136
|
+
lines.push("");
|
|
137
|
+
}
|
|
138
|
+
if (graph.orphanedLinks.length > 0) {
|
|
139
|
+
lines.push("Orphaned links (targets not found):");
|
|
140
|
+
for (const link of graph.orphanedLinks) {
|
|
141
|
+
lines.push(` [[${link.target}]] in ${link.sourceTitle}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return lines.join("\n");
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=wikilinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikilinks.js","sourceRoot":"","sources":["../../src/lib/wikilinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Sandbox Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to the running sandbox server over a Unix domain socket
|
|
5
|
+
* and provides typed async methods for all sandbox operations.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SandboxClient {
|
|
8
|
+
private socketPath;
|
|
9
|
+
constructor(socketPath?: string);
|
|
10
|
+
/**
|
|
11
|
+
* Send a request to the sandbox server and wait for a response.
|
|
12
|
+
* Each request gets a unique ID and is sent as newline-delimited JSON.
|
|
13
|
+
*/
|
|
14
|
+
private send;
|
|
15
|
+
/** Check if the sandbox is reachable */
|
|
16
|
+
ping(): Promise<{
|
|
17
|
+
status: string;
|
|
18
|
+
pid: number;
|
|
19
|
+
}>;
|
|
20
|
+
/** Add a new memory to the central database */
|
|
21
|
+
add(params: {
|
|
22
|
+
content: string;
|
|
23
|
+
title?: string;
|
|
24
|
+
category?: string;
|
|
25
|
+
project_id?: string;
|
|
26
|
+
scope?: "project" | "user" | "global";
|
|
27
|
+
tags?: string | string[];
|
|
28
|
+
relevance?: string;
|
|
29
|
+
author?: string;
|
|
30
|
+
authority?: string;
|
|
31
|
+
confidence?: number;
|
|
32
|
+
}): Promise<{
|
|
33
|
+
id: string;
|
|
34
|
+
title: string;
|
|
35
|
+
}>;
|
|
36
|
+
/** Search/recall memories by query */
|
|
37
|
+
recall(query: string, opts?: {
|
|
38
|
+
limit?: number;
|
|
39
|
+
project_id?: string;
|
|
40
|
+
}): Promise<Array<{
|
|
41
|
+
id: string;
|
|
42
|
+
title: string;
|
|
43
|
+
content: string;
|
|
44
|
+
category: string;
|
|
45
|
+
confidence: number;
|
|
46
|
+
score: number;
|
|
47
|
+
}>>;
|
|
48
|
+
/** Reinforce an existing memory (boost confidence) */
|
|
49
|
+
reinforce(idOrQuery: string): Promise<{
|
|
50
|
+
id: string;
|
|
51
|
+
reinforcement_count: number;
|
|
52
|
+
confidence: number;
|
|
53
|
+
}>;
|
|
54
|
+
/** Get a specific memory by ID */
|
|
55
|
+
get(id: string): Promise<Record<string, unknown>>;
|
|
56
|
+
/** List memories, optionally filtered by category or project */
|
|
57
|
+
list(opts?: {
|
|
58
|
+
category?: string;
|
|
59
|
+
project_id?: string;
|
|
60
|
+
limit?: number;
|
|
61
|
+
}): Promise<Array<{
|
|
62
|
+
id: string;
|
|
63
|
+
title: string;
|
|
64
|
+
category: string;
|
|
65
|
+
confidence: number;
|
|
66
|
+
project_id: string | null;
|
|
67
|
+
scope: string;
|
|
68
|
+
}>>;
|
|
69
|
+
/** Get database statistics */
|
|
70
|
+
stats(): Promise<{
|
|
71
|
+
active: number;
|
|
72
|
+
archived: number;
|
|
73
|
+
total: number;
|
|
74
|
+
categories: string[];
|
|
75
|
+
projects: number;
|
|
76
|
+
}>;
|
|
77
|
+
/** Gracefully shut down the sandbox server */
|
|
78
|
+
shutdown(): Promise<void>;
|
|
79
|
+
/** Check if the sandbox is running (non-throwing) */
|
|
80
|
+
isRunning(): Promise<boolean>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sandbox/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAI/B;;;OAGG;IACH,OAAO,CAAC,IAAI;IA0CZ,wCAAwC;IAClC,IAAI,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAMtD,+CAA+C;IACzC,GAAG,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;QACtC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAS1C,sCAAsC;IAChC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACjC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAMH,sDAAsD;IAChD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAC1C,EAAE,EAAE,MAAM,CAAC;QACX,mBAAmB,EAAE,MAAM,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IASF,kCAAkC;IAC5B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAMvD,gEAAgE;IAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,KAAK,CAAC;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IAMH,8BAA8B;IACxB,KAAK,IAAI,OAAO,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAMF,8CAA8C;IACxC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,qDAAqD;IAC/C,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAQpC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Sandbox Client
|
|
3
|
+
*
|
|
4
|
+
* Connects to the running sandbox server over a Unix domain socket
|
|
5
|
+
* and provides typed async methods for all sandbox operations.
|
|
6
|
+
*/
|
|
7
|
+
import net from "net";
|
|
8
|
+
import { getSocketPath } from "./server.js";
|
|
9
|
+
export class SandboxClient {
|
|
10
|
+
socketPath;
|
|
11
|
+
constructor(socketPath) {
|
|
12
|
+
this.socketPath = socketPath || getSocketPath();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Send a request to the sandbox server and wait for a response.
|
|
16
|
+
* Each request gets a unique ID and is sent as newline-delimited JSON.
|
|
17
|
+
*/
|
|
18
|
+
send(method, params = {}) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const id = `req-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
|
|
21
|
+
const req = { id, method, params };
|
|
22
|
+
const socket = net.createConnection(this.socketPath, () => {
|
|
23
|
+
socket.write(JSON.stringify(req) + "\n");
|
|
24
|
+
});
|
|
25
|
+
let buffer = "";
|
|
26
|
+
socket.on("data", (data) => {
|
|
27
|
+
buffer += data.toString();
|
|
28
|
+
const newlineIdx = buffer.indexOf("\n");
|
|
29
|
+
if (newlineIdx !== -1) {
|
|
30
|
+
const line = buffer.slice(0, newlineIdx).trim();
|
|
31
|
+
try {
|
|
32
|
+
const res = JSON.parse(line);
|
|
33
|
+
socket.end();
|
|
34
|
+
resolve(res);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
socket.end();
|
|
38
|
+
reject(new Error(`Invalid response from sandbox: ${line}`));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
socket.on("error", (err) => {
|
|
43
|
+
reject(new Error(`Cannot connect to Gnosys sandbox at ${this.socketPath}. ` +
|
|
44
|
+
`Is the sandbox running? Start it with: gnosys sandbox start\n` +
|
|
45
|
+
`(${err.message})`));
|
|
46
|
+
});
|
|
47
|
+
socket.setTimeout(10_000, () => {
|
|
48
|
+
socket.destroy();
|
|
49
|
+
reject(new Error("Sandbox request timed out after 10 seconds"));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** Check if the sandbox is reachable */
|
|
54
|
+
async ping() {
|
|
55
|
+
const res = await this.send("ping");
|
|
56
|
+
if (!res.ok)
|
|
57
|
+
throw new Error(res.error || "Ping failed");
|
|
58
|
+
return res.result;
|
|
59
|
+
}
|
|
60
|
+
/** Add a new memory to the central database */
|
|
61
|
+
async add(params) {
|
|
62
|
+
const res = await this.send("add", {
|
|
63
|
+
...params,
|
|
64
|
+
tags: Array.isArray(params.tags) ? JSON.stringify(params.tags) : params.tags,
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok)
|
|
67
|
+
throw new Error(res.error || "Add failed");
|
|
68
|
+
return res.result;
|
|
69
|
+
}
|
|
70
|
+
/** Search/recall memories by query */
|
|
71
|
+
async recall(query, opts) {
|
|
72
|
+
const res = await this.send("recall", { query, ...opts });
|
|
73
|
+
if (!res.ok)
|
|
74
|
+
throw new Error(res.error || "Recall failed");
|
|
75
|
+
return res.result;
|
|
76
|
+
}
|
|
77
|
+
/** Reinforce an existing memory (boost confidence) */
|
|
78
|
+
async reinforce(idOrQuery) {
|
|
79
|
+
// If it looks like a memory ID, pass as id; otherwise treat as query
|
|
80
|
+
const isId = idOrQuery.startsWith("mem-") || idOrQuery.match(/^[a-z]+-\d+/);
|
|
81
|
+
const params = isId ? { id: idOrQuery } : { query: idOrQuery };
|
|
82
|
+
const res = await this.send("reinforce", params);
|
|
83
|
+
if (!res.ok)
|
|
84
|
+
throw new Error(res.error || "Reinforce failed");
|
|
85
|
+
return res.result;
|
|
86
|
+
}
|
|
87
|
+
/** Get a specific memory by ID */
|
|
88
|
+
async get(id) {
|
|
89
|
+
const res = await this.send("get", { id });
|
|
90
|
+
if (!res.ok)
|
|
91
|
+
throw new Error(res.error || "Get failed");
|
|
92
|
+
return res.result;
|
|
93
|
+
}
|
|
94
|
+
/** List memories, optionally filtered by category or project */
|
|
95
|
+
async list(opts) {
|
|
96
|
+
const res = await this.send("list", opts || {});
|
|
97
|
+
if (!res.ok)
|
|
98
|
+
throw new Error(res.error || "List failed");
|
|
99
|
+
return res.result;
|
|
100
|
+
}
|
|
101
|
+
/** Get database statistics */
|
|
102
|
+
async stats() {
|
|
103
|
+
const res = await this.send("stats");
|
|
104
|
+
if (!res.ok)
|
|
105
|
+
throw new Error(res.error || "Stats failed");
|
|
106
|
+
return res.result;
|
|
107
|
+
}
|
|
108
|
+
/** Gracefully shut down the sandbox server */
|
|
109
|
+
async shutdown() {
|
|
110
|
+
try {
|
|
111
|
+
await this.send("shutdown");
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Server may close before we get the response — that's expected
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/** Check if the sandbox is running (non-throwing) */
|
|
118
|
+
async isRunning() {
|
|
119
|
+
try {
|
|
120
|
+
await this.ping();
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sandbox/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAmC,MAAM,aAAa,CAAC;AAE7E,MAAM,OAAO,aAAa;IAChB,UAAU,CAAS;IAE3B,YAAY,UAAmB;QAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,aAAa,EAAE,CAAC;IAClD,CAAC;IAED;;;OAGG;IACK,IAAI,CAAC,MAAc,EAAE,SAAkC,EAAE;QAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAmB,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAEnD,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;gBACxD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACxC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChD,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;wBAChD,MAAM,CAAC,GAAG,EAAE,CAAC;wBACb,OAAO,CAAC,GAAG,CAAC,CAAC;oBACf,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,GAAG,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,MAAM,CAAC,IAAI,KAAK,CACd,uCAAuC,IAAI,CAAC,UAAU,IAAI;oBAC1D,+DAA+D;oBAC/D,IAAI,GAAG,CAAC,OAAO,GAAG,CACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC7B,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,MAAyC,CAAC;IACvD,CAAC;IAED,+CAA+C;IAC/C,KAAK,CAAC,GAAG,CAAC,MAWT;QACC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACjC,GAAG,MAAM;YACT,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI;SAC7E,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,MAAuC,CAAC;IACrD,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAG3B;QAQC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC,MAAe,CAAC;IAC7B,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,SAAS,CAAC,SAAiB;QAK/B,qEAAqE;QACrE,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,kBAAkB,CAAC,CAAC;QAC9D,OAAO,GAAG,CAAC,MAAa,CAAC;IAC3B,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,MAAiC,CAAC;IAC/C,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,IAIV;QAQC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;QACzD,OAAO,GAAG,CAAC,MAAe,CAAC;IAC7B,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,KAAK;QAOT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,cAAc,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,MAAa,CAAC;IAC3B,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Helper Library Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates a self-contained `gnosys-helper.ts` file that agents
|
|
5
|
+
* can import and use immediately — zero config, zero MCP overhead.
|
|
6
|
+
*
|
|
7
|
+
* The generated file connects to the sandbox server via Unix socket
|
|
8
|
+
* and auto-starts the sandbox if it's not running.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Write the helper library file to the specified directory.
|
|
12
|
+
*/
|
|
13
|
+
export declare function generateHelper(targetDir: string): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=helper-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helper-template.d.ts","sourceRoot":"","sources":["../../src/sandbox/helper-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqQH;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAevE"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gnosys Helper Library Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates a self-contained `gnosys-helper.ts` file that agents
|
|
5
|
+
* can import and use immediately — zero config, zero MCP overhead.
|
|
6
|
+
*
|
|
7
|
+
* The generated file connects to the sandbox server via Unix socket
|
|
8
|
+
* and auto-starts the sandbox if it's not running.
|
|
9
|
+
*/
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { findProjectIdentity } from "../lib/projectIdentity.js";
|
|
13
|
+
/**
|
|
14
|
+
* Generate the helper library source code.
|
|
15
|
+
* This is a self-contained TypeScript file with no external deps
|
|
16
|
+
* (other than Node built-ins).
|
|
17
|
+
*/
|
|
18
|
+
function generateHelperSource(projectId) {
|
|
19
|
+
return `/**
|
|
20
|
+
* Gnosys Helper — Auto-generated agent helper library.
|
|
21
|
+
*
|
|
22
|
+
* Import this file in your agent/script to get instant access
|
|
23
|
+
* to the Gnosys memory system with zero overhead.
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* import { gnosys } from "./gnosys-helper";
|
|
27
|
+
* await gnosys.add("We use conventional commits");
|
|
28
|
+
* const ctx = await gnosys.recall("auth decisions");
|
|
29
|
+
* await gnosys.reinforce("payment logic");
|
|
30
|
+
*
|
|
31
|
+
* The sandbox auto-starts if not running. No MCP required.
|
|
32
|
+
*
|
|
33
|
+
* Generated: ${new Date().toISOString()}
|
|
34
|
+
* Project: ${projectId || "(none — global scope)"}
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
import net from "net";
|
|
38
|
+
import { execSync, spawn } from "child_process";
|
|
39
|
+
import path from "path";
|
|
40
|
+
import os from "os";
|
|
41
|
+
import fs from "fs";
|
|
42
|
+
|
|
43
|
+
// ─── Configuration ────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
const PROJECT_ID: string | null = ${projectId ? `"${projectId}"` : "null"};
|
|
46
|
+
|
|
47
|
+
function getSocketPath(): string {
|
|
48
|
+
if (process.platform === "win32") return "\\\\\\\\.\\\\pipe\\\\gnosys-sandbox";
|
|
49
|
+
const dir = path.join(os.homedir(), ".gnosys", "sandbox");
|
|
50
|
+
return path.join(dir, "gnosys.sock");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ─── Low-level transport ──────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
interface SandboxResponse {
|
|
56
|
+
id: string;
|
|
57
|
+
ok: boolean;
|
|
58
|
+
result?: unknown;
|
|
59
|
+
error?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function send(method: string, params: Record<string, unknown> = {}): Promise<SandboxResponse> {
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
const id = \`req-\${Date.now()}-\${Math.random().toString(36).slice(2, 6)}\`;
|
|
65
|
+
const socket = net.createConnection(getSocketPath(), () => {
|
|
66
|
+
socket.write(JSON.stringify({ id, method, params }) + "\\n");
|
|
67
|
+
});
|
|
68
|
+
let buffer = "";
|
|
69
|
+
socket.on("data", (data) => {
|
|
70
|
+
buffer += data.toString();
|
|
71
|
+
const idx = buffer.indexOf("\\n");
|
|
72
|
+
if (idx !== -1) {
|
|
73
|
+
try {
|
|
74
|
+
resolve(JSON.parse(buffer.slice(0, idx).trim()));
|
|
75
|
+
} catch { reject(new Error("Invalid sandbox response")); }
|
|
76
|
+
socket.end();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
socket.on("error", (err) => reject(err));
|
|
80
|
+
socket.setTimeout(10_000, () => { socket.destroy(); reject(new Error("Timeout")); });
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ─── Auto-start ───────────────────────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
let _ensured = false;
|
|
87
|
+
|
|
88
|
+
async function ensureRunning(): Promise<void> {
|
|
89
|
+
if (_ensured) return;
|
|
90
|
+
try {
|
|
91
|
+
await send("ping");
|
|
92
|
+
_ensured = true;
|
|
93
|
+
return;
|
|
94
|
+
} catch {
|
|
95
|
+
// Not running — start it
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
execSync("npx gnosys sandbox start", { stdio: "ignore", timeout: 10_000 });
|
|
100
|
+
} catch {
|
|
101
|
+
// Try direct node invocation as fallback
|
|
102
|
+
const sandboxDir = path.join(os.homedir(), ".gnosys", "sandbox");
|
|
103
|
+
fs.mkdirSync(sandboxDir, { recursive: true });
|
|
104
|
+
const gnosysBin = execSync("which gnosys 2>/dev/null || echo ''", { encoding: "utf8" }).trim();
|
|
105
|
+
if (gnosysBin) {
|
|
106
|
+
execSync(\`\${gnosysBin} sandbox start\`, { stdio: "ignore", timeout: 10_000 });
|
|
107
|
+
} else {
|
|
108
|
+
throw new Error("Cannot auto-start sandbox. Run 'gnosys sandbox start' manually.");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Wait for socket to become available
|
|
113
|
+
const start = Date.now();
|
|
114
|
+
while (Date.now() - start < 5000) {
|
|
115
|
+
try { await send("ping"); _ensured = true; return; } catch { /* retry */ }
|
|
116
|
+
await new Promise(r => setTimeout(r, 200));
|
|
117
|
+
}
|
|
118
|
+
throw new Error("Sandbox started but not responding. Check ~/.gnosys/sandbox/sandbox.log");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ─── Public API ───────────────────────────────────────────────────────────
|
|
122
|
+
|
|
123
|
+
export const gnosys = {
|
|
124
|
+
/** Add a memory to the Gnosys brain */
|
|
125
|
+
async add(content: string, opts?: {
|
|
126
|
+
title?: string;
|
|
127
|
+
category?: string;
|
|
128
|
+
tags?: string[];
|
|
129
|
+
scope?: "project" | "user" | "global";
|
|
130
|
+
}): Promise<{ id: string; title: string }> {
|
|
131
|
+
await ensureRunning();
|
|
132
|
+
const res = await send("add", {
|
|
133
|
+
content,
|
|
134
|
+
...opts,
|
|
135
|
+
tags: opts?.tags ? JSON.stringify(opts.tags) : undefined,
|
|
136
|
+
project_id: opts?.scope === "global" ? undefined : PROJECT_ID,
|
|
137
|
+
});
|
|
138
|
+
if (!res.ok) throw new Error(res.error || "add failed");
|
|
139
|
+
return res.result as { id: string; title: string };
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
/** Recall memories relevant to a query */
|
|
143
|
+
async recall(query: string, opts?: {
|
|
144
|
+
limit?: number;
|
|
145
|
+
}): Promise<Array<{
|
|
146
|
+
id: string;
|
|
147
|
+
title: string;
|
|
148
|
+
content: string;
|
|
149
|
+
category: string;
|
|
150
|
+
confidence: number;
|
|
151
|
+
score: number;
|
|
152
|
+
}>> {
|
|
153
|
+
await ensureRunning();
|
|
154
|
+
const res = await send("recall", {
|
|
155
|
+
query,
|
|
156
|
+
limit: opts?.limit,
|
|
157
|
+
project_id: PROJECT_ID,
|
|
158
|
+
});
|
|
159
|
+
if (!res.ok) throw new Error(res.error || "recall failed");
|
|
160
|
+
return res.result as any[];
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
/** Reinforce a memory (boost its confidence and visibility) */
|
|
164
|
+
async reinforce(idOrQuery: string): Promise<{
|
|
165
|
+
id: string;
|
|
166
|
+
reinforcement_count: number;
|
|
167
|
+
confidence: number;
|
|
168
|
+
}> {
|
|
169
|
+
await ensureRunning();
|
|
170
|
+
const isId = idOrQuery.startsWith("mem-") || /^[a-z]+-\\d+/.test(idOrQuery);
|
|
171
|
+
const params = isId ? { id: idOrQuery } : { query: idOrQuery };
|
|
172
|
+
const res = await send("reinforce", params);
|
|
173
|
+
if (!res.ok) throw new Error(res.error || "reinforce failed");
|
|
174
|
+
return res.result as any;
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
/** List memories (optionally filtered) */
|
|
178
|
+
async list(opts?: {
|
|
179
|
+
category?: string;
|
|
180
|
+
limit?: number;
|
|
181
|
+
}): Promise<Array<{
|
|
182
|
+
id: string;
|
|
183
|
+
title: string;
|
|
184
|
+
category: string;
|
|
185
|
+
confidence: number;
|
|
186
|
+
}>> {
|
|
187
|
+
await ensureRunning();
|
|
188
|
+
const res = await send("list", {
|
|
189
|
+
...opts,
|
|
190
|
+
project_id: PROJECT_ID,
|
|
191
|
+
});
|
|
192
|
+
if (!res.ok) throw new Error(res.error || "list failed");
|
|
193
|
+
return res.result as any[];
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
/** Get database stats */
|
|
197
|
+
async stats(): Promise<{
|
|
198
|
+
active: number;
|
|
199
|
+
archived: number;
|
|
200
|
+
total: number;
|
|
201
|
+
categories: string[];
|
|
202
|
+
projects: number;
|
|
203
|
+
}> {
|
|
204
|
+
await ensureRunning();
|
|
205
|
+
const res = await send("stats");
|
|
206
|
+
if (!res.ok) throw new Error(res.error || "stats failed");
|
|
207
|
+
return res.result as any;
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
/** Reflect on an outcome — updates confidence, adds relationships, creates a reflection memory */
|
|
211
|
+
async reflect(outcome: string, opts?: {
|
|
212
|
+
memory_ids?: string[];
|
|
213
|
+
success?: boolean;
|
|
214
|
+
notes?: string;
|
|
215
|
+
confidence_delta?: number;
|
|
216
|
+
}): Promise<{
|
|
217
|
+
reflection_id: string;
|
|
218
|
+
outcome: "success" | "failure";
|
|
219
|
+
memories_updated: Array<{ id: string; confidence: number; reinforcement_count: number }>;
|
|
220
|
+
relationships_created: number;
|
|
221
|
+
confidence_delta: number;
|
|
222
|
+
}> {
|
|
223
|
+
await ensureRunning();
|
|
224
|
+
const res = await send("reflect", {
|
|
225
|
+
outcome,
|
|
226
|
+
memory_ids: opts?.memory_ids ? JSON.stringify(opts.memory_ids) : undefined,
|
|
227
|
+
success: opts?.success,
|
|
228
|
+
notes: opts?.notes,
|
|
229
|
+
confidence_delta: opts?.confidence_delta,
|
|
230
|
+
});
|
|
231
|
+
if (!res.ok) throw new Error(res.error || "reflect failed");
|
|
232
|
+
return res.result as any;
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
/** Traverse relationship chains starting from a memory (BFS, depth-limited) */
|
|
236
|
+
async traverse(id: string, opts?: {
|
|
237
|
+
depth?: number;
|
|
238
|
+
rel_types?: string[];
|
|
239
|
+
}): Promise<{
|
|
240
|
+
root: string;
|
|
241
|
+
depth: number;
|
|
242
|
+
nodes: Array<{
|
|
243
|
+
id: string;
|
|
244
|
+
title: string;
|
|
245
|
+
category: string;
|
|
246
|
+
confidence: number;
|
|
247
|
+
depth: number;
|
|
248
|
+
via_rel: string | null;
|
|
249
|
+
via_from: string | null;
|
|
250
|
+
}>;
|
|
251
|
+
total: number;
|
|
252
|
+
}> {
|
|
253
|
+
await ensureRunning();
|
|
254
|
+
const res = await send("traverse", {
|
|
255
|
+
id,
|
|
256
|
+
depth: opts?.depth,
|
|
257
|
+
rel_types: opts?.rel_types ? JSON.stringify(opts.rel_types) : undefined,
|
|
258
|
+
});
|
|
259
|
+
if (!res.ok) throw new Error(res.error || "traverse failed");
|
|
260
|
+
return res.result as any;
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export default gnosys;
|
|
265
|
+
`;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Write the helper library file to the specified directory.
|
|
269
|
+
*/
|
|
270
|
+
export async function generateHelper(targetDir) {
|
|
271
|
+
// Try to detect the project identity
|
|
272
|
+
let projectId = null;
|
|
273
|
+
try {
|
|
274
|
+
const identity = await findProjectIdentity(targetDir);
|
|
275
|
+
projectId = identity?.identity.projectId || null;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
// No project identity found — that's fine
|
|
279
|
+
}
|
|
280
|
+
const source = generateHelperSource(projectId);
|
|
281
|
+
const outputPath = path.join(targetDir, "gnosys-helper.ts");
|
|
282
|
+
fs.writeFileSync(outputPath, source, "utf8");
|
|
283
|
+
return outputPath;
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=helper-template.js.map
|