atom-lite 0.1.0 → 0.4.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.
Files changed (134) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +58 -10
  3. package/dist/agent/loop.d.ts +2 -0
  4. package/dist/agent/loop.js +5 -0
  5. package/dist/agent/loop.js.map +1 -1
  6. package/dist/cli/activity.d.ts +45 -0
  7. package/dist/cli/activity.js +141 -0
  8. package/dist/cli/activity.js.map +1 -0
  9. package/dist/cli/app.js +893 -377
  10. package/dist/cli/app.js.map +1 -1
  11. package/dist/cli/approval-prompt.d.ts +24 -0
  12. package/dist/cli/approval-prompt.js +82 -0
  13. package/dist/cli/approval-prompt.js.map +1 -0
  14. package/dist/cli/banner.d.ts +5 -1
  15. package/dist/cli/banner.js +10 -4
  16. package/dist/cli/banner.js.map +1 -1
  17. package/dist/cli/commands.d.ts +89 -14
  18. package/dist/cli/commands.js +315 -52
  19. package/dist/cli/commands.js.map +1 -1
  20. package/dist/cli/diff.d.ts +1 -0
  21. package/dist/cli/diff.js +28 -0
  22. package/dist/cli/diff.js.map +1 -0
  23. package/dist/cli/input.d.ts +2 -0
  24. package/dist/cli/input.js +10 -0
  25. package/dist/cli/input.js.map +1 -0
  26. package/dist/cli/main.js +2 -2
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/cli/mouse.d.ts +54 -0
  29. package/dist/cli/mouse.js +83 -0
  30. package/dist/cli/mouse.js.map +1 -0
  31. package/dist/cli/palette.d.ts +41 -0
  32. package/dist/cli/palette.js +212 -0
  33. package/dist/cli/palette.js.map +1 -0
  34. package/dist/cli/panel.d.ts +29 -0
  35. package/dist/cli/panel.js +48 -0
  36. package/dist/cli/panel.js.map +1 -0
  37. package/dist/cli/picker.d.ts +8 -0
  38. package/dist/cli/picker.js +26 -28
  39. package/dist/cli/picker.js.map +1 -1
  40. package/dist/cli/status-line.d.ts +6 -0
  41. package/dist/cli/status-line.js +21 -7
  42. package/dist/cli/status-line.js.map +1 -1
  43. package/dist/cli/stream-text.d.ts +4 -8
  44. package/dist/cli/stream-text.js +25 -12
  45. package/dist/cli/stream-text.js.map +1 -1
  46. package/dist/cli/theme.d.ts +48 -0
  47. package/dist/cli/theme.js +158 -0
  48. package/dist/cli/theme.js.map +1 -0
  49. package/dist/cli/tool-box.d.ts +41 -0
  50. package/dist/cli/tool-box.js +177 -0
  51. package/dist/cli/tool-box.js.map +1 -0
  52. package/dist/cli/transcript.d.ts +9 -0
  53. package/dist/cli/transcript.js +25 -1
  54. package/dist/cli/transcript.js.map +1 -1
  55. package/dist/config/defaults.d.ts +10 -0
  56. package/dist/config/defaults.js +10 -0
  57. package/dist/config/defaults.js.map +1 -1
  58. package/dist/config/load.d.ts +2 -0
  59. package/dist/config/load.js +32 -0
  60. package/dist/config/load.js.map +1 -1
  61. package/dist/config/schema.d.ts +49 -0
  62. package/dist/config/schema.js +31 -0
  63. package/dist/config/schema.js.map +1 -1
  64. package/dist/config/write.d.ts +2 -0
  65. package/dist/config/write.js +9 -0
  66. package/dist/config/write.js.map +1 -1
  67. package/dist/context/builder.d.ts +7 -0
  68. package/dist/context/builder.js +11 -0
  69. package/dist/context/builder.js.map +1 -0
  70. package/dist/extensions/api.d.ts +51 -0
  71. package/dist/extensions/api.js +101 -0
  72. package/dist/extensions/api.js.map +1 -0
  73. package/dist/extensions/discovery.d.ts +26 -0
  74. package/dist/extensions/discovery.js +243 -0
  75. package/dist/extensions/discovery.js.map +1 -0
  76. package/dist/extensions/loader.d.ts +27 -0
  77. package/dist/extensions/loader.js +113 -0
  78. package/dist/extensions/loader.js.map +1 -0
  79. package/dist/extensions/trust.d.ts +4 -0
  80. package/dist/extensions/trust.js +40 -0
  81. package/dist/extensions/trust.js.map +1 -0
  82. package/dist/extensions/types.d.ts +52 -0
  83. package/dist/extensions/types.js +2 -0
  84. package/dist/extensions/types.js.map +1 -0
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.js +1 -0
  87. package/dist/index.js.map +1 -1
  88. package/dist/mcp/client.d.ts +73 -0
  89. package/dist/mcp/client.js +363 -0
  90. package/dist/mcp/client.js.map +1 -0
  91. package/dist/mcp/format.d.ts +3 -0
  92. package/dist/mcp/format.js +37 -0
  93. package/dist/mcp/format.js.map +1 -0
  94. package/dist/mcp/index.d.ts +6 -0
  95. package/dist/mcp/index.js +7 -0
  96. package/dist/mcp/index.js.map +1 -0
  97. package/dist/mcp/manager.d.ts +53 -0
  98. package/dist/mcp/manager.js +349 -0
  99. package/dist/mcp/manager.js.map +1 -0
  100. package/dist/mcp/stdio-transport.d.ts +26 -0
  101. package/dist/mcp/stdio-transport.js +191 -0
  102. package/dist/mcp/stdio-transport.js.map +1 -0
  103. package/dist/mcp/tools.d.ts +22 -0
  104. package/dist/mcp/tools.js +162 -0
  105. package/dist/mcp/tools.js.map +1 -0
  106. package/dist/mcp/types.d.ts +92 -0
  107. package/dist/mcp/types.js +2 -0
  108. package/dist/mcp/types.js.map +1 -0
  109. package/dist/providers/factory.js +1 -0
  110. package/dist/providers/factory.js.map +1 -1
  111. package/dist/runtime/executor.d.ts +2 -0
  112. package/dist/runtime/executor.js +4 -0
  113. package/dist/runtime/executor.js.map +1 -0
  114. package/dist/runtime/scheduler.js +7 -0
  115. package/dist/runtime/scheduler.js.map +1 -1
  116. package/dist/sessions/events.d.ts +9 -0
  117. package/dist/sessions/events.js +11 -6
  118. package/dist/sessions/events.js.map +1 -1
  119. package/dist/sessions/history.d.ts +18 -0
  120. package/dist/sessions/history.js +76 -0
  121. package/dist/sessions/history.js.map +1 -0
  122. package/dist/sessions/index.d.ts +2 -0
  123. package/dist/sessions/index.js +2 -0
  124. package/dist/sessions/index.js.map +1 -1
  125. package/dist/sessions/search.d.ts +16 -0
  126. package/dist/sessions/search.js +136 -0
  127. package/dist/sessions/search.js.map +1 -0
  128. package/dist/sessions/store.js +5 -1
  129. package/dist/sessions/store.js.map +1 -1
  130. package/dist/tools/edit.js +2 -1
  131. package/dist/tools/edit.js.map +1 -1
  132. package/dist/types.d.ts +2 -1
  133. package/dist/types.js.map +1 -1
  134. package/package.json +1 -1
@@ -0,0 +1,243 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync, } from "node:fs";
2
+ import { basename, join, resolve } from "node:path";
3
+ const EXTENSION_EXTENSIONS = new Set([".js", ".mjs"]);
4
+ function readJson(path) {
5
+ try {
6
+ return JSON.parse(readFileSync(path, "utf8"));
7
+ }
8
+ catch {
9
+ return undefined;
10
+ }
11
+ }
12
+ function isExtensionFile(path) {
13
+ const lower = path.toLowerCase();
14
+ return lower.endsWith(".js") || lower.endsWith(".mjs");
15
+ }
16
+ function validateManifest(raw, packagePath) {
17
+ const errors = [];
18
+ if (!raw || typeof raw !== "object") {
19
+ return { errors: ["manifest must be an object"] };
20
+ }
21
+ const record = raw;
22
+ const atom = record.atom;
23
+ if (!atom || typeof atom !== "object") {
24
+ return { errors: ["missing or invalid \"atom\" field"] };
25
+ }
26
+ const atomRecord = atom;
27
+ const extensionsRaw = atomRecord.extensions;
28
+ if (!Array.isArray(extensionsRaw) || extensionsRaw.length === 0) {
29
+ errors.push("\"atom.extensions\" must be a non-empty array of strings");
30
+ }
31
+ const extensions = [];
32
+ if (Array.isArray(extensionsRaw)) {
33
+ for (const entry of extensionsRaw) {
34
+ if (typeof entry !== "string" || entry.trim() === "") {
35
+ errors.push("\"atom.extensions\" entries must be non-empty strings");
36
+ }
37
+ else {
38
+ extensions.push(entry);
39
+ }
40
+ }
41
+ }
42
+ const capabilities = [];
43
+ if (atomRecord.capabilities !== undefined) {
44
+ if (!Array.isArray(atomRecord.capabilities)) {
45
+ errors.push("\"atom.capabilities\" must be an array of strings");
46
+ }
47
+ else {
48
+ for (const capability of atomRecord.capabilities) {
49
+ if (typeof capability !== "string") {
50
+ errors.push("\"atom.capabilities\" entries must be strings");
51
+ }
52
+ else {
53
+ capabilities.push(capability);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ let engines;
59
+ if (atomRecord.engines !== undefined) {
60
+ if (!atomRecord.engines || typeof atomRecord.engines !== "object") {
61
+ errors.push("\"atom.engines\" must be an object");
62
+ }
63
+ else {
64
+ const engineRecord = atomRecord.engines;
65
+ if (engineRecord["atom-lite"] !== undefined &&
66
+ typeof engineRecord["atom-lite"] !== "string") {
67
+ errors.push("\"atom.engines.atom-lite\" must be a string");
68
+ }
69
+ else {
70
+ engines = { "atom-lite": engineRecord["atom-lite"] };
71
+ }
72
+ }
73
+ }
74
+ if (errors.length > 0)
75
+ return { errors };
76
+ const manifest = {
77
+ name: typeof record.name === "string" ? record.name : undefined,
78
+ version: typeof record.version === "string" ? record.version : undefined,
79
+ extensions,
80
+ capabilities,
81
+ engines,
82
+ };
83
+ return { manifest, errors: [] };
84
+ }
85
+ function candidate(source, rootPath, entryPath, manifest, errors = []) {
86
+ return {
87
+ id: basename(rootPath).replace(/\.(js|mjs)$/i, ""),
88
+ source,
89
+ rootPath,
90
+ entryPath: resolve(entryPath),
91
+ manifest,
92
+ errors,
93
+ };
94
+ }
95
+ function discoverDirectory(source, dir) {
96
+ const out = [];
97
+ if (!existsSync(dir))
98
+ return out;
99
+ let stat;
100
+ try {
101
+ stat = statSync(dir);
102
+ }
103
+ catch {
104
+ return out;
105
+ }
106
+ if (!stat.isDirectory())
107
+ return out;
108
+ let entries = [];
109
+ try {
110
+ entries = readdirSync(dir);
111
+ }
112
+ catch {
113
+ return out;
114
+ }
115
+ entries.sort();
116
+ for (const entry of entries) {
117
+ const fullPath = join(dir, entry);
118
+ let entryStat;
119
+ try {
120
+ entryStat = statSync(fullPath);
121
+ }
122
+ catch {
123
+ continue;
124
+ }
125
+ if (entryStat.isFile() && isExtensionFile(fullPath)) {
126
+ out.push(candidate(source, fullPath, fullPath));
127
+ continue;
128
+ }
129
+ if (!entryStat.isDirectory())
130
+ continue;
131
+ const packageJsonPath = join(fullPath, "package.json");
132
+ if (existsSync(packageJsonPath)) {
133
+ const rawPackage = readJson(packageJsonPath);
134
+ const { manifest, errors } = validateManifest(rawPackage, packageJsonPath);
135
+ if (errors.length > 0) {
136
+ out.push(candidate(source, fullPath, fullPath, undefined, errors));
137
+ continue;
138
+ }
139
+ if (manifest) {
140
+ for (const relativeEntry of manifest.extensions) {
141
+ const resolvedEntry = resolve(fullPath, relativeEntry);
142
+ if (!existsSync(resolvedEntry)) {
143
+ out.push(candidate(source, fullPath, resolvedEntry, manifest, [
144
+ `extension entry does not exist: ${relativeEntry}`,
145
+ ]));
146
+ }
147
+ else {
148
+ out.push(candidate(source, fullPath, resolvedEntry, manifest));
149
+ }
150
+ }
151
+ continue;
152
+ }
153
+ }
154
+ const indexJs = join(fullPath, "index.js");
155
+ const indexMjs = join(fullPath, "index.mjs");
156
+ if (existsSync(indexJs)) {
157
+ out.push(candidate(source, fullPath, indexJs));
158
+ }
159
+ else if (existsSync(indexMjs)) {
160
+ out.push(candidate(source, fullPath, indexMjs));
161
+ }
162
+ }
163
+ return out;
164
+ }
165
+ function discoverPath(source, inputPath) {
166
+ if (!existsSync(inputPath))
167
+ return [];
168
+ let stat;
169
+ try {
170
+ stat = statSync(inputPath);
171
+ }
172
+ catch {
173
+ return [];
174
+ }
175
+ if (stat.isFile()) {
176
+ if (!isExtensionFile(inputPath))
177
+ return [];
178
+ return [candidate(source, inputPath, inputPath)];
179
+ }
180
+ if (stat.isDirectory()) {
181
+ // A directory with a package manifest is treated as one package.
182
+ const packageJsonPath = join(inputPath, "package.json");
183
+ if (existsSync(packageJsonPath)) {
184
+ const rawPackage = readJson(packageJsonPath);
185
+ const { manifest, errors } = validateManifest(rawPackage, packageJsonPath);
186
+ if (errors.length > 0) {
187
+ return [candidate(source, inputPath, inputPath, undefined, errors)];
188
+ }
189
+ if (manifest) {
190
+ return manifest.extensions.map((relativeEntry) => {
191
+ const resolvedEntry = resolve(inputPath, relativeEntry);
192
+ const errors = existsSync(resolvedEntry)
193
+ ? []
194
+ : [`extension entry does not exist: ${relativeEntry}`];
195
+ return candidate(source, inputPath, resolvedEntry, manifest, errors);
196
+ });
197
+ }
198
+ }
199
+ const indexJs = join(inputPath, "index.js");
200
+ const indexMjs = join(inputPath, "index.mjs");
201
+ if (existsSync(indexJs)) {
202
+ return [candidate(source, inputPath, indexJs)];
203
+ }
204
+ if (existsSync(indexMjs)) {
205
+ return [candidate(source, inputPath, indexMjs)];
206
+ }
207
+ return discoverDirectory(source, inputPath);
208
+ }
209
+ return [];
210
+ }
211
+ export function discoverExtensions(options = {}) {
212
+ const out = [];
213
+ for (const cliPath of options.cliPaths ?? []) {
214
+ out.push(...discoverPath("cli", cliPath));
215
+ }
216
+ if (options.userDir) {
217
+ out.push(...discoverDirectory("user", options.userDir));
218
+ }
219
+ if (options.projectDir) {
220
+ out.push(...discoverDirectory("project", options.projectDir));
221
+ }
222
+ for (const root of options.packageRoots ?? []) {
223
+ out.push(...discoverDirectory("package", root));
224
+ }
225
+ return out;
226
+ }
227
+ export function formatExtensionDiscovery(extensions) {
228
+ if (extensions.length === 0)
229
+ return "No extensions found.";
230
+ return extensions
231
+ .map((extension) => {
232
+ const status = extension.errors.length > 0
233
+ ? `invalid: ${extension.errors.join("; ")}`
234
+ : "ok";
235
+ const manifestName = extension.manifest?.name;
236
+ const label = manifestName
237
+ ? `${manifestName} (${extension.id})`
238
+ : extension.id;
239
+ return `${extension.source}\t${label}\t${extension.entryPath}\t${status}`;
240
+ })
241
+ .join("\n");
242
+ }
243
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/extensions/discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type DiscoveredExtension } from "./discovery.js";
2
+ import { createExtensionRegistries } from "./api.js";
3
+ export interface ExtensionLoaderOptions {
4
+ cliPaths?: string[];
5
+ userDir?: string;
6
+ projectDir?: string;
7
+ packageRoots?: string[];
8
+ trustedProjects?: string[];
9
+ }
10
+ export interface LoadedExtension {
11
+ id: string;
12
+ source: string;
13
+ entryPath: string;
14
+ status: "loaded" | "error" | "skipped";
15
+ error?: string;
16
+ registries: ReturnType<typeof createExtensionRegistries>;
17
+ }
18
+ export declare class ExtensionLoader {
19
+ private options;
20
+ private extensions;
21
+ constructor(options?: ExtensionLoaderOptions);
22
+ private trustedProjectSet;
23
+ discover(): DiscoveredExtension[];
24
+ loadAll(): Promise<LoadedExtension[]>;
25
+ list(): LoadedExtension[];
26
+ unloadAll(): Promise<void>;
27
+ }
@@ -0,0 +1,113 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { join } from "node:path";
3
+ import { discoverExtensions } from "./discovery.js";
4
+ import { normalizeProjectPath } from "./trust.js";
5
+ import { loadConfig } from "../config/load.js";
6
+ import { createExtensionAPI, createExtensionRegistries } from "./api.js";
7
+ export class ExtensionLoader {
8
+ options;
9
+ extensions = [];
10
+ constructor(options = {}) {
11
+ this.options = options;
12
+ }
13
+ trustedProjectSet() {
14
+ const projects = this.options.trustedProjects ??
15
+ loadConfig().extensions?.trustedProjects ??
16
+ [];
17
+ return new Set(projects.map((project) => normalizeProjectPath(project)));
18
+ }
19
+ discover() {
20
+ const trusted = this.trustedProjectSet();
21
+ const projectExtDir = this.options.projectDir
22
+ ? join(this.options.projectDir, ".atom-lite", "extensions")
23
+ : undefined;
24
+ const discovered = discoverExtensions({
25
+ cliPaths: this.options.cliPaths,
26
+ userDir: this.options.userDir,
27
+ projectDir: projectExtDir,
28
+ packageRoots: this.options.packageRoots,
29
+ });
30
+ return discovered.map((entry) => {
31
+ if (entry.source === "project" &&
32
+ !trusted.has(normalizeProjectPath(this.options.projectDir ?? process.cwd()))) {
33
+ return { ...entry, errors: [...entry.errors, "project is not trusted"] };
34
+ }
35
+ return entry;
36
+ });
37
+ }
38
+ async loadAll() {
39
+ const discovered = this.discover();
40
+ const loaded = [];
41
+ for (const entry of discovered) {
42
+ const registries = createExtensionRegistries();
43
+ const trusted = this.trustedProjectSet();
44
+ const ctx = {
45
+ workspace: this.options.projectDir ?? process.cwd(),
46
+ trusted: entry.source !== "project" ||
47
+ trusted.has(normalizeProjectPath(this.options.projectDir ?? process.cwd())),
48
+ log: (message) => {
49
+ // eslint-disable-next-line no-console
50
+ console.error(`[extension:${entry.id}] ${message}`);
51
+ },
52
+ };
53
+ if (entry.errors.length > 0) {
54
+ loaded.push({
55
+ id: entry.id,
56
+ source: entry.source,
57
+ entryPath: entry.entryPath,
58
+ status: "skipped",
59
+ error: entry.errors.join("; "),
60
+ registries,
61
+ });
62
+ continue;
63
+ }
64
+ if (entry.source === "project" && !this.trustedProjectSet().has(normalizeProjectPath(this.options.projectDir ?? process.cwd()))) {
65
+ loaded.push({
66
+ id: entry.id,
67
+ source: entry.source,
68
+ entryPath: entry.entryPath,
69
+ status: "skipped",
70
+ error: "project is not trusted",
71
+ registries,
72
+ });
73
+ continue;
74
+ }
75
+ try {
76
+ const moduleUrl = pathToFileURL(entry.entryPath).href;
77
+ const imported = (await import(moduleUrl));
78
+ const factory = imported.default ?? imported.activate;
79
+ if (typeof factory !== "function") {
80
+ throw new Error("extension must export a default or activate function");
81
+ }
82
+ const api = createExtensionAPI(entry.id, ctx, registries, "current");
83
+ await factory(api);
84
+ loaded.push({
85
+ id: entry.id,
86
+ source: entry.source,
87
+ entryPath: entry.entryPath,
88
+ status: "loaded",
89
+ registries,
90
+ });
91
+ }
92
+ catch (error) {
93
+ loaded.push({
94
+ id: entry.id,
95
+ source: entry.source,
96
+ entryPath: entry.entryPath,
97
+ status: "error",
98
+ error: error instanceof Error ? error.message : String(error),
99
+ registries,
100
+ });
101
+ }
102
+ }
103
+ this.extensions = loaded;
104
+ return loaded;
105
+ }
106
+ list() {
107
+ return [...this.extensions];
108
+ }
109
+ async unloadAll() {
110
+ this.extensions = [];
111
+ }
112
+ }
113
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/extensions/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function normalizeProjectPath(projectDir: string): string;
2
+ export declare function isProjectTrusted(projectDir: string, configPath?: string): boolean;
3
+ export declare function trustProject(projectDir: string, configPath?: string): void;
4
+ export declare function untrustProject(projectDir: string, configPath?: string): void;
@@ -0,0 +1,40 @@
1
+ import { loadConfig } from "../config/load.js";
2
+ import { updateUserConfig } from "../config/write.js";
3
+ import { resolve } from "node:path";
4
+ export function normalizeProjectPath(projectDir) {
5
+ return resolve(projectDir);
6
+ }
7
+ export function isProjectTrusted(projectDir, configPath) {
8
+ const config = loadConfig(configPath ? { userConfigPath: configPath } : undefined);
9
+ const normalized = normalizeProjectPath(projectDir);
10
+ return (config.extensions?.trustedProjects ?? []).includes(normalized);
11
+ }
12
+ export function trustProject(projectDir, configPath) {
13
+ const normalized = normalizeProjectPath(projectDir);
14
+ updateUserConfig((config) => {
15
+ const extensions = config.extensions && typeof config.extensions === "object"
16
+ ? config.extensions
17
+ : {};
18
+ const trusted = Array.isArray(extensions.trustedProjects)
19
+ ? [...extensions.trustedProjects]
20
+ : [];
21
+ if (!trusted.includes(normalized))
22
+ trusted.push(normalized);
23
+ extensions.trustedProjects = trusted;
24
+ config.extensions = extensions;
25
+ }, configPath);
26
+ }
27
+ export function untrustProject(projectDir, configPath) {
28
+ const normalized = normalizeProjectPath(projectDir);
29
+ updateUserConfig((config) => {
30
+ const extensions = config.extensions && typeof config.extensions === "object"
31
+ ? config.extensions
32
+ : {};
33
+ const trusted = Array.isArray(extensions.trustedProjects)
34
+ ? extensions.trustedProjects.filter((path) => path !== normalized)
35
+ : [];
36
+ extensions.trustedProjects = trusted;
37
+ config.extensions = extensions;
38
+ }, configPath);
39
+ }
40
+ //# sourceMappingURL=trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/extensions/trust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,UAAkB,EAClB,UAAmB;IAEnB,MAAM,MAAM,GAAG,UAAU,CACvB,UAAU,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CACxD,CAAC;IACF,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,UAAmB;IAClE,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpD,gBAAgB,CACd,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACxD,CAAC,CAAE,MAAM,CAAC,UAAsC;YAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;YACvD,CAAC,CAAC,CAAC,GAAI,UAAU,CAAC,eAA4B,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC;QACP,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,UAAU,CAAC,eAAe,GAAG,OAAO,CAAC;QACrC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC,EACD,UAAU,CACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,UAAmB;IACpE,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpD,gBAAgB,CACd,CAAC,MAAM,EAAE,EAAE;QACT,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YACxD,CAAC,CAAE,MAAM,CAAC,UAAsC;YAChD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC;YACvD,CAAC,CAAE,UAAU,CAAC,eAA4B,CAAC,MAAM,CAC7C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,CAC9B;YACH,CAAC,CAAC,EAAE,CAAC;QACP,UAAU,CAAC,eAAe,GAAG,OAAO,CAAC;QACrC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC,EACD,UAAU,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,52 @@
1
+ export type AtomEvent = "extension_load" | "extension_activate" | "extension_unload" | "extension_error" | "session_start" | "session_end" | "turn_start" | "turn_end" | "tool_call" | "tool_result" | "message" | "context_build" | "config_change";
2
+ export interface ExtensionTool {
3
+ name: string;
4
+ label: string;
5
+ description: string;
6
+ parameters?: Record<string, unknown>;
7
+ exposure?: "direct" | "model-only" | "hidden";
8
+ execute: (args: Record<string, unknown>, ctx: ExtensionContext) => Promise<unknown>;
9
+ }
10
+ export interface ExtensionCommand {
11
+ name: string;
12
+ description: string;
13
+ argumentHint?: string;
14
+ category?: string;
15
+ run: (args: string, ctx: ExtensionContext) => void | Promise<void>;
16
+ }
17
+ export interface ExtensionWidget {
18
+ id: string;
19
+ location: "aboveInput" | "belowInput" | "footer";
20
+ render: (width: number) => string[];
21
+ }
22
+ export interface ExtensionContext {
23
+ workspace: string;
24
+ trusted: boolean;
25
+ log: (message: string) => void;
26
+ }
27
+ export interface ExtensionProvider {
28
+ name: string;
29
+ config: Record<string, unknown>;
30
+ }
31
+ export interface ExtensionModel {
32
+ provider: string;
33
+ id: string;
34
+ metadata?: Record<string, unknown>;
35
+ }
36
+ export interface ExecResult {
37
+ stdout: string;
38
+ stderr: string;
39
+ exitCode: number;
40
+ }
41
+ export interface ExecOptions {
42
+ cwd?: string;
43
+ timeoutMs?: number;
44
+ }
45
+ export type ExtensionEventHandler = (event: unknown, ctx: ExtensionContext) => unknown | Promise<unknown>;
46
+ export interface ExtensionStatus {
47
+ id: string;
48
+ source: string;
49
+ entryPath: string;
50
+ status: "loaded" | "error" | "skipped";
51
+ error?: string;
52
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/extensions/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -13,4 +13,5 @@ export * from "./sessions/recovery.js";
13
13
  export { OllamaAdapter, OllamaProvider } from "./providers/ollama.js";
14
14
  export { GeminiAdapter } from "./providers/gemini.js";
15
15
  export { InMemoryToolRegistry } from "./tools/registry.js";
16
+ export * from "./mcp/index.js";
16
17
  export * from "./types.js";
package/dist/index.js CHANGED
@@ -12,5 +12,6 @@ export * from "./sessions/recovery.js";
12
12
  export { OllamaAdapter, OllamaProvider } from "./providers/ollama.js";
13
13
  export { GeminiAdapter } from "./providers/gemini.js";
14
14
  export { InMemoryToolRegistry } from "./tools/registry.js";
15
+ export * from "./mcp/index.js";
15
16
  export * from "./types.js";
16
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,73 @@
1
+ import type { McpRemoteTool, McpTransport } from "./types.js";
2
+ export declare const SUPPORTED_PROTOCOL_VERSIONS: readonly ["2024-11-05", "2025-03-26", "2025-06-18"];
3
+ export declare const PREFERRED_PROTOCOL_VERSION = "2025-06-18";
4
+ export declare class McpError extends Error {
5
+ readonly code?: number;
6
+ readonly data?: unknown;
7
+ constructor(message: string, code?: number, data?: unknown);
8
+ }
9
+ export declare class McpNotConnectedError extends McpError {
10
+ constructor(message?: string);
11
+ }
12
+ export interface McpClientOptions {
13
+ clientName?: string;
14
+ clientVersion?: string;
15
+ /** Called when the transport closes unexpectedly (not via close()). */
16
+ onClose?: (info: {
17
+ code?: number | null;
18
+ signal?: string | null;
19
+ }) => void;
20
+ }
21
+ export interface McpRequestOptions {
22
+ timeoutMs?: number;
23
+ signal?: AbortSignal;
24
+ }
25
+ export interface McpConnectOptions extends McpRequestOptions {
26
+ /** Timeout for spawning the transport and completing the handshake. */
27
+ startupTimeoutMs?: number;
28
+ }
29
+ export interface McpClientConnectResult {
30
+ protocolVersion: string;
31
+ serverInfo?: unknown;
32
+ capabilities?: unknown;
33
+ }
34
+ /**
35
+ * Small JSON-RPC 2.0 client for MCP. The transport owns framing and process
36
+ * lifecycle; this class owns request ids, timeouts, cancellation, and
37
+ * notifications.
38
+ */
39
+ export declare class McpClient {
40
+ private readonly transport;
41
+ private readonly clientName;
42
+ private readonly clientVersion;
43
+ private readonly onClose?;
44
+ private nextId;
45
+ private pending;
46
+ private notificationHandlers;
47
+ private closed;
48
+ private started;
49
+ private startPromise?;
50
+ private protocolVersion?;
51
+ private serverInfo?;
52
+ private capabilities?;
53
+ private lastTransportError?;
54
+ constructor(transport: McpTransport, options?: McpClientOptions);
55
+ get protocolVersionValue(): string | undefined;
56
+ get serverInfoValue(): unknown;
57
+ get capabilitiesValue(): unknown;
58
+ get lastError(): Error | undefined;
59
+ isClosed(): boolean;
60
+ /** Spawn the transport and perform the MCP initialize handshake. */
61
+ connect(options?: McpConnectOptions): Promise<McpClientConnectResult>;
62
+ /** Discover every page of tools/list. */
63
+ listTools(options?: McpRequestOptions): Promise<McpRemoteTool[]>;
64
+ callTool(name: string, args: Record<string, unknown>, options?: McpRequestOptions): Promise<unknown>;
65
+ ping(options?: McpRequestOptions): Promise<unknown>;
66
+ onNotification(method: string, handler: (params: unknown) => void): () => void;
67
+ request(method: string, params: unknown, options?: McpRequestOptions): Promise<unknown>;
68
+ close(): Promise<void>;
69
+ private sendNotification;
70
+ private handleMessage;
71
+ private handleTransportError;
72
+ private handleClose;
73
+ }