@springbrand/cli 0.1.1 → 0.1.2-alpha.1

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 (54) hide show
  1. package/README.md +2 -2
  2. package/assets/springbrand-icon.svg +18 -0
  3. package/dist/commands/connect.d.ts.map +1 -1
  4. package/dist/commands/connect.js +35 -6
  5. package/dist/commands/connect.js.map +1 -1
  6. package/dist/commands/uninstall.d.ts +3 -0
  7. package/dist/commands/uninstall.d.ts.map +1 -0
  8. package/dist/commands/uninstall.js +71 -0
  9. package/dist/commands/uninstall.js.map +1 -0
  10. package/dist/index.js +0 -0
  11. package/dist/lib/codex-plugin.d.ts +7 -0
  12. package/dist/lib/codex-plugin.d.ts.map +1 -0
  13. package/dist/lib/codex-plugin.js +132 -0
  14. package/dist/lib/codex-plugin.js.map +1 -0
  15. package/dist/lib/connect-clients.d.ts +5 -0
  16. package/dist/lib/connect-clients.d.ts.map +1 -1
  17. package/dist/lib/connect-clients.js +8 -4
  18. package/dist/lib/connect-clients.js.map +1 -1
  19. package/dist/lib/cursor-config.d.ts.map +1 -1
  20. package/dist/lib/cursor-config.js +7 -3
  21. package/dist/lib/cursor-config.js.map +1 -1
  22. package/dist/lib/hermes-plugin.d.ts.map +1 -1
  23. package/dist/lib/hermes-plugin.js +2 -1
  24. package/dist/lib/hermes-plugin.js.map +1 -1
  25. package/dist/lib/mcp-endpoint.d.ts +2 -0
  26. package/dist/lib/mcp-endpoint.d.ts.map +1 -1
  27. package/dist/lib/mcp-endpoint.js +4 -0
  28. package/dist/lib/mcp-endpoint.js.map +1 -1
  29. package/dist/lib/omp-config.d.ts.map +1 -1
  30. package/dist/lib/omp-config.js +3 -2
  31. package/dist/lib/omp-config.js.map +1 -1
  32. package/dist/lib/pi-config.d.ts.map +1 -1
  33. package/dist/lib/pi-config.js +3 -2
  34. package/dist/lib/pi-config.js.map +1 -1
  35. package/dist/lib/skill-install.d.ts +3 -0
  36. package/dist/lib/skill-install.d.ts.map +1 -1
  37. package/dist/lib/skill-install.js +7 -1
  38. package/dist/lib/skill-install.js.map +1 -1
  39. package/dist/lib/skill-vendor.d.ts +2 -0
  40. package/dist/lib/skill-vendor.d.ts.map +1 -1
  41. package/dist/lib/skill-vendor.js +14 -0
  42. package/dist/lib/skill-vendor.js.map +1 -1
  43. package/dist/lib/uninstall.d.ts +23 -0
  44. package/dist/lib/uninstall.d.ts.map +1 -0
  45. package/dist/lib/uninstall.js +72 -0
  46. package/dist/lib/uninstall.js.map +1 -0
  47. package/dist/lib/workbuddy-config.d.ts.map +1 -1
  48. package/dist/lib/workbuddy-config.js +2 -1
  49. package/dist/lib/workbuddy-config.js.map +1 -1
  50. package/package.json +2 -1
  51. package/skill/springbrand-action-api/SKILL.md +24 -8
  52. package/skill/springbrand-action-api/references/action-discovery.md +13 -15
  53. package/skill/use-springbrand/SKILL.md +2 -3
  54. package/skill/springbrand-action-api/references/action-aliases.md +0 -156
@@ -0,0 +1,72 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { clearApiKeyFromEnvironment, clearConfig, configFile, resolveProfilePath } from './auth.js';
5
+ import { clearSkillLockEntry } from './skill-vendor.js';
6
+ import { skillLockPath, skillTargetDir } from './skill-paths.js';
7
+ const SKILL_AGENTS = ['claude-code', 'codex', 'command-code', 'cursor', 'hermes-agent', 'opencode', 'pi'];
8
+ export function uninstallPlan() {
9
+ return {
10
+ skillDirs: [...new Set(SKILL_AGENTS.map(skillTargetDir))],
11
+ skillLock: skillLockPath(),
12
+ config: configFile(),
13
+ profile: resolveProfilePath(path.basename(process.env['SHELL'] ?? ''), process.platform),
14
+ cliPackage: '@springbrand/cli',
15
+ };
16
+ }
17
+ function backupRoot() {
18
+ return path.join(os.homedir(), '.springbrand', 'uninstall-backups', String(Date.now()));
19
+ }
20
+ /** Move exact SpringBrand skill directories aside so an uninstall remains recoverable. */
21
+ export function applySkillRemoval(skillDirs, root = backupRoot()) {
22
+ const existing = skillDirs.filter((dir) => fs.existsSync(dir));
23
+ if (existing.length === 0)
24
+ return { moved: [] };
25
+ fs.mkdirSync(root, { recursive: true, mode: 0o700 });
26
+ const moved = [];
27
+ for (const dir of existing) {
28
+ const relative = path.relative(os.homedir(), dir);
29
+ const backupName = relative.split(path.sep).map((part) => part === '..' ? 'up' : part).join('-').replace(/[^A-Za-z0-9._-]/g, '_');
30
+ const destination = path.join(root, backupName);
31
+ fs.mkdirSync(path.dirname(destination), { recursive: true, mode: 0o700 });
32
+ fs.renameSync(dir, destination);
33
+ moved.push(dir);
34
+ }
35
+ return { moved, backupRoot: root };
36
+ }
37
+ export function removeLocalState() {
38
+ return {
39
+ configRemoved: clearConfig(),
40
+ profile: clearApiKeyFromEnvironment(),
41
+ };
42
+ }
43
+ export function clearSkillLock() {
44
+ clearSkillLockEntry({ verbose: true });
45
+ }
46
+ export function hasLocalCredential() {
47
+ try {
48
+ const parsed = JSON.parse(fs.readFileSync(configFile(), 'utf8'));
49
+ return typeof parsed.api_key === 'string' && parsed.api_key.length > 0;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ export function hasSkill(dir) {
56
+ try {
57
+ return fs.lstatSync(dir).isDirectory();
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ export function hasSkillLockEntry() {
64
+ try {
65
+ const parsed = JSON.parse(fs.readFileSync(skillLockPath(), 'utf8'));
66
+ return Boolean(parsed.skills && Object.hasOwn(parsed.skills, 'use-springbrand'));
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/lib/uninstall.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"workbuddy-config.d.ts","sourceRoot":"","sources":["../../src/lib/workbuddy-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAYnF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,6BAA6B,IAAI,kBAAkB,CAElE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAE3F;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
1
+ {"version":3,"file":"workbuddy-config.d.ts","sourceRoot":"","sources":["../../src/lib/workbuddy-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAanF,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,6BAA6B,IAAI,kBAAkB,CAElE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAE3F;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
@@ -2,6 +2,7 @@
2
2
  import * as os from 'node:os';
3
3
  import * as path from 'node:path';
4
4
  import { planWrite, readSpringbrandEntry, removeServer, writeMcpConfig } from './mcp-json-config.js';
5
+ import { mcpServerName } from './mcp-endpoint.js';
5
6
  const WORKBUDDY_TARGET = {
6
7
  serverKey: 'springbrand',
7
8
  dir: () => path.join(os.homedir(), '.workbuddy-ai'),
@@ -18,7 +19,7 @@ export function readWorkbuddySpringbrandEntry() {
18
19
  return readSpringbrandEntry(WORKBUDDY_TARGET);
19
20
  }
20
21
  export function writeWorkbuddyMcpConfig(mcpUrl, apiKey) {
21
- return writeMcpConfig(WORKBUDDY_TARGET, mcpUrl, apiKey);
22
+ return writeMcpConfig({ ...WORKBUDDY_TARGET, serverKey: mcpServerName(mcpUrl) }, mcpUrl, apiKey);
22
23
  }
23
24
  export function removeWorkbuddyMcpServer() {
24
25
  return removeServer(WORKBUDDY_TARGET);
@@ -1 +1 @@
1
- {"version":3,"file":"workbuddy-config.js","sourceRoot":"","sources":["../../src/lib/workbuddy-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAGhE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAErG,MAAM,gBAAgB,GAAG;IACrB,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;IACnD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC;IAChE,IAAI,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC5B,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAe;IAC9D,OAAO,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,6BAA6B;IACzC,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAAe;IACnE,OAAO,cAAc,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB;IACpC,OAAO,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"workbuddy-config.js","sourceRoot":"","sources":["../../src/lib/workbuddy-config.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAGhE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,gBAAgB,GAAG;IACrB,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,CAAC;IACnD,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC;IAChE,IAAI,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,UAAU,gBAAgB;IAC5B,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAe;IAC9D,OAAO,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,6BAA6B;IACzC,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,MAAe;IACnE,OAAO,cAAc,CAAC,EAAE,GAAG,gBAAgB,EAAE,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,wBAAwB;IACpC,OAAO,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@springbrand/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2-alpha.1",
4
4
  "description": "SpringBrand CLI — connect MCP hosts to the SpringBrand Gateway",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "dist",
11
11
  "skill",
12
+ "assets",
12
13
  "README.md"
13
14
  ],
14
15
  "publishConfig": {
@@ -5,17 +5,32 @@ description: Use SpringBrand Action APIs for available API services and their op
5
5
 
6
6
  # SpringBrand Action API
7
7
 
8
- Use the unified SpringBrand MCP for SpringBrand-managed API services. The CLI
9
- has already configured and authenticated the MCP connection. This Skill does
10
- not manage third-party connections or install a service.
8
+ Use the unified SpringBrand MCP through the generic Tool contract. The CLI has
9
+ already configured and authenticated the MCP connection. Tool-specific
10
+ purpose, usage, prerequisites and follow-up behavior come from the selected
11
+ Tool description. This Skill does not manage third-party connections or
12
+ install a service.
11
13
 
12
14
  ## Discover and inspect
13
15
 
16
+ Ask one focused question only when a missing service, platform, operation,
17
+ object or modality, output, input, time range, or budget decision blocks
18
+ discovery or schema-valid input. Do not ask for a Tool ID or implementation
19
+ name; discover those from the live catalog.
20
+
14
21
  Call `search_tools` once with one concise English query that states the
15
22
  intended result, service, important input, and output. Search results are
16
- bounded; an incomplete result is not proof of absence. Select an Action API
17
- operation, copy its opaque Tool ID unchanged, and call `get_tool_schemas` for
18
- its current input and output contract.
23
+ bounded; an incomplete result is not proof of absence. Select an operation,
24
+ copy its opaque Tool ID unchanged, and call `get_tool_schemas` for its current
25
+ description and input/output contract. Use any returned `recommendedPrompt` as
26
+ current Tool guidance; do not replace it with a static catalogue entry.
27
+
28
+ `get_tool_schemas` returns `{ tools: [...] }`. Each public Tool Contract has
29
+ `toolId`, `name`, `description`, and `inputSchema`, and may include
30
+ `outputSchema`, `summary`, `recommendedPrompt`, `price`, `risk`, `access`,
31
+ `revision`, `notes`, `usage`, `hints`, `billing`, `produces`,
32
+ `attachmentInputFields`, `auth`, and `relatedTools`. Use the current schemas
33
+ and description as the source of truth.
19
34
 
20
35
  Do not parse a Tool ID to infer a supplier, model, version, or domain. Do not
21
36
  execute a result whose described effect belongs to Platform or Connector; use
@@ -28,8 +43,9 @@ charge, reported risk, and any output limitation. Ask for missing business
28
43
  values rather than using placeholders. Execute once with schema-valid
29
44
  arguments and a stable idempotency key.
30
45
 
31
- Only `succeeded` means complete. If an execution ID is returned, copy it
32
- exactly and use `get_execution` to read its status or saved result. Running or
46
+ Read the returned Tool description before execution. Only `succeeded` means
47
+ complete. If an execution ID is returned, copy it exactly and use
48
+ `get_execution` to read its status or saved result. Running or
33
49
  queued remains in progress. A failed or cancelled result is reported with its
34
50
  actual safe reason. `outcome_unknown` means the request may have taken effect:
35
51
  never retry or re-execute automatically; verify the external effect using the
@@ -6,27 +6,23 @@ remain authoritative.
6
6
 
7
7
  ## Build one search
8
8
 
9
- Call `search_tools` with one concise English query. Translate a non-English
9
+ Call `search_tools` once with one concise English query. Translate a non-English
10
10
  request yourself and preserve every explicit constraint that distinguishes the
11
11
  operation: required supplier, platform or product, operation, object or
12
12
  modality, and output type. Keep topic content, dates, formatting preferences,
13
13
  and other execution arguments in task state unless they help identify the
14
14
  operation.
15
15
 
16
- Use [action-aliases.md](action-aliases.md) only to canonicalize an unambiguous
17
- concept. Do not invent a supplier, model version, platform, operation, or
18
- modality. Do not send synonyms as multiple searches.
16
+ The query can search the currently available operations by intended result,
17
+ service or supplier, platform or product, operation, object or modality, and
18
+ required output. It searches the live bounded catalog; it does not search a
19
+ local alias table or require a pre-known Tool ID. Ask one focused question when
20
+ safe refinement lacks one of these decisions; otherwise search immediately.
19
21
 
20
- Examples of useful queries:
21
-
22
- - `Xiaohongshu note search`
23
- - `TikHub Xiaohongshu note search` only when the user explicitly requires
24
- TikHub
25
- - `text to image`
26
- - `Seedance 2.0 image to video` when both model and modality were explicit
27
-
28
- SpringBrand host names, courtesy language, and generic phrases such as "use
29
- an API" do not distinguish an Action and should not dominate the query.
22
+ Do not invent a supplier, model version, platform, operation, or modality. Do
23
+ not send synonyms as multiple searches. SpringBrand host names, courtesy
24
+ language, and generic phrases such as "use an API" do not distinguish an
25
+ operation and should not dominate the query.
30
26
 
31
27
  ## Interpret the bounded result
32
28
 
@@ -73,10 +69,12 @@ ID unchanged to `get_tool_schemas` and use the returned current contract to
73
69
  check:
74
70
 
75
71
  - the operation description and access state;
72
+ - any current `recommendedPrompt` guidance returned with the Tool;
76
73
  - exact input and output schemas;
77
74
  - risk and known costs;
78
75
  - revision information;
79
- - attachment and produced-material requirements.
76
+ - attachment and produced-material requirements;
77
+ - the Tool description's own usage instructions.
80
78
 
81
79
  Never construct, edit, decode, or classify the Tool ID. A contract error is a
82
80
  lookup failure, not proof that the Action does not exist. Do not fall through
@@ -65,6 +65,5 @@ workflow.
65
65
  ## Results
66
66
 
67
67
  Only `succeeded` means an operation completed. A running or queued execution
68
- remains in progress; use `get_execution` only with the exact returned ID. Keep
69
- saved image previews and links as returned by the Gateway and do not fetch an
70
- original file merely to improve presentation.
68
+ remains in progress; use `get_execution` only with the exact returned ID. Use
69
+ the selected Tool description and returned contract to interpret its result.
@@ -1,156 +0,0 @@
1
- # Action discovery alias map
2
-
3
- Use this map when a request names an API service, supplier, platform/product,
4
- model, object, or operation through an abbreviation, alternative spelling, or
5
- non-English name. It converts that wording into one catalogue-facing English
6
- form for the unified `search_tools` query; it does not choose or authorize an
7
- Action.
8
-
9
- Do not invent a supplier, model version, platform, operation, or modality when
10
- an alias is ambiguous.
11
-
12
- ## Inventory provenance and maintenance
13
-
14
- This snapshot was audited on 2026-09-05 against the then-current Action
15
- inventory, which contained 52 entries across the ten Supplier ID families
16
- listed below. It is a terminology aid, not a current availability guarantee.
17
-
18
- The mappings below were curated from public catalogue text and common,
19
- unambiguous names; never claim that the service returned them as alias
20
- metadata. Never copy an ID from this historical snapshot into contract lookup
21
- or execution: only a current opaque Tool ID returned by unified discovery is
22
- usable.
23
-
24
- This is a temporary Agent-side discovery aid. Current unified discovery is
25
- bounded rather than a complete inventory, so update the map only from an
26
- authoritative catalogue audit outside a user workflow. A later server-side
27
- discovery improvement should replace the need for this maintained map.
28
-
29
- ## Inventory coverage
30
-
31
- | Supplier ID family | Entries | Public catalogue families reviewed |
32
- | --- | ---: | --- |
33
- | `supplier.frank.apify` | 9 | Facebook Ad Library; Reddit scraper and monitor; Google Keyword Volume, Maps Reviews, and Trends; Instagram Profile; TikTok Ads and Data |
34
- | `supplier.frank.apollo-io` | 2 | Organization Enrichment; People Search |
35
- | `supplier.frank.elevenlabs` | 1 | Text to Speech |
36
- | `supplier.frank.exa` | 2 | Web Content Extraction; Web Search |
37
- | `supplier.frank.firecrawl` | 3 | Structured Data Extraction; Web Scraping; Web Search and Scrape |
38
- | `supplier.frank.kie-ai-image` | 5 | Seedream 5 Lite image-to-image and text-to-image; Nano Banana 2; GPT Image 2 image-to-image and text-to-image |
39
- | `supplier.frank.kie-ai-video` | 3 | Seedance 2.0 Fast, Mini, and standard video |
40
- | `supplier.frank.people-data-labs` | 2 | Company and Person Enrichment |
41
- | `supplier.frank.serper` | 5 | Google Image, Maps, News, Places, and Shopping Search |
42
- | `supplier.frank.tikhub` | 20 | Instagram (4); Reddit (2); TikTok (4); X (3); Xiaohongshu (4); YouTube (3) |
43
-
44
- ## Canonicalization rules
45
-
46
- - Match aliases case-insensitively after ordinary Unicode normalization. For short
47
- abbreviations such as `X`, `IG`, `TT`, `YT`, `PDL`, `TTS`, `T2I`, and `I2V`,
48
- require a whole token and capability-relevant context.
49
- - Prefer the longest, most specific alias when forms overlap. Preserve explicit
50
- model variants such as `Fast` and `Mini`, and preserve every platform,
51
- supplier, operation, object, and modality constraint the user actually gave.
52
- - Preserve canonical phrases such as `Text to Image` and `Image to Video`
53
- intact when extracting keywords; `to` defines the modality direction.
54
- - Emit one canonical English form in the search query. Do not stuff aliases
55
- into the query and do not fan out multiple searches.
56
- - An alias supplies only the concept in its row. A platform alias does not
57
- invent an operation or object, and a model-family alias does not invent a
58
- version or input modality.
59
- - Treat the canonicalized concept as a hard compatibility constraint when the
60
- user stated it explicitly. Include a supplier in the query only when the
61
- user explicitly requires that supplier.
62
-
63
- ## Service and supplier aliases
64
-
65
- Every current entry uses a `supplier.frank.*` Supplier ID. `Frank` alone is
66
- non-discriminating across the present inventory, so omit it from the search
67
- query unless the user explicitly makes it a constraint.
68
-
69
- | Canonical form | Curated aliases | Current inventory family |
70
- | --- | --- | --- |
71
- | `Apify` | — | `supplier.frank.apify` |
72
- | `Apollo` | `Apollo.io`, `Apollo IO` | `supplier.frank.apollo-io` |
73
- | `ElevenLabs` | `Eleven Labs`, `11Labs` | `supplier.frank.elevenlabs` |
74
- | `Exa` | `Exa.ai` | `supplier.frank.exa` |
75
- | `Firecrawl` | `Fire Crawl` | `supplier.frank.firecrawl` |
76
- | `Kie.ai` | `Kie AI`, `KIE` | `supplier.frank.kie-ai-image`, `supplier.frank.kie-ai-video` |
77
- | `People Data Labs` | `PDL`, `PeopleDataLabs`, `People DataLabs` | `supplier.frank.people-data-labs` |
78
- | `Serper` | `Serper.dev` | `supplier.frank.serper` |
79
- | `TikHub` | `Tik Hub` | `supplier.frank.tikhub` |
80
-
81
- ## Platform and product aliases
82
-
83
- | Canonical form | Curated aliases | Current inventory scope |
84
- | --- | --- | --- |
85
- | `Facebook Ad Library` | `Facebook Ads Library`, `FB Ad Library`, `Meta Ad Library`, `Meta Ads Library`, `脸书广告库` | `action.apify.scrape_facebook_ad_library` |
86
- | `Reddit` | `红迪` | `action.apify.scrape_reddit__practical-tools-apify`, `action.apify.monitor_reddit_mentions`, `action.tikhub.reddit-*` |
87
- | `Google Keyword Volume` | `Google Search Volume`, `keyword search volume`, `关键词搜索量` | `action.apify.keyword_volume` |
88
- | `Google Maps` | `Google Map`, `GMaps`, `谷歌地图` | `action.apify.scrape_google_maps_reviews`, `action.serper.maps` |
89
- | `Google Trends` | `GTrends`, `谷歌趋势` | `action.apify.scrape_google_trends` |
90
- | `Instagram` | `IG`, `Insta` | `action.apify.scrape_profiles`, `action.tikhub.instagram-*` |
91
- | `TikTok Ads Library` | `TikTok Ads`, `TikTok广告库` | `action.apify.scrape_tiktok_ads_library` |
92
- | `TikTok` | `Tik Tok`, `TT`, `抖音国际版`, `国际版抖音` | `action.apify.tiktok_api`, `action.tikhub.tiktok-*` |
93
- | `Douyin` | `抖音`, `抖音短视频` | `catalogue-summary-only` |
94
- | `X` | `Twitter`, `推特`, `X.com`, `X/Twitter` | `action.tikhub.twitter-*` |
95
- | `Xiaohongshu` | `xhs`, `小红书`, `RedNote`, `Red Note`, `little red book`, `RED` | `action.tikhub.xhs-*` |
96
- | `YouTube` | `YT`, `You Tube`, `油管` | `action.tikhub.youtube-*` |
97
- | `Google Image` | `Google Images`, `谷歌图片` | `action.serper.images` |
98
- | `Google News` | `谷歌新闻` | `action.serper.news` |
99
- | `Google Places` | `Google Place`, `谷歌地点` | `action.serper.places` |
100
- | `Google Shopping` | `谷歌购物` | `action.serper.shopping` |
101
- | `Web` | `website`, `web page`, `网页`, `网站` | `action.exa.*`, `action.firecrawl.*` |
102
-
103
- `Douyin` appears in the TikHub catalogue summary, but the audited 52-entry
104
- inventory has no dedicated Douyin Action. Preserve `Douyin` as the platform
105
- constraint and, if current discovery finds no compatible entry, report that
106
- bounded result honestly. Never silently rewrite `Douyin` to `TikTok`.
107
- Likewise, treat bare `X` as the social platform only when the surrounding
108
- request refers to posts, profiles, social search, or `X.com`.
109
-
110
- ## Model and vendor aliases
111
-
112
- | Canonical form | Curated aliases | Current inventory scope |
113
- | --- | --- | --- |
114
- | `ByteDance` | `Bytedance`, `字节跳动`, `字节` | `action.kie-ai-image.seedream-*`, `action.kie-ai-video.bytedance-*` |
115
- | `Seedream` | `即梦`, `即梦AI` | `action.kie-ai-image.seedream-5-lite-*` |
116
- | `Seedream 5 Lite` | `Seedream5 Lite` | `action.kie-ai-image.seedream-5-lite-*` |
117
- | `Nano Banana 2` | `NanoBanana2`, `Nano Banana` | `action.kie-ai-image.google-nanobanana2` |
118
- | `OpenAI` | `Open AI` | `action.kie-ai-image.gpt-gpt-image-2-*` |
119
- | `GPT Image 2` | `GPT-Image-2`, `GPT Image2` | `action.kie-ai-image.gpt-gpt-image-2-*` |
120
- | `Seedance 2.0` | `Seedance 2`, `Seedance2` | `action.kie-ai-video.bytedance-seedance-2*` |
121
-
122
- `Nano Banana` currently resolves to `Nano Banana 2` because it is the only
123
- Nano Banana family in this inventory snapshot. Re-audit that shorthand as
124
- soon as another version appears. Bare `Seedream` is a family form; `Seedream
125
- 5 Lite` is the exact current model. Retain every explicit version, `Fast`, or
126
- `Mini` modifier instead of silently selecting one.
127
-
128
- ## Object, modality, and operation aliases
129
-
130
- | Canonical form | Curated aliases | Current inventory meaning |
131
- | --- | --- | --- |
132
- | `Search` | `find`, `look up`, `lookup`, `query`, `搜索`, `查找`, `检索` | Locate existing catalogue data. |
133
- | `Details` | `detail`, `info`, `information`, `详情`, `详细信息` | Fetch one exact post, note, or video. |
134
- | `User Profile` | `profile`, `account profile`, `user info`, `账号资料`, `用户资料`, `主页` | Fetch a public account profile. |
135
- | `User Posts` | `account posts`, `author posts`, `用户帖子`, `账号内容` | List content published by one user. |
136
- | `Comments` | `comment`, `replies`, `responses`, `评论`, `回复` | Fetch replies on one content item. |
137
- | `Reviews` | `review`, `ratings`, `评价`, `评分` | Fetch Google Maps reviews. |
138
- | `Monitor` | `track`, `watch`, `monitoring`, `监控`, `追踪` | Monitor Reddit brand mentions. |
139
- | `Scrape` | `scraper`, `crawl`, `抓取`, `爬取` | Retrieve public web or social data. |
140
- | `Extract` | `extraction`, `抽取`, `提取` | Extract web content or structured fields. |
141
- | `Enrichment` | `enrich`, `data enrichment`, `补全`, `数据补充` | Enrich a person, company, or organization. |
142
- | `Post` | `posts`, `帖子`, `动态` | A social post; `tweet` and `推文` mean `X Post` only in X/Twitter context. |
143
- | `Note` | `notes`, `笔记` | A Xiaohongshu content item. |
144
- | `Video` | `videos`, `短视频` | A TikTok or YouTube video, or generated video. |
145
- | `Image` | `images`, `picture`, `photo`, `图片`, `图像` | An existing or generated image. |
146
- | `Text to Speech` | `TTS`, `text2speech`, `txt2speech`, `文本转语音`, `语音合成` | ElevenLabs speech generation. |
147
- | `Text to Image` | `T2I`, `text2image`, `txt2img`, `文生图`, `文字生成图片` | Generate an image from text. |
148
- | `Image to Image` | `I2I`, `image2image`, `img2img`, `图生图`, `图片编辑` | Edit or transform an existing image. |
149
- | `Text to Video` | `T2V`, `text2video`, `txt2vid`, `文生视频`, `文字生成视频` | Generate video with text input. |
150
- | `Image to Video` | `I2V`, `image2video`, `img2vid`, `图生视频`, `图片生成视频` | Generate video with image input. |
151
-
152
- Operation and modality mappings are compatibility constraints, not synonyms
153
- for one another. `Search` cannot satisfy `Details`; `Comments` cannot satisfy
154
- `User Posts`; `Text to Image` cannot satisfy `Image to Image`; and `Text to
155
- Video` cannot satisfy `Image to Video` when the user explicitly requires the
156
- input modality.