nomoreide 0.1.65 → 0.1.69
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/core/agent-env/antigravity-reader.d.ts +7 -0
- package/dist/core/agent-env/antigravity-reader.js +86 -0
- package/dist/core/agent-env/antigravity-reader.js.map +1 -0
- package/dist/core/agent-env/availability.d.ts +6 -0
- package/dist/core/agent-env/availability.js +79 -0
- package/dist/core/agent-env/availability.js.map +1 -0
- package/dist/core/agent-env/claude-reader.d.ts +7 -0
- package/dist/core/agent-env/claude-reader.js +93 -0
- package/dist/core/agent-env/claude-reader.js.map +1 -0
- package/dist/core/agent-env/codex-reader.d.ts +9 -0
- package/dist/core/agent-env/codex-reader.js +145 -0
- package/dist/core/agent-env/codex-reader.js.map +1 -0
- package/dist/core/agent-env/index.d.ts +9 -0
- package/dist/core/agent-env/index.js +29 -0
- package/dist/core/agent-env/index.js.map +1 -0
- package/dist/core/agent-env/managed-plugins.d.ts +13 -0
- package/dist/core/agent-env/managed-plugins.js +36 -0
- package/dist/core/agent-env/managed-plugins.js.map +1 -0
- package/dist/core/agent-env/plugin-reader.d.ts +9 -0
- package/dist/core/agent-env/plugin-reader.js +174 -0
- package/dist/core/agent-env/plugin-reader.js.map +1 -0
- package/dist/core/agent-env/shared.d.ts +25 -0
- package/dist/core/agent-env/shared.js +115 -0
- package/dist/core/agent-env/shared.js.map +1 -0
- package/dist/core/agent-env/types.d.ts +66 -0
- package/dist/core/agent-env/types.js +7 -0
- package/dist/core/agent-env/types.js.map +1 -0
- package/dist/core/config-store.d.ts +4 -0
- package/dist/core/config-store.js +21 -0
- package/dist/core/config-store.js.map +1 -1
- package/dist/core/timeline-store.d.ts +4 -0
- package/dist/core/timeline-store.js +8 -0
- package/dist/core/timeline-store.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/workflow-triggers.d.ts +105 -0
- package/dist/core/workflow-triggers.js +149 -0
- package/dist/core/workflow-triggers.js.map +1 -0
- package/dist/mcp/tools/agent-env.d.ts +8 -0
- package/dist/mcp/tools/agent-env.js +40 -0
- package/dist/mcp/tools/agent-env.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +1 -1
- package/dist/mcp/tools/index.js +3 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/web/client/assets/{code-editor-DPTOoTni.js → code-editor-B4fwOZmz.js} +1 -1
- package/dist/web/client/assets/{index-CuhlHDjR.js → index-Bv9X1Rmi.js} +133 -133
- package/dist/web/client/assets/index-CNvFKnAK.css +1 -0
- package/dist/web/client/index.html +2 -2
- package/dist/web/routes/agent-env-routes.d.ts +7 -0
- package/dist/web/routes/agent-env-routes.js +36 -0
- package/dist/web/routes/agent-env-routes.js.map +1 -0
- package/dist/web/routes/context.d.ts +2 -0
- package/dist/web/routes/context.js.map +1 -1
- package/dist/web/routes/index.js +4 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/shell-routes.js +1 -0
- package/dist/web/routes/shell-routes.js.map +1 -1
- package/dist/web/routes/workflow-trigger-routes.d.ts +9 -0
- package/dist/web/routes/workflow-trigger-routes.js +78 -0
- package/dist/web/routes/workflow-trigger-routes.js.map +1 -0
- package/dist/web/server.js +10 -0
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/client/assets/index-BylTX_ZJ.css +0 -1
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ConfigStore } from "./config-store.js";
|
|
3
|
+
import type { ErrorInbox } from "./error-inbox.js";
|
|
4
|
+
import type { TimelineStore } from "./timeline-store.js";
|
|
5
|
+
/**
|
|
6
|
+
* Event-driven workflow triggers (IDEAS #16). Workflows are user-run today; a
|
|
7
|
+
* trigger binds an app-detected event to a workflow so it fires automatically.
|
|
8
|
+
*
|
|
9
|
+
* The workflow runner lives client-side (agent steps run through the dock), so a
|
|
10
|
+
* trigger can't run a workflow on the server. Instead a fired trigger enqueues a
|
|
11
|
+
* **pending run** here; the open dashboard drains the queue and drives the
|
|
12
|
+
* existing client runner. Pending runs survive until a browser claims them, so
|
|
13
|
+
* an event detected while no tab is open isn't lost.
|
|
14
|
+
*
|
|
15
|
+
* Live event sources are the two already push-based and in-process:
|
|
16
|
+
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident.
|
|
17
|
+
* - `service-crash` — {@link TimelineStore} records a `service.lifecycle`
|
|
18
|
+
* event with `severity: "error"` (non-zero exit not initiated by the user).
|
|
19
|
+
*/
|
|
20
|
+
export declare const triggerEventSchema: z.ZodEnum<["error-incident", "service-crash"]>;
|
|
21
|
+
export type TriggerEvent = z.infer<typeof triggerEventSchema>;
|
|
22
|
+
export declare const workflowTriggerSchema: z.ZodObject<{
|
|
23
|
+
id: z.ZodString;
|
|
24
|
+
/** The workflow (built-in or user-saved) to run when this fires. */
|
|
25
|
+
workflowId: z.ZodString;
|
|
26
|
+
event: z.ZodEnum<["error-incident", "service-crash"]>;
|
|
27
|
+
/** Disabled triggers stay configured but never fire. */
|
|
28
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Optional case-insensitive substring matched against the event's service
|
|
31
|
+
* name (and, for incidents, the incident title). Empty/absent = match all.
|
|
32
|
+
*/
|
|
33
|
+
filter: z.ZodOptional<z.ZodString>;
|
|
34
|
+
/**
|
|
35
|
+
* When true the dashboard starts the run automatically; otherwise the pending
|
|
36
|
+
* run is surfaced for the user to start with one click.
|
|
37
|
+
*/
|
|
38
|
+
autoRun: z.ZodDefault<z.ZodBoolean>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
id: string;
|
|
41
|
+
workflowId: string;
|
|
42
|
+
event: "error-incident" | "service-crash";
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
autoRun: boolean;
|
|
45
|
+
filter?: string | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
id: string;
|
|
48
|
+
workflowId: string;
|
|
49
|
+
event: "error-incident" | "service-crash";
|
|
50
|
+
filter?: string | undefined;
|
|
51
|
+
enabled?: boolean | undefined;
|
|
52
|
+
autoRun?: boolean | undefined;
|
|
53
|
+
}>;
|
|
54
|
+
export type WorkflowTrigger = z.infer<typeof workflowTriggerSchema>;
|
|
55
|
+
export interface PendingRun {
|
|
56
|
+
id: string;
|
|
57
|
+
triggerId: string;
|
|
58
|
+
workflowId: string;
|
|
59
|
+
event: TriggerEvent;
|
|
60
|
+
/** Human-readable reason this fired, shown in the dashboard. */
|
|
61
|
+
summary: string;
|
|
62
|
+
/** `triggerId:cause` dedupe key, collapsing a burst into one pending run. */
|
|
63
|
+
signature: string;
|
|
64
|
+
autoRun: boolean;
|
|
65
|
+
createdAt: string;
|
|
66
|
+
}
|
|
67
|
+
type PendingListener = (pending: PendingRun) => void;
|
|
68
|
+
interface WorkflowTriggerManagerOptions {
|
|
69
|
+
configStore: ConfigStore;
|
|
70
|
+
errorInbox: ErrorInbox;
|
|
71
|
+
timelineStore: TimelineStore;
|
|
72
|
+
/** Max pending runs kept; older ones drop off the front. */
|
|
73
|
+
capacity?: number;
|
|
74
|
+
/** A repeat of the same signature within this window is ignored. */
|
|
75
|
+
dedupeWindowMs?: number;
|
|
76
|
+
/** Injectable clock for tests. */
|
|
77
|
+
now?: () => number;
|
|
78
|
+
}
|
|
79
|
+
export declare class WorkflowTriggerManager {
|
|
80
|
+
private readonly configStore;
|
|
81
|
+
private readonly errorInbox;
|
|
82
|
+
private readonly timelineStore;
|
|
83
|
+
private readonly capacity;
|
|
84
|
+
private readonly dedupeWindowMs;
|
|
85
|
+
private readonly now;
|
|
86
|
+
private readonly pending;
|
|
87
|
+
private readonly lastFiredAt;
|
|
88
|
+
private readonly listeners;
|
|
89
|
+
private readonly unsubscribers;
|
|
90
|
+
private started;
|
|
91
|
+
constructor(options: WorkflowTriggerManagerOptions);
|
|
92
|
+
/** Subscribe to the live event sources. Idempotent. */
|
|
93
|
+
start(): void;
|
|
94
|
+
stop(): void;
|
|
95
|
+
subscribe(listener: PendingListener): () => void;
|
|
96
|
+
/** Pending runs, newest first. */
|
|
97
|
+
listPending(): PendingRun[];
|
|
98
|
+
/** Drop a pending run once the dashboard has started (or dismissed) it. */
|
|
99
|
+
ackPending(id: string): boolean;
|
|
100
|
+
private onIncident;
|
|
101
|
+
private onTimelineEvent;
|
|
102
|
+
private triggersFor;
|
|
103
|
+
private enqueue;
|
|
104
|
+
}
|
|
105
|
+
export {};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
/**
|
|
4
|
+
* Event-driven workflow triggers (IDEAS #16). Workflows are user-run today; a
|
|
5
|
+
* trigger binds an app-detected event to a workflow so it fires automatically.
|
|
6
|
+
*
|
|
7
|
+
* The workflow runner lives client-side (agent steps run through the dock), so a
|
|
8
|
+
* trigger can't run a workflow on the server. Instead a fired trigger enqueues a
|
|
9
|
+
* **pending run** here; the open dashboard drains the queue and drives the
|
|
10
|
+
* existing client runner. Pending runs survive until a browser claims them, so
|
|
11
|
+
* an event detected while no tab is open isn't lost.
|
|
12
|
+
*
|
|
13
|
+
* Live event sources are the two already push-based and in-process:
|
|
14
|
+
* - `error-incident` — {@link ErrorInbox} surfaces a new/repeated incident.
|
|
15
|
+
* - `service-crash` — {@link TimelineStore} records a `service.lifecycle`
|
|
16
|
+
* event with `severity: "error"` (non-zero exit not initiated by the user).
|
|
17
|
+
*/
|
|
18
|
+
export const triggerEventSchema = z.enum(["error-incident", "service-crash"]);
|
|
19
|
+
export const workflowTriggerSchema = z.object({
|
|
20
|
+
id: z.string().min(1),
|
|
21
|
+
/** The workflow (built-in or user-saved) to run when this fires. */
|
|
22
|
+
workflowId: z.string().min(1),
|
|
23
|
+
event: triggerEventSchema,
|
|
24
|
+
/** Disabled triggers stay configured but never fire. */
|
|
25
|
+
enabled: z.boolean().default(true),
|
|
26
|
+
/**
|
|
27
|
+
* Optional case-insensitive substring matched against the event's service
|
|
28
|
+
* name (and, for incidents, the incident title). Empty/absent = match all.
|
|
29
|
+
*/
|
|
30
|
+
filter: z.string().optional(),
|
|
31
|
+
/**
|
|
32
|
+
* When true the dashboard starts the run automatically; otherwise the pending
|
|
33
|
+
* run is surfaced for the user to start with one click.
|
|
34
|
+
*/
|
|
35
|
+
autoRun: z.boolean().default(false),
|
|
36
|
+
});
|
|
37
|
+
export class WorkflowTriggerManager {
|
|
38
|
+
configStore;
|
|
39
|
+
errorInbox;
|
|
40
|
+
timelineStore;
|
|
41
|
+
capacity;
|
|
42
|
+
dedupeWindowMs;
|
|
43
|
+
now;
|
|
44
|
+
pending = [];
|
|
45
|
+
lastFiredAt = new Map();
|
|
46
|
+
listeners = new Set();
|
|
47
|
+
unsubscribers = [];
|
|
48
|
+
started = false;
|
|
49
|
+
constructor(options) {
|
|
50
|
+
this.configStore = options.configStore;
|
|
51
|
+
this.errorInbox = options.errorInbox;
|
|
52
|
+
this.timelineStore = options.timelineStore;
|
|
53
|
+
this.capacity = options.capacity ?? 50;
|
|
54
|
+
this.dedupeWindowMs = options.dedupeWindowMs ?? 30_000;
|
|
55
|
+
this.now = options.now ?? Date.now;
|
|
56
|
+
}
|
|
57
|
+
/** Subscribe to the live event sources. Idempotent. */
|
|
58
|
+
start() {
|
|
59
|
+
if (this.started)
|
|
60
|
+
return;
|
|
61
|
+
this.started = true;
|
|
62
|
+
this.unsubscribers.push(this.errorInbox.subscribe((incident) => {
|
|
63
|
+
void this.onIncident(incident);
|
|
64
|
+
}));
|
|
65
|
+
this.unsubscribers.push(this.timelineStore.subscribe((event) => {
|
|
66
|
+
void this.onTimelineEvent(event);
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
stop() {
|
|
70
|
+
for (const off of this.unsubscribers.splice(0))
|
|
71
|
+
off();
|
|
72
|
+
this.started = false;
|
|
73
|
+
}
|
|
74
|
+
subscribe(listener) {
|
|
75
|
+
this.listeners.add(listener);
|
|
76
|
+
return () => this.listeners.delete(listener);
|
|
77
|
+
}
|
|
78
|
+
/** Pending runs, newest first. */
|
|
79
|
+
listPending() {
|
|
80
|
+
return [...this.pending].reverse();
|
|
81
|
+
}
|
|
82
|
+
/** Drop a pending run once the dashboard has started (or dismissed) it. */
|
|
83
|
+
ackPending(id) {
|
|
84
|
+
const index = this.pending.findIndex((run) => run.id === id);
|
|
85
|
+
if (index === -1)
|
|
86
|
+
return false;
|
|
87
|
+
this.pending.splice(index, 1);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
async onIncident(incident) {
|
|
91
|
+
const triggers = await this.triggersFor("error-incident");
|
|
92
|
+
const haystack = `${incident.service} ${incident.title}`;
|
|
93
|
+
for (const trigger of triggers) {
|
|
94
|
+
if (!matchesFilter(trigger.filter, haystack))
|
|
95
|
+
continue;
|
|
96
|
+
this.enqueue(trigger, {
|
|
97
|
+
signatureCause: `incident:${incident.signature}`,
|
|
98
|
+
summary: `${incident.service}: ${incident.title}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async onTimelineEvent(event) {
|
|
103
|
+
if (event.kind !== "service.lifecycle" || event.severity !== "error")
|
|
104
|
+
return;
|
|
105
|
+
const service = event.service ?? "";
|
|
106
|
+
const triggers = await this.triggersFor("service-crash");
|
|
107
|
+
for (const trigger of triggers) {
|
|
108
|
+
if (!matchesFilter(trigger.filter, service))
|
|
109
|
+
continue;
|
|
110
|
+
this.enqueue(trigger, {
|
|
111
|
+
signatureCause: `crash:${service}`,
|
|
112
|
+
summary: event.title || `${service} crashed`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async triggersFor(event) {
|
|
117
|
+
const config = await this.configStore.load();
|
|
118
|
+
return config.workflowTriggers.filter((trigger) => trigger.enabled && trigger.event === event);
|
|
119
|
+
}
|
|
120
|
+
enqueue(trigger, cause) {
|
|
121
|
+
const signature = `${trigger.id}:${cause.signatureCause}`;
|
|
122
|
+
const at = this.now();
|
|
123
|
+
const previous = this.lastFiredAt.get(signature);
|
|
124
|
+
if (previous !== undefined && at - previous < this.dedupeWindowMs)
|
|
125
|
+
return;
|
|
126
|
+
this.lastFiredAt.set(signature, at);
|
|
127
|
+
const run = {
|
|
128
|
+
id: randomUUID(),
|
|
129
|
+
triggerId: trigger.id,
|
|
130
|
+
workflowId: trigger.workflowId,
|
|
131
|
+
event: trigger.event,
|
|
132
|
+
summary: cause.summary,
|
|
133
|
+
signature,
|
|
134
|
+
autoRun: trigger.autoRun,
|
|
135
|
+
createdAt: new Date(at).toISOString(),
|
|
136
|
+
};
|
|
137
|
+
this.pending.push(run);
|
|
138
|
+
this.pending.splice(0, Math.max(0, this.pending.length - this.capacity));
|
|
139
|
+
for (const listener of this.listeners)
|
|
140
|
+
listener(run);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function matchesFilter(filter, haystack) {
|
|
144
|
+
const needle = filter?.trim().toLowerCase();
|
|
145
|
+
if (!needle)
|
|
146
|
+
return true;
|
|
147
|
+
return haystack.toLowerCase().includes(needle);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=workflow-triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-triggers.js","sourceRoot":"","sources":["../../src/core/workflow-triggers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FastMCP } from "fastmcp";
|
|
2
|
+
import { type ToolContext } from "./context.js";
|
|
3
|
+
export declare const AGENT_ENV_TOOL_NAMES: readonly ["nomoreide_agents_status", "nomoreide_agents_read_configs", "nomoreide_agents_doctor"];
|
|
4
|
+
/**
|
|
5
|
+
* Read-only (ROR-60). Mutating agent configs is Phase 2 (ROR-61) and will live
|
|
6
|
+
* behind the write-guarded agent-env-actions module.
|
|
7
|
+
*/
|
|
8
|
+
export declare function registerAgentEnvTools(server: FastMCP, _ctx: ToolContext): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getAgentAvailability, readAllAgentConfigs, runAgentDoctor, } from "../../core/agent-env/index.js";
|
|
3
|
+
import { stringify } from "./context.js";
|
|
4
|
+
export const AGENT_ENV_TOOL_NAMES = [
|
|
5
|
+
"nomoreide_agents_status",
|
|
6
|
+
"nomoreide_agents_read_configs",
|
|
7
|
+
"nomoreide_agents_doctor",
|
|
8
|
+
];
|
|
9
|
+
const agentEnvCwdSchema = z.object({
|
|
10
|
+
cwd: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Project directory used to resolve project-scoped MCPs and skills."),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Read-only (ROR-60). Mutating agent configs is Phase 2 (ROR-61) and will live
|
|
18
|
+
* behind the write-guarded agent-env-actions module.
|
|
19
|
+
*/
|
|
20
|
+
export function registerAgentEnvTools(server, _ctx) {
|
|
21
|
+
server.addTool({
|
|
22
|
+
name: "nomoreide_agents_status",
|
|
23
|
+
description: "Check which coding agent CLIs (Claude Code, Codex, Antigravity) are installed and on PATH.",
|
|
24
|
+
parameters: z.object({}),
|
|
25
|
+
execute: async () => stringify(await getAgentAvailability()),
|
|
26
|
+
});
|
|
27
|
+
server.addTool({
|
|
28
|
+
name: "nomoreide_agents_read_configs",
|
|
29
|
+
description: "Read the live MCP servers and skills configured for each coding agent (Claude Code, Codex, Antigravity). Read-only.",
|
|
30
|
+
parameters: agentEnvCwdSchema,
|
|
31
|
+
execute: async ({ cwd }) => stringify(await readAllAgentConfigs({ cwd: cwd ?? process.cwd() })),
|
|
32
|
+
});
|
|
33
|
+
server.addTool({
|
|
34
|
+
name: "nomoreide_agents_doctor",
|
|
35
|
+
description: "Diagnose coding agent setup: CLI availability and config file presence per agent.",
|
|
36
|
+
parameters: agentEnvCwdSchema,
|
|
37
|
+
execute: async ({ cwd }) => stringify(await runAgentDoctor({ cwd: cwd ?? process.cwd() })),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=agent-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-env.js","sourceRoot":"","sources":["../../../src/mcp/tools/agent-env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAoB,MAAM,cAAc,CAAC;AAE3D,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,yBAAyB;IACzB,+BAA+B;IAC/B,yBAAyB;CACjB,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAe,EAAE,IAAiB;IACtE,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,4FAA4F;QAC9F,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,MAAM,oBAAoB,EAAE,CAAC;KAC7D,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,qHAAqH;QACvH,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CACzB,SAAS,CAAC,MAAM,mBAAmB,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;KACtE,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,yBAAyB;QAC/B,WAAW,EACT,mFAAmF;QACrF,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CACzB,SAAS,CAAC,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;KACjE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -10,7 +10,7 @@ import { type ToolContext } from "./context.js";
|
|
|
10
10
|
* a new domain module and register it below. This aggregator never grows a
|
|
11
11
|
* per-tool branch.
|
|
12
12
|
*/
|
|
13
|
-
export declare const NOMOREIDE_TOOL_NAMES: readonly ["nomoreide_list_services", "nomoreide_register_service", "nomoreide_start_service", "nomoreide_stop_service", "nomoreide_restart_service", "nomoreide_read_logs", "nomoreide_register_bundle", "nomoreide_start_bundle", "nomoreide_stop_bundle", "nomoreide_status", "nomoreide_service_context", "nomoreide_service_health", "nomoreide_timeline", "nomoreide_onboard_repo", "nomoreide_git_status", "nomoreide_git_branches", "nomoreide_git_switch_branch", "nomoreide_git_create_branch", "nomoreide_git_fetch", "nomoreide_git_diff", "nomoreide_git_staged_diff", "nomoreide_git_log", "nomoreide_git_stage", "nomoreide_git_unstage", "nomoreide_git_commit", "nomoreide_git_push", "nomoreide_git_clone", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_snapshots_list", "nomoreide_snapshot_create", "nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_merge_pr", "nomoreide_github_list_issues", "nomoreide_github_get_issue", "nomoreide_github_list_issue_comments", "nomoreide_github_add_issue_comment", "nomoreide_github_create_issue", "nomoreide_github_get_commit_ci", "nomoreide_github_list_workflow_runs", "nomoreide_list_errors", "nomoreide_error_prompt", "nomoreide_list_databases", "nomoreide_db_tables", "nomoreide_db_sample", "nomoreide_db_query", "nomoreide_docs", "nomoreide_open_ui", "nomoreide_close_ui"];
|
|
13
|
+
export declare const NOMOREIDE_TOOL_NAMES: readonly ["nomoreide_list_services", "nomoreide_register_service", "nomoreide_start_service", "nomoreide_stop_service", "nomoreide_restart_service", "nomoreide_read_logs", "nomoreide_register_bundle", "nomoreide_start_bundle", "nomoreide_stop_bundle", "nomoreide_status", "nomoreide_service_context", "nomoreide_service_health", "nomoreide_timeline", "nomoreide_onboard_repo", "nomoreide_git_status", "nomoreide_git_branches", "nomoreide_git_switch_branch", "nomoreide_git_create_branch", "nomoreide_git_fetch", "nomoreide_git_diff", "nomoreide_git_staged_diff", "nomoreide_git_log", "nomoreide_git_stage", "nomoreide_git_unstage", "nomoreide_git_commit", "nomoreide_git_push", "nomoreide_git_clone", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_snapshots_list", "nomoreide_snapshot_create", "nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_merge_pr", "nomoreide_github_list_issues", "nomoreide_github_get_issue", "nomoreide_github_list_issue_comments", "nomoreide_github_add_issue_comment", "nomoreide_github_create_issue", "nomoreide_github_get_commit_ci", "nomoreide_github_list_workflow_runs", "nomoreide_list_errors", "nomoreide_error_prompt", "nomoreide_list_databases", "nomoreide_db_tables", "nomoreide_db_sample", "nomoreide_db_query", "nomoreide_docs", "nomoreide_open_ui", "nomoreide_close_ui", "nomoreide_agents_status", "nomoreide_agents_read_configs", "nomoreide_agents_doctor"];
|
|
14
14
|
interface RegisterNoMoreIdeToolsOptions extends ToolContext {
|
|
15
15
|
server: FastMCP;
|
|
16
16
|
toolCallStore?: ToolCallStore;
|
package/dist/mcp/tools/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { wrapServerForRecording } from "./context.js";
|
|
2
2
|
import { AGENT_TOOL_NAMES, registerAgentTools } from "./agent.js";
|
|
3
|
+
import { AGENT_ENV_TOOL_NAMES, registerAgentEnvTools } from "./agent-env.js";
|
|
3
4
|
import { DATABASE_TOOL_NAMES, registerDatabaseTools } from "./database.js";
|
|
4
5
|
import { DOC_TOOL_NAMES, registerDocTools } from "./docs.js";
|
|
5
6
|
import { ERROR_TOOL_NAMES, registerErrorTools } from "./errors.js";
|
|
@@ -26,6 +27,7 @@ export const NOMOREIDE_TOOL_NAMES = [
|
|
|
26
27
|
...DATABASE_TOOL_NAMES,
|
|
27
28
|
...DOC_TOOL_NAMES,
|
|
28
29
|
...AGENT_TOOL_NAMES,
|
|
30
|
+
...AGENT_ENV_TOOL_NAMES,
|
|
29
31
|
];
|
|
30
32
|
export function registerNoMoreIdeTools(options) {
|
|
31
33
|
const { server: rawServer, toolCallStore, agentSessions, ...ctx } = options;
|
|
@@ -41,5 +43,6 @@ export function registerNoMoreIdeTools(options) {
|
|
|
41
43
|
registerDatabaseTools(server, ctx);
|
|
42
44
|
registerDocTools(server, ctx);
|
|
43
45
|
registerAgentTools(server, ctx);
|
|
46
|
+
registerAgentEnvTools(server, ctx);
|
|
44
47
|
}
|
|
45
48
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,mBAAmB;IACtB,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,GAAG,gBAAgB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,mBAAmB;IACtB,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,oBAAoB;CACf,CAAC;AAQX,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;QACjE,CAAC,CAAC,SAAS,CAAC;IAEd,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
|