@oh-my-pi/cli 0.3.0 → 0.5.0
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 +79 -84
- package/dist/cli.js +5025 -1016
- package/dist/commands/config.d.ts +27 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/features.d.ts.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/install.d.ts +6 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/link.d.ts +1 -0
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/outdated.d.ts.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/conflicts.d.ts +7 -2
- package/dist/conflicts.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/lock.d.ts.map +1 -1
- package/dist/lockfile.d.ts +24 -3
- package/dist/lockfile.d.ts.map +1 -1
- package/dist/manifest.d.ts +12 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/npm.d.ts +11 -0
- package/dist/npm.d.ts.map +1 -1
- package/dist/output.d.ts +51 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/progress.d.ts +78 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/symlinks.d.ts +1 -0
- package/dist/symlinks.d.ts.map +1 -1
- package/package.json +24 -10
- package/.github/icon.png +0 -0
- package/.github/logo.png +0 -0
- package/.github/workflows/ci.yml +0 -32
- package/.github/workflows/publish.yml +0 -42
- package/biome.json +0 -29
- package/bun.lock +0 -109
- package/plugins/exa/README.md +0 -153
- package/plugins/exa/package.json +0 -56
- package/plugins/exa/tools/exa/company.ts +0 -35
- package/plugins/exa/tools/exa/index.ts +0 -66
- package/plugins/exa/tools/exa/linkedin.ts +0 -35
- package/plugins/exa/tools/exa/researcher.ts +0 -40
- package/plugins/exa/tools/exa/runtime.json +0 -4
- package/plugins/exa/tools/exa/search.ts +0 -46
- package/plugins/exa/tools/exa/shared.ts +0 -230
- package/plugins/exa/tools/exa/websets.ts +0 -62
- package/plugins/metal-theme/README.md +0 -13
- package/plugins/metal-theme/omp.json +0 -8
- package/plugins/metal-theme/package.json +0 -19
- package/plugins/metal-theme/themes/metal.json +0 -79
- package/plugins/subagents/README.md +0 -25
- package/plugins/subagents/agents/explore.md +0 -71
- package/plugins/subagents/agents/planner.md +0 -51
- package/plugins/subagents/agents/reviewer.md +0 -53
- package/plugins/subagents/agents/task.md +0 -46
- package/plugins/subagents/commands/architect-plan.md +0 -9
- package/plugins/subagents/commands/implement-with-critic.md +0 -10
- package/plugins/subagents/commands/implement.md +0 -10
- package/plugins/subagents/omp.json +0 -15
- package/plugins/subagents/package.json +0 -26
- package/plugins/subagents/tools/task/index.ts +0 -1019
- package/plugins/user-prompt/README.md +0 -130
- package/plugins/user-prompt/package.json +0 -19
- package/plugins/user-prompt/tools/user-prompt/index.ts +0 -235
- package/scripts/bump-version.sh +0 -52
- package/scripts/publish.sh +0 -35
- package/src/cli.ts +0 -242
- package/src/commands/config.ts +0 -384
- package/src/commands/create.ts +0 -203
- package/src/commands/doctor.ts +0 -305
- package/src/commands/enable.ts +0 -122
- package/src/commands/env.ts +0 -38
- package/src/commands/features.ts +0 -295
- package/src/commands/info.ts +0 -120
- package/src/commands/init.ts +0 -60
- package/src/commands/install.ts +0 -700
- package/src/commands/link.ts +0 -159
- package/src/commands/list.ts +0 -186
- package/src/commands/outdated.ts +0 -87
- package/src/commands/search.ts +0 -77
- package/src/commands/uninstall.ts +0 -124
- package/src/commands/update.ts +0 -170
- package/src/commands/why.ts +0 -136
- package/src/conflicts.ts +0 -116
- package/src/errors.ts +0 -22
- package/src/index.ts +0 -46
- package/src/lock.ts +0 -46
- package/src/lockfile.ts +0 -132
- package/src/manifest.ts +0 -360
- package/src/npm.ts +0 -206
- package/src/paths.ts +0 -137
- package/src/runtime.ts +0 -116
- package/src/symlinks.ts +0 -455
- package/tsconfig.json +0 -28
package/package.json
CHANGED
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oh-my-pi/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Plugin manager for pi - install and manage pi config plugins from git repos",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/
|
|
7
|
-
"types": "./dist/
|
|
6
|
+
"main": "./dist/cli.js",
|
|
7
|
+
"types": "./dist/cli.d.ts",
|
|
8
8
|
"bin": {
|
|
9
9
|
"omp": "./dist/cli.js"
|
|
10
10
|
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
11
15
|
"scripts": {
|
|
12
16
|
"build": "bun build src/cli.ts --outdir dist --target bun && tsc --emitDeclarationOnly",
|
|
13
17
|
"dev": "bun --watch src/cli.ts",
|
|
14
18
|
"lint": "biome check --write .",
|
|
15
|
-
"
|
|
19
|
+
"format": "prettier --write \"**/*.md\" && biome check --write .",
|
|
20
|
+
"check": "bun run format && tsc --noEmit",
|
|
16
21
|
"clean": "rm -rf dist",
|
|
17
|
-
"publish:all": "
|
|
18
|
-
"publish:dry": "
|
|
19
|
-
"version:bump": "
|
|
22
|
+
"publish:all": "bun scripts/publish.ts",
|
|
23
|
+
"publish:dry": "bun scripts/publish.ts --dry-run",
|
|
24
|
+
"version:bump": "bun scripts/bump-version.ts"
|
|
20
25
|
},
|
|
21
|
-
"keywords": [
|
|
26
|
+
"keywords": [
|
|
27
|
+
"pi",
|
|
28
|
+
"plugin",
|
|
29
|
+
"manager",
|
|
30
|
+
"cli"
|
|
31
|
+
],
|
|
22
32
|
"author": "Can Bölük <me@can.ac>",
|
|
23
33
|
"license": "MIT",
|
|
24
34
|
"repository": {
|
|
@@ -26,15 +36,19 @@
|
|
|
26
36
|
"url": "https://github.com/can1357/oh-my-pi.git"
|
|
27
37
|
},
|
|
28
38
|
"devDependencies": {
|
|
29
|
-
"@biomejs/biome": "2.3.
|
|
39
|
+
"@biomejs/biome": "2.3.10",
|
|
30
40
|
"@types/node": "^22.10.5",
|
|
31
41
|
"bun-types": "^1.2.17",
|
|
42
|
+
"prettier": "^3.7.4",
|
|
32
43
|
"typescript": "^5.9.2"
|
|
33
44
|
},
|
|
34
45
|
"dependencies": {
|
|
35
46
|
"@inquirer/prompts": "^8.1.0",
|
|
36
47
|
"chalk": "^5.3.0",
|
|
37
|
-
"commander": "^12.0.0"
|
|
48
|
+
"commander": "^12.0.0",
|
|
49
|
+
"ora": "^9.0.0",
|
|
50
|
+
"string-width": "^8.1.0",
|
|
51
|
+
"strip-ansi": "^7.1.2"
|
|
38
52
|
},
|
|
39
53
|
"engines": {
|
|
40
54
|
"bun": ">=1.0.0"
|
package/.github/icon.png
DELETED
|
Binary file
|
package/.github/logo.png
DELETED
|
Binary file
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
name: CI
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
jobs:
|
|
10
|
-
build:
|
|
11
|
-
runs-on: ubuntu-latest
|
|
12
|
-
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v4
|
|
15
|
-
|
|
16
|
-
- uses: oven-sh/setup-bun@v2
|
|
17
|
-
with:
|
|
18
|
-
bun-version: latest
|
|
19
|
-
|
|
20
|
-
- name: Install dependencies
|
|
21
|
-
run: bun install
|
|
22
|
-
|
|
23
|
-
- name: Check (lint + typecheck)
|
|
24
|
-
run: bun run check
|
|
25
|
-
|
|
26
|
-
- name: Build
|
|
27
|
-
run: bun run build
|
|
28
|
-
|
|
29
|
-
- name: Test CLI
|
|
30
|
-
run: |
|
|
31
|
-
bun dist/cli.js --version
|
|
32
|
-
bun dist/cli.js --help
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
name: Publish
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
tags:
|
|
6
|
-
- 'v*'
|
|
7
|
-
|
|
8
|
-
jobs:
|
|
9
|
-
publish:
|
|
10
|
-
runs-on: ubuntu-latest
|
|
11
|
-
permissions:
|
|
12
|
-
contents: read
|
|
13
|
-
id-token: write
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
|
|
18
|
-
- uses: oven-sh/setup-bun@v2
|
|
19
|
-
with:
|
|
20
|
-
bun-version: latest
|
|
21
|
-
|
|
22
|
-
- uses: actions/setup-node@v4
|
|
23
|
-
with:
|
|
24
|
-
node-version: '24'
|
|
25
|
-
registry-url: 'https://registry.npmjs.org'
|
|
26
|
-
|
|
27
|
-
- name: Install dependencies
|
|
28
|
-
run: bun install
|
|
29
|
-
|
|
30
|
-
- name: Build
|
|
31
|
-
run: bun run build
|
|
32
|
-
|
|
33
|
-
- name: Publish @oh-my-pi/cli
|
|
34
|
-
run: npm publish --access public --provenance
|
|
35
|
-
|
|
36
|
-
- name: Publish @oh-my-pi/subagents
|
|
37
|
-
working-directory: plugins/subagents
|
|
38
|
-
run: npm publish --access public --provenance
|
|
39
|
-
|
|
40
|
-
- name: Publish @oh-my-pi/metal-theme
|
|
41
|
-
working-directory: plugins/metal-theme
|
|
42
|
-
run: npm publish --access public --provenance
|
package/biome.json
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://biomejs.dev/schemas/2.3.10/schema.json",
|
|
3
|
-
"linter": {
|
|
4
|
-
"enabled": true,
|
|
5
|
-
"rules": {
|
|
6
|
-
"recommended": true,
|
|
7
|
-
"style": {
|
|
8
|
-
"noNonNullAssertion": "off",
|
|
9
|
-
"useConst": "error",
|
|
10
|
-
"useNodejsImportProtocol": "off"
|
|
11
|
-
},
|
|
12
|
-
"suspicious": {
|
|
13
|
-
"noExplicitAny": "off",
|
|
14
|
-
"noControlCharactersInRegex": "off",
|
|
15
|
-
"noEmptyInterface": "off"
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"formatter": {
|
|
20
|
-
"enabled": true,
|
|
21
|
-
"formatWithErrors": false,
|
|
22
|
-
"indentStyle": "tab",
|
|
23
|
-
"indentWidth": 3,
|
|
24
|
-
"lineWidth": 120
|
|
25
|
-
},
|
|
26
|
-
"files": {
|
|
27
|
-
"includes": ["src/**/*.ts", "!**/node_modules/**/*"]
|
|
28
|
-
}
|
|
29
|
-
}
|
package/bun.lock
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"lockfileVersion": 1,
|
|
3
|
-
"configVersion": 1,
|
|
4
|
-
"workspaces": {
|
|
5
|
-
"": {
|
|
6
|
-
"name": "oh-my-pi",
|
|
7
|
-
"dependencies": {
|
|
8
|
-
"@inquirer/prompts": "^8.1.0",
|
|
9
|
-
"chalk": "^5.3.0",
|
|
10
|
-
"commander": "^12.0.0",
|
|
11
|
-
},
|
|
12
|
-
"devDependencies": {
|
|
13
|
-
"@biomejs/biome": "2.3.5",
|
|
14
|
-
"@types/node": "^22.10.5",
|
|
15
|
-
"bun-types": "^1.2.17",
|
|
16
|
-
"typescript": "^5.9.2",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
"packages": {
|
|
21
|
-
"@biomejs/biome": ["@biomejs/biome@2.3.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.3.5", "@biomejs/cli-darwin-x64": "2.3.5", "@biomejs/cli-linux-arm64": "2.3.5", "@biomejs/cli-linux-arm64-musl": "2.3.5", "@biomejs/cli-linux-x64": "2.3.5", "@biomejs/cli-linux-x64-musl": "2.3.5", "@biomejs/cli-win32-arm64": "2.3.5", "@biomejs/cli-win32-x64": "2.3.5" }, "bin": { "biome": "bin/biome" } }, "sha512-HvLhNlIlBIbAV77VysRIBEwp55oM/QAjQEin74QQX9Xb259/XP/D5AGGnZMOyF1el4zcvlNYYR3AyTMUV3ILhg=="],
|
|
22
|
-
|
|
23
|
-
"@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.3.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fLdTur8cJU33HxHUUsii3GLx/TR0BsfQx8FkeqIiW33cGMtUD56fAtrh+2Fx1uhiCsVZlFh6iLKUU3pniZREQw=="],
|
|
24
|
-
|
|
25
|
-
"@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.3.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-qpT8XDqeUlzrOW8zb4k3tjhT7rmvVRumhi2657I2aGcY4B+Ft5fNwDdZGACzn8zj7/K1fdWjgwYE3i2mSZ+vOA=="],
|
|
26
|
-
|
|
27
|
-
"@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-u/pybjTBPGBHB66ku4pK1gj+Dxgx7/+Z0jAriZISPX1ocTO8aHh8x8e7Kb1rB4Ms0nA/SzjtNOVJ4exVavQBCw=="],
|
|
28
|
-
|
|
29
|
-
"@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.3.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-eGUG7+hcLgGnMNl1KHVZUYxahYAhC462jF/wQolqu4qso2MSk32Q+QrpN7eN4jAHAg7FUMIo897muIhK4hXhqg=="],
|
|
30
|
-
|
|
31
|
-
"@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-XrIVi9YAW6ye0CGQ+yax0gLfx+BFOtKaNX74n+xHWla6Cl6huUmcKNO7HPx7BiKnJUzrxXY1qYlm7xMvi08X4g=="],
|
|
32
|
-
|
|
33
|
-
"@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.3.5", "", { "os": "linux", "cpu": "x64" }, "sha512-awVuycTPpVTH/+WDVnEEYSf6nbCBHf/4wB3lquwT7puhNg8R4XvonWNZzUsfHZrCkjkLhFH/vCZK5jHatD9FEg=="],
|
|
34
|
-
|
|
35
|
-
"@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.3.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-DlBiMlBZZ9eIq4H7RimDSGsYcOtfOIfZOaI5CqsWiSlbTfqbPVfWtCf92wNzx8GNMbu1s7/g3ZZESr6+GwM/SA=="],
|
|
36
|
-
|
|
37
|
-
"@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.3.5", "", { "os": "win32", "cpu": "x64" }, "sha512-nUmR8gb6yvrKhtRgzwo/gDimPwnO5a4sCydf8ZS2kHIJhEmSmk+STsusr1LHTuM//wXppBawvSQi2xFXJCdgKQ=="],
|
|
38
|
-
|
|
39
|
-
"@inquirer/ansi": ["@inquirer/ansi@2.0.2", "", {}, "sha512-SYLX05PwJVnW+WVegZt1T4Ip1qba1ik+pNJPDiqvk6zS5Y/i8PhRzLpGEtVd7sW0G8cMtkD8t4AZYhQwm8vnww=="],
|
|
40
|
-
|
|
41
|
-
"@inquirer/checkbox": ["@inquirer/checkbox@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-xtQP2eXMFlOcAhZ4ReKP2KZvDIBb1AnCfZ81wWXG3DXLVH0f0g4obE0XDPH+ukAEMRcZT0kdX2AS1jrWGXbpxw=="],
|
|
42
|
-
|
|
43
|
-
"@inquirer/confirm": ["@inquirer/confirm@6.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-lyEvibDFL+NA5R4xl8FUmNhmu81B+LDL9L/MpKkZlQDJZXzG8InxiqYxiAlQYa9cqLLhYqKLQwZqXmSTqCLjyw=="],
|
|
44
|
-
|
|
45
|
-
"@inquirer/core": ["@inquirer/core@11.1.0", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2", "cli-width": "^4.1.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^9.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-+jD/34T1pK8M5QmZD/ENhOfXdl9Zr+BrQAUc5h2anWgi7gggRq15ZbiBeLoObj0TLbdgW7TAIQRU2boMc9uOKQ=="],
|
|
46
|
-
|
|
47
|
-
"@inquirer/editor": ["@inquirer/editor@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/external-editor": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-wYyQo96TsAqIciP/r5D3cFeV8h4WqKQ/YOvTg5yOfP2sqEbVVpbxPpfV3LM5D0EP4zUI3EZVHyIUIllnoIa8OQ=="],
|
|
48
|
-
|
|
49
|
-
"@inquirer/expand": ["@inquirer/expand@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-2oINvuL27ujjxd95f6K2K909uZOU2x1WiAl7Wb1X/xOtL8CgQ1kSxzykIr7u4xTkXkXOAkCuF45T588/YKee7w=="],
|
|
50
|
-
|
|
51
|
-
"@inquirer/external-editor": ["@inquirer/external-editor@2.0.2", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-X/fMXK7vXomRWEex1j8mnj7s1mpnTeP4CO/h2gysJhHLT2WjBnLv4ZQEGpm/kcYI8QfLZ2fgW+9kTKD+jeopLg=="],
|
|
52
|
-
|
|
53
|
-
"@inquirer/figures": ["@inquirer/figures@2.0.2", "", {}, "sha512-qXm6EVvQx/FmnSrCWCIGtMHwqeLgxABP8XgcaAoywsL0NFga9gD5kfG0gXiv80GjK9Hsoz4pgGwF/+CjygyV9A=="],
|
|
54
|
-
|
|
55
|
-
"@inquirer/input": ["@inquirer/input@5.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-4R0TdWl53dtp79Vs6Df2OHAtA2FVNqya1hND1f5wjHWxZJxwDMSNB1X5ADZJSsQKYAJ5JHCTO+GpJZ42mK0Otw=="],
|
|
56
|
-
|
|
57
|
-
"@inquirer/number": ["@inquirer/number@4.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-TjQLe93GGo5snRlu83JxE38ZPqj5ZVggL+QqqAF2oBA5JOJoxx25GG3EGH/XN/Os5WOmKfO8iLVdCXQxXRZIMQ=="],
|
|
58
|
-
|
|
59
|
-
"@inquirer/password": ["@inquirer/password@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-rCozGbUMAHedTeYWEN8sgZH4lRCdgG/WinFkit6ZPsp8JaNg2T0g3QslPBS5XbpORyKP/I+xyBO81kFEvhBmjA=="],
|
|
60
|
-
|
|
61
|
-
"@inquirer/prompts": ["@inquirer/prompts@8.1.0", "", { "dependencies": { "@inquirer/checkbox": "^5.0.3", "@inquirer/confirm": "^6.0.3", "@inquirer/editor": "^5.0.3", "@inquirer/expand": "^5.0.3", "@inquirer/input": "^5.0.3", "@inquirer/number": "^4.0.3", "@inquirer/password": "^5.0.3", "@inquirer/rawlist": "^5.1.0", "@inquirer/search": "^4.0.3", "@inquirer/select": "^5.0.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-LsZMdKcmRNF5LyTRuZE5nWeOjganzmN3zwbtNfcs6GPh3I2TsTtF1UYZlbxVfhxd+EuUqLGs/Lm3Xt4v6Az1wA=="],
|
|
62
|
-
|
|
63
|
-
"@inquirer/rawlist": ["@inquirer/rawlist@5.1.0", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-yUCuVh0jW026Gr2tZlG3kHignxcrLKDR3KBp+eUgNz+BAdSeZk0e18yt2gyBr+giYhj/WSIHCmPDOgp1mT2niQ=="],
|
|
64
|
-
|
|
65
|
-
"@inquirer/search": ["@inquirer/search@4.0.3", "", { "dependencies": { "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-lzqVw0YwuKYetk5VwJ81Ba+dyVlhseHPx9YnRKQgwXdFS0kEavCz2gngnNhnMIxg8+j1N/rUl1t5s1npwa7bqg=="],
|
|
66
|
-
|
|
67
|
-
"@inquirer/select": ["@inquirer/select@5.0.3", "", { "dependencies": { "@inquirer/ansi": "^2.0.2", "@inquirer/core": "^11.1.0", "@inquirer/figures": "^2.0.2", "@inquirer/type": "^4.0.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-M+ynbwS0ecQFDYMFrQrybA0qL8DV0snpc4kKevCCNaTpfghsRowRY7SlQBeIYNzHqXtiiz4RG9vTOeb/udew7w=="],
|
|
68
|
-
|
|
69
|
-
"@inquirer/type": ["@inquirer/type@4.0.2", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-cae7mzluplsjSdgFA6ACLygb5jC8alO0UUnFPyu0E7tNRPrL+q/f8VcSXp+cjZQ7l5CMpDpi2G1+IQvkOiL1Lw=="],
|
|
70
|
-
|
|
71
|
-
"@types/node": ["@types/node@22.19.3", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="],
|
|
72
|
-
|
|
73
|
-
"ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
|
|
74
|
-
|
|
75
|
-
"ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
|
76
|
-
|
|
77
|
-
"bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="],
|
|
78
|
-
|
|
79
|
-
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
|
80
|
-
|
|
81
|
-
"chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
|
|
82
|
-
|
|
83
|
-
"cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
|
|
84
|
-
|
|
85
|
-
"commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
86
|
-
|
|
87
|
-
"emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
|
|
88
|
-
|
|
89
|
-
"get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
|
|
90
|
-
|
|
91
|
-
"iconv-lite": ["iconv-lite@0.7.1", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw=="],
|
|
92
|
-
|
|
93
|
-
"mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="],
|
|
94
|
-
|
|
95
|
-
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
|
|
96
|
-
|
|
97
|
-
"signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
|
|
98
|
-
|
|
99
|
-
"string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
|
|
100
|
-
|
|
101
|
-
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
|
102
|
-
|
|
103
|
-
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
104
|
-
|
|
105
|
-
"undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
|
|
106
|
-
|
|
107
|
-
"wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
|
|
108
|
-
}
|
|
109
|
-
}
|
package/plugins/exa/README.md
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
# Exa Plugin
|
|
2
|
-
|
|
3
|
-
Exa AI web search and websets tools for pi.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Install with default features (search only)
|
|
9
|
-
omp install @oh-my-pi/exa
|
|
10
|
-
|
|
11
|
-
# Install with all features
|
|
12
|
-
omp install @oh-my-pi/exa[*]
|
|
13
|
-
|
|
14
|
-
# Install with specific features
|
|
15
|
-
omp install @oh-my-pi/exa[search,linkedin,websets]
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Features
|
|
19
|
-
|
|
20
|
-
| Feature | Default | Description | Tools |
|
|
21
|
-
|---------|---------|-------------|-------|
|
|
22
|
-
| `search` | ✓ | Core web search capabilities | 4 tools |
|
|
23
|
-
| `linkedin` | | LinkedIn profile and company search | 1 tool |
|
|
24
|
-
| `company` | | Comprehensive company research | 1 tool |
|
|
25
|
-
| `researcher` | | Long-running AI research tasks | 2 tools |
|
|
26
|
-
| `websets` | | Entity collection management | 14 tools |
|
|
27
|
-
|
|
28
|
-
Manage features after install:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
omp features @oh-my-pi/exa # Interactive UI or list features
|
|
32
|
-
omp features @oh-my-pi/exa --enable websets # Enable websets
|
|
33
|
-
omp features @oh-my-pi/exa --disable search # Disable search
|
|
34
|
-
omp features @oh-my-pi/exa --set search,linkedin,websets # Set exact features
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Feature state is stored in `runtime.json` which is copied (not symlinked) to the install location. You can also edit it directly:
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
cat ~/.pi/agent/tools/exa/runtime.json
|
|
41
|
-
# {"features": ["search"], "options": {}}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Setup
|
|
45
|
-
|
|
46
|
-
Set your Exa API key:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
# Option 1: Use omp config
|
|
50
|
-
omp config @oh-my-pi/exa apiKey YOUR_API_KEY
|
|
51
|
-
|
|
52
|
-
# Option 2: Environment variable
|
|
53
|
-
export EXA_API_KEY=YOUR_API_KEY
|
|
54
|
-
|
|
55
|
-
# Option 3: .env file in current directory or ~/.env
|
|
56
|
-
echo "EXA_API_KEY=YOUR_API_KEY" >> ~/.env
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Get your API key from: https://dashboard.exa.ai/api-keys
|
|
60
|
-
|
|
61
|
-
## Tools
|
|
62
|
-
|
|
63
|
-
### search (default)
|
|
64
|
-
|
|
65
|
-
| Tool | Description |
|
|
66
|
-
|------|-------------|
|
|
67
|
-
| `web_search_general` | Real-time web searches with content extraction |
|
|
68
|
-
| `web_search_deep` | Natural language web search with synthesized results |
|
|
69
|
-
| `web_search_code_context` | Search code snippets, docs, and examples |
|
|
70
|
-
| `web_search_crawl_url` | Extract content from specific URLs |
|
|
71
|
-
|
|
72
|
-
### linkedin
|
|
73
|
-
|
|
74
|
-
| Tool | Description |
|
|
75
|
-
|------|-------------|
|
|
76
|
-
| `web_search_linkedin` | Search LinkedIn profiles and companies |
|
|
77
|
-
|
|
78
|
-
### company
|
|
79
|
-
|
|
80
|
-
| Tool | Description |
|
|
81
|
-
|------|-------------|
|
|
82
|
-
| `web_search_company_research` | Comprehensive company research |
|
|
83
|
-
|
|
84
|
-
### researcher
|
|
85
|
-
|
|
86
|
-
| Tool | Description |
|
|
87
|
-
|------|-------------|
|
|
88
|
-
| `web_search_researcher_start` | Start comprehensive AI-powered research task |
|
|
89
|
-
| `web_search_researcher_check` | Check research task status and get results |
|
|
90
|
-
|
|
91
|
-
### websets
|
|
92
|
-
|
|
93
|
-
| Tool | Description |
|
|
94
|
-
|------|-------------|
|
|
95
|
-
| `webset_create` | Create entity collections with search and enrichments |
|
|
96
|
-
| `webset_list` | List all websets in your account |
|
|
97
|
-
| `webset_get` | Get detailed webset information |
|
|
98
|
-
| `webset_update` | Update webset metadata |
|
|
99
|
-
| `webset_delete` | Delete a webset |
|
|
100
|
-
| `webset_items_list` | List items in a webset |
|
|
101
|
-
| `webset_item_get` | Get item details |
|
|
102
|
-
| `webset_search_create` | Add search to find entities for a webset |
|
|
103
|
-
| `webset_search_get` | Check search status |
|
|
104
|
-
| `webset_search_cancel` | Cancel running search |
|
|
105
|
-
| `webset_enrichment_create` | Extract custom data from webset items |
|
|
106
|
-
| `webset_enrichment_get` | Get enrichment details |
|
|
107
|
-
| `webset_enrichment_update` | Update enrichment metadata |
|
|
108
|
-
| `webset_enrichment_delete` | Delete enrichment |
|
|
109
|
-
| `webset_enrichment_cancel` | Cancel running enrichment |
|
|
110
|
-
| `webset_monitor_create` | Auto-update webset on schedule |
|
|
111
|
-
|
|
112
|
-
## Usage Examples
|
|
113
|
-
|
|
114
|
-
### Code Search
|
|
115
|
-
```
|
|
116
|
-
Find examples of how to use React hooks with TypeScript
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Web Search
|
|
120
|
-
```
|
|
121
|
-
Search for the latest news about AI regulation in the EU
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### Company Research (requires company feature)
|
|
125
|
-
```
|
|
126
|
-
Research the company OpenAI and find information about their products
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### Deep Research (requires researcher feature)
|
|
130
|
-
```
|
|
131
|
-
Start a deep research project on the impact of large language models on software development
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Websets (requires websets feature)
|
|
135
|
-
```
|
|
136
|
-
Create a webset of AI startups in San Francisco founded after 2020,
|
|
137
|
-
find 10 companies and enrich with CEO name and funding amount
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## How It Works
|
|
141
|
-
|
|
142
|
-
The plugin connects to Exa's hosted MCP (Model Context Protocol) servers:
|
|
143
|
-
- `https://mcp.exa.ai/mcp` - Search tools
|
|
144
|
-
- `https://websetsmcp.exa.ai/mcp` - Websets tools
|
|
145
|
-
|
|
146
|
-
Tools are dynamically fetched from these servers, so you always get the latest available tools.
|
|
147
|
-
|
|
148
|
-
## Resources
|
|
149
|
-
|
|
150
|
-
- [Exa Dashboard](https://dashboard.exa.ai/)
|
|
151
|
-
- [Exa MCP Documentation](https://docs.exa.ai/reference/exa-mcp)
|
|
152
|
-
- [Websets MCP Documentation](https://docs.exa.ai/reference/websets-mcp)
|
|
153
|
-
- [Exa API Documentation](https://docs.exa.ai/)
|
package/plugins/exa/package.json
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@oh-my-pi/exa",
|
|
3
|
-
"version": "0.3.0",
|
|
4
|
-
"description": "Exa AI web search and websets tools for pi",
|
|
5
|
-
"keywords": ["omp-plugin", "exa", "web-search", "websets", "ai-search"],
|
|
6
|
-
"author": "Can Bölük <me@can.ac>",
|
|
7
|
-
"license": "MIT",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "https://github.com/can1357/oh-my-pi.git",
|
|
11
|
-
"directory": "plugins/exa"
|
|
12
|
-
},
|
|
13
|
-
"omp": {
|
|
14
|
-
"install": [
|
|
15
|
-
{ "src": "tools/exa/runtime.json", "dest": "agent/tools/exa/runtime.json", "copy": true },
|
|
16
|
-
{ "src": "tools/exa/index.ts", "dest": "agent/tools/exa/index.ts" },
|
|
17
|
-
{ "src": "tools/exa/shared.ts", "dest": "agent/tools/exa/shared.ts" },
|
|
18
|
-
{ "src": "tools/exa/search.ts", "dest": "agent/tools/exa/search.ts" },
|
|
19
|
-
{ "src": "tools/exa/linkedin.ts", "dest": "agent/tools/exa/linkedin.ts" },
|
|
20
|
-
{ "src": "tools/exa/company.ts", "dest": "agent/tools/exa/company.ts" },
|
|
21
|
-
{ "src": "tools/exa/researcher.ts", "dest": "agent/tools/exa/researcher.ts" },
|
|
22
|
-
{ "src": "tools/exa/websets.ts", "dest": "agent/tools/exa/websets.ts" }
|
|
23
|
-
],
|
|
24
|
-
"variables": {
|
|
25
|
-
"apiKey": {
|
|
26
|
-
"type": "string",
|
|
27
|
-
"env": "EXA_API_KEY",
|
|
28
|
-
"description": "Exa API key for authentication",
|
|
29
|
-
"required": true
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
"features": {
|
|
33
|
-
"search": {
|
|
34
|
-
"description": "Core web search (general, deep, code context, URL crawling)",
|
|
35
|
-
"default": true
|
|
36
|
-
},
|
|
37
|
-
"linkedin": {
|
|
38
|
-
"description": "LinkedIn profile and company search",
|
|
39
|
-
"default": false
|
|
40
|
-
},
|
|
41
|
-
"company": {
|
|
42
|
-
"description": "Comprehensive company research",
|
|
43
|
-
"default": false
|
|
44
|
-
},
|
|
45
|
-
"researcher": {
|
|
46
|
-
"description": "Long-running AI research tasks",
|
|
47
|
-
"default": false
|
|
48
|
-
},
|
|
49
|
-
"websets": {
|
|
50
|
-
"description": "Entity collection management (14 tools)",
|
|
51
|
-
"default": false
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
"files": ["tools"]
|
|
56
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Exa Company Research Tool
|
|
3
|
-
*
|
|
4
|
-
* Tools:
|
|
5
|
-
* - web_search_company_research: Comprehensive company research
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { TSchema } from "@sinclair/typebox";
|
|
9
|
-
import type { CustomAgentTool, CustomToolFactory, ToolAPI } from "@mariozechner/pi-coding-agent";
|
|
10
|
-
import { callExaTool, createToolWrapper, fetchExaTools, findApiKey } from "./shared";
|
|
11
|
-
|
|
12
|
-
// MCP tool names for this feature
|
|
13
|
-
const TOOL_NAMES = ["company_research_exa"];
|
|
14
|
-
|
|
15
|
-
// Tool name mapping: MCP name -> exposed name
|
|
16
|
-
const NAME_MAP: Record<string, string> = {
|
|
17
|
-
"company_research_exa": "web_search_company_research",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const factory: CustomToolFactory = async (_toolApi: ToolAPI): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
|
|
21
|
-
const apiKey = findApiKey();
|
|
22
|
-
if (!apiKey) return null;
|
|
23
|
-
|
|
24
|
-
const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
|
|
25
|
-
if (mcpTools.length === 0) return null;
|
|
26
|
-
|
|
27
|
-
const callFn = (toolName: string, args: Record<string, unknown>) =>
|
|
28
|
-
callExaTool(apiKey, TOOL_NAMES, toolName, args);
|
|
29
|
-
|
|
30
|
-
return mcpTools.map((tool) =>
|
|
31
|
-
createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn)
|
|
32
|
-
);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export default factory;
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Exa Tools - Dynamic loader for feature modules
|
|
3
|
-
*
|
|
4
|
-
* Reads runtime.json to determine which features are enabled,
|
|
5
|
-
* then loads and initializes those feature modules.
|
|
6
|
-
*
|
|
7
|
-
* Available features:
|
|
8
|
-
* - search: Core web search (general, deep, code context, URL crawling)
|
|
9
|
-
* - linkedin: LinkedIn profile and company search
|
|
10
|
-
* - company: Comprehensive company research
|
|
11
|
-
* - researcher: Long-running AI research tasks
|
|
12
|
-
* - websets: Entity collection management
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import type { TSchema } from "@sinclair/typebox";
|
|
16
|
-
import type { CustomAgentTool, CustomToolFactory, ToolAPI } from "@mariozechner/pi-coding-agent";
|
|
17
|
-
import runtime from "./runtime.json";
|
|
18
|
-
|
|
19
|
-
// Map feature names to their module imports
|
|
20
|
-
const FEATURE_LOADERS: Record<string, () => Promise<{ default: CustomToolFactory }>> = {
|
|
21
|
-
search: () => import("./search"),
|
|
22
|
-
linkedin: () => import("./linkedin"),
|
|
23
|
-
company: () => import("./company"),
|
|
24
|
-
researcher: () => import("./researcher"),
|
|
25
|
-
websets: () => import("./websets"),
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Factory function that loads enabled features from runtime.json
|
|
30
|
-
*/
|
|
31
|
-
const factory: CustomToolFactory = async (toolApi: ToolAPI): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
|
|
32
|
-
const allTools: CustomAgentTool<TSchema, unknown>[] = [];
|
|
33
|
-
const enabledFeatures = runtime.features ?? [];
|
|
34
|
-
|
|
35
|
-
for (const feature of enabledFeatures) {
|
|
36
|
-
const loader = FEATURE_LOADERS[feature];
|
|
37
|
-
if (!loader) {
|
|
38
|
-
console.error(`Unknown exa feature: "${feature}"`);
|
|
39
|
-
continue;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
const module = await loader();
|
|
44
|
-
const featureFactory = module.default;
|
|
45
|
-
|
|
46
|
-
if (typeof featureFactory === "function") {
|
|
47
|
-
const result = await featureFactory(toolApi);
|
|
48
|
-
// Handle both single tool and array of tools
|
|
49
|
-
if (result) {
|
|
50
|
-
const tools = Array.isArray(result) ? result : [result];
|
|
51
|
-
for (const tool of tools) {
|
|
52
|
-
if (tool && typeof tool === "object" && "name" in tool) {
|
|
53
|
-
allTools.push(tool);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
} catch (error) {
|
|
59
|
-
console.error(`Failed to load exa feature "${feature}":`, error);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return allTools.length > 0 ? allTools : null;
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
export default factory;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Exa LinkedIn Search Tool
|
|
3
|
-
*
|
|
4
|
-
* Tools:
|
|
5
|
-
* - web_search_linkedin: Search LinkedIn profiles and companies
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { TSchema } from "@sinclair/typebox";
|
|
9
|
-
import type { CustomAgentTool, CustomToolFactory, ToolAPI } from "@mariozechner/pi-coding-agent";
|
|
10
|
-
import { callExaTool, createToolWrapper, fetchExaTools, findApiKey } from "./shared";
|
|
11
|
-
|
|
12
|
-
// MCP tool names for this feature
|
|
13
|
-
const TOOL_NAMES = ["linkedin_search_exa"];
|
|
14
|
-
|
|
15
|
-
// Tool name mapping: MCP name -> exposed name
|
|
16
|
-
const NAME_MAP: Record<string, string> = {
|
|
17
|
-
"linkedin_search_exa": "web_search_linkedin",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const factory: CustomToolFactory = async (_toolApi: ToolAPI): Promise<CustomAgentTool<TSchema, unknown>[] | null> => {
|
|
21
|
-
const apiKey = findApiKey();
|
|
22
|
-
if (!apiKey) return null;
|
|
23
|
-
|
|
24
|
-
const mcpTools = await fetchExaTools(apiKey, TOOL_NAMES);
|
|
25
|
-
if (mcpTools.length === 0) return null;
|
|
26
|
-
|
|
27
|
-
const callFn = (toolName: string, args: Record<string, unknown>) =>
|
|
28
|
-
callExaTool(apiKey, TOOL_NAMES, toolName, args);
|
|
29
|
-
|
|
30
|
-
return mcpTools.map((tool) =>
|
|
31
|
-
createToolWrapper(tool, NAME_MAP[tool.name] ?? tool.name, callFn)
|
|
32
|
-
);
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
export default factory;
|