@skillfm/local 2.6.3 → 2.7.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.
Files changed (294) hide show
  1. package/README.md +50 -1
  2. package/dist/_signers/aliyun-v3.d.ts +21 -0
  3. package/dist/_signers/aliyun-v3.d.ts.map +1 -0
  4. package/dist/_signers/aliyun-v3.js +47 -0
  5. package/dist/_signers/aliyun-v3.js.map +1 -0
  6. package/dist/_signers/canonical.d.ts +29 -0
  7. package/dist/_signers/canonical.d.ts.map +1 -0
  8. package/dist/_signers/canonical.js +59 -0
  9. package/dist/_signers/canonical.js.map +1 -0
  10. package/dist/_signers/index.d.ts +9 -0
  11. package/dist/_signers/index.d.ts.map +1 -0
  12. package/dist/_signers/index.js +6 -0
  13. package/dist/_signers/index.js.map +1 -0
  14. package/dist/_signers/tencent-tc3.d.ts +21 -0
  15. package/dist/_signers/tencent-tc3.d.ts.map +1 -0
  16. package/dist/_signers/tencent-tc3.js +48 -0
  17. package/dist/_signers/tencent-tc3.js.map +1 -0
  18. package/dist/_signers/volc-v4.d.ts +18 -0
  19. package/dist/_signers/volc-v4.d.ts.map +1 -0
  20. package/dist/_signers/volc-v4.js +43 -0
  21. package/dist/_signers/volc-v4.js.map +1 -0
  22. package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
  23. package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
  24. package/dist/asset-connectors/aliyun-ecs.js +99 -0
  25. package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
  26. package/dist/asset-connectors/base.d.ts +15 -0
  27. package/dist/asset-connectors/base.d.ts.map +1 -0
  28. package/dist/asset-connectors/base.js +19 -0
  29. package/dist/asset-connectors/base.js.map +1 -0
  30. package/dist/asset-connectors/cloudflare.d.ts +18 -0
  31. package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
  32. package/dist/asset-connectors/cloudflare.js +94 -0
  33. package/dist/asset-connectors/cloudflare.js.map +1 -0
  34. package/dist/asset-connectors/digitalocean.d.ts +18 -0
  35. package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
  36. package/dist/asset-connectors/digitalocean.js +79 -0
  37. package/dist/asset-connectors/digitalocean.js.map +1 -0
  38. package/dist/asset-connectors/godaddy.d.ts +18 -0
  39. package/dist/asset-connectors/godaddy.d.ts.map +1 -0
  40. package/dist/asset-connectors/godaddy.js +62 -0
  41. package/dist/asset-connectors/godaddy.js.map +1 -0
  42. package/dist/asset-connectors/hetzner.d.ts +18 -0
  43. package/dist/asset-connectors/hetzner.d.ts.map +1 -0
  44. package/dist/asset-connectors/hetzner.js +52 -0
  45. package/dist/asset-connectors/hetzner.js.map +1 -0
  46. package/dist/asset-connectors/index.d.ts +18 -0
  47. package/dist/asset-connectors/index.d.ts.map +1 -0
  48. package/dist/asset-connectors/index.js +52 -0
  49. package/dist/asset-connectors/index.js.map +1 -0
  50. package/dist/asset-connectors/namecheap.d.ts +34 -0
  51. package/dist/asset-connectors/namecheap.d.ts.map +1 -0
  52. package/dist/asset-connectors/namecheap.js +178 -0
  53. package/dist/asset-connectors/namecheap.js.map +1 -0
  54. package/dist/asset-connectors/ssl-labs.d.ts +22 -0
  55. package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
  56. package/dist/asset-connectors/ssl-labs.js +79 -0
  57. package/dist/asset-connectors/ssl-labs.js.map +1 -0
  58. package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
  59. package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
  60. package/dist/asset-connectors/tencent-cvm.js +145 -0
  61. package/dist/asset-connectors/tencent-cvm.js.map +1 -0
  62. package/dist/asset-connectors/types.d.ts +45 -0
  63. package/dist/asset-connectors/types.d.ts.map +1 -0
  64. package/dist/asset-connectors/types.js +26 -0
  65. package/dist/asset-connectors/types.js.map +1 -0
  66. package/dist/asset-connectors/vultr.d.ts +18 -0
  67. package/dist/asset-connectors/vultr.d.ts.map +1 -0
  68. package/dist/asset-connectors/vultr.js +73 -0
  69. package/dist/asset-connectors/vultr.js.map +1 -0
  70. package/dist/connectors/anthropic.d.ts +10 -0
  71. package/dist/connectors/anthropic.d.ts.map +1 -0
  72. package/dist/connectors/anthropic.js +103 -0
  73. package/dist/connectors/anthropic.js.map +1 -0
  74. package/dist/connectors/base.d.ts +11 -0
  75. package/dist/connectors/base.d.ts.map +1 -0
  76. package/dist/connectors/base.js +19 -0
  77. package/dist/connectors/base.js.map +1 -0
  78. package/dist/connectors/deepseek.d.ts +14 -0
  79. package/dist/connectors/deepseek.d.ts.map +1 -0
  80. package/dist/connectors/deepseek.js +77 -0
  81. package/dist/connectors/deepseek.js.map +1 -0
  82. package/dist/connectors/doubao.d.ts +10 -0
  83. package/dist/connectors/doubao.d.ts.map +1 -0
  84. package/dist/connectors/doubao.js +64 -0
  85. package/dist/connectors/doubao.js.map +1 -0
  86. package/dist/connectors/index.d.ts +14 -0
  87. package/dist/connectors/index.d.ts.map +1 -0
  88. package/dist/connectors/index.js +42 -0
  89. package/dist/connectors/index.js.map +1 -0
  90. package/dist/connectors/kimi.d.ts +10 -0
  91. package/dist/connectors/kimi.d.ts.map +1 -0
  92. package/dist/connectors/kimi.js +67 -0
  93. package/dist/connectors/kimi.js.map +1 -0
  94. package/dist/connectors/openai.d.ts +10 -0
  95. package/dist/connectors/openai.d.ts.map +1 -0
  96. package/dist/connectors/openai.js +101 -0
  97. package/dist/connectors/openai.js.map +1 -0
  98. package/dist/connectors/qwen.d.ts +10 -0
  99. package/dist/connectors/qwen.d.ts.map +1 -0
  100. package/dist/connectors/qwen.js +66 -0
  101. package/dist/connectors/qwen.js.map +1 -0
  102. package/dist/connectors/types.d.ts +47 -0
  103. package/dist/connectors/types.d.ts.map +1 -0
  104. package/dist/connectors/types.js +24 -0
  105. package/dist/connectors/types.js.map +1 -0
  106. package/dist/guard/bin.js +0 -0
  107. package/dist/index.js +50 -1
  108. package/dist/index.js.map +1 -1
  109. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  110. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  111. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +128 -0
  112. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  113. package/dist/mcp/brain-client.d.ts +96 -0
  114. package/dist/mcp/brain-client.d.ts.map +1 -0
  115. package/dist/mcp/brain-client.js +214 -0
  116. package/dist/mcp/brain-client.js.map +1 -0
  117. package/dist/mcp/cache.d.ts +55 -0
  118. package/dist/mcp/cache.d.ts.map +1 -0
  119. package/dist/mcp/cache.js +109 -0
  120. package/dist/mcp/cache.js.map +1 -0
  121. package/dist/mcp/config.d.ts +29 -0
  122. package/dist/mcp/config.d.ts.map +1 -0
  123. package/dist/mcp/config.js +69 -0
  124. package/dist/mcp/config.js.map +1 -0
  125. package/dist/mcp/decision-engine.d.ts +54 -0
  126. package/dist/mcp/decision-engine.d.ts.map +1 -0
  127. package/dist/mcp/decision-engine.js +107 -0
  128. package/dist/mcp/decision-engine.js.map +1 -0
  129. package/dist/mcp/errors.d.ts +66 -0
  130. package/dist/mcp/errors.d.ts.map +1 -0
  131. package/dist/mcp/errors.js +127 -0
  132. package/dist/mcp/errors.js.map +1 -0
  133. package/dist/mcp/index.d.ts +40 -0
  134. package/dist/mcp/index.d.ts.map +1 -0
  135. package/dist/mcp/index.js +98 -0
  136. package/dist/mcp/index.js.map +1 -0
  137. package/dist/mcp/tools/_placeholder.d.ts +24 -0
  138. package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
  139. package/dist/mcp/tools/_placeholder.js +29 -0
  140. package/dist/mcp/tools/_placeholder.js.map +1 -0
  141. package/dist/mcp/tools/avatar-market.d.ts +22 -0
  142. package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
  143. package/dist/mcp/tools/avatar-market.js +33 -0
  144. package/dist/mcp/tools/avatar-market.js.map +1 -0
  145. package/dist/mcp/tools/check-expiry.d.ts +23 -0
  146. package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
  147. package/dist/mcp/tools/check-expiry.js +29 -0
  148. package/dist/mcp/tools/check-expiry.js.map +1 -0
  149. package/dist/mcp/tools/check-usage.d.ts +25 -0
  150. package/dist/mcp/tools/check-usage.d.ts.map +1 -0
  151. package/dist/mcp/tools/check-usage.js +33 -0
  152. package/dist/mcp/tools/check-usage.js.map +1 -0
  153. package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
  154. package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
  155. package/dist/mcp/tools/get-monthly-picks.js +35 -0
  156. package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
  157. package/dist/mcp/tools/index.d.ts +41 -0
  158. package/dist/mcp/tools/index.d.ts.map +1 -0
  159. package/dist/mcp/tools/index.js +139 -0
  160. package/dist/mcp/tools/index.js.map +1 -0
  161. package/dist/mcp/tools/memory-recent.d.ts +17 -0
  162. package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
  163. package/dist/mcp/tools/memory-recent.js +46 -0
  164. package/dist/mcp/tools/memory-recent.js.map +1 -0
  165. package/dist/mcp/tools/memory-save.d.ts +15 -0
  166. package/dist/mcp/tools/memory-save.d.ts.map +1 -0
  167. package/dist/mcp/tools/memory-save.js +53 -0
  168. package/dist/mcp/tools/memory-save.js.map +1 -0
  169. package/dist/mcp/tools/memory-search.d.ts +24 -0
  170. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  171. package/dist/mcp/tools/memory-search.js +64 -0
  172. package/dist/mcp/tools/memory-search.js.map +1 -0
  173. package/dist/mcp/tools/record-acceptance.d.ts +22 -0
  174. package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
  175. package/dist/mcp/tools/record-acceptance.js +33 -0
  176. package/dist/mcp/tools/record-acceptance.js.map +1 -0
  177. package/dist/mcp/tools/record-rejection.d.ts +23 -0
  178. package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
  179. package/dist/mcp/tools/record-rejection.js +34 -0
  180. package/dist/mcp/tools/record-rejection.js.map +1 -0
  181. package/dist/mcp/tools/suggest-route.d.ts +26 -0
  182. package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
  183. package/dist/mcp/tools/suggest-route.js +56 -0
  184. package/dist/mcp/tools/suggest-route.js.map +1 -0
  185. package/dist/mcp/tools/user-preferences.d.ts +22 -0
  186. package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
  187. package/dist/mcp/tools/user-preferences.js +63 -0
  188. package/dist/mcp/tools/user-preferences.js.map +1 -0
  189. package/dist/mcp-stdio/bin.js +0 -0
  190. package/dist/memory/index.d.ts +5 -0
  191. package/dist/memory/index.d.ts.map +1 -0
  192. package/dist/memory/index.js +4 -0
  193. package/dist/memory/index.js.map +1 -0
  194. package/dist/memory/mem0-client.d.ts +32 -0
  195. package/dist/memory/mem0-client.d.ts.map +1 -0
  196. package/dist/memory/mem0-client.js +161 -0
  197. package/dist/memory/mem0-client.js.map +1 -0
  198. package/dist/memory/types.d.ts +47 -0
  199. package/dist/memory/types.d.ts.map +1 -0
  200. package/dist/memory/types.js +20 -0
  201. package/dist/memory/types.js.map +1 -0
  202. package/dist/router/catalog.d.ts +4 -0
  203. package/dist/router/catalog.d.ts.map +1 -0
  204. package/dist/router/catalog.js +103 -0
  205. package/dist/router/catalog.js.map +1 -0
  206. package/dist/router/classifier.d.ts +5 -0
  207. package/dist/router/classifier.d.ts.map +1 -0
  208. package/dist/router/classifier.js +43 -0
  209. package/dist/router/classifier.js.map +1 -0
  210. package/dist/router/index.d.ts +7 -0
  211. package/dist/router/index.d.ts.map +1 -0
  212. package/dist/router/index.js +6 -0
  213. package/dist/router/index.js.map +1 -0
  214. package/dist/router/litellm-config.d.ts +34 -0
  215. package/dist/router/litellm-config.d.ts.map +1 -0
  216. package/dist/router/litellm-config.js +78 -0
  217. package/dist/router/litellm-config.js.map +1 -0
  218. package/dist/router/route.d.ts +3 -0
  219. package/dist/router/route.d.ts.map +1 -0
  220. package/dist/router/route.js +63 -0
  221. package/dist/router/route.js.map +1 -0
  222. package/dist/router/types.d.ts +36 -0
  223. package/dist/router/types.d.ts.map +1 -0
  224. package/dist/router/types.js +7 -0
  225. package/dist/router/types.js.map +1 -0
  226. package/dist/saas-connectors/base.d.ts +16 -0
  227. package/dist/saas-connectors/base.d.ts.map +1 -0
  228. package/dist/saas-connectors/base.js +16 -0
  229. package/dist/saas-connectors/base.js.map +1 -0
  230. package/dist/saas-connectors/brave.d.ts +19 -0
  231. package/dist/saas-connectors/brave.d.ts.map +1 -0
  232. package/dist/saas-connectors/brave.js +50 -0
  233. package/dist/saas-connectors/brave.js.map +1 -0
  234. package/dist/saas-connectors/fal.d.ts +15 -0
  235. package/dist/saas-connectors/fal.d.ts.map +1 -0
  236. package/dist/saas-connectors/fal.js +35 -0
  237. package/dist/saas-connectors/fal.js.map +1 -0
  238. package/dist/saas-connectors/index.d.ts +11 -0
  239. package/dist/saas-connectors/index.d.ts.map +1 -0
  240. package/dist/saas-connectors/index.js +32 -0
  241. package/dist/saas-connectors/index.js.map +1 -0
  242. package/dist/saas-connectors/replicate.d.ts +19 -0
  243. package/dist/saas-connectors/replicate.d.ts.map +1 -0
  244. package/dist/saas-connectors/replicate.js +43 -0
  245. package/dist/saas-connectors/replicate.js.map +1 -0
  246. package/dist/saas-connectors/serper.d.ts +19 -0
  247. package/dist/saas-connectors/serper.d.ts.map +1 -0
  248. package/dist/saas-connectors/serper.js +47 -0
  249. package/dist/saas-connectors/serper.js.map +1 -0
  250. package/dist/saas-connectors/types.d.ts +31 -0
  251. package/dist/saas-connectors/types.d.ts.map +1 -0
  252. package/dist/saas-connectors/types.js +6 -0
  253. package/dist/saas-connectors/types.js.map +1 -0
  254. package/dist/scheduler/index.d.ts +4 -0
  255. package/dist/scheduler/index.d.ts.map +1 -0
  256. package/dist/scheduler/index.js +4 -0
  257. package/dist/scheduler/index.js.map +1 -0
  258. package/dist/scheduler/poll.d.ts +4 -0
  259. package/dist/scheduler/poll.d.ts.map +1 -0
  260. package/dist/scheduler/poll.js +170 -0
  261. package/dist/scheduler/poll.js.map +1 -0
  262. package/dist/scheduler/scheduler.d.ts +18 -0
  263. package/dist/scheduler/scheduler.d.ts.map +1 -0
  264. package/dist/scheduler/scheduler.js +67 -0
  265. package/dist/scheduler/scheduler.js.map +1 -0
  266. package/dist/scheduler/types.d.ts +49 -0
  267. package/dist/scheduler/types.d.ts.map +1 -0
  268. package/dist/scheduler/types.js +14 -0
  269. package/dist/scheduler/types.js.map +1 -0
  270. package/dist/skill-installer/npm-installer.d.ts +11 -1
  271. package/dist/skill-installer/npm-installer.d.ts.map +1 -1
  272. package/dist/skill-installer/npm-installer.js +13 -3
  273. package/dist/skill-installer/npm-installer.js.map +1 -1
  274. package/dist/vault/cli.d.ts +2 -0
  275. package/dist/vault/cli.d.ts.map +1 -0
  276. package/dist/vault/cli.js +170 -0
  277. package/dist/vault/cli.js.map +1 -0
  278. package/dist/vault/crypto.d.ts +9 -0
  279. package/dist/vault/crypto.d.ts.map +1 -0
  280. package/dist/vault/crypto.js +54 -0
  281. package/dist/vault/crypto.js.map +1 -0
  282. package/dist/vault/index.d.ts +6 -0
  283. package/dist/vault/index.d.ts.map +1 -0
  284. package/dist/vault/index.js +5 -0
  285. package/dist/vault/index.js.map +1 -0
  286. package/dist/vault/types.d.ts +28 -0
  287. package/dist/vault/types.d.ts.map +1 -0
  288. package/dist/vault/types.js +22 -0
  289. package/dist/vault/types.js.map +1 -0
  290. package/dist/vault/vault.d.ts +34 -0
  291. package/dist/vault/vault.d.ts.map +1 -0
  292. package/dist/vault/vault.js +149 -0
  293. package/dist/vault/vault.js.map +1 -0
  294. package/package.json +17 -5
@@ -0,0 +1,170 @@
1
+ // sdk/skillfm-local/src/scheduler/poll.ts
2
+ //
3
+ // 单次轮询逻辑 — 按 connector 类型遍历, 失败隔离
4
+ import { listRealConnectors } from '../connectors/index.js';
5
+ import { listRealAssetConnectors } from '../asset-connectors/index.js';
6
+ import { listRealSaasConnectors } from '../saas-connectors/index.js';
7
+ const DEFAULT_TIMEOUT = 30000; // 30s
8
+ function withTimeout(p, ms, tag) {
9
+ return Promise.race([
10
+ p,
11
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`timeout ${tag} after ${ms}ms`)), ms)),
12
+ ]);
13
+ }
14
+ export async function pollOnce(vault, brain, cfg) {
15
+ const started = Date.now();
16
+ const t = cfg.per_connector_timeout_ms ?? DEFAULT_TIMEOUT;
17
+ const results = [];
18
+ const usage_records = [];
19
+ const asset_records = [];
20
+ // ─── LLM connectors ───
21
+ for (const c of listRealConnectors()) {
22
+ const t0 = Date.now();
23
+ try {
24
+ const key = await vault.get(c.id);
25
+ if (!key) {
26
+ results.push({
27
+ provider: c.id,
28
+ service: 'llm',
29
+ ok: false,
30
+ records_count: 0,
31
+ error: 'no key in vault',
32
+ duration_ms: Date.now() - t0,
33
+ });
34
+ continue;
35
+ }
36
+ const end_date = new Date();
37
+ const start_date = new Date(end_date.getTime() - 86400_000); // 近 24h
38
+ const recs = await withTimeout(c.fetchUsage(key, { start_date, end_date }), t, c.id);
39
+ usage_records.push(...recs);
40
+ results.push({
41
+ provider: c.id,
42
+ service: 'llm',
43
+ ok: true,
44
+ records_count: recs.length,
45
+ duration_ms: Date.now() - t0,
46
+ });
47
+ }
48
+ catch (e) {
49
+ results.push({
50
+ provider: c.id,
51
+ service: 'llm',
52
+ ok: false,
53
+ records_count: 0,
54
+ error: e instanceof Error ? e.message : String(e),
55
+ duration_ms: Date.now() - t0,
56
+ });
57
+ }
58
+ }
59
+ // ─── Asset connectors (域名/SSL/VPS) ───
60
+ if (cfg.poll_assets !== false) {
61
+ for (const c of listRealAssetConnectors()) {
62
+ const t0 = Date.now();
63
+ try {
64
+ // SSL Labs 用 byok_key 字段实际是逗号分隔域名列表
65
+ // vault 存 'ssl_labs_domains' = "example.com,api.example.com"
66
+ const key = await vault.get(c.id) ?? (c.id === 'ssl_labs' ? await vault.get('ssl_labs_domains') : null);
67
+ if (!key) {
68
+ results.push({
69
+ provider: c.id,
70
+ service: 'asset',
71
+ ok: false,
72
+ records_count: 0,
73
+ error: 'no key in vault',
74
+ duration_ms: Date.now() - t0,
75
+ });
76
+ continue;
77
+ }
78
+ const recs = await withTimeout(c.fetchAssets(key, { limit: 50 }), t, c.id);
79
+ asset_records.push(...recs);
80
+ results.push({
81
+ provider: c.id,
82
+ service: 'asset',
83
+ ok: true,
84
+ records_count: recs.length,
85
+ duration_ms: Date.now() - t0,
86
+ });
87
+ }
88
+ catch (e) {
89
+ results.push({
90
+ provider: c.id,
91
+ service: 'asset',
92
+ ok: false,
93
+ records_count: 0,
94
+ error: e instanceof Error ? e.message : String(e),
95
+ duration_ms: Date.now() - t0,
96
+ });
97
+ }
98
+ }
99
+ }
100
+ // ─── SaaS connectors ───
101
+ if (cfg.poll_saas !== false) {
102
+ for (const c of listRealSaasConnectors()) {
103
+ const t0 = Date.now();
104
+ try {
105
+ const key = await vault.get(c.id);
106
+ if (!key) {
107
+ results.push({
108
+ provider: c.id,
109
+ service: 'saas',
110
+ ok: false,
111
+ records_count: 0,
112
+ error: 'no key in vault',
113
+ duration_ms: Date.now() - t0,
114
+ });
115
+ continue;
116
+ }
117
+ const rec = await withTimeout(c.fetchUsage(key), t, c.id);
118
+ usage_records.push(rec);
119
+ results.push({
120
+ provider: c.id,
121
+ service: 'saas',
122
+ ok: true,
123
+ records_count: 1,
124
+ duration_ms: Date.now() - t0,
125
+ });
126
+ }
127
+ catch (e) {
128
+ results.push({
129
+ provider: c.id,
130
+ service: 'saas',
131
+ ok: false,
132
+ records_count: 0,
133
+ error: e instanceof Error ? e.message : String(e),
134
+ duration_ms: Date.now() - t0,
135
+ });
136
+ }
137
+ }
138
+ }
139
+ // ─── Brain push ───
140
+ let pushed_to_brain = false;
141
+ let brain_error;
142
+ if (usage_records.length > 0 || asset_records.length > 0) {
143
+ try {
144
+ if (usage_records.length > 0) {
145
+ const r = await withTimeout(brain.pushUsageSnapshot(usage_records), t, 'brain-usage');
146
+ if (!r.ok)
147
+ brain_error = r.error ?? 'brain push failed';
148
+ }
149
+ if (asset_records.length > 0) {
150
+ const r = await withTimeout(brain.pushAssetRegistry(asset_records), t, 'brain-assets');
151
+ if (!r.ok)
152
+ brain_error = (brain_error ? brain_error + ' | ' : '') + (r.error ?? 'brain assets push failed');
153
+ }
154
+ pushed_to_brain = !brain_error;
155
+ }
156
+ catch (e) {
157
+ brain_error = e instanceof Error ? e.message : String(e);
158
+ }
159
+ }
160
+ const ended = Date.now();
161
+ return {
162
+ started_at: new Date(started).toISOString(),
163
+ ended_at: new Date(ended).toISOString(),
164
+ duration_ms: ended - started,
165
+ results,
166
+ pushed_to_brain,
167
+ brain_error,
168
+ };
169
+ }
170
+ //# sourceMappingURL=poll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/scheduler/poll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { BrainPushClient, PollSummary, SchedulerConfig } from './types.js';
2
+ import type { Vault } from '../vault/index.js';
3
+ export declare class BeaconScheduler {
4
+ private vault;
5
+ private brain;
6
+ private cfg;
7
+ private timer;
8
+ private last_summary;
9
+ private running;
10
+ constructor(vault: Vault, brain: BrainPushClient, cfg: SchedulerConfig);
11
+ start(): void;
12
+ stop(): void;
13
+ /** 触发一次轮询 (测试用 / 手动 trigger) */
14
+ tick(): Promise<PollSummary>;
15
+ getLastSummary(): PollSummary | null;
16
+ private emptySummary;
17
+ }
18
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAoB,eAAe,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAS/C,qBAAa,eAAe;IAMxB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,GAAG;IAPb,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,OAAO,CAAS;gBAGd,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,eAAe;IAG9B,KAAK,IAAI,IAAI;IAWb,IAAI,IAAI,IAAI;IAOZ,gCAAgC;IAC1B,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;IAelC,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC,OAAO,CAAC,YAAY;CAIrB"}
@@ -0,0 +1,67 @@
1
+ // sdk/skillfm-local/src/scheduler/scheduler.ts
2
+ //
3
+ // 调度器主入口 — 启动 / 停止 / 触发单次轮询
4
+ // Day 4 加 node-cron 接入 (cron expr 支持), Day 3 用 setInterval
5
+ import { pollOnce } from './poll.js';
6
+ function intervalToMs(s) {
7
+ if (s.kind === 'minutes')
8
+ return s.n * 60_000;
9
+ if (s.kind === 'hours')
10
+ return s.n * 3600_000;
11
+ // cron 表达式 Day 4 接 node-cron, Day 3 退化为 30 min
12
+ return 30 * 60_000;
13
+ }
14
+ export class BeaconScheduler {
15
+ vault;
16
+ brain;
17
+ cfg;
18
+ timer = null;
19
+ last_summary = null;
20
+ running = false;
21
+ constructor(vault, brain, cfg) {
22
+ this.vault = vault;
23
+ this.brain = brain;
24
+ this.cfg = cfg;
25
+ }
26
+ start() {
27
+ if (this.timer)
28
+ return;
29
+ const ms = intervalToMs(this.cfg.interval);
30
+ // 立即跑一次, 然后定时
31
+ void this.tick();
32
+ this.timer = setInterval(() => void this.tick(), ms);
33
+ if (typeof this.timer.unref === 'function') {
34
+ this.timer.unref();
35
+ }
36
+ }
37
+ stop() {
38
+ if (this.timer) {
39
+ clearInterval(this.timer);
40
+ this.timer = null;
41
+ }
42
+ }
43
+ /** 触发一次轮询 (测试用 / 手动 trigger) */
44
+ async tick() {
45
+ if (this.running) {
46
+ // 防止 overlap
47
+ return this.last_summary ?? this.emptySummary();
48
+ }
49
+ this.running = true;
50
+ try {
51
+ const s = await pollOnce(this.vault, this.brain, this.cfg);
52
+ this.last_summary = s;
53
+ return s;
54
+ }
55
+ finally {
56
+ this.running = false;
57
+ }
58
+ }
59
+ getLastSummary() {
60
+ return this.last_summary;
61
+ }
62
+ emptySummary() {
63
+ const now = new Date().toISOString();
64
+ return { started_at: now, ended_at: now, duration_ms: 0, results: [], pushed_to_brain: false };
65
+ }
66
+ }
67
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/scheduler/scheduler.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,4BAA4B;AAC5B,2DAA2D;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIrC,SAAS,YAAY,CAAC,CAAmB;IACvC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAC9C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC9C,+CAA+C;IAC/C,OAAO,EAAE,GAAG,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,OAAO,eAAe;IAMhB;IACA;IACA;IAPF,KAAK,GAA0B,IAAI,CAAC;IACpC,YAAY,GAAuB,IAAI,CAAC;IACxC,OAAO,GAAG,KAAK,CAAC;IAExB,YACU,KAAY,EACZ,KAAsB,EACtB,GAAoB;QAFpB,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAiB;QACtB,QAAG,GAAH,GAAG,CAAiB;IAC3B,CAAC;IAEJ,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,cAAc;QACd,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,aAAa;YACb,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACjG,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ export type ScheduleInterval = {
2
+ kind: 'minutes';
3
+ n: number;
4
+ } | {
5
+ kind: 'hours';
6
+ n: number;
7
+ } | {
8
+ kind: 'cron';
9
+ expr: string;
10
+ };
11
+ export interface PollResult {
12
+ provider: string;
13
+ service: 'llm' | 'asset' | 'saas';
14
+ ok: boolean;
15
+ records_count: number;
16
+ error?: string;
17
+ duration_ms: number;
18
+ }
19
+ export interface PollSummary {
20
+ started_at: string;
21
+ ended_at: string;
22
+ duration_ms: number;
23
+ results: PollResult[];
24
+ pushed_to_brain: boolean;
25
+ brain_error?: string;
26
+ }
27
+ export interface BrainPushClient {
28
+ /** push usage snapshot 到 brain /v1/beacon/usage/snapshot */
29
+ pushUsageSnapshot(records: unknown[]): Promise<{
30
+ ok: boolean;
31
+ error?: string;
32
+ }>;
33
+ /** push asset registry 到 brain /v1/beacon/assets/registry */
34
+ pushAssetRegistry(assets: unknown[]): Promise<{
35
+ ok: boolean;
36
+ error?: string;
37
+ }>;
38
+ }
39
+ export interface SchedulerConfig {
40
+ /** 每次轮询间隔 (default: 30 min) */
41
+ interval: ScheduleInterval;
42
+ /** 单 connector 超时 (default: 30s) */
43
+ per_connector_timeout_ms?: number;
44
+ /** 是否每次轮询都 push asset registry (default: true) */
45
+ poll_assets?: boolean;
46
+ /** 是否每次轮询都 push saas usage (default: true) */
47
+ poll_saas?: boolean;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,6DAA6D;IAC7D,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oCAAoC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -0,0 +1,14 @@
1
+ // sdk/skillfm-local/src/scheduler/types.ts
2
+ //
3
+ // Beacon sidecar scheduler — Day 3 D3-B2
4
+ // 职责: cron 调度 connector poll → brain push (PRD §6.2 sidecar 数据底座)
5
+ //
6
+ // 架构 (BYOK 真实链路):
7
+ // 1. scheduler 启动, 加载 vault (master key 节点本地)
8
+ // 2. cron 触发 (e.g. 每 30 min)
9
+ // 3. 遍历 connector registry, 用 vault.get(provider) 取 key
10
+ // 4. connector.fetchUsage(key, period) → UsageRecord[]
11
+ // 5. 聚合 + push 到 brain /v1/beacon/usage/snapshot (经 reverse tunnel)
12
+ // 6. 失败重试 + 单条 connector 失败不影响其他
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scheduler/types.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,yCAAyC;AACzC,kEAAkE;AAClE,EAAE;AACF,kBAAkB;AAClB,gDAAgD;AAChD,+BAA+B;AAC/B,0DAA0D;AAC1D,yDAAyD;AACzD,sEAAsE;AACtE,mCAAmC"}
@@ -10,7 +10,17 @@ export interface NpmInstallResult {
10
10
  */
11
11
  export declare function runNpmCi(installDir: string): Promise<NpmInstallResult>;
12
12
  /**
13
- * Verify that dist/runtime/server.js still exists after npm ci.
13
+ * Verify that dist/bundle/server.js still exists after npm install.
14
+ *
15
+ * Why dist/bundle/server.js (2026-04-26 Day -1 fix):
16
+ * shared/contracts/envelope-v2/skill-distribution.ts BUNDLE_REQUIRED_ENTRY_FILES
17
+ * declares 'dist/bundle/server.js' as the canonical entry (esbuild single-file inline
18
+ * bundle). tar-extractor already validates this at extract time. This post-install
19
+ * hook is a defense-in-depth re-check (catches accidental removal during npm install).
20
+ *
21
+ * Pre-fix bug: this checked installDir/runtime/server.js — wrong path entirely
22
+ * (TS source dir, no .js file would ever exist there in production). Test fixtures
23
+ * put server.js at runtime/ which masked the bug until live agent installation hit.
14
24
  */
15
25
  export declare function verifyServerJs(installDir: string): void;
16
26
  //# sourceMappingURL=npm-installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm-installer.d.ts","sourceRoot":"","sources":["../../src/skill-installer/npm-installer.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqE5E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CASvD"}
1
+ {"version":3,"file":"npm-installer.d.ts","sourceRoot":"","sources":["../../src/skill-installer/npm-installer.ts"],"names":[],"mappings":"AA4BA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqE5E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CASvD"}
@@ -77,12 +77,22 @@ export async function runNpmCi(installDir) {
77
77
  });
78
78
  }
79
79
  /**
80
- * Verify that dist/runtime/server.js still exists after npm ci.
80
+ * Verify that dist/bundle/server.js still exists after npm install.
81
+ *
82
+ * Why dist/bundle/server.js (2026-04-26 Day -1 fix):
83
+ * shared/contracts/envelope-v2/skill-distribution.ts BUNDLE_REQUIRED_ENTRY_FILES
84
+ * declares 'dist/bundle/server.js' as the canonical entry (esbuild single-file inline
85
+ * bundle). tar-extractor already validates this at extract time. This post-install
86
+ * hook is a defense-in-depth re-check (catches accidental removal during npm install).
87
+ *
88
+ * Pre-fix bug: this checked installDir/runtime/server.js — wrong path entirely
89
+ * (TS source dir, no .js file would ever exist there in production). Test fixtures
90
+ * put server.js at runtime/ which masked the bug until live agent installation hit.
81
91
  */
82
92
  export function verifyServerJs(installDir) {
83
- const serverJs = join(installDir, 'runtime', 'server.js');
93
+ const serverJs = join(installDir, 'dist', 'bundle', 'server.js');
84
94
  if (!existsSync(serverJs)) {
85
- const err = new Error(`dist/runtime/server.js missing after npm ci in ${installDir}`);
95
+ const err = new Error(`dist/bundle/server.js missing after npm install in ${installDir}`);
86
96
  err.installCode = SKILL_INSTALL_ERROR_CODES.BUNDLE_MISSING_SERVER_JS;
87
97
  throw err;
88
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"npm-installer.js","sourceRoot":"","sources":["../../src/skill-installer/npm-installer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"npm-installer.js","sourceRoot":"","sources":["../../src/skill-installer/npm-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function cmdVault(): Promise<void>;
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/vault/cli.ts"],"names":[],"mappings":"AA+EA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CA0F9C"}
@@ -0,0 +1,170 @@
1
+ // sdk/skillfm-local/src/vault/cli.ts
2
+ //
3
+ // Vault subcommand CLI (Day 5 B1)
4
+ // 入口: `npx -y @skillfm/local vault <action> [args]`
5
+ // 用法:
6
+ // skillfm-local vault put <provider> [key] # key 省略则 stdin 读 (避免 shell history 留 key)
7
+ // skillfm-local vault get <provider> # 显示 fingerprint, 不显示 key 全文
8
+ // skillfm-local vault list
9
+ // skillfm-local vault delete <provider>
10
+ // skillfm-local vault rotate
11
+ // skillfm-local vault health
12
+ import * as readline from 'node:readline';
13
+ import { Vault } from './vault.js';
14
+ import { maskKey } from '../connectors/types.js';
15
+ async function readStdinHidden(prompt) {
16
+ // 简易 hidden input — 关闭 echo
17
+ process.stdout.write(prompt);
18
+ const stdin = process.stdin;
19
+ return new Promise((resolve, reject) => {
20
+ if (!stdin.isTTY) {
21
+ // 非 TTY (e.g. piped input) — 直接 readline 不 hide
22
+ const rl = readline.createInterface({ input: stdin, output: process.stderr });
23
+ rl.question('', (answer) => {
24
+ rl.close();
25
+ resolve(answer.trim());
26
+ });
27
+ return;
28
+ }
29
+ stdin.setRawMode?.(true);
30
+ stdin.resume();
31
+ stdin.setEncoding('utf8');
32
+ let buf = '';
33
+ const onData = (ch) => {
34
+ const c = ch.toString();
35
+ if (c === '\n' || c === '\r' || c === '') {
36
+ stdin.setRawMode?.(false);
37
+ stdin.pause();
38
+ stdin.removeListener('data', onData);
39
+ process.stdout.write('\n');
40
+ resolve(buf.trim());
41
+ }
42
+ else if (c === '') {
43
+ // Ctrl+C
44
+ stdin.setRawMode?.(false);
45
+ process.exit(130);
46
+ }
47
+ else if (c === '' || c === '\b') {
48
+ // Backspace
49
+ if (buf.length > 0) {
50
+ buf = buf.slice(0, -1);
51
+ process.stdout.write('\b \b');
52
+ }
53
+ }
54
+ else {
55
+ buf += c;
56
+ process.stdout.write('*');
57
+ }
58
+ };
59
+ stdin.on('data', onData);
60
+ stdin.on('error', reject);
61
+ });
62
+ }
63
+ const VALID_PROVIDERS = new Set([
64
+ // LLM
65
+ 'anthropic', 'openai', 'deepseek', 'kimi', 'qwen', 'doubao',
66
+ // Asset (域名 / SSL / VPS)
67
+ 'cloudflare', 'godaddy', 'namecheap', 'ssl_labs', 'ssl_labs_domains',
68
+ 'hetzner', 'digitalocean', 'vultr', 'aliyun_ecs', 'tencent_cvm',
69
+ // SaaS
70
+ 'brave_search', 'serper', 'replicate', 'fal',
71
+ ]);
72
+ function validateProvider(p) {
73
+ if (!VALID_PROVIDERS.has(p)) {
74
+ console.error(`[vault] unknown provider "${p}". Valid: ${[...VALID_PROVIDERS].join(', ')}`);
75
+ process.exit(2);
76
+ }
77
+ }
78
+ export async function cmdVault() {
79
+ const action = process.argv[3];
80
+ const args = process.argv.slice(4);
81
+ if (!action) {
82
+ console.error('Usage: skillfm-local vault <put|get|list|delete|rotate|health> [args]');
83
+ process.exit(2);
84
+ }
85
+ const v = new Vault();
86
+ switch (action) {
87
+ case 'put': {
88
+ const provider = args[0];
89
+ if (!provider) {
90
+ console.error('Usage: skillfm-local vault put <provider> [key]');
91
+ process.exit(2);
92
+ }
93
+ validateProvider(provider);
94
+ let key = args[1];
95
+ if (!key) {
96
+ // 不在命令行传 key (避免 shell history 留痕), 走 hidden stdin
97
+ key = await readStdinHidden(`[vault] enter ${provider} key (input hidden): `);
98
+ }
99
+ if (!key || key.length < 8) {
100
+ console.error('[vault] key 太短 (≥8 chars)');
101
+ process.exit(2);
102
+ }
103
+ await v.put(provider, key);
104
+ console.log(`[vault] ✓ saved ${provider} (${maskKey(key)})`);
105
+ break;
106
+ }
107
+ case 'get': {
108
+ const provider = args[0];
109
+ if (!provider) {
110
+ console.error('Usage: skillfm-local vault get <provider>');
111
+ process.exit(2);
112
+ }
113
+ const k = await v.get(provider);
114
+ if (!k) {
115
+ console.error(`[vault] no key for ${provider}`);
116
+ process.exit(1);
117
+ }
118
+ console.log(`[vault] ${provider}: ${maskKey(k)}`);
119
+ break;
120
+ }
121
+ case 'list': {
122
+ const providers = await v.list();
123
+ if (providers.length === 0) {
124
+ console.log('[vault] (empty)');
125
+ }
126
+ else {
127
+ console.log('[vault] saved providers:');
128
+ for (const p of providers)
129
+ console.log(` - ${p}`);
130
+ }
131
+ break;
132
+ }
133
+ case 'delete': {
134
+ const provider = args[0];
135
+ if (!provider) {
136
+ console.error('Usage: skillfm-local vault delete <provider>');
137
+ process.exit(2);
138
+ }
139
+ const did = await v.delete(provider);
140
+ if (did)
141
+ console.log(`[vault] ✓ deleted ${provider}`);
142
+ else {
143
+ console.error(`[vault] ${provider} not found`);
144
+ process.exit(1);
145
+ }
146
+ break;
147
+ }
148
+ case 'rotate': {
149
+ await v.rotate();
150
+ console.log('[vault] ✓ master key rotated, all entries re-encrypted');
151
+ break;
152
+ }
153
+ case 'health': {
154
+ const h = await v.health();
155
+ if (h.ok) {
156
+ console.log(`[vault] ✓ healthy (${h.entry_count} entries)`);
157
+ }
158
+ else {
159
+ console.error(`[vault] ✗ unhealthy: ${h.error}`);
160
+ process.exit(1);
161
+ }
162
+ break;
163
+ }
164
+ default:
165
+ console.error(`[vault] unknown action: ${action}`);
166
+ console.error('Valid: put | get | list | delete | rotate | health');
167
+ process.exit(2);
168
+ }
169
+ }
170
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/vault/cli.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,EAAE;AACF,kCAAkC;AAClC,oDAAoD;AACpD,MAAM;AACN,2FAA2F;AAC3F,8EAA8E;AAC9E,6BAA6B;AAC7B,0CAA0C;AAC1C,+BAA+B;AAC/B,+BAA+B;AAE/B,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,KAAK,UAAU,eAAe,CAAC,MAAc;IAC3C,4BAA4B;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,gDAAgD;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;gBACzB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE;YAC5B,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC1C,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC1B,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACtB,CAAC;iBAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;gBACrB,SAAS;gBACT,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnC,YAAY;gBACZ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,IAAI,CAAC,CAAC;gBACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QACF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;IAC3D,yBAAyB;IACzB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,kBAAkB;IACpE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa;IAC/D,OAAO;IACP,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK;CAC7C,CAAC,CAAC;AAEH,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,aAAa,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;IAEtB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,mDAAmD;gBACnD,GAAG,GAAG,MAAM,eAAe,CAAC,iBAAiB,QAAQ,uBAAuB,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,QAAQ,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,KAAK,MAAM,CAAC,IAAI,SAAS;oBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;iBACjD,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,WAAW,QAAQ,YAAY,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface EncryptResult {
2
+ iv_b64: string;
3
+ auth_tag_b64: string;
4
+ ciphertext_b64: string;
5
+ }
6
+ export declare function generateMasterKey(): Buffer;
7
+ export declare function encrypt(plaintext: string, key: Buffer): EncryptResult;
8
+ export declare function decrypt(blob: EncryptResult, key: Buffer): string;
9
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/vault/crypto.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAgBrE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAqBhE"}