pi-vault-mind 0.8.0 → 0.8.3
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/CHANGELOG.md +20 -0
- package/README.md +44 -44
- package/agents/broadcaster.agent.md +30 -0
- package/agents/heavy-lifter.agent.md +30 -0
- package/agents/manager.agent.md +29 -0
- package/agents/miner.agent.md +29 -0
- package/dist/src/agent-bus/Agent.d.ts +49 -0
- package/dist/src/agent-bus/Agent.js +97 -0
- package/dist/src/agent-bus/AgentLoader.d.ts +33 -0
- package/dist/src/agent-bus/AgentLoader.js +102 -0
- package/dist/src/agent-bus/AgentRegistry.d.ts +17 -0
- package/dist/src/agent-bus/AgentRegistry.js +20 -0
- package/dist/src/agent-bus/LLMProvider.d.ts +36 -0
- package/dist/src/agent-bus/LLMProvider.js +125 -0
- package/dist/src/agent-bus/MessageBus.d.ts +47 -0
- package/dist/src/agent-bus/MessageBus.js +81 -0
- package/dist/src/agent-bus/TaskQueue.d.ts +27 -0
- package/dist/src/agent-bus/TaskQueue.js +57 -0
- package/dist/src/agent-bus/index.d.ts +6 -0
- package/dist/src/agent-bus/index.js +6 -0
- package/dist/src/agents/BroadcasterAgent.d.ts +19 -0
- package/dist/src/agents/BroadcasterAgent.js +70 -0
- package/dist/src/agents/HeavyLifterAgent.d.ts +26 -0
- package/dist/src/agents/HeavyLifterAgent.js +73 -0
- package/dist/src/agents/ManagerAgent.d.ts +20 -0
- package/dist/src/agents/ManagerAgent.js +71 -0
- package/dist/src/agents/MinerAgent.d.ts +19 -0
- package/dist/src/agents/MinerAgent.js +70 -0
- package/dist/src/agents/index.d.ts +4 -0
- package/dist/src/agents/index.js +4 -0
- package/dist/src/auth.d.ts +49 -2
- package/dist/src/auth.js +149 -7
- package/dist/src/autosync.d.ts +1 -1
- package/dist/src/autosync.js +3 -3
- package/dist/src/bridge.d.ts +45 -0
- package/dist/src/bridge.js +189 -0
- package/dist/src/commands.d.ts +1 -1
- package/dist/src/commands.js +419 -295
- package/dist/src/context-capture.d.ts +22 -0
- package/dist/src/context-capture.js +41 -0
- package/dist/src/discover-schema.d.ts +1 -1
- package/dist/src/discover-schema.js +4 -4
- package/dist/src/embed-queue.d.ts +1 -1
- package/dist/src/embed-queue.js +1 -1
- package/dist/src/engine.d.ts +65 -0
- package/dist/src/engine.js +244 -0
- package/dist/src/events.js +1 -1
- package/dist/src/graph.d.ts +3 -3
- package/dist/src/identity-injector.d.ts +15 -0
- package/dist/src/identity-injector.js +102 -0
- package/dist/src/index.js +88 -49
- package/dist/src/intake.js +4 -4
- package/dist/src/lance.d.ts +11 -37
- package/dist/src/lance.js +183 -240
- package/dist/src/modal-client.d.ts +14 -4
- package/dist/src/modal-client.js +50 -34
- package/dist/src/modal-config.d.ts +26 -10
- package/dist/src/modal-config.js +36 -5
- package/dist/src/personalize.d.ts +47 -0
- package/dist/src/personalize.js +352 -0
- package/dist/src/server.d.ts +30 -4
- package/dist/src/server.js +146 -64
- package/dist/src/settings-ui.d.ts +3 -1
- package/dist/src/settings-ui.js +84 -77
- package/dist/src/status.d.ts +25 -0
- package/dist/src/status.js +49 -0
- package/dist/src/sync.d.ts +1 -1
- package/dist/src/sync.js +19 -19
- package/dist/src/tombstone.js +2 -2
- package/dist/src/tools.js +112 -130
- package/dist/src/types.d.ts +86 -18
- package/dist/src/types.js +7 -4
- package/dist/src/utils.d.ts +5 -1
- package/dist/src/utils.js +24 -8
- package/dist/src/vault-tools.d.ts +29 -0
- package/dist/src/vault-tools.js +314 -0
- package/dist/src/vault-writer.d.ts +4 -5
- package/dist/src/vault-writer.js +13 -13
- package/dist/src/vm-handlers.d.ts +15 -0
- package/dist/src/vm-handlers.js +469 -0
- package/dist/src/watcher.d.ts +18 -4
- package/dist/src/watcher.js +109 -98
- package/dist/test/auth.test.js +57 -7
- package/dist/test/bridge-identity.test.js +388 -0
- package/dist/test/discover-schema.test.js +2 -2
- package/dist/test/engine-identity.test.js +119 -0
- package/dist/test/index.test.js +5 -6
- package/dist/test/lance-modal.test.js +7 -7
- package/dist/test/modal-config.test.js +51 -29
- package/dist/test/personalize.test.js +212 -0
- package/dist/test/rest-queue.test.js +1 -1
- package/dist/test/rest-setup.test.js +21 -21
- package/dist/test/{rest-wiki.test.js → rest-vm.test.js} +27 -23
- package/dist/test/server-ws.test.js +4 -4
- package/dist/test/sync.test.js +2 -2
- package/dist/test/tombstone.test.js +1 -1
- package/dist/test/vault-tools.test.js +224 -0
- package/package.json +2 -1
- package/scripts/check-deps.sh +207 -0
- package/scripts/e2e-ws.mjs +4 -4
- package/scripts/modal-e2e-smoke.mjs +1 -1
- package/scripts/setup-test-config.sh +1 -5
- package/scripts/test-slash-commands.mjs +197 -0
- package/skills/.agents/broadcaster.agent.md +31 -0
- package/skills/.agents/heavy-lifter.agent.md +31 -0
- package/skills/.agents/manager.agent.md +30 -0
- package/skills/.agents/miner.agent.md +30 -0
- package/skills/vault-mind/SKILL.md +50 -50
- package/skills/vault-mind/references/tool-reference.md +25 -25
- package/skills/vault-mind-broadcaster/SKILL.md +1 -1
- package/skills/vault-mind-heavy-lifter/SKILL.md +3 -3
- package/skills/vault-mind-manager/SKILL.md +7 -7
- package/skills/vault-mind-miner/SKILL.md +11 -11
- package/skills/vault-mind-setup/SKILL.md +65 -265
- package/skills/vault-mind-setup/references/obsidian-vault-structure.md +6 -6
- package/skills/vault-mind-setup/references/pi-extension-wiring.md +24 -33
- package/skills/vault-mind-setup/references/troubleshooting-tree.md +25 -26
- package/dist/src/auto-index.d.ts +0 -47
- package/dist/src/auto-index.js +0 -122
package/dist/src/index.js
CHANGED
|
@@ -1,72 +1,111 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { MessageBus } from "./agent-bus/MessageBus.js";
|
|
4
|
+
import { TaskQueue } from "./agent-bus/TaskQueue.js";
|
|
3
5
|
import { startAutoSync } from "./autosync.js";
|
|
6
|
+
import { createBridge } from "./bridge.js";
|
|
4
7
|
import { registerCommands, selectActiveCollection, serverState, watcherState } from "./commands.js";
|
|
8
|
+
import { enableACM } from "./context-capture.js";
|
|
9
|
+
import { startEngine, stopEngine } from "./engine.js";
|
|
5
10
|
import { handleBeforeAgentStart, handleTurnEnd } from "./events.js";
|
|
11
|
+
import { registerIdentityInjector } from "./identity-injector.js";
|
|
6
12
|
import { registerIntakeTool } from "./intake.js";
|
|
7
13
|
import { startServer, stopServer } from "./server.js";
|
|
14
|
+
import { clearEngineStatus, clearWatcherStatus, registerStatusCapture, setEngineStatus, } from "./status.js";
|
|
8
15
|
import { registerTools } from "./tools.js";
|
|
9
16
|
import { EXT_ROOT } from "./utils.js";
|
|
10
17
|
import { loadConfig } from "./utils.js";
|
|
11
|
-
import {
|
|
18
|
+
import { registerVaultTools } from "./vault-tools.js";
|
|
19
|
+
import { registerAllExtensionTools } from "./vm-handlers.js";
|
|
20
|
+
import { startWatcher, stopWatcher, subscribeJobCompleted } from "./watcher.js";
|
|
12
21
|
import { updateActiveCollectionWidget } from "./widget.js";
|
|
13
22
|
let stopAutoSync = null;
|
|
23
|
+
let engineState = null;
|
|
14
24
|
export default function (pi) {
|
|
15
|
-
/* expose skills directory */
|
|
25
|
+
/* expose skills directory — event listener only, safe during load */
|
|
16
26
|
pi.on("resources_discover", async (_event) => {
|
|
17
27
|
const skillsDir = path.join(EXT_ROOT, "skills");
|
|
18
28
|
return fs.existsSync(skillsDir) ? { skillPaths: [skillsDir] } : {};
|
|
19
29
|
});
|
|
30
|
+
/* Defer all action-method calls to session_start.
|
|
31
|
+
* pi 0.79.9+ rejects pi.registerCommand/registerTool/registerShortcut
|
|
32
|
+
* during extension loading — the runtime must be initialized first. */
|
|
20
33
|
pi.on("session_start", async (_event, ctx) => {
|
|
21
34
|
updateActiveCollectionWidget(ctx);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
35
|
+
enableACM(pi);
|
|
36
|
+
/* register shortcut */
|
|
37
|
+
pi.registerShortcut("ctrl+alt+l", {
|
|
38
|
+
description: "Select Active Collection",
|
|
39
|
+
handler: async (ctx) => {
|
|
40
|
+
await selectActiveCollection(ctx);
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
/* capture ctx.ui.setStatus for TUI footer indicators */
|
|
44
|
+
registerStatusCapture(pi);
|
|
45
|
+
/* register commands */
|
|
46
|
+
registerCommands(pi);
|
|
47
|
+
/* register tools */
|
|
48
|
+
registerTools(pi);
|
|
49
|
+
registerVaultTools(pi);
|
|
50
|
+
registerIntakeTool(pi);
|
|
51
|
+
/* agent bus — bus, bridge, vm_* handlers, engine, JOB_COMPLETED watcher */
|
|
52
|
+
const bus = new MessageBus();
|
|
53
|
+
const taskQueue = new TaskQueue();
|
|
54
|
+
createBridge(pi, bus);
|
|
55
|
+
registerAllExtensionTools(bus);
|
|
56
|
+
subscribeJobCompleted(bus, watcherState);
|
|
57
|
+
watcherState.bus = bus;
|
|
58
|
+
void startEngine({ bus, taskQueue })
|
|
59
|
+
.then((state) => {
|
|
60
|
+
engineState = state;
|
|
61
|
+
setEngineStatus(state.agents.length);
|
|
62
|
+
console.log(`[pi-vault-mind] Agent engine started (${state.agents.length} agent(s) loaded)`);
|
|
63
|
+
})
|
|
64
|
+
.catch((err) => {
|
|
65
|
+
console.error("[pi-vault-mind] Agent engine failed to start:", err);
|
|
66
|
+
});
|
|
67
|
+
/* identity boundary injector */
|
|
68
|
+
registerIdentityInjector(pi);
|
|
69
|
+
/* before_agent_start: dynamic injectors */
|
|
70
|
+
pi.on("before_agent_start", async (event, ctx) => {
|
|
71
|
+
return handleBeforeAgentStart(pi, event, ctx);
|
|
72
|
+
});
|
|
73
|
+
/* turn_end: capture pi-context events */
|
|
74
|
+
pi.on("turn_end", async (event, ctx) => {
|
|
75
|
+
return handleTurnEnd(pi, event, ctx);
|
|
76
|
+
});
|
|
77
|
+
/* watcher: auto-start if vaults configured */
|
|
78
|
+
try {
|
|
79
|
+
const cfg = loadConfig(process.cwd());
|
|
80
|
+
serverState.port = cfg.vaultMind.httpPort || 11435;
|
|
81
|
+
startServer(pi, serverState, watcherState);
|
|
82
|
+
if (cfg.vaultMind.vaults && Object.keys(cfg.vaultMind.vaults).length > 0) {
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
console.log("[pi-vault-mind] Auto-starting watcher for", Object.keys(cfg.vaultMind.vaults).length, "vault(s)");
|
|
85
|
+
const vaults = cfg.vaultMind.vaults;
|
|
86
|
+
if (vaults)
|
|
87
|
+
startWatcher(pi, vaults, watcherState);
|
|
88
|
+
}, 2000);
|
|
89
|
+
}
|
|
90
|
+
/* auto-sync: off by default; only starts when modal.sync.autoSync is true */
|
|
91
|
+
if (cfg.vaultMind.embedding.remoteUrl && cfg.vaultMind.embedding.modal?.sync?.autoSync) {
|
|
92
|
+
stopAutoSync = startAutoSync(cfg.vaultMind.embedding.modal?.sync?.autoSyncIntervalMs ?? 300000);
|
|
93
|
+
console.log(`[pi-vault-mind] Modal auto-sync enabled (every ${cfg.vaultMind.embedding.modal?.sync?.autoSyncIntervalMs ?? 300000}ms)`);
|
|
94
|
+
}
|
|
55
95
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
stopAutoSync = startAutoSync(cfg.wiki.embedding.modal?.sync?.autoSyncIntervalMs ?? 300000);
|
|
59
|
-
console.log(`[pi-vault-mind] Modal auto-sync enabled (every ${cfg.wiki.embedding.modal?.sync?.autoSyncIntervalMs ?? 300000}ms)`);
|
|
96
|
+
catch {
|
|
97
|
+
/* config may not exist yet; user can start watcher manually via /vm watcher start */
|
|
60
98
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
99
|
+
/* session_shutdown: stop the watcher, server, and engine */
|
|
100
|
+
pi.on("session_shutdown", async () => {
|
|
101
|
+
stopWatcher(watcherState);
|
|
102
|
+
stopServer(serverState);
|
|
103
|
+
if (stopAutoSync)
|
|
104
|
+
stopAutoSync();
|
|
105
|
+
if (engineState)
|
|
106
|
+
stopEngine(engineState);
|
|
107
|
+
clearEngineStatus();
|
|
108
|
+
clearWatcherStatus();
|
|
109
|
+
});
|
|
71
110
|
});
|
|
72
111
|
}
|
package/dist/src/intake.js
CHANGED
|
@@ -11,8 +11,8 @@ import { ensureDir, expandHome, loadConfig } from "./utils.js";
|
|
|
11
11
|
* (returns undefined), so we build multi-select by looping ctx.ui.select()
|
|
12
12
|
* with a control item ("✓ Done") and a "Cancel" item. This works in both
|
|
13
13
|
* TUI and RPC and gives us an explicit cancel signal.
|
|
14
|
-
* 2. Vault path resolution: loadConfig() already expands
|
|
15
|
-
* (see src/utils.ts expandVaultPaths). We use cfg.
|
|
14
|
+
* 2. Vault path resolution: loadConfig() already expands vaultMind.vaults.default.path
|
|
15
|
+
* (see src/utils.ts expandVaultPaths). We use cfg.vaultMind.vaults.default.path.
|
|
16
16
|
* 3. Atomic vault write: VaultWriter already ensures Agent/Inbox/ exists, so we
|
|
17
17
|
* reuse it when available; fall back to mkdirSync + writeFileSync.
|
|
18
18
|
* 4. Progress indicator: ctx.ui.setStatus("ask_intake", "Question 2 of 7...")
|
|
@@ -131,7 +131,7 @@ export const registerIntakeTool = (pi) => {
|
|
|
131
131
|
pi.registerTool({
|
|
132
132
|
name: "ask_intake",
|
|
133
133
|
label: "Ask Intake",
|
|
134
|
-
description: "Ask the user a structured questionnaire (single or multi-select, free text) and optionally persist answers to the
|
|
134
|
+
description: "Ask the user a structured questionnaire (single or multi-select, free text) and optionally persist answers to the durable store, the Obsidian vault, or both.",
|
|
135
135
|
promptSnippet: 'ask_intake(questions=[{question:"...", header:"...", options:[{label:"...", description:"..."}], multi_select:false}], persist="none")',
|
|
136
136
|
promptGuidelines: [
|
|
137
137
|
"Use ask_intake when you need structured answers from the user and want them persisted.",
|
|
@@ -199,7 +199,7 @@ const persistToLedger = (ctx, answers, collection) => {
|
|
|
199
199
|
};
|
|
200
200
|
const persistToVault = (ctx, answers, questions) => {
|
|
201
201
|
const cfg = loadConfig(ctx.cwd);
|
|
202
|
-
const vaultCfg = cfg.
|
|
202
|
+
const vaultCfg = cfg.vaultMind.vaults?.default;
|
|
203
203
|
if (!vaultCfg?.path) {
|
|
204
204
|
ctx.ui.notify("ask_intake: no default vault configured — skipping vault persist.", "warning");
|
|
205
205
|
return null;
|
package/dist/src/lance.d.ts
CHANGED
|
@@ -1,47 +1,21 @@
|
|
|
1
|
-
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
|
|
2
1
|
import * as lancedb from "@lancedb/lancedb";
|
|
3
|
-
import type {
|
|
2
|
+
import type { AgentIdentity } from "./bridge.js";
|
|
3
|
+
import type { VaultMindConfig } from "./types.js";
|
|
4
4
|
export declare const connect: (dataDir: string) => Promise<lancedb.Connection>;
|
|
5
5
|
export declare const resetConnection: () => void;
|
|
6
|
-
export
|
|
7
|
-
name: string;
|
|
8
|
-
size: string;
|
|
9
|
-
modified: string;
|
|
10
|
-
details?: {
|
|
11
|
-
family?: string;
|
|
12
|
-
parameter_size?: string;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Discover Ollama models using multiple paths (matching pi-model-router pattern):
|
|
17
|
-
* 1. Try `pi.exec('ollama', ['list'])` — Pi's managed shell execution
|
|
18
|
-
* 2. Fall back to HTTP /api/tags
|
|
19
|
-
* 3. Fall back to Pi's cached models.json
|
|
20
|
-
*/
|
|
21
|
-
export declare const discoverOllamaModels: (piOrHost?: ExtensionAPI | string) => Promise<OllamaModelInfo[]>;
|
|
22
|
-
/**
|
|
23
|
-
* Test Ollama connectivity. Uses pi.exec first, then HTTP.
|
|
24
|
-
*/
|
|
25
|
-
export declare const testOllamaConnection: (hostOrPi?: string | ExtensionAPI) => Promise<{
|
|
26
|
-
reachable: boolean;
|
|
27
|
-
models: OllamaModelInfo[];
|
|
28
|
-
error?: string;
|
|
29
|
-
}>;
|
|
30
|
-
/**
|
|
31
|
-
* Pull a model from Ollama. Uses pi.exec for managed timeout, falls back to HTTP.
|
|
32
|
-
*/
|
|
33
|
-
export declare const pullOllamaModel: (model: string, piOrHost?: ExtensionAPI | string) => Promise<{
|
|
34
|
-
success: boolean;
|
|
35
|
-
message: string;
|
|
36
|
-
}>;
|
|
37
|
-
export declare const upsertEntry: (dataDir: string, collectionName: string, entry: Record<string, string>, cfg: WikiConfig) => Promise<void>;
|
|
6
|
+
export declare const upsertEntry: (dataDir: string, collectionName: string, entry: Record<string, string>, cfg: VaultMindConfig, identity?: AgentIdentity) => Promise<void>;
|
|
38
7
|
/**
|
|
39
8
|
* Precomputed-vector insert path — used by sync. Upserts rows that are already
|
|
40
9
|
* embedded (vectors come from the server) into the namespaced table, keyed by
|
|
41
10
|
* `id` (merge-insert). Bypasses the auto-embed source field entirely. Carries
|
|
42
11
|
* text + metadata. Idempotent (re-fetching a boundary row is a no-op).
|
|
43
12
|
*/
|
|
44
|
-
export declare const upsertPrecomputed: (dataDir: string, collectionName: string, model: string, dim: number, rows: Array<Record<string, unknown>>, cfg:
|
|
45
|
-
|
|
46
|
-
|
|
13
|
+
export declare const upsertPrecomputed: (dataDir: string, collectionName: string, model: string, dim: number, rows: Array<Record<string, unknown>>, cfg: VaultMindConfig, identity?: AgentIdentity) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Deterministic JSONL query for a collection. Applies optional substring search,
|
|
16
|
+
* exact field filters, identity visibility filter, and pagination.
|
|
17
|
+
*/
|
|
18
|
+
export declare const queryCollection: (collectionPath: string, schema: string[], query: string | null | undefined, filters: Record<string, string> | undefined, limit: number, offset: number, identity?: AgentIdentity) => Promise<unknown[]>;
|
|
19
|
+
export declare const searchHybrid: (dataDir: string, collectionName: string, query: string, limit: number, cfg: VaultMindConfig, identity?: AgentIdentity) => Promise<unknown[]>;
|
|
20
|
+
export declare const searchFts: (dataDir: string, collectionName: string, query: string, limit: number, cfg: VaultMindConfig, identity?: AgentIdentity) => Promise<unknown[]>;
|
|
47
21
|
export declare const getStatus: (dataDir: string) => Promise<Record<string, unknown>>;
|