mindweave 2.5.0 → 3.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/README.md +81 -145
- package/dist/cli/App.js +579 -304
- package/dist/cli/App.js.map +1 -1
- package/dist/cli/analytics.js +27 -18
- package/dist/cli/analytics.js.map +1 -1
- package/dist/cli/attachments.js +34 -0
- package/dist/cli/attachments.js.map +1 -1
- package/dist/cli/bannerFit.js +70 -0
- package/dist/cli/bannerFit.js.map +1 -0
- package/dist/cli/bootstrap.js +41 -3
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands.js +4 -1
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/components/ApprovalBox.js +3 -2
- package/dist/cli/components/ApprovalBox.js.map +1 -1
- package/dist/cli/components/BlockView.js +27 -6
- package/dist/cli/components/BlockView.js.map +1 -1
- package/dist/cli/components/FirstRunFrame.js +2 -1
- package/dist/cli/components/FirstRunFrame.js.map +1 -1
- package/dist/cli/components/KeyManager.js +5 -4
- package/dist/cli/components/KeyManager.js.map +1 -1
- package/dist/cli/components/KeySetup.js +29 -13
- package/dist/cli/components/KeySetup.js.map +1 -1
- package/dist/cli/components/MarathonBox.js +64 -0
- package/dist/cli/components/MarathonBox.js.map +1 -0
- package/dist/cli/components/McpMinitabs.js +8 -7
- package/dist/cli/components/McpMinitabs.js.map +1 -1
- package/dist/cli/components/Picker.js +4 -3
- package/dist/cli/components/Picker.js.map +1 -1
- package/dist/cli/components/PromptInput.js +47 -8
- package/dist/cli/components/PromptInput.js.map +1 -1
- package/dist/cli/components/PulseDot.js +42 -0
- package/dist/cli/components/PulseDot.js.map +1 -0
- package/dist/cli/components/SubagentView.js +9 -6
- package/dist/cli/components/SubagentView.js.map +1 -1
- package/dist/cli/components/TipLine.js +2 -1
- package/dist/cli/components/TipLine.js.map +1 -1
- package/dist/cli/components/ToolGroup.js +65 -49
- package/dist/cli/components/ToolGroup.js.map +1 -1
- package/dist/cli/components/ToolLine.js +20 -19
- package/dist/cli/components/ToolLine.js.map +1 -1
- package/dist/cli/components/TrustGate.js +2 -1
- package/dist/cli/components/TrustGate.js.map +1 -1
- package/dist/cli/components/minitabs.js +3 -2
- package/dist/cli/components/minitabs.js.map +1 -1
- package/dist/cli/desktopApp.js +45 -0
- package/dist/cli/desktopApp.js.map +1 -0
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inkOutputPatch.js +285 -0
- package/dist/cli/inkOutputPatch.js.map +1 -0
- package/dist/cli/inkSpeed.js +29 -0
- package/dist/cli/inkSpeed.js.map +1 -0
- package/dist/cli/inkSpeedLoader.js +47 -0
- package/dist/cli/inkSpeedLoader.js.map +1 -0
- package/dist/cli/inputText.js +30 -0
- package/dist/cli/inputText.js.map +1 -0
- package/dist/cli/keyManager.js +2 -1
- package/dist/cli/keyManager.js.map +1 -1
- package/dist/cli/keyPrefs.js +90 -0
- package/dist/cli/keyPrefs.js.map +1 -0
- package/dist/cli/keySetup.js +5 -2
- package/dist/cli/keySetup.js.map +1 -1
- package/dist/cli/marathonUi.js +113 -0
- package/dist/cli/marathonUi.js.map +1 -0
- package/dist/cli/markdown.js +63 -11
- package/dist/cli/markdown.js.map +1 -1
- package/dist/cli/modes.js +3 -3
- package/dist/cli/modes.js.map +1 -1
- package/dist/cli/prodEnv.js +43 -0
- package/dist/cli/prodEnv.js.map +1 -0
- package/dist/cli/revealPace.js +5 -5
- package/dist/cli/revealPace.js.map +1 -1
- package/dist/cli/revealQueue.js +120 -0
- package/dist/cli/revealQueue.js.map +1 -0
- package/dist/cli/theme.js +47 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/toolDisplay.js +112 -18
- package/dist/cli/toolDisplay.js.map +1 -1
- package/dist/cli/transcript.js +1 -1
- package/dist/cli/transcript.js.map +1 -1
- package/dist/cli/virtualWindow.js +14 -2
- package/dist/cli/virtualWindow.js.map +1 -1
- package/dist/cli/wheelAccel.js +73 -0
- package/dist/cli/wheelAccel.js.map +1 -0
- package/dist/cli/widestLinePatch.js +48 -0
- package/dist/cli/widestLinePatch.js.map +1 -0
- package/dist/cli/workingVerb.js +88 -28
- package/dist/cli/workingVerb.js.map +1 -1
- package/dist/cli/wrap.js +1 -1
- package/dist/cli/wrap.js.map +1 -1
- package/dist/core/contextSettings.js +84 -0
- package/dist/core/contextSettings.js.map +1 -0
- package/dist/core/limitsView.js +40 -0
- package/dist/core/limitsView.js.map +1 -0
- package/dist/core/mcpServers.js +164 -0
- package/dist/core/mcpServers.js.map +1 -0
- package/dist/core/permissions.js +209 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/providerKeys.js +187 -0
- package/dist/core/providerKeys.js.map +1 -0
- package/dist/core/rulesSkills.js +142 -0
- package/dist/core/rulesSkills.js.map +1 -0
- package/dist/core/spendView.js +90 -0
- package/dist/core/spendView.js.map +1 -0
- package/dist/core/turnRunner.js +759 -0
- package/dist/core/turnRunner.js.map +1 -0
- package/dist/drivers/anthropic/client.js +101 -26
- package/dist/drivers/anthropic/client.js.map +1 -1
- package/dist/drivers/anthropic/manifest.js +43 -13
- package/dist/drivers/anthropic/manifest.js.map +1 -1
- package/dist/drivers/cerebras/manifest.js +13 -3
- package/dist/drivers/cerebras/manifest.js.map +1 -1
- package/dist/drivers/deepseek/manifest.js +24 -34
- package/dist/drivers/deepseek/manifest.js.map +1 -1
- package/dist/drivers/glm/manifest.js +21 -6
- package/dist/drivers/glm/manifest.js.map +1 -1
- package/dist/drivers/groq/manifest.js +5 -2
- package/dist/drivers/groq/manifest.js.map +1 -1
- package/dist/drivers/kimi/manifest.js +13 -10
- package/dist/drivers/kimi/manifest.js.map +1 -1
- package/dist/drivers/meta/manifest.js +21 -16
- package/dist/drivers/meta/manifest.js.map +1 -1
- package/dist/drivers/minimax/manifest.js +15 -12
- package/dist/drivers/minimax/manifest.js.map +1 -1
- package/dist/drivers/ollama/catalog.js +71 -0
- package/dist/drivers/ollama/catalog.js.map +1 -0
- package/dist/drivers/ollama/client.js +164 -0
- package/dist/drivers/ollama/client.js.map +1 -0
- package/dist/drivers/ollama/endpoint.js +42 -0
- package/dist/drivers/ollama/endpoint.js.map +1 -0
- package/dist/drivers/ollama/index.js +5 -0
- package/dist/drivers/ollama/index.js.map +1 -0
- package/dist/drivers/ollama/manifest.js +64 -0
- package/dist/drivers/ollama/manifest.js.map +1 -0
- package/dist/drivers/openai/client.js +10 -4
- package/dist/drivers/openai/client.js.map +1 -1
- package/dist/drivers/openai/manifest.js +69 -18
- package/dist/drivers/openai/manifest.js.map +1 -1
- package/dist/drivers/qwen/manifest.js +19 -6
- package/dist/drivers/qwen/manifest.js.map +1 -1
- package/dist/drivers/registry.js +11 -0
- package/dist/drivers/registry.js.map +1 -1
- package/dist/drivers/retryPolicy.js +26 -1
- package/dist/drivers/retryPolicy.js.map +1 -1
- package/dist/drivers/xai/client.js +12 -10
- package/dist/drivers/xai/client.js.map +1 -1
- package/dist/drivers/xai/manifest.js +62 -25
- package/dist/drivers/xai/manifest.js.map +1 -1
- package/dist/dynamo/auxModel.js +54 -0
- package/dist/dynamo/auxModel.js.map +1 -0
- package/dist/dynamo/engine.js +407 -99
- package/dist/dynamo/engine.js.map +1 -1
- package/dist/dynamo/guard.js +10 -0
- package/dist/dynamo/guard.js.map +1 -1
- package/dist/dynamo/liveMeter.js +25 -6
- package/dist/dynamo/liveMeter.js.map +1 -1
- package/dist/dynamo/marathon.js +409 -0
- package/dist/dynamo/marathon.js.map +1 -0
- package/dist/dynamo/marathonPrompt.js +45 -0
- package/dist/dynamo/marathonPrompt.js.map +1 -0
- package/dist/dynamo/model.js +6 -2
- package/dist/dynamo/model.js.map +1 -1
- package/dist/dynamo/toolBatches.js +58 -0
- package/dist/dynamo/toolBatches.js.map +1 -0
- package/dist/dynamo/usageLimits.js +446 -0
- package/dist/dynamo/usageLimits.js.map +1 -0
- package/dist/governor/freshness.js +10 -7
- package/dist/governor/freshness.js.map +1 -1
- package/dist/governor/index.js +76 -9
- package/dist/governor/index.js.map +1 -1
- package/dist/governor/write.js +43 -14
- package/dist/governor/write.js.map +1 -1
- package/dist/index.js +18 -151
- package/dist/index.js.map +1 -1
- package/dist/main.js +162 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp/manager.js +18 -0
- package/dist/mcp/manager.js.map +1 -1
- package/dist/memory/allMetas.js +69 -0
- package/dist/memory/allMetas.js.map +1 -0
- package/dist/memory/compaction.js +70 -15
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/earlier.js +15 -0
- package/dist/memory/earlier.js.map +1 -0
- package/dist/memory/profile.js +93 -0
- package/dist/memory/profile.js.map +1 -0
- package/dist/memory/rewind.js +262 -0
- package/dist/memory/rewind.js.map +1 -0
- package/dist/memory/session.js +42 -10
- package/dist/memory/session.js.map +1 -1
- package/dist/memory/sessionMemory.js +48 -13
- package/dist/memory/sessionMemory.js.map +1 -1
- package/dist/memory/sessionMemoryCompact.js +1 -1
- package/dist/memory/sessionMemoryCompact.js.map +1 -1
- package/dist/memory/sessionTitle.js +50 -0
- package/dist/memory/sessionTitle.js.map +1 -0
- package/dist/memory/store.js +42 -1
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.js.map +1 -1
- package/dist/tools/askUser.js +14 -0
- package/dist/tools/askUser.js.map +1 -1
- package/dist/tools/backgroundShells.js +208 -5
- package/dist/tools/backgroundShells.js.map +1 -1
- package/dist/tools/browser.js +176 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/cdp.js +165 -0
- package/dist/tools/cdp.js.map +1 -0
- package/dist/tools/checkpoints.js +208 -5
- package/dist/tools/checkpoints.js.map +1 -1
- package/dist/tools/deferredNative.js +2 -0
- package/dist/tools/deferredNative.js.map +1 -1
- package/dist/tools/detail.js +9 -6
- package/dist/tools/detail.js.map +1 -1
- package/dist/tools/edit.js +2 -1
- package/dist/tools/edit.js.map +1 -1
- package/dist/tools/exitPlan.js +4 -0
- package/dist/tools/exitPlan.js.map +1 -1
- package/dist/tools/hiddenDesktop.js +273 -0
- package/dist/tools/hiddenDesktop.js.map +1 -0
- package/dist/tools/listeningPorts.js +134 -0
- package/dist/tools/listeningPorts.js.map +1 -0
- package/dist/tools/mcpSearch.js +8 -0
- package/dist/tools/mcpSearch.js.map +1 -1
- package/dist/tools/mindweaveStatus.js +1 -1
- package/dist/tools/mindweaveStatus.js.map +1 -1
- package/dist/tools/registry.js +3 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/replaceSymbol.js +2 -1
- package/dist/tools/replaceSymbol.js.map +1 -1
- package/dist/tools/runCommand.js +113 -9
- package/dist/tools/runCommand.js.map +1 -1
- package/dist/tools/screenshot.js +4 -6
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/screenshotWin.js +26 -9
- package/dist/tools/screenshotWin.js.map +1 -1
- package/dist/tools/stateCheckpoint.js +128 -0
- package/dist/tools/stateCheckpoint.js.map +1 -0
- package/dist/tools/todo.js +6 -0
- package/dist/tools/todo.js.map +1 -1
- package/dist/tools/ui.js +1295 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/uiHide.js +356 -0
- package/dist/tools/uiHide.js.map +1 -0
- package/dist/tools/uiPage.js +861 -0
- package/dist/tools/uiPage.js.map +1 -0
- package/dist/tools/uiWin.js +506 -0
- package/dist/tools/uiWin.js.map +1 -0
- package/dist/tools/webFetch.js +32 -25
- package/dist/tools/webFetch.js.map +1 -1
- package/dist/tools/webSearch.js +12 -0
- package/dist/tools/webSearch.js.map +1 -1
- package/dist/tools/writeFile.js +2 -1
- package/dist/tools/writeFile.js.map +1 -1
- package/package.json +78 -75
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcpServers.js","sourceRoot":"","sources":["../../src/core/mcpServers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* permissions.ts — everything the user decides about what the agent may do, in one
|
|
3
|
+
* place a settings screen can read and change.
|
|
4
|
+
*
|
|
5
|
+
* Four standing lists, each kept per project or for every project (the universal layer
|
|
6
|
+
* in `~/.mindweave`, merged under the project's by governor/index.ts):
|
|
7
|
+
* - protected files (`forbidden.md`), which the agent may never change;
|
|
8
|
+
* - blocked commands (`forbidden-commands.md`), which it may never run;
|
|
9
|
+
* - blocked MCP tools (`forbidden-mcp-tools.md`), never offered to it;
|
|
10
|
+
* - Sentinel allowances (`sentinel-allow.md`), actions Sentinel mode will not ask about.
|
|
11
|
+
* Plus the mode new chats start in, and the allowances given during THIS session, which
|
|
12
|
+
* can be taken back.
|
|
13
|
+
*
|
|
14
|
+
* Every change is written to its file and then applied to the live session at once
|
|
15
|
+
* (`refreshGovernance`), so the next tool call already obeys it.
|
|
16
|
+
*/
|
|
17
|
+
import { promises as fs } from "node:fs";
|
|
18
|
+
import { basename, join } from "node:path";
|
|
19
|
+
import { governanceDir, loadPermissionLists } from "../governor/index.js";
|
|
20
|
+
import { appendForbidden, appendForbiddenCommand, appendForbiddenMcpTool, appendSentinelAllow, removeForbiddenPath, removeForbiddenCommand, removeForbiddenMcpTool, removeSentinelAllow, } from "../governor/write.js";
|
|
21
|
+
import { refreshGovernance } from "../dynamo/engine.js";
|
|
22
|
+
import { TOOLS } from "../tools/registry.js";
|
|
23
|
+
import { isMcpToolName, mcpToolName, parseMcpToolName } from "../mcp/catalog.js";
|
|
24
|
+
import { MODES } from "../cli/modes.js";
|
|
25
|
+
/** The built-in actions Sentinel asks about, in words. Two are left out on purpose:
|
|
26
|
+
* changing the rules themselves (`governor`) and adding MCP servers (`mcp_server`)
|
|
27
|
+
* should always be asked about, whatever else is allowed. */
|
|
28
|
+
const ACTION_LABELS = {
|
|
29
|
+
edit: "Edit files",
|
|
30
|
+
write_file: "Create or overwrite files",
|
|
31
|
+
replace_symbol_body: "Rewrite a function or class",
|
|
32
|
+
run_command: "Run shell commands",
|
|
33
|
+
kill_shell: "Stop background commands",
|
|
34
|
+
spawn_subagent: "Start sub-agents",
|
|
35
|
+
todo_write: "Update its task list",
|
|
36
|
+
workspace: "Add folders to the workspace",
|
|
37
|
+
save_memory: "Save notes to memory",
|
|
38
|
+
skill: "Save skills",
|
|
39
|
+
};
|
|
40
|
+
const NEVER_PRE_ALLOWED = new Set(["governor", "mcp_server"]);
|
|
41
|
+
function toolLabel(name) {
|
|
42
|
+
if (ACTION_LABELS[name])
|
|
43
|
+
return ACTION_LABELS[name];
|
|
44
|
+
const mcp = parseMcpToolName(name);
|
|
45
|
+
return mcp ? `${mcp.tool} (${mcp.server})` : name;
|
|
46
|
+
}
|
|
47
|
+
// ── default mode ──
|
|
48
|
+
const MODE_FILE = "mode.json";
|
|
49
|
+
async function readModeFile(dir) {
|
|
50
|
+
try {
|
|
51
|
+
const raw = JSON.parse(await fs.readFile(join(dir, MODE_FILE), "utf8"));
|
|
52
|
+
return MODES.some((m) => m.enabled && m.id === raw.defaultMode) ? raw.defaultMode : null;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** The mode new chats in this project start in: the project's choice, else the
|
|
59
|
+
* universal one, else null (the app's own default). */
|
|
60
|
+
export async function defaultModeFor(cwd) {
|
|
61
|
+
return (await readModeFile(governanceDir(cwd, "project"))) ?? (await readModeFile(governanceDir(cwd, "global")));
|
|
62
|
+
}
|
|
63
|
+
export async function setDefaultMode(session, scope, mode, cwd = session.cwd) {
|
|
64
|
+
const dir = governanceDir(cwd, scope);
|
|
65
|
+
const file = join(dir, MODE_FILE);
|
|
66
|
+
if (mode === null) {
|
|
67
|
+
await fs.rm(file, { force: true });
|
|
68
|
+
return { ok: true };
|
|
69
|
+
}
|
|
70
|
+
if (!MODES.some((m) => m.enabled && m.id === mode))
|
|
71
|
+
return { ok: false, error: `Unknown mode: ${mode}` };
|
|
72
|
+
await fs.mkdir(dir, { recursive: true });
|
|
73
|
+
await fs.writeFile(file, JSON.stringify({ defaultMode: mode }, null, 2), "utf8");
|
|
74
|
+
return { ok: true };
|
|
75
|
+
}
|
|
76
|
+
// ── the view ──
|
|
77
|
+
/**
|
|
78
|
+
* Everything the Permissions screen shows, for `cwd` (the open project by default, or
|
|
79
|
+
* any other project the user picks). This chat's temporary allowances are only
|
|
80
|
+
* reported for the project that is actually open.
|
|
81
|
+
*/
|
|
82
|
+
export async function permissionsView(session, cwd = session.cwd) {
|
|
83
|
+
const current = sameProject(cwd, session.cwd);
|
|
84
|
+
const [global, project] = await Promise.all([
|
|
85
|
+
loadPermissionLists(cwd, "global"),
|
|
86
|
+
loadPermissionLists(cwd, "project"),
|
|
87
|
+
]);
|
|
88
|
+
const both = (key, withLabel = false) => [
|
|
89
|
+
...project[key].map((value) => ({ value, scope: "project", ...(withLabel ? { label: toolLabel(value) } : {}) })),
|
|
90
|
+
...global[key].map((value) => ({ value, scope: "global", ...(withLabel ? { label: toolLabel(value) } : {}) })),
|
|
91
|
+
];
|
|
92
|
+
const ctx = session.toolContext;
|
|
93
|
+
const mcpDefs = ctx.mcp?.snapshot().catalog ?? [];
|
|
94
|
+
return {
|
|
95
|
+
project: { name: basename(cwd), cwd, current },
|
|
96
|
+
defaultMode: {
|
|
97
|
+
project: await readModeFile(governanceDir(cwd, "project")),
|
|
98
|
+
global: await readModeFile(governanceDir(cwd, "global")),
|
|
99
|
+
},
|
|
100
|
+
modes: MODES.filter((m) => m.enabled).map((m) => ({ id: m.id, name: m.name, descriptor: m.descriptor })),
|
|
101
|
+
lists: {
|
|
102
|
+
path: both("paths"),
|
|
103
|
+
command: both("commands"),
|
|
104
|
+
mcpTool: both("mcpTools", true),
|
|
105
|
+
sentinel: both("sentinelAllow", true),
|
|
106
|
+
},
|
|
107
|
+
session: current
|
|
108
|
+
? {
|
|
109
|
+
sentinel: [...(ctx.guardAllowed ?? [])].map((value) => ({ value, label: toolLabel(value) })),
|
|
110
|
+
lifted: [...(session.governance.lifted ?? [])],
|
|
111
|
+
outsideDirs: [...(ctx.allowedOutsideDirs ?? [])],
|
|
112
|
+
}
|
|
113
|
+
: { sentinel: [], lifted: [], outsideDirs: [] },
|
|
114
|
+
choices: {
|
|
115
|
+
sentinel: [
|
|
116
|
+
...TOOLS.filter((t) => !t.readOnly && !NEVER_PRE_ALLOWED.has(t.name)).map((t) => ({ value: t.name, label: toolLabel(t.name) })),
|
|
117
|
+
...mcpDefs.filter((d) => !d.readOnly).map((d) => ({ value: mcpToolName(d.server, d.name), label: toolLabel(mcpToolName(d.server, d.name)) })),
|
|
118
|
+
],
|
|
119
|
+
mcpTools: mcpDefs.map((d) => ({ value: mcpToolName(d.server, d.name), label: toolLabel(mcpToolName(d.server, d.name)) })),
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// ── changing the lists ──
|
|
124
|
+
/** Clean a value the way its list stores it, or say why it can't be used. */
|
|
125
|
+
function normalize(kind, raw) {
|
|
126
|
+
const value = raw.trim();
|
|
127
|
+
if (!value)
|
|
128
|
+
return { error: "Type something first." };
|
|
129
|
+
if (kind === "path") {
|
|
130
|
+
const path = value.replace(/\\/g, "/").replace(/^\.?\//, "").replace(/\/+$/, "");
|
|
131
|
+
if (/^[a-zA-Z]:\//.test(path) || path.startsWith("../") || path === "..") {
|
|
132
|
+
return { error: "Use a path inside the project, like src/legacy or *.pem, not a full path." };
|
|
133
|
+
}
|
|
134
|
+
return path ? { value: path } : { error: "That path points at the whole project." };
|
|
135
|
+
}
|
|
136
|
+
if (kind === "mcpTool" && !isMcpToolName(value)) {
|
|
137
|
+
return { error: "Pick a tool from the list: MCP tools are named mcp__server__tool." };
|
|
138
|
+
}
|
|
139
|
+
if (kind === "sentinel" && NEVER_PRE_ALLOWED.has(value)) {
|
|
140
|
+
return { error: "Changing permissions and adding MCP servers are always asked about." };
|
|
141
|
+
}
|
|
142
|
+
return { value };
|
|
143
|
+
}
|
|
144
|
+
/** Paths compared the way Windows and macOS treat them: case and slashes don't matter. */
|
|
145
|
+
function sameProject(a, b) {
|
|
146
|
+
const norm = (p) => p.replace(/\\/g, "/").replace(/\/+$/, "").toLowerCase();
|
|
147
|
+
return norm(a) === norm(b);
|
|
148
|
+
}
|
|
149
|
+
async function write(cwd, kind, value, scope) {
|
|
150
|
+
switch (kind) {
|
|
151
|
+
case "path": return (await appendForbidden(cwd, value, scope)).added;
|
|
152
|
+
case "command": return (await appendForbiddenCommand(cwd, value, scope)).added;
|
|
153
|
+
case "mcpTool": return (await appendForbiddenMcpTool(cwd, value, scope)).added;
|
|
154
|
+
case "sentinel": return (await appendSentinelAllow(cwd, value, scope)).added;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function erase(cwd, kind, value, scope) {
|
|
158
|
+
switch (kind) {
|
|
159
|
+
case "path": return removeForbiddenPath(cwd, value, scope);
|
|
160
|
+
case "command": return removeForbiddenCommand(cwd, value, scope);
|
|
161
|
+
case "mcpTool": return removeForbiddenMcpTool(cwd, value, scope);
|
|
162
|
+
case "sentinel": return removeSentinelAllow(cwd, value, scope);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Each writer takes an optional `cwd` for editing a project other than the open one.
|
|
166
|
+
// The open chat is refreshed either way: a universal change reaches it too.
|
|
167
|
+
export async function addPermission(session, kind, raw, scope, cwd = session.cwd) {
|
|
168
|
+
const n = normalize(kind, raw);
|
|
169
|
+
if ("error" in n)
|
|
170
|
+
return { ok: false, error: n.error };
|
|
171
|
+
const added = await write(cwd, kind, n.value, scope);
|
|
172
|
+
if (!added)
|
|
173
|
+
return { ok: false, error: `That is already on the ${scope === "global" ? "all-projects" : "project"} list.` };
|
|
174
|
+
await refreshGovernance(session, true);
|
|
175
|
+
return { ok: true };
|
|
176
|
+
}
|
|
177
|
+
export async function removePermission(session, kind, value, scope, cwd = session.cwd) {
|
|
178
|
+
const removed = await erase(cwd, kind, value, scope);
|
|
179
|
+
if (!removed)
|
|
180
|
+
return { ok: false, error: "That entry is no longer on the list." };
|
|
181
|
+
await refreshGovernance(session, true);
|
|
182
|
+
return { ok: true };
|
|
183
|
+
}
|
|
184
|
+
/** Move an entry between this project and all projects. */
|
|
185
|
+
export async function movePermission(session, kind, value, from, cwd = session.cwd) {
|
|
186
|
+
const to = from === "project" ? "global" : "project";
|
|
187
|
+
await write(cwd, kind, value, to); // already there is fine: the move still ends in one place
|
|
188
|
+
await erase(cwd, kind, value, from);
|
|
189
|
+
await refreshGovernance(session, true);
|
|
190
|
+
return { ok: true };
|
|
191
|
+
}
|
|
192
|
+
/** Take back something allowed during this session. */
|
|
193
|
+
export async function revokeSessionGrant(session, kind, value) {
|
|
194
|
+
const ctx = session.toolContext;
|
|
195
|
+
if (kind === "sentinel") {
|
|
196
|
+
ctx.guardAllowed?.delete(value);
|
|
197
|
+
}
|
|
198
|
+
else if (kind === "outside") {
|
|
199
|
+
ctx.allowedOutsideDirs?.delete(value);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// A lifted pattern returns by dropping it from `lifted` and re-reading from disk,
|
|
203
|
+
// which is where the rule was left in place on purpose.
|
|
204
|
+
session.governance.lifted = (session.governance.lifted ?? []).filter((p) => p !== value);
|
|
205
|
+
await refreshGovernance(session, true);
|
|
206
|
+
}
|
|
207
|
+
return { ok: true };
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* providerKeys.ts — managing a provider's keys from a UI: several per provider, one
|
|
3
|
+
* default, one live, names, switching off, and moving on when one is refused.
|
|
4
|
+
*
|
|
5
|
+
* Built on the CLI's key store rather than beside it (keyStore.ts, bootstrap.ts): keys
|
|
6
|
+
* live in `~/.mindweave/.env` as `VAR_1..VAR_9`, the bare `VAR` is the live one every
|
|
7
|
+
* driver reads, and slot 1 is where each launch starts, which is what "default" means
|
|
8
|
+
* here. Names, the disabled list and the auto-switch setting are in keys.json
|
|
9
|
+
* (keyPrefs.ts). Nothing here ever returns a whole key: a view carries its last four
|
|
10
|
+
* characters and its name.
|
|
11
|
+
*/
|
|
12
|
+
import { allProviders } from "../drivers/registry.js";
|
|
13
|
+
import { keysFor, keyHint, nextFreeSlot, MAX_SLOTS } from "../cli/keyStore.js";
|
|
14
|
+
import { saveApiKey, removeApiKey, makeDefaultApiKey, setLiveApiKey } from "../cli/bootstrap.js";
|
|
15
|
+
import { autoSwitchOn, setAutoSwitch, keyLabel, setKeyLabel, isKeyDisabled, setKeyDisabled, keyFailure, noteKeyFailure, clearKeyFailure, keyFingerprint, } from "../cli/keyPrefs.js";
|
|
16
|
+
function providerById(id) {
|
|
17
|
+
const p = allProviders().find((m) => m.id === id);
|
|
18
|
+
if (!p)
|
|
19
|
+
throw new Error(`Unknown provider: ${id}`);
|
|
20
|
+
return p;
|
|
21
|
+
}
|
|
22
|
+
function find(apiKeyEnv, slot) {
|
|
23
|
+
return keysFor(apiKeyEnv).find((k) => k.slot === slot);
|
|
24
|
+
}
|
|
25
|
+
/** After a key goes away or is switched off, make sure the live key is one that may be sent. */
|
|
26
|
+
function settleLive(apiKeyEnv) {
|
|
27
|
+
const live = process.env[apiKeyEnv]?.trim();
|
|
28
|
+
const keys = keysFor(apiKeyEnv);
|
|
29
|
+
const liveOk = live && keys.some((k) => k.value === live) && !isKeyDisabled(live);
|
|
30
|
+
if (liveOk)
|
|
31
|
+
return;
|
|
32
|
+
setLiveApiKey(apiKeyEnv, keys.find((k) => !isKeyDisabled(k.value))?.value ?? null);
|
|
33
|
+
}
|
|
34
|
+
export function providerKeys(providerId) {
|
|
35
|
+
const p = providerById(providerId);
|
|
36
|
+
const live = process.env[p.apiKeyEnv]?.trim();
|
|
37
|
+
return {
|
|
38
|
+
providerId: p.id,
|
|
39
|
+
label: p.label,
|
|
40
|
+
apiKeyEnv: p.apiKeyEnv,
|
|
41
|
+
keysUrl: p.keysUrl,
|
|
42
|
+
autoSwitch: autoSwitchOn(p.apiKeyEnv),
|
|
43
|
+
maxKeys: MAX_SLOTS,
|
|
44
|
+
keys: keysFor(p.apiKeyEnv).map((k) => {
|
|
45
|
+
const failure = keyFailure(k.value);
|
|
46
|
+
return {
|
|
47
|
+
slot: k.slot,
|
|
48
|
+
hint: keyHint(k.value),
|
|
49
|
+
label: keyLabel(k.value),
|
|
50
|
+
live: k.value === live,
|
|
51
|
+
isDefault: k.slot === 1,
|
|
52
|
+
disabled: isKeyDisabled(k.value),
|
|
53
|
+
...(failure ? { failure } : {}),
|
|
54
|
+
};
|
|
55
|
+
}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function addProviderKey(providerId, value, label = "") {
|
|
59
|
+
const p = providerById(providerId);
|
|
60
|
+
const key = value.trim();
|
|
61
|
+
if (!key)
|
|
62
|
+
return { ok: false, error: "Paste a key first." };
|
|
63
|
+
if (keysFor(p.apiKeyEnv).some((k) => k.value === key))
|
|
64
|
+
return { ok: false, error: "That key is already saved." };
|
|
65
|
+
const slot = nextFreeSlot(p.apiKeyEnv);
|
|
66
|
+
if (slot === null)
|
|
67
|
+
return { ok: false, error: `${p.label} already has ${MAX_SLOTS} keys. Remove one first.` };
|
|
68
|
+
saveApiKey(p.apiKeyEnv, key, slot);
|
|
69
|
+
if (label.trim())
|
|
70
|
+
setKeyLabel(key, label);
|
|
71
|
+
settleLive(p.apiKeyEnv);
|
|
72
|
+
return { ok: true };
|
|
73
|
+
}
|
|
74
|
+
/** Replace a key's value, keeping its slot, its name and whether it is switched off. */
|
|
75
|
+
export function editProviderKey(providerId, slot, value) {
|
|
76
|
+
const p = providerById(providerId);
|
|
77
|
+
const old = find(p.apiKeyEnv, slot);
|
|
78
|
+
const key = value.trim();
|
|
79
|
+
if (!old)
|
|
80
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
81
|
+
if (!key)
|
|
82
|
+
return { ok: false, error: "Paste the new key first." };
|
|
83
|
+
if (key !== old.value && keysFor(p.apiKeyEnv).some((k) => k.value === key))
|
|
84
|
+
return { ok: false, error: "That key is already saved." };
|
|
85
|
+
const label = keyLabel(old.value);
|
|
86
|
+
const disabled = isKeyDisabled(old.value);
|
|
87
|
+
saveApiKey(p.apiKeyEnv, key, slot);
|
|
88
|
+
if (label) {
|
|
89
|
+
setKeyLabel(old.value, "");
|
|
90
|
+
setKeyLabel(key, label);
|
|
91
|
+
}
|
|
92
|
+
if (disabled) {
|
|
93
|
+
setKeyDisabled(old.value, false);
|
|
94
|
+
setKeyDisabled(key, true);
|
|
95
|
+
}
|
|
96
|
+
clearKeyFailure(old.value);
|
|
97
|
+
settleLive(p.apiKeyEnv);
|
|
98
|
+
return { ok: true };
|
|
99
|
+
}
|
|
100
|
+
export function removeProviderKey(providerId, slot) {
|
|
101
|
+
const p = providerById(providerId);
|
|
102
|
+
const old = find(p.apiKeyEnv, slot);
|
|
103
|
+
if (!old)
|
|
104
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
105
|
+
removeApiKey(p.apiKeyEnv, slot);
|
|
106
|
+
setKeyLabel(old.value, "");
|
|
107
|
+
setKeyDisabled(old.value, false);
|
|
108
|
+
clearKeyFailure(old.value);
|
|
109
|
+
settleLive(p.apiKeyEnv);
|
|
110
|
+
return { ok: true };
|
|
111
|
+
}
|
|
112
|
+
/** Send this key from now on, without changing which one is the default. */
|
|
113
|
+
export function useProviderKey(providerId, slot) {
|
|
114
|
+
const p = providerById(providerId);
|
|
115
|
+
const k = find(p.apiKeyEnv, slot);
|
|
116
|
+
if (!k)
|
|
117
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
118
|
+
if (isKeyDisabled(k.value))
|
|
119
|
+
return { ok: false, error: "Turn this key back on first." };
|
|
120
|
+
setLiveApiKey(p.apiKeyEnv, k.value);
|
|
121
|
+
return { ok: true };
|
|
122
|
+
}
|
|
123
|
+
export function makeDefaultProviderKey(providerId, slot) {
|
|
124
|
+
const p = providerById(providerId);
|
|
125
|
+
const k = find(p.apiKeyEnv, slot);
|
|
126
|
+
if (!k)
|
|
127
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
128
|
+
if (isKeyDisabled(k.value))
|
|
129
|
+
setKeyDisabled(k.value, false); // a default that is switched off would be a contradiction
|
|
130
|
+
makeDefaultApiKey(p.apiKeyEnv, slot);
|
|
131
|
+
return { ok: true };
|
|
132
|
+
}
|
|
133
|
+
export function renameProviderKey(providerId, slot, label) {
|
|
134
|
+
const p = providerById(providerId);
|
|
135
|
+
const k = find(p.apiKeyEnv, slot);
|
|
136
|
+
if (!k)
|
|
137
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
138
|
+
setKeyLabel(k.value, label);
|
|
139
|
+
return { ok: true };
|
|
140
|
+
}
|
|
141
|
+
export function setProviderKeyDisabled(providerId, slot, disabled) {
|
|
142
|
+
const p = providerById(providerId);
|
|
143
|
+
const k = find(p.apiKeyEnv, slot);
|
|
144
|
+
if (!k)
|
|
145
|
+
return { ok: false, error: "That key is no longer saved." };
|
|
146
|
+
setKeyDisabled(k.value, disabled);
|
|
147
|
+
settleLive(p.apiKeyEnv);
|
|
148
|
+
return { ok: true };
|
|
149
|
+
}
|
|
150
|
+
export function setProviderAutoSwitch(providerId, on) {
|
|
151
|
+
setAutoSwitch(providerById(providerId).apiKeyEnv, on);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* A key was refused with `status`. Record it, and when the provider is allowed to move
|
|
155
|
+
* on, switch the drivers to the next key that is switched on and not yet tried in this
|
|
156
|
+
* turn, going round from the one that failed. Returns what changed, or null when there
|
|
157
|
+
* is nothing to switch to (or switching is off), in which case the refusal stands.
|
|
158
|
+
*/
|
|
159
|
+
export function failoverKey(apiKeyEnv, status, tried) {
|
|
160
|
+
const live = process.env[apiKeyEnv]?.trim();
|
|
161
|
+
if (!live)
|
|
162
|
+
return null;
|
|
163
|
+
const { reason } = noteKeyFailure(live, status);
|
|
164
|
+
tried.add(keyFingerprint(live));
|
|
165
|
+
if (!autoSwitchOn(apiKeyEnv))
|
|
166
|
+
return null;
|
|
167
|
+
const keys = keysFor(apiKeyEnv);
|
|
168
|
+
const at = keys.findIndex((k) => k.value === live);
|
|
169
|
+
const rotated = at < 0 ? keys : [...keys.slice(at + 1), ...keys.slice(0, at)];
|
|
170
|
+
const next = rotated.find((k) => !isKeyDisabled(k.value) && !tried.has(keyFingerprint(k.value)));
|
|
171
|
+
if (!next)
|
|
172
|
+
return null;
|
|
173
|
+
setLiveApiKey(apiKeyEnv, next.value);
|
|
174
|
+
return { from: labelled(live), to: labelled(next.value), reason };
|
|
175
|
+
}
|
|
176
|
+
/** A key as a person would name it: its label if it has one, and its last four. */
|
|
177
|
+
function labelled(value) {
|
|
178
|
+
const label = keyLabel(value);
|
|
179
|
+
return label ? `${label} (${keyHint(value)})` : keyHint(value);
|
|
180
|
+
}
|
|
181
|
+
/** A turn went through on the live key: forget its old refusal. */
|
|
182
|
+
export function noteKeyWorked(apiKeyEnv) {
|
|
183
|
+
const live = process.env[apiKeyEnv]?.trim();
|
|
184
|
+
if (live)
|
|
185
|
+
clearKeyFailure(live);
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=providerKeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providerKeys.js","sourceRoot":"","sources":["../../src/core/providerKeys.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rulesSkills.ts — rules and skills as plain files a settings screen can list and edit.
|
|
3
|
+
*
|
|
4
|
+
* A rule is `rules/<name>.md`; a skill is `skills/<name>/SKILL.md`. Each lives in one of
|
|
5
|
+
* two places: the project's Mindweave folder, or `~/.mindweave` for every project (merged
|
|
6
|
+
* by governor/index.ts, the project's own winning on a name clash). The screen edits the
|
|
7
|
+
* file as text, so nothing here parses or rebuilds it; saving re-reads governance so the
|
|
8
|
+
* open chat follows the change on its next message.
|
|
9
|
+
*/
|
|
10
|
+
import { promises as fs } from "node:fs";
|
|
11
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
12
|
+
import { governanceDir } from "../governor/index.js";
|
|
13
|
+
import { slugify } from "../governor/write.js";
|
|
14
|
+
import { parseFrontmatter } from "../governor/frontmatter.js";
|
|
15
|
+
import { refreshGovernance } from "../dynamo/engine.js";
|
|
16
|
+
const RULE_TEMPLATE = (name) => `---\nname: ${name}\ndescription: \n---\nWrite the rule here, as an instruction the agent should always follow.\n`;
|
|
17
|
+
const SKILL_TEMPLATE = (name) => `---\nname: ${name}\ndescription: What this skill does, in one line.\nwhen_to_use: When the agent should run it.\n---\n1. First step\n2. Next step\n`;
|
|
18
|
+
async function listScope(cwd, scope) {
|
|
19
|
+
const base = governanceDir(cwd, scope);
|
|
20
|
+
const items = [];
|
|
21
|
+
try {
|
|
22
|
+
for (const n of (await fs.readdir(join(base, "rules"))).sort()) {
|
|
23
|
+
if (n.toLowerCase().endsWith(".md"))
|
|
24
|
+
items.push({ kind: "rule", name: basename(n, ".md"), scope, file: join(base, "rules", n) });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
/* no rules yet */
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
for (const d of (await fs.readdir(join(base, "skills"), { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
32
|
+
const file = join(base, "skills", d.name, "SKILL.md");
|
|
33
|
+
if (d.isDirectory() && (await fs.stat(file).catch(() => null)))
|
|
34
|
+
items.push({ kind: "skill", name: d.name, scope, file });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* no skills yet */
|
|
39
|
+
}
|
|
40
|
+
return items;
|
|
41
|
+
}
|
|
42
|
+
/** Every rule and skill for this project and for all projects. */
|
|
43
|
+
export async function listRulesSkills(session, cwd = session.cwd) {
|
|
44
|
+
return [...(await listScope(cwd, "project")), ...(await listScope(cwd, "global"))];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Only a rule or skill file of this project or of all projects may be read or written
|
|
48
|
+
* through here: the path comes from the screen, and it must not become a way to edit
|
|
49
|
+
* anything else on disk.
|
|
50
|
+
*/
|
|
51
|
+
function allowed(cwd, file) {
|
|
52
|
+
const abs = resolve(file);
|
|
53
|
+
for (const scope of ["project", "global"]) {
|
|
54
|
+
const base = governanceDir(cwd, scope);
|
|
55
|
+
const rel = relative(base, abs);
|
|
56
|
+
if (rel.startsWith("..") || resolve(base, rel) !== abs)
|
|
57
|
+
continue;
|
|
58
|
+
const parts = rel.split(sep);
|
|
59
|
+
if (parts.length === 2 && parts[0] === "rules" && parts[1].toLowerCase().endsWith(".md"))
|
|
60
|
+
return { kind: "rule", scope };
|
|
61
|
+
if (parts.length === 3 && parts[0] === "skills" && parts[2] === "SKILL.md")
|
|
62
|
+
return { kind: "skill", scope };
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
export async function readRuleSkill(session, file, cwd = session.cwd) {
|
|
67
|
+
if (!allowed(cwd, file))
|
|
68
|
+
return null;
|
|
69
|
+
return fs.readFile(file, "utf8").catch(() => null);
|
|
70
|
+
}
|
|
71
|
+
export async function saveRuleSkill(session, file, text, cwd = session.cwd) {
|
|
72
|
+
if (!allowed(cwd, file))
|
|
73
|
+
return { ok: false, error: "That is not a rule or skill file." };
|
|
74
|
+
await fs.mkdir(dirname(file), { recursive: true });
|
|
75
|
+
await fs.writeFile(file, text, "utf8");
|
|
76
|
+
await refreshGovernance(session, true);
|
|
77
|
+
return { ok: true, file };
|
|
78
|
+
}
|
|
79
|
+
/** Create a new rule or skill from a short template and return its file to edit. */
|
|
80
|
+
export async function createRuleSkill(session, kind, rawName, scope, cwd = session.cwd) {
|
|
81
|
+
if (!rawName.trim())
|
|
82
|
+
return { ok: false, error: "Give it a name." };
|
|
83
|
+
const name = slugify(rawName);
|
|
84
|
+
const base = governanceDir(cwd, scope);
|
|
85
|
+
const file = kind === "rule" ? join(base, "rules", `${name}.md`) : join(base, "skills", name, "SKILL.md");
|
|
86
|
+
if (await fs.stat(file).catch(() => null))
|
|
87
|
+
return { ok: false, error: `A ${kind} called '${name}' already exists there.` };
|
|
88
|
+
await fs.mkdir(dirname(file), { recursive: true });
|
|
89
|
+
await fs.writeFile(file, kind === "rule" ? RULE_TEMPLATE(name) : SKILL_TEMPLATE(name), "utf8");
|
|
90
|
+
await refreshGovernance(session, true);
|
|
91
|
+
return { ok: true, file };
|
|
92
|
+
}
|
|
93
|
+
export async function deleteRuleSkill(session, file, cwd = session.cwd) {
|
|
94
|
+
const where = allowed(cwd, file);
|
|
95
|
+
if (!where)
|
|
96
|
+
return { ok: false, error: "That is not a rule or skill file." };
|
|
97
|
+
// A skill is its whole folder (bundled files included); a rule is one file.
|
|
98
|
+
await fs.rm(where.kind === "skill" ? dirname(file) : file, { recursive: true, force: true });
|
|
99
|
+
await refreshGovernance(session, true);
|
|
100
|
+
return { ok: true };
|
|
101
|
+
}
|
|
102
|
+
/** Move a rule or skill between this project and all projects. */
|
|
103
|
+
export async function moveRuleSkill(session, file, cwd = session.cwd) {
|
|
104
|
+
const where = allowed(cwd, file);
|
|
105
|
+
if (!where)
|
|
106
|
+
return { ok: false, error: "That is not a rule or skill file." };
|
|
107
|
+
const to = where.scope === "project" ? "global" : "project";
|
|
108
|
+
const base = governanceDir(cwd, to);
|
|
109
|
+
const from = where.kind === "skill" ? dirname(file) : file;
|
|
110
|
+
const target = where.kind === "skill" ? join(base, "skills", basename(from)) : join(base, "rules", basename(from));
|
|
111
|
+
if (await fs.stat(target).catch(() => null))
|
|
112
|
+
return { ok: false, error: "One with the same name is already there." };
|
|
113
|
+
await fs.mkdir(dirname(target), { recursive: true });
|
|
114
|
+
await fs.cp(from, target, { recursive: true });
|
|
115
|
+
await fs.rm(from, { recursive: true, force: true });
|
|
116
|
+
await refreshGovernance(session, true);
|
|
117
|
+
return { ok: true, file: where.kind === "skill" ? join(target, "SKILL.md") : target };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Add a rule or skill from a file the user picked or dropped: its name and text only,
|
|
121
|
+
* since the screen reads the file itself. A file called SKILL.md, or one whose header
|
|
122
|
+
* says `when_to_use`, is a skill; anything else is a rule. The name comes from the
|
|
123
|
+
* header's `name`, else from the file name.
|
|
124
|
+
*/
|
|
125
|
+
export async function importRuleSkill(session, fileName, text, scope, cwd = session.cwd) {
|
|
126
|
+
if (!text.trim())
|
|
127
|
+
return { ok: false, error: `${fileName} is empty.` };
|
|
128
|
+
const { data } = parseFrontmatter(text);
|
|
129
|
+
const base = basename(fileName).replace(/\.(md|markdown|txt)$/i, "");
|
|
130
|
+
const kind = /^skill$/i.test(base) || data.when_to_use || data.whenToUse ? "skill" : "rule";
|
|
131
|
+
// Checked before slugify, which turns an empty name into "rule".
|
|
132
|
+
const rawName = (data.name || (/^skill$/i.test(base) ? "" : base)).trim();
|
|
133
|
+
const name = rawName ? slugify(rawName) : "";
|
|
134
|
+
if (!name)
|
|
135
|
+
return { ok: false, error: `${fileName} has no name. Add a "name:" line at the top, or rename the file.` };
|
|
136
|
+
const created = await createRuleSkill(session, kind, name, scope, cwd);
|
|
137
|
+
if (!created.ok)
|
|
138
|
+
return created;
|
|
139
|
+
const saved = await saveRuleSkill(session, created.file, text, cwd);
|
|
140
|
+
return saved.ok ? { ...saved, kind, name } : saved;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=rulesSkills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rulesSkills.js","sourceRoot":"","sources":["../../src/core/rulesSkills.ts"],"names":[],"mappings":"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"}
|