@skillfm/local 2.6.4 → 2.7.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.
- package/README.md +50 -1
- package/dist/_signers/aliyun-v3.d.ts +21 -0
- package/dist/_signers/aliyun-v3.d.ts.map +1 -0
- package/dist/_signers/aliyun-v3.js +47 -0
- package/dist/_signers/aliyun-v3.js.map +1 -0
- package/dist/_signers/canonical.d.ts +29 -0
- package/dist/_signers/canonical.d.ts.map +1 -0
- package/dist/_signers/canonical.js +59 -0
- package/dist/_signers/canonical.js.map +1 -0
- package/dist/_signers/index.d.ts +9 -0
- package/dist/_signers/index.d.ts.map +1 -0
- package/dist/_signers/index.js +6 -0
- package/dist/_signers/index.js.map +1 -0
- package/dist/_signers/tencent-tc3.d.ts +21 -0
- package/dist/_signers/tencent-tc3.d.ts.map +1 -0
- package/dist/_signers/tencent-tc3.js +48 -0
- package/dist/_signers/tencent-tc3.js.map +1 -0
- package/dist/_signers/volc-v4.d.ts +18 -0
- package/dist/_signers/volc-v4.d.ts.map +1 -0
- package/dist/_signers/volc-v4.js +43 -0
- package/dist/_signers/volc-v4.js.map +1 -0
- package/dist/agent-hints.d.ts.map +1 -1
- package/dist/agent-hints.js +28 -13
- package/dist/agent-hints.js.map +1 -1
- package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
- package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
- package/dist/asset-connectors/aliyun-ecs.js +99 -0
- package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
- package/dist/asset-connectors/base.d.ts +15 -0
- package/dist/asset-connectors/base.d.ts.map +1 -0
- package/dist/asset-connectors/base.js +19 -0
- package/dist/asset-connectors/base.js.map +1 -0
- package/dist/asset-connectors/cloudflare.d.ts +18 -0
- package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
- package/dist/asset-connectors/cloudflare.js +94 -0
- package/dist/asset-connectors/cloudflare.js.map +1 -0
- package/dist/asset-connectors/digitalocean.d.ts +18 -0
- package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
- package/dist/asset-connectors/digitalocean.js +79 -0
- package/dist/asset-connectors/digitalocean.js.map +1 -0
- package/dist/asset-connectors/godaddy.d.ts +18 -0
- package/dist/asset-connectors/godaddy.d.ts.map +1 -0
- package/dist/asset-connectors/godaddy.js +62 -0
- package/dist/asset-connectors/godaddy.js.map +1 -0
- package/dist/asset-connectors/hetzner.d.ts +18 -0
- package/dist/asset-connectors/hetzner.d.ts.map +1 -0
- package/dist/asset-connectors/hetzner.js +52 -0
- package/dist/asset-connectors/hetzner.js.map +1 -0
- package/dist/asset-connectors/index.d.ts +18 -0
- package/dist/asset-connectors/index.d.ts.map +1 -0
- package/dist/asset-connectors/index.js +52 -0
- package/dist/asset-connectors/index.js.map +1 -0
- package/dist/asset-connectors/namecheap.d.ts +34 -0
- package/dist/asset-connectors/namecheap.d.ts.map +1 -0
- package/dist/asset-connectors/namecheap.js +178 -0
- package/dist/asset-connectors/namecheap.js.map +1 -0
- package/dist/asset-connectors/ssl-labs.d.ts +22 -0
- package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
- package/dist/asset-connectors/ssl-labs.js +79 -0
- package/dist/asset-connectors/ssl-labs.js.map +1 -0
- package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
- package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
- package/dist/asset-connectors/tencent-cvm.js +145 -0
- package/dist/asset-connectors/tencent-cvm.js.map +1 -0
- package/dist/asset-connectors/types.d.ts +45 -0
- package/dist/asset-connectors/types.d.ts.map +1 -0
- package/dist/asset-connectors/types.js +26 -0
- package/dist/asset-connectors/types.js.map +1 -0
- package/dist/asset-connectors/vultr.d.ts +18 -0
- package/dist/asset-connectors/vultr.d.ts.map +1 -0
- package/dist/asset-connectors/vultr.js +73 -0
- package/dist/asset-connectors/vultr.js.map +1 -0
- package/dist/connectors/anthropic.d.ts +10 -0
- package/dist/connectors/anthropic.d.ts.map +1 -0
- package/dist/connectors/anthropic.js +103 -0
- package/dist/connectors/anthropic.js.map +1 -0
- package/dist/connectors/base.d.ts +11 -0
- package/dist/connectors/base.d.ts.map +1 -0
- package/dist/connectors/base.js +19 -0
- package/dist/connectors/base.js.map +1 -0
- package/dist/connectors/deepseek.d.ts +14 -0
- package/dist/connectors/deepseek.d.ts.map +1 -0
- package/dist/connectors/deepseek.js +77 -0
- package/dist/connectors/deepseek.js.map +1 -0
- package/dist/connectors/doubao.d.ts +10 -0
- package/dist/connectors/doubao.d.ts.map +1 -0
- package/dist/connectors/doubao.js +64 -0
- package/dist/connectors/doubao.js.map +1 -0
- package/dist/connectors/index.d.ts +14 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/index.js +42 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/kimi.d.ts +10 -0
- package/dist/connectors/kimi.d.ts.map +1 -0
- package/dist/connectors/kimi.js +67 -0
- package/dist/connectors/kimi.js.map +1 -0
- package/dist/connectors/openai.d.ts +10 -0
- package/dist/connectors/openai.d.ts.map +1 -0
- package/dist/connectors/openai.js +101 -0
- package/dist/connectors/openai.js.map +1 -0
- package/dist/connectors/qwen.d.ts +10 -0
- package/dist/connectors/qwen.d.ts.map +1 -0
- package/dist/connectors/qwen.js +66 -0
- package/dist/connectors/qwen.js.map +1 -0
- package/dist/connectors/types.d.ts +47 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/connectors/types.js +24 -0
- package/dist/connectors/types.js.map +1 -0
- package/dist/guard/bin.js +0 -0
- package/dist/index.js +83 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +130 -0
- package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
- package/dist/mcp/brain-client.d.ts +96 -0
- package/dist/mcp/brain-client.d.ts.map +1 -0
- package/dist/mcp/brain-client.js +214 -0
- package/dist/mcp/brain-client.js.map +1 -0
- package/dist/mcp/cache.d.ts +55 -0
- package/dist/mcp/cache.d.ts.map +1 -0
- package/dist/mcp/cache.js +109 -0
- package/dist/mcp/cache.js.map +1 -0
- package/dist/mcp/config.d.ts +29 -0
- package/dist/mcp/config.d.ts.map +1 -0
- package/dist/mcp/config.js +69 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/decision-engine.d.ts +54 -0
- package/dist/mcp/decision-engine.d.ts.map +1 -0
- package/dist/mcp/decision-engine.js +107 -0
- package/dist/mcp/decision-engine.js.map +1 -0
- package/dist/mcp/errors.d.ts +66 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +127 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +40 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +104 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools/_placeholder.d.ts +24 -0
- package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
- package/dist/mcp/tools/_placeholder.js +29 -0
- package/dist/mcp/tools/_placeholder.js.map +1 -0
- package/dist/mcp/tools/avatar-market.d.ts +22 -0
- package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
- package/dist/mcp/tools/avatar-market.js +33 -0
- package/dist/mcp/tools/avatar-market.js.map +1 -0
- package/dist/mcp/tools/check-expiry.d.ts +23 -0
- package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
- package/dist/mcp/tools/check-expiry.js +29 -0
- package/dist/mcp/tools/check-expiry.js.map +1 -0
- package/dist/mcp/tools/check-usage.d.ts +25 -0
- package/dist/mcp/tools/check-usage.d.ts.map +1 -0
- package/dist/mcp/tools/check-usage.js +33 -0
- package/dist/mcp/tools/check-usage.js.map +1 -0
- package/dist/mcp/tools/credential-tools.d.ts +37 -0
- package/dist/mcp/tools/credential-tools.d.ts.map +1 -0
- package/dist/mcp/tools/credential-tools.js +109 -0
- package/dist/mcp/tools/credential-tools.js.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
- package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
- package/dist/mcp/tools/get-monthly-picks.js +35 -0
- package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +44 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +188 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/memory-recent.d.ts +17 -0
- package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recent.js +46 -0
- package/dist/mcp/tools/memory-recent.js.map +1 -0
- package/dist/mcp/tools/memory-save.d.ts +15 -0
- package/dist/mcp/tools/memory-save.d.ts.map +1 -0
- package/dist/mcp/tools/memory-save.js +53 -0
- package/dist/mcp/tools/memory-save.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +24 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +64 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/record-acceptance.d.ts +22 -0
- package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
- package/dist/mcp/tools/record-acceptance.js +33 -0
- package/dist/mcp/tools/record-acceptance.js.map +1 -0
- package/dist/mcp/tools/record-rejection.d.ts +23 -0
- package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
- package/dist/mcp/tools/record-rejection.js +34 -0
- package/dist/mcp/tools/record-rejection.js.map +1 -0
- package/dist/mcp/tools/suggest-route.d.ts +26 -0
- package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
- package/dist/mcp/tools/suggest-route.js +56 -0
- package/dist/mcp/tools/suggest-route.js.map +1 -0
- package/dist/mcp/tools/user-preferences.d.ts +22 -0
- package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
- package/dist/mcp/tools/user-preferences.js +63 -0
- package/dist/mcp/tools/user-preferences.js.map +1 -0
- package/dist/mcp-stdio/bin.js +0 -0
- package/dist/memory/index.d.ts +5 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +4 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/mem0-client.d.ts +32 -0
- package/dist/memory/mem0-client.d.ts.map +1 -0
- package/dist/memory/mem0-client.js +161 -0
- package/dist/memory/mem0-client.js.map +1 -0
- package/dist/memory/types.d.ts +47 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +20 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/router/catalog.d.ts +4 -0
- package/dist/router/catalog.d.ts.map +1 -0
- package/dist/router/catalog.js +103 -0
- package/dist/router/catalog.js.map +1 -0
- package/dist/router/classifier.d.ts +5 -0
- package/dist/router/classifier.d.ts.map +1 -0
- package/dist/router/classifier.js +43 -0
- package/dist/router/classifier.js.map +1 -0
- package/dist/router/index.d.ts +7 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +6 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/litellm-config.d.ts +34 -0
- package/dist/router/litellm-config.d.ts.map +1 -0
- package/dist/router/litellm-config.js +78 -0
- package/dist/router/litellm-config.js.map +1 -0
- package/dist/router/route.d.ts +3 -0
- package/dist/router/route.d.ts.map +1 -0
- package/dist/router/route.js +63 -0
- package/dist/router/route.js.map +1 -0
- package/dist/router/types.d.ts +36 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +7 -0
- package/dist/router/types.js.map +1 -0
- package/dist/saas-connectors/base.d.ts +16 -0
- package/dist/saas-connectors/base.d.ts.map +1 -0
- package/dist/saas-connectors/base.js +16 -0
- package/dist/saas-connectors/base.js.map +1 -0
- package/dist/saas-connectors/brave.d.ts +19 -0
- package/dist/saas-connectors/brave.d.ts.map +1 -0
- package/dist/saas-connectors/brave.js +50 -0
- package/dist/saas-connectors/brave.js.map +1 -0
- package/dist/saas-connectors/fal.d.ts +15 -0
- package/dist/saas-connectors/fal.d.ts.map +1 -0
- package/dist/saas-connectors/fal.js +35 -0
- package/dist/saas-connectors/fal.js.map +1 -0
- package/dist/saas-connectors/index.d.ts +11 -0
- package/dist/saas-connectors/index.d.ts.map +1 -0
- package/dist/saas-connectors/index.js +32 -0
- package/dist/saas-connectors/index.js.map +1 -0
- package/dist/saas-connectors/replicate.d.ts +19 -0
- package/dist/saas-connectors/replicate.d.ts.map +1 -0
- package/dist/saas-connectors/replicate.js +43 -0
- package/dist/saas-connectors/replicate.js.map +1 -0
- package/dist/saas-connectors/serper.d.ts +19 -0
- package/dist/saas-connectors/serper.d.ts.map +1 -0
- package/dist/saas-connectors/serper.js +47 -0
- package/dist/saas-connectors/serper.js.map +1 -0
- package/dist/saas-connectors/types.d.ts +31 -0
- package/dist/saas-connectors/types.d.ts.map +1 -0
- package/dist/saas-connectors/types.js +6 -0
- package/dist/saas-connectors/types.js.map +1 -0
- package/dist/scheduler/brain-push-client.d.ts +13 -0
- package/dist/scheduler/brain-push-client.d.ts.map +1 -0
- package/dist/scheduler/brain-push-client.js +46 -0
- package/dist/scheduler/brain-push-client.js.map +1 -0
- package/dist/scheduler/index.d.ts +6 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +5 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/scheduler/poll.d.ts +4 -0
- package/dist/scheduler/poll.d.ts.map +1 -0
- package/dist/scheduler/poll.js +170 -0
- package/dist/scheduler/poll.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +18 -0
- package/dist/scheduler/scheduler.d.ts.map +1 -0
- package/dist/scheduler/scheduler.js +67 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/types.d.ts +49 -0
- package/dist/scheduler/types.d.ts.map +1 -0
- package/dist/scheduler/types.js +14 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/vault/cli.d.ts +2 -0
- package/dist/vault/cli.d.ts.map +1 -0
- package/dist/vault/cli.js +170 -0
- package/dist/vault/cli.js.map +1 -0
- package/dist/vault/crypto.d.ts +9 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +54 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +6 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +5 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/types.d.ts +28 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +22 -0
- package/dist/vault/types.js.map +1 -0
- package/dist/vault/vault.d.ts +34 -0
- package/dist/vault/vault.d.ts.map +1 -0
- package/dist/vault/vault.js +149 -0
- package/dist/vault/vault.js.map +1 -0
- package/package.json +17 -5
package/README.md
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
# @skillfm/local
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Single npm package for the SkillFM platform on user nodes. As of `2.7.0` it
|
|
4
|
+
exposes **two top-level usages** via subcommand routing — pick the one that
|
|
5
|
+
matches your goal:
|
|
6
|
+
|
|
7
|
+
## Two usages
|
|
8
|
+
|
|
9
|
+
### 1. Beacon MCP — your AI agent's cost optimizer (灯塔)
|
|
10
|
+
|
|
11
|
+
A stdio MCP server that any agent harness (Cursor / Claude Code / OpenClaw /
|
|
12
|
+
Cherry Studio) can plug into. Tracks API spend, suggests cheaper routes,
|
|
13
|
+
flags expiring assets, surfaces monthly Pro picks. **BYOK** — only reads
|
|
14
|
+
`SKILLFM_AGENT_TOKEN`; never touches your LLM API keys, cookies, or vault.
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# Run the MCP server directly (the agent harness spawns this for you):
|
|
18
|
+
npx -y @skillfm/local mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Cursor / Claude Code config (`mcp.servers`):
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"skillfm-beacon": {
|
|
26
|
+
"command": "npx",
|
|
27
|
+
"args": ["-y", "@skillfm/local", "mcp"],
|
|
28
|
+
"env": { "SKILLFM_AGENT_TOKEN": "sk_…" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This subsystem was originally `@skillfm/beacon-mcp`; merged into
|
|
34
|
+
`@skillfm/local` 2.7.0 on 2026-05-01.
|
|
35
|
+
|
|
36
|
+
### 2. Skill runtime — your AI's apprenticeship station (灶台学徒)
|
|
37
|
+
|
|
38
|
+
The original `@skillfm/local` purpose: a tiny localhost sidecar that lets any
|
|
39
|
+
AI agent activate and use [SkillFM](https://skillfm.ai) **in the current
|
|
40
|
+
conversation**, without restarting its MCP runtime.
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Run a SkillFM skill bundle (auto-starts the sidecar):
|
|
44
|
+
npx -y @skillfm/local skill <slug>
|
|
45
|
+
|
|
46
|
+
# Or boot the sidecar directly + use the HTTP API:
|
|
47
|
+
npx -y @skillfm/local start
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Sidecar — the long-lived flavor
|
|
4
53
|
|
|
5
54
|
## Why this exists
|
|
6
55
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface AliyunV3SignInput {
|
|
2
|
+
method: string;
|
|
3
|
+
host: string;
|
|
4
|
+
path: string;
|
|
5
|
+
query: Record<string, string | number | boolean | undefined>;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
payload: string;
|
|
8
|
+
ak_id: string;
|
|
9
|
+
ak_secret: string;
|
|
10
|
+
/** 自动注入 x-acs-signature-nonce / x-acs-action / x-acs-version 等 RPC 头(可选) */
|
|
11
|
+
rpc?: {
|
|
12
|
+
action: string;
|
|
13
|
+
version: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface AliyunV3SignResult {
|
|
17
|
+
authorization: string;
|
|
18
|
+
signed_headers_with_signature: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export declare function signAliyunV3(input: AliyunV3SignInput): AliyunV3SignResult;
|
|
21
|
+
//# sourceMappingURL=aliyun-v3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliyun-v3.d.ts","sourceRoot":"","sources":["../../src/_signers/aliyun-v3.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAUD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB,CAiCzE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/_signers/aliyun-v3.ts
|
|
2
|
+
//
|
|
3
|
+
// 阿里云 V3 签名 (ACS3-HMAC-SHA256, RPC 风格)
|
|
4
|
+
// Doc: https://help.aliyun.com/document_detail/315526.html
|
|
5
|
+
//
|
|
6
|
+
// StringToSign = ACS3-HMAC-SHA256\n<hex(SHA256(canonical_request))>
|
|
7
|
+
// signature = hex(HMAC(<sk>, StringToSign))
|
|
8
|
+
// Authorization: ACS3-HMAC-SHA256 Credential=<ak>,SignedHeaders=<...>,Signature=<...>
|
|
9
|
+
import { hmacSha256, sha256Hex, buildCanonicalRequest } from './canonical.js';
|
|
10
|
+
const ALGORITHM = 'ACS3-HMAC-SHA256';
|
|
11
|
+
function randomNonce() {
|
|
12
|
+
const bytes = new Uint8Array(16);
|
|
13
|
+
for (let i = 0; i < 16; i++)
|
|
14
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
15
|
+
return Buffer.from(bytes).toString('hex');
|
|
16
|
+
}
|
|
17
|
+
export function signAliyunV3(input) {
|
|
18
|
+
const date = new Date();
|
|
19
|
+
// 阿里云 V3 用 RFC 3339 (e.g. "2026-05-01T12:00:00Z")
|
|
20
|
+
const iso = date.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
21
|
+
const headers = {
|
|
22
|
+
...input.headers,
|
|
23
|
+
host: input.host,
|
|
24
|
+
'x-acs-date': iso,
|
|
25
|
+
'x-acs-content-sha256': sha256Hex(input.payload),
|
|
26
|
+
'x-acs-signature-nonce': randomNonce(),
|
|
27
|
+
};
|
|
28
|
+
if (input.rpc) {
|
|
29
|
+
headers['x-acs-action'] = input.rpc.action;
|
|
30
|
+
headers['x-acs-version'] = input.rpc.version;
|
|
31
|
+
}
|
|
32
|
+
const cr = buildCanonicalRequest({
|
|
33
|
+
method: input.method,
|
|
34
|
+
uri: input.path,
|
|
35
|
+
query: input.query,
|
|
36
|
+
headers,
|
|
37
|
+
payload: input.payload,
|
|
38
|
+
});
|
|
39
|
+
const string_to_sign = `${ALGORITHM}\n${sha256Hex(cr.request)}`;
|
|
40
|
+
const signature = hmacSha256(input.ak_secret, string_to_sign).toString('hex');
|
|
41
|
+
const authorization = `${ALGORITHM} Credential=${input.ak_id},SignedHeaders=${cr.signed_headers},Signature=${signature}`;
|
|
42
|
+
return {
|
|
43
|
+
authorization,
|
|
44
|
+
signed_headers_with_signature: { ...headers, authorization },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=aliyun-v3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliyun-v3.js","sourceRoot":"","sources":["../../src/_signers/aliyun-v3.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,uCAAuC;AACvC,2DAA2D;AAC3D,EAAE;AACF,oEAAoE;AACpE,4CAA4C;AAC5C,sFAAsF;AAEtF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAoB9E,MAAM,SAAS,GAAG,kBAAkB,CAAC;AAErC,SAAS,WAAW;IAClB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,kDAAkD;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAEzD,MAAM,OAAO,GAA2B;QACtC,GAAG,KAAK,CAAC,OAAO;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,GAAG;QACjB,sBAAsB,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;QAChD,uBAAuB,EAAE,WAAW,EAAE;KACvC,CAAC;IACF,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAC3C,OAAO,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;IAC/C,CAAC;IAED,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,IAAI;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;QACP,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,GAAG,SAAS,KAAK,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9E,MAAM,aAAa,GAAG,GAAG,SAAS,eAAe,KAAK,CAAC,KAAK,kBAAkB,EAAE,CAAC,cAAc,cAAc,SAAS,EAAE,CAAC;IAEzH,OAAO;QACL,aAAa;QACb,6BAA6B,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE;KAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare function sha256Hex(input: string | Buffer): string;
|
|
2
|
+
export declare function hmacSha256(key: Buffer | string, data: string): Buffer;
|
|
3
|
+
/** 按 RFC 3986 encode, 比 encodeURIComponent 更严格 */
|
|
4
|
+
export declare function rfc3986Encode(s: string): string;
|
|
5
|
+
/** Canonical query string: 字典序 sort + RFC 3986 encode */
|
|
6
|
+
export declare function canonicalizeQuery(params: Record<string, string | number | boolean | undefined>): string;
|
|
7
|
+
/** Canonical headers (lowercase + trim + sort) */
|
|
8
|
+
export declare function canonicalizeHeaders(headers: Record<string, string>): {
|
|
9
|
+
canonical: string;
|
|
10
|
+
signed: string;
|
|
11
|
+
};
|
|
12
|
+
export interface CanonicalRequestInput {
|
|
13
|
+
method: string;
|
|
14
|
+
uri: string;
|
|
15
|
+
query: Record<string, string | number | boolean | undefined>;
|
|
16
|
+
headers: Record<string, string>;
|
|
17
|
+
payload: string;
|
|
18
|
+
}
|
|
19
|
+
export interface CanonicalRequest {
|
|
20
|
+
request: string;
|
|
21
|
+
signed_headers: string;
|
|
22
|
+
payload_hash: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function buildCanonicalRequest(input: CanonicalRequestInput): CanonicalRequest;
|
|
25
|
+
/** ISO 8601 时间, 阿里云/火山要的格式 (e.g. "20260501T120000Z") */
|
|
26
|
+
export declare function basicIso8601(date?: Date): string;
|
|
27
|
+
/** YYYYMMDD (用于 credential scope) */
|
|
28
|
+
export declare function dateYYYYMMDD(date?: Date): string;
|
|
29
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/_signers/canonical.ts"],"names":[],"mappings":"AAWA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,yDAAyD;AACzD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,MAAM,CAMvG;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB,CAOA;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,CAapF;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE5D;AAED,qCAAqC;AACrC,wBAAgB,YAAY,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/_signers/canonical.ts
|
|
2
|
+
//
|
|
3
|
+
// AWS SigV4-style canonical request 共用原语 (Day 4 B1)
|
|
4
|
+
// 阿里云 / 腾讯云 / 火山引擎 V3+V4 签名都基于这个 pattern, 仅 algorithm name + 派生 key 不同
|
|
5
|
+
// 文档:
|
|
6
|
+
// - 阿里云: https://help.aliyun.com/document_detail/315526.html
|
|
7
|
+
// - 腾讯云: https://cloud.tencent.com/document/api/213/30654
|
|
8
|
+
// - 火山引擎: https://www.volcengine.com/docs/6369/67269
|
|
9
|
+
import { createHash, createHmac } from 'node:crypto';
|
|
10
|
+
export function sha256Hex(input) {
|
|
11
|
+
return createHash('sha256').update(input).digest('hex');
|
|
12
|
+
}
|
|
13
|
+
export function hmacSha256(key, data) {
|
|
14
|
+
return createHmac('sha256', key).update(data, 'utf8').digest();
|
|
15
|
+
}
|
|
16
|
+
/** 按 RFC 3986 encode, 比 encodeURIComponent 更严格 */
|
|
17
|
+
export function rfc3986Encode(s) {
|
|
18
|
+
return encodeURIComponent(s).replace(/[!'()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase());
|
|
19
|
+
}
|
|
20
|
+
/** Canonical query string: 字典序 sort + RFC 3986 encode */
|
|
21
|
+
export function canonicalizeQuery(params) {
|
|
22
|
+
const entries = Object.entries(params)
|
|
23
|
+
.filter(([, v]) => v !== undefined && v !== null && v !== '')
|
|
24
|
+
.map(([k, v]) => [k, String(v)])
|
|
25
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
26
|
+
return entries.map(([k, v]) => `${rfc3986Encode(k)}=${rfc3986Encode(v)}`).join('&');
|
|
27
|
+
}
|
|
28
|
+
/** Canonical headers (lowercase + trim + sort) */
|
|
29
|
+
export function canonicalizeHeaders(headers) {
|
|
30
|
+
const sorted = Object.entries(headers)
|
|
31
|
+
.map(([k, v]) => [k.toLowerCase().trim(), String(v).trim().replace(/\s+/g, ' ')])
|
|
32
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
33
|
+
const canonical = sorted.map(([k, v]) => `${k}:${v}`).join('\n') + '\n';
|
|
34
|
+
const signed = sorted.map(([k]) => k).join(';');
|
|
35
|
+
return { canonical, signed };
|
|
36
|
+
}
|
|
37
|
+
export function buildCanonicalRequest(input) {
|
|
38
|
+
const canonical_query = canonicalizeQuery(input.query);
|
|
39
|
+
const { canonical, signed } = canonicalizeHeaders(input.headers);
|
|
40
|
+
const payload_hash = sha256Hex(input.payload);
|
|
41
|
+
const request = [
|
|
42
|
+
input.method.toUpperCase(),
|
|
43
|
+
input.uri || '/',
|
|
44
|
+
canonical_query,
|
|
45
|
+
canonical,
|
|
46
|
+
signed,
|
|
47
|
+
payload_hash,
|
|
48
|
+
].join('\n');
|
|
49
|
+
return { request, signed_headers: signed, payload_hash };
|
|
50
|
+
}
|
|
51
|
+
/** ISO 8601 时间, 阿里云/火山要的格式 (e.g. "20260501T120000Z") */
|
|
52
|
+
export function basicIso8601(date = new Date()) {
|
|
53
|
+
return date.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, '');
|
|
54
|
+
}
|
|
55
|
+
/** YYYYMMDD (用于 credential scope) */
|
|
56
|
+
export function dateYYYYMMDD(date = new Date()) {
|
|
57
|
+
return date.toISOString().slice(0, 10).replace(/-/g, '');
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/_signers/canonical.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,oDAAoD;AACpD,uEAAuE;AACvE,MAAM;AACN,+DAA+D;AAC/D,4DAA4D;AAC5D,uDAAuD;AAEvD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,UAAU,SAAS,CAAC,KAAsB;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAoB,EAAE,IAAY;IAC3D,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAClC,UAAU,EACV,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CACxD,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,iBAAiB,CAAC,MAA6D;IAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAqB,CAAC;SACnD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtF,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,mBAAmB,CAAC,OAA+B;IAIjE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAqB,CAAC;SACpG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACxE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAC/B,CAAC;AAgBD,MAAM,UAAU,qBAAqB,CAAC,KAA4B;IAChE,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG;QACd,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;QAC1B,KAAK,CAAC,GAAG,IAAI,GAAG;QAChB,eAAe;QACf,SAAS;QACT,MAAM;QACN,YAAY;KACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAC3D,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,YAAY,CAAC,OAAa,IAAI,IAAI,EAAE;IAClD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,OAAa,IAAI,IAAI,EAAE;IAClD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { sha256Hex, hmacSha256, rfc3986Encode, canonicalizeQuery, canonicalizeHeaders, buildCanonicalRequest, basicIso8601, dateYYYYMMDD, } from './canonical.js';
|
|
2
|
+
export type { CanonicalRequestInput, CanonicalRequest } from './canonical.js';
|
|
3
|
+
export { signAliyunV3 } from './aliyun-v3.js';
|
|
4
|
+
export type { AliyunV3SignInput, AliyunV3SignResult } from './aliyun-v3.js';
|
|
5
|
+
export { signTencentTC3 } from './tencent-tc3.js';
|
|
6
|
+
export type { TencentTC3SignInput, TencentTC3SignResult } from './tencent-tc3.js';
|
|
7
|
+
export { signVolcV4 } from './volc-v4.js';
|
|
8
|
+
export type { VolcV4SignInput, VolcV4SignResult } from './volc-v4.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/_signers/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EACT,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/_signers/index.ts
|
|
2
|
+
export { sha256Hex, hmacSha256, rfc3986Encode, canonicalizeQuery, canonicalizeHeaders, buildCanonicalRequest, basicIso8601, dateYYYYMMDD, } from './canonical.js';
|
|
3
|
+
export { signAliyunV3 } from './aliyun-v3.js';
|
|
4
|
+
export { signTencentTC3 } from './tencent-tc3.js';
|
|
5
|
+
export { signVolcV4 } from './volc-v4.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/_signers/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,EACL,SAAS,EACT,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface TencentTC3SignInput {
|
|
2
|
+
method: string;
|
|
3
|
+
host: string;
|
|
4
|
+
path: string;
|
|
5
|
+
query: Record<string, string | number | boolean | undefined>;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
payload: string;
|
|
8
|
+
ak_id: string;
|
|
9
|
+
ak_secret: string;
|
|
10
|
+
service: string;
|
|
11
|
+
region?: string;
|
|
12
|
+
action: string;
|
|
13
|
+
version: string;
|
|
14
|
+
}
|
|
15
|
+
export interface TencentTC3SignResult {
|
|
16
|
+
authorization: string;
|
|
17
|
+
signed_headers_with_signature: Record<string, string>;
|
|
18
|
+
timestamp: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function signTencentTC3(input: TencentTC3SignInput): TencentTC3SignResult;
|
|
21
|
+
//# sourceMappingURL=tencent-tc3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tencent-tc3.d.ts","sourceRoot":"","sources":["../../src/_signers/tencent-tc3.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAuC/E"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/_signers/tencent-tc3.ts
|
|
2
|
+
//
|
|
3
|
+
// 腾讯云 TC3-HMAC-SHA256 签名 (类 AWS SigV4)
|
|
4
|
+
// Doc: https://cloud.tencent.com/document/api/213/30654
|
|
5
|
+
//
|
|
6
|
+
// StringToSign = TC3-HMAC-SHA256\n<timestamp>\n<credential_scope>\n<hex(SHA256(canonical_request))>
|
|
7
|
+
// signing_key = HMAC(HMAC(HMAC("TC3" + sk, date), service), "tc3_request")
|
|
8
|
+
// signature = hex(HMAC(signing_key, StringToSign))
|
|
9
|
+
// Authorization: TC3-HMAC-SHA256 Credential=<sid>/<scope>, SignedHeaders=<list>, Signature=<sig>
|
|
10
|
+
import { hmacSha256, sha256Hex, buildCanonicalRequest, dateYYYYMMDD } from './canonical.js';
|
|
11
|
+
const ALGORITHM = 'TC3-HMAC-SHA256';
|
|
12
|
+
const REQUEST_SUFFIX = 'tc3_request';
|
|
13
|
+
export function signTencentTC3(input) {
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const timestamp = Math.floor(now.getTime() / 1000);
|
|
16
|
+
const date_str = dateYYYYMMDD(now);
|
|
17
|
+
const headers = {
|
|
18
|
+
...input.headers,
|
|
19
|
+
'content-type': input.headers['content-type'] ?? 'application/json',
|
|
20
|
+
host: input.host,
|
|
21
|
+
'x-tc-action': input.action,
|
|
22
|
+
'x-tc-timestamp': String(timestamp),
|
|
23
|
+
'x-tc-version': input.version,
|
|
24
|
+
};
|
|
25
|
+
if (input.region)
|
|
26
|
+
headers['x-tc-region'] = input.region;
|
|
27
|
+
const cr = buildCanonicalRequest({
|
|
28
|
+
method: input.method,
|
|
29
|
+
uri: input.path,
|
|
30
|
+
query: input.query,
|
|
31
|
+
headers,
|
|
32
|
+
payload: input.payload,
|
|
33
|
+
});
|
|
34
|
+
const credential_scope = `${date_str}/${input.service}/${REQUEST_SUFFIX}`;
|
|
35
|
+
const string_to_sign = [ALGORITHM, String(timestamp), credential_scope, sha256Hex(cr.request)].join('\n');
|
|
36
|
+
// signing_key = HMAC(HMAC(HMAC("TC3" + sk, date), service), "tc3_request")
|
|
37
|
+
const k_date = hmacSha256(`TC3${input.ak_secret}`, date_str);
|
|
38
|
+
const k_service = hmacSha256(k_date, input.service);
|
|
39
|
+
const k_signing = hmacSha256(k_service, REQUEST_SUFFIX);
|
|
40
|
+
const signature = hmacSha256(k_signing, string_to_sign).toString('hex');
|
|
41
|
+
const authorization = `${ALGORITHM} Credential=${input.ak_id}/${credential_scope}, SignedHeaders=${cr.signed_headers}, Signature=${signature}`;
|
|
42
|
+
return {
|
|
43
|
+
authorization,
|
|
44
|
+
signed_headers_with_signature: { ...headers, authorization },
|
|
45
|
+
timestamp,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=tencent-tc3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tencent-tc3.js","sourceRoot":"","sources":["../../src/_signers/tencent-tc3.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,uCAAuC;AACvC,wDAAwD;AACxD,EAAE;AACF,oGAAoG;AACpG,2EAA2E;AAC3E,mDAAmD;AACnD,iGAAiG;AAEjG,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuB5F,MAAM,SAAS,GAAG,iBAAiB,CAAC;AACpC,MAAM,cAAc,GAAG,aAAa,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAEnC,MAAM,OAAO,GAA2B;QACtC,GAAG,KAAK,CAAC,OAAO;QAChB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,kBAAkB;QACnE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;QACnC,cAAc,EAAE,KAAK,CAAC,OAAO;KAC9B,CAAC;IACF,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAExD,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,IAAI;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;QACP,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,GAAG,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IAC1E,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE1G,2EAA2E;IAC3E,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,GAAG,SAAS,eAAe,KAAK,CAAC,KAAK,IAAI,gBAAgB,mBAAmB,EAAE,CAAC,cAAc,eAAe,SAAS,EAAE,CAAC;IAE/I,OAAO;QACL,aAAa;QACb,6BAA6B,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE;QAC5D,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface VolcV4SignInput {
|
|
2
|
+
method: string;
|
|
3
|
+
host: string;
|
|
4
|
+
path: string;
|
|
5
|
+
query: Record<string, string | number | boolean | undefined>;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
payload: string;
|
|
8
|
+
ak_id: string;
|
|
9
|
+
ak_secret: string;
|
|
10
|
+
service: string;
|
|
11
|
+
region: string;
|
|
12
|
+
}
|
|
13
|
+
export interface VolcV4SignResult {
|
|
14
|
+
authorization: string;
|
|
15
|
+
signed_headers_with_signature: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function signVolcV4(input: VolcV4SignInput): VolcV4SignResult;
|
|
18
|
+
//# sourceMappingURL=volc-v4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volc-v4.d.ts","sourceRoot":"","sources":["../../src/_signers/volc-v4.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,6BAA6B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvD;AAKD,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAoCnE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// sdk/skillfm-local/src/_signers/volc-v4.ts
|
|
2
|
+
//
|
|
3
|
+
// 火山引擎 V4 签名 (HMAC-SHA256, AWS SigV4 风格)
|
|
4
|
+
// Doc: https://www.volcengine.com/docs/6369/67269
|
|
5
|
+
//
|
|
6
|
+
// StringToSign = HMAC-SHA256\n<timestamp>\n<credential_scope>\n<hex(SHA256(canonical_request))>
|
|
7
|
+
// signing_key = HMAC(HMAC(HMAC(HMAC(<sk>, date), region), service), "request")
|
|
8
|
+
// Authorization: HMAC-SHA256 Credential=<ak>/<scope>, SignedHeaders=<list>, Signature=<sig>
|
|
9
|
+
import { hmacSha256, sha256Hex, buildCanonicalRequest, basicIso8601, dateYYYYMMDD } from './canonical.js';
|
|
10
|
+
const ALGORITHM = 'HMAC-SHA256';
|
|
11
|
+
const REQUEST_SUFFIX = 'request';
|
|
12
|
+
export function signVolcV4(input) {
|
|
13
|
+
const now = new Date();
|
|
14
|
+
const ts = basicIso8601(now); // "20260501T120000Z"
|
|
15
|
+
const date_str = dateYYYYMMDD(now);
|
|
16
|
+
const headers = {
|
|
17
|
+
...input.headers,
|
|
18
|
+
'content-type': input.headers['content-type'] ?? 'application/json',
|
|
19
|
+
host: input.host,
|
|
20
|
+
'x-date': ts,
|
|
21
|
+
'x-content-sha256': sha256Hex(input.payload),
|
|
22
|
+
};
|
|
23
|
+
const cr = buildCanonicalRequest({
|
|
24
|
+
method: input.method,
|
|
25
|
+
uri: input.path,
|
|
26
|
+
query: input.query,
|
|
27
|
+
headers,
|
|
28
|
+
payload: input.payload,
|
|
29
|
+
});
|
|
30
|
+
const credential_scope = `${date_str}/${input.region}/${input.service}/${REQUEST_SUFFIX}`;
|
|
31
|
+
const string_to_sign = [ALGORITHM, ts, credential_scope, sha256Hex(cr.request)].join('\n');
|
|
32
|
+
const k_date = hmacSha256(input.ak_secret, date_str);
|
|
33
|
+
const k_region = hmacSha256(k_date, input.region);
|
|
34
|
+
const k_service = hmacSha256(k_region, input.service);
|
|
35
|
+
const k_signing = hmacSha256(k_service, REQUEST_SUFFIX);
|
|
36
|
+
const signature = hmacSha256(k_signing, string_to_sign).toString('hex');
|
|
37
|
+
const authorization = `${ALGORITHM} Credential=${input.ak_id}/${credential_scope}, SignedHeaders=${cr.signed_headers}, Signature=${signature}`;
|
|
38
|
+
return {
|
|
39
|
+
authorization,
|
|
40
|
+
signed_headers_with_signature: { ...headers, authorization },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=volc-v4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volc-v4.js","sourceRoot":"","sources":["../../src/_signers/volc-v4.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,yCAAyC;AACzC,kDAAkD;AAClD,EAAE;AACF,gGAAgG;AAChG,+EAA+E;AAC/E,4FAA4F;AAE5F,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAoB1G,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,cAAc,GAAG,SAAS,CAAC;AAEjC,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB;IACnD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAEnC,MAAM,OAAO,GAA2B;QACtC,GAAG,KAAK,CAAC,OAAO;QAChB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,kBAAkB;QACnE,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,EAAE;QACZ,kBAAkB,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;KAC7C,CAAC;IAEF,MAAM,EAAE,GAAG,qBAAqB,CAAC;QAC/B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,EAAE,KAAK,CAAC,IAAI;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;QACP,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,GAAG,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,cAAc,EAAE,CAAC;IAC1F,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3F,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAExD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,GAAG,SAAS,eAAe,KAAK,CAAC,KAAK,IAAI,gBAAgB,mBAAmB,EAAE,CAAC,cAAc,eAAe,SAAS,EAAE,CAAC;IAE/I,OAAO;QACL,aAAa;QACb,6BAA6B,EAAE,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE;KAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-hints.d.ts","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,uBAAuB,CAAC;AAE5B,UAAU,aAAa;IACrB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"agent-hints.d.ts","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,uBAAuB,CAAC;AAE5B,UAAU,aAAa;IACrB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAsGD;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,GAAE,aAAkB,GAAG,MAAM,CAY7E"}
|
package/dist/agent-hints.js
CHANGED
|
@@ -20,9 +20,12 @@ const ACTIVATION_SUCCESS_ZH = [
|
|
|
20
20
|
'`npx -y -p @skillfm/local skillfm-local init --v3`',
|
|
21
21
|
'完成项目级三层防御安装(写 SKILL.md priming + 自动检测 harness 写 PreToolUse hook + MCP 服务注册)。',
|
|
22
22
|
'该命令幂等 — 已安装过会自动 skip,不会破坏用户文件。',
|
|
23
|
-
'
|
|
24
|
-
'
|
|
25
|
-
'
|
|
23
|
+
'⚠️ 然后告诉用户「SkillFM 已就绪!🎉」并按以下顺序引导(不要跳到赚钱技能):',
|
|
24
|
+
'1) Beacon 监控 (默认免费, 已启动): 调用 skillfm_list_credentials 看用户已配哪些 LLM provider。',
|
|
25
|
+
' 如果是空的, 用对话方式问用户: "要我开始监控你的 LLM 花费吗? 你用 OpenAI / Anthropic / DeepSeek / 豆包 / Qwen / Kimi 哪些?',
|
|
26
|
+
' 告诉我我帮你配 — BYOK 安全, 你的 API key 加密存本地, 永不出节点。" 用户告知后用 skillfm_save_credential 工具保存 (注意: 需要用户提供 billing-only / admin key 才能调 provider 用量 API)。',
|
|
27
|
+
'2) 用户问"你能干啥"才 GET /skills 列赚钱技能 — 不要主动推。当前主推赚钱技能仅 1 个 (xianyu 闲鱼 AI 头像), 其他在迭代中。',
|
|
28
|
+
'核心原则: SkillFM 三件事是「管 AI 资产 + 省 token + 装赚钱技能」, 默认先帮用户管 + 省 (Beacon, 免费), 赚钱技能用户主动问再讲。',
|
|
26
29
|
].join(' ');
|
|
27
30
|
const ACTIVATION_SUCCESS_EN = [
|
|
28
31
|
'[English] Activation successful! brain_key saved to ~/.skillfm/config.json.',
|
|
@@ -32,10 +35,16 @@ const ACTIVATION_SUCCESS_EN = [
|
|
|
32
35
|
'to complete project-level three-layer defense installation',
|
|
33
36
|
'(SKILL.md priming + auto-detect harness PreToolUse hook + MCP server registration).',
|
|
34
37
|
'This command is idempotent — already-installed files will be skipped, never overwritten.',
|
|
35
|
-
'Then tell the user
|
|
36
|
-
'
|
|
37
|
-
'
|
|
38
|
-
'
|
|
38
|
+
'⚠️ Then tell the user "SkillFM is ready! 🎉" and onboard in this order (do NOT jump to earning skills):',
|
|
39
|
+
'1) Beacon monitoring (default free, already started): call skillfm_list_credentials to see which providers the user has configured.',
|
|
40
|
+
' If empty, ask the user conversationally: "Want me to start monitoring your LLM spend?',
|
|
41
|
+
' Which do you use — OpenAI / Anthropic / DeepSeek / Doubao / Qwen / Kimi? Tell me and I\'ll set it up.',
|
|
42
|
+
' BYOK-safe — your API key is encrypted locally and never leaves your node."',
|
|
43
|
+
' Once they tell you, use skillfm_save_credential to save (note: needs billing-only / admin key for provider usage API).',
|
|
44
|
+
'2) Only call GET /skills when the user asks "what can you do" — do not proactively push earning skills.',
|
|
45
|
+
' The earning catalog currently surfaces 1 skill (xianyu — Xianyu AI avatar gigs); others are in iteration.',
|
|
46
|
+
'Core principle: SkillFM = manage AI assets + save tokens + earning skills. Default first helps with manage + save (Beacon, free).',
|
|
47
|
+
'Earning skills only on explicit user request.',
|
|
39
48
|
].join(' ');
|
|
40
49
|
// ── running_activated ─────────────────────────────────────────────────
|
|
41
50
|
function runningActivatedZh(url) {
|
|
@@ -44,9 +53,11 @@ function runningActivatedZh(url) {
|
|
|
44
53
|
'⚠️ 检查项目级初始化:如果用户当前 workspace 没有 SKILL.md 文件,请先在 workspace 执行',
|
|
45
54
|
'`npx -y -p @skillfm/local skillfm-local init --v3`',
|
|
46
55
|
'完成三层防御安装(SKILL.md + harness hooks + MCP 注册),该命令幂等可重复跑。',
|
|
47
|
-
'然后告诉用户「SkillFM
|
|
48
|
-
|
|
49
|
-
'
|
|
56
|
+
'⚠️ 然后告诉用户「SkillFM 已就绪!」并按以下顺序 onboard:',
|
|
57
|
+
'1) Beacon 监控 (默认免费, 已启动): 调用 skillfm_list_credentials 看用户已配哪些 LLM provider。',
|
|
58
|
+
' 如果空, 问用户用 OpenAI / Anthropic / DeepSeek / 豆包 / Qwen / Kimi 哪些, 收到回答用 skillfm_save_credential 保存 (BYOK: 加密存本地, 不出节点)。',
|
|
59
|
+
'2) 用户问"你能干啥"才 GET /skills 列赚钱技能 (当前仅 xianyu 真上线)。不要主动推赚钱技能。',
|
|
60
|
+
'SkillFM 核心定位: 管 AI 资产 + 省 token (默认免费) + 装赚钱技能 (用户主动)。',
|
|
50
61
|
].join(' ');
|
|
51
62
|
}
|
|
52
63
|
function runningActivatedEn(url) {
|
|
@@ -56,9 +67,13 @@ function runningActivatedEn(url) {
|
|
|
56
67
|
'first run `npx -y -p @skillfm/local skillfm-local init --v3` in the workspace',
|
|
57
68
|
'to complete three-layer defense installation (SKILL.md + harness hooks + MCP registration).',
|
|
58
69
|
'This command is idempotent and safe to re-run.',
|
|
59
|
-
|
|
60
|
-
'
|
|
61
|
-
'
|
|
70
|
+
'⚠️ Then tell the user "SkillFM is ready!" and onboard in this order:',
|
|
71
|
+
'1) Beacon monitoring (default free, already started): call skillfm_list_credentials to see which providers are configured.',
|
|
72
|
+
' If empty, ask which of OpenAI / Anthropic / DeepSeek / Doubao / Qwen / Kimi the user uses,',
|
|
73
|
+
' then use skillfm_save_credential to save (BYOK: encrypted locally, never leaves the node).',
|
|
74
|
+
`2) Only call GET ${url}/skills when the user asks what you can do (currently only xianyu is shipped).`,
|
|
75
|
+
'Do not proactively push earning skills.',
|
|
76
|
+
'SkillFM positioning: manage AI assets + save tokens (free default) + earning skills (user-driven).',
|
|
62
77
|
].join(' ');
|
|
63
78
|
}
|
|
64
79
|
// ── running_not_activated ─────────────────────────────────────────────
|
package/dist/agent-hints.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-hints.js","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,MAAM,gBAAgB,GACpB,iDAAiD,CAAC;AAEpD,yEAAyE;AAEzE,MAAM,qBAAqB,GAAG;IAC5B,uDAAuD;IACvD,+BAA+B;IAC/B,oDAAoD;IACpD,8EAA8E;IAC9E,gCAAgC;IAChC,
|
|
1
|
+
{"version":3,"file":"agent-hints.js","sourceRoot":"","sources":["../src/agent-hints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,MAAM,gBAAgB,GACpB,iDAAiD,CAAC;AAEpD,yEAAyE;AAEzE,MAAM,qBAAqB,GAAG;IAC5B,uDAAuD;IACvD,+BAA+B;IAC/B,oDAAoD;IACpD,8EAA8E;IAC9E,gCAAgC;IAChC,8CAA8C;IAC9C,6EAA6E;IAC7E,gGAAgG;IAChG,gJAAgJ;IAChJ,kFAAkF;IAClF,uFAAuF;CACxF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,qBAAqB,GAAG;IAC5B,6EAA6E;IAC7E,eAAe;IACf,8DAA8D;IAC9D,oDAAoD;IACpD,4DAA4D;IAC5D,qFAAqF;IACrF,0FAA0F;IAC1F,yGAAyG;IACzG,qIAAqI;IACrI,0FAA0F;IAC1F,0GAA0G;IAC1G,+EAA+E;IAC/E,2HAA2H;IAC3H,yGAAyG;IACzG,8GAA8G;IAC9G,mIAAmI;IACnI,+CAA+C;CAChD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,yEAAyE;AAEzE,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO;QACL,yBAAyB,GAAG,kCAAkC;QAC9D,8DAA8D;QAC9D,oDAAoD;QACpD,wDAAwD;QACxD,wCAAwC;QACxC,6EAA6E;QAC7E,yHAAyH;QACzH,6DAA6D;QAC7D,wDAAwD;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO;QACL,yCAAyC,GAAG,oDAAoD;QAChG,qFAAqF;QACrF,+EAA+E;QAC/E,6FAA6F;QAC7F,gDAAgD;QAChD,sEAAsE;QACtE,4HAA4H;QAC5H,+FAA+F;QAC/F,+FAA+F;QAC/F,oBAAoB,GAAG,gFAAgF;QACvG,yCAAyC;QACzC,oGAAoG;KACrG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE,SAAS,qBAAqB,CAAC,GAAW;IACxC,OAAO;QACL,yBAAyB,GAAG,WAAW;QACvC,aAAa,GAAG,sCAAsC;QACtD,0BAA0B;QAC1B,4CAA4C;QAC5C,kBAAkB,GAAG,sBAAsB;QAC3C,uCAAuC;QACvC,2BAA2B;KAC5B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAW;IACxC,OAAO;QACL,yCAAyC,GAAG,sBAAsB;QAClE,mBAAmB,GAAG,2DAA2D;QACjF,kEAAkE;QAClE,iFAAiF;QACjF,4CAA4C,GAAG,gCAAgC;QAC/E,yGAAyG;QACzG,4EAA4E;KAC7E,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,yEAAyE;AAEzE;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,GAAiB,EAAE,OAAsB,EAAE;IACnE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;IAC3B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,oBAAoB;YACvB,OAAO,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvF,KAAK,mBAAmB;YACtB,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3F,KAAK,uBAAuB;YAC1B,OAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,qBAAqB,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC,IAAI,CACpF,MAAM,CACP,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AssetBaseConnector } from './base.js';
|
|
2
|
+
import type { AssetExpiry, AssetProviderId, FetchAssetsOptions } from './types.js';
|
|
3
|
+
export declare class AliyunECSConnector extends AssetBaseConnector {
|
|
4
|
+
id: AssetProviderId;
|
|
5
|
+
name: string;
|
|
6
|
+
is_real: boolean;
|
|
7
|
+
fetchAssets(byok_key: string, opts?: FetchAssetsOptions): Promise<AssetExpiry[]>;
|
|
8
|
+
ping(byok_key: string): Promise<{
|
|
9
|
+
ok: boolean;
|
|
10
|
+
key_fingerprint: string;
|
|
11
|
+
error?: undefined;
|
|
12
|
+
} | {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
error: string;
|
|
15
|
+
key_fingerprint: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=aliyun-ecs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliyun-ecs.d.ts","sourceRoot":"","sources":["../../src/asset-connectors/aliyun-ecs.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8BnF,qBAAa,kBAAmB,SAAQ,kBAAkB;IACxD,EAAE,EAAE,eAAe,CAAgB;IACnC,IAAI,SAAa;IACjB,OAAO,UAAQ;IAET,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDhF,IAAI,CAAC,QAAQ,EAAE,MAAM;;;;;;;;;CAkC5B"}
|