expandai 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
- package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
- package/build/dts/Mcp/Server.d.ts +1 -2
- package/build/dts/index.d.ts +0 -1
- package/build/esm/index.js +193 -2
- package/build/esm/main.js +691 -200
- package/build/skills/expandai/SKILL.md +100 -8
- package/package.json +20 -12
- package/build/dts/ApiClient.d.ts +0 -165
- package/build/dts/ApiClient.d.ts.map +0 -1
- package/build/dts/Auth/Domain.d.ts +0 -95
- package/build/dts/Auth/Domain.d.ts.map +0 -1
- package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
- package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
- package/build/dts/Auth/PendingInit.d.ts +0 -35
- package/build/dts/Auth/PendingInit.d.ts.map +0 -1
- package/build/dts/Auth/Pkce.d.ts +0 -10
- package/build/dts/Auth/Pkce.d.ts.map +0 -1
- package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
- package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
- package/build/dts/Authentication.d.ts +0 -24
- package/build/dts/Authentication.d.ts.map +0 -1
- package/build/dts/BrowserOAuth.d.ts +0 -99
- package/build/dts/BrowserOAuth.d.ts.map +0 -1
- package/build/dts/CommandPath.d.ts +0 -2
- package/build/dts/CommandPath.d.ts.map +0 -1
- package/build/dts/Commands/Fetch.d.ts +0 -30
- package/build/dts/Commands/Fetch.d.ts.map +0 -1
- package/build/dts/Commands/Hook.d.ts +0 -17
- package/build/dts/Commands/Hook.d.ts.map +0 -1
- package/build/dts/Commands/Init.d.ts +0 -55
- package/build/dts/Commands/Init.d.ts.map +0 -1
- package/build/dts/Commands/Mcp.d.ts +0 -11
- package/build/dts/Commands/Mcp.d.ts.map +0 -1
- package/build/dts/Commands/McpRun.d.ts +0 -5
- package/build/dts/Commands/McpRun.d.ts.map +0 -1
- package/build/dts/Commands/Search.d.ts +0 -21
- package/build/dts/Commands/Search.d.ts.map +0 -1
- package/build/dts/Commands/Skill.d.ts +0 -12
- package/build/dts/Commands/Skill.d.ts.map +0 -1
- package/build/dts/Commands/Status.d.ts +0 -27
- package/build/dts/Commands/Status.d.ts.map +0 -1
- package/build/dts/Commands/Telemetry.d.ts +0 -7
- package/build/dts/Commands/Telemetry.d.ts.map +0 -1
- package/build/dts/Commands/Uninstall.d.ts +0 -9
- package/build/dts/Commands/Uninstall.d.ts.map +0 -1
- package/build/dts/Config.d.ts +0 -196
- package/build/dts/Config.d.ts.map +0 -1
- package/build/dts/Hook/Claude.d.ts +0 -13
- package/build/dts/Hook/Claude.d.ts.map +0 -1
- package/build/dts/Hook/Errors.d.ts +0 -20
- package/build/dts/Hook/Errors.d.ts.map +0 -1
- package/build/dts/Hook/Opencode.d.ts +0 -13
- package/build/dts/Hook/Opencode.d.ts.map +0 -1
- package/build/dts/Hook/SnapshotNote.d.ts +0 -12
- package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
- package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
- package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
- package/build/dts/Init/ClaudeProfile.d.ts +0 -77
- package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
- package/build/dts/Init/Domain.d.ts +0 -139
- package/build/dts/Init/Domain.d.ts.map +0 -1
- package/build/dts/Init/HarnessAdapter.d.ts +0 -33
- package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
- package/build/dts/Init/HarnessDetector.d.ts +0 -19
- package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
- package/build/dts/Init/HarnessRegistry.d.ts +0 -50
- package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
- package/build/dts/Init/MutationTransaction.d.ts +0 -96
- package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
- package/build/dts/Init/Service.d.ts +0 -72
- package/build/dts/Init/Service.d.ts.map +0 -1
- package/build/dts/Init/StandardAdapters.d.ts +0 -42
- package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
- package/build/dts/Init/Status.d.ts +0 -149
- package/build/dts/Init/Status.d.ts.map +0 -1
- package/build/dts/Install/Claude/Hook.d.ts +0 -88
- package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
- package/build/dts/Install/Claude/Mcp.d.ts +0 -48
- package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Claude/Skill.d.ts +0 -23
- package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
- package/build/dts/Install/Codex/Mcp.d.ts +0 -45
- package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Codex/Skill.d.ts +0 -22
- package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
- package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Cursor/Skill.d.ts +0 -29
- package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
- package/build/dts/Install/Domain.d.ts +0 -103
- package/build/dts/Install/Domain.d.ts.map +0 -1
- package/build/dts/Install/Hook.d.ts +0 -30
- package/build/dts/Install/Hook.d.ts.map +0 -1
- package/build/dts/Install/Mcp.d.ts +0 -28
- package/build/dts/Install/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Hook.d.ts +0 -24
- package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
- package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
- package/build/dts/Install/Opencode/Skill.d.ts +0 -26
- package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
- package/build/dts/Install/Skill.d.ts +0 -32
- package/build/dts/Install/Skill.d.ts.map +0 -1
- package/build/dts/Install/Uninstall.d.ts +0 -32
- package/build/dts/Install/Uninstall.d.ts.map +0 -1
- package/build/dts/MarkdownAnsi.d.ts +0 -29
- package/build/dts/MarkdownAnsi.d.ts.map +0 -1
- package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
- package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
- package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
- package/build/dts/Mcp/Server.d.ts.map +0 -1
- package/build/dts/Mcp/Toolkit.d.ts +0 -3
- package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Citations.d.ts +0 -266
- package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
- package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
- package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
- package/build/dts/SecureFile.d.ts +0 -23
- package/build/dts/SecureFile.d.ts.map +0 -1
- package/build/dts/Snippets.d.ts +0 -18
- package/build/dts/Snippets.d.ts.map +0 -1
- package/build/dts/Telemetry.d.ts +0 -30
- package/build/dts/Telemetry.d.ts.map +0 -1
- package/build/dts/Version.d.ts +0 -2
- package/build/dts/Version.d.ts.map +0 -1
- package/build/dts/Xdg.d.ts +0 -11
- package/build/dts/Xdg.d.ts.map +0 -1
- package/build/dts/index.d.ts.map +0 -1
- package/build/dts/main.d.ts +0 -3
- package/build/dts/main.d.ts.map +0 -1
- package/build/esm/ApiClient.js +0 -305
- package/build/esm/ApiClient.js.map +0 -1
- package/build/esm/Auth/Domain.js +0 -56
- package/build/esm/Auth/Domain.js.map +0 -1
- package/build/esm/Auth/ManualAuthorization.js +0 -253
- package/build/esm/Auth/ManualAuthorization.js.map +0 -1
- package/build/esm/Auth/PendingInit.js +0 -267
- package/build/esm/Auth/PendingInit.js.map +0 -1
- package/build/esm/Auth/Pkce.js +0 -23
- package/build/esm/Auth/Pkce.js.map +0 -1
- package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
- package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
- package/build/esm/Authentication.js +0 -143
- package/build/esm/Authentication.js.map +0 -1
- package/build/esm/BrowserOAuth.js +0 -251
- package/build/esm/BrowserOAuth.js.map +0 -1
- package/build/esm/CommandPath.js +0 -31
- package/build/esm/CommandPath.js.map +0 -1
- package/build/esm/Commands/Fetch.js +0 -119
- package/build/esm/Commands/Fetch.js.map +0 -1
- package/build/esm/Commands/Hook.js +0 -20
- package/build/esm/Commands/Hook.js.map +0 -1
- package/build/esm/Commands/Init.js +0 -371
- package/build/esm/Commands/Init.js.map +0 -1
- package/build/esm/Commands/Mcp.js +0 -19
- package/build/esm/Commands/Mcp.js.map +0 -1
- package/build/esm/Commands/McpRun.js +0 -15
- package/build/esm/Commands/McpRun.js.map +0 -1
- package/build/esm/Commands/Search.js +0 -46
- package/build/esm/Commands/Search.js.map +0 -1
- package/build/esm/Commands/Skill.js +0 -17
- package/build/esm/Commands/Skill.js.map +0 -1
- package/build/esm/Commands/Status.js +0 -186
- package/build/esm/Commands/Status.js.map +0 -1
- package/build/esm/Commands/Telemetry.js +0 -23
- package/build/esm/Commands/Telemetry.js.map +0 -1
- package/build/esm/Commands/Uninstall.js +0 -28
- package/build/esm/Commands/Uninstall.js.map +0 -1
- package/build/esm/Config.js +0 -619
- package/build/esm/Config.js.map +0 -1
- package/build/esm/Hook/Claude.js +0 -74
- package/build/esm/Hook/Claude.js.map +0 -1
- package/build/esm/Hook/Errors.js +0 -18
- package/build/esm/Hook/Errors.js.map +0 -1
- package/build/esm/Hook/Opencode.js +0 -50
- package/build/esm/Hook/Opencode.js.map +0 -1
- package/build/esm/Hook/SnapshotNote.js +0 -65
- package/build/esm/Hook/SnapshotNote.js.map +0 -1
- package/build/esm/Init/ClaudeAdapter.js +0 -137
- package/build/esm/Init/ClaudeAdapter.js.map +0 -1
- package/build/esm/Init/ClaudeProfile.js +0 -344
- package/build/esm/Init/ClaudeProfile.js.map +0 -1
- package/build/esm/Init/Domain.js +0 -118
- package/build/esm/Init/Domain.js.map +0 -1
- package/build/esm/Init/HarnessAdapter.js +0 -21
- package/build/esm/Init/HarnessAdapter.js.map +0 -1
- package/build/esm/Init/HarnessDetector.js +0 -65
- package/build/esm/Init/HarnessDetector.js.map +0 -1
- package/build/esm/Init/HarnessRegistry.js +0 -58
- package/build/esm/Init/HarnessRegistry.js.map +0 -1
- package/build/esm/Init/MutationTransaction.js +0 -494
- package/build/esm/Init/MutationTransaction.js.map +0 -1
- package/build/esm/Init/Service.js +0 -319
- package/build/esm/Init/Service.js.map +0 -1
- package/build/esm/Init/StandardAdapters.js +0 -116
- package/build/esm/Init/StandardAdapters.js.map +0 -1
- package/build/esm/Init/Status.js +0 -215
- package/build/esm/Init/Status.js.map +0 -1
- package/build/esm/Install/Claude/Hook.js +0 -77
- package/build/esm/Install/Claude/Hook.js.map +0 -1
- package/build/esm/Install/Claude/Mcp.js +0 -101
- package/build/esm/Install/Claude/Mcp.js.map +0 -1
- package/build/esm/Install/Claude/Skill.js +0 -56
- package/build/esm/Install/Claude/Skill.js.map +0 -1
- package/build/esm/Install/Codex/Mcp.js +0 -97
- package/build/esm/Install/Codex/Mcp.js.map +0 -1
- package/build/esm/Install/Codex/Skill.js +0 -33
- package/build/esm/Install/Codex/Skill.js.map +0 -1
- package/build/esm/Install/Cursor/Mcp.js +0 -74
- package/build/esm/Install/Cursor/Mcp.js.map +0 -1
- package/build/esm/Install/Cursor/Skill.js +0 -40
- package/build/esm/Install/Cursor/Skill.js.map +0 -1
- package/build/esm/Install/Domain.js +0 -162
- package/build/esm/Install/Domain.js.map +0 -1
- package/build/esm/Install/Hook.js +0 -38
- package/build/esm/Install/Hook.js.map +0 -1
- package/build/esm/Install/Mcp.js +0 -40
- package/build/esm/Install/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Hook.js +0 -44
- package/build/esm/Install/Opencode/Hook.js.map +0 -1
- package/build/esm/Install/Opencode/Mcp.js +0 -76
- package/build/esm/Install/Opencode/Mcp.js.map +0 -1
- package/build/esm/Install/Opencode/Skill.js +0 -37
- package/build/esm/Install/Opencode/Skill.js.map +0 -1
- package/build/esm/Install/Skill.js +0 -41
- package/build/esm/Install/Skill.js.map +0 -1
- package/build/esm/Install/Uninstall.js +0 -49
- package/build/esm/Install/Uninstall.js.map +0 -1
- package/build/esm/MarkdownAnsi.js +0 -142
- package/build/esm/MarkdownAnsi.js.map +0 -1
- package/build/esm/Mcp/ExpandDocs.js +0 -56
- package/build/esm/Mcp/ExpandDocs.js.map +0 -1
- package/build/esm/Mcp/RequestHeaders.js +0 -13
- package/build/esm/Mcp/RequestHeaders.js.map +0 -1
- package/build/esm/Mcp/Server.js +0 -12
- package/build/esm/Mcp/Server.js.map +0 -1
- package/build/esm/Mcp/Toolkit.js +0 -16
- package/build/esm/Mcp/Toolkit.js.map +0 -1
- package/build/esm/Mcp/tools/Citations.js +0 -193
- package/build/esm/Mcp/tools/Citations.js.map +0 -1
- package/build/esm/Mcp/tools/Fetch.js +0 -165
- package/build/esm/Mcp/tools/Fetch.js.map +0 -1
- package/build/esm/SecureFile.js +0 -36
- package/build/esm/SecureFile.js.map +0 -1
- package/build/esm/Snippets.js +0 -29
- package/build/esm/Snippets.js.map +0 -1
- package/build/esm/Telemetry.js +0 -157
- package/build/esm/Telemetry.js.map +0 -1
- package/build/esm/Version.js +0 -4
- package/build/esm/Version.js.map +0 -1
- package/build/esm/Xdg.js +0 -15
- package/build/esm/Xdg.js.map +0 -1
- package/build/esm/index.js.map +0 -1
- package/build/esm/main.js.map +0 -1
- package/src/ApiClient.ts +0 -450
- package/src/Auth/Domain.ts +0 -63
- package/src/Auth/ManualAuthorization.ts +0 -296
- package/src/Auth/PendingInit.ts +0 -338
- package/src/Auth/Pkce.ts +0 -26
- package/src/Auth/SetupGrantAuthorization.ts +0 -116
- package/src/Authentication.ts +0 -202
- package/src/BrowserOAuth.ts +0 -359
- package/src/CommandPath.ts +0 -30
- package/src/Commands/Fetch.ts +0 -188
- package/src/Commands/Hook.ts +0 -48
- package/src/Commands/Init.ts +0 -489
- package/src/Commands/Mcp.ts +0 -30
- package/src/Commands/McpRun.ts +0 -25
- package/src/Commands/Search.ts +0 -97
- package/src/Commands/Skill.ts +0 -30
- package/src/Commands/Status.ts +0 -228
- package/src/Commands/Telemetry.ts +0 -42
- package/src/Commands/Uninstall.ts +0 -38
- package/src/Config.ts +0 -840
- package/src/Hook/Claude.ts +0 -81
- package/src/Hook/Errors.ts +0 -19
- package/src/Hook/Opencode.ts +0 -58
- package/src/Hook/SnapshotNote.ts +0 -66
- package/src/Init/ClaudeAdapter.ts +0 -191
- package/src/Init/ClaudeProfile.ts +0 -453
- package/src/Init/Domain.ts +0 -153
- package/src/Init/HarnessAdapter.ts +0 -35
- package/src/Init/HarnessDetector.ts +0 -77
- package/src/Init/HarnessRegistry.ts +0 -87
- package/src/Init/MutationTransaction.ts +0 -747
- package/src/Init/Service.ts +0 -385
- package/src/Init/StandardAdapters.ts +0 -141
- package/src/Init/Status.ts +0 -253
- package/src/Install/Claude/Hook.ts +0 -123
- package/src/Install/Claude/Mcp.ts +0 -129
- package/src/Install/Claude/Skill.ts +0 -77
- package/src/Install/Codex/Mcp.ts +0 -114
- package/src/Install/Codex/Skill.ts +0 -44
- package/src/Install/Cursor/Mcp.ts +0 -85
- package/src/Install/Cursor/Skill.ts +0 -51
- package/src/Install/Domain.ts +0 -221
- package/src/Install/Hook.ts +0 -50
- package/src/Install/Mcp.ts +0 -71
- package/src/Install/Opencode/Hook.ts +0 -55
- package/src/Install/Opencode/Mcp.ts +0 -87
- package/src/Install/Opencode/Skill.ts +0 -48
- package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
- package/src/Install/Opencode/expandai-webfetch.js +0 -56
- package/src/Install/Skill.ts +0 -57
- package/src/Install/Uninstall.ts +0 -82
- package/src/MarkdownAnsi.ts +0 -162
- package/src/Mcp/ExpandDocs.ts +0 -62
- package/src/Mcp/RequestHeaders.ts +0 -16
- package/src/Mcp/Server.ts +0 -15
- package/src/Mcp/Toolkit.ts +0 -21
- package/src/Mcp/tools/Citations.ts +0 -219
- package/src/Mcp/tools/Fetch.ts +0 -203
- package/src/SecureFile.ts +0 -70
- package/src/Snippets.ts +0 -39
- package/src/Telemetry.ts +0 -186
- package/src/Version.ts +0 -3
- package/src/Xdg.ts +0 -18
- package/src/index.ts +0 -1
- package/src/main.ts +0 -305
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { createServer } from 'node:http';
|
|
2
|
-
import { HttpClient, HttpClientRequest, HttpClientResponse } from '@effect/platform';
|
|
3
|
-
import { NodeHttpClient } from '@effect/platform-node';
|
|
4
|
-
import { DateTime, Duration, Effect, Inspectable, Redacted, Schema } from 'effect';
|
|
5
|
-
import { codeChallengeFor, createHighEntropySecret } from './Auth/Pkce.js';
|
|
6
|
-
import { ConfigManager, OAuthConfig } from './Config.js';
|
|
7
|
-
const CLIENT_ID = 'expandai-cli';
|
|
8
|
-
const OAUTH_AUTHORIZE_ENDPOINT = '/api/auth/oauth2/authorize';
|
|
9
|
-
const OAUTH_TOKEN_ENDPOINT = '/api/auth/oauth2/token';
|
|
10
|
-
const OAUTH_SCOPE = 'openid profile email offline_access';
|
|
11
|
-
const LOOPBACK_HOST = '127.0.0.1';
|
|
12
|
-
const OAUTH_LOGIN_TIMEOUT = Duration.minutes(5);
|
|
13
|
-
const DurationFromSeconds = Schema.transform(Schema.Number, Schema.DurationFromSelf, {
|
|
14
|
-
strict: true,
|
|
15
|
-
decode: Duration.seconds,
|
|
16
|
-
encode: Duration.toSeconds,
|
|
17
|
-
});
|
|
18
|
-
export class TokenResponse extends Schema.Class('BrowserOAuthTokenResponse')({
|
|
19
|
-
access_token: Schema.String,
|
|
20
|
-
refresh_token: Schema.optional(Schema.String),
|
|
21
|
-
expires_in: DurationFromSeconds,
|
|
22
|
-
token_type: Schema.String,
|
|
23
|
-
scope: Schema.optional(Schema.String),
|
|
24
|
-
}) {
|
|
25
|
-
}
|
|
26
|
-
export class BrowserOAuthRequestFailed extends Schema.TaggedError()('BrowserOAuthRequestFailed', {
|
|
27
|
-
endpoint: Schema.String,
|
|
28
|
-
error: Schema.Defect,
|
|
29
|
-
status: Schema.optional(Schema.Number),
|
|
30
|
-
}) {
|
|
31
|
-
get message() {
|
|
32
|
-
return `OAuth request to ${this.endpoint} failed${this.status ? ` (${this.status})` : ''}: ${Inspectable.format(this.error)}`;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export class BrowserOAuthCallbackError extends Schema.TaggedError()('BrowserOAuthCallbackError', {
|
|
36
|
-
error: Schema.String,
|
|
37
|
-
errorDescription: Schema.optional(Schema.String),
|
|
38
|
-
}) {
|
|
39
|
-
get message() {
|
|
40
|
-
return this.errorDescription ? `${this.error}: ${this.errorDescription}` : this.error;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
export class BrowserOAuthMissingCode extends Schema.TaggedError()('BrowserOAuthMissingCode', {}) {
|
|
44
|
-
get message() {
|
|
45
|
-
return 'OAuth callback did not include an authorization code.';
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export class BrowserOAuthStateMismatch extends Schema.TaggedError()('BrowserOAuthStateMismatch', {}) {
|
|
49
|
-
get message() {
|
|
50
|
-
return 'OAuth callback state did not match the login request.';
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export class BrowserOAuthLoopbackFailed extends Schema.TaggedError()('BrowserOAuthLoopbackFailed', {
|
|
54
|
-
error: Schema.Defect,
|
|
55
|
-
}) {
|
|
56
|
-
get message() {
|
|
57
|
-
return `Could not start OAuth loopback server: ${Inspectable.format(this.error)}`;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
export class BrowserOAuthTimedOut extends Schema.TaggedError()('BrowserOAuthTimedOut', {}) {
|
|
61
|
-
get message() {
|
|
62
|
-
return 'OAuth browser login timed out before the local callback completed.';
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
export const createCodeChallenge = Effect.fn('BrowserOAuth.createCodeChallenge')(function* (codeVerifier) {
|
|
66
|
-
return codeChallengeFor(Redacted.make(codeVerifier));
|
|
67
|
-
});
|
|
68
|
-
export const buildAuthorizeUrl = Effect.fn('BrowserOAuth.buildAuthorizeUrl')(function* ({ apiUrl, redirectUri, state, codeChallenge, }) {
|
|
69
|
-
const authorizeUrl = new URL(OAUTH_AUTHORIZE_ENDPOINT, apiUrl);
|
|
70
|
-
authorizeUrl.searchParams.set('response_type', 'code');
|
|
71
|
-
authorizeUrl.searchParams.set('client_id', CLIENT_ID);
|
|
72
|
-
authorizeUrl.searchParams.set('redirect_uri', redirectUri.toString());
|
|
73
|
-
authorizeUrl.searchParams.set('scope', OAUTH_SCOPE);
|
|
74
|
-
authorizeUrl.searchParams.set('code_challenge', codeChallenge);
|
|
75
|
-
authorizeUrl.searchParams.set('code_challenge_method', 'S256');
|
|
76
|
-
authorizeUrl.searchParams.set('state', state);
|
|
77
|
-
return authorizeUrl;
|
|
78
|
-
});
|
|
79
|
-
function respond(response, status, body) {
|
|
80
|
-
response.writeHead(status, { 'content-type': 'text/html; charset=utf-8' });
|
|
81
|
-
response.end(body);
|
|
82
|
-
}
|
|
83
|
-
function validateCallback(request, expectedState) {
|
|
84
|
-
const callbackUrl = new URL(request.url ?? '/', `http://${LOOPBACK_HOST}`);
|
|
85
|
-
const error = callbackUrl.searchParams.get('error');
|
|
86
|
-
if (error !== null) {
|
|
87
|
-
throw new BrowserOAuthCallbackError({
|
|
88
|
-
error,
|
|
89
|
-
errorDescription: callbackUrl.searchParams.get('error_description') ?? undefined,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
if (callbackUrl.searchParams.get('state') !== expectedState) {
|
|
93
|
-
throw new BrowserOAuthStateMismatch();
|
|
94
|
-
}
|
|
95
|
-
const code = callbackUrl.searchParams.get('code');
|
|
96
|
-
if (code === null || code.length === 0) {
|
|
97
|
-
throw new BrowserOAuthMissingCode();
|
|
98
|
-
}
|
|
99
|
-
return code;
|
|
100
|
-
}
|
|
101
|
-
function toCallbackFailure(error) {
|
|
102
|
-
if (error instanceof BrowserOAuthCallbackError ||
|
|
103
|
-
error instanceof BrowserOAuthMissingCode ||
|
|
104
|
-
error instanceof BrowserOAuthStateMismatch) {
|
|
105
|
-
return error;
|
|
106
|
-
}
|
|
107
|
-
return new BrowserOAuthCallbackError({ error: 'server_error', errorDescription: Inspectable.format(error) });
|
|
108
|
-
}
|
|
109
|
-
function closeServer(server) {
|
|
110
|
-
return Effect.async((resume) => {
|
|
111
|
-
server.close((error) => {
|
|
112
|
-
if (error) {
|
|
113
|
-
resume(Effect.void);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
resume(Effect.void);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
const startLoopbackServer = Effect.fn('BrowserOAuth.startLoopbackServer')(function* (expectedState) {
|
|
121
|
-
return yield* Effect.async((resume) => {
|
|
122
|
-
let settled = false;
|
|
123
|
-
let resolveCode = () => undefined;
|
|
124
|
-
let rejectCode = () => undefined;
|
|
125
|
-
const codePromise = new Promise((resolve, reject) => {
|
|
126
|
-
resolveCode = resolve;
|
|
127
|
-
rejectCode = (error) => reject(error);
|
|
128
|
-
});
|
|
129
|
-
const server = createServer((request, response) => {
|
|
130
|
-
const requestUrl = new URL(request.url ?? '/', `http://${LOOPBACK_HOST}`);
|
|
131
|
-
if (requestUrl.pathname !== '/callback') {
|
|
132
|
-
respond(response, 404, 'Not found');
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
if (settled) {
|
|
136
|
-
respond(response, 409, 'OAuth callback already handled.');
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
settled = true;
|
|
140
|
-
try {
|
|
141
|
-
const code = validateCallback(request, expectedState);
|
|
142
|
-
respond(response, 200, 'Authentication complete. You can close this tab.');
|
|
143
|
-
resolveCode(code);
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
respond(response, 400, 'Authentication failed. Return to the terminal and try again.');
|
|
147
|
-
rejectCode(toCallbackFailure(error));
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
server.once('error', (error) => {
|
|
151
|
-
resume(Effect.fail(new BrowserOAuthLoopbackFailed({ error })));
|
|
152
|
-
});
|
|
153
|
-
server.listen(0, LOOPBACK_HOST, () => {
|
|
154
|
-
const address = server.address();
|
|
155
|
-
if (address === null || typeof address === 'string') {
|
|
156
|
-
resume(Effect.fail(new BrowserOAuthLoopbackFailed({ error: 'loopback server did not report a port' })));
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
resume(Effect.succeed({
|
|
160
|
-
redirectUri: new URL(`http://${LOOPBACK_HOST}:${address.port}/callback`),
|
|
161
|
-
waitForCode: Effect.tryPromise({
|
|
162
|
-
try: () => codePromise,
|
|
163
|
-
catch: toCallbackFailure,
|
|
164
|
-
}),
|
|
165
|
-
close: closeServer(server),
|
|
166
|
-
}));
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
export class BrowserOAuthService extends Effect.Service()('@expandai/cli/BrowserOAuthService', {
|
|
171
|
-
dependencies: [NodeHttpClient.layer, ConfigManager.Default],
|
|
172
|
-
effect: Effect.gen(function* () {
|
|
173
|
-
const httpClient = yield* HttpClient.HttpClient;
|
|
174
|
-
const configManager = yield* ConfigManager;
|
|
175
|
-
const exchangeToken = Effect.fn('BrowserOAuthService.exchangeToken')(function* (form) {
|
|
176
|
-
yield* configManager.ensureSecureStorage();
|
|
177
|
-
const apiUrl = yield* configManager.getApiUrl();
|
|
178
|
-
const resource = apiUrl.toString();
|
|
179
|
-
const request = HttpClientRequest.post(new URL(OAUTH_TOKEN_ENDPOINT, apiUrl)).pipe(HttpClientRequest.bodyUrlParams([...form, ['resource', resource]]));
|
|
180
|
-
return yield* httpClient.execute(request).pipe(Effect.flatMap(HttpClientResponse.matchStatus({
|
|
181
|
-
'200': (response) => HttpClientResponse.schemaBodyJson(TokenResponse)(response),
|
|
182
|
-
orElse: (response) => response.text.pipe(Effect.flatMap((body) => Effect.fail(new BrowserOAuthRequestFailed({
|
|
183
|
-
endpoint: OAUTH_TOKEN_ENDPOINT,
|
|
184
|
-
status: response.status,
|
|
185
|
-
error: body,
|
|
186
|
-
})))),
|
|
187
|
-
})), Effect.catchTags({
|
|
188
|
-
RequestError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
|
|
189
|
-
ResponseError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
|
|
190
|
-
ParseError: (error) => Effect.fail(new BrowserOAuthRequestFailed({ endpoint: OAUTH_TOKEN_ENDPOINT, error })),
|
|
191
|
-
}));
|
|
192
|
-
});
|
|
193
|
-
const exchangeCode = Effect.fn('BrowserOAuthService.exchangeCode')(function* ({ code, redirectUri, codeVerifier, }) {
|
|
194
|
-
return yield* exchangeToken([
|
|
195
|
-
['grant_type', 'authorization_code'],
|
|
196
|
-
['client_id', CLIENT_ID],
|
|
197
|
-
['code', code],
|
|
198
|
-
['redirect_uri', redirectUri.toString()],
|
|
199
|
-
['code_verifier', codeVerifier],
|
|
200
|
-
]);
|
|
201
|
-
});
|
|
202
|
-
const refreshToken = Effect.fn('BrowserOAuthService.refreshToken')(function* (refreshToken, clientId = CLIENT_ID) {
|
|
203
|
-
return yield* exchangeToken([
|
|
204
|
-
['grant_type', 'refresh_token'],
|
|
205
|
-
['client_id', clientId],
|
|
206
|
-
['refresh_token', refreshToken],
|
|
207
|
-
]);
|
|
208
|
-
});
|
|
209
|
-
const saveToken = Effect.fn('BrowserOAuthService.saveToken')(function* (tokenResponse) {
|
|
210
|
-
const now = yield* DateTime.now;
|
|
211
|
-
const expiresAt = DateTime.addDuration(now, tokenResponse.expires_in);
|
|
212
|
-
yield* configManager.updateConfig({
|
|
213
|
-
authMethod: OAuthConfig.make({
|
|
214
|
-
accessToken: Redacted.make(tokenResponse.access_token),
|
|
215
|
-
refreshToken: tokenResponse.refresh_token === undefined ? undefined : Redacted.make(tokenResponse.refresh_token),
|
|
216
|
-
expiresAt,
|
|
217
|
-
clientId: CLIENT_ID,
|
|
218
|
-
}),
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
const login = Effect.fn('BrowserOAuthService.login')(function* (openAuthorizeUrl) {
|
|
222
|
-
yield* configManager.ensureSecureStorage();
|
|
223
|
-
const codeVerifier = createHighEntropySecret();
|
|
224
|
-
const state = createHighEntropySecret();
|
|
225
|
-
const codeChallenge = yield* createCodeChallenge(codeVerifier);
|
|
226
|
-
const loopback = yield* startLoopbackServer(state);
|
|
227
|
-
const apiUrl = yield* configManager.getApiUrl();
|
|
228
|
-
const authorizeUrl = yield* buildAuthorizeUrl({
|
|
229
|
-
apiUrl,
|
|
230
|
-
redirectUri: loopback.redirectUri,
|
|
231
|
-
state,
|
|
232
|
-
codeChallenge,
|
|
233
|
-
});
|
|
234
|
-
const code = yield* openAuthorizeUrl(authorizeUrl).pipe(Effect.zipRight(loopback.waitForCode), Effect.timeoutFail({
|
|
235
|
-
duration: OAUTH_LOGIN_TIMEOUT,
|
|
236
|
-
onTimeout: () => new BrowserOAuthTimedOut(),
|
|
237
|
-
}), Effect.ensuring(loopback.close));
|
|
238
|
-
const token = yield* exchangeCode({ code, redirectUri: loopback.redirectUri, codeVerifier });
|
|
239
|
-
if (token === undefined) {
|
|
240
|
-
return yield* new BrowserOAuthRequestFailed({
|
|
241
|
-
endpoint: OAUTH_TOKEN_ENDPOINT,
|
|
242
|
-
error: 'OAuth token endpoint returned an empty response body',
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
yield* saveToken(token);
|
|
246
|
-
});
|
|
247
|
-
return { exchangeCode, refreshToken, saveToken, login };
|
|
248
|
-
}),
|
|
249
|
-
}) {
|
|
250
|
-
}
|
|
251
|
-
//# sourceMappingURL=BrowserOAuth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserOAuth.js","sourceRoot":"","sources":["../../src/BrowserOAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAA;AAChG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAClF,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAExD,MAAM,SAAS,GAAG,cAAc,CAAA;AAChC,MAAM,wBAAwB,GAAG,4BAA4B,CAAA;AAC7D,MAAM,oBAAoB,GAAG,wBAAwB,CAAA;AACrD,MAAM,WAAW,GAAG,qCAAqC,CAAA;AACzD,MAAM,aAAa,GAAG,WAAW,CAAA;AACjC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAE/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,gBAAgB,EAAE;IACpF,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,QAAQ,CAAC,OAAO;IACxB,MAAM,EAAE,QAAQ,CAAC,SAAS;CAC1B,CAAC,CAAA;AAEF,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,2BAA2B,CAAC,CAAC;IAC3F,YAAY,EAAE,MAAM,CAAC,MAAM;IAC3B,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,mBAAmB;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CACrC,CAAC;CAAG;AAEL,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B;IACC,QAAQ,EAAE,MAAM,CAAC,MAAM;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CACtC,CACD;IACA,IAAI,OAAO;QACV,OAAO,oBAAoB,IAAI,CAAC,QAAQ,UAAU,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9H,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B;IACC,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;CAChD,CACD;IACA,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAA;IACtF,CAAC;CACD;AAED,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,WAAW,EAA2B,CACzF,yBAAyB,EACzB,EAAE,CACF;IACA,IAAI,OAAO;QACV,OAAO,uDAAuD,CAAA;IAC/D,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B,EAAE,CACF;IACA,IAAI,OAAO;QACV,OAAO,uDAAuD,CAAA;IAC/D,CAAC;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC/F,4BAA4B,EAC5B;IACC,KAAK,EAAE,MAAM,CAAC,MAAM;CACpB,CACD;IACA,IAAI,OAAO;QACV,OAAO,0CAA0C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAClF,CAAC;CACD;AAED,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,WAAW,EAAwB,CAAC,sBAAsB,EAAE,EAAE,CAAC;IAC/G,IAAI,OAAO;QACV,OAAO,oEAAoE,CAAA;IAC5E,CAAC;CACD;AAuBD,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAoB;IAC/G,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;AACrD,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC,QAAQ,CAAC,EAAE,EACvF,MAAM,EACN,WAAW,EACX,KAAK,EACL,aAAa,GACM;IACnB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;IACtD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IACrD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrE,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACnD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;IAC9D,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC7C,OAAO,YAAY,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,SAAS,OAAO,CAAC,QAAwB,EAAE,MAAc,EAAE,IAAY;IACtE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAA;IAC1E,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB,EAAE,aAAqB;IACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,aAAa,EAAE,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,yBAAyB,CAAC;YACnC,KAAK;YACL,gBAAgB,EAAE,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,SAAS;SAChF,CAAC,CAAA;IACH,CAAC;IAED,IAAI,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,aAAa,EAAE,CAAC;QAC7D,MAAM,IAAI,yBAAyB,EAAE,CAAA;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,uBAAuB,EAAE,CAAA;IACpC,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACxC,IACC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,uBAAuB;QACxC,KAAK,YAAY,yBAAyB,EACzC,CAAC;QACF,OAAO,KAAK,CAAA;IACb,CAAC;IACD,OAAO,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;AAC7G,CAAC;AAED,SAAS,WAAW,CAAC,MAAc;IAClC,OAAO,MAAM,CAAC,KAAK,CAAO,CAAC,MAAM,EAAE,EAAE;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACtB,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACnB,OAAM;YACP,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,aAAqB;IACzG,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAA6C,CAAC,MAAM,EAAE,EAAE;QACjF,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,WAAW,GAA2B,GAAG,EAAE,CAAC,SAAS,CAAA;QACzD,IAAI,UAAU,GAAqC,GAAG,EAAE,CAAC,SAAS,CAAA;QAClE,MAAM,WAAW,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3D,WAAW,GAAG,OAAO,CAAA;YACrB,UAAU,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;YACjD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,aAAa,EAAE,CAAC,CAAA;YACzE,IAAI,UAAU,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACzC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,CAAA;gBACnC,OAAM;YACP,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,iCAAiC,CAAC,CAAA;gBACzD,OAAM;YACP,CAAC;YACD,OAAO,GAAG,IAAI,CAAA;YAEd,IAAI,CAAC;gBACJ,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;gBACrD,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAA;gBAC1E,WAAW,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,8DAA8D,CAAC,CAAA;gBACtF,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAA;YACrC,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;YAChC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,EAAE,KAAK,EAAE,uCAAuC,EAAE,CAAC,CAAC,CAAC,CAAA;gBACvG,OAAM;YACP,CAAC;YAED,MAAM,CACL,MAAM,CAAC,OAAO,CAAC;gBACd,WAAW,EAAE,IAAI,GAAG,CAAC,UAAU,aAAa,IAAI,OAAO,CAAC,IAAI,WAAW,CAAC;gBACxE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;oBAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,WAAW;oBACtB,KAAK,EAAE,iBAAiB;iBACxB,CAAC;gBACF,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC;aAC1B,CAAC,CACF,CAAA;QACF,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,OAAO,EAAuB,CAAC,mCAAmC,EAAE;IACnH,YAAY,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;IAC3D,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;QAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;QAE1C,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EAC7E,IAA8C;YAE9C,KAAK,CAAC,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAA;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,CAAA;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;YAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CACjF,iBAAiB,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,CAClE,CAAA;YAED,OAAO,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,OAAO,CACb,kBAAkB,CAAC,WAAW,CAAC;gBAC9B,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC;gBAC/E,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CACjB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CACV,IAAI,yBAAyB,CAAC;oBAC7B,QAAQ,EAAE,oBAAoB;oBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,KAAK,EAAE,IAAI;iBACX,CAAC,CACF,CACD,CACD;aACF,CAAC,CACF,EACD,MAAM,CAAC,SAAS,CAAC;gBAChB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACvB,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtF,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CACxB,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;gBACtF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;aAC5G,CAAC,CACF,CAAA;QACF,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAAE,EAC7E,IAAI,EACJ,WAAW,EACX,YAAY,GACO;YACnB,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC3B,CAAC,YAAY,EAAE,oBAAoB,CAAC;gBACpC,CAAC,WAAW,EAAE,SAAS,CAAC;gBACxB,CAAC,MAAM,EAAE,IAAI,CAAC;gBACd,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACxC,CAAC,eAAe,EAAE,YAAY,CAAC;aAC/B,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAC3E,YAAoB,EACpB,QAAQ,GAAW,SAAS;YAE5B,OAAO,KAAK,CAAC,CAAC,aAAa,CAAC;gBAC3B,CAAC,YAAY,EAAE,eAAe,CAAC;gBAC/B,CAAC,WAAW,EAAE,QAAQ,CAAC;gBACvB,CAAC,eAAe,EAAE,YAAY,CAAC;aAC/B,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAAE,aAA4B;YACnG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;YAC/B,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;YAErE,KAAK,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC;gBACjC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC;oBAC5B,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;oBACtD,YAAY,EACX,aAAa,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC;oBACnG,SAAS;oBACT,QAAQ,EAAE,SAAS;iBACnB,CAAC;aACF,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAC7D,gBAAwE;YAExE,KAAK,CAAC,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAA;YAC1C,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAA;YAC9C,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAA;YACvC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;YAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAClD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,SAAS,EAAE,CAAA;YAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;gBAC7C,MAAM;gBACN,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,KAAK;gBACL,aAAa;aACb,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,IAAI,CACtD,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,EACrC,MAAM,CAAC,WAAW,CAAC;gBAClB,QAAQ,EAAE,mBAAmB;gBAC7B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,EAAE;aAC3C,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/B,CAAA;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAA;YAC5F,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,CAAC,IAAI,yBAAyB,CAAC;oBAC3C,QAAQ,EAAE,oBAAoB;oBAC9B,KAAK,EAAE,sDAAsD;iBAC7D,CAAC,CAAA;YACH,CAAC;YACD,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAW,CAAA;IACjE,CAAC,CAAC;CACF,CAAC;CAAG"}
|
package/build/esm/CommandPath.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Telemetry-safe command-path extraction. Only tokens that sit in legal
|
|
3
|
-
* command-path positions of the tree below are ever reported — never
|
|
4
|
-
* free-form args, URLs, or queries. The walk stops at the first token that
|
|
5
|
-
* isn't a subcommand of the current node, so positional user input can't
|
|
6
|
-
* leak even when it happens to equal a command word
|
|
7
|
-
* (`expandai search snap_abc login` reports just `search`). Choice-arg
|
|
8
|
-
* values (hosts, scopes) are positional data and deliberately absent.
|
|
9
|
-
*/
|
|
10
|
-
const COMMAND_TREE = new Map([
|
|
11
|
-
['fetch', new Set()],
|
|
12
|
-
['search', new Set()],
|
|
13
|
-
['login', new Set()],
|
|
14
|
-
['whoami', new Set()],
|
|
15
|
-
['logout', new Set()],
|
|
16
|
-
['init', new Set()],
|
|
17
|
-
['status', new Set()],
|
|
18
|
-
['uninstall', new Set()],
|
|
19
|
-
['mcp', new Set(['run', 'install', 'uninstall'])],
|
|
20
|
-
['skill', new Set(['install', 'uninstall'])],
|
|
21
|
-
['hook', new Set(['claude-code', 'opencode', 'install', 'uninstall'])],
|
|
22
|
-
['telemetry', new Set(['status', 'enable', 'disable'])],
|
|
23
|
-
]);
|
|
24
|
-
export function commandFromArgv(argv) {
|
|
25
|
-
const [first, second] = argv.slice(2);
|
|
26
|
-
const subcommands = first === undefined ? undefined : COMMAND_TREE.get(first);
|
|
27
|
-
if (first === undefined || subcommands === undefined)
|
|
28
|
-
return '(none)';
|
|
29
|
-
return second !== undefined && subcommands.has(second) ? `${first} ${second}` : first;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=CommandPath.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPath.js","sourceRoot":"","sources":["../../src/CommandPath.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,CAA8B;IACzD,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;IACpB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;IACpB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE,CAAC;IACxB,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACjD,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5C,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACtE,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;CACvD,CAAC,CAAA;AAEF,MAAM,UAAU,eAAe,CAAC,IAAuB;IACtD,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACrC,MAAM,WAAW,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7E,IAAI,KAAK,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IACrE,OAAO,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AACtF,CAAC"}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { Args, Command, HelpDoc, Options } from '@effect/cli';
|
|
2
|
-
import { DEFAULT_PLAYGROUND_HOST, resolvePlaygroundHost } from '@expandai/sdk/Playground';
|
|
3
|
-
import { Console, Effect, Match, Option, Schema, String } from 'effect';
|
|
4
|
-
import { ApiClient } from '../ApiClient.js';
|
|
5
|
-
import { withCitationFooter } from '../Hook/SnapshotNote.js';
|
|
6
|
-
import { highlightMarkdownAnsi, shouldColorizeMarkdown } from '../MarkdownAnsi.js';
|
|
7
|
-
import { renderSnippets, withCitationUrls } from '../Snippets.js';
|
|
8
|
-
export class MarkdownUnavailable extends Schema.TaggedError()('MarkdownUnavailable', {
|
|
9
|
-
url: Schema.String,
|
|
10
|
-
}) {
|
|
11
|
-
get message() {
|
|
12
|
-
return `No markdown content was returned for ${this.url}`;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export class SnippetsUnavailable extends Schema.TaggedError()('SnippetsUnavailable', {
|
|
16
|
-
url: Schema.String,
|
|
17
|
-
query: Schema.String,
|
|
18
|
-
}) {
|
|
19
|
-
get message() {
|
|
20
|
-
return `No snippets were returned for ${this.url} matching '${this.query}'`;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
// `Options.text('format').pipe(Options.withDefault('text'))` is optional, so
|
|
24
|
-
// when the user types `expandai fetch --format` (no value) the parser falls
|
|
25
|
-
// through to the default and `--format` is fed to the URL positional. WHATWG's
|
|
26
|
-
// URL parser accepts `https://--format` as a host-only URL, so without this
|
|
27
|
-
// guard the bogus value reaches the API. Reject flag-looking input up front,
|
|
28
|
-
// and require a hostname with a dot (or `localhost`) so `fetch help` etc. fail
|
|
29
|
-
// here with a clear message instead of via the API's schema decoder.
|
|
30
|
-
//
|
|
31
|
-
// `Args.mapEffect` is preferred over `Args.withSchema` because the latter
|
|
32
|
-
// renders failures with `ParseResult.TreeFormatter`, which dumps the full
|
|
33
|
-
// schema-decode trace.
|
|
34
|
-
export const parseUrlArg = Effect.fn('Fetch.parseUrlArg')(function* (raw) {
|
|
35
|
-
if (raw.startsWith('-')) {
|
|
36
|
-
return yield* Effect.fail(HelpDoc.p(`Missing argument <url> (received '${raw}')`));
|
|
37
|
-
}
|
|
38
|
-
const candidate = raw.startsWith('http://') || raw.startsWith('https://') ? raw : `https://${raw}`;
|
|
39
|
-
const parsed = yield* Effect.try({
|
|
40
|
-
try: () => new URL(candidate),
|
|
41
|
-
catch: () => HelpDoc.p(`Invalid URL '${raw}'`),
|
|
42
|
-
});
|
|
43
|
-
if (!parsed.hostname.includes('.') && parsed.hostname !== 'localhost') {
|
|
44
|
-
return yield* Effect.fail(HelpDoc.p(`URL must contain a valid domain (got '${raw}')`));
|
|
45
|
-
}
|
|
46
|
-
return parsed;
|
|
47
|
-
});
|
|
48
|
-
const url = Args.text({ name: 'url' }).pipe(Args.mapEffect(parseUrlArg));
|
|
49
|
-
const format = Options.text('format').pipe(Options.withDefault('text'), Options.withDescription('Output format (text or json)'), Options.withSchema(Schema.Literal('text', 'json')));
|
|
50
|
-
const search = Options.text('search').pipe(Options.optional, Options.withDescription('Semantic search query. Returns relevant snippets instead of markdown.'));
|
|
51
|
-
const maxResults = Options.integer('max-results').pipe(Options.withDefault(5), Options.withDescription('Maximum snippets to return when using --search (default: 5)'), Options.withSchema(Schema.Int.pipe(Schema.greaterThanOrEqualTo(1), Schema.lessThanOrEqualTo(50))));
|
|
52
|
-
const minScore = Options.float('min-score').pipe(Options.withDefault(0.6), Options.withDescription('Minimum snippet relevance score from 0 to 1 when using --search (default: 0.6)'), Options.withSchema(Schema.Number.pipe(Schema.greaterThanOrEqualTo(0), Schema.lessThanOrEqualTo(1))));
|
|
53
|
-
const fetchConfig = {
|
|
54
|
-
url,
|
|
55
|
-
format,
|
|
56
|
-
search,
|
|
57
|
-
maxResults,
|
|
58
|
-
minScore,
|
|
59
|
-
};
|
|
60
|
-
export const FetchCommand = Command.make('fetch', fetchConfig).pipe(Command.withDescription('Fetch content from a URL as markdown or snippets'), Command.withHandler(Effect.fnUntraced(function* ({ format, maxResults, minScore, search, url }) {
|
|
61
|
-
const client = yield* ApiClient;
|
|
62
|
-
const query = Option.getOrUndefined(search);
|
|
63
|
-
const fetchRequest = query === undefined
|
|
64
|
-
? {
|
|
65
|
-
params: {},
|
|
66
|
-
payload: {
|
|
67
|
-
url: url.toString(),
|
|
68
|
-
include: { markdown: true },
|
|
69
|
-
},
|
|
70
|
-
}
|
|
71
|
-
: {
|
|
72
|
-
params: {},
|
|
73
|
-
payload: {
|
|
74
|
-
url: url.toString(),
|
|
75
|
-
include: { markdown: true, json: true },
|
|
76
|
-
search: {
|
|
77
|
-
query,
|
|
78
|
-
maxResults,
|
|
79
|
-
minScore,
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
const output = format === 'text' && query === undefined
|
|
84
|
-
? yield* client.fetchFetch(fetchRequest).pipe(Effect.flatMap((markdown) => String.isNonEmpty(markdown)
|
|
85
|
-
? Effect.succeed(markdown)
|
|
86
|
-
: Effect.fail(new MarkdownUnavailable({ url: url.toString() }))),
|
|
87
|
-
// Interactive terminals get ANSI-highlighted markdown. Piped output is
|
|
88
|
-
// being read by an agent, so it also carries the citation contract —
|
|
89
|
-
// this is the third fetch path (with the hook and the MCP tools) and
|
|
90
|
-
// was the only one that shipped evidence ids without telling anyone
|
|
91
|
-
// to use them.
|
|
92
|
-
Effect.map((markdown) => shouldColorizeMarkdown() ? highlightMarkdownAnsi(markdown) : withCitationFooter(markdown)))
|
|
93
|
-
: yield* client.fetchFetchResult(fetchRequest).pipe(Effect.flatMap((fetched) => Match.value(format).pipe(Match.when('text', () => {
|
|
94
|
-
const snippets = fetched.data?.search?.snippets ?? [];
|
|
95
|
-
return snippets.length === 0
|
|
96
|
-
? Effect.fail(new SnippetsUnavailable({ url: url.toString(), query: query ?? '' }))
|
|
97
|
-
: Effect.succeed(renderSnippets(fetched.meta.snapshotId, resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST), snippets));
|
|
98
|
-
}), Match.when('json', () => {
|
|
99
|
-
// Snippets carry a citation link in every other output path
|
|
100
|
-
// (text here, and both MCP tools). Without it a JSON consumer
|
|
101
|
-
// cannot cite what it just searched.
|
|
102
|
-
const search = fetched.data?.search;
|
|
103
|
-
const cited = search == null
|
|
104
|
-
? fetched
|
|
105
|
-
: {
|
|
106
|
-
...fetched,
|
|
107
|
-
data: {
|
|
108
|
-
...fetched.data,
|
|
109
|
-
search: {
|
|
110
|
-
...search,
|
|
111
|
-
snippets: withCitationUrls(fetched.meta.snapshotId, resolvePlaygroundHost(fetched.meta.playground, DEFAULT_PLAYGROUND_HOST), search.snippets),
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
return Schema.encode(Schema.parseJson(Schema.Unknown, { space: 2 }))(cited);
|
|
116
|
-
}), Match.exhaustive)));
|
|
117
|
-
yield* Console.log(output);
|
|
118
|
-
}, Effect.provide(ApiClient.Default))));
|
|
119
|
-
//# sourceMappingURL=Fetch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Fetch.js","sourceRoot":"","sources":["../../../src/Commands/Fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Args, Command } from '@effect/cli';
|
|
2
|
-
import { Effect } from 'effect';
|
|
3
|
-
import { ClaudeHook } from '../Hook/Claude.js';
|
|
4
|
-
import { OpencodeHook } from '../Hook/Opencode.js';
|
|
5
|
-
import { HookInstaller } from '../Install/Hook.js';
|
|
6
|
-
const ClaudeRunCommand = Command.make('claude-code').pipe(Command.withDescription('Run the Claude Code WebFetch hook protocol over stdio'), Command.withHandler(() => Effect.flatMap(ClaudeHook, (hook) => hook.runProtocol())));
|
|
7
|
-
const OpencodeRunCommand = Command.make('opencode').pipe(Command.withDescription('Run the OpenCode webfetch plugin protocol over stdio'), Command.withHandler(() => Effect.flatMap(OpencodeHook, (hook) => hook.runProtocol())));
|
|
8
|
-
const hostArg = Args.choice([
|
|
9
|
-
['claude-code', 'claude-code'],
|
|
10
|
-
['opencode', 'opencode'],
|
|
11
|
-
]);
|
|
12
|
-
const scopeArg = Args.choice([
|
|
13
|
-
['global', 'global'],
|
|
14
|
-
['project', 'project'],
|
|
15
|
-
]);
|
|
16
|
-
const InstallSubCommand = Command.make('install', { host: hostArg, scope: scopeArg }).pipe(Command.withDescription('Install the expandai MCP server + webfetch hook for the chosen host + scope'), Command.withHandler(({ host, scope }) => Effect.flatMap(HookInstaller, (installer) => installer.install(host, scope))));
|
|
17
|
-
const UninstallSubCommand = Command.make('uninstall', { host: hostArg, scope: scopeArg }).pipe(Command.withDescription('Remove the expandai MCP server + webfetch hook for the chosen host + scope'), Command.withHandler(({ host, scope }) => Effect.flatMap(HookInstaller, (installer) => installer.uninstall(host, scope))));
|
|
18
|
-
export const HumanHookCommand = Command.make('hook').pipe(Command.withDescription('expandai hooks for AI coding assistants'), Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand, InstallSubCommand, UninstallSubCommand]));
|
|
19
|
-
export const AgentHookCommand = Command.make('hook').pipe(Command.withDescription('expandai hooks for AI coding assistants'), Command.withSubcommands([ClaudeRunCommand, OpencodeRunCommand]));
|
|
20
|
-
//# sourceMappingURL=Hook.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../src/Commands/Hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,uDAAuD,CAAC,EAChF,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CACnF,CAAA;AAED,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CACvD,OAAO,CAAC,eAAe,CAAC,sDAAsD,CAAC,EAC/E,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CACrF,CAAA;AAED,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC,aAAa,EAAE,aAAsB,CAAC;IACvC,CAAC,UAAU,EAAE,UAAmB,CAAC;CACjC,CAAC,CAAA;AACF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC,QAAQ,EAAE,QAAiB,CAAC;IAC7B,CAAC,SAAS,EAAE,SAAkB,CAAC;CAC/B,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CACzF,OAAO,CAAC,eAAe,CAAC,6EAA6E,CAAC,EACtG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC5E,CACD,CAAA;AAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAC7F,OAAO,CAAC,eAAe,CAAC,4EAA4E,CAAC,EACrG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC9E,CACD,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,yCAAyC,CAAC,EAClE,OAAO,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CACvG,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,yCAAyC,CAAC,EAClE,OAAO,CAAC,eAAe,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAC/D,CAAA"}
|