march-cli 0.1.21 → 0.1.22
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/bin/march.mjs +13 -13
- package/package.json +43 -43
- package/src/agent/command-exec-tool.mjs +172 -168
- package/src/agent/context-stats-tool.mjs +57 -57
- package/src/agent/editing/diff-apply.mjs +28 -28
- package/src/agent/editing/diff-format.mjs +57 -57
- package/src/agent/editing/lsp-report.mjs +69 -69
- package/src/agent/file-edit-tool.mjs +262 -262
- package/src/agent/file-tools/read-file-tool.mjs +112 -112
- package/src/agent/file-tools/read-image-tool.mjs +76 -76
- package/src/agent/model-payload-dumper.mjs +208 -208
- package/src/agent/pi-session/pi-session-sidecar-failure.mjs +10 -10
- package/src/agent/provider/payload-messages.mjs +138 -138
- package/src/agent/runner/codex-large-context-guard.mjs +87 -87
- package/src/agent/runner/codex-transport-compression.mjs +180 -180
- package/src/agent/runner/codex-transport-debug.mjs +113 -113
- package/src/agent/runner/codex-websocket-event-debug.mjs +130 -130
- package/src/agent/runner/fast-model.mjs +36 -36
- package/src/agent/runner/runner-cleanup.mjs +12 -12
- package/src/agent/runner/runner-init.mjs +15 -15
- package/src/agent/runner/runner-session-state.mjs +40 -40
- package/src/agent/runner/runner-utils.mjs +24 -24
- package/src/agent/runner.mjs +299 -299
- package/src/agent/runtime/ipc/ipc-peer.mjs +99 -99
- package/src/agent/runtime/ipc/process-ipc-transport.mjs +16 -16
- package/src/agent/runtime/remote-runner-client.mjs +73 -73
- package/src/agent/runtime/remote-ui-client.mjs +20 -20
- package/src/agent/runtime/runner-ipc-target.mjs +125 -125
- package/src/agent/runtime/runner-process-client.mjs +47 -47
- package/src/agent/runtime/runner-process-entry.mjs +11 -11
- package/src/agent/runtime/runner-process-factory.mjs +108 -108
- package/src/agent/runtime/runner-runtime-host.mjs +79 -79
- package/src/agent/runtime/runtime-factory.mjs +42 -42
- package/src/agent/runtime/runtime-host.mjs +34 -34
- package/src/agent/runtime/ui-event-bridge.mjs +95 -95
- package/src/agent/screen-tools/list-windows-tool.mjs +39 -39
- package/src/agent/screen-tools/screen-tool.mjs +49 -49
- package/src/agent/screen-tools/windows-screen.mjs +133 -133
- package/src/agent/session/session-auto-name.mjs +41 -41
- package/src/agent/session/session-binding.mjs +12 -12
- package/src/agent/session/session-options.mjs +47 -47
- package/src/agent/tool-names.mjs +1 -1
- package/src/agent/tool-result.mjs +3 -3
- package/src/agent/tool-summary.mjs +112 -112
- package/src/agent/tools.mjs +58 -58
- package/src/agent/turn/turn-events.mjs +111 -111
- package/src/agent/turn/turn-logging.mjs +30 -30
- package/src/agent/turn/turn-runner.mjs +196 -196
- package/src/agent/vision-capability.mjs +14 -14
- package/src/auth/login-command.mjs +90 -90
- package/src/auth/storage.mjs +34 -34
- package/src/cli/args.mjs +79 -79
- package/src/cli/commands/copy-command.mjs +87 -87
- package/src/cli/commands/export-command.mjs +206 -206
- package/src/cli/commands/extensions-command.mjs +53 -53
- package/src/cli/commands/help-command.mjs +7 -7
- package/src/cli/commands/model-command.mjs +141 -141
- package/src/cli/commands/paste-image-command.mjs +43 -43
- package/src/cli/commands/provider-command.mjs +59 -59
- package/src/cli/commands/status-command.mjs +194 -194
- package/src/cli/commands/thinking-command.mjs +87 -87
- package/src/cli/fallback-ui.mjs +156 -156
- package/src/cli/input/attachment-tokens.mjs +20 -20
- package/src/cli/input/autocomplete.mjs +74 -106
- package/src/cli/input/external-editor.mjs +39 -39
- package/src/cli/input/file-search/index.mjs +160 -0
- package/src/cli/input/history-store.mjs +35 -35
- package/src/cli/input/image-clipboard.mjs +55 -55
- package/src/cli/input/keybinding-dispatch.mjs +76 -76
- package/src/cli/input/keybindings.mjs +96 -96
- package/src/cli/input/mode-state.mjs +43 -43
- package/src/cli/input/prompt-templates.mjs +84 -84
- package/src/cli/input/select-with-keyboard.mjs +86 -86
- package/src/cli/permissions.mjs +103 -103
- package/src/cli/repl-commands.mjs +86 -86
- package/src/cli/repl-loop.mjs +183 -183
- package/src/cli/selector-list.mjs +21 -21
- package/src/cli/session/pi-session-switch-command.mjs +41 -41
- package/src/cli/session/session-command.mjs +23 -23
- package/src/cli/session/session-list-command.mjs +68 -68
- package/src/cli/session/session-name-command.mjs +26 -26
- package/src/cli/session/session-source-command.mjs +89 -89
- package/src/cli/session/session-switch-command.mjs +1 -1
- package/src/cli/shell/shell-command.mjs +55 -55
- package/src/cli/shell/shell-drawer-controls.mjs +33 -33
- package/src/cli/shell/shell-drawer.mjs +192 -192
- package/src/cli/shell/shell-split-layout.mjs +70 -70
- package/src/cli/slash-commands.mjs +192 -192
- package/src/cli/startup/create-runtime-runner.mjs +61 -61
- package/src/cli/startup/runtime-close.mjs +23 -23
- package/src/cli/startup/startup-banner.mjs +71 -71
- package/src/cli/startup/startup-session.mjs +51 -51
- package/src/cli/status-line-updater.mjs +75 -75
- package/src/cli/tool-output.mjs +9 -9
- package/src/cli/tui/editor/external-editor-runner.mjs +24 -24
- package/src/cli/tui/input/mouse-selection-controller.mjs +91 -91
- package/src/cli/tui/input/mouse-tracking.mjs +20 -20
- package/src/cli/tui/layout/main-pane-layout.mjs +47 -47
- package/src/cli/tui/layout/safe-render-boundary.mjs +46 -46
- package/src/cli/tui/markdown-renderer.mjs +285 -285
- package/src/cli/tui/output/scroll-state.mjs +79 -79
- package/src/cli/tui/output/text-line-renderer.mjs +50 -50
- package/src/cli/tui/output/tool-card-renderer.mjs +59 -59
- package/src/cli/tui/output/visible-lines.mjs +8 -8
- package/src/cli/tui/output-buffer.mjs +293 -293
- package/src/cli/tui/permission-request-ui.mjs +18 -18
- package/src/cli/tui/recall-rendering.mjs +25 -25
- package/src/cli/tui/render/render-scheduler.mjs +26 -26
- package/src/cli/tui/render/stream-delta-buffer.mjs +46 -46
- package/src/cli/tui/select/editor-select-list.mjs +111 -111
- package/src/cli/tui/selection-screen.mjs +269 -269
- package/src/cli/tui/status/retry-status.mjs +72 -72
- package/src/cli/tui/status/spinner-status.mjs +42 -42
- package/src/cli/tui/status/status-bar.mjs +225 -225
- package/src/cli/tui/syntax/highlighting.mjs +260 -260
- package/src/cli/tui/syntax/languages.mjs +91 -91
- package/src/cli/tui/syntax/tree-sitter/bash.highlights.scm +261 -261
- package/src/cli/tui/syntax/tree-sitter/c.highlights.scm +341 -341
- package/src/cli/tui/syntax/tree-sitter/cpp.highlights.scm +268 -268
- package/src/cli/tui/syntax/tree-sitter/csharp.highlights.scm +577 -577
- package/src/cli/tui/syntax/tree-sitter/css.highlights.scm +109 -109
- package/src/cli/tui/syntax/tree-sitter/diff.highlights.scm +49 -49
- package/src/cli/tui/syntax/tree-sitter/go.highlights.scm +254 -254
- package/src/cli/tui/syntax/tree-sitter/html.highlights.scm +13 -13
- package/src/cli/tui/syntax/tree-sitter/java.highlights.scm +330 -330
- package/src/cli/tui/syntax/tree-sitter/json.highlights.scm +38 -38
- package/src/cli/tui/syntax/tree-sitter/php.highlights.scm +203 -203
- package/src/cli/tui/syntax/tree-sitter/python.highlights.scm +137 -137
- package/src/cli/tui/syntax/tree-sitter/ruby.highlights.scm +309 -309
- package/src/cli/tui/syntax/tree-sitter/rust.highlights.scm +531 -531
- package/src/cli/tui/syntax/tree-sitter/toml.highlights.scm +39 -39
- package/src/cli/tui/syntax/tree-sitter/tsx.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/typescript.highlights.scm +35 -35
- package/src/cli/tui/syntax/tree-sitter/yaml.highlights.scm +99 -99
- package/src/cli/tui/tool-rendering.mjs +87 -87
- package/src/cli/tui/tui-diff-rendering.mjs +157 -157
- package/src/cli/tui/tui-handlers.mjs +111 -111
- package/src/cli/tui/tui-input-controller.mjs +61 -61
- package/src/cli/tui/ui-theme.mjs +157 -157
- package/src/cli/ui.mjs +297 -297
- package/src/config/config-json.mjs +84 -84
- package/src/config/dotenv.mjs +20 -20
- package/src/config/features.mjs +75 -75
- package/src/config/loader.mjs +143 -143
- package/src/config/settings-command.mjs +97 -97
- package/src/context/engine.mjs +198 -198
- package/src/context/injections.mjs +26 -26
- package/src/context/profiles.mjs +39 -39
- package/src/context/project-context.mjs +20 -20
- package/src/context/session-status.mjs +17 -17
- package/src/context/shell-layers.mjs +23 -23
- package/src/context/system-core/base.md +65 -65
- package/src/context/system-core/prompts/deepseek-v4-pro.md +3 -3
- package/src/context/system-core/prompts/default.md +3 -3
- package/src/context/system-core.mjs +35 -35
- package/src/debug/logger.mjs +141 -141
- package/src/debug/model-context-dumper.mjs +52 -52
- package/src/extensions/discovery.mjs +40 -40
- package/src/extensions/lifecycle-adapter.mjs +210 -210
- package/src/extensions/lifecycle-manifest.mjs +69 -69
- package/src/image-gen/index.mjs +7 -7
- package/src/image-gen/provider.mjs +231 -231
- package/src/image-gen/tool.mjs +84 -84
- package/src/lsp/client.mjs +257 -257
- package/src/lsp/diagnostic-store.mjs +42 -42
- package/src/lsp/diagnostics-format.mjs +72 -72
- package/src/lsp/managed-node-server.mjs +99 -99
- package/src/lsp/path-match.mjs +10 -10
- package/src/lsp/server-definitions.mjs +188 -188
- package/src/lsp/servers.mjs +165 -165
- package/src/lsp/service.mjs +110 -110
- package/src/lsp/status-message.mjs +9 -9
- package/src/lsp/typescript-project-resolver.mjs +186 -186
- package/src/main.mjs +299 -299
- package/src/mcp/client.mjs +195 -195
- package/src/mcp/config.mjs +130 -130
- package/src/mcp/index.mjs +48 -48
- package/src/mcp/tools.mjs +98 -98
- package/src/memory/database.mjs +219 -219
- package/src/memory/glossary.mjs +124 -124
- package/src/memory/graph/graph-cascades.mjs +109 -109
- package/src/memory/graph/graph-diagnostics.mjs +73 -73
- package/src/memory/graph/graph-path-removal.mjs +50 -50
- package/src/memory/graph/graph-path-utils.mjs +17 -17
- package/src/memory/graph/graph-primitives.mjs +103 -103
- package/src/memory/graph/graph-read.mjs +159 -159
- package/src/memory/graph.mjs +282 -282
- package/src/memory/markdown/markdown-delete.mjs +23 -23
- package/src/memory/markdown/markdown-format.mjs +128 -128
- package/src/memory/markdown/markdown-recall.mjs +28 -28
- package/src/memory/markdown/ripgrep.mjs +16 -16
- package/src/memory/markdown/sqlite-index.mjs +87 -87
- package/src/memory/markdown-store.mjs +286 -286
- package/src/memory/markdown-tools.mjs +103 -103
- package/src/memory/search.mjs +142 -142
- package/src/memory/snapshot.mjs +86 -86
- package/src/memory/system-views.mjs +120 -120
- package/src/memory/tools.mjs +282 -282
- package/src/network/environment.mjs +131 -131
- package/src/notification/desktop-notifier.mjs +262 -262
- package/src/platform/open-file.mjs +28 -28
- package/src/platform/spawn-command.mjs +27 -27
- package/src/provider/accept-command.mjs +89 -89
- package/src/provider/command.mjs +21 -21
- package/src/provider/config-command.mjs +129 -129
- package/src/provider/custom-provider.mjs +113 -113
- package/src/provider/hosted-tools.mjs +111 -111
- package/src/provider/presets.mjs +72 -72
- package/src/provider/share-command.mjs +79 -79
- package/src/provider/share-payload.mjs +52 -52
- package/src/session/attachment-display.mjs +16 -16
- package/src/session/attachment-references.mjs +65 -65
- package/src/session/attachments.mjs +140 -140
- package/src/session/persist.mjs +1 -1
- package/src/session/pi-manager.mjs +34 -34
- package/src/session/session-utils.mjs +16 -16
- package/src/session/sidecar-sync.mjs +19 -19
- package/src/session/sidecar.mjs +69 -69
- package/src/session/transcript.mjs +83 -83
- package/src/session/tree.mjs +42 -42
- package/src/shell/cli-runtime.mjs +11 -11
- package/src/shell/hints.mjs +12 -12
- package/src/shell/node-pty-adapter.mjs +81 -81
- package/src/shell/runtime-state.mjs +126 -126
- package/src/shell/runtime.mjs +252 -252
- package/src/shell/screen-buffer.mjs +136 -136
- package/src/shell/tool-read.mjs +74 -74
- package/src/shell/tools.mjs +299 -299
- package/src/supergrok/actions/image-generate.mjs +60 -60
- package/src/supergrok/actions/search.mjs +78 -78
- package/src/supergrok/auth.mjs +36 -36
- package/src/supergrok/constants.mjs +18 -18
- package/src/supergrok/oauth-provider.mjs +278 -278
- package/src/supergrok/provider.mjs +35 -35
- package/src/supergrok/response.mjs +76 -76
- package/src/supergrok/tool.mjs +61 -61
- package/src/text/ansi.mjs +3 -3
- package/src/web/config-command.mjs +43 -43
- package/src/web/fetch.mjs +78 -78
- package/src/web/presets.mjs +16 -16
- package/src/web/search.mjs +83 -83
- package/src/web/tools.mjs +107 -107
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
import { ROOT_NODE_UUID } from "./database.mjs";
|
|
2
|
-
|
|
3
|
-
export class SystemViews {
|
|
4
|
-
constructor(db, graph, glossaryService, namespace = "") {
|
|
5
|
-
this.db = db;
|
|
6
|
-
this.graph = graph;
|
|
7
|
-
this.glossarySvc = glossaryService;
|
|
8
|
-
this.namespace = namespace;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* system://boot — children of the root node (project boot entries).
|
|
13
|
-
*/
|
|
14
|
-
boot() {
|
|
15
|
-
const children = this.graph.getChildren(ROOT_NODE_UUID, null, null, this.namespace);
|
|
16
|
-
return children.map(c => ({
|
|
17
|
-
name: c.name,
|
|
18
|
-
node_uuid: c.node_uuid,
|
|
19
|
-
priority: c.priority,
|
|
20
|
-
disclosure: c.disclosure,
|
|
21
|
-
content: c.content_snippet ?? null,
|
|
22
|
-
}));
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* system://index — all paths with their node UUIDs, grouped by domain.
|
|
27
|
-
*/
|
|
28
|
-
index() {
|
|
29
|
-
const rows = this.db.prepare(
|
|
30
|
-
"SELECT domain, path, node_uuid, namespace FROM paths WHERE namespace = ? OR namespace = 'global' ORDER BY domain, path",
|
|
31
|
-
).all(this.namespace);
|
|
32
|
-
const domains = {};
|
|
33
|
-
for (const row of rows) {
|
|
34
|
-
const d = row.domain || "core";
|
|
35
|
-
if (!domains[d]) domains[d] = [];
|
|
36
|
-
domains[d].push({ path: row.path, node_uuid: row.node_uuid, namespace: row.namespace });
|
|
37
|
-
}
|
|
38
|
-
return domains;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* system://recent — most recently updated memories.
|
|
43
|
-
*/
|
|
44
|
-
recent(limit = 20) {
|
|
45
|
-
return this.graph.getRecentMemories(limit, this.namespace);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* system://glossary — all glossary keywords with linked nodes.
|
|
50
|
-
*/
|
|
51
|
-
glossaryList() {
|
|
52
|
-
return this.glossarySvc.getAllKeywords();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* system://diagnostic — health and stats overview.
|
|
57
|
-
*/
|
|
58
|
-
diagnostic() {
|
|
59
|
-
const ns = this.namespace;
|
|
60
|
-
const nodeCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM nodes").get().cnt;
|
|
61
|
-
const memoryCount = this.db.prepare("SELECT COUNT(DISTINCT m.id) AS cnt FROM memories m JOIN paths p ON p.node_uuid = m.node_uuid WHERE m.deprecated = 0 AND (p.namespace = ? OR p.namespace = 'global')").get(ns).cnt;
|
|
62
|
-
const deprecatedCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM memories WHERE deprecated = 1").get().cnt;
|
|
63
|
-
const edgeCount = this.db.prepare("SELECT COUNT(DISTINCT e.id) AS cnt FROM edges e JOIN paths p ON p.edge_id = e.id WHERE p.namespace = ? OR p.namespace = 'global'").get(ns).cnt;
|
|
64
|
-
const pathCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM paths WHERE namespace = ? OR namespace = 'global'").get(ns).cnt;
|
|
65
|
-
const keywordCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM glossary_keywords WHERE namespace = ? OR namespace = 'global'").get(ns).cnt;
|
|
66
|
-
const ftsCount = this.#ftsCount();
|
|
67
|
-
const changesetCount = this.#changesetCount();
|
|
68
|
-
|
|
69
|
-
// Stale nodes: no access in 30 days
|
|
70
|
-
const cutoff = new Date(Date.now() - 30 * 86400000).toISOString();
|
|
71
|
-
const staleNodes = this.db.prepare(
|
|
72
|
-
"SELECT COUNT(*) AS cnt FROM nodes WHERE last_accessed_at IS NOT NULL AND last_accessed_at < ?",
|
|
73
|
-
).get(cutoff).cnt;
|
|
74
|
-
|
|
75
|
-
// Orphan nodes: nodes with no paths pointing to them
|
|
76
|
-
const orphanNodes = this.db.prepare(`
|
|
77
|
-
SELECT COUNT(*) AS cnt FROM nodes n
|
|
78
|
-
WHERE n.uuid != ?
|
|
79
|
-
AND NOT EXISTS (SELECT 1 FROM paths WHERE node_uuid = n.uuid)
|
|
80
|
-
AND NOT EXISTS (SELECT 1 FROM edges WHERE child_uuid = n.uuid)
|
|
81
|
-
`).get(ROOT_NODE_UUID).cnt;
|
|
82
|
-
|
|
83
|
-
// Version chain depth stats
|
|
84
|
-
const versionStats = this.db.prepare(`
|
|
85
|
-
SELECT MAX(vc) AS max_depth, AVG(vc) AS avg_depth
|
|
86
|
-
FROM (SELECT COUNT(*) AS vc FROM memories GROUP BY node_uuid)
|
|
87
|
-
`).get();
|
|
88
|
-
|
|
89
|
-
return {
|
|
90
|
-
counts: {
|
|
91
|
-
nodes: nodeCount,
|
|
92
|
-
memories: memoryCount,
|
|
93
|
-
deprecated_memories: deprecatedCount,
|
|
94
|
-
edges: edgeCount,
|
|
95
|
-
paths: pathCount,
|
|
96
|
-
keywords: keywordCount,
|
|
97
|
-
fts_documents: ftsCount,
|
|
98
|
-
changesets: changesetCount,
|
|
99
|
-
},
|
|
100
|
-
health: {
|
|
101
|
-
stale_nodes: staleNodes,
|
|
102
|
-
orphan_nodes: orphanNodes,
|
|
103
|
-
max_version_depth: versionStats.max_depth ?? 0,
|
|
104
|
-
avg_version_depth: Math.round((versionStats.avg_depth ?? 0) * 100) / 100,
|
|
105
|
-
},
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
#ftsCount() {
|
|
110
|
-
try {
|
|
111
|
-
return this.db.prepare("SELECT COUNT(*) AS cnt FROM search_fts").get().cnt;
|
|
112
|
-
} catch { return 0; }
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
#changesetCount() {
|
|
116
|
-
try {
|
|
117
|
-
return this.db.prepare("SELECT COUNT(*) AS cnt FROM changesets").get().cnt;
|
|
118
|
-
} catch { return 0; }
|
|
119
|
-
}
|
|
120
|
-
}
|
|
1
|
+
import { ROOT_NODE_UUID } from "./database.mjs";
|
|
2
|
+
|
|
3
|
+
export class SystemViews {
|
|
4
|
+
constructor(db, graph, glossaryService, namespace = "") {
|
|
5
|
+
this.db = db;
|
|
6
|
+
this.graph = graph;
|
|
7
|
+
this.glossarySvc = glossaryService;
|
|
8
|
+
this.namespace = namespace;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* system://boot — children of the root node (project boot entries).
|
|
13
|
+
*/
|
|
14
|
+
boot() {
|
|
15
|
+
const children = this.graph.getChildren(ROOT_NODE_UUID, null, null, this.namespace);
|
|
16
|
+
return children.map(c => ({
|
|
17
|
+
name: c.name,
|
|
18
|
+
node_uuid: c.node_uuid,
|
|
19
|
+
priority: c.priority,
|
|
20
|
+
disclosure: c.disclosure,
|
|
21
|
+
content: c.content_snippet ?? null,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* system://index — all paths with their node UUIDs, grouped by domain.
|
|
27
|
+
*/
|
|
28
|
+
index() {
|
|
29
|
+
const rows = this.db.prepare(
|
|
30
|
+
"SELECT domain, path, node_uuid, namespace FROM paths WHERE namespace = ? OR namespace = 'global' ORDER BY domain, path",
|
|
31
|
+
).all(this.namespace);
|
|
32
|
+
const domains = {};
|
|
33
|
+
for (const row of rows) {
|
|
34
|
+
const d = row.domain || "core";
|
|
35
|
+
if (!domains[d]) domains[d] = [];
|
|
36
|
+
domains[d].push({ path: row.path, node_uuid: row.node_uuid, namespace: row.namespace });
|
|
37
|
+
}
|
|
38
|
+
return domains;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* system://recent — most recently updated memories.
|
|
43
|
+
*/
|
|
44
|
+
recent(limit = 20) {
|
|
45
|
+
return this.graph.getRecentMemories(limit, this.namespace);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* system://glossary — all glossary keywords with linked nodes.
|
|
50
|
+
*/
|
|
51
|
+
glossaryList() {
|
|
52
|
+
return this.glossarySvc.getAllKeywords();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* system://diagnostic — health and stats overview.
|
|
57
|
+
*/
|
|
58
|
+
diagnostic() {
|
|
59
|
+
const ns = this.namespace;
|
|
60
|
+
const nodeCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM nodes").get().cnt;
|
|
61
|
+
const memoryCount = this.db.prepare("SELECT COUNT(DISTINCT m.id) AS cnt FROM memories m JOIN paths p ON p.node_uuid = m.node_uuid WHERE m.deprecated = 0 AND (p.namespace = ? OR p.namespace = 'global')").get(ns).cnt;
|
|
62
|
+
const deprecatedCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM memories WHERE deprecated = 1").get().cnt;
|
|
63
|
+
const edgeCount = this.db.prepare("SELECT COUNT(DISTINCT e.id) AS cnt FROM edges e JOIN paths p ON p.edge_id = e.id WHERE p.namespace = ? OR p.namespace = 'global'").get(ns).cnt;
|
|
64
|
+
const pathCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM paths WHERE namespace = ? OR namespace = 'global'").get(ns).cnt;
|
|
65
|
+
const keywordCount = this.db.prepare("SELECT COUNT(*) AS cnt FROM glossary_keywords WHERE namespace = ? OR namespace = 'global'").get(ns).cnt;
|
|
66
|
+
const ftsCount = this.#ftsCount();
|
|
67
|
+
const changesetCount = this.#changesetCount();
|
|
68
|
+
|
|
69
|
+
// Stale nodes: no access in 30 days
|
|
70
|
+
const cutoff = new Date(Date.now() - 30 * 86400000).toISOString();
|
|
71
|
+
const staleNodes = this.db.prepare(
|
|
72
|
+
"SELECT COUNT(*) AS cnt FROM nodes WHERE last_accessed_at IS NOT NULL AND last_accessed_at < ?",
|
|
73
|
+
).get(cutoff).cnt;
|
|
74
|
+
|
|
75
|
+
// Orphan nodes: nodes with no paths pointing to them
|
|
76
|
+
const orphanNodes = this.db.prepare(`
|
|
77
|
+
SELECT COUNT(*) AS cnt FROM nodes n
|
|
78
|
+
WHERE n.uuid != ?
|
|
79
|
+
AND NOT EXISTS (SELECT 1 FROM paths WHERE node_uuid = n.uuid)
|
|
80
|
+
AND NOT EXISTS (SELECT 1 FROM edges WHERE child_uuid = n.uuid)
|
|
81
|
+
`).get(ROOT_NODE_UUID).cnt;
|
|
82
|
+
|
|
83
|
+
// Version chain depth stats
|
|
84
|
+
const versionStats = this.db.prepare(`
|
|
85
|
+
SELECT MAX(vc) AS max_depth, AVG(vc) AS avg_depth
|
|
86
|
+
FROM (SELECT COUNT(*) AS vc FROM memories GROUP BY node_uuid)
|
|
87
|
+
`).get();
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
counts: {
|
|
91
|
+
nodes: nodeCount,
|
|
92
|
+
memories: memoryCount,
|
|
93
|
+
deprecated_memories: deprecatedCount,
|
|
94
|
+
edges: edgeCount,
|
|
95
|
+
paths: pathCount,
|
|
96
|
+
keywords: keywordCount,
|
|
97
|
+
fts_documents: ftsCount,
|
|
98
|
+
changesets: changesetCount,
|
|
99
|
+
},
|
|
100
|
+
health: {
|
|
101
|
+
stale_nodes: staleNodes,
|
|
102
|
+
orphan_nodes: orphanNodes,
|
|
103
|
+
max_version_depth: versionStats.max_depth ?? 0,
|
|
104
|
+
avg_version_depth: Math.round((versionStats.avg_depth ?? 0) * 100) / 100,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#ftsCount() {
|
|
110
|
+
try {
|
|
111
|
+
return this.db.prepare("SELECT COUNT(*) AS cnt FROM search_fts").get().cnt;
|
|
112
|
+
} catch { return 0; }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#changesetCount() {
|
|
116
|
+
try {
|
|
117
|
+
return this.db.prepare("SELECT COUNT(*) AS cnt FROM changesets").get().cnt;
|
|
118
|
+
} catch { return 0; }
|
|
119
|
+
}
|
|
120
|
+
}
|