nomoreide 0.1.92 → 0.1.94
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 +22 -1
- package/dist/cli/commands.d.ts +2 -0
- package/dist/cli/commands.js +32 -3
- package/dist/cli/commands.js.map +1 -1
- package/dist/core/agent-env-writers.d.ts +19 -0
- package/dist/core/agent-env-writers.js +220 -8
- package/dist/core/agent-env-writers.js.map +1 -1
- package/dist/core/agent-profiles/apply.d.ts +16 -0
- package/dist/core/agent-profiles/apply.js +24 -11
- package/dist/core/agent-profiles/apply.js.map +1 -1
- package/dist/core/agent-profiles/builtin.d.ts +8 -0
- package/dist/core/agent-profiles/builtin.js +33 -0
- package/dist/core/agent-profiles/builtin.js.map +1 -0
- package/dist/core/agent-profiles/debug-setup.d.ts +18 -0
- package/dist/core/agent-profiles/debug-setup.js +237 -0
- package/dist/core/agent-profiles/debug-setup.js.map +1 -0
- package/dist/core/agent-profiles/index.d.ts +3 -1
- package/dist/core/agent-profiles/index.js +3 -1
- package/dist/core/agent-profiles/index.js.map +1 -1
- package/dist/core/host-metrics.d.ts +41 -0
- package/dist/core/host-metrics.js +93 -0
- package/dist/core/host-metrics.js.map +1 -0
- package/dist/core/metrics-store.d.ts +28 -1
- package/dist/core/metrics-store.js +58 -3
- package/dist/core/metrics-store.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +8 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/services.d.ts +2 -0
- package/dist/mcp/tools/services.js +18 -9
- package/dist/mcp/tools/services.js.map +1 -1
- package/dist/web/client/assets/{code-editor-KPRIkcWr.js → code-editor-C2_ukSan.js} +1 -1
- package/dist/web/client/assets/index-CKHDI1ud.js +242 -0
- package/dist/web/client/assets/index-DVHKZVqv.css +1 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/metrics-routes.d.ts +1 -1
- package/dist/web/routes/metrics-routes.js +5 -2
- package/dist/web/routes/metrics-routes.js.map +1 -1
- package/dist/web/routes/shell-routes.js +2 -0
- package/dist/web/routes/shell-routes.js.map +1 -1
- package/dist/web/server.js +2 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +3 -1
- package/profiles/nomoreide-debug/profile.json +19 -0
- package/profiles/nomoreide-debug/skills/nomoreide-debug/SKILL.md +38 -0
- package/profiles/nomoreide-debug/skills/nomoreide-debug/agents/openai.yaml +13 -0
- package/profiles/nomoreide-debug/skills/nomoreide-debug/evals/evals.json +23 -0
- package/dist/web/client/assets/index-Czn4YU1U.js +0 -228
- package/dist/web/client/assets/index-DpqkI74n.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/apply.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Profile } from "./types.js";
|
|
2
|
+
export declare const NOMOREIDE_DEBUG_PROFILE_NAME = "nomoreide-debug";
|
|
3
|
+
export interface BundledAgentProfile {
|
|
4
|
+
profile: Profile;
|
|
5
|
+
skillsDir: string;
|
|
6
|
+
}
|
|
7
|
+
/** Load the read-only MCP + skill profile shipped with the npm package. */
|
|
8
|
+
export declare function loadBundledDebugProfile(): Promise<BundledAgentProfile>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { profileSchema } from "./types.js";
|
|
5
|
+
export const NOMOREIDE_DEBUG_PROFILE_NAME = "nomoreide-debug";
|
|
6
|
+
/** Load the read-only MCP + skill profile shipped with the npm package. */
|
|
7
|
+
export async function loadBundledDebugProfile() {
|
|
8
|
+
const root = fileURLToPath(new URL(`../../../profiles/${NOMOREIDE_DEBUG_PROFILE_NAME}/`, import.meta.url));
|
|
9
|
+
const profilePath = path.join(root, "profile.json");
|
|
10
|
+
let source;
|
|
11
|
+
try {
|
|
12
|
+
source = await readFile(profilePath, "utf8");
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
throw new Error(`Bundled profile "${NOMOREIDE_DEBUG_PROFILE_NAME}" is missing. Reinstall NoMoreIDE and try again.`);
|
|
16
|
+
}
|
|
17
|
+
let parsedSource;
|
|
18
|
+
try {
|
|
19
|
+
parsedSource = JSON.parse(source);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new Error(`Bundled profile "${NOMOREIDE_DEBUG_PROFILE_NAME}" contains invalid JSON.`);
|
|
23
|
+
}
|
|
24
|
+
const parsed = profileSchema.safeParse(parsedSource);
|
|
25
|
+
if (!parsed.success) {
|
|
26
|
+
throw new Error(`Bundled profile "${NOMOREIDE_DEBUG_PROFILE_NAME}" is invalid.`);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
profile: parsed.data,
|
|
30
|
+
skillsDir: path.join(root, "skills"),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=builtin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/builtin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAEzD,MAAM,CAAC,MAAM,4BAA4B,GAAG,iBAAiB,CAAC;AAO9D,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,IAAI,GAAG,aAAa,CACxB,IAAI,GAAG,CAAC,qBAAqB,4BAA4B,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAC/E,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACpD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,oBAAoB,4BAA4B,kDAAkD,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,YAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oBAAoB,4BAA4B,0BAA0B,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,oBAAoB,4BAA4B,eAAe,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,IAAI;QACpB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type DebugSetupAgent = "claude" | "codex" | "gemini";
|
|
2
|
+
export type DebugSetupStatus = "added" | "identical" | "replaced";
|
|
3
|
+
export interface DebugSetupResult {
|
|
4
|
+
agent: DebugSetupAgent;
|
|
5
|
+
mcp: DebugSetupStatus;
|
|
6
|
+
skill: DebugSetupStatus;
|
|
7
|
+
backups: string[];
|
|
8
|
+
}
|
|
9
|
+
export declare class DebugSetupConflictError extends Error {
|
|
10
|
+
readonly items: string[];
|
|
11
|
+
constructor(items: string[]);
|
|
12
|
+
}
|
|
13
|
+
export declare function installBundledDebugSetup(options: {
|
|
14
|
+
agent: DebugSetupAgent;
|
|
15
|
+
cwd: string;
|
|
16
|
+
homeDir?: string;
|
|
17
|
+
force?: boolean;
|
|
18
|
+
}): Promise<DebugSetupResult>;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readdir, readFile, readlink } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { parse as parseToml } from "smol-toml";
|
|
6
|
+
import { addGeminiMcp, addCodexMcpPreservingConfig, addMcp, getSkillDir, installSkillFromDirectory, removeSkill, } from "../agent-env-writers.js";
|
|
7
|
+
import { readAllAgentConfigs, } from "../agent-env/index.js";
|
|
8
|
+
import { loadBundledDebugProfile } from "./builtin.js";
|
|
9
|
+
export class DebugSetupConflictError extends Error {
|
|
10
|
+
items;
|
|
11
|
+
constructor(items) {
|
|
12
|
+
super(`NoMoreIDE setup conflicts with existing ${items.join(" and ")}. ` +
|
|
13
|
+
"Re-run with --force to replace them; backups will be created.");
|
|
14
|
+
this.items = items;
|
|
15
|
+
this.name = "DebugSetupConflictError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function installBundledDebugSetup(options) {
|
|
19
|
+
const bundled = await loadBundledDebugProfile();
|
|
20
|
+
const desired = bundled.profile.mcps.nomoreide;
|
|
21
|
+
if (!desired || desired.kind !== "local") {
|
|
22
|
+
throw new Error('Bundled profile must define a local "nomoreide" MCP server.');
|
|
23
|
+
}
|
|
24
|
+
const homeDir = options.homeDir ?? homedir();
|
|
25
|
+
const skillAgent = skillAgentFor(options.agent);
|
|
26
|
+
const sourceSkillDir = path.join(bundled.skillsDir, "nomoreide-debug");
|
|
27
|
+
const targetSkillDir = getSkillDir({ agent: skillAgent, skillName: "nomoreide-debug", scope: "user" }, options.cwd, homeDir);
|
|
28
|
+
const legacyCodexSkillDir = options.agent === "codex"
|
|
29
|
+
? path.join(homeDir, ".codex", "skills", "nomoreide-debug")
|
|
30
|
+
: undefined;
|
|
31
|
+
const [existingMcp, sourceDigest, targetDigest, legacyCodexDigest] = await Promise.all([
|
|
32
|
+
readExistingMcp(options.agent, options.cwd, homeDir),
|
|
33
|
+
directoryDigest(sourceSkillDir),
|
|
34
|
+
directoryDigest(targetSkillDir),
|
|
35
|
+
legacyCodexSkillDir ? directoryDigest(legacyCodexSkillDir) : Promise.resolve(null),
|
|
36
|
+
]);
|
|
37
|
+
if (!sourceDigest) {
|
|
38
|
+
throw new Error('Bundled skill "nomoreide-debug" is missing.');
|
|
39
|
+
}
|
|
40
|
+
const mcp = classifyMcp(existingMcp, desired);
|
|
41
|
+
const visibleSkillDigest = targetDigest ?? legacyCodexDigest;
|
|
42
|
+
const skill = visibleSkillDigest === null
|
|
43
|
+
? "added"
|
|
44
|
+
: visibleSkillDigest === sourceDigest
|
|
45
|
+
? "identical"
|
|
46
|
+
: "replaced";
|
|
47
|
+
const conflicts = [
|
|
48
|
+
...(mcp === "replaced" ? ['MCP server "nomoreide"'] : []),
|
|
49
|
+
...(skill === "replaced" ? ['skill "nomoreide-debug"'] : []),
|
|
50
|
+
];
|
|
51
|
+
if (conflicts.length > 0 && !options.force) {
|
|
52
|
+
throw new DebugSetupConflictError(conflicts);
|
|
53
|
+
}
|
|
54
|
+
const backups = [];
|
|
55
|
+
if (mcp !== "identical") {
|
|
56
|
+
const entry = toAgentMcpEntry(desired);
|
|
57
|
+
const outcome = options.agent === "gemini"
|
|
58
|
+
? await addGeminiMcp({
|
|
59
|
+
cwd: options.cwd,
|
|
60
|
+
homeDir,
|
|
61
|
+
key: "nomoreide",
|
|
62
|
+
entry,
|
|
63
|
+
})
|
|
64
|
+
: options.agent === "codex"
|
|
65
|
+
? await addCodexMcpPreservingConfig({
|
|
66
|
+
cwd: options.cwd,
|
|
67
|
+
homeDir,
|
|
68
|
+
key: "nomoreide",
|
|
69
|
+
entry,
|
|
70
|
+
})
|
|
71
|
+
: await addMcp({
|
|
72
|
+
cwd: options.cwd,
|
|
73
|
+
homeDir,
|
|
74
|
+
agent: options.agent,
|
|
75
|
+
key: "nomoreide",
|
|
76
|
+
scope: "user",
|
|
77
|
+
entry,
|
|
78
|
+
});
|
|
79
|
+
backups.push(...outcome.backups);
|
|
80
|
+
}
|
|
81
|
+
if (skill !== "identical") {
|
|
82
|
+
if (options.agent === "codex" && visibleSkillDigest !== null) {
|
|
83
|
+
const outcome = await removeSkill({
|
|
84
|
+
cwd: options.cwd,
|
|
85
|
+
homeDir,
|
|
86
|
+
location: { agent: "codex", skillName: "nomoreide-debug", scope: "user" },
|
|
87
|
+
});
|
|
88
|
+
backups.push(...outcome.backups);
|
|
89
|
+
}
|
|
90
|
+
const outcome = await installSkillFromDirectory({
|
|
91
|
+
cwd: options.cwd,
|
|
92
|
+
homeDir,
|
|
93
|
+
sourceDir: sourceSkillDir,
|
|
94
|
+
target: { agent: skillAgent, skillName: "nomoreide-debug", scope: "user" },
|
|
95
|
+
});
|
|
96
|
+
backups.push(...outcome.backups);
|
|
97
|
+
}
|
|
98
|
+
return { agent: options.agent, mcp, skill, backups };
|
|
99
|
+
}
|
|
100
|
+
function skillAgentFor(agent) {
|
|
101
|
+
return agent === "gemini" ? "antigravity" : agent;
|
|
102
|
+
}
|
|
103
|
+
async function readExistingMcp(agent, cwd, homeDir) {
|
|
104
|
+
if (agent === "codex") {
|
|
105
|
+
return await readExistingCodexMcp(homeDir);
|
|
106
|
+
}
|
|
107
|
+
if (agent === "claude") {
|
|
108
|
+
const configs = await readAllAgentConfigs({ cwd, homeDir });
|
|
109
|
+
const config = configs.find((candidate) => candidate.agent === agent);
|
|
110
|
+
return config?.mcpServers.nomoreide ??
|
|
111
|
+
(config?.remoteMcpServers.nomoreide ? "incompatible" : undefined);
|
|
112
|
+
}
|
|
113
|
+
const settingsPath = path.join(homeDir, ".gemini", "settings.json");
|
|
114
|
+
let source;
|
|
115
|
+
try {
|
|
116
|
+
source = await readFile(settingsPath, "utf8");
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (error.code === "ENOENT")
|
|
120
|
+
return undefined;
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const settings = JSON.parse(source);
|
|
125
|
+
const value = settings.mcpServers?.nomoreide;
|
|
126
|
+
if (value === undefined)
|
|
127
|
+
return undefined;
|
|
128
|
+
return parseLocalMcpEntry(value) ?? "incompatible";
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new Error(`Gemini CLI settings contain invalid JSON: ${settingsPath}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function readExistingCodexMcp(homeDir) {
|
|
135
|
+
const configPath = path.join(homeDir, ".codex", "config.toml");
|
|
136
|
+
let source;
|
|
137
|
+
try {
|
|
138
|
+
source = await readFile(configPath, "utf8");
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (error.code === "ENOENT")
|
|
142
|
+
return undefined;
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
let parsed;
|
|
146
|
+
try {
|
|
147
|
+
parsed = parseToml(source);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
throw new Error(`Codex configuration contains invalid TOML: ${configPath}`);
|
|
151
|
+
}
|
|
152
|
+
const servers = parsed.mcp_servers;
|
|
153
|
+
if (!servers || typeof servers !== "object")
|
|
154
|
+
return undefined;
|
|
155
|
+
const value = servers.nomoreide;
|
|
156
|
+
if (value === undefined)
|
|
157
|
+
return undefined;
|
|
158
|
+
if (!value || typeof value !== "object")
|
|
159
|
+
return "incompatible";
|
|
160
|
+
const raw = value;
|
|
161
|
+
if (raw.enabled === false || typeof raw.url === "string")
|
|
162
|
+
return "incompatible";
|
|
163
|
+
return parseLocalMcpEntry(raw) ?? "incompatible";
|
|
164
|
+
}
|
|
165
|
+
function parseLocalMcpEntry(value) {
|
|
166
|
+
if (!value || typeof value !== "object")
|
|
167
|
+
return undefined;
|
|
168
|
+
const entry = value;
|
|
169
|
+
if (typeof entry.command !== "string")
|
|
170
|
+
return undefined;
|
|
171
|
+
return {
|
|
172
|
+
command: entry.command,
|
|
173
|
+
...(Array.isArray(entry.args) && entry.args.every((item) => typeof item === "string")
|
|
174
|
+
? { args: entry.args }
|
|
175
|
+
: {}),
|
|
176
|
+
...(entry.env && typeof entry.env === "object"
|
|
177
|
+
? { env: entry.env }
|
|
178
|
+
: {}),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function classifyMcp(existing, desired) {
|
|
182
|
+
if (!existing)
|
|
183
|
+
return "added";
|
|
184
|
+
if (existing === "incompatible")
|
|
185
|
+
return "replaced";
|
|
186
|
+
return JSON.stringify(normalizeMcp(existing)) ===
|
|
187
|
+
JSON.stringify(normalizeMcp(toAgentMcpEntry(desired)))
|
|
188
|
+
? "identical"
|
|
189
|
+
: "replaced";
|
|
190
|
+
}
|
|
191
|
+
function toAgentMcpEntry(profile) {
|
|
192
|
+
return {
|
|
193
|
+
command: profile.command,
|
|
194
|
+
...(profile.args ? { args: profile.args } : {}),
|
|
195
|
+
...(profile.env ? { env: profile.env } : {}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function normalizeMcp(entry) {
|
|
199
|
+
return {
|
|
200
|
+
command: entry.command,
|
|
201
|
+
args: entry.args ?? [],
|
|
202
|
+
...(entry.env && Object.keys(entry.env).length > 0 ? { env: entry.env } : {}),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async function directoryDigest(root) {
|
|
206
|
+
const hash = createHash("sha256");
|
|
207
|
+
try {
|
|
208
|
+
await appendDirectory(hash, root, "");
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (error.code === "ENOENT")
|
|
212
|
+
return null;
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
return hash.digest("hex");
|
|
216
|
+
}
|
|
217
|
+
async function appendDirectory(hash, root, relative) {
|
|
218
|
+
const entries = await readdir(path.join(root, relative), { withFileTypes: true });
|
|
219
|
+
entries.sort((left, right) => left.name.localeCompare(right.name));
|
|
220
|
+
for (const entry of entries) {
|
|
221
|
+
const entryRelative = path.join(relative, entry.name);
|
|
222
|
+
hash.update(entryRelative);
|
|
223
|
+
if (entry.isDirectory()) {
|
|
224
|
+
hash.update("directory");
|
|
225
|
+
await appendDirectory(hash, root, entryRelative);
|
|
226
|
+
}
|
|
227
|
+
else if (entry.isSymbolicLink()) {
|
|
228
|
+
hash.update("symlink");
|
|
229
|
+
hash.update(await readlink(path.join(root, entryRelative)));
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
hash.update("file");
|
|
233
|
+
hash.update(await readFile(path.join(root, entryRelative)));
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=debug-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-setup.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/debug-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* `~/.config/nomoreide/agent-profiles/`, applied to agents through the
|
|
4
4
|
* write-guarded agent-env layer, shared as credential-redacted tarballs.
|
|
5
5
|
*/
|
|
6
|
-
export { applyProfile, previewProfileApply, type ProfileApplyItem, type ProfileApplyPreview, type ProfileApplyResult, type ProfileItemStatus, } from "./apply.js";
|
|
6
|
+
export { applyProfile, applyProfileContents, previewProfileApply, type ProfileContentsApplyOptions, type ProfileApplyItem, type ProfileApplyPreview, type ProfileApplyResult, type ProfileItemStatus, } from "./apply.js";
|
|
7
|
+
export { loadBundledDebugProfile, NOMOREIDE_DEBUG_PROFILE_NAME, type BundledAgentProfile, } from "./builtin.js";
|
|
8
|
+
export { DebugSetupConflictError, installBundledDebugSetup, type DebugSetupAgent, type DebugSetupResult, type DebugSetupStatus, } from "./debug-setup.js";
|
|
7
9
|
export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
|
|
8
10
|
export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, type ProfileStoreOptions, } from "./store.js";
|
|
9
11
|
export { exportProfile, importProfile, type ExportResult, type ImportResult } from "./transfer.js";
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
* `~/.config/nomoreide/agent-profiles/`, applied to agents through the
|
|
4
4
|
* write-guarded agent-env layer, shared as credential-redacted tarballs.
|
|
5
5
|
*/
|
|
6
|
-
export { applyProfile, previewProfileApply, } from "./apply.js";
|
|
6
|
+
export { applyProfile, applyProfileContents, previewProfileApply, } from "./apply.js";
|
|
7
|
+
export { loadBundledDebugProfile, NOMOREIDE_DEBUG_PROFILE_NAME, } from "./builtin.js";
|
|
8
|
+
export { DebugSetupConflictError, installBundledDebugSetup, } from "./debug-setup.js";
|
|
7
9
|
export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
|
|
8
10
|
export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, } from "./store.js";
|
|
9
11
|
export { exportProfile, importProfile } from "./transfer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,YAAY,EACZ,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,GAMpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,4BAA4B,GAE7B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAIzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,YAAY,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AACnG,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,0BAA0B,GAG3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,GAKrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAKzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GAMnB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type CpuInfo } from "node:os";
|
|
2
|
+
export interface CpuTimes {
|
|
3
|
+
idle: number;
|
|
4
|
+
total: number;
|
|
5
|
+
}
|
|
6
|
+
export interface DiskUsage {
|
|
7
|
+
path: string;
|
|
8
|
+
totalBytes: number;
|
|
9
|
+
usedBytes: number;
|
|
10
|
+
availableBytes: number;
|
|
11
|
+
usedPercent: number;
|
|
12
|
+
}
|
|
13
|
+
export interface HostMetricSample {
|
|
14
|
+
t: number;
|
|
15
|
+
cpuPercent: number | null;
|
|
16
|
+
memoryUsedBytes: number;
|
|
17
|
+
memoryTotalBytes: number;
|
|
18
|
+
memoryUsedPercent: number;
|
|
19
|
+
loadAverage: [number, number, number] | null;
|
|
20
|
+
uptimeSeconds: number;
|
|
21
|
+
logicalCpuCount: number;
|
|
22
|
+
disk: DiskUsage | null;
|
|
23
|
+
}
|
|
24
|
+
export interface HostMetricsReader {
|
|
25
|
+
cpuInfo(): CpuInfo[];
|
|
26
|
+
diskUsage(path: string): Promise<DiskUsage>;
|
|
27
|
+
freeMemoryBytes(): number;
|
|
28
|
+
loadAverage(): [number, number, number] | null;
|
|
29
|
+
totalMemoryBytes(): number;
|
|
30
|
+
uptimeSeconds(): number;
|
|
31
|
+
}
|
|
32
|
+
export declare class HostMetricsCollector {
|
|
33
|
+
private readonly path;
|
|
34
|
+
private readonly reader;
|
|
35
|
+
private previousCpu?;
|
|
36
|
+
constructor(path: string, reader?: HostMetricsReader);
|
|
37
|
+
sample(now?: number): Promise<HostMetricSample>;
|
|
38
|
+
}
|
|
39
|
+
export declare function summarizeCpuTimes(cpuInfo: CpuInfo[]): CpuTimes;
|
|
40
|
+
export declare function calculateCpuPercent(previous: CpuTimes | undefined, current: CpuTimes): number | null;
|
|
41
|
+
export declare function readDiskUsage(path: string): Promise<DiskUsage>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { statfs } from "node:fs/promises";
|
|
2
|
+
import { cpus, freemem, loadavg, platform, totalmem, uptime, } from "node:os";
|
|
3
|
+
export class HostMetricsCollector {
|
|
4
|
+
path;
|
|
5
|
+
reader;
|
|
6
|
+
previousCpu;
|
|
7
|
+
constructor(path, reader = defaultHostMetricsReader) {
|
|
8
|
+
this.path = path;
|
|
9
|
+
this.reader = reader;
|
|
10
|
+
}
|
|
11
|
+
async sample(now = Date.now()) {
|
|
12
|
+
const cpuInfo = this.reader.cpuInfo();
|
|
13
|
+
const currentCpu = summarizeCpuTimes(cpuInfo);
|
|
14
|
+
const cpuPercent = calculateCpuPercent(this.previousCpu, currentCpu);
|
|
15
|
+
this.previousCpu = currentCpu;
|
|
16
|
+
const memoryTotalBytes = Math.max(0, this.reader.totalMemoryBytes());
|
|
17
|
+
const memoryFreeBytes = clamp(this.reader.freeMemoryBytes(), 0, memoryTotalBytes);
|
|
18
|
+
const memoryUsedBytes = Math.max(0, memoryTotalBytes - memoryFreeBytes);
|
|
19
|
+
const disk = await this.reader.diskUsage(this.path).catch(() => null);
|
|
20
|
+
return {
|
|
21
|
+
t: now,
|
|
22
|
+
cpuPercent,
|
|
23
|
+
memoryUsedBytes,
|
|
24
|
+
memoryTotalBytes,
|
|
25
|
+
memoryUsedPercent: percent(memoryUsedBytes, memoryTotalBytes),
|
|
26
|
+
loadAverage: this.reader.loadAverage(),
|
|
27
|
+
uptimeSeconds: Math.max(0, this.reader.uptimeSeconds()),
|
|
28
|
+
logicalCpuCount: cpuInfo.length,
|
|
29
|
+
disk,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export function summarizeCpuTimes(cpuInfo) {
|
|
34
|
+
return cpuInfo.reduce((summary, cpu) => {
|
|
35
|
+
const total = cpu.times.user +
|
|
36
|
+
cpu.times.nice +
|
|
37
|
+
cpu.times.sys +
|
|
38
|
+
cpu.times.idle +
|
|
39
|
+
cpu.times.irq;
|
|
40
|
+
return {
|
|
41
|
+
idle: summary.idle + cpu.times.idle,
|
|
42
|
+
total: summary.total + total,
|
|
43
|
+
};
|
|
44
|
+
}, { idle: 0, total: 0 });
|
|
45
|
+
}
|
|
46
|
+
export function calculateCpuPercent(previous, current) {
|
|
47
|
+
if (!previous)
|
|
48
|
+
return null;
|
|
49
|
+
const totalDelta = current.total - previous.total;
|
|
50
|
+
const idleDelta = current.idle - previous.idle;
|
|
51
|
+
if (totalDelta <= 0)
|
|
52
|
+
return null;
|
|
53
|
+
return roundOne(clamp((1 - idleDelta / totalDelta) * 100, 0, 100));
|
|
54
|
+
}
|
|
55
|
+
export async function readDiskUsage(path) {
|
|
56
|
+
const stats = await statfs(path);
|
|
57
|
+
const blockSize = Number(stats.bsize);
|
|
58
|
+
const totalBytes = blockSize * Number(stats.blocks);
|
|
59
|
+
const availableBytes = blockSize * Number(stats.bavail);
|
|
60
|
+
const usedBytes = Math.max(0, totalBytes - blockSize * Number(stats.bfree));
|
|
61
|
+
return {
|
|
62
|
+
path,
|
|
63
|
+
totalBytes,
|
|
64
|
+
usedBytes,
|
|
65
|
+
availableBytes,
|
|
66
|
+
usedPercent: percent(usedBytes, totalBytes),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const defaultHostMetricsReader = {
|
|
70
|
+
cpuInfo: cpus,
|
|
71
|
+
diskUsage: readDiskUsage,
|
|
72
|
+
freeMemoryBytes: freemem,
|
|
73
|
+
loadAverage: () => {
|
|
74
|
+
if (platform() === "win32")
|
|
75
|
+
return null;
|
|
76
|
+
const [one, five, fifteen] = loadavg();
|
|
77
|
+
return [one ?? 0, five ?? 0, fifteen ?? 0];
|
|
78
|
+
},
|
|
79
|
+
totalMemoryBytes: totalmem,
|
|
80
|
+
uptimeSeconds: uptime,
|
|
81
|
+
};
|
|
82
|
+
function percent(value, total) {
|
|
83
|
+
if (total <= 0)
|
|
84
|
+
return 0;
|
|
85
|
+
return roundOne(clamp((value / total) * 100, 0, 100));
|
|
86
|
+
}
|
|
87
|
+
function clamp(value, minimum, maximum) {
|
|
88
|
+
return Math.min(maximum, Math.max(minimum, value));
|
|
89
|
+
}
|
|
90
|
+
function roundOne(value) {
|
|
91
|
+
return Math.round(value * 10) / 10;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=host-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-metrics.js","sourceRoot":"","sources":["../../src/core/host-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ProcessManager } from "./process-manager.js";
|
|
2
|
+
import { HostMetricsCollector, type HostMetricSample } from "./host-metrics.js";
|
|
3
|
+
import { type ProcessTreeSummary } from "./process-tree.js";
|
|
2
4
|
export interface MetricSample {
|
|
3
5
|
t: number;
|
|
4
6
|
cpu: number;
|
|
@@ -10,12 +12,32 @@ export interface MetricsSeries {
|
|
|
10
12
|
sampleIntervalMs: number;
|
|
11
13
|
samples: MetricSample[];
|
|
12
14
|
}
|
|
15
|
+
export interface ServiceActivityMetric {
|
|
16
|
+
service: string;
|
|
17
|
+
startedAt?: string;
|
|
18
|
+
sampledAt: number;
|
|
19
|
+
cpuPercent: number;
|
|
20
|
+
rssMb: number;
|
|
21
|
+
processCount: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ActivityMetrics {
|
|
24
|
+
sampleIntervalMs: number;
|
|
25
|
+
host: {
|
|
26
|
+
current: HostMetricSample | null;
|
|
27
|
+
samples: HostMetricSample[];
|
|
28
|
+
};
|
|
29
|
+
services: Record<string, ServiceActivityMetric>;
|
|
30
|
+
}
|
|
13
31
|
export interface MetricsStoreOptions {
|
|
14
32
|
manager: ProcessManager;
|
|
15
33
|
/** Seconds between samples. */
|
|
16
34
|
intervalMs?: number;
|
|
17
35
|
/** Max samples kept per service (ring buffer). */
|
|
18
36
|
capacity?: number;
|
|
37
|
+
cwd?: string;
|
|
38
|
+
hostCollector?: Pick<HostMetricsCollector, "sample">;
|
|
39
|
+
processTreeReader?: (rootPid: number) => Promise<ProcessTreeSummary>;
|
|
40
|
+
now?: () => number;
|
|
19
41
|
}
|
|
20
42
|
/**
|
|
21
43
|
* In-memory CPU/RSS time series for managed services. Polls process trees on a
|
|
@@ -26,12 +48,17 @@ export declare class MetricsStore {
|
|
|
26
48
|
private readonly manager;
|
|
27
49
|
private readonly intervalMs;
|
|
28
50
|
private readonly capacity;
|
|
51
|
+
private readonly hostCollector;
|
|
52
|
+
private readonly processTreeReader;
|
|
53
|
+
private readonly now;
|
|
29
54
|
private readonly buffers;
|
|
55
|
+
private readonly hostSamples;
|
|
30
56
|
private timer?;
|
|
31
57
|
private sampling;
|
|
32
58
|
constructor(options: MetricsStoreOptions);
|
|
33
59
|
start(): void;
|
|
34
60
|
stop(): void;
|
|
35
61
|
read(service: string): MetricsSeries;
|
|
36
|
-
|
|
62
|
+
readActivity(): ActivityMetrics;
|
|
63
|
+
sampleOnce(): Promise<void>;
|
|
37
64
|
}
|