@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.
Files changed (301) 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/agent-hints.d.ts.map +1 -1
  23. package/dist/agent-hints.js +28 -13
  24. package/dist/agent-hints.js.map +1 -1
  25. package/dist/asset-connectors/aliyun-ecs.d.ts +18 -0
  26. package/dist/asset-connectors/aliyun-ecs.d.ts.map +1 -0
  27. package/dist/asset-connectors/aliyun-ecs.js +99 -0
  28. package/dist/asset-connectors/aliyun-ecs.js.map +1 -0
  29. package/dist/asset-connectors/base.d.ts +15 -0
  30. package/dist/asset-connectors/base.d.ts.map +1 -0
  31. package/dist/asset-connectors/base.js +19 -0
  32. package/dist/asset-connectors/base.js.map +1 -0
  33. package/dist/asset-connectors/cloudflare.d.ts +18 -0
  34. package/dist/asset-connectors/cloudflare.d.ts.map +1 -0
  35. package/dist/asset-connectors/cloudflare.js +94 -0
  36. package/dist/asset-connectors/cloudflare.js.map +1 -0
  37. package/dist/asset-connectors/digitalocean.d.ts +18 -0
  38. package/dist/asset-connectors/digitalocean.d.ts.map +1 -0
  39. package/dist/asset-connectors/digitalocean.js +79 -0
  40. package/dist/asset-connectors/digitalocean.js.map +1 -0
  41. package/dist/asset-connectors/godaddy.d.ts +18 -0
  42. package/dist/asset-connectors/godaddy.d.ts.map +1 -0
  43. package/dist/asset-connectors/godaddy.js +62 -0
  44. package/dist/asset-connectors/godaddy.js.map +1 -0
  45. package/dist/asset-connectors/hetzner.d.ts +18 -0
  46. package/dist/asset-connectors/hetzner.d.ts.map +1 -0
  47. package/dist/asset-connectors/hetzner.js +52 -0
  48. package/dist/asset-connectors/hetzner.js.map +1 -0
  49. package/dist/asset-connectors/index.d.ts +18 -0
  50. package/dist/asset-connectors/index.d.ts.map +1 -0
  51. package/dist/asset-connectors/index.js +52 -0
  52. package/dist/asset-connectors/index.js.map +1 -0
  53. package/dist/asset-connectors/namecheap.d.ts +34 -0
  54. package/dist/asset-connectors/namecheap.d.ts.map +1 -0
  55. package/dist/asset-connectors/namecheap.js +178 -0
  56. package/dist/asset-connectors/namecheap.js.map +1 -0
  57. package/dist/asset-connectors/ssl-labs.d.ts +22 -0
  58. package/dist/asset-connectors/ssl-labs.d.ts.map +1 -0
  59. package/dist/asset-connectors/ssl-labs.js +79 -0
  60. package/dist/asset-connectors/ssl-labs.js.map +1 -0
  61. package/dist/asset-connectors/tencent-cvm.d.ts +18 -0
  62. package/dist/asset-connectors/tencent-cvm.d.ts.map +1 -0
  63. package/dist/asset-connectors/tencent-cvm.js +145 -0
  64. package/dist/asset-connectors/tencent-cvm.js.map +1 -0
  65. package/dist/asset-connectors/types.d.ts +45 -0
  66. package/dist/asset-connectors/types.d.ts.map +1 -0
  67. package/dist/asset-connectors/types.js +26 -0
  68. package/dist/asset-connectors/types.js.map +1 -0
  69. package/dist/asset-connectors/vultr.d.ts +18 -0
  70. package/dist/asset-connectors/vultr.d.ts.map +1 -0
  71. package/dist/asset-connectors/vultr.js +73 -0
  72. package/dist/asset-connectors/vultr.js.map +1 -0
  73. package/dist/connectors/anthropic.d.ts +10 -0
  74. package/dist/connectors/anthropic.d.ts.map +1 -0
  75. package/dist/connectors/anthropic.js +103 -0
  76. package/dist/connectors/anthropic.js.map +1 -0
  77. package/dist/connectors/base.d.ts +11 -0
  78. package/dist/connectors/base.d.ts.map +1 -0
  79. package/dist/connectors/base.js +19 -0
  80. package/dist/connectors/base.js.map +1 -0
  81. package/dist/connectors/deepseek.d.ts +14 -0
  82. package/dist/connectors/deepseek.d.ts.map +1 -0
  83. package/dist/connectors/deepseek.js +77 -0
  84. package/dist/connectors/deepseek.js.map +1 -0
  85. package/dist/connectors/doubao.d.ts +10 -0
  86. package/dist/connectors/doubao.d.ts.map +1 -0
  87. package/dist/connectors/doubao.js +64 -0
  88. package/dist/connectors/doubao.js.map +1 -0
  89. package/dist/connectors/index.d.ts +14 -0
  90. package/dist/connectors/index.d.ts.map +1 -0
  91. package/dist/connectors/index.js +42 -0
  92. package/dist/connectors/index.js.map +1 -0
  93. package/dist/connectors/kimi.d.ts +10 -0
  94. package/dist/connectors/kimi.d.ts.map +1 -0
  95. package/dist/connectors/kimi.js +67 -0
  96. package/dist/connectors/kimi.js.map +1 -0
  97. package/dist/connectors/openai.d.ts +10 -0
  98. package/dist/connectors/openai.d.ts.map +1 -0
  99. package/dist/connectors/openai.js +101 -0
  100. package/dist/connectors/openai.js.map +1 -0
  101. package/dist/connectors/qwen.d.ts +10 -0
  102. package/dist/connectors/qwen.d.ts.map +1 -0
  103. package/dist/connectors/qwen.js +66 -0
  104. package/dist/connectors/qwen.js.map +1 -0
  105. package/dist/connectors/types.d.ts +47 -0
  106. package/dist/connectors/types.d.ts.map +1 -0
  107. package/dist/connectors/types.js +24 -0
  108. package/dist/connectors/types.js.map +1 -0
  109. package/dist/guard/bin.js +0 -0
  110. package/dist/index.js +83 -1
  111. package/dist/index.js.map +1 -1
  112. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts +373 -0
  113. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.d.ts.map +1 -0
  114. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js +130 -0
  115. package/dist/mcp/_vendored-contracts/beacon-mcp-tools-v1.js.map +1 -0
  116. package/dist/mcp/brain-client.d.ts +96 -0
  117. package/dist/mcp/brain-client.d.ts.map +1 -0
  118. package/dist/mcp/brain-client.js +214 -0
  119. package/dist/mcp/brain-client.js.map +1 -0
  120. package/dist/mcp/cache.d.ts +55 -0
  121. package/dist/mcp/cache.d.ts.map +1 -0
  122. package/dist/mcp/cache.js +109 -0
  123. package/dist/mcp/cache.js.map +1 -0
  124. package/dist/mcp/config.d.ts +29 -0
  125. package/dist/mcp/config.d.ts.map +1 -0
  126. package/dist/mcp/config.js +69 -0
  127. package/dist/mcp/config.js.map +1 -0
  128. package/dist/mcp/decision-engine.d.ts +54 -0
  129. package/dist/mcp/decision-engine.d.ts.map +1 -0
  130. package/dist/mcp/decision-engine.js +107 -0
  131. package/dist/mcp/decision-engine.js.map +1 -0
  132. package/dist/mcp/errors.d.ts +66 -0
  133. package/dist/mcp/errors.d.ts.map +1 -0
  134. package/dist/mcp/errors.js +127 -0
  135. package/dist/mcp/errors.js.map +1 -0
  136. package/dist/mcp/index.d.ts +40 -0
  137. package/dist/mcp/index.d.ts.map +1 -0
  138. package/dist/mcp/index.js +104 -0
  139. package/dist/mcp/index.js.map +1 -0
  140. package/dist/mcp/tools/_placeholder.d.ts +24 -0
  141. package/dist/mcp/tools/_placeholder.d.ts.map +1 -0
  142. package/dist/mcp/tools/_placeholder.js +29 -0
  143. package/dist/mcp/tools/_placeholder.js.map +1 -0
  144. package/dist/mcp/tools/avatar-market.d.ts +22 -0
  145. package/dist/mcp/tools/avatar-market.d.ts.map +1 -0
  146. package/dist/mcp/tools/avatar-market.js +33 -0
  147. package/dist/mcp/tools/avatar-market.js.map +1 -0
  148. package/dist/mcp/tools/check-expiry.d.ts +23 -0
  149. package/dist/mcp/tools/check-expiry.d.ts.map +1 -0
  150. package/dist/mcp/tools/check-expiry.js +29 -0
  151. package/dist/mcp/tools/check-expiry.js.map +1 -0
  152. package/dist/mcp/tools/check-usage.d.ts +25 -0
  153. package/dist/mcp/tools/check-usage.d.ts.map +1 -0
  154. package/dist/mcp/tools/check-usage.js +33 -0
  155. package/dist/mcp/tools/check-usage.js.map +1 -0
  156. package/dist/mcp/tools/credential-tools.d.ts +37 -0
  157. package/dist/mcp/tools/credential-tools.d.ts.map +1 -0
  158. package/dist/mcp/tools/credential-tools.js +109 -0
  159. package/dist/mcp/tools/credential-tools.js.map +1 -0
  160. package/dist/mcp/tools/get-monthly-picks.d.ts +25 -0
  161. package/dist/mcp/tools/get-monthly-picks.d.ts.map +1 -0
  162. package/dist/mcp/tools/get-monthly-picks.js +35 -0
  163. package/dist/mcp/tools/get-monthly-picks.js.map +1 -0
  164. package/dist/mcp/tools/index.d.ts +44 -0
  165. package/dist/mcp/tools/index.d.ts.map +1 -0
  166. package/dist/mcp/tools/index.js +188 -0
  167. package/dist/mcp/tools/index.js.map +1 -0
  168. package/dist/mcp/tools/memory-recent.d.ts +17 -0
  169. package/dist/mcp/tools/memory-recent.d.ts.map +1 -0
  170. package/dist/mcp/tools/memory-recent.js +46 -0
  171. package/dist/mcp/tools/memory-recent.js.map +1 -0
  172. package/dist/mcp/tools/memory-save.d.ts +15 -0
  173. package/dist/mcp/tools/memory-save.d.ts.map +1 -0
  174. package/dist/mcp/tools/memory-save.js +53 -0
  175. package/dist/mcp/tools/memory-save.js.map +1 -0
  176. package/dist/mcp/tools/memory-search.d.ts +24 -0
  177. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  178. package/dist/mcp/tools/memory-search.js +64 -0
  179. package/dist/mcp/tools/memory-search.js.map +1 -0
  180. package/dist/mcp/tools/record-acceptance.d.ts +22 -0
  181. package/dist/mcp/tools/record-acceptance.d.ts.map +1 -0
  182. package/dist/mcp/tools/record-acceptance.js +33 -0
  183. package/dist/mcp/tools/record-acceptance.js.map +1 -0
  184. package/dist/mcp/tools/record-rejection.d.ts +23 -0
  185. package/dist/mcp/tools/record-rejection.d.ts.map +1 -0
  186. package/dist/mcp/tools/record-rejection.js +34 -0
  187. package/dist/mcp/tools/record-rejection.js.map +1 -0
  188. package/dist/mcp/tools/suggest-route.d.ts +26 -0
  189. package/dist/mcp/tools/suggest-route.d.ts.map +1 -0
  190. package/dist/mcp/tools/suggest-route.js +56 -0
  191. package/dist/mcp/tools/suggest-route.js.map +1 -0
  192. package/dist/mcp/tools/user-preferences.d.ts +22 -0
  193. package/dist/mcp/tools/user-preferences.d.ts.map +1 -0
  194. package/dist/mcp/tools/user-preferences.js +63 -0
  195. package/dist/mcp/tools/user-preferences.js.map +1 -0
  196. package/dist/mcp-stdio/bin.js +0 -0
  197. package/dist/memory/index.d.ts +5 -0
  198. package/dist/memory/index.d.ts.map +1 -0
  199. package/dist/memory/index.js +4 -0
  200. package/dist/memory/index.js.map +1 -0
  201. package/dist/memory/mem0-client.d.ts +32 -0
  202. package/dist/memory/mem0-client.d.ts.map +1 -0
  203. package/dist/memory/mem0-client.js +161 -0
  204. package/dist/memory/mem0-client.js.map +1 -0
  205. package/dist/memory/types.d.ts +47 -0
  206. package/dist/memory/types.d.ts.map +1 -0
  207. package/dist/memory/types.js +20 -0
  208. package/dist/memory/types.js.map +1 -0
  209. package/dist/router/catalog.d.ts +4 -0
  210. package/dist/router/catalog.d.ts.map +1 -0
  211. package/dist/router/catalog.js +103 -0
  212. package/dist/router/catalog.js.map +1 -0
  213. package/dist/router/classifier.d.ts +5 -0
  214. package/dist/router/classifier.d.ts.map +1 -0
  215. package/dist/router/classifier.js +43 -0
  216. package/dist/router/classifier.js.map +1 -0
  217. package/dist/router/index.d.ts +7 -0
  218. package/dist/router/index.d.ts.map +1 -0
  219. package/dist/router/index.js +6 -0
  220. package/dist/router/index.js.map +1 -0
  221. package/dist/router/litellm-config.d.ts +34 -0
  222. package/dist/router/litellm-config.d.ts.map +1 -0
  223. package/dist/router/litellm-config.js +78 -0
  224. package/dist/router/litellm-config.js.map +1 -0
  225. package/dist/router/route.d.ts +3 -0
  226. package/dist/router/route.d.ts.map +1 -0
  227. package/dist/router/route.js +63 -0
  228. package/dist/router/route.js.map +1 -0
  229. package/dist/router/types.d.ts +36 -0
  230. package/dist/router/types.d.ts.map +1 -0
  231. package/dist/router/types.js +7 -0
  232. package/dist/router/types.js.map +1 -0
  233. package/dist/saas-connectors/base.d.ts +16 -0
  234. package/dist/saas-connectors/base.d.ts.map +1 -0
  235. package/dist/saas-connectors/base.js +16 -0
  236. package/dist/saas-connectors/base.js.map +1 -0
  237. package/dist/saas-connectors/brave.d.ts +19 -0
  238. package/dist/saas-connectors/brave.d.ts.map +1 -0
  239. package/dist/saas-connectors/brave.js +50 -0
  240. package/dist/saas-connectors/brave.js.map +1 -0
  241. package/dist/saas-connectors/fal.d.ts +15 -0
  242. package/dist/saas-connectors/fal.d.ts.map +1 -0
  243. package/dist/saas-connectors/fal.js +35 -0
  244. package/dist/saas-connectors/fal.js.map +1 -0
  245. package/dist/saas-connectors/index.d.ts +11 -0
  246. package/dist/saas-connectors/index.d.ts.map +1 -0
  247. package/dist/saas-connectors/index.js +32 -0
  248. package/dist/saas-connectors/index.js.map +1 -0
  249. package/dist/saas-connectors/replicate.d.ts +19 -0
  250. package/dist/saas-connectors/replicate.d.ts.map +1 -0
  251. package/dist/saas-connectors/replicate.js +43 -0
  252. package/dist/saas-connectors/replicate.js.map +1 -0
  253. package/dist/saas-connectors/serper.d.ts +19 -0
  254. package/dist/saas-connectors/serper.d.ts.map +1 -0
  255. package/dist/saas-connectors/serper.js +47 -0
  256. package/dist/saas-connectors/serper.js.map +1 -0
  257. package/dist/saas-connectors/types.d.ts +31 -0
  258. package/dist/saas-connectors/types.d.ts.map +1 -0
  259. package/dist/saas-connectors/types.js +6 -0
  260. package/dist/saas-connectors/types.js.map +1 -0
  261. package/dist/scheduler/brain-push-client.d.ts +13 -0
  262. package/dist/scheduler/brain-push-client.d.ts.map +1 -0
  263. package/dist/scheduler/brain-push-client.js +46 -0
  264. package/dist/scheduler/brain-push-client.js.map +1 -0
  265. package/dist/scheduler/index.d.ts +6 -0
  266. package/dist/scheduler/index.d.ts.map +1 -0
  267. package/dist/scheduler/index.js +5 -0
  268. package/dist/scheduler/index.js.map +1 -0
  269. package/dist/scheduler/poll.d.ts +4 -0
  270. package/dist/scheduler/poll.d.ts.map +1 -0
  271. package/dist/scheduler/poll.js +170 -0
  272. package/dist/scheduler/poll.js.map +1 -0
  273. package/dist/scheduler/scheduler.d.ts +18 -0
  274. package/dist/scheduler/scheduler.d.ts.map +1 -0
  275. package/dist/scheduler/scheduler.js +67 -0
  276. package/dist/scheduler/scheduler.js.map +1 -0
  277. package/dist/scheduler/types.d.ts +49 -0
  278. package/dist/scheduler/types.d.ts.map +1 -0
  279. package/dist/scheduler/types.js +14 -0
  280. package/dist/scheduler/types.js.map +1 -0
  281. package/dist/vault/cli.d.ts +2 -0
  282. package/dist/vault/cli.d.ts.map +1 -0
  283. package/dist/vault/cli.js +170 -0
  284. package/dist/vault/cli.js.map +1 -0
  285. package/dist/vault/crypto.d.ts +9 -0
  286. package/dist/vault/crypto.d.ts.map +1 -0
  287. package/dist/vault/crypto.js +54 -0
  288. package/dist/vault/crypto.js.map +1 -0
  289. package/dist/vault/index.d.ts +6 -0
  290. package/dist/vault/index.d.ts.map +1 -0
  291. package/dist/vault/index.js +5 -0
  292. package/dist/vault/index.js.map +1 -0
  293. package/dist/vault/types.d.ts +28 -0
  294. package/dist/vault/types.d.ts.map +1 -0
  295. package/dist/vault/types.js +22 -0
  296. package/dist/vault/types.js.map +1 -0
  297. package/dist/vault/vault.d.ts +34 -0
  298. package/dist/vault/vault.d.ts.map +1 -0
  299. package/dist/vault/vault.js +149 -0
  300. package/dist/vault/vault.js.map +1 -0
  301. package/package.json +17 -5
@@ -0,0 +1,47 @@
1
+ // sdk/skillfm-local/src/saas-connectors/serper.ts
2
+ //
3
+ // Serper connector — Google 搜索 SaaS (Day 2 真实现)
4
+ // Doc: https://serper.dev/api
5
+ // Auth: X-API-KEY: <key>
6
+ // Account: GET https://google.serper.dev/account (返 credits 余额)
7
+ import { SaasBaseConnector } from './base.js';
8
+ import { sanitizeError } from '../connectors/types.js';
9
+ const ACCOUNT_URL = 'https://google.serper.dev/account';
10
+ export class SerperConnector extends SaasBaseConnector {
11
+ id = 'serper';
12
+ name = 'Serper';
13
+ service_type = 'search';
14
+ is_real = true;
15
+ async fetchUsage(byok_key, _opts) {
16
+ const r = await this.safeFetch(ACCOUNT_URL, { method: 'GET', headers: { 'x-api-key': byok_key } }, byok_key);
17
+ if (!r.ok) {
18
+ const text = await r.text().catch(() => '');
19
+ throw new Error(sanitizeError(`Serper ${r.status}: ${text}`, byok_key));
20
+ }
21
+ const data = (await r.json());
22
+ // Serper 1 credit ≈ $0.001 (按 $50 = 50000 credits 推算)
23
+ const balance_usd = (data.balance ?? 0) * 0.001;
24
+ return {
25
+ provider: this.id,
26
+ service_type: this.service_type,
27
+ requests: 0, // Serper 没暴露累计 requests
28
+ balance_usd,
29
+ spent_usd: null,
30
+ timestamp: new Date().toISOString(),
31
+ };
32
+ }
33
+ async ping(byok_key) {
34
+ const fp = this.fingerprint(byok_key);
35
+ try {
36
+ const r = await this.safeFetch(ACCOUNT_URL, { method: 'GET', headers: { 'x-api-key': byok_key } }, byok_key);
37
+ if (r.ok)
38
+ return { ok: true, key_fingerprint: fp };
39
+ const text = await r.text().catch(() => '');
40
+ return { ok: false, error: `HTTP ${r.status}: ${sanitizeError(text, byok_key)}`, key_fingerprint: fp };
41
+ }
42
+ catch (e) {
43
+ return { ok: false, error: sanitizeError(e, byok_key), key_fingerprint: fp };
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=serper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serper.js","sourceRoot":"","sources":["../../src/saas-connectors/serper.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,gDAAgD;AAChD,8BAA8B;AAC9B,yBAAyB;AACzB,gEAAgE;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,MAAM,WAAW,GAAG,mCAAmC,CAAC;AASxD,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IACpD,EAAE,GAAmB,QAAQ,CAAC;IAC9B,IAAI,GAAG,QAAQ,CAAC;IAChB,YAAY,GAAoB,QAAQ,CAAC;IACzC,OAAO,GAAG,IAAI,CAAC;IAEf,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,KAA6B;QAC9D,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAC5B,WAAW,EACX,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EACrD,QAAQ,CACT,CAAC;QACF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAA0B,CAAC;QACvD,sDAAsD;QACtD,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QAChD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,EAAE;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,CAAC,EAAE,wBAAwB;YACrC,WAAW;YACX,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,SAAS,CAC5B,WAAW,EACX,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EACrD,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,CAAC,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACzG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QAC/E,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,31 @@
1
+ export type SaasServiceType = 'search' | 'crawler' | 'image_gen' | 'voice' | 'compute' | 'vector_db';
2
+ export type SaasProviderId = 'brave_search' | 'serper' | 'tavily' | 'firecrawl' | 'replicate' | 'fal' | 'elevenlabs' | 'modal' | 'pinecone';
3
+ export interface SaasUsageRecord {
4
+ provider: SaasProviderId;
5
+ service_type: SaasServiceType;
6
+ /** 当前周期累计请求数 (e.g. 当月 search 数) */
7
+ requests: number;
8
+ /** 当前余额 (USD) — 没有 = null */
9
+ balance_usd: number | null;
10
+ /** 当前周期已用 USD (近似) */
11
+ spent_usd: number | null;
12
+ /** 数据时间戳 */
13
+ timestamp: string;
14
+ }
15
+ export interface FetchSaasUsageOptions {
16
+ start_date?: Date;
17
+ end_date?: Date;
18
+ }
19
+ export interface SaasConnector {
20
+ id: SaasProviderId;
21
+ name: string;
22
+ service_type: SaasServiceType;
23
+ is_real: boolean;
24
+ fetchUsage(byok_key: string, opts?: FetchSaasUsageOptions): Promise<SaasUsageRecord>;
25
+ ping(byok_key: string): Promise<{
26
+ ok: boolean;
27
+ error?: string;
28
+ key_fingerprint?: string;
29
+ }>;
30
+ }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/saas-connectors/types.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,OAAO,GACP,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,WAAW,GACX,KAAK,GACL,YAAY,GACZ,OAAO,GACP,UAAU,CAAC;AAEf,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,eAAe,CAAC;IAC9B,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,sBAAsB;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,cAAc,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,eAAe,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5F"}
@@ -0,0 +1,6 @@
1
+ // sdk/skillfm-local/src/saas-connectors/types.ts
2
+ //
3
+ // 第三方 SaaS connector 共享类型 (Day 2 D2-4)
4
+ // 跟 LLM connector / asset connector 区分 — 这里是工具类 SaaS (搜索/爬虫/图视频/语音/算力/向量库)
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/saas-connectors/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,uCAAuC;AACvC,2EAA2E"}
@@ -0,0 +1,13 @@
1
+ import type { BrainPushClient } from './types.js';
2
+ export interface BrainPushClientOptions {
3
+ /** brain api root, e.g. https://api.skillfm.ai */
4
+ apiRoot: string;
5
+ /** X-Agent-Token (从 sidecar state.brainKey 透传) */
6
+ agentToken: string;
7
+ /** User-Agent (PKG_NAME/PKG_VERSION) */
8
+ userAgent: string;
9
+ /** 单次 push 超时,默认 30s */
10
+ timeoutMs?: number;
11
+ }
12
+ export declare function createBrainPushClient(opts: BrainPushClientOptions): BrainPushClient;
13
+ //# sourceMappingURL=brain-push-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-push-client.d.ts","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,eAAe,CAsCnF"}
@@ -0,0 +1,46 @@
1
+ // sdk/skillfm-local/src/scheduler/brain-push-client.ts
2
+ //
3
+ // Default BrainPushClient — POST 到 brain /v1/beacon/usage/snapshot + /v1/beacon/assets/registry
4
+ // 用于 sidecar 启动时 wire 自动 monitoring (Phase 2 走通 Beacon)。
5
+ const USAGE_PATH = '/v1/beacon/usage/snapshot';
6
+ const ASSETS_PATH = '/v1/beacon/assets/registry';
7
+ export function createBrainPushClient(opts) {
8
+ const { apiRoot, agentToken, userAgent, timeoutMs = 30_000 } = opts;
9
+ const headers = {
10
+ 'Content-Type': 'application/json',
11
+ 'X-Agent-Token': agentToken,
12
+ 'User-Agent': userAgent,
13
+ };
14
+ async function postJson(path, body) {
15
+ const ctrl = new AbortController();
16
+ const timer = setTimeout(() => ctrl.abort(), timeoutMs);
17
+ try {
18
+ const res = await fetch(`${apiRoot}${path}`, {
19
+ method: 'POST',
20
+ headers,
21
+ body: JSON.stringify(body),
22
+ signal: ctrl.signal,
23
+ });
24
+ if (!res.ok) {
25
+ const text = await res.text().catch(() => '');
26
+ return { ok: false, error: `${res.status} ${text.slice(0, 200)}` };
27
+ }
28
+ return { ok: true };
29
+ }
30
+ catch (e) {
31
+ return { ok: false, error: e instanceof Error ? e.message : String(e) };
32
+ }
33
+ finally {
34
+ clearTimeout(timer);
35
+ }
36
+ }
37
+ return {
38
+ async pushUsageSnapshot(records) {
39
+ return postJson(USAGE_PATH, { snapshots: records, client_timestamp: new Date().toISOString() });
40
+ },
41
+ async pushAssetRegistry(assets) {
42
+ return postJson(ASSETS_PATH, { assets, client_timestamp: new Date().toISOString() });
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=brain-push-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brain-push-client.js","sourceRoot":"","sources":["../../src/scheduler/brain-push-client.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,gGAAgG;AAChG,yDAAyD;AAezD,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAC/C,MAAM,WAAW,GAAG,4BAA4B,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,IAA4B;IAChE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACpE,MAAM,OAAO,GAAG;QACd,cAAc,EAAE,kBAAkB;QAClC,eAAe,EAAE,UAAU;QAC3B,YAAY,EAAE,SAAS;KACxB,CAAC;IAEF,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAa;QACjD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;gBAC3C,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,OAAO;YAC7B,OAAO,QAAQ,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,MAAM;YAC5B,OAAO,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { ScheduleInterval, PollResult, PollSummary, BrainPushClient, SchedulerConfig, } from './types.js';
2
+ export { pollOnce } from './poll.js';
3
+ export { BeaconScheduler } from './scheduler.js';
4
+ export { createBrainPushClient } from './brain-push-client.js';
5
+ export type { BrainPushClientOptions } from './brain-push-client.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // sdk/skillfm-local/src/scheduler/index.ts
2
+ export { pollOnce } from './poll.js';
3
+ export { BeaconScheduler } from './scheduler.js';
4
+ export { createBrainPushClient } from './brain-push-client.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAS3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Vault } from '../vault/index.js';
2
+ import type { BrainPushClient, PollSummary, SchedulerConfig } from './types.js';
3
+ export declare function pollOnce(vault: Vault, brain: BrainPushClient, cfg: SchedulerConfig): Promise<PollSummary>;
4
+ //# sourceMappingURL=poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/scheduler/poll.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAc,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAa5F,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,WAAW,CAAC,CA8JtB"}
@@ -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"}
@@ -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"}