@aexol/spectral 0.9.155 → 0.9.157
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/cli.js +5 -13
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +8 -20
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +6 -15
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/mcp/direct-tools.js +1 -1
- package/dist/memory/tool-output-compressor.d.ts +1 -1
- package/dist/memory/tool-output-compressor.d.ts.map +1 -1
- package/dist/memory/tool-output-compressor.js +1 -32
- package/dist/relay/dispatcher.d.ts.map +1 -1
- package/dist/relay/dispatcher.js +7 -1
- package/dist/sdk/agent-core/types.d.ts +1 -1
- package/dist/sdk/ai/env-api-keys.d.ts.map +1 -1
- package/dist/sdk/ai/env-api-keys.js +0 -3
- package/dist/sdk/ai/models.generated.d.ts +0 -515
- package/dist/sdk/ai/models.generated.d.ts.map +1 -1
- package/dist/sdk/ai/models.generated.js +0 -361
- package/dist/sdk/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/sdk/ai/providers/anthropic.js +2 -26
- package/dist/sdk/ai/providers/openai-completions.d.ts.map +1 -1
- package/dist/sdk/ai/providers/openai-completions.js +0 -9
- package/dist/sdk/ai/types.d.ts +1 -1
- package/dist/sdk/ai/types.d.ts.map +1 -1
- package/dist/sdk/ai/utils/oauth/index.d.ts +0 -2
- package/dist/sdk/ai/utils/oauth/index.d.ts.map +1 -1
- package/dist/sdk/ai/utils/oauth/index.js +0 -5
- package/dist/sdk/ai/utils/overflow.d.ts.map +1 -1
- package/dist/sdk/ai/utils/overflow.js +1 -2
- package/dist/sdk/coding-agent/config.d.ts.map +1 -1
- package/dist/sdk/coding-agent/config.js +2 -1
- package/dist/sdk/coding-agent/core/extensions/index.d.ts +2 -2
- package/dist/sdk/coding-agent/core/extensions/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/index.js +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.d.ts +3 -13
- package/dist/sdk/coding-agent/core/extensions/types.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/extensions/types.js +0 -3
- package/dist/sdk/coding-agent/core/model-resolver.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/model-resolver.js +0 -1
- package/dist/sdk/coding-agent/core/sdk.d.ts +2 -2
- package/dist/sdk/coding-agent/core/sdk.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/sdk.js +2 -2
- package/dist/sdk/coding-agent/core/system-prompt.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/system-prompt.js +2 -4
- package/dist/sdk/coding-agent/core/tools/bash-blocklist.js +1 -1
- package/dist/sdk/coding-agent/core/tools/index.d.ts +1 -4
- package/dist/sdk/coding-agent/core/tools/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/tools/index.js +0 -11
- package/dist/sdk/coding-agent/index.d.ts +4 -4
- package/dist/sdk/coding-agent/index.d.ts.map +1 -1
- package/dist/sdk/coding-agent/index.js +3 -3
- package/dist/server/storage.d.ts +18 -0
- package/dist/server/storage.d.ts.map +1 -1
- package/dist/server/storage.js +47 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +88 -0
- package/package.json +1 -1
- package/dist/sdk/ai/providers/github-copilot-headers.d.ts +0 -8
- package/dist/sdk/ai/providers/github-copilot-headers.d.ts.map +0 -1
- package/dist/sdk/ai/providers/github-copilot-headers.js +0 -28
- package/dist/sdk/ai/utils/oauth/github-copilot.d.ts +0 -30
- package/dist/sdk/ai/utils/oauth/github-copilot.d.ts.map +0 -1
- package/dist/sdk/ai/utils/oauth/github-copilot.js +0 -270
- package/dist/sdk/coding-agent/core/tools/find.d.ts +0 -35
- package/dist/sdk/coding-agent/core/tools/find.d.ts.map +0 -1
- package/dist/sdk/coding-agent/core/tools/find.js +0 -343
|
@@ -7,7 +7,7 @@ export { AuthStorage, FileAuthStorageBackend, InMemoryAuthStorageBackend, } from
|
|
|
7
7
|
// Compaction
|
|
8
8
|
export { calculateContextTokens, collectEntriesForBranchSummary, compact, DEFAULT_COMPACTION_SETTINGS, estimateTokens, findCutPoint, findTurnStartIndex, generateBranchSummary, generateSummary, getLastAssistantUsage, prepareBranchEntries, serializeConversation, shouldCompact, } from "./core/compaction/index.js";
|
|
9
9
|
export { createEventBus } from "./core/event-bus.js";
|
|
10
|
-
export { createExtensionRuntime, defineTool, discoverAndLoadExtensions, ExtensionRunner, isBashToolResult, isEditToolResult,
|
|
10
|
+
export { createExtensionRuntime, defineTool, discoverAndLoadExtensions, ExtensionRunner, isBashToolResult, isEditToolResult, isGrepToolResult, isLsToolResult, isReadToolResult, isToolCallEventType, isWriteToolResult, wrapRegisteredTool, wrapRegisteredTools, } from "./core/extensions/index.js";
|
|
11
11
|
// Footer data provider — no longer exported (TUI-only, serve/relay uses no-ops)
|
|
12
12
|
// export type { ReadonlyFooterDataProvider } from "./core/footer-data-provider.js";
|
|
13
13
|
export { convertToLlm } from "./core/messages.js";
|
|
@@ -25,14 +25,14 @@ export { AgentSessionRuntime,
|
|
|
25
25
|
// Factory
|
|
26
26
|
createAgentSession, createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, createBashTool,
|
|
27
27
|
// Tool factories (for custom cwd)
|
|
28
|
-
createCodingTools, createEditTool,
|
|
28
|
+
createCodingTools, createEditTool, createGrepTool, createLsTool, createReadOnlyTools, createReadTool, createWriteTool, } from "./core/sdk.js";
|
|
29
29
|
export { buildSessionContext, CURRENT_SESSION_VERSION, getLatestCompactionEntry, migrateSessionEntries, parseSessionEntries, SessionManager, } from "./core/session-manager.js";
|
|
30
30
|
export { SettingsManager, } from "./core/settings-manager.js";
|
|
31
31
|
// Skills
|
|
32
32
|
export { formatSkillsForPrompt, loadSkills, loadSkillsFromDir, } from "./core/skills.js";
|
|
33
33
|
export { createSyntheticSourceInfo } from "./core/source-info.js";
|
|
34
34
|
// Tools
|
|
35
|
-
export { createApplyPatchToolDefinition, createBashToolDefinition, createEditToolDefinition,
|
|
35
|
+
export { createApplyPatchToolDefinition, createBashToolDefinition, createEditToolDefinition, createGrepToolDefinition, createLocalBashOperations, createLsToolDefinition, createReadToolDefinition, createWriteToolDefinition, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, truncateLine, truncateTail, withFileMutationQueue, } from "./core/tools/index.js";
|
|
36
36
|
// Main entry point
|
|
37
37
|
// main.ts removed (interactive-only, not used in SDK mode)
|
|
38
38
|
// Run modes for programmatic SDK usage
|
package/dist/server/storage.d.ts
CHANGED
|
@@ -166,6 +166,24 @@ export declare class SessionStore {
|
|
|
166
166
|
};
|
|
167
167
|
/** Sessions belonging to a single project, newest-first. */
|
|
168
168
|
listSessionsByProject(projectId: string): WireSessionSummary[];
|
|
169
|
+
/**
|
|
170
|
+
* Batched variant of {@link listSessionsByProject} for many projects at once.
|
|
171
|
+
*
|
|
172
|
+
* Issues a SINGLE SQL query (independent of project/session count) with a
|
|
173
|
+
* LEFT JOIN + GROUP BY aggregation for message counts, instead of the
|
|
174
|
+
* O(projects) per-project queries (each with a per-session correlated
|
|
175
|
+
* COUNT(*) subquery) that {@link listSessionsByProject} would require when
|
|
176
|
+
* called in a loop.
|
|
177
|
+
*
|
|
178
|
+
* Per-project ordering is preserved: rows are globally ordered by
|
|
179
|
+
* `updated_at DESC`, then grouped by `project_id` in JS — each project's
|
|
180
|
+
* array is therefore a subsequence of the globally-sorted result, retaining
|
|
181
|
+
* `updated_at DESC` order (matching {@link listSessionsByProject}).
|
|
182
|
+
*
|
|
183
|
+
* Every requested project id is present in the returned Map; projects with
|
|
184
|
+
* no sessions map to an empty array.
|
|
185
|
+
*/
|
|
186
|
+
listSessionsByProjectIds(projectIds: string[]): Map<string, WireSessionSummary[]>;
|
|
169
187
|
createSession(input: CreateSessionInput): WireSessionSummary;
|
|
170
188
|
/** Returns null if not found. */
|
|
171
189
|
getSession(id: string): WireSessionDetail | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/server/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/server/storage.js
CHANGED
|
@@ -607,6 +607,53 @@ export class SessionStore {
|
|
|
607
607
|
messageCount: r.message_count,
|
|
608
608
|
}));
|
|
609
609
|
}
|
|
610
|
+
/**
|
|
611
|
+
* Batched variant of {@link listSessionsByProject} for many projects at once.
|
|
612
|
+
*
|
|
613
|
+
* Issues a SINGLE SQL query (independent of project/session count) with a
|
|
614
|
+
* LEFT JOIN + GROUP BY aggregation for message counts, instead of the
|
|
615
|
+
* O(projects) per-project queries (each with a per-session correlated
|
|
616
|
+
* COUNT(*) subquery) that {@link listSessionsByProject} would require when
|
|
617
|
+
* called in a loop.
|
|
618
|
+
*
|
|
619
|
+
* Per-project ordering is preserved: rows are globally ordered by
|
|
620
|
+
* `updated_at DESC`, then grouped by `project_id` in JS — each project's
|
|
621
|
+
* array is therefore a subsequence of the globally-sorted result, retaining
|
|
622
|
+
* `updated_at DESC` order (matching {@link listSessionsByProject}).
|
|
623
|
+
*
|
|
624
|
+
* Every requested project id is present in the returned Map; projects with
|
|
625
|
+
* no sessions map to an empty array.
|
|
626
|
+
*/
|
|
627
|
+
listSessionsByProjectIds(projectIds) {
|
|
628
|
+
const result = new Map();
|
|
629
|
+
for (const id of projectIds)
|
|
630
|
+
result.set(id, []);
|
|
631
|
+
if (projectIds.length === 0)
|
|
632
|
+
return result;
|
|
633
|
+
const placeholders = projectIds.map(() => "?").join(", ");
|
|
634
|
+
const stmt = this.db.prepare(`SELECT s.id, s.project_id, s.title, s.created_at, s.updated_at,
|
|
635
|
+
COUNT(m.id) AS message_count
|
|
636
|
+
FROM sessions s
|
|
637
|
+
LEFT JOIN messages m ON m.session_id = s.id
|
|
638
|
+
WHERE s.project_id IN (${placeholders})
|
|
639
|
+
GROUP BY s.id, s.project_id, s.title, s.created_at, s.updated_at
|
|
640
|
+
ORDER BY s.updated_at DESC, s.created_at DESC, s.id DESC`);
|
|
641
|
+
const rows = stmt.all(...projectIds);
|
|
642
|
+
for (const r of rows) {
|
|
643
|
+
const list = result.get(r.project_id);
|
|
644
|
+
if (!list)
|
|
645
|
+
continue;
|
|
646
|
+
list.push({
|
|
647
|
+
id: r.id,
|
|
648
|
+
projectId: r.project_id,
|
|
649
|
+
title: r.title,
|
|
650
|
+
createdAt: r.created_at,
|
|
651
|
+
updatedAt: r.updated_at,
|
|
652
|
+
messageCount: r.message_count,
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
return result;
|
|
656
|
+
}
|
|
610
657
|
// ----------------------------------------------------------------------
|
|
611
658
|
// Sessions
|
|
612
659
|
// ----------------------------------------------------------------------
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAmEA,6EAA6E;AAC7E,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED,wBAAgB,UAAU,IAAI,MAAM,CAuBnC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central CLI version resolution.
|
|
3
|
+
*
|
|
4
|
+
* Why this exists:
|
|
5
|
+
* The standalone spectral binary is produced with `bun build --compile`.
|
|
6
|
+
* Inside a compiled Bun binary there is no real `package.json` next to the
|
|
7
|
+
* emitted code, so a `readFileSync(resolve(__dirname, ...))` lookup throws
|
|
8
|
+
* and the code falls back to `process.env.npm_package_version`. That env var
|
|
9
|
+
* is only set when running via `npm run`/`npx` — a compiled binary is never
|
|
10
|
+
* launched that way — so the version silently becomes `"0.0.0"`.
|
|
11
|
+
*
|
|
12
|
+
* That `"0.0.0"` is then reported to the relay as the machine's
|
|
13
|
+
* `runtimeInfo.version` and surfaces in the Studio landing as the bogus
|
|
14
|
+
* "Your CLI (v0.0.0) is outdated" toast.
|
|
15
|
+
*
|
|
16
|
+
* Resolution order:
|
|
17
|
+
* 1. `SPECTRAL_CLI_VERSION` — explicit override (also used by tests).
|
|
18
|
+
* 2. `process.env.npm_package_version` — set by npm/npx, AND inlined at
|
|
19
|
+
* compile time by `bun build --define` in build-standalone.sh, so the
|
|
20
|
+
* standalone binary bakes in the real version.
|
|
21
|
+
* 3. `package.json` read from disk — works for `npm install` / `npm run dev`
|
|
22
|
+
* where the file ships alongside `dist/`.
|
|
23
|
+
* 4. `"0.0.0"` — last-resort fallback.
|
|
24
|
+
*/
|
|
25
|
+
import { readFileSync } from "node:fs";
|
|
26
|
+
import { dirname, resolve } from "node:path";
|
|
27
|
+
import { fileURLToPath } from "node:url";
|
|
28
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
/**
|
|
30
|
+
* Walk up from `__dirname` looking for the nearest `package.json` that looks
|
|
31
|
+
* like the @aexol/spectral package (has a version field). This mirrors the
|
|
32
|
+
* `getPackageDir()` walker in config.ts and survives both `dist/` and `src/`
|
|
33
|
+
* layouts used by npm-installed packages.
|
|
34
|
+
*/
|
|
35
|
+
function findPackageVersion() {
|
|
36
|
+
try {
|
|
37
|
+
let dir = __dirname;
|
|
38
|
+
while (true) {
|
|
39
|
+
const candidate = resolve(dir, "package.json");
|
|
40
|
+
try {
|
|
41
|
+
const pkg = JSON.parse(readFileSync(candidate, "utf8"));
|
|
42
|
+
// Accept the spectral package by name, or any package.json that has a
|
|
43
|
+
// version field (the walker stops at the first match, which for a
|
|
44
|
+
// standard `npm install @aexol/spectral` layout is the right one).
|
|
45
|
+
if (pkg.name === "@aexol/spectral" && pkg.version) {
|
|
46
|
+
return pkg.version;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// not a parseable package.json or missing — keep walking
|
|
51
|
+
}
|
|
52
|
+
const parent = dirname(dir);
|
|
53
|
+
if (parent === dir)
|
|
54
|
+
break; // reached filesystem root
|
|
55
|
+
dir = parent;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// ignore filesystem errors entirely
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
let _cached;
|
|
64
|
+
/** Test-only hook to reset the version cache. Not part of the public API. */
|
|
65
|
+
export function _resetVersionCacheForTests() {
|
|
66
|
+
_cached = undefined;
|
|
67
|
+
}
|
|
68
|
+
export function getVersion() {
|
|
69
|
+
if (_cached !== undefined)
|
|
70
|
+
return _cached;
|
|
71
|
+
const override = process.env.SPECTRAL_CLI_VERSION;
|
|
72
|
+
if (override && override.length > 0) {
|
|
73
|
+
_cached = override;
|
|
74
|
+
return _cached;
|
|
75
|
+
}
|
|
76
|
+
const envVersion = process.env.npm_package_version;
|
|
77
|
+
if (envVersion && envVersion.length > 0 && envVersion !== "0.0.0") {
|
|
78
|
+
_cached = envVersion;
|
|
79
|
+
return _cached;
|
|
80
|
+
}
|
|
81
|
+
const fileVersion = findPackageVersion();
|
|
82
|
+
if (fileVersion) {
|
|
83
|
+
_cached = fileVersion;
|
|
84
|
+
return _cached;
|
|
85
|
+
}
|
|
86
|
+
_cached = "0.0.0";
|
|
87
|
+
return _cached;
|
|
88
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Message } from "../types.js";
|
|
2
|
-
export declare function inferCopilotInitiator(messages: Message[]): "user" | "agent";
|
|
3
|
-
export declare function hasCopilotVisionInput(messages: Message[]): boolean;
|
|
4
|
-
export declare function buildCopilotDynamicHeaders(params: {
|
|
5
|
-
messages: Message[];
|
|
6
|
-
hasImages: boolean;
|
|
7
|
-
}): Record<string, string>;
|
|
8
|
-
//# sourceMappingURL=github-copilot-headers.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-copilot-headers.d.ts","sourceRoot":"","sources":["../../../../src/sdk/ai/providers/github-copilot-headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,OAAO,CAG3E;AAGD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAUlE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IAClD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACnB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWzB"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// Copilot expects X-Initiator to indicate whether the request is user-initiated
|
|
2
|
-
// or agent-initiated (e.g. follow-up after assistant/tool messages).
|
|
3
|
-
export function inferCopilotInitiator(messages) {
|
|
4
|
-
const last = messages[messages.length - 1];
|
|
5
|
-
return last && last.role !== "user" ? "agent" : "user";
|
|
6
|
-
}
|
|
7
|
-
// Copilot requires Copilot-Vision-Request header when sending images
|
|
8
|
-
export function hasCopilotVisionInput(messages) {
|
|
9
|
-
return messages.some((msg) => {
|
|
10
|
-
if (msg.role === "user" && Array.isArray(msg.content)) {
|
|
11
|
-
return msg.content.some((c) => c.type === "image");
|
|
12
|
-
}
|
|
13
|
-
if (msg.role === "toolResult" && Array.isArray(msg.content)) {
|
|
14
|
-
return msg.content.some((c) => c.type === "image");
|
|
15
|
-
}
|
|
16
|
-
return false;
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
export function buildCopilotDynamicHeaders(params) {
|
|
20
|
-
const headers = {
|
|
21
|
-
"X-Initiator": inferCopilotInitiator(params.messages),
|
|
22
|
-
"Openai-Intent": "conversation-edits",
|
|
23
|
-
};
|
|
24
|
-
if (params.hasImages) {
|
|
25
|
-
headers["Copilot-Vision-Request"] = "true";
|
|
26
|
-
}
|
|
27
|
-
return headers;
|
|
28
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub Copilot OAuth flow
|
|
3
|
-
*/
|
|
4
|
-
import type { OAuthCredentials, OAuthDeviceCodeInfo, OAuthProviderInterface } from "./types.js";
|
|
5
|
-
export declare function normalizeDomain(input: string): string | null;
|
|
6
|
-
export declare function getGitHubCopilotBaseUrl(token?: string, enterpriseDomain?: string): string;
|
|
7
|
-
/**
|
|
8
|
-
* Refresh GitHub Copilot token
|
|
9
|
-
*/
|
|
10
|
-
export declare function refreshGitHubCopilotToken(refreshToken: string, enterpriseDomain?: string): Promise<OAuthCredentials>;
|
|
11
|
-
/**
|
|
12
|
-
* Login with GitHub Copilot OAuth (device code flow)
|
|
13
|
-
*
|
|
14
|
-
* @param options.onDeviceCode - Callback with URL and user code
|
|
15
|
-
* @param options.onPrompt - Callback to prompt user for input
|
|
16
|
-
* @param options.onProgress - Optional progress callback
|
|
17
|
-
* @param options.signal - Optional AbortSignal for cancellation
|
|
18
|
-
*/
|
|
19
|
-
export declare function loginGitHubCopilot(options: {
|
|
20
|
-
onDeviceCode: (info: OAuthDeviceCodeInfo) => void;
|
|
21
|
-
onPrompt: (prompt: {
|
|
22
|
-
message: string;
|
|
23
|
-
placeholder?: string;
|
|
24
|
-
allowEmpty?: boolean;
|
|
25
|
-
}) => Promise<string>;
|
|
26
|
-
onProgress?: (message: string) => void;
|
|
27
|
-
signal?: AbortSignal;
|
|
28
|
-
}): Promise<OAuthCredentials>;
|
|
29
|
-
export declare const githubCopilotOAuthProvider: OAuthProviderInterface;
|
|
30
|
-
//# sourceMappingURL=github-copilot.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-copilot.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/ai/utils/oauth/github-copilot.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAuB,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmCrH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS5D;AA4BD,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CASzF;AAmGD;;GAEG;AACH,wBAAsB,yBAAyB,CAC9C,YAAY,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA6B3B;AA8CD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IACjD,YAAY,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvG,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiC5B;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAgCxC,CAAC"}
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* GitHub Copilot OAuth flow
|
|
3
|
-
*/
|
|
4
|
-
import { getModels } from "../../models.js";
|
|
5
|
-
import { pollOAuthDeviceCodeFlow } from "./device-code.js";
|
|
6
|
-
const decode = (s) => atob(s);
|
|
7
|
-
const CLIENT_ID = decode("SXYxLmI1MDdhMDhjODdlY2ZlOTg=");
|
|
8
|
-
const COPILOT_HEADERS = {
|
|
9
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
10
|
-
"Editor-Version": "vscode/1.107.0",
|
|
11
|
-
"Editor-Plugin-Version": "copilot-chat/0.35.0",
|
|
12
|
-
"Copilot-Integration-Id": "vscode-chat",
|
|
13
|
-
};
|
|
14
|
-
export function normalizeDomain(input) {
|
|
15
|
-
const trimmed = input.trim();
|
|
16
|
-
if (!trimmed)
|
|
17
|
-
return null;
|
|
18
|
-
try {
|
|
19
|
-
const url = trimmed.includes("://") ? new URL(trimmed) : new URL(`https://${trimmed}`);
|
|
20
|
-
return url.hostname;
|
|
21
|
-
}
|
|
22
|
-
catch {
|
|
23
|
-
return null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function getUrls(domain) {
|
|
27
|
-
return {
|
|
28
|
-
deviceCodeUrl: `https://${domain}/login/device/code`,
|
|
29
|
-
accessTokenUrl: `https://${domain}/login/oauth/access_token`,
|
|
30
|
-
copilotTokenUrl: `https://api.${domain}/copilot_internal/v2/token`,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Parse the proxy-ep from a Copilot token and convert to API base URL.
|
|
35
|
-
* Token format: tid=...;exp=...;proxy-ep=proxy.individual.githubcopilot.com;...
|
|
36
|
-
* Returns API URL like https://api.individual.githubcopilot.com
|
|
37
|
-
*/
|
|
38
|
-
function getBaseUrlFromToken(token) {
|
|
39
|
-
const match = token.match(/proxy-ep=([^;]+)/);
|
|
40
|
-
if (!match)
|
|
41
|
-
return null;
|
|
42
|
-
const proxyHost = match[1];
|
|
43
|
-
// Convert proxy.xxx to api.xxx
|
|
44
|
-
const apiHost = proxyHost.replace(/^proxy\./, "api.");
|
|
45
|
-
return `https://${apiHost}`;
|
|
46
|
-
}
|
|
47
|
-
export function getGitHubCopilotBaseUrl(token, enterpriseDomain) {
|
|
48
|
-
// If we have a token, extract the base URL from proxy-ep
|
|
49
|
-
if (token) {
|
|
50
|
-
const urlFromToken = getBaseUrlFromToken(token);
|
|
51
|
-
if (urlFromToken)
|
|
52
|
-
return urlFromToken;
|
|
53
|
-
}
|
|
54
|
-
// Fallback for enterprise or if token parsing fails
|
|
55
|
-
if (enterpriseDomain)
|
|
56
|
-
return `https://copilot-api.${enterpriseDomain}`;
|
|
57
|
-
return "https://api.individual.githubcopilot.com";
|
|
58
|
-
}
|
|
59
|
-
async function fetchJson(url, init) {
|
|
60
|
-
const response = await fetch(url, init);
|
|
61
|
-
if (!response.ok) {
|
|
62
|
-
const text = await response.text();
|
|
63
|
-
throw new Error(`${response.status} ${response.statusText}: ${text}`);
|
|
64
|
-
}
|
|
65
|
-
return response.json();
|
|
66
|
-
}
|
|
67
|
-
async function startDeviceFlow(domain) {
|
|
68
|
-
const urls = getUrls(domain);
|
|
69
|
-
const data = await fetchJson(urls.deviceCodeUrl, {
|
|
70
|
-
method: "POST",
|
|
71
|
-
headers: {
|
|
72
|
-
Accept: "application/json",
|
|
73
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
74
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
75
|
-
},
|
|
76
|
-
body: new URLSearchParams({
|
|
77
|
-
client_id: CLIENT_ID,
|
|
78
|
-
scope: "read:user",
|
|
79
|
-
}),
|
|
80
|
-
});
|
|
81
|
-
if (!data || typeof data !== "object") {
|
|
82
|
-
throw new Error("Invalid device code response");
|
|
83
|
-
}
|
|
84
|
-
const deviceCode = data.device_code;
|
|
85
|
-
const userCode = data.user_code;
|
|
86
|
-
const verificationUri = data.verification_uri;
|
|
87
|
-
const interval = data.interval;
|
|
88
|
-
const expiresIn = data.expires_in;
|
|
89
|
-
if (typeof deviceCode !== "string" ||
|
|
90
|
-
typeof userCode !== "string" ||
|
|
91
|
-
typeof verificationUri !== "string" ||
|
|
92
|
-
(interval !== undefined && typeof interval !== "number") ||
|
|
93
|
-
typeof expiresIn !== "number") {
|
|
94
|
-
throw new Error("Invalid device code response fields");
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
device_code: deviceCode,
|
|
98
|
-
user_code: userCode,
|
|
99
|
-
verification_uri: verificationUri,
|
|
100
|
-
interval,
|
|
101
|
-
expires_in: expiresIn,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
async function pollForGitHubAccessToken(domain, device, signal) {
|
|
105
|
-
const urls = getUrls(domain);
|
|
106
|
-
return pollOAuthDeviceCodeFlow({
|
|
107
|
-
intervalSeconds: device.interval,
|
|
108
|
-
expiresInSeconds: device.expires_in,
|
|
109
|
-
signal,
|
|
110
|
-
poll: async () => {
|
|
111
|
-
const raw = await fetchJson(urls.accessTokenUrl, {
|
|
112
|
-
method: "POST",
|
|
113
|
-
headers: {
|
|
114
|
-
Accept: "application/json",
|
|
115
|
-
"Content-Type": "application/x-www-form-urlencoded",
|
|
116
|
-
"User-Agent": "GitHubCopilotChat/0.35.0",
|
|
117
|
-
},
|
|
118
|
-
body: new URLSearchParams({
|
|
119
|
-
client_id: CLIENT_ID,
|
|
120
|
-
device_code: device.device_code,
|
|
121
|
-
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
122
|
-
}),
|
|
123
|
-
});
|
|
124
|
-
if (raw && typeof raw === "object" && typeof raw.access_token === "string") {
|
|
125
|
-
return { status: "complete", accessToken: raw.access_token };
|
|
126
|
-
}
|
|
127
|
-
if (raw && typeof raw === "object" && typeof raw.error === "string") {
|
|
128
|
-
const { error, error_description: description } = raw;
|
|
129
|
-
if (error === "authorization_pending") {
|
|
130
|
-
return { status: "pending" };
|
|
131
|
-
}
|
|
132
|
-
if (error === "slow_down") {
|
|
133
|
-
return { status: "slow_down" };
|
|
134
|
-
}
|
|
135
|
-
const descriptionSuffix = description ? `: ${description}` : "";
|
|
136
|
-
return { status: "failed", message: `Device flow failed: ${error}${descriptionSuffix}` };
|
|
137
|
-
}
|
|
138
|
-
return { status: "failed", message: "Invalid device token response" };
|
|
139
|
-
},
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Refresh GitHub Copilot token
|
|
144
|
-
*/
|
|
145
|
-
export async function refreshGitHubCopilotToken(refreshToken, enterpriseDomain) {
|
|
146
|
-
const domain = enterpriseDomain || "github.com";
|
|
147
|
-
const urls = getUrls(domain);
|
|
148
|
-
const raw = await fetchJson(urls.copilotTokenUrl, {
|
|
149
|
-
headers: {
|
|
150
|
-
Accept: "application/json",
|
|
151
|
-
Authorization: `Bearer ${refreshToken}`,
|
|
152
|
-
...COPILOT_HEADERS,
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
if (!raw || typeof raw !== "object") {
|
|
156
|
-
throw new Error("Invalid Copilot token response");
|
|
157
|
-
}
|
|
158
|
-
const token = raw.token;
|
|
159
|
-
const expiresAt = raw.expires_at;
|
|
160
|
-
if (typeof token !== "string" || typeof expiresAt !== "number") {
|
|
161
|
-
throw new Error("Invalid Copilot token response fields");
|
|
162
|
-
}
|
|
163
|
-
return {
|
|
164
|
-
refresh: refreshToken,
|
|
165
|
-
access: token,
|
|
166
|
-
expires: expiresAt * 1000 - 5 * 60 * 1000,
|
|
167
|
-
enterpriseUrl: enterpriseDomain,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Enable a model for the user's GitHub Copilot account.
|
|
172
|
-
* This is required for some models (like Claude, Grok) before they can be used.
|
|
173
|
-
*/
|
|
174
|
-
async function enableGitHubCopilotModel(token, modelId, enterpriseDomain) {
|
|
175
|
-
const baseUrl = getGitHubCopilotBaseUrl(token, enterpriseDomain);
|
|
176
|
-
const url = `${baseUrl}/models/${modelId}/policy`;
|
|
177
|
-
try {
|
|
178
|
-
const response = await fetch(url, {
|
|
179
|
-
method: "POST",
|
|
180
|
-
headers: {
|
|
181
|
-
"Content-Type": "application/json",
|
|
182
|
-
Authorization: `Bearer ${token}`,
|
|
183
|
-
...COPILOT_HEADERS,
|
|
184
|
-
"openai-intent": "chat-policy",
|
|
185
|
-
"x-interaction-type": "chat-policy",
|
|
186
|
-
},
|
|
187
|
-
body: JSON.stringify({ state: "enabled" }),
|
|
188
|
-
});
|
|
189
|
-
return response.ok;
|
|
190
|
-
}
|
|
191
|
-
catch {
|
|
192
|
-
return false;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Enable all known GitHub Copilot models that may require policy acceptance.
|
|
197
|
-
* Called after successful login to ensure all models are available.
|
|
198
|
-
*/
|
|
199
|
-
async function enableAllGitHubCopilotModels(token, enterpriseDomain, onProgress) {
|
|
200
|
-
const models = getModels("github-copilot");
|
|
201
|
-
await Promise.all(models.map(async (model) => {
|
|
202
|
-
const success = await enableGitHubCopilotModel(token, model.id, enterpriseDomain);
|
|
203
|
-
onProgress?.(model.id, success);
|
|
204
|
-
}));
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Login with GitHub Copilot OAuth (device code flow)
|
|
208
|
-
*
|
|
209
|
-
* @param options.onDeviceCode - Callback with URL and user code
|
|
210
|
-
* @param options.onPrompt - Callback to prompt user for input
|
|
211
|
-
* @param options.onProgress - Optional progress callback
|
|
212
|
-
* @param options.signal - Optional AbortSignal for cancellation
|
|
213
|
-
*/
|
|
214
|
-
export async function loginGitHubCopilot(options) {
|
|
215
|
-
const input = await options.onPrompt({
|
|
216
|
-
message: "GitHub Enterprise URL/domain (blank for github.com)",
|
|
217
|
-
placeholder: "company.ghe.com",
|
|
218
|
-
allowEmpty: true,
|
|
219
|
-
});
|
|
220
|
-
if (options.signal?.aborted) {
|
|
221
|
-
throw new Error("Login cancelled");
|
|
222
|
-
}
|
|
223
|
-
const trimmed = input.trim();
|
|
224
|
-
const enterpriseDomain = normalizeDomain(input);
|
|
225
|
-
if (trimmed && !enterpriseDomain) {
|
|
226
|
-
throw new Error("Invalid GitHub Enterprise URL/domain");
|
|
227
|
-
}
|
|
228
|
-
const domain = enterpriseDomain || "github.com";
|
|
229
|
-
const device = await startDeviceFlow(domain);
|
|
230
|
-
options.onDeviceCode({
|
|
231
|
-
userCode: device.user_code,
|
|
232
|
-
verificationUri: device.verification_uri,
|
|
233
|
-
intervalSeconds: device.interval,
|
|
234
|
-
expiresInSeconds: device.expires_in,
|
|
235
|
-
});
|
|
236
|
-
const githubAccessToken = await pollForGitHubAccessToken(domain, device, options.signal);
|
|
237
|
-
const credentials = await refreshGitHubCopilotToken(githubAccessToken, enterpriseDomain ?? undefined);
|
|
238
|
-
// Enable all models after successful login
|
|
239
|
-
options.onProgress?.("Enabling models...");
|
|
240
|
-
await enableAllGitHubCopilotModels(credentials.access, enterpriseDomain ?? undefined);
|
|
241
|
-
return credentials;
|
|
242
|
-
}
|
|
243
|
-
export const githubCopilotOAuthProvider = {
|
|
244
|
-
id: "github-copilot",
|
|
245
|
-
name: "GitHub Copilot",
|
|
246
|
-
async login(callbacks) {
|
|
247
|
-
if (!callbacks.onDeviceCode) {
|
|
248
|
-
throw new Error("GitHub Copilot OAuth requires a device code callback");
|
|
249
|
-
}
|
|
250
|
-
return loginGitHubCopilot({
|
|
251
|
-
onDeviceCode: callbacks.onDeviceCode,
|
|
252
|
-
onPrompt: callbacks.onPrompt,
|
|
253
|
-
onProgress: callbacks.onProgress,
|
|
254
|
-
signal: callbacks.signal,
|
|
255
|
-
});
|
|
256
|
-
},
|
|
257
|
-
async refreshToken(credentials) {
|
|
258
|
-
const creds = credentials;
|
|
259
|
-
return refreshGitHubCopilotToken(creds.refresh, creds.enterpriseUrl);
|
|
260
|
-
},
|
|
261
|
-
getApiKey(credentials) {
|
|
262
|
-
return credentials.access;
|
|
263
|
-
},
|
|
264
|
-
modifyModels(models, credentials) {
|
|
265
|
-
const creds = credentials;
|
|
266
|
-
const domain = creds.enterpriseUrl ? (normalizeDomain(creds.enterpriseUrl) ?? undefined) : undefined;
|
|
267
|
-
const baseUrl = getGitHubCopilotBaseUrl(creds.access, domain);
|
|
268
|
-
return models.map((m) => (m.provider === "github-copilot" ? { ...m, baseUrl } : m));
|
|
269
|
-
},
|
|
270
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type { AgentTool } from "../../../agent-core/index.js";
|
|
2
|
-
import { type Static, Type } from "typebox";
|
|
3
|
-
import type { ToolDefinition } from "../extensions/types.js";
|
|
4
|
-
import { type TruncationResult } from "./truncate.js";
|
|
5
|
-
declare const findSchema: Type.TObject<{
|
|
6
|
-
pattern: Type.TString;
|
|
7
|
-
path: Type.TOptional<Type.TString>;
|
|
8
|
-
limit: Type.TOptional<Type.TNumber>;
|
|
9
|
-
}>;
|
|
10
|
-
export type FindToolInput = Static<typeof findSchema>;
|
|
11
|
-
export interface FindToolDetails {
|
|
12
|
-
truncation?: TruncationResult;
|
|
13
|
-
resultLimitReached?: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Pluggable operations for the find tool.
|
|
17
|
-
* Override these to delegate file search to remote systems (for example SSH).
|
|
18
|
-
*/
|
|
19
|
-
export interface FindOperations {
|
|
20
|
-
/** Check if path exists */
|
|
21
|
-
exists: (absolutePath: string) => Promise<boolean> | boolean;
|
|
22
|
-
/** Find files matching glob pattern. Returns relative or absolute paths. */
|
|
23
|
-
glob: (pattern: string, cwd: string, options: {
|
|
24
|
-
ignore: string[];
|
|
25
|
-
limit: number;
|
|
26
|
-
}) => Promise<string[]> | string[];
|
|
27
|
-
}
|
|
28
|
-
export interface FindToolOptions {
|
|
29
|
-
/** Custom operations for find. Default: local filesystem plus fd */
|
|
30
|
-
operations?: FindOperations;
|
|
31
|
-
}
|
|
32
|
-
export declare function createFindToolDefinition(cwd: string, options?: FindToolOptions): ToolDefinition<typeof findSchema, FindToolDetails | undefined>;
|
|
33
|
-
export declare function createFindTool(cwd: string, options?: FindToolOptions): AgentTool<typeof findSchema>;
|
|
34
|
-
export {};
|
|
35
|
-
//# sourceMappingURL=find.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../../src/sdk/coding-agent/core/tools/find.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAI9D,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,EAAiC,KAAK,gBAAgB,EAAgB,MAAM,eAAe,CAAC;AAMnG,QAAA,MAAM,UAAU;;;;EAMd,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;AAiDtD,MAAM,WAAW,eAAe;IAC/B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7D,4EAA4E;IAC5E,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC;CACnH;AAQD,MAAM,WAAW,eAAe;IAC/B,oEAAoE;IACpE,UAAU,CAAC,EAAE,cAAc,CAAC;CAC5B;AAmDD,wBAAgB,wBAAwB,CACvC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC,OAAO,UAAU,EAAE,eAAe,GAAG,SAAS,CAAC,CA0QhE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,CAEnG"}
|