@edukors/ai-cli 0.0.0-stage → 0.1.1
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/LICENSE +9 -0
- package/README.md +162 -2
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +256 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/diagnostics.d.ts +28 -0
- package/dist/diagnostics.js +35 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/engine.d.ts +157 -0
- package/dist/engine.js +395 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +95 -0
- package/dist/events.js +8 -0
- package/dist/events.js.map +1 -0
- package/dist/host/main.d.ts +2 -0
- package/dist/host/main.js +30 -0
- package/dist/host/main.js.map +1 -0
- package/dist/host/stdio.d.ts +34 -0
- package/dist/host/stdio.js +254 -0
- package/dist/host/stdio.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/config.d.ts +19 -0
- package/dist/mcp/config.js +63 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/external.d.ts +55 -0
- package/dist/mcp/external.js +129 -0
- package/dist/mcp/external.js.map +1 -0
- package/dist/mcp/toolServer.d.ts +30 -0
- package/dist/mcp/toolServer.js +102 -0
- package/dist/mcp/toolServer.js.map +1 -0
- package/dist/platform/discovery.d.ts +23 -0
- package/dist/platform/discovery.js +64 -0
- package/dist/platform/discovery.js.map +1 -0
- package/dist/platform/env.d.ts +12 -0
- package/dist/platform/env.js +104 -0
- package/dist/platform/env.js.map +1 -0
- package/dist/platform/login.d.ts +16 -0
- package/dist/platform/login.js +42 -0
- package/dist/platform/login.js.map +1 -0
- package/dist/platform/paths.d.ts +19 -0
- package/dist/platform/paths.js +46 -0
- package/dist/platform/paths.js.map +1 -0
- package/dist/platform/process.d.ts +55 -0
- package/dist/platform/process.js +186 -0
- package/dist/platform/process.js.map +1 -0
- package/dist/provider.d.ts +156 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/claude/adapter.d.ts +43 -0
- package/dist/providers/claude/adapter.js +398 -0
- package/dist/providers/claude/adapter.js.map +1 -0
- package/dist/providers/claude/events.d.ts +36 -0
- package/dist/providers/claude/events.js +90 -0
- package/dist/providers/claude/events.js.map +1 -0
- package/dist/providers/codex/adapter.d.ts +28 -0
- package/dist/providers/codex/adapter.js +497 -0
- package/dist/providers/codex/adapter.js.map +1 -0
- package/dist/providers/codex/rpc.d.ts +17 -0
- package/dist/providers/codex/rpc.js +75 -0
- package/dist/providers/codex/rpc.js.map +1 -0
- package/dist/providers.d.ts +9 -0
- package/dist/providers.js +15 -0
- package/dist/providers.js.map +1 -0
- package/dist/redact.d.ts +7 -0
- package/dist/redact.js +48 -0
- package/dist/redact.js.map +1 -0
- package/dist/registry/lock.d.ts +18 -0
- package/dist/registry/lock.js +83 -0
- package/dist/registry/lock.js.map +1 -0
- package/dist/registry/registry.d.ts +38 -0
- package/dist/registry/registry.js +119 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/session.d.ts +126 -0
- package/dist/session.js +333 -0
- package/dist/session.js.map +1 -0
- package/dist/settings.d.ts +8 -0
- package/dist/settings.js +7 -0
- package/dist/settings.js.map +1 -0
- package/dist/skills.d.ts +24 -0
- package/dist/skills.js +91 -0
- package/dist/skills.js.map +1 -0
- package/dist/testing/fakeProvider.d.ts +22 -0
- package/dist/testing/fakeProvider.js +266 -0
- package/dist/testing/fakeProvider.js.map +1 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +2 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tools.d.ts +45 -0
- package/dist/tools.js +32 -0
- package/dist/tools.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/fixtures/fake-ai.mjs +230 -0
- package/fixtures/fake-claude.mjs +62 -0
- package/fixtures/fake-codex.mjs +281 -0
- package/fixtures/fake-mcp-server.mjs +14 -0
- package/package.json +74 -4
package/dist/session.js
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { AiCliError, toAiCliError } from "./errors.js";
|
|
3
|
+
const settledWithin = (turn, ms) => Promise.race([turn.settled.then(() => true), new Promise((r) => setTimeout(() => r(false), ms).unref())]);
|
|
4
|
+
export class AiSession {
|
|
5
|
+
deps;
|
|
6
|
+
id;
|
|
7
|
+
appId;
|
|
8
|
+
documentId;
|
|
9
|
+
accountId;
|
|
10
|
+
providerId;
|
|
11
|
+
_state = "opening";
|
|
12
|
+
provider = null;
|
|
13
|
+
/** Identifies the current provider instance; hooks from older ones are ignored. */
|
|
14
|
+
providerToken = null;
|
|
15
|
+
_resumeId;
|
|
16
|
+
turn = null;
|
|
17
|
+
closing = false;
|
|
18
|
+
options;
|
|
19
|
+
listeners = new Set();
|
|
20
|
+
droppedEvents = 0;
|
|
21
|
+
constructor(deps) {
|
|
22
|
+
this.deps = deps;
|
|
23
|
+
this.id = deps.scope.sessionId;
|
|
24
|
+
this.appId = deps.scope.appId;
|
|
25
|
+
this.documentId = deps.scope.documentId;
|
|
26
|
+
this.accountId = deps.scope.accountId;
|
|
27
|
+
this.providerId = deps.scope.providerId;
|
|
28
|
+
this.options = { ...deps.options };
|
|
29
|
+
}
|
|
30
|
+
get state() {
|
|
31
|
+
return this._state;
|
|
32
|
+
}
|
|
33
|
+
/** The provider's own conversation id, for applications that persist it to resume later. */
|
|
34
|
+
get resumeId() {
|
|
35
|
+
return this._resumeId;
|
|
36
|
+
}
|
|
37
|
+
/** Events of this session only. Returns an unsubscribe function. */
|
|
38
|
+
on(listener) {
|
|
39
|
+
this.listeners.add(listener);
|
|
40
|
+
return () => this.listeners.delete(listener);
|
|
41
|
+
}
|
|
42
|
+
/** Opens (or reopens) the provider session. Called by the library; reopening happens on demand. */
|
|
43
|
+
async start(resumeId) {
|
|
44
|
+
if (this.closing)
|
|
45
|
+
throw new AiCliError("SESSION_CLOSED", "the session is closed");
|
|
46
|
+
this._state = "opening";
|
|
47
|
+
const context = await this.deps.context();
|
|
48
|
+
context.options = { ...this.options };
|
|
49
|
+
if (resumeId && this.deps.capabilities.persistentSessions)
|
|
50
|
+
context.resumeId = resumeId;
|
|
51
|
+
const token = {};
|
|
52
|
+
this.providerToken = token;
|
|
53
|
+
let instance;
|
|
54
|
+
try {
|
|
55
|
+
instance = await this.deps.adapter.openSession(context, { exited: (error) => this.providerExited(token, error) });
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
if (this.providerToken === token)
|
|
59
|
+
this.providerToken = null;
|
|
60
|
+
this._state = this.closing ? "closed" : "failed";
|
|
61
|
+
throw toAiCliError(e, "PROVIDER_START_FAILED");
|
|
62
|
+
}
|
|
63
|
+
if (this.closing || this.providerToken !== token) {
|
|
64
|
+
await instance.close().catch(() => undefined);
|
|
65
|
+
throw new AiCliError("SESSION_CLOSED", "the session is closed");
|
|
66
|
+
}
|
|
67
|
+
this.provider = instance;
|
|
68
|
+
const resumed = context.resumeId !== undefined && instance.resumeId === context.resumeId;
|
|
69
|
+
this._resumeId = instance.resumeId ?? this._resumeId;
|
|
70
|
+
this._state = "idle";
|
|
71
|
+
this.emit({ type: "sessionOpened", resumed });
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sends a request and resolves when it ends. Failures resolve with
|
|
75
|
+
* `status: "failed"` and are also emitted as `error` events; only misuse
|
|
76
|
+
* (a closed or busy session) rejects.
|
|
77
|
+
*/
|
|
78
|
+
async send(text, options = {}) {
|
|
79
|
+
if (this.closing)
|
|
80
|
+
throw new AiCliError("SESSION_CLOSED", "the session is closed");
|
|
81
|
+
if (this.turn)
|
|
82
|
+
throw new AiCliError("SESSION_BUSY", "a request is already in progress");
|
|
83
|
+
const turn = this.newTurn(options.requestId ?? randomUUID());
|
|
84
|
+
this.turn = turn;
|
|
85
|
+
this._state = "busy";
|
|
86
|
+
try {
|
|
87
|
+
this.emit({ type: "activity", phase: "preparing" }, turn.requestId);
|
|
88
|
+
if (!this.provider) {
|
|
89
|
+
await this.start(this._resumeId);
|
|
90
|
+
this._state = "busy";
|
|
91
|
+
}
|
|
92
|
+
if (turn.cancelled)
|
|
93
|
+
return this.finish(turn, "cancelled");
|
|
94
|
+
const provider = this.provider;
|
|
95
|
+
if (!provider)
|
|
96
|
+
throw new AiCliError("PROVIDER_CRASHED", "the provider stopped before the request started");
|
|
97
|
+
const outcome = await provider.send({ requestId: turn.requestId, text, ...(options.context !== undefined ? { context: options.context } : {}) }, this.sinkFor(turn));
|
|
98
|
+
return this.finish(turn, turn.cancelled ? "cancelled" : outcome);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
if (turn.cancelled)
|
|
102
|
+
return this.finish(turn, "cancelled");
|
|
103
|
+
const error = toAiCliError(e, "PROVIDER_ERROR");
|
|
104
|
+
if (error.code === "PROVIDER_CRASHED" || error.code === "PROVIDER_START_FAILED")
|
|
105
|
+
this.dropProvider();
|
|
106
|
+
this.deps.log.warn(`request failed: ${error.code}`, { message: error.message, cause: error.cause });
|
|
107
|
+
return this.finish(turn, "failed", error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Stops the current request. Resolves once it has settled: already
|
|
112
|
+
* committed tool calls stay committed, nothing after this point is applied.
|
|
113
|
+
* A provider that does not stop within the grace period is shut down and
|
|
114
|
+
* restarted (resumed) on the next request.
|
|
115
|
+
*/
|
|
116
|
+
async interrupt() {
|
|
117
|
+
const turn = this.turn;
|
|
118
|
+
if (!turn)
|
|
119
|
+
return;
|
|
120
|
+
if (!turn.cancelled) {
|
|
121
|
+
turn.cancelled = true;
|
|
122
|
+
turn.abort.abort();
|
|
123
|
+
if (!this.closing)
|
|
124
|
+
this._state = "interrupting";
|
|
125
|
+
for (const q of turn.questions.values())
|
|
126
|
+
q.reject(new AiCliError("CANCELLED", "the request was cancelled"));
|
|
127
|
+
turn.questions.clear();
|
|
128
|
+
const provider = this.provider;
|
|
129
|
+
provider?.interrupt().catch((e) => this.deps.log.warn("provider interrupt failed", e));
|
|
130
|
+
if (!(await settledWithin(turn, this.deps.interruptGraceMs))) {
|
|
131
|
+
this.deps.log.warn("provider did not stop in time; shutting it down");
|
|
132
|
+
this.dropProvider();
|
|
133
|
+
await provider?.close().catch((e) => this.deps.log.warn("provider close failed", e));
|
|
134
|
+
// A well-behaved adapter settles `send` on close; otherwise settle it here.
|
|
135
|
+
if (!(await settledWithin(turn, this.deps.interruptGraceMs)))
|
|
136
|
+
this.finish(turn, "cancelled");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
await turn.settled;
|
|
140
|
+
}
|
|
141
|
+
/** Answers a `question` event. */
|
|
142
|
+
answer(questionId, answer) {
|
|
143
|
+
const pending = this.turn?.questions.get(questionId);
|
|
144
|
+
if (!pending)
|
|
145
|
+
throw new AiCliError("QUESTION_NOT_FOUND", "no such question is waiting", { meta: { questionId } });
|
|
146
|
+
this.turn.questions.delete(questionId);
|
|
147
|
+
pending.resolve(answer);
|
|
148
|
+
}
|
|
149
|
+
async updateOptions(options) {
|
|
150
|
+
if (this.closing)
|
|
151
|
+
throw new AiCliError("SESSION_CLOSED", "the session is closed");
|
|
152
|
+
const next = { ...this.options, ...options };
|
|
153
|
+
if (this.provider) {
|
|
154
|
+
if (!this.deps.capabilities.liveOptions || !this.provider.updateOptions) {
|
|
155
|
+
throw new AiCliError("CAPABILITY_UNSUPPORTED", "this provider cannot change options in an open session", { meta: { providerId: this.providerId } });
|
|
156
|
+
}
|
|
157
|
+
await this.provider.updateOptions(next);
|
|
158
|
+
}
|
|
159
|
+
this.options = next;
|
|
160
|
+
}
|
|
161
|
+
async close(reason = "closed") {
|
|
162
|
+
if (this.closing)
|
|
163
|
+
return;
|
|
164
|
+
this.closing = true;
|
|
165
|
+
await this.interrupt();
|
|
166
|
+
const provider = this.provider;
|
|
167
|
+
this.dropProvider();
|
|
168
|
+
await provider?.close().catch((e) => this.deps.log.warn("provider close failed", e));
|
|
169
|
+
this._state = "closed";
|
|
170
|
+
this.emit({ type: "sessionClosed", reason });
|
|
171
|
+
this.deps.onClosed(this);
|
|
172
|
+
}
|
|
173
|
+
/** Counts provider output that arrived for a request no longer current. */
|
|
174
|
+
get lateEventsDropped() {
|
|
175
|
+
return this.droppedEvents;
|
|
176
|
+
}
|
|
177
|
+
// ---------------------------------------------------------------- internals
|
|
178
|
+
newTurn(requestId) {
|
|
179
|
+
let settle;
|
|
180
|
+
const settled = new Promise((r) => (settle = r));
|
|
181
|
+
return { requestId, abort: new AbortController(), cancelled: false, result: null, questions: new Map(), settled, settle };
|
|
182
|
+
}
|
|
183
|
+
finish(turn, status, error) {
|
|
184
|
+
if (turn.result)
|
|
185
|
+
return turn.result;
|
|
186
|
+
const result = { requestId: turn.requestId, status, ...(error ? { error: error.toJSON() } : {}) };
|
|
187
|
+
turn.result = result;
|
|
188
|
+
for (const q of turn.questions.values())
|
|
189
|
+
q.reject(new AiCliError("CANCELLED", "the request ended"));
|
|
190
|
+
turn.questions.clear();
|
|
191
|
+
if (!turn.abort.signal.aborted)
|
|
192
|
+
turn.abort.abort();
|
|
193
|
+
if (this.turn === turn)
|
|
194
|
+
this.turn = null;
|
|
195
|
+
if (!this.closing)
|
|
196
|
+
this._state = status === "failed" && !this.provider ? "failed" : "idle";
|
|
197
|
+
if (status === "completed")
|
|
198
|
+
this.emit({ type: "turnCompleted" }, turn.requestId);
|
|
199
|
+
else if (status === "cancelled")
|
|
200
|
+
this.emit({ type: "cancelled" }, turn.requestId);
|
|
201
|
+
else
|
|
202
|
+
this.emit({ type: "error", error: result.error }, turn.requestId);
|
|
203
|
+
turn.settle();
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
dropProvider() {
|
|
207
|
+
this.provider = null;
|
|
208
|
+
this.providerToken = null;
|
|
209
|
+
}
|
|
210
|
+
providerExited(token, error) {
|
|
211
|
+
if (token !== this.providerToken)
|
|
212
|
+
return;
|
|
213
|
+
this.dropProvider();
|
|
214
|
+
// During a request the adapter rejects `send`, which reports the failure.
|
|
215
|
+
if (this.turn || this.closing)
|
|
216
|
+
return;
|
|
217
|
+
this._state = "failed";
|
|
218
|
+
const err = toAiCliError(error, "PROVIDER_CRASHED");
|
|
219
|
+
this.deps.log.warn("provider exited while idle", { code: err.code, message: err.message });
|
|
220
|
+
this.emit({ type: "error", error: err.toJSON() });
|
|
221
|
+
}
|
|
222
|
+
sinkFor(turn) {
|
|
223
|
+
const live = () => this.turn === turn && !turn.abort.signal.aborted;
|
|
224
|
+
const drop = (what) => {
|
|
225
|
+
this.droppedEvents++;
|
|
226
|
+
this.deps.log.debug(`dropped late ${what}`, { requestId: turn.requestId });
|
|
227
|
+
};
|
|
228
|
+
return {
|
|
229
|
+
signal: turn.abort.signal,
|
|
230
|
+
text: (delta) => (live() ? this.emit({ type: "textDelta", text: delta }, turn.requestId) : drop("text")),
|
|
231
|
+
activity: (phase, detail) => (live() ? this.emit({ type: "activity", phase, ...(detail ? { detail } : {}) }, turn.requestId) : drop("activity")),
|
|
232
|
+
usage: (usage) => (live() ? this.emit({ type: "usageUpdated", usage: { ...usage, observedAt: usage.observedAt ?? new Date().toISOString() } }, turn.requestId) : drop("usage")),
|
|
233
|
+
callTool: (name, args) => this.callTool(turn, live, name, args),
|
|
234
|
+
callExternal: (server, tool, args) => this.callExternal(turn, live, server, tool, args),
|
|
235
|
+
ask: (question) => {
|
|
236
|
+
if (!live()) {
|
|
237
|
+
drop("question");
|
|
238
|
+
return Promise.reject(new AiCliError("CANCELLED", "the request is no longer active"));
|
|
239
|
+
}
|
|
240
|
+
const questionId = randomUUID();
|
|
241
|
+
return new Promise((resolve, reject) => {
|
|
242
|
+
turn.questions.set(questionId, { resolve, reject });
|
|
243
|
+
this.emit({ type: "question", questionId, prompt: question.prompt, ...(question.options ? { options: question.options } : {}) }, turn.requestId);
|
|
244
|
+
});
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
async callTool(turn, live, name, args) {
|
|
249
|
+
if (!live()) {
|
|
250
|
+
this.droppedEvents++;
|
|
251
|
+
return { content: "The request was cancelled; the tool was not run.", isError: true };
|
|
252
|
+
}
|
|
253
|
+
const callId = randomUUID();
|
|
254
|
+
const tool = this.deps.tools.get(name);
|
|
255
|
+
this.emit({ type: "toolStarted", callId, tool: name }, turn.requestId);
|
|
256
|
+
const fail = (code, message) => {
|
|
257
|
+
this.emit({ type: "toolCompleted", callId, tool: name, ok: false, errorCode: code }, turn.requestId);
|
|
258
|
+
return { content: message, isError: true };
|
|
259
|
+
};
|
|
260
|
+
if (!tool)
|
|
261
|
+
return fail("TOOL_NOT_FOUND", `Unknown tool: ${name}`);
|
|
262
|
+
if (args === null || args === undefined)
|
|
263
|
+
args = {};
|
|
264
|
+
if (typeof args !== "object" || Array.isArray(args))
|
|
265
|
+
return fail("TOOL_INVALID_ARGUMENTS", "Tool arguments must be a JSON object.");
|
|
266
|
+
let value = args;
|
|
267
|
+
if (tool.validate) {
|
|
268
|
+
const checked = tool.validate(value);
|
|
269
|
+
if (!checked.ok)
|
|
270
|
+
return fail("TOOL_INVALID_ARGUMENTS", `Invalid arguments for ${name}: ${checked.message}`);
|
|
271
|
+
value = checked.value;
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
const result = await tool.run(value, { documentId: this.documentId, requestId: turn.requestId, callId, signal: turn.abort.signal });
|
|
275
|
+
// Reported even after an interruption: the application did run it.
|
|
276
|
+
this.emit({ type: "toolCompleted", callId, tool: name, ok: !result.isError, ...(result.isError ? { errorCode: "TOOL_FAILED" } : {}) }, turn.requestId);
|
|
277
|
+
return result;
|
|
278
|
+
}
|
|
279
|
+
catch (e) {
|
|
280
|
+
this.deps.log.warn(`tool ${name} threw`, e);
|
|
281
|
+
return fail(e instanceof AiCliError ? e.code : "TOOL_FAILED", `Tool ${name} failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async callExternal(turn, live, server, tool, args) {
|
|
285
|
+
if (!live()) {
|
|
286
|
+
this.droppedEvents++;
|
|
287
|
+
return { content: "The request was cancelled; the tool was not run.", isError: true };
|
|
288
|
+
}
|
|
289
|
+
const callId = randomUUID();
|
|
290
|
+
const name = `mcp__${server}__${tool}`;
|
|
291
|
+
this.emit({ type: "toolStarted", callId, tool: name }, turn.requestId);
|
|
292
|
+
const fail = (code, message) => {
|
|
293
|
+
this.emit({ type: "toolCompleted", callId, tool: name, ok: false, errorCode: code }, turn.requestId);
|
|
294
|
+
return { content: message, isError: true };
|
|
295
|
+
};
|
|
296
|
+
if (!this.deps.external?.has(server, tool))
|
|
297
|
+
return fail("TOOL_NOT_FOUND", `Unknown tool: ${name}`);
|
|
298
|
+
const input = args && typeof args === "object" && !Array.isArray(args) ? args : {};
|
|
299
|
+
try {
|
|
300
|
+
const decision = this.deps.authorize
|
|
301
|
+
? await this.deps.authorize({ kind: "mcp", callId, server, tool, input, documentId: this.documentId, requestId: turn.requestId, signal: turn.abort.signal })
|
|
302
|
+
: { allow: false, message: "This application does not allow calls to MCP servers." };
|
|
303
|
+
if (!decision.allow)
|
|
304
|
+
return fail("TOOL_DENIED", decision.message || "The user declined this action.");
|
|
305
|
+
if (!live())
|
|
306
|
+
return fail("CANCELLED", "The request was cancelled; the tool was not run.");
|
|
307
|
+
const result = await this.deps.external.call(server, tool, input);
|
|
308
|
+
this.emit({ type: "toolCompleted", callId, tool: name, ok: !result.isError, ...(result.isError ? { errorCode: "TOOL_FAILED" } : {}) }, turn.requestId);
|
|
309
|
+
return result;
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
this.deps.log.warn(`MCP tool ${name} failed`, e);
|
|
313
|
+
return fail("TOOL_FAILED", `${name} failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/** Reports the user's MCP servers once the session is open. */
|
|
317
|
+
reportServers(statuses) {
|
|
318
|
+
for (const s of statuses)
|
|
319
|
+
this.emit({ type: "mcpServerStatus", ...s });
|
|
320
|
+
}
|
|
321
|
+
emit(body, requestId) {
|
|
322
|
+
const event = this.deps.publish({ ...this.deps.scope, ...(requestId ? { requestId } : {}), ...body });
|
|
323
|
+
for (const listener of this.listeners) {
|
|
324
|
+
try {
|
|
325
|
+
listener(event);
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
this.deps.log.error("session listener threw", e);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an editor's settings screen needs, safe to bundle for a browser or
|
|
3
|
+
* webview: no Node modules are imported from here.
|
|
4
|
+
*/
|
|
5
|
+
export { parseMcpConfig } from "./mcp/config.js";
|
|
6
|
+
export type { McpProblem, McpProblemCode } from "./mcp/config.js";
|
|
7
|
+
export { TOOL_SERVER_NAME } from "./constants.js";
|
|
8
|
+
export type { McpServerSpec } from "./mcp/external.js";
|
package/dist/settings.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an editor's settings screen needs, safe to bundle for a browser or
|
|
3
|
+
* webview: no Node modules are imported from here.
|
|
4
|
+
*/
|
|
5
|
+
export { parseMcpConfig } from "./mcp/config.js";
|
|
6
|
+
export { TOOL_SERVER_NAME } from "./constants.js";
|
|
7
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/skills.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ToolSpec } from "./tools.js";
|
|
2
|
+
/**
|
|
3
|
+
* The application's skills: a folder of `<folder>/SKILL.md`, each with a YAML
|
|
4
|
+
* frontmatter naming and describing it. Claude Code loads them natively; for
|
|
5
|
+
* providers that would need a shell to read them (Codex), the library serves
|
|
6
|
+
* them through `read_skill` instead.
|
|
7
|
+
*/
|
|
8
|
+
export interface SkillInfo {
|
|
9
|
+
folder: string;
|
|
10
|
+
name: string;
|
|
11
|
+
description: string;
|
|
12
|
+
}
|
|
13
|
+
/** `name` and `description` from a SKILL.md frontmatter: one-line values, quoted or not, and folded blocks. */
|
|
14
|
+
export declare function frontmatter(text: string): Record<string, string>;
|
|
15
|
+
export declare function listSkills(dir: string): SkillInfo[];
|
|
16
|
+
/**
|
|
17
|
+
* A file of one skill, `SKILL.md` by default. The path must stay inside that
|
|
18
|
+
* skill's folder, links included.
|
|
19
|
+
*/
|
|
20
|
+
export declare function readSkillFile(dir: string, skill: string, file?: string): string;
|
|
21
|
+
export declare const READ_SKILL_TOOL = "read_skill";
|
|
22
|
+
export declare const readSkillSpec: ToolSpec;
|
|
23
|
+
/** What the model is told about the skills when it cannot load them natively. */
|
|
24
|
+
export declare function skillsInstructions(skills: SkillInfo[]): string;
|
package/dist/skills.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
3
|
+
/** `name` and `description` from a SKILL.md frontmatter: one-line values, quoted or not, and folded blocks. */
|
|
4
|
+
export function frontmatter(text) {
|
|
5
|
+
const m = /^?---\r?\n([\s\S]*?)\r?\n---\s*(?:\r?\n|$)/.exec(text);
|
|
6
|
+
if (!m)
|
|
7
|
+
return {};
|
|
8
|
+
const fields = {};
|
|
9
|
+
const lines = m[1].split(/\r?\n/);
|
|
10
|
+
for (let i = 0; i < lines.length; i++) {
|
|
11
|
+
const kv = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(lines[i]);
|
|
12
|
+
if (!kv)
|
|
13
|
+
continue;
|
|
14
|
+
let value = kv[2].trim();
|
|
15
|
+
if (/^[>|][+-]?$/.test(value)) {
|
|
16
|
+
const block = [];
|
|
17
|
+
while (i + 1 < lines.length && (/^\s+\S/.test(lines[i + 1]) || !lines[i + 1].trim()))
|
|
18
|
+
block.push(lines[++i].trim());
|
|
19
|
+
value = value.startsWith(">") ? block.filter(Boolean).join(" ") : block.join("\n").trim();
|
|
20
|
+
}
|
|
21
|
+
else if (/^(["']).*\1$/.test(value))
|
|
22
|
+
value = value.slice(1, -1);
|
|
23
|
+
fields[kv[1]] = value;
|
|
24
|
+
}
|
|
25
|
+
return fields;
|
|
26
|
+
}
|
|
27
|
+
export function listSkills(dir) {
|
|
28
|
+
if (!existsSync(dir))
|
|
29
|
+
return [];
|
|
30
|
+
const skills = [];
|
|
31
|
+
for (const folder of readdirSync(dir).sort()) {
|
|
32
|
+
const file = join(dir, folder, "SKILL.md");
|
|
33
|
+
try {
|
|
34
|
+
if (folder.startsWith(".") || !statSync(join(dir, folder)).isDirectory() || !existsSync(file))
|
|
35
|
+
continue;
|
|
36
|
+
const fields = frontmatter(readFileSync(file, "utf8"));
|
|
37
|
+
skills.push({ folder, name: fields.name || folder, description: fields.description ?? "" });
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
/* unreadable: left out */
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return skills;
|
|
44
|
+
}
|
|
45
|
+
const MAX_FILE = 256 << 10;
|
|
46
|
+
/**
|
|
47
|
+
* A file of one skill, `SKILL.md` by default. The path must stay inside that
|
|
48
|
+
* skill's folder, links included.
|
|
49
|
+
*/
|
|
50
|
+
export function readSkillFile(dir, skill, file = "SKILL.md") {
|
|
51
|
+
const found = listSkills(dir).find((s) => s.name === skill || s.folder === skill);
|
|
52
|
+
if (!found)
|
|
53
|
+
throw new Error(`there is no skill named "${skill}"`);
|
|
54
|
+
const root = realpathSync(join(dir, found.folder));
|
|
55
|
+
if (isAbsolute(file))
|
|
56
|
+
throw new Error("the file must be a path inside the skill's folder");
|
|
57
|
+
const target = resolve(root, file);
|
|
58
|
+
if (!existsSync(target))
|
|
59
|
+
throw new Error(`the skill has no file "${file}"`);
|
|
60
|
+
const real = realpathSync(target);
|
|
61
|
+
const rel = relative(root, real);
|
|
62
|
+
if (rel.startsWith("..") || isAbsolute(rel) || rel.split(sep).includes(".."))
|
|
63
|
+
throw new Error("the file must be a path inside the skill's folder");
|
|
64
|
+
if (!statSync(real).isFile())
|
|
65
|
+
throw new Error(`"${file}" is not a file`);
|
|
66
|
+
if (statSync(real).size > MAX_FILE)
|
|
67
|
+
throw new Error(`"${file}" is too large to read`);
|
|
68
|
+
return readFileSync(real, "utf8");
|
|
69
|
+
}
|
|
70
|
+
export const READ_SKILL_TOOL = "read_skill";
|
|
71
|
+
export const readSkillSpec = {
|
|
72
|
+
name: READ_SKILL_TOOL,
|
|
73
|
+
description: "Reads a skill's instructions (SKILL.md), or another file inside that skill's folder that the instructions mention. Read a skill before following it.",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: "object",
|
|
76
|
+
properties: {
|
|
77
|
+
skill: { type: "string", description: "The skill's name." },
|
|
78
|
+
file: { type: "string", description: "A path inside the skill's folder; SKILL.md when omitted." },
|
|
79
|
+
},
|
|
80
|
+
required: ["skill"],
|
|
81
|
+
additionalProperties: false,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
/** What the model is told about the skills when it cannot load them natively. */
|
|
85
|
+
export function skillsInstructions(skills) {
|
|
86
|
+
if (!skills.length)
|
|
87
|
+
return "";
|
|
88
|
+
const lines = skills.map((s) => `- ${s.name}${s.description ? `: ${s.description}` : ""}`);
|
|
89
|
+
return `# Skills\n\nThese skills are available. When a request matches one, read it first with the \`${READ_SKILL_TOOL}\` tool and follow its instructions; read other files of a skill only when its instructions point to them.\n\n${lines.join("\n")}\n`;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProviderAdapter } from "../provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* An adapter for fixtures/fake-ai.mjs. It is written the way a real adapter
|
|
4
|
+
* is: detection, sign-in and status through short commands, a long-running
|
|
5
|
+
* process for the session, runtime validation of everything it reads.
|
|
6
|
+
* Applications can use it to test their integration without any account.
|
|
7
|
+
*/
|
|
8
|
+
export declare const FAKE_CLI_PATH: string;
|
|
9
|
+
export interface FakeProviderOptions {
|
|
10
|
+
id?: string;
|
|
11
|
+
/** Defaults to running fixtures/fake-ai.mjs with the current Node. */
|
|
12
|
+
command?: {
|
|
13
|
+
file: string;
|
|
14
|
+
args: string[];
|
|
15
|
+
};
|
|
16
|
+
minVersion?: string;
|
|
17
|
+
multiAccount?: boolean;
|
|
18
|
+
/** Extra variables for the fake CLI (FAKE_AI_VERSION, FAKE_AI_LOGIN, ...). */
|
|
19
|
+
env?: Record<string, string>;
|
|
20
|
+
startupTimeoutMs?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function createFakeProvider(options?: FakeProviderOptions): ProviderAdapter;
|