@geminilight/mindos 1.1.8 → 1.1.10
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/dist/agent/agent-run-context.d.ts +8 -0
- package/dist/agent/agent-run-context.d.ts.map +1 -0
- package/dist/agent/agent-run-context.js +9 -0
- package/dist/agent/agent-run-context.js.map +1 -0
- package/dist/agent/capability-registry.d.ts +60 -0
- package/dist/agent/capability-registry.d.ts.map +1 -0
- package/dist/agent/capability-registry.js +323 -0
- package/dist/agent/capability-registry.js.map +1 -0
- package/dist/agent/file-write-lock.d.ts +22 -0
- package/dist/agent/file-write-lock.d.ts.map +1 -0
- package/dist/agent/file-write-lock.js +86 -0
- package/dist/agent/file-write-lock.js.map +1 -0
- package/dist/agent/global-state.d.ts +109 -0
- package/dist/agent/global-state.d.ts.map +1 -0
- package/dist/agent/global-state.js +118 -0
- package/dist/agent/global-state.js.map +1 -0
- package/dist/agent/index.d.ts +17 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +17 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/kb-extension.d.ts +38 -0
- package/dist/agent/kb-extension.d.ts.map +1 -0
- package/dist/agent/kb-extension.js +140 -0
- package/dist/agent/kb-extension.js.map +1 -0
- package/dist/agent/kb-tools.d.ts +158 -0
- package/dist/agent/kb-tools.d.ts.map +1 -0
- package/dist/agent/kb-tools.js +707 -0
- package/dist/agent/kb-tools.js.map +1 -0
- package/dist/agent/line-diff.d.ts +13 -0
- package/dist/agent/line-diff.d.ts.map +1 -0
- package/dist/agent/line-diff.js +66 -0
- package/dist/agent/line-diff.js.map +1 -0
- package/dist/agent/paragraph-extract.d.ts +25 -0
- package/dist/agent/paragraph-extract.d.ts.map +1 -0
- package/dist/agent/paragraph-extract.js +106 -0
- package/dist/agent/paragraph-extract.js.map +1 -0
- package/dist/agent/permission-policy.d.ts +37 -0
- package/dist/agent/permission-policy.d.ts.map +1 -0
- package/dist/agent/permission-policy.js +153 -0
- package/dist/agent/permission-policy.js.map +1 -0
- package/dist/agent/redaction.d.ts +3 -0
- package/dist/agent/redaction.d.ts.map +1 -0
- package/dist/agent/redaction.js +52 -0
- package/dist/agent/redaction.js.map +1 -0
- package/dist/agent/result-reducer.d.ts +36 -0
- package/dist/agent/result-reducer.d.ts.map +1 -0
- package/dist/agent/result-reducer.js +101 -0
- package/dist/agent/result-reducer.js.map +1 -0
- package/dist/agent/run-cancellation.d.ts +13 -0
- package/dist/agent/run-cancellation.d.ts.map +1 -0
- package/dist/agent/run-cancellation.js +97 -0
- package/dist/agent/run-cancellation.js.map +1 -0
- package/dist/agent/run-ledger-types.d.ts +197 -0
- package/dist/agent/run-ledger-types.d.ts.map +1 -0
- package/dist/agent/run-ledger-types.js +9 -0
- package/dist/agent/run-ledger-types.js.map +1 -0
- package/dist/agent/run-ledger.d.ts +44 -0
- package/dist/agent/run-ledger.d.ts.map +1 -0
- package/dist/agent/run-ledger.js +814 -0
- package/dist/agent/run-ledger.js.map +1 -0
- package/dist/agent/run-timeline-events.d.ts +3 -0
- package/dist/agent/run-timeline-events.d.ts.map +1 -0
- package/dist/agent/run-timeline-events.js +239 -0
- package/dist/agent/run-timeline-events.js.map +1 -0
- package/dist/agent/runtime-permission-bridge.d.ts +34 -0
- package/dist/agent/runtime-permission-bridge.d.ts.map +1 -0
- package/dist/agent/runtime-permission-bridge.js +284 -0
- package/dist/agent/runtime-permission-bridge.js.map +1 -0
- package/dist/agent/stream-consumer.d.ts +65 -0
- package/dist/agent/stream-consumer.d.ts.map +1 -0
- package/dist/agent/stream-consumer.js +664 -0
- package/dist/agent/stream-consumer.js.map +1 -0
- package/dist/agent/stream-message-types.d.ts +138 -0
- package/dist/agent/stream-message-types.d.ts.map +1 -0
- package/dist/agent/stream-message-types.js +14 -0
- package/dist/agent/stream-message-types.js.map +1 -0
- package/dist/agent/subagent-ledger-extension.d.ts +22 -0
- package/dist/agent/subagent-ledger-extension.d.ts.map +1 -0
- package/dist/agent/subagent-ledger-extension.js +533 -0
- package/dist/agent/subagent-ledger-extension.js.map +1 -0
- package/dist/agent/subagent-orchestrator.d.ts +62 -0
- package/dist/agent/subagent-orchestrator.d.ts.map +1 -0
- package/dist/agent/subagent-orchestrator.js +350 -0
- package/dist/agent/subagent-orchestrator.js.map +1 -0
- package/dist/agent/user-question-bridge.d.ts +90 -0
- package/dist/agent/user-question-bridge.d.ts.map +1 -0
- package/dist/agent/user-question-bridge.js +260 -0
- package/dist/agent/user-question-bridge.js.map +1 -0
- package/dist/agent-runtime/capabilities.d.ts +10 -0
- package/dist/agent-runtime/capabilities.d.ts.map +1 -0
- package/dist/agent-runtime/capabilities.js +100 -0
- package/dist/agent-runtime/capabilities.js.map +1 -0
- package/dist/agent-runtime/child-process.d.ts +21 -0
- package/dist/agent-runtime/child-process.d.ts.map +1 -0
- package/dist/agent-runtime/child-process.js +29 -0
- package/dist/agent-runtime/child-process.js.map +1 -0
- package/dist/agent-runtime/claude-code-cli.d.ts.map +1 -1
- package/dist/agent-runtime/claude-code-cli.js +31 -4
- package/dist/agent-runtime/claude-code-cli.js.map +1 -1
- package/dist/agent-runtime/claude-code-sdk.d.ts.map +1 -1
- package/dist/agent-runtime/claude-code-sdk.js +22 -5
- package/dist/agent-runtime/claude-code-sdk.js.map +1 -1
- package/dist/agent-runtime/codex-app-server.d.ts.map +1 -1
- package/dist/agent-runtime/codex-app-server.js +27 -3
- package/dist/agent-runtime/codex-app-server.js.map +1 -1
- package/dist/agent-runtime/codex-env.d.ts +2 -1
- package/dist/agent-runtime/codex-env.d.ts.map +1 -1
- package/dist/agent-runtime/codex-env.js +14 -2
- package/dist/agent-runtime/codex-env.js.map +1 -1
- package/dist/agent-runtime/descriptors.d.ts +19 -0
- package/dist/agent-runtime/descriptors.d.ts.map +1 -0
- package/dist/agent-runtime/descriptors.js +143 -0
- package/dist/agent-runtime/descriptors.js.map +1 -0
- package/dist/agent-runtime/detection.d.ts +15 -0
- package/dist/agent-runtime/detection.d.ts.map +1 -0
- package/dist/agent-runtime/detection.js +124 -0
- package/dist/agent-runtime/detection.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +2 -0
- package/dist/agent-runtime/index.d.ts.map +1 -1
- package/dist/agent-runtime/index.js +2 -0
- package/dist/agent-runtime/index.js.map +1 -1
- package/dist/agent-runtime/registry.d.ts +152 -0
- package/dist/agent-runtime/registry.d.ts.map +1 -0
- package/dist/agent-runtime/registry.js +84 -0
- package/dist/agent-runtime/registry.js.map +1 -0
- package/dist/agent-runtime/run.d.ts +12 -0
- package/dist/agent-runtime/run.d.ts.map +1 -1
- package/dist/agent-runtime/run.js +16 -1
- package/dist/agent-runtime/run.js.map +1 -1
- package/dist/foundation/config/schema.d.ts +1 -1
- package/dist/foundation/mind-root/index.d.ts +5 -0
- package/dist/foundation/mind-root/index.d.ts.map +1 -0
- package/dist/foundation/mind-root/index.js +67 -0
- package/dist/foundation/mind-root/index.js.map +1 -0
- package/dist/foundation/native-import.d.ts +22 -0
- package/dist/foundation/native-import.d.ts.map +1 -0
- package/dist/foundation/native-import.js +22 -0
- package/dist/foundation/native-import.js.map +1 -0
- package/dist/foundation.d.ts +1 -0
- package/dist/foundation.d.ts.map +1 -1
- package/dist/foundation.js +1 -0
- package/dist/foundation.js.map +1 -1
- package/dist/protocols/mcp-server/index.cjs +24 -23
- package/dist/protocols/mcp-server/index.js +45 -0
- package/dist/protocols/mcp-server/index.js.map +1 -1
- package/dist/server/contract.d.ts.map +1 -1
- package/dist/server/contract.js +1 -0
- package/dist/server/contract.js.map +1 -1
- package/dist/server/handlers/agent-runtimes.d.ts +3 -125
- package/dist/server/handlers/agent-runtimes.d.ts.map +1 -1
- package/dist/server/handlers/agent-runtimes.js +6 -414
- package/dist/server/handlers/agent-runtimes.js.map +1 -1
- package/dist/server/handlers/assistants.d.ts.map +1 -1
- package/dist/server/handlers/assistants.js +1 -0
- package/dist/server/handlers/assistants.js.map +1 -1
- package/dist/server/handlers/mcp-agents.d.ts +8 -0
- package/dist/server/handlers/mcp-agents.d.ts.map +1 -1
- package/dist/server/handlers/mcp-agents.js +39 -0
- package/dist/server/handlers/mcp-agents.js.map +1 -1
- package/dist/server/handlers/mcp-install.d.ts +0 -6
- package/dist/server/handlers/mcp-install.d.ts.map +1 -1
- package/dist/server/handlers/mcp-install.js +1 -31
- package/dist/server/handlers/mcp-install.js.map +1 -1
- package/dist/server/handlers/skill-links.d.ts +130 -0
- package/dist/server/handlers/skill-links.d.ts.map +1 -0
- package/dist/server/handlers/skill-links.js +534 -0
- package/dist/server/handlers/skill-links.js.map +1 -0
- package/dist/server/handlers/skills.d.ts +12 -1
- package/dist/server/handlers/skills.d.ts.map +1 -1
- package/dist/server/handlers/skills.js +48 -5
- package/dist/server/handlers/skills.js.map +1 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +16 -3
- package/dist/server/http.js.map +1 -1
- package/dist/server/index.d.ts +3 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/route-ownership.d.ts.map +1 -1
- package/dist/server/route-ownership.js +3 -0
- package/dist/server/route-ownership.js.map +1 -1
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/server/runtime.js +8 -4
- package/dist/server/runtime.js.map +1 -1
- package/dist/session/index.d.ts +43 -2
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +42 -5
- package/dist/session/index.js.map +1 -1
- package/dist/session/pi-coding-agent-runtime.d.ts +4 -2
- package/dist/session/pi-coding-agent-runtime.d.ts.map +1 -1
- package/dist/session/pi-coding-agent-runtime.js +18 -11
- package/dist/session/pi-coding-agent-runtime.js.map +1 -1
- package/package.json +15 -9
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
2
|
+
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
/** Marker file written inside copy-fallback installs so uninstall can tell our copies from user directories. */
|
|
4
|
+
export const MINDOS_MANAGED_MARKER = '.mindos-managed';
|
|
5
|
+
/**
|
|
6
|
+
* Where disabled native skills are parked: `{agentSkillDir}/.mindos-disabled/{skill}`.
|
|
7
|
+
* Dot-prefixed, so every agent scanner skips it — "off without deleting".
|
|
8
|
+
*/
|
|
9
|
+
export const MINDOS_DISABLED_DIR = '.mindos-disabled';
|
|
10
|
+
/* ── Skill source resolution (spec 4.8) ───────────────────────── */
|
|
11
|
+
/**
|
|
12
|
+
* Find the on-disk body directory for a skill by name.
|
|
13
|
+
* User-defined roots take priority over builtin roots; within the same
|
|
14
|
+
* source class the skillRoots order is preserved.
|
|
15
|
+
*/
|
|
16
|
+
export function resolveSkillSourceDir(skill, skillRoots) {
|
|
17
|
+
const ordered = [...skillRoots].sort((a, b) => sourceRank(a) - sourceRank(b));
|
|
18
|
+
for (const root of ordered) {
|
|
19
|
+
if (!existsSync(root.path))
|
|
20
|
+
continue;
|
|
21
|
+
if (root.origin === 'mindos-user' && lstatSync(root.path).isSymbolicLink())
|
|
22
|
+
continue;
|
|
23
|
+
// Root itself is a single-skill directory (SKILL.md directly inside).
|
|
24
|
+
const directSkillFile = join(root.path, 'SKILL.md');
|
|
25
|
+
if (existsSync(directSkillFile) && statSync(directSkillFile).isFile()) {
|
|
26
|
+
const parsed = parseSkillFrontmatter(readFileSync(directSkillFile, 'utf-8'));
|
|
27
|
+
if ((parsed.name || basename(root.path)) === skill)
|
|
28
|
+
return root.path;
|
|
29
|
+
}
|
|
30
|
+
// Fast path: sub-directory named exactly like the skill (frontmatter may rename it away).
|
|
31
|
+
const exact = join(root.path, skill);
|
|
32
|
+
const exactFile = join(exact, 'SKILL.md');
|
|
33
|
+
if (existsSync(exactFile)) {
|
|
34
|
+
const parsed = parseSkillFrontmatter(readFileSync(exactFile, 'utf-8'));
|
|
35
|
+
if ((parsed.name || skill) === skill)
|
|
36
|
+
return exact;
|
|
37
|
+
}
|
|
38
|
+
// Slow path: frontmatter name may differ from the directory name.
|
|
39
|
+
for (const entry of readdirSync(root.path, { withFileTypes: true })) {
|
|
40
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
41
|
+
continue;
|
|
42
|
+
const skillFile = join(root.path, entry.name, 'SKILL.md');
|
|
43
|
+
if (!existsSync(skillFile))
|
|
44
|
+
continue;
|
|
45
|
+
const parsed = parseSkillFrontmatter(readFileSync(skillFile, 'utf-8'));
|
|
46
|
+
if ((parsed.name || entry.name) === skill)
|
|
47
|
+
return join(root.path, entry.name);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
function sourceRank(root) {
|
|
53
|
+
return root.source === 'user' ? 0 : 1;
|
|
54
|
+
}
|
|
55
|
+
function parseSkillFrontmatter(content) {
|
|
56
|
+
const match = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
57
|
+
if (!match)
|
|
58
|
+
return {};
|
|
59
|
+
const result = {};
|
|
60
|
+
for (const line of (match[1] ?? '').split(/\r?\n/)) {
|
|
61
|
+
const separator = line.indexOf(':');
|
|
62
|
+
if (separator < 0)
|
|
63
|
+
continue;
|
|
64
|
+
const key = line.slice(0, separator).trim();
|
|
65
|
+
if (key !== 'name' && key !== 'description')
|
|
66
|
+
continue;
|
|
67
|
+
result[key] = line.slice(separator + 1).trim().replace(/^['"]|['"]$/g, '');
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
/* ── Cell status (single source of truth, spec 4.1) ───────────── */
|
|
72
|
+
/** What `{baseDir}/{skill}` is right now in ONE directory. */
|
|
73
|
+
function statusInDir(baseDir, skill) {
|
|
74
|
+
const linkPath = join(baseDir, skill);
|
|
75
|
+
let stat;
|
|
76
|
+
try {
|
|
77
|
+
stat = lstatSync(linkPath);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return existsSync(join(baseDir, MINDOS_DISABLED_DIR, skill)) ? 'native-disabled' : 'none';
|
|
81
|
+
}
|
|
82
|
+
if (stat.isSymbolicLink()) {
|
|
83
|
+
try {
|
|
84
|
+
return statSync(linkPath).isDirectory() ? 'linked' : 'broken';
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return 'broken';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (stat.isDirectory()) {
|
|
91
|
+
return existsSync(join(linkPath, MINDOS_MANAGED_MARKER)) ? 'copied' : 'conflict';
|
|
92
|
+
}
|
|
93
|
+
return 'conflict';
|
|
94
|
+
}
|
|
95
|
+
/** The directories a cell spans: the (possibly shared) workspace plus the agent's own dir. */
|
|
96
|
+
function cellDirsOf(agent) {
|
|
97
|
+
return agent.nativeSkillDir && resolve(agent.nativeSkillDir) !== resolve(agent.skillDir)
|
|
98
|
+
? [agent.skillDir, agent.nativeSkillDir]
|
|
99
|
+
: [agent.skillDir];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The single authority for a cell's enabled state: the workspace dir first,
|
|
103
|
+
* then the agent's own private dir (universal agents ship skills there too).
|
|
104
|
+
*/
|
|
105
|
+
export function getSkillCellStatus(agent, skill) {
|
|
106
|
+
for (const dir of cellDirsOf(agent)) {
|
|
107
|
+
const status = statusInDir(dir, skill);
|
|
108
|
+
if (status !== 'none')
|
|
109
|
+
return status;
|
|
110
|
+
}
|
|
111
|
+
return 'none';
|
|
112
|
+
}
|
|
113
|
+
export function isSkillCellEnabled(status) {
|
|
114
|
+
// conflict = a real agent-owned directory: the agent DOES load it.
|
|
115
|
+
return status === 'linked' || status === 'copied' || status === 'conflict';
|
|
116
|
+
}
|
|
117
|
+
/* ── Link / unlink (spec 4.3, 4.5, 4.7) ───────────────────────── */
|
|
118
|
+
/**
|
|
119
|
+
* Expose a skill to a downstream agent: create `{agentSkillDir}/{skill}` as a
|
|
120
|
+
* symlink to the skill body (junction on Windows, copy as last resort).
|
|
121
|
+
* Never touches the skill body itself.
|
|
122
|
+
*/
|
|
123
|
+
export function linkSkillToAgent(skill, agent, skillRoots, deps = {}) {
|
|
124
|
+
const linkPath = join(agent.skillDir, skill);
|
|
125
|
+
// The agent may already ship this skill in its OWN directory (universal
|
|
126
|
+
// agents: e.g. Codex's ~/.codex/skills). It is natively ON for that agent —
|
|
127
|
+
// never shadow it with a pool link that would leak it to every pool reader.
|
|
128
|
+
if (agent.nativeSkillDir && resolve(agent.nativeSkillDir) !== resolve(agent.skillDir)) {
|
|
129
|
+
const nativeStatus = statusInDir(agent.nativeSkillDir, skill);
|
|
130
|
+
if (nativeStatus === 'native-disabled')
|
|
131
|
+
return enableInDir(agent.nativeSkillDir, skill);
|
|
132
|
+
if (nativeStatus !== 'none' && nativeStatus !== 'broken')
|
|
133
|
+
return { ok: true, result: 'already' };
|
|
134
|
+
}
|
|
135
|
+
// A disabled native copy exists: "turn on" means restoring the agent's own
|
|
136
|
+
// directory, not shadowing it with a link. Checked before source resolution —
|
|
137
|
+
// the parked copy may be the only body there is.
|
|
138
|
+
if (!lstatSafe(linkPath) && lstatSafe(join(agent.skillDir, MINDOS_DISABLED_DIR, skill))) {
|
|
139
|
+
return enableInDir(agent.skillDir, skill);
|
|
140
|
+
}
|
|
141
|
+
const sourceDir = resolveSkillSourceDir(skill, skillRoots);
|
|
142
|
+
if (!sourceDir) {
|
|
143
|
+
return { ok: false, code: 'skill-not-found', message: `Skill not found: ${skill}` };
|
|
144
|
+
}
|
|
145
|
+
// The skill body may live INSIDE the agent's skill directory (e.g. a skill
|
|
146
|
+
// root shared with universal agents). Linking onto itself would destroy the
|
|
147
|
+
// body and leave a self-referencing loop — it is already exposed, so no-op.
|
|
148
|
+
if (resolve(linkPath) === resolve(sourceDir)) {
|
|
149
|
+
return { ok: true, result: 'already' };
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const stat = lstatSafe(linkPath);
|
|
153
|
+
if (stat?.isSymbolicLink()) {
|
|
154
|
+
if (symlinkTargetIsDirectory(linkPath))
|
|
155
|
+
return { ok: true, result: 'already' };
|
|
156
|
+
unlinkSync(linkPath); // dangling link → clean up and re-create (spec 4.5)
|
|
157
|
+
}
|
|
158
|
+
else if (stat?.isDirectory()) {
|
|
159
|
+
if (existsSync(join(linkPath, MINDOS_MANAGED_MARKER)))
|
|
160
|
+
return { ok: true, result: 'already' };
|
|
161
|
+
if (!directoriesHaveSameContent(sourceDir, linkPath)) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
code: 'conflict',
|
|
165
|
+
message: `A directory already exists at ${linkPath} and is not managed by MindOS`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
// Pre-symlink era copy of this very skill → safe to convert in place.
|
|
169
|
+
rmSync(linkPath, { recursive: true, force: true });
|
|
170
|
+
}
|
|
171
|
+
else if (stat) {
|
|
172
|
+
return { ok: false, code: 'conflict', message: `A file already exists at ${linkPath}` };
|
|
173
|
+
}
|
|
174
|
+
mkdirSync(agent.skillDir, { recursive: true });
|
|
175
|
+
return { ok: true, result: createSkillLink(sourceDir, linkPath, deps) };
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return { ok: false, code: 'io-error', message: errorMessage(error) };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Remove a skill from a downstream agent. Deletes only the link, our marked
|
|
183
|
+
* copy, or an unmarked copy whose content is identical to the skill body
|
|
184
|
+
* (lossless — e.g. created by the legacy copy install). A real directory with
|
|
185
|
+
* diverged content is refused.
|
|
186
|
+
*/
|
|
187
|
+
export function unlinkSkillFromAgent(skill, agent, skillRoots = []) {
|
|
188
|
+
// Operate on whichever directory actually holds the entry (pool first,
|
|
189
|
+
// then the agent's own dir).
|
|
190
|
+
for (const dir of cellDirsOf(agent)) {
|
|
191
|
+
const status = statusInDir(dir, skill);
|
|
192
|
+
if (status !== 'none' && status !== 'native-disabled')
|
|
193
|
+
return unlinkInDir(dir, skill, skillRoots);
|
|
194
|
+
}
|
|
195
|
+
return { ok: true, result: 'missing' };
|
|
196
|
+
}
|
|
197
|
+
function unlinkInDir(baseDir, skill, skillRoots) {
|
|
198
|
+
const linkPath = join(baseDir, skill);
|
|
199
|
+
try {
|
|
200
|
+
const stat = lstatSafe(linkPath);
|
|
201
|
+
if (!stat)
|
|
202
|
+
return { ok: true, result: 'missing' };
|
|
203
|
+
if (stat.isSymbolicLink()) {
|
|
204
|
+
unlinkSync(linkPath);
|
|
205
|
+
return { ok: true, result: 'removed' };
|
|
206
|
+
}
|
|
207
|
+
if (stat.isDirectory()) {
|
|
208
|
+
if (!existsSync(join(linkPath, MINDOS_MANAGED_MARKER)) && !isLosslessSkillCopy(skill, linkPath, skillRoots)) {
|
|
209
|
+
return {
|
|
210
|
+
ok: false,
|
|
211
|
+
code: 'conflict',
|
|
212
|
+
message: `${linkPath} is a real directory not managed by MindOS; refusing to delete`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
rmSync(linkPath, { recursive: true, force: true });
|
|
216
|
+
return { ok: true, result: 'removed' };
|
|
217
|
+
}
|
|
218
|
+
return { ok: false, code: 'conflict', message: `${linkPath} is not a skill link` };
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return { ok: false, code: 'io-error', message: errorMessage(error) };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Turn a native skill OFF without deleting it: move the agent-owned directory
|
|
226
|
+
* into `{agentSkillDir}/.mindos-disabled/` — scanners skip dot-prefixed
|
|
227
|
+
* entries, so the agent stops loading it; the body stays byte-identical.
|
|
228
|
+
*/
|
|
229
|
+
export function disableNativeSkill(skill, agent) {
|
|
230
|
+
for (const dir of cellDirsOf(agent)) {
|
|
231
|
+
const status = statusInDir(dir, skill);
|
|
232
|
+
if (status === 'native-disabled')
|
|
233
|
+
return { ok: true, result: 'already' };
|
|
234
|
+
if (status !== 'none')
|
|
235
|
+
return disableInDir(dir, skill);
|
|
236
|
+
}
|
|
237
|
+
return { ok: true, result: 'missing' };
|
|
238
|
+
}
|
|
239
|
+
function disableInDir(baseDir, skill) {
|
|
240
|
+
const activePath = join(baseDir, skill);
|
|
241
|
+
const disabledPath = join(baseDir, MINDOS_DISABLED_DIR, skill);
|
|
242
|
+
try {
|
|
243
|
+
const stat = lstatSafe(activePath);
|
|
244
|
+
if (!stat) {
|
|
245
|
+
return { ok: true, result: lstatSafe(disabledPath) ? 'already' : 'missing' };
|
|
246
|
+
}
|
|
247
|
+
if (stat.isSymbolicLink() || (stat.isDirectory() && existsSync(join(activePath, MINDOS_MANAGED_MARKER)))) {
|
|
248
|
+
return { ok: false, code: 'conflict', message: `${activePath} is a MindOS-managed link — unlink it instead` };
|
|
249
|
+
}
|
|
250
|
+
if (!stat.isDirectory()) {
|
|
251
|
+
return { ok: false, code: 'conflict', message: `${activePath} is not a skill directory` };
|
|
252
|
+
}
|
|
253
|
+
if (lstatSafe(disabledPath)) {
|
|
254
|
+
return { ok: false, code: 'conflict', message: `${disabledPath} already exists; resolve it first` };
|
|
255
|
+
}
|
|
256
|
+
mkdirSync(join(baseDir, MINDOS_DISABLED_DIR), { recursive: true });
|
|
257
|
+
renameSync(activePath, disabledPath);
|
|
258
|
+
return { ok: true, result: 'disabled' };
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
return { ok: false, code: 'io-error', message: errorMessage(error) };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** Restore a native skill disabled by {@link disableNativeSkill}: move it back in place. */
|
|
265
|
+
export function enableNativeSkill(skill, agent) {
|
|
266
|
+
for (const dir of cellDirsOf(agent)) {
|
|
267
|
+
const status = statusInDir(dir, skill);
|
|
268
|
+
if (status === 'native-disabled')
|
|
269
|
+
return enableInDir(dir, skill);
|
|
270
|
+
if (status !== 'none') {
|
|
271
|
+
// An active entry exists; if a parked copy ALSO lingers here, surface
|
|
272
|
+
// the clash explicitly instead of silently stranding it.
|
|
273
|
+
if (lstatSafe(join(dir, MINDOS_DISABLED_DIR, skill)))
|
|
274
|
+
return enableInDir(dir, skill);
|
|
275
|
+
return { ok: true, result: 'already' };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return { ok: true, result: 'missing' };
|
|
279
|
+
}
|
|
280
|
+
function enableInDir(baseDir, skill) {
|
|
281
|
+
const activePath = join(baseDir, skill);
|
|
282
|
+
const disabledPath = join(baseDir, MINDOS_DISABLED_DIR, skill);
|
|
283
|
+
try {
|
|
284
|
+
if (!lstatSafe(disabledPath)) {
|
|
285
|
+
return { ok: true, result: lstatSafe(activePath) ? 'already' : 'missing' };
|
|
286
|
+
}
|
|
287
|
+
if (lstatSafe(activePath)) {
|
|
288
|
+
return { ok: false, code: 'conflict', message: `${activePath} already exists; cannot restore the disabled copy over it` };
|
|
289
|
+
}
|
|
290
|
+
renameSync(disabledPath, activePath);
|
|
291
|
+
try {
|
|
292
|
+
rmdirSync(join(baseDir, MINDOS_DISABLED_DIR)); // only succeeds when empty
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// other disabled skills remain — keep the holding directory
|
|
296
|
+
}
|
|
297
|
+
return { ok: true, result: 'enabled' };
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
return { ok: false, code: 'io-error', message: errorMessage(error) };
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/** An unmarked copy is safe to delete only when the body exists elsewhere with identical content. */
|
|
304
|
+
function isLosslessSkillCopy(skill, copyPath, skillRoots) {
|
|
305
|
+
if (skillRoots.length === 0)
|
|
306
|
+
return false;
|
|
307
|
+
const sourceDir = resolveSkillSourceDir(skill, skillRoots);
|
|
308
|
+
if (!sourceDir || resolve(sourceDir) === resolve(copyPath))
|
|
309
|
+
return false;
|
|
310
|
+
return directoriesHaveSameContent(sourceDir, copyPath);
|
|
311
|
+
}
|
|
312
|
+
function createSkillLink(sourceDir, linkPath, deps) {
|
|
313
|
+
const platform = deps.platform ?? process.platform;
|
|
314
|
+
const symlink = deps.symlink ?? ((target, path, type) => symlinkSync(target, path, type));
|
|
315
|
+
try {
|
|
316
|
+
symlink(sourceDir, linkPath, 'dir');
|
|
317
|
+
return 'linked';
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
if (platform === 'win32') {
|
|
321
|
+
try {
|
|
322
|
+
symlink(sourceDir, linkPath, 'junction');
|
|
323
|
+
return 'linked';
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// fall through to copy
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
cpSync(sourceDir, linkPath, { recursive: true });
|
|
331
|
+
writeFileSync(join(linkPath, MINDOS_MANAGED_MARKER), '', 'utf-8');
|
|
332
|
+
return 'copied';
|
|
333
|
+
}
|
|
334
|
+
/* ── Matrix read model (spec 4.2) ─────────────────────────────── */
|
|
335
|
+
export const MINDOS_SELF_AGENT_KEY = 'mindos';
|
|
336
|
+
/**
|
|
337
|
+
* Compute the unified (skill × agent) matrix. The MindOS column reads
|
|
338
|
+
* `disabledSkills`; external agent columns read link existence on disk.
|
|
339
|
+
*/
|
|
340
|
+
export function buildSkillMatrix(options) {
|
|
341
|
+
const disabled = new Set(options.disabledSkills ?? []);
|
|
342
|
+
const agents = [
|
|
343
|
+
{ key: MINDOS_SELF_AGENT_KEY, name: 'MindOS', mode: 'self' },
|
|
344
|
+
...options.agents.map((agent) => ({
|
|
345
|
+
key: agent.key,
|
|
346
|
+
name: agent.name,
|
|
347
|
+
mode: agent.mode,
|
|
348
|
+
skillDir: agent.skillDir,
|
|
349
|
+
})),
|
|
350
|
+
];
|
|
351
|
+
// Skills parked under some agent's .mindos-disabled may have vanished from
|
|
352
|
+
// the skill roots entirely (their body dir doubled as a root, e.g. Codex's
|
|
353
|
+
// ~/.codex/skills). They must stay visible here, or they become
|
|
354
|
+
// unrestorable from any UI.
|
|
355
|
+
const baseSkills = options.skills.map(({ name, description, source, origin, path }) => ({ name, description, source, origin, path }));
|
|
356
|
+
const parkedOnly = collectParkedOnlySkills(options.agents, new Set(baseSkills.map((skill) => skill.name)));
|
|
357
|
+
const allSkills = [...baseSkills, ...parkedOnly].sort((a, b) => a.name.localeCompare(b.name));
|
|
358
|
+
const parkedOnlyNames = new Set(parkedOnly.map((skill) => skill.name));
|
|
359
|
+
const state = {};
|
|
360
|
+
const cells = {};
|
|
361
|
+
for (const skill of allSkills) {
|
|
362
|
+
// A parked body is not loadable by MindOS either — its self cell is off.
|
|
363
|
+
const selfEnabled = !parkedOnlyNames.has(skill.name) && !disabled.has(skill.name);
|
|
364
|
+
const stateRow = { [MINDOS_SELF_AGENT_KEY]: selfEnabled };
|
|
365
|
+
const cellRow = {
|
|
366
|
+
[MINDOS_SELF_AGENT_KEY]: { enabled: selfEnabled, status: selfEnabled ? 'enabled' : 'disabled' },
|
|
367
|
+
};
|
|
368
|
+
for (const agent of options.agents) {
|
|
369
|
+
const status = getSkillCellStatus(agent, skill.name);
|
|
370
|
+
const enabled = isSkillCellEnabled(status);
|
|
371
|
+
stateRow[agent.key] = enabled;
|
|
372
|
+
cellRow[agent.key] = { enabled, status };
|
|
373
|
+
}
|
|
374
|
+
state[skill.name] = stateRow;
|
|
375
|
+
cells[skill.name] = cellRow;
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
skills: allSkills,
|
|
379
|
+
agents,
|
|
380
|
+
state,
|
|
381
|
+
cells,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
/** Skills that exist ONLY as parked copies in some agent's .mindos-disabled dir. */
|
|
385
|
+
function collectParkedOnlySkills(agents, knownNames) {
|
|
386
|
+
const found = [];
|
|
387
|
+
for (const agent of agents) {
|
|
388
|
+
for (const dir of cellDirsOf(agent)) {
|
|
389
|
+
const parkedBase = join(dir, MINDOS_DISABLED_DIR);
|
|
390
|
+
if (!existsSync(parkedBase))
|
|
391
|
+
continue;
|
|
392
|
+
let entries;
|
|
393
|
+
try {
|
|
394
|
+
entries = readdirSync(parkedBase, { withFileTypes: true });
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
for (const entry of entries) {
|
|
400
|
+
if (!entry.isDirectory() || knownNames.has(entry.name))
|
|
401
|
+
continue;
|
|
402
|
+
const skillFile = join(parkedBase, entry.name, 'SKILL.md');
|
|
403
|
+
if (!existsSync(skillFile))
|
|
404
|
+
continue;
|
|
405
|
+
let description = entry.name;
|
|
406
|
+
try {
|
|
407
|
+
description = parseSkillFrontmatter(readFileSync(skillFile, 'utf-8')).description || entry.name;
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
// unreadable frontmatter — keep the name as description
|
|
411
|
+
}
|
|
412
|
+
knownNames.add(entry.name);
|
|
413
|
+
// Keyed by the directory name — that is what restore operates on.
|
|
414
|
+
found.push({ name: entry.name, description, source: 'builtin', origin: 'custom', path: skillFile });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return found;
|
|
419
|
+
}
|
|
420
|
+
/* ── One-time migration of legacy copy installs (spec 4.6) ────── */
|
|
421
|
+
/**
|
|
422
|
+
* Convert legacy `installedSkillAgents[]` copy installs into symlinks.
|
|
423
|
+
* Content-identical copies are replaced with links. User-modified copies are
|
|
424
|
+
* left untouched and reported as skipped; marking them as managed would make a
|
|
425
|
+
* later unlink eligible to delete user-owned files. Never throws per record.
|
|
426
|
+
*/
|
|
427
|
+
export function migrateInstalledSkillAgents(options) {
|
|
428
|
+
const warn = options.warn ?? (() => { });
|
|
429
|
+
const byKey = new Map(options.agents.map((agent) => [agent.key, agent]));
|
|
430
|
+
const result = { converted: [], marked: [], skipped: [] };
|
|
431
|
+
for (const record of options.records) {
|
|
432
|
+
const tag = { agent: record.agent, skill: record.skill };
|
|
433
|
+
try {
|
|
434
|
+
const agent = byKey.get(record.agent);
|
|
435
|
+
if (!agent) {
|
|
436
|
+
result.skipped.push({ ...tag, reason: 'agent not present' });
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const linkPath = join(agent.skillDir, record.skill);
|
|
440
|
+
const stat = lstatSafe(linkPath);
|
|
441
|
+
if (!stat) {
|
|
442
|
+
result.skipped.push({ ...tag, reason: 'install path missing' });
|
|
443
|
+
continue;
|
|
444
|
+
}
|
|
445
|
+
if (stat.isSymbolicLink()) {
|
|
446
|
+
result.skipped.push({ ...tag, reason: 'already a link' });
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (!stat.isDirectory()) {
|
|
450
|
+
result.skipped.push({ ...tag, reason: 'not a directory' });
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
const sourceDir = resolveSkillSourceDir(record.skill, options.skillRoots);
|
|
454
|
+
if (!sourceDir) {
|
|
455
|
+
result.skipped.push({ ...tag, reason: 'skill body not found' });
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
if (resolve(linkPath) === resolve(sourceDir)) {
|
|
459
|
+
// The install path IS the skill body (shared universal dir) — converting
|
|
460
|
+
// it would delete the body and leave a self-referencing link.
|
|
461
|
+
result.skipped.push({ ...tag, reason: 'install path is the skill body' });
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
if (directoriesHaveSameContent(sourceDir, linkPath)) {
|
|
465
|
+
rmSync(linkPath, { recursive: true, force: true });
|
|
466
|
+
createSkillLink(sourceDir, linkPath, options.deps ?? {});
|
|
467
|
+
result.converted.push(tag);
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
warn(`skill copy at ${linkPath} differs from its body; kept as user-owned and not migrated`);
|
|
471
|
+
result.skipped.push({ ...tag, reason: 'copy differs from skill body' });
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
warn(`failed to migrate skill install ${record.agent}/${record.skill}: ${errorMessage(error)}`);
|
|
476
|
+
result.skipped.push({ ...tag, reason: errorMessage(error) });
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
return result;
|
|
480
|
+
}
|
|
481
|
+
/* ── Helpers ──────────────────────────────────────────────────── */
|
|
482
|
+
function lstatSafe(path) {
|
|
483
|
+
try {
|
|
484
|
+
return lstatSync(path);
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
function symlinkTargetIsDirectory(linkPath) {
|
|
491
|
+
try {
|
|
492
|
+
return statSync(linkPath).isDirectory();
|
|
493
|
+
}
|
|
494
|
+
catch {
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
/** Compare two directories by relative file set + file contents (marker file ignored). */
|
|
499
|
+
function directoriesHaveSameContent(a, b) {
|
|
500
|
+
const filesA = collectFiles(a);
|
|
501
|
+
const filesB = collectFiles(b);
|
|
502
|
+
if (filesA.size !== filesB.size)
|
|
503
|
+
return false;
|
|
504
|
+
for (const [relative, absoluteA] of filesA) {
|
|
505
|
+
const absoluteB = filesB.get(relative);
|
|
506
|
+
if (!absoluteB)
|
|
507
|
+
return false;
|
|
508
|
+
if (!readFileSync(absoluteA).equals(readFileSync(absoluteB)))
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
function collectFiles(root, prefix = '') {
|
|
514
|
+
const files = new Map();
|
|
515
|
+
for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {
|
|
516
|
+
if (entry.name === MINDOS_MANAGED_MARKER)
|
|
517
|
+
continue;
|
|
518
|
+
const relative = prefix ? join(prefix, entry.name) : entry.name;
|
|
519
|
+
const absolute = join(root, relative);
|
|
520
|
+
if (entry.isDirectory()) {
|
|
521
|
+
for (const [childRelative, childAbsolute] of collectFiles(root, relative)) {
|
|
522
|
+
files.set(childRelative, childAbsolute);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
else if (entry.isFile() || entry.isSymbolicLink()) {
|
|
526
|
+
files.set(relative, absolute);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return files;
|
|
530
|
+
}
|
|
531
|
+
function errorMessage(error) {
|
|
532
|
+
return error instanceof Error ? error.message : String(error);
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=skill-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-links.js","sourceRoot":"","sources":["../../../src/server/handlers/skill-links.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MindosServerResponse } from '../response.js';
|
|
2
|
+
import { type MindosSkillLinkAgent, type MindosSkillMatrix } from './skill-links.js';
|
|
2
3
|
export type MindosSkillSource = 'builtin' | 'user';
|
|
3
4
|
export type MindosSkillOrigin = 'app-builtin' | 'mindos-user' | 'mindos-global' | 'agents-global' | 'custom' | 'project-builtin';
|
|
4
5
|
export type MindosSkillRoot = {
|
|
@@ -33,7 +34,7 @@ export type MindosSkillsSettings = {
|
|
|
33
34
|
}>;
|
|
34
35
|
[key: string]: unknown;
|
|
35
36
|
};
|
|
36
|
-
export type SkillsPostAction = 'create' | 'update' | 'delete' | 'toggle' | 'read' | 'read-native' | 'record-install';
|
|
37
|
+
export type SkillsPostAction = 'create' | 'update' | 'delete' | 'toggle' | 'read' | 'read-native' | 'record-install' | 'link' | 'unlink' | 'disable-native' | 'enable-native';
|
|
37
38
|
export type SkillsPostPayload = {
|
|
38
39
|
action?: SkillsPostAction | string;
|
|
39
40
|
name?: string;
|
|
@@ -50,11 +51,15 @@ export type SkillsPostHandlerServices = {
|
|
|
50
51
|
trustedNativeSkillRoots?: string[];
|
|
51
52
|
readSettings(): MindosSkillsSettings;
|
|
52
53
|
writeSettings(settings: MindosSkillsSettings): void;
|
|
54
|
+
/** Downstream agents eligible for skill linking (present, skill-capable). Required for link/unlink. */
|
|
55
|
+
listLinkAgents?(): MindosSkillLinkAgent[];
|
|
53
56
|
};
|
|
54
57
|
export type SkillsPayload = {
|
|
55
58
|
skills: MindosSkillInfo[];
|
|
56
59
|
};
|
|
57
60
|
export declare function handleSkillsGet(services: SkillsHandlerServices): MindosServerResponse<SkillsPayload>;
|
|
61
|
+
/** Scan all skill roots and de-duplicate by name (first root wins). */
|
|
62
|
+
export declare function collectSkillInfos(skillRoots: MindosSkillRoot[], disabled: Set<string>): MindosSkillInfo[];
|
|
58
63
|
export declare function handleSkillsPost(body: unknown, services: SkillsPostHandlerServices): MindosServerResponse<{
|
|
59
64
|
ok: true;
|
|
60
65
|
} | {
|
|
@@ -63,4 +68,10 @@ export declare function handleSkillsPost(body: unknown, services: SkillsPostHand
|
|
|
63
68
|
} | {
|
|
64
69
|
error: string;
|
|
65
70
|
}>;
|
|
71
|
+
export type SkillMatrixHandlerServices = {
|
|
72
|
+
disabledSkills?: string[];
|
|
73
|
+
skillRoots: MindosSkillRoot[];
|
|
74
|
+
listLinkAgents(): MindosSkillLinkAgent[];
|
|
75
|
+
};
|
|
76
|
+
export declare function handleSkillMatrixGet(services: SkillMatrixHandlerServices): MindosServerResponse<MindosSkillMatrix>;
|
|
66
77
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/skills.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/skills.ts"],"names":[],"mappings":"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"}
|