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.
Files changed (209) hide show
  1. package/README.md +241 -6
  2. package/build/dts/ApiClient.d.ts +231 -0
  3. package/build/dts/ApiClient.d.ts.map +1 -0
  4. package/build/dts/Authentication.d.ts +23 -0
  5. package/build/dts/Authentication.d.ts.map +1 -0
  6. package/build/dts/BrowserOAuth.d.ts +99 -0
  7. package/build/dts/BrowserOAuth.d.ts.map +1 -0
  8. package/build/dts/Commands/Fetch.d.ts +30 -0
  9. package/build/dts/Commands/Fetch.d.ts.map +1 -0
  10. package/build/dts/Commands/Hook.d.ts +17 -0
  11. package/build/dts/Commands/Hook.d.ts.map +1 -0
  12. package/build/dts/Commands/Mcp.d.ts +11 -0
  13. package/build/dts/Commands/Mcp.d.ts.map +1 -0
  14. package/build/dts/Commands/McpRun.d.ts +5 -0
  15. package/build/dts/Commands/McpRun.d.ts.map +1 -0
  16. package/build/dts/Commands/Search.d.ts +21 -0
  17. package/build/dts/Commands/Search.d.ts.map +1 -0
  18. package/build/dts/Commands/Skill.d.ts +12 -0
  19. package/build/dts/Commands/Skill.d.ts.map +1 -0
  20. package/build/dts/Commands/Uninstall.d.ts +9 -0
  21. package/build/dts/Commands/Uninstall.d.ts.map +1 -0
  22. package/build/dts/Config.d.ts +105 -0
  23. package/build/dts/Config.d.ts.map +1 -0
  24. package/build/dts/DeviceAuth.d.ts +87 -0
  25. package/build/dts/DeviceAuth.d.ts.map +1 -0
  26. package/build/dts/Hook/Claude.d.ts +13 -0
  27. package/build/dts/Hook/Claude.d.ts.map +1 -0
  28. package/build/dts/Hook/Errors.d.ts +20 -0
  29. package/build/dts/Hook/Errors.d.ts.map +1 -0
  30. package/build/dts/Hook/Opencode.d.ts +13 -0
  31. package/build/dts/Hook/Opencode.d.ts.map +1 -0
  32. package/build/dts/Hook/SnapshotNote.d.ts +8 -0
  33. package/build/dts/Hook/SnapshotNote.d.ts.map +1 -0
  34. package/build/dts/Install/Claude/Hook.d.ts +60 -0
  35. package/build/dts/Install/Claude/Hook.d.ts.map +1 -0
  36. package/build/dts/Install/Claude/Mcp.d.ts +45 -0
  37. package/build/dts/Install/Claude/Mcp.d.ts.map +1 -0
  38. package/build/dts/Install/Claude/Skill.d.ts +24 -0
  39. package/build/dts/Install/Claude/Skill.d.ts.map +1 -0
  40. package/build/dts/Install/Codex/Mcp.d.ts +39 -0
  41. package/build/dts/Install/Codex/Mcp.d.ts.map +1 -0
  42. package/build/dts/Install/Codex/Skill.d.ts +20 -0
  43. package/build/dts/Install/Codex/Skill.d.ts.map +1 -0
  44. package/build/dts/Install/Cursor/Mcp.d.ts +45 -0
  45. package/build/dts/Install/Cursor/Mcp.d.ts.map +1 -0
  46. package/build/dts/Install/Cursor/Skill.d.ts +27 -0
  47. package/build/dts/Install/Cursor/Skill.d.ts.map +1 -0
  48. package/build/dts/Install/Domain.d.ts +73 -0
  49. package/build/dts/Install/Domain.d.ts.map +1 -0
  50. package/build/dts/Install/Hook.d.ts +30 -0
  51. package/build/dts/Install/Hook.d.ts.map +1 -0
  52. package/build/dts/Install/Mcp.d.ts +28 -0
  53. package/build/dts/Install/Mcp.d.ts.map +1 -0
  54. package/build/dts/Install/Opencode/Hook.d.ts +23 -0
  55. package/build/dts/Install/Opencode/Hook.d.ts.map +1 -0
  56. package/build/dts/Install/Opencode/Mcp.d.ts +47 -0
  57. package/build/dts/Install/Opencode/Mcp.d.ts.map +1 -0
  58. package/build/dts/Install/Opencode/Skill.d.ts +24 -0
  59. package/build/dts/Install/Opencode/Skill.d.ts.map +1 -0
  60. package/build/dts/Install/Skill.d.ts +32 -0
  61. package/build/dts/Install/Skill.d.ts.map +1 -0
  62. package/build/dts/Install/Uninstall.d.ts +32 -0
  63. package/build/dts/Install/Uninstall.d.ts.map +1 -0
  64. package/build/dts/Mcp/ExpandDocs.d.ts +7 -0
  65. package/build/dts/Mcp/ExpandDocs.d.ts.map +1 -0
  66. package/build/dts/Mcp/RequestHeaders.d.ts +15 -0
  67. package/build/dts/Mcp/RequestHeaders.d.ts.map +1 -0
  68. package/build/dts/Mcp/Server.d.ts +10 -0
  69. package/build/dts/Mcp/Server.d.ts.map +1 -0
  70. package/build/dts/Mcp/Toolkit.d.ts +3 -0
  71. package/build/dts/Mcp/Toolkit.d.ts.map +1 -0
  72. package/build/dts/Mcp/tools/Citations.d.ts +237 -0
  73. package/build/dts/Mcp/tools/Citations.d.ts.map +1 -0
  74. package/build/dts/Mcp/tools/Fetch.d.ts +167 -0
  75. package/build/dts/Mcp/tools/Fetch.d.ts.map +1 -0
  76. package/build/dts/Snippets.d.ts +19 -0
  77. package/build/dts/Snippets.d.ts.map +1 -0
  78. package/build/dts/index.d.ts +2 -0
  79. package/build/dts/index.d.ts.map +1 -0
  80. package/build/dts/main.d.ts +3 -0
  81. package/build/dts/main.d.ts.map +1 -0
  82. package/build/esm/ApiClient.js +182 -0
  83. package/build/esm/ApiClient.js.map +1 -0
  84. package/build/esm/Authentication.js +112 -0
  85. package/build/esm/Authentication.js.map +1 -0
  86. package/build/esm/BrowserOAuth.js +254 -0
  87. package/build/esm/BrowserOAuth.js.map +1 -0
  88. package/build/esm/Commands/Fetch.js +95 -0
  89. package/build/esm/Commands/Fetch.js.map +1 -0
  90. package/build/esm/Commands/Hook.js +20 -0
  91. package/build/esm/Commands/Hook.js.map +1 -0
  92. package/build/esm/Commands/Mcp.js +19 -0
  93. package/build/esm/Commands/Mcp.js.map +1 -0
  94. package/build/esm/Commands/McpRun.js +15 -0
  95. package/build/esm/Commands/McpRun.js.map +1 -0
  96. package/build/esm/Commands/Search.js +43 -0
  97. package/build/esm/Commands/Search.js.map +1 -0
  98. package/build/esm/Commands/Skill.js +17 -0
  99. package/build/esm/Commands/Skill.js.map +1 -0
  100. package/build/esm/Commands/Uninstall.js +28 -0
  101. package/build/esm/Commands/Uninstall.js.map +1 -0
  102. package/build/esm/Config.js +145 -0
  103. package/build/esm/Config.js.map +1 -0
  104. package/build/esm/DeviceAuth.js +127 -0
  105. package/build/esm/DeviceAuth.js.map +1 -0
  106. package/build/esm/Hook/Claude.js +74 -0
  107. package/build/esm/Hook/Claude.js.map +1 -0
  108. package/build/esm/Hook/Errors.js +18 -0
  109. package/build/esm/Hook/Errors.js.map +1 -0
  110. package/build/esm/Hook/Opencode.js +50 -0
  111. package/build/esm/Hook/Opencode.js.map +1 -0
  112. package/build/esm/Hook/SnapshotNote.js +18 -0
  113. package/build/esm/Hook/SnapshotNote.js.map +1 -0
  114. package/build/esm/Install/Claude/Hook.js +89 -0
  115. package/build/esm/Install/Claude/Hook.js.map +1 -0
  116. package/build/esm/Install/Claude/Mcp.js +71 -0
  117. package/build/esm/Install/Claude/Mcp.js.map +1 -0
  118. package/build/esm/Install/Claude/Skill.js +34 -0
  119. package/build/esm/Install/Claude/Skill.js.map +1 -0
  120. package/build/esm/Install/Codex/Mcp.js +92 -0
  121. package/build/esm/Install/Codex/Mcp.js.map +1 -0
  122. package/build/esm/Install/Codex/Skill.js +30 -0
  123. package/build/esm/Install/Codex/Skill.js.map +1 -0
  124. package/build/esm/Install/Cursor/Mcp.js +71 -0
  125. package/build/esm/Install/Cursor/Mcp.js.map +1 -0
  126. package/build/esm/Install/Cursor/Skill.js +37 -0
  127. package/build/esm/Install/Cursor/Skill.js.map +1 -0
  128. package/build/esm/Install/Domain.js +105 -0
  129. package/build/esm/Install/Domain.js.map +1 -0
  130. package/build/esm/Install/Hook.js +38 -0
  131. package/build/esm/Install/Hook.js.map +1 -0
  132. package/build/esm/Install/Mcp.js +40 -0
  133. package/build/esm/Install/Mcp.js.map +1 -0
  134. package/build/esm/Install/Opencode/Hook.js +44 -0
  135. package/build/esm/Install/Opencode/Hook.js.map +1 -0
  136. package/build/esm/Install/Opencode/Mcp.js +73 -0
  137. package/build/esm/Install/Opencode/Mcp.js.map +1 -0
  138. package/build/esm/Install/Opencode/Skill.js +34 -0
  139. package/build/esm/Install/Opencode/Skill.js.map +1 -0
  140. package/build/esm/Install/Opencode/expandai-webfetch.js +38 -0
  141. package/build/esm/Install/Skill.js +41 -0
  142. package/build/esm/Install/Skill.js.map +1 -0
  143. package/build/esm/Install/Uninstall.js +49 -0
  144. package/build/esm/Install/Uninstall.js.map +1 -0
  145. package/build/esm/Mcp/ExpandDocs.js +64 -0
  146. package/build/esm/Mcp/ExpandDocs.js.map +1 -0
  147. package/build/esm/Mcp/RequestHeaders.js +13 -0
  148. package/build/esm/Mcp/RequestHeaders.js.map +1 -0
  149. package/build/esm/Mcp/Server.js +11 -0
  150. package/build/esm/Mcp/Server.js.map +1 -0
  151. package/build/esm/Mcp/Toolkit.js +16 -0
  152. package/build/esm/Mcp/Toolkit.js.map +1 -0
  153. package/build/esm/Mcp/tools/Citations.js +92 -0
  154. package/build/esm/Mcp/tools/Citations.js.map +1 -0
  155. package/build/esm/Mcp/tools/Fetch.js +141 -0
  156. package/build/esm/Mcp/tools/Fetch.js.map +1 -0
  157. package/build/esm/Snippets.js +18 -0
  158. package/build/esm/Snippets.js.map +1 -0
  159. package/build/esm/index.js +2 -0
  160. package/build/esm/index.js.map +1 -0
  161. package/build/esm/main.js +97 -0
  162. package/build/esm/main.js.map +1 -0
  163. package/build/skills/expandai/SKILL.md +72 -0
  164. package/package.json +72 -10
  165. package/src/ApiClient.ts +257 -0
  166. package/src/Authentication.ts +164 -0
  167. package/src/BrowserOAuth.ts +361 -0
  168. package/src/Commands/Fetch.ts +157 -0
  169. package/src/Commands/Hook.ts +48 -0
  170. package/src/Commands/Mcp.ts +30 -0
  171. package/src/Commands/McpRun.ts +25 -0
  172. package/src/Commands/Search.ts +92 -0
  173. package/src/Commands/Skill.ts +30 -0
  174. package/src/Commands/Uninstall.ts +38 -0
  175. package/src/Config.ts +195 -0
  176. package/src/DeviceAuth.ts +193 -0
  177. package/src/Hook/Claude.ts +81 -0
  178. package/src/Hook/Errors.ts +19 -0
  179. package/src/Hook/Opencode.ts +58 -0
  180. package/src/Hook/SnapshotNote.ts +18 -0
  181. package/src/Install/Claude/Hook.ts +133 -0
  182. package/src/Install/Claude/Mcp.ts +82 -0
  183. package/src/Install/Claude/Skill.ts +44 -0
  184. package/src/Install/Codex/Mcp.ts +109 -0
  185. package/src/Install/Codex/Skill.ts +40 -0
  186. package/src/Install/Cursor/Mcp.ts +82 -0
  187. package/src/Install/Cursor/Skill.ts +47 -0
  188. package/src/Install/Domain.ts +148 -0
  189. package/src/Install/Hook.ts +50 -0
  190. package/src/Install/Mcp.ts +71 -0
  191. package/src/Install/Opencode/Hook.ts +55 -0
  192. package/src/Install/Opencode/Mcp.ts +84 -0
  193. package/src/Install/Opencode/Skill.ts +44 -0
  194. package/src/Install/Opencode/expandai-webfetch.d.ts +23 -0
  195. package/src/Install/Opencode/expandai-webfetch.js +38 -0
  196. package/src/Install/Skill.ts +57 -0
  197. package/src/Install/Uninstall.ts +82 -0
  198. package/src/Mcp/ExpandDocs.ts +71 -0
  199. package/src/Mcp/RequestHeaders.ts +16 -0
  200. package/src/Mcp/Server.ts +14 -0
  201. package/src/Mcp/Toolkit.ts +21 -0
  202. package/src/Mcp/tools/Citations.ts +110 -0
  203. package/src/Mcp/tools/Fetch.ts +177 -0
  204. package/src/Snippets.ts +32 -0
  205. package/src/index.ts +1 -0
  206. package/src/main.ts +146 -0
  207. package/bun.lockb +0 -0
  208. package/index.ts +0 -1
  209. 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":"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"}
@@ -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,2 @@
1
+ export * from './Mcp/Server.js';
2
+ //# sourceMappingURL=index.js.map
@@ -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
- "name": "expandai",
3
- "module": "index.ts",
4
- "type": "module",
5
- "version": "0.0.0",
6
- "devDependencies": {
7
- "@types/bun": "latest"
8
- },
9
- "peerDependencies": {
10
- "typescript": "^5.0.0"
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
  }