expandai 0.0.0 → 0.0.2
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 +241 -6
- package/build/dts/ApiClient.d.ts +231 -0
- package/build/dts/ApiClient.d.ts.map +1 -0
- package/build/dts/Authentication.d.ts +23 -0
- package/build/dts/Authentication.d.ts.map +1 -0
- package/build/dts/BrowserOAuth.d.ts +99 -0
- package/build/dts/BrowserOAuth.d.ts.map +1 -0
- package/build/dts/Commands/Fetch.d.ts +30 -0
- package/build/dts/Commands/Fetch.d.ts.map +1 -0
- package/build/dts/Commands/Hook.d.ts +17 -0
- package/build/dts/Commands/Hook.d.ts.map +1 -0
- package/build/dts/Commands/Mcp.d.ts +11 -0
- package/build/dts/Commands/Mcp.d.ts.map +1 -0
- package/build/dts/Commands/McpRun.d.ts +5 -0
- package/build/dts/Commands/McpRun.d.ts.map +1 -0
- package/build/dts/Commands/Search.d.ts +21 -0
- package/build/dts/Commands/Search.d.ts.map +1 -0
- package/build/dts/Commands/Skill.d.ts +12 -0
- package/build/dts/Commands/Skill.d.ts.map +1 -0
- package/build/dts/Commands/Uninstall.d.ts +9 -0
- package/build/dts/Commands/Uninstall.d.ts.map +1 -0
- package/build/dts/Config.d.ts +105 -0
- package/build/dts/Config.d.ts.map +1 -0
- package/build/dts/DeviceAuth.d.ts +87 -0
- package/build/dts/DeviceAuth.d.ts.map +1 -0
- package/build/dts/Hook/Claude.d.ts +13 -0
- package/build/dts/Hook/Claude.d.ts.map +1 -0
- package/build/dts/Hook/Errors.d.ts +20 -0
- package/build/dts/Hook/Errors.d.ts.map +1 -0
- package/build/dts/Hook/Opencode.d.ts +13 -0
- package/build/dts/Hook/Opencode.d.ts.map +1 -0
- package/build/dts/Hook/SnapshotNote.d.ts +8 -0
- package/build/dts/Hook/SnapshotNote.d.ts.map +1 -0
- package/build/dts/Install/Claude/Hook.d.ts +60 -0
- package/build/dts/Install/Claude/Hook.d.ts.map +1 -0
- package/build/dts/Install/Claude/Mcp.d.ts +45 -0
- package/build/dts/Install/Claude/Mcp.d.ts.map +1 -0
- package/build/dts/Install/Claude/Skill.d.ts +24 -0
- package/build/dts/Install/Claude/Skill.d.ts.map +1 -0
- package/build/dts/Install/Codex/Mcp.d.ts +39 -0
- package/build/dts/Install/Codex/Mcp.d.ts.map +1 -0
- package/build/dts/Install/Codex/Skill.d.ts +20 -0
- package/build/dts/Install/Codex/Skill.d.ts.map +1 -0
- package/build/dts/Install/Cursor/Mcp.d.ts +45 -0
- package/build/dts/Install/Cursor/Mcp.d.ts.map +1 -0
- package/build/dts/Install/Cursor/Skill.d.ts +27 -0
- package/build/dts/Install/Cursor/Skill.d.ts.map +1 -0
- package/build/dts/Install/Domain.d.ts +73 -0
- package/build/dts/Install/Domain.d.ts.map +1 -0
- package/build/dts/Install/Hook.d.ts +30 -0
- package/build/dts/Install/Hook.d.ts.map +1 -0
- package/build/dts/Install/Mcp.d.ts +28 -0
- package/build/dts/Install/Mcp.d.ts.map +1 -0
- package/build/dts/Install/Opencode/Hook.d.ts +23 -0
- package/build/dts/Install/Opencode/Hook.d.ts.map +1 -0
- package/build/dts/Install/Opencode/Mcp.d.ts +47 -0
- package/build/dts/Install/Opencode/Mcp.d.ts.map +1 -0
- package/build/dts/Install/Opencode/Skill.d.ts +24 -0
- package/build/dts/Install/Opencode/Skill.d.ts.map +1 -0
- package/build/dts/Install/Skill.d.ts +32 -0
- package/build/dts/Install/Skill.d.ts.map +1 -0
- package/build/dts/Install/Uninstall.d.ts +32 -0
- package/build/dts/Install/Uninstall.d.ts.map +1 -0
- package/build/dts/Mcp/ExpandDocs.d.ts +7 -0
- package/build/dts/Mcp/ExpandDocs.d.ts.map +1 -0
- package/build/dts/Mcp/RequestHeaders.d.ts +15 -0
- package/build/dts/Mcp/RequestHeaders.d.ts.map +1 -0
- package/build/dts/Mcp/Server.d.ts +10 -0
- package/build/dts/Mcp/Server.d.ts.map +1 -0
- package/build/dts/Mcp/Toolkit.d.ts +3 -0
- package/build/dts/Mcp/Toolkit.d.ts.map +1 -0
- package/build/dts/Mcp/tools/Citations.d.ts +237 -0
- package/build/dts/Mcp/tools/Citations.d.ts.map +1 -0
- package/build/dts/Mcp/tools/Fetch.d.ts +167 -0
- package/build/dts/Mcp/tools/Fetch.d.ts.map +1 -0
- package/build/dts/Snippets.d.ts +19 -0
- package/build/dts/Snippets.d.ts.map +1 -0
- package/build/dts/index.d.ts +2 -0
- package/build/dts/index.d.ts.map +1 -0
- package/build/dts/main.d.ts +3 -0
- package/build/dts/main.d.ts.map +1 -0
- package/build/esm/ApiClient.js +182 -0
- package/build/esm/ApiClient.js.map +1 -0
- package/build/esm/Authentication.js +112 -0
- package/build/esm/Authentication.js.map +1 -0
- package/build/esm/BrowserOAuth.js +254 -0
- package/build/esm/BrowserOAuth.js.map +1 -0
- package/build/esm/Commands/Fetch.js +95 -0
- package/build/esm/Commands/Fetch.js.map +1 -0
- package/build/esm/Commands/Hook.js +20 -0
- package/build/esm/Commands/Hook.js.map +1 -0
- package/build/esm/Commands/Mcp.js +19 -0
- package/build/esm/Commands/Mcp.js.map +1 -0
- package/build/esm/Commands/McpRun.js +15 -0
- package/build/esm/Commands/McpRun.js.map +1 -0
- package/build/esm/Commands/Search.js +43 -0
- package/build/esm/Commands/Search.js.map +1 -0
- package/build/esm/Commands/Skill.js +17 -0
- package/build/esm/Commands/Skill.js.map +1 -0
- package/build/esm/Commands/Uninstall.js +28 -0
- package/build/esm/Commands/Uninstall.js.map +1 -0
- package/build/esm/Config.js +145 -0
- package/build/esm/Config.js.map +1 -0
- package/build/esm/DeviceAuth.js +127 -0
- package/build/esm/DeviceAuth.js.map +1 -0
- package/build/esm/Hook/Claude.js +74 -0
- package/build/esm/Hook/Claude.js.map +1 -0
- package/build/esm/Hook/Errors.js +18 -0
- package/build/esm/Hook/Errors.js.map +1 -0
- package/build/esm/Hook/Opencode.js +50 -0
- package/build/esm/Hook/Opencode.js.map +1 -0
- package/build/esm/Hook/SnapshotNote.js +18 -0
- package/build/esm/Hook/SnapshotNote.js.map +1 -0
- package/build/esm/Install/Claude/Hook.js +89 -0
- package/build/esm/Install/Claude/Hook.js.map +1 -0
- package/build/esm/Install/Claude/Mcp.js +71 -0
- package/build/esm/Install/Claude/Mcp.js.map +1 -0
- package/build/esm/Install/Claude/Skill.js +34 -0
- package/build/esm/Install/Claude/Skill.js.map +1 -0
- package/build/esm/Install/Codex/Mcp.js +92 -0
- package/build/esm/Install/Codex/Mcp.js.map +1 -0
- package/build/esm/Install/Codex/Skill.js +30 -0
- package/build/esm/Install/Codex/Skill.js.map +1 -0
- package/build/esm/Install/Cursor/Mcp.js +71 -0
- package/build/esm/Install/Cursor/Mcp.js.map +1 -0
- package/build/esm/Install/Cursor/Skill.js +37 -0
- package/build/esm/Install/Cursor/Skill.js.map +1 -0
- package/build/esm/Install/Domain.js +105 -0
- package/build/esm/Install/Domain.js.map +1 -0
- package/build/esm/Install/Hook.js +38 -0
- package/build/esm/Install/Hook.js.map +1 -0
- package/build/esm/Install/Mcp.js +40 -0
- package/build/esm/Install/Mcp.js.map +1 -0
- package/build/esm/Install/Opencode/Hook.js +44 -0
- package/build/esm/Install/Opencode/Hook.js.map +1 -0
- package/build/esm/Install/Opencode/Mcp.js +73 -0
- package/build/esm/Install/Opencode/Mcp.js.map +1 -0
- package/build/esm/Install/Opencode/Skill.js +34 -0
- package/build/esm/Install/Opencode/Skill.js.map +1 -0
- package/build/esm/Install/Opencode/expandai-webfetch.js +38 -0
- package/build/esm/Install/Skill.js +41 -0
- package/build/esm/Install/Skill.js.map +1 -0
- package/build/esm/Install/Uninstall.js +49 -0
- package/build/esm/Install/Uninstall.js.map +1 -0
- package/build/esm/Mcp/ExpandDocs.js +64 -0
- package/build/esm/Mcp/ExpandDocs.js.map +1 -0
- package/build/esm/Mcp/RequestHeaders.js +13 -0
- package/build/esm/Mcp/RequestHeaders.js.map +1 -0
- package/build/esm/Mcp/Server.js +11 -0
- package/build/esm/Mcp/Server.js.map +1 -0
- package/build/esm/Mcp/Toolkit.js +16 -0
- package/build/esm/Mcp/Toolkit.js.map +1 -0
- package/build/esm/Mcp/tools/Citations.js +92 -0
- package/build/esm/Mcp/tools/Citations.js.map +1 -0
- package/build/esm/Mcp/tools/Fetch.js +141 -0
- package/build/esm/Mcp/tools/Fetch.js.map +1 -0
- package/build/esm/Snippets.js +18 -0
- package/build/esm/Snippets.js.map +1 -0
- package/build/esm/index.js +2 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/main.js +97 -0
- package/build/esm/main.js.map +1 -0
- package/build/skills/expandai/SKILL.md +72 -0
- package/package.json +72 -10
- package/src/ApiClient.ts +257 -0
- package/src/Authentication.ts +164 -0
- package/src/BrowserOAuth.ts +361 -0
- package/src/Commands/Fetch.ts +157 -0
- package/src/Commands/Hook.ts +48 -0
- package/src/Commands/Mcp.ts +30 -0
- package/src/Commands/McpRun.ts +25 -0
- package/src/Commands/Search.ts +92 -0
- package/src/Commands/Skill.ts +30 -0
- package/src/Commands/Uninstall.ts +38 -0
- package/src/Config.ts +195 -0
- package/src/DeviceAuth.ts +193 -0
- package/src/Hook/Claude.ts +81 -0
- package/src/Hook/Errors.ts +19 -0
- package/src/Hook/Opencode.ts +58 -0
- package/src/Hook/SnapshotNote.ts +18 -0
- package/src/Install/Claude/Hook.ts +133 -0
- package/src/Install/Claude/Mcp.ts +82 -0
- package/src/Install/Claude/Skill.ts +44 -0
- package/src/Install/Codex/Mcp.ts +109 -0
- package/src/Install/Codex/Skill.ts +40 -0
- package/src/Install/Cursor/Mcp.ts +82 -0
- package/src/Install/Cursor/Skill.ts +47 -0
- package/src/Install/Domain.ts +148 -0
- package/src/Install/Hook.ts +50 -0
- package/src/Install/Mcp.ts +71 -0
- package/src/Install/Opencode/Hook.ts +55 -0
- package/src/Install/Opencode/Mcp.ts +84 -0
- package/src/Install/Opencode/Skill.ts +44 -0
- package/src/Install/Opencode/expandai-webfetch.d.ts +23 -0
- package/src/Install/Opencode/expandai-webfetch.js +38 -0
- package/src/Install/Skill.ts +57 -0
- package/src/Install/Uninstall.ts +82 -0
- package/src/Mcp/ExpandDocs.ts +71 -0
- package/src/Mcp/RequestHeaders.ts +16 -0
- package/src/Mcp/Server.ts +14 -0
- package/src/Mcp/Toolkit.ts +21 -0
- package/src/Mcp/tools/Citations.ts +110 -0
- package/src/Mcp/tools/Fetch.ts +177 -0
- package/src/Snippets.ts +32 -0
- package/src/index.ts +1 -0
- package/src/main.ts +146 -0
- package/bun.lockb +0 -0
- package/index.ts +0 -1
- package/tsconfig.json +0 -27
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// MCP-facing result wrappers that add a ready-made `citationUrl` to every search snippet, so the
|
|
2
|
+
// agent can hand the user an auditable playground link without assembling URLs itself. Wraps the
|
|
3
|
+
// SDK's `json`-recovering decode types (`@expandai/sdk/FetchJson`) and reuses generated leaf
|
|
4
|
+
// schemas; `Generated.ts` is left untouched.
|
|
5
|
+
import * as Generated from '@expandai/sdk/Generated';
|
|
6
|
+
import { citationUrl, playgroundBase, resolvePlaygroundHost } from '@expandai/sdk/Playground';
|
|
7
|
+
import { Schema as S } from 'effect';
|
|
8
|
+
export class CitedSnippet extends S.Class('CitedSnippet')({
|
|
9
|
+
type: S.optionalWith(S.Literal('text'), { nullable: true, default: () => 'text' }),
|
|
10
|
+
source: S.Literal('markdown', 'appendix', 'statejson'),
|
|
11
|
+
text: S.String,
|
|
12
|
+
json: S.optionalWith(S.Unknown, { nullable: true }),
|
|
13
|
+
score: S.Number.pipe(S.greaterThanOrEqualTo(0), S.lessThanOrEqualTo(1)),
|
|
14
|
+
location: S.optionalWith(Generated.FetchSearchSnippetLocation, { nullable: true }),
|
|
15
|
+
citationUrl: S.String.annotations({
|
|
16
|
+
description: 'Public playground link auditing this exact snippet. Return it to the user verbatim.',
|
|
17
|
+
}),
|
|
18
|
+
}) {
|
|
19
|
+
}
|
|
20
|
+
export class CitedSearchResult extends S.Class('CitedSearchResult')({
|
|
21
|
+
query: S.String,
|
|
22
|
+
snippets: S.Array(CitedSnippet),
|
|
23
|
+
meta: S.optionalWith(Generated.FetchSearchMeta, { nullable: true }),
|
|
24
|
+
}) {
|
|
25
|
+
}
|
|
26
|
+
export class CitedObjectModeResult extends S.Class('CitedObjectModeResult')({
|
|
27
|
+
meta: Generated.FetchObjectModeMeta,
|
|
28
|
+
markdown: S.String,
|
|
29
|
+
json: S.Array(Generated.FetchObjectModeEvidence),
|
|
30
|
+
data: S.optionalWith(S.Struct({
|
|
31
|
+
assets: S.optionalWith(S.Array(Generated.FetchAssetReference), { nullable: true }),
|
|
32
|
+
captureTelemetry: S.optionalWith(Generated.CaptureTelemetryInfo, { nullable: true }),
|
|
33
|
+
search: S.optionalWith(CitedSearchResult, { nullable: true }),
|
|
34
|
+
}), { nullable: true }),
|
|
35
|
+
}) {
|
|
36
|
+
}
|
|
37
|
+
export class CitedSnapshotSearchResult extends S.Class('CitedSnapshotSearchResult')({
|
|
38
|
+
snapshotId: S.String.pipe(S.minLength(1)),
|
|
39
|
+
response: Generated.ResponseInfo,
|
|
40
|
+
search: CitedSearchResult,
|
|
41
|
+
durationMs: S.Number.pipe(S.greaterThanOrEqualTo(0)),
|
|
42
|
+
playground: S.String.annotations({ description: 'Public playground link for the whole snapshot.' }),
|
|
43
|
+
}) {
|
|
44
|
+
}
|
|
45
|
+
function toCitedSnippet(snapshotId, host, snippet) {
|
|
46
|
+
return new CitedSnippet({
|
|
47
|
+
type: snippet.type,
|
|
48
|
+
source: snippet.source,
|
|
49
|
+
text: snippet.text,
|
|
50
|
+
json: snippet.json,
|
|
51
|
+
score: snippet.score,
|
|
52
|
+
location: snippet.location,
|
|
53
|
+
citationUrl: citationUrl(snapshotId, snippet.source, snippet.location, host),
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function toCitedSearch(snapshotId, host, search) {
|
|
57
|
+
return new CitedSearchResult({
|
|
58
|
+
query: search.query,
|
|
59
|
+
snippets: search.snippets.map((snippet) => toCitedSnippet(snapshotId, host, snippet)),
|
|
60
|
+
meta: search.meta,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Add `citationUrl` to each snippet of an object-mode fetch result. */
|
|
64
|
+
export function enrichObjectModeResult(result, fallbackHost) {
|
|
65
|
+
// `meta.playground` is server-resolved (staging-safe); fall back to the configured host only if
|
|
66
|
+
// it is somehow not a parseable URL.
|
|
67
|
+
const host = resolvePlaygroundHost(result.meta.playground, fallbackHost);
|
|
68
|
+
const data = result.data;
|
|
69
|
+
return new CitedObjectModeResult({
|
|
70
|
+
meta: result.meta,
|
|
71
|
+
markdown: result.markdown,
|
|
72
|
+
json: result.json,
|
|
73
|
+
data: data == null
|
|
74
|
+
? data
|
|
75
|
+
: {
|
|
76
|
+
assets: data.assets,
|
|
77
|
+
captureTelemetry: data.captureTelemetry,
|
|
78
|
+
search: data.search == null ? data.search : toCitedSearch(result.meta.snapshotId, host, data.search),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/** Add `citationUrl` to each snippet of a snapshot-search result (no server `meta.playground`). */
|
|
83
|
+
export function enrichSnapshotSearchResult(result, host) {
|
|
84
|
+
return new CitedSnapshotSearchResult({
|
|
85
|
+
snapshotId: result.snapshotId,
|
|
86
|
+
response: result.response,
|
|
87
|
+
search: toCitedSearch(result.snapshotId, host, result.search),
|
|
88
|
+
durationMs: result.durationMs,
|
|
89
|
+
playground: playgroundBase(result.snapshotId, host),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=Citations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Citations.js","sourceRoot":"","sources":["../../../../src/Mcp/tools/Citations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Tool } from '@effect/ai';
|
|
2
|
+
import { Effect, Schema, String } from 'effect';
|
|
3
|
+
import { ApiClient } from '../../ApiClient.js';
|
|
4
|
+
import { ConfigManager } from '../../Config.js';
|
|
5
|
+
import { CitedObjectModeResult, CitedSnapshotSearchResult, enrichObjectModeResult, enrichSnapshotSearchResult, } from './Citations.js';
|
|
6
|
+
export class FetchSearchParams extends Schema.Class('FetchSearchParams')({
|
|
7
|
+
query: Schema.NonEmptyTrimmedString.annotations({
|
|
8
|
+
description: 'Search query. When provided, fetch returns search results only.',
|
|
9
|
+
}),
|
|
10
|
+
maxResults: Schema.optionalWith(Schema.Int.pipe(Schema.between(1, 50)), { default: () => 5 }).annotations({
|
|
11
|
+
description: 'Maximum snippets to return.',
|
|
12
|
+
default: 5,
|
|
13
|
+
}),
|
|
14
|
+
minScore: Schema.optionalWith(Schema.Number.pipe(Schema.between(0, 1)), { default: () => 0 }).annotations({
|
|
15
|
+
description: 'Minimum snippet relevance score from 0 to 1.',
|
|
16
|
+
default: 0,
|
|
17
|
+
}),
|
|
18
|
+
}) {
|
|
19
|
+
}
|
|
20
|
+
export class FetchParams extends Schema.Class('FetchParams')({
|
|
21
|
+
url: Schema.String.annotations({
|
|
22
|
+
description: 'The URL to fetch content from',
|
|
23
|
+
}),
|
|
24
|
+
search: Schema.optional(FetchSearchParams).annotations({
|
|
25
|
+
description: 'Semantic search configuration. When provided, the API returns snippets under data.search.snippets.',
|
|
26
|
+
}),
|
|
27
|
+
includeMeta: Schema.optionalWith(Schema.Boolean, { default: () => false }).annotations({
|
|
28
|
+
description: 'Include page meta tags (title, description, Open Graph)',
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
includeAppendix: Schema.optionalWith(Schema.Boolean, { default: () => false }).annotations({
|
|
32
|
+
description: 'Include extracted links and sidebar content',
|
|
33
|
+
default: false,
|
|
34
|
+
}),
|
|
35
|
+
includeJson: Schema.optionalWith(Schema.Boolean, { default: () => true }).annotations({
|
|
36
|
+
description: 'Include JSON extracted from network responses and DOM',
|
|
37
|
+
default: true,
|
|
38
|
+
}),
|
|
39
|
+
}) {
|
|
40
|
+
}
|
|
41
|
+
export class FetchSnapshotSearchParams extends Schema.Class('FetchSnapshotSearchParams')({
|
|
42
|
+
snapshotId: Schema.NonEmptyString.annotations({
|
|
43
|
+
description: 'Snapshot ID returned by a previous fetch response.',
|
|
44
|
+
}),
|
|
45
|
+
search: FetchSearchParams.annotations({
|
|
46
|
+
description: 'Semantic search configuration. Returns snippets from stored fetch artifacts.',
|
|
47
|
+
}),
|
|
48
|
+
includeMarkdown: Schema.optionalWith(Schema.Boolean, { default: () => true }).annotations({
|
|
49
|
+
description: 'Search the stored markdown corpus.',
|
|
50
|
+
default: true,
|
|
51
|
+
}),
|
|
52
|
+
includeAppendix: Schema.optionalWith(Schema.Boolean, { default: () => false }).annotations({
|
|
53
|
+
description: 'Search extracted appendix content.',
|
|
54
|
+
default: false,
|
|
55
|
+
}),
|
|
56
|
+
includeJson: Schema.optionalWith(Schema.Boolean, { default: () => true }).annotations({
|
|
57
|
+
description: 'Search stored State JSON.',
|
|
58
|
+
default: true,
|
|
59
|
+
}),
|
|
60
|
+
}) {
|
|
61
|
+
}
|
|
62
|
+
export const FetchTool = Tool.make('fetch', {
|
|
63
|
+
description: String.stripMargin(`
|
|
64
|
+
|Fetch and extract content from any URL.
|
|
65
|
+
|
|
|
66
|
+
|Returns object-mode output with markdown, front-matter metadata, and optional extracted JSON.
|
|
67
|
+
|When 'search' is set, the response also carries ranked snippets under data.search.snippets.
|
|
68
|
+
|Each snippet has a 'citationUrl' — a public playground link auditing that exact passage — and,
|
|
69
|
+
|for State JSON sources, the extracted 'json' value. Return the citationUrl to the user so they
|
|
70
|
+
|can verify the source.`),
|
|
71
|
+
parameters: FetchParams.fields,
|
|
72
|
+
success: CitedObjectModeResult,
|
|
73
|
+
failure: Schema.Defect,
|
|
74
|
+
failureMode: 'return',
|
|
75
|
+
})
|
|
76
|
+
.annotate(Tool.Readonly, true)
|
|
77
|
+
.annotate(Tool.Destructive, false);
|
|
78
|
+
export const FetchSearchTool = Tool.make('fetch_search', {
|
|
79
|
+
description: String.stripMargin(`
|
|
80
|
+
|Search a previous fetch by snapshotId without starting a new capture.
|
|
81
|
+
|
|
|
82
|
+
|Returns ranked snippets from stored markdown, appendix, or State JSON artifacts. Each snippet
|
|
83
|
+
|has a 'citationUrl' — a public playground link auditing that exact passage — and, for State JSON
|
|
84
|
+
|sources, the extracted 'json' value. The result also includes a whole-snapshot 'playground' link.
|
|
85
|
+
|Return the citationUrl to the user so they can verify the source.`),
|
|
86
|
+
parameters: FetchSnapshotSearchParams.fields,
|
|
87
|
+
success: CitedSnapshotSearchResult,
|
|
88
|
+
failure: Schema.Defect,
|
|
89
|
+
failureMode: 'return',
|
|
90
|
+
})
|
|
91
|
+
.annotate(Tool.Readonly, true)
|
|
92
|
+
.annotate(Tool.Destructive, false);
|
|
93
|
+
export class Fetch extends Effect.Service()('@expandai/cli/Mcp/Fetch', {
|
|
94
|
+
dependencies: [ApiClient.Default, ConfigManager.Default],
|
|
95
|
+
scoped: Effect.gen(function* () {
|
|
96
|
+
const client = yield* ApiClient;
|
|
97
|
+
const configManager = yield* ConfigManager;
|
|
98
|
+
const playgroundHost = yield* configManager.getPlaygroundHost();
|
|
99
|
+
const fetch = Effect.fn('Fetch.fetch')(function* ({ url, search, includeMeta, includeAppendix, includeJson, }) {
|
|
100
|
+
yield* Effect.logDebug(`Fetching: ${url}`).pipe(Effect.annotateLogs({ search: search?.query, includeMeta, includeAppendix, includeJson }));
|
|
101
|
+
const includeParam = includeAppendix && includeJson
|
|
102
|
+
? 'appendix,statejson'
|
|
103
|
+
: includeAppendix
|
|
104
|
+
? 'appendix'
|
|
105
|
+
: includeJson
|
|
106
|
+
? undefined
|
|
107
|
+
: '';
|
|
108
|
+
const result = yield* client.fetchFetchJson({
|
|
109
|
+
params: { include: includeParam },
|
|
110
|
+
payload: {
|
|
111
|
+
url,
|
|
112
|
+
include: {
|
|
113
|
+
markdown: true,
|
|
114
|
+
meta: includeMeta,
|
|
115
|
+
json: includeJson,
|
|
116
|
+
appendix: includeAppendix,
|
|
117
|
+
},
|
|
118
|
+
search,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
yield* Effect.logDebug(`Fetched successfully: ${result.meta.url}`);
|
|
122
|
+
return enrichObjectModeResult(result, playgroundHost);
|
|
123
|
+
});
|
|
124
|
+
const fetchSearch = Effect.fn('Fetch.fetchSearch')(function* ({ snapshotId, search, includeMarkdown, includeAppendix, includeJson, }) {
|
|
125
|
+
yield* Effect.logDebug(`Searching fetch snapshot: ${snapshotId}`).pipe(Effect.annotateLogs({ search: search.query, includeMarkdown, includeAppendix, includeJson }));
|
|
126
|
+
const result = yield* client.fetchFetchSearch({
|
|
127
|
+
snapshotId,
|
|
128
|
+
search,
|
|
129
|
+
include: {
|
|
130
|
+
markdown: includeMarkdown,
|
|
131
|
+
json: includeJson,
|
|
132
|
+
appendix: includeAppendix,
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
return enrichSnapshotSearchResult(result, playgroundHost);
|
|
136
|
+
});
|
|
137
|
+
return { fetch, fetchSearch };
|
|
138
|
+
}),
|
|
139
|
+
}) {
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=Fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Fetch.js","sourceRoot":"","sources":["../../../../src/Mcp/tools/Fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EACN,qBAAqB,EACrB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC1B,MAAM,gBAAgB,CAAA;AAEvB,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,KAAK,CAAoB,mBAAmB,CAAC,CAAC;IAC3F,KAAK,EAAE,MAAM,CAAC,qBAAqB,CAAC,WAAW,CAAC;QAC/C,WAAW,EAAE,iEAAiE;KAC9E,CAAC;IACF,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC;QACzG,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,CAAC;KACV,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC;QACzG,WAAW,EAAE,8CAA8C;QAC3D,OAAO,EAAE,CAAC;KACV,CAAC;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAc,aAAa,CAAC,CAAC;IACzE,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QAC9B,WAAW,EAAE,+BAA+B;KAC5C,CAAC;IACF,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC;QACtD,WAAW,EAAE,oGAAoG;KACjH,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC;QACtF,WAAW,EAAE,yDAAyD;QACtE,OAAO,EAAE,KAAK;KACd,CAAC;IACF,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC;QAC1F,WAAW,EAAE,6CAA6C;QAC1D,OAAO,EAAE,KAAK;KACd,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;QACrF,WAAW,EAAE,uDAAuD;QACpE,OAAO,EAAE,IAAI;KACb,CAAC;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,KAAK,CAA4B,2BAA2B,CAAC,CAAC;IACnH,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;QAC7C,WAAW,EAAE,oDAAoD;KACjE,CAAC;IACF,MAAM,EAAE,iBAAiB,CAAC,WAAW,CAAC;QACrC,WAAW,EAAE,8EAA8E;KAC3F,CAAC;IACF,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;QACzF,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,IAAI;KACb,CAAC;IACF,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC;QAC1F,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,KAAK;KACd,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;QACrF,WAAW,EAAE,2BAA2B;QACxC,OAAO,EAAE,IAAI;KACb,CAAC;CACF,CAAC;CAAG;AAEL,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IAC3C,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;;;;;;;0BAOP,CAAC;IAC1B,UAAU,EAAE,WAAW,CAAC,MAAM;IAC9B,OAAO,EAAE,qBAAqB;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,WAAW,EAAE,QAAQ;CACrB,CAAC;KACA,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;KAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IACxD,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;;;;;;qEAMoC,CAAC;IACrE,UAAU,EAAE,yBAAyB,CAAC,MAAM;IAC5C,OAAO,EAAE,yBAAyB;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,WAAW,EAAE,QAAQ;CACrB,CAAC;KACA,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;KAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AAOnC,MAAM,OAAO,KAAM,SAAQ,MAAM,CAAC,OAAO,EAAS,CAAC,yBAAyB,EAAE;IAC7E,YAAY,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;IACxD,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;QAC1C,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAA;QAE/D,MAAM,KAAK,GAA0B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,EAAE,EACxE,GAAG,EACH,MAAM,EACN,WAAW,EACX,eAAe,EACf,WAAW,GACE;YACb,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC,IAAI,CAC9C,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CACzF,CAAA;YAED,MAAM,YAAY,GACjB,eAAe,IAAI,WAAW;gBAC7B,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,eAAe;oBAChB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,WAAW;wBACZ,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,EAAE,CAAA;YACR,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;gBAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE;gBACjC,OAAO,EAAE;oBACR,GAAG;oBACH,OAAO,EAAE;wBACR,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,eAAe;qBACzB;oBACD,MAAM;iBACN;aACD,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;YAElE,OAAO,sBAAsB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,MAAM,WAAW,GAAgC,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAE,EAC1F,UAAU,EACV,MAAM,EACN,eAAe,EACf,eAAe,EACf,WAAW,GACgB;YAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC,IAAI,CACrE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,WAAW,EAAE,CAAC,CAC5F,CAAA;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;gBAC7C,UAAU;gBACV,MAAM;gBACN,OAAO,EAAE;oBACR,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,WAAW;oBACjB,QAAQ,EAAE,eAAe;iBACzB;aACD,CAAC,CAAA;YAEF,OAAO,0BAA0B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAyB,CAAA;IACrD,CAAC,CAAC;CACF,CAAC;CAAG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { citationUrl } from '@expandai/sdk/Playground';
|
|
2
|
+
import { Schema } from 'effect';
|
|
3
|
+
const encodeJson = Schema.encodeSync(Schema.parseJson(Schema.Unknown, { space: 2 }));
|
|
4
|
+
/**
|
|
5
|
+
* Render search snippets as auditable text blocks: a header carrying the source, score, and
|
|
6
|
+
* citation link, the snippet text, and — for State JSON snippets — the extracted JSON value.
|
|
7
|
+
*/
|
|
8
|
+
export function renderSnippets(snapshotId, host, snippets) {
|
|
9
|
+
return snippets
|
|
10
|
+
.map((snippet) => {
|
|
11
|
+
const url = citationUrl(snapshotId, snippet.source, snippet.location, host);
|
|
12
|
+
const header = `[${snippet.source} · score ${snippet.score.toFixed(2)}] ${url}`;
|
|
13
|
+
const json = snippet.json == null ? '' : `\n\n${encodeJson(snippet.json)}`;
|
|
14
|
+
return `${header}\n\n${snippet.text}${json}`;
|
|
15
|
+
})
|
|
16
|
+
.join('\n\n---\n\n');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Snippets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Snippets.js","sourceRoot":"","sources":["../../src/Snippets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAepF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,IAAY,EAAE,QAA0C;IAC1G,OAAO,QAAQ;SACb,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAChB,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC3E,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,MAAM,YAAY,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAA;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAA;QAC1E,OAAO,GAAG,MAAM,OAAO,OAAO,CAAC,IAAI,GAAG,IAAI,EAAE,CAAA;IAC7C,CAAC,CAAC;SACD,IAAI,CAAC,aAAa,CAAC,CAAA;AACtB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { CliConfig, Command, ValidationError } from '@effect/cli';
|
|
3
|
+
import { Terminal } from '@effect/platform';
|
|
4
|
+
import { NodeContext, NodeRuntime } from '@effect/platform-node';
|
|
5
|
+
import { Cause, Config, Console, Effect, Layer, Logger, LogLevel, Option, Schema, String } from 'effect';
|
|
6
|
+
import { Authentication, LoginCommand, LogoutCommand, WhoamiCommand } from './Authentication.js';
|
|
7
|
+
import { FetchCommand } from './Commands/Fetch.js';
|
|
8
|
+
import { AgentHookCommand, HumanHookCommand } from './Commands/Hook.js';
|
|
9
|
+
import { InstallSubCommand, UninstallSubCommand } from './Commands/Mcp.js';
|
|
10
|
+
import { McpRunCommand } from './Commands/McpRun.js';
|
|
11
|
+
import { SearchCommand } from './Commands/Search.js';
|
|
12
|
+
import { SkillCommand } from './Commands/Skill.js';
|
|
13
|
+
import { UninstallCommand } from './Commands/Uninstall.js';
|
|
14
|
+
import { ConfigManager } from './Config.js';
|
|
15
|
+
import { ClaudeHook } from './Hook/Claude.js';
|
|
16
|
+
import { OpencodeHook } from './Hook/Opencode.js';
|
|
17
|
+
import { HookInstaller } from './Install/Hook.js';
|
|
18
|
+
import { Mcp } from './Install/Mcp.js';
|
|
19
|
+
import { Skill as SkillInstaller } from './Install/Skill.js';
|
|
20
|
+
import { Uninstall } from './Install/Uninstall.js';
|
|
21
|
+
/**
|
|
22
|
+
* Where this process is running:
|
|
23
|
+
* - 'human': interactive terminal use. Setup commands (`mcp install`, `skill install`) are visible.
|
|
24
|
+
* - 'agent': an agent host (Claude Code / Cursor / Codex) or the expandai skill is invoking
|
|
25
|
+
* the CLI. Setup commands are hidden because the integration is already wired up.
|
|
26
|
+
* - 'mcp': the binary is serving as the MCP transport. MCP only runs in agents.
|
|
27
|
+
*/
|
|
28
|
+
const EnvironmentSignals = Config.all({
|
|
29
|
+
override: Schema.Config('EXPANDAI_CLI_CONTEXT', Schema.Literal('human', 'agent')).pipe(Config.option),
|
|
30
|
+
mcpTransport: Config.string('MCP_TRANSPORT').pipe(Config.option, Config.map(Option.isSome)),
|
|
31
|
+
claudeCode: Config.boolean('CLAUDECODE').pipe(Config.withDefault(false)),
|
|
32
|
+
cursor: Config.string('CURSOR_TRACE_ID').pipe(Config.option, Config.map(Option.isSome)),
|
|
33
|
+
codex: Config.string('CODEX_RUN_ID').pipe(Config.option, Config.map(Option.isSome)),
|
|
34
|
+
});
|
|
35
|
+
const detectContext = Effect.gen(function* () {
|
|
36
|
+
const signals = yield* EnvironmentSignals;
|
|
37
|
+
const mcp = signals.mcpTransport ? Option.some('mcp') : Option.none();
|
|
38
|
+
// Authentication.logout uses both stdout and stdin TTY checks because Prompt
|
|
39
|
+
// reads from stdin; for context detection a non-TTY stdout alone is enough
|
|
40
|
+
// to identify a non-interactive caller.
|
|
41
|
+
const agent = signals.claudeCode || signals.cursor || signals.codex || !process.stdout.isTTY
|
|
42
|
+
? Option.some('agent')
|
|
43
|
+
: Option.none();
|
|
44
|
+
return Option.firstSomeOf([mcp, signals.override, agent]).pipe(Option.getOrElse(() => 'human'));
|
|
45
|
+
});
|
|
46
|
+
const HumanMcp = Command.make('mcp').pipe(Command.withDescription('Run or install the expandai MCP server'), Command.withSubcommands([McpRunCommand, InstallSubCommand, UninstallSubCommand]));
|
|
47
|
+
const AgentMcp = Command.make('mcp').pipe(Command.withDescription('Run the expandai MCP server'), Command.withSubcommands([McpRunCommand]));
|
|
48
|
+
const HumanCli = Command.make('expandai').pipe(Command.withDescription('expand.ai CLI and MCP server'), Command.withSubcommands([
|
|
49
|
+
FetchCommand,
|
|
50
|
+
SearchCommand,
|
|
51
|
+
LoginCommand,
|
|
52
|
+
WhoamiCommand,
|
|
53
|
+
LogoutCommand,
|
|
54
|
+
UninstallCommand,
|
|
55
|
+
HumanMcp,
|
|
56
|
+
SkillCommand,
|
|
57
|
+
HumanHookCommand,
|
|
58
|
+
]), Command.provide(Layer.mergeAll(ConfigManager.Default, Authentication.Default, Mcp.Default, HookInstaller.Default, SkillInstaller.Default, Uninstall.Default, ClaudeHook.Default, OpencodeHook.Default)));
|
|
59
|
+
const AgentCli = Command.make('expandai').pipe(Command.withDescription('expand.ai CLI and MCP server'), Command.withSubcommands([
|
|
60
|
+
FetchCommand,
|
|
61
|
+
SearchCommand,
|
|
62
|
+
LoginCommand,
|
|
63
|
+
WhoamiCommand,
|
|
64
|
+
LogoutCommand,
|
|
65
|
+
AgentMcp,
|
|
66
|
+
AgentHookCommand,
|
|
67
|
+
]), Command.provide(Layer.mergeAll(ConfigManager.Default, Authentication.Default, ClaudeHook.Default, OpencodeHook.Default)));
|
|
68
|
+
const LoggerLive = Layer.unwrapEffect(Effect.gen(function* () {
|
|
69
|
+
const isDebug = yield* Config.boolean('DEBUG').pipe(Config.withDefault(false));
|
|
70
|
+
return Logger.minimumLogLevel(isDebug ? LogLevel.All : LogLevel.Info);
|
|
71
|
+
}));
|
|
72
|
+
const Env = Layer.mergeAll(NodeContext.layer, CliConfig.layer({ showBuiltIns: false }), LoggerLive);
|
|
73
|
+
const program = Effect.gen(function* () {
|
|
74
|
+
const context = yield* detectContext;
|
|
75
|
+
const cli = context === 'human' ? HumanCli : AgentCli;
|
|
76
|
+
return yield* Command.run(cli, { name: 'expand.ai CLI', version: '0.0.1' })(process.argv);
|
|
77
|
+
}).pipe(Effect.catchAllCause((cause) => {
|
|
78
|
+
const failure = Cause.failureOption(cause);
|
|
79
|
+
// Ctrl-C during a `Prompt` surfaces as a `QuitException` failure rather
|
|
80
|
+
// than a pure interrupt; treat it the same as an interrupt so we exit
|
|
81
|
+
// cleanly instead of printing a blank "Error: " (QuitException has no message).
|
|
82
|
+
if (Cause.isInterruptedOnly(cause) || (Option.isSome(failure) && Terminal.isQuitException(failure.value))) {
|
|
83
|
+
return Effect.void;
|
|
84
|
+
}
|
|
85
|
+
// `@effect/cli` already printed a help/usage message before failing with
|
|
86
|
+
// a `ValidationError`; we only need to propagate the non-zero exit.
|
|
87
|
+
const print = Option.match(failure, {
|
|
88
|
+
onSome: (error) => ValidationError.isValidationError(error) ? Effect.void : Console.error(`Error: ${error.message}`),
|
|
89
|
+
onNone: () => Console.error(String.stripMargin(`
|
|
90
|
+
|Unexpected failure:
|
|
91
|
+
|${Cause.pretty(cause)}`)),
|
|
92
|
+
});
|
|
93
|
+
const debug = Effect.logDebug('Error cause').pipe(Effect.annotateLogs({ cause: Cause.pretty(cause) }));
|
|
94
|
+
return print.pipe(Effect.zipRight(debug), Effect.zipRight(Effect.failCause(cause)));
|
|
95
|
+
}), Effect.provide(Env));
|
|
96
|
+
NodeRuntime.runMain(program, { disableErrorReporting: true });
|
|
97
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: expandai
|
|
3
|
+
description: Fetch any URL as clean markdown using the `expandai` CLI. Use when reading documentation, articles, GitHub READMEs, blog posts, or any web page — the output is rendered from the live page so it handles SPAs and bot-protected sites that plain `curl` does not.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# expandai
|
|
7
|
+
|
|
8
|
+
Fetch any URL as clean markdown.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
expandai fetch <url>
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
Use `expandai fetch` instead of `curl` or `WebFetch` when you need to read web content. It renders the live page (handles JavaScript, SPAs, bot protection) and returns markdown rather than raw HTML.
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
expandai fetch https://docs.example.com/api
|
|
22
|
+
expandai fetch github.com/owner/repo # https:// is added automatically
|
|
23
|
+
expandai fetch https://example.com --format json # object-mode { meta, markdown, json }
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Output
|
|
27
|
+
|
|
28
|
+
- Default (`--format text`): full markdown document — pipe to grep, less, or write to a file.
|
|
29
|
+
- `--format json`: object-mode response with `meta`, `markdown`, and `json`. The handle for
|
|
30
|
+
later searches is `meta.snapshotId`.
|
|
31
|
+
|
|
32
|
+
## Search a page you already fetched
|
|
33
|
+
|
|
34
|
+
Every fetch produces a snapshot handle (`meta.snapshotId`). When the WebFetch hook serves a
|
|
35
|
+
page, it injects that handle as a note at the top of the markdown. Once a page is captured,
|
|
36
|
+
extract specific passages by **searching the snapshot by handle** — don't fetch the URL again:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
expandai search <snapshotId> "your query" # snippets from the stored snapshot
|
|
40
|
+
expandai search <snapshotId> "your query" --format json --max-results 10 --min-score 0.5
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Agents with the expandai MCP server can call the `fetch_search` tool with the same
|
|
44
|
+
`snapshotId` instead.
|
|
45
|
+
|
|
46
|
+
Use `expandai fetch <url> --search "query"` only for a one-shot fetch+search of a URL you
|
|
47
|
+
have not captured yet — it starts a new browser capture. If you already have a `snapshotId`,
|
|
48
|
+
prefer `expandai search` (or `fetch_search`), which reuses the existing capture.
|
|
49
|
+
|
|
50
|
+
## Citations
|
|
51
|
+
|
|
52
|
+
Search results include enough location data to audit the cited passage. In text output,
|
|
53
|
+
`expandai search` and `expandai fetch --search` print a public playground citation link above
|
|
54
|
+
each snippet. MCP tool results expose `citationUrl` fields directly.
|
|
55
|
+
|
|
56
|
+
## Common patterns
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Read a doc page
|
|
60
|
+
expandai fetch https://effect.website/docs/getting-started
|
|
61
|
+
|
|
62
|
+
# Save to a file
|
|
63
|
+
expandai fetch https://example.com > page.md
|
|
64
|
+
|
|
65
|
+
# Inspect object-mode output, including State JSON when present
|
|
66
|
+
expandai fetch https://docs.example.com/api --format json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Failure modes
|
|
70
|
+
|
|
71
|
+
- Exit code non-zero with `Not authenticated` — the user has not run `expandai login`. Tell them to run it; do not attempt to authenticate yourself.
|
|
72
|
+
- Empty markdown output — try `--format json` to inspect the response shape.
|
package/package.json
CHANGED
|
@@ -1,12 +1,74 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
"name": "expandai",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.2",
|
|
5
|
+
"private": false,
|
|
6
|
+
"description": "Unified CLI and MCP server for ExpandAI",
|
|
7
|
+
"author": "ExpandAI",
|
|
8
|
+
"license": "Apache-2.0",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/expandai/expandai-cli.git"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"build/dts",
|
|
18
|
+
"build/esm",
|
|
19
|
+
"build/skills",
|
|
20
|
+
"src",
|
|
21
|
+
"!**/*.tsbuildinfo"
|
|
22
|
+
],
|
|
23
|
+
"bin": {
|
|
24
|
+
"expandai": "build/esm/main.js"
|
|
25
|
+
},
|
|
26
|
+
"exports": {
|
|
27
|
+
"./package.json": "./package.json",
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./build/dts/index.d.ts",
|
|
30
|
+
"import": "./build/esm/index.js"
|
|
31
|
+
},
|
|
32
|
+
"./*": {
|
|
33
|
+
"types": "./build/dts/*.d.ts",
|
|
34
|
+
"import": "./build/esm/*.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"dev": "tsx --watch src/main.ts",
|
|
39
|
+
"build": "tsc -b tsconfig.build.json && cp -R skills build/skills && cp src/Install/Opencode/expandai-webfetch.js build/esm/Install/Opencode/expandai-webfetch.js && chmod +x build/esm/main.js",
|
|
40
|
+
"build:bin": "bun ./scripts/build.ts --single",
|
|
41
|
+
"build:bin:all": "bun ./scripts/build.ts",
|
|
42
|
+
"check": "tsc -b tsconfig.json",
|
|
43
|
+
"check:test": "tsc -b tsconfig.test.json",
|
|
44
|
+
"lint": "biome check --write --no-errors-on-unmatched",
|
|
45
|
+
"lint:check": "biome check",
|
|
46
|
+
"format": "biome format --write",
|
|
47
|
+
"format:check": "biome format",
|
|
48
|
+
"test": "vitest run --exclude 'test/**/*.integration.test.ts'",
|
|
49
|
+
"test:integration": "bun run build && vitest run integration",
|
|
50
|
+
"coverage": "vitest --coverage"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@effect/ai": "0.35.0",
|
|
54
|
+
"@effect/cli": "0.75.1",
|
|
55
|
+
"@effect/platform": "0.96.1",
|
|
56
|
+
"@effect/platform-node": "0.106.0",
|
|
57
|
+
"@expandai/sdk": "0.17.2",
|
|
58
|
+
"effect": "3.21.2",
|
|
59
|
+
"open": "^11.0.0",
|
|
60
|
+
"smol-toml": "^1.6.1"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.150",
|
|
64
|
+
"@biomejs/biome": "^2.4.14",
|
|
65
|
+
"@effect/vitest": "0.29.0",
|
|
66
|
+
"@modelcontextprotocol/sdk": "1.29.0",
|
|
67
|
+
"@openai/codex-sdk": "^0.133.0",
|
|
68
|
+
"@opencode-ai/sdk": "1.15.10",
|
|
69
|
+
"@types/bun": "^1.3.14",
|
|
70
|
+
"@types/node": "^25.5.2",
|
|
71
|
+
"opencode-ai": "1.15.10",
|
|
72
|
+
"vitest": "4.1.4"
|
|
73
|
+
}
|
|
12
74
|
}
|