yappr 0.1.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 (149) hide show
  1. package/.env.example +115 -0
  2. package/config/context/personality.md +7 -0
  3. package/config/context/security.md +10 -0
  4. package/config/hooks/example.ts +47 -0
  5. package/config/hooks/holder.ts +154 -0
  6. package/config/hooks/user-memory.ts +102 -0
  7. package/config/skills/compute/handler.ts +6 -0
  8. package/config/skills/compute/skill.md +7 -0
  9. package/config/skills/cron/handler.ts +89 -0
  10. package/config/skills/cron/skill.md +36 -0
  11. package/config/skills/generate-image/handler.ts +133 -0
  12. package/config/skills/generate-image/skill.md +20 -0
  13. package/config/skills/generate-meme-prompt/handler.ts +40 -0
  14. package/config/skills/generate-meme-prompt/skill.md +23 -0
  15. package/config/skills/stats/handler.ts +76 -0
  16. package/config/skills/stats/skill.md +18 -0
  17. package/config/skills/wallet/handler.ts +56 -0
  18. package/config/skills/wallet/skill.md +17 -0
  19. package/config/skills/x/handler.ts +135 -0
  20. package/config/skills/x/skill.md +163 -0
  21. package/dist/config/hooks/example.d.ts +2 -0
  22. package/dist/config/hooks/example.js +37 -0
  23. package/dist/config/hooks/holder.d.ts +2 -0
  24. package/dist/config/hooks/holder.js +147 -0
  25. package/dist/config/hooks/user-memory.d.ts +2 -0
  26. package/dist/config/hooks/user-memory.js +79 -0
  27. package/dist/config/skills/compute/handler.d.ts +2 -0
  28. package/dist/config/skills/compute/handler.js +5 -0
  29. package/dist/config/skills/cron/handler.d.ts +2 -0
  30. package/dist/config/skills/cron/handler.js +84 -0
  31. package/dist/config/skills/generate-image/handler.d.ts +2 -0
  32. package/dist/config/skills/generate-image/handler.js +122 -0
  33. package/dist/config/skills/generate-meme/handler.d.ts +2 -0
  34. package/dist/config/skills/generate-meme/handler.js +121 -0
  35. package/dist/config/skills/generate-meme-prompt/handler.d.ts +2 -0
  36. package/dist/config/skills/generate-meme-prompt/handler.js +38 -0
  37. package/dist/config/skills/stats/handler.d.ts +2 -0
  38. package/dist/config/skills/stats/handler.js +71 -0
  39. package/dist/config/skills/wallet/handler.d.ts +2 -0
  40. package/dist/config/skills/wallet/handler.js +54 -0
  41. package/dist/config/skills/x/handler.d.ts +2 -0
  42. package/dist/config/skills/x/handler.js +115 -0
  43. package/dist/src/agent-prompt.d.ts +1 -0
  44. package/dist/src/agent-prompt.js +45 -0
  45. package/dist/src/bankr.d.ts +41 -0
  46. package/dist/src/bankr.js +76 -0
  47. package/dist/src/cli/backup.d.ts +7 -0
  48. package/dist/src/cli/backup.js +78 -0
  49. package/dist/src/cli/charts.d.ts +32 -0
  50. package/dist/src/cli/charts.js +222 -0
  51. package/dist/src/cli/config-sync.d.ts +7 -0
  52. package/dist/src/cli/config-sync.js +71 -0
  53. package/dist/src/cli/deploy.d.ts +2 -0
  54. package/dist/src/cli/deploy.js +1059 -0
  55. package/dist/src/cli/env.d.ts +4 -0
  56. package/dist/src/cli/env.js +50 -0
  57. package/dist/src/cli/host-key.d.ts +4 -0
  58. package/dist/src/cli/host-key.js +50 -0
  59. package/dist/src/cli/index.d.ts +2 -0
  60. package/dist/src/cli/index.js +71 -0
  61. package/dist/src/cli/init.d.ts +1 -0
  62. package/dist/src/cli/init.js +51 -0
  63. package/dist/src/cli/ssh.d.ts +2 -0
  64. package/dist/src/cli/ssh.js +141 -0
  65. package/dist/src/cli/status.d.ts +7 -0
  66. package/dist/src/cli/status.js +1184 -0
  67. package/dist/src/cli/tui.d.ts +18 -0
  68. package/dist/src/cli/tui.js +115 -0
  69. package/dist/src/cli/ui.d.ts +30 -0
  70. package/dist/src/cli/ui.js +164 -0
  71. package/dist/src/cli/update.d.ts +1 -0
  72. package/dist/src/cli/update.js +263 -0
  73. package/dist/src/cli/x-login.d.ts +6 -0
  74. package/dist/src/cli/x-login.js +70 -0
  75. package/dist/src/compute.d.ts +11 -0
  76. package/dist/src/compute.js +109 -0
  77. package/dist/src/config-loader.d.ts +19 -0
  78. package/dist/src/config-loader.js +82 -0
  79. package/dist/src/config.d.ts +29 -0
  80. package/dist/src/config.js +68 -0
  81. package/dist/src/cron/capability.d.ts +6 -0
  82. package/dist/src/cron/capability.js +66 -0
  83. package/dist/src/cron/runner.d.ts +2 -0
  84. package/dist/src/cron/runner.js +113 -0
  85. package/dist/src/cron/schedule.d.ts +19 -0
  86. package/dist/src/cron/schedule.js +154 -0
  87. package/dist/src/cron/store.d.ts +46 -0
  88. package/dist/src/cron/store.js +220 -0
  89. package/dist/src/db.d.ts +4 -0
  90. package/dist/src/db.js +53 -0
  91. package/dist/src/hooks/loader.d.ts +1 -0
  92. package/dist/src/hooks/loader.js +17 -0
  93. package/dist/src/hooks/registry.d.ts +17 -0
  94. package/dist/src/hooks/registry.js +78 -0
  95. package/dist/src/hooks/types.d.ts +45 -0
  96. package/dist/src/hooks/types.js +1 -0
  97. package/dist/src/index.d.ts +25 -0
  98. package/dist/src/index.js +35 -0
  99. package/dist/src/llm/index.d.ts +23 -0
  100. package/dist/src/llm/index.js +213 -0
  101. package/dist/src/llm/prompts.d.ts +6 -0
  102. package/dist/src/llm/prompts.js +99 -0
  103. package/dist/src/log.d.ts +2 -0
  104. package/dist/src/log.js +30 -0
  105. package/dist/src/reply/agent.d.ts +20 -0
  106. package/dist/src/reply/agent.js +215 -0
  107. package/dist/src/reply/context-blocks.d.ts +12 -0
  108. package/dist/src/reply/context-blocks.js +22 -0
  109. package/dist/src/reply/gating.d.ts +3 -0
  110. package/dist/src/reply/gating.js +35 -0
  111. package/dist/src/reply/pipeline.d.ts +3 -0
  112. package/dist/src/reply/pipeline.js +144 -0
  113. package/dist/src/reply/poller.d.ts +5 -0
  114. package/dist/src/reply/poller.js +79 -0
  115. package/dist/src/skills/holder-access.d.ts +7 -0
  116. package/dist/src/skills/holder-access.js +53 -0
  117. package/dist/src/skills/loader.d.ts +2 -0
  118. package/dist/src/skills/loader.js +64 -0
  119. package/dist/src/skills/registry.d.ts +4 -0
  120. package/dist/src/skills/registry.js +10 -0
  121. package/dist/src/skills/types.d.ts +16 -0
  122. package/dist/src/skills/types.js +1 -0
  123. package/dist/src/state.d.ts +5 -0
  124. package/dist/src/state.js +26 -0
  125. package/dist/src/stats-cli.d.ts +1 -0
  126. package/dist/src/stats-cli.js +82 -0
  127. package/dist/src/stats.d.ts +41 -0
  128. package/dist/src/stats.js +236 -0
  129. package/dist/src/storage.d.ts +16 -0
  130. package/dist/src/storage.js +107 -0
  131. package/dist/src/treasury/abi.d.ts +99 -0
  132. package/dist/src/treasury/abi.js +71 -0
  133. package/dist/src/treasury/cycle.d.ts +16 -0
  134. package/dist/src/treasury/cycle.js +154 -0
  135. package/dist/src/treasury/index.d.ts +28 -0
  136. package/dist/src/treasury/index.js +222 -0
  137. package/dist/src/util.d.ts +3 -0
  138. package/dist/src/util.js +18 -0
  139. package/dist/src/wallet.d.ts +5 -0
  140. package/dist/src/wallet.js +241 -0
  141. package/dist/src/x/client.d.ts +74 -0
  142. package/dist/src/x/client.js +323 -0
  143. package/dist/src/x/types.d.ts +61 -0
  144. package/dist/src/x/types.js +1 -0
  145. package/dist/src/x402.d.ts +6 -0
  146. package/dist/src/x402.js +11 -0
  147. package/dist/src/yappr.d.ts +1 -0
  148. package/dist/src/yappr.js +85 -0
  149. package/package.json +52 -0
@@ -0,0 +1,61 @@
1
+ export type PublicMetrics = {
2
+ retweet_count?: number;
3
+ reply_count?: number;
4
+ like_count?: number;
5
+ quote_count?: number;
6
+ bookmark_count?: number;
7
+ };
8
+ export type Tweet = {
9
+ id: string;
10
+ text: string;
11
+ created_at: string;
12
+ author_id: string;
13
+ conversation_id: string;
14
+ in_reply_to_user_id?: string | null;
15
+ in_reply_to_screen_name?: string | null;
16
+ referenced_tweets?: {
17
+ type: string;
18
+ id: string;
19
+ }[];
20
+ entities?: {
21
+ mentions?: {
22
+ username: string;
23
+ }[];
24
+ media?: {
25
+ type?: string;
26
+ media_url_https?: string;
27
+ features?: {
28
+ all?: {
29
+ tags?: {
30
+ screen_name: string;
31
+ }[];
32
+ };
33
+ };
34
+ }[];
35
+ };
36
+ media_metadata?: {
37
+ media_key?: string;
38
+ media_url?: string;
39
+ }[];
40
+ public_metrics?: PublicMetrics;
41
+ author?: {
42
+ id: string;
43
+ username: string;
44
+ name: string;
45
+ description?: string;
46
+ public_metrics?: {
47
+ followers_count?: number;
48
+ following_count?: number;
49
+ tweet_count?: number;
50
+ listed_count?: number;
51
+ like_count?: number;
52
+ media_count?: number;
53
+ };
54
+ };
55
+ };
56
+ export type SearchResponse = {
57
+ data: Tweet[];
58
+ meta?: {
59
+ next_token?: string;
60
+ };
61
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export type Signer = {
2
+ address: `0x${string}`;
3
+ signTypedData: (args: unknown) => Promise<`0x${string}`>;
4
+ };
5
+ export declare function createBankrSigner(apiKey: string, address: `0x${string}`): Signer;
6
+ export declare function createPayFetch(signer: Signer, baseFetch?: typeof fetch): typeof fetch;
@@ -0,0 +1,11 @@
1
+ import { wrapFetchWithPayment, x402Client, x402HTTPClient } from "@x402/fetch";
2
+ import { registerExactEvmScheme } from "@x402/evm/exact/client";
3
+ import { bankrSignTypedData } from "./bankr.js";
4
+ export function createBankrSigner(apiKey, address) {
5
+ return { address, signTypedData: (args) => bankrSignTypedData(apiKey, args) };
6
+ }
7
+ export function createPayFetch(signer, baseFetch = fetch) {
8
+ const client = new x402Client();
9
+ registerExactEvmScheme(client, { signer });
10
+ return wrapFetchWithPayment(baseFetch, new x402HTTPClient(client));
11
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,85 @@
1
+ // Entry point. Wires everything together and starts the two long-running loops:
2
+ // the mention poller (reply pipeline) and the treasury cycle (self-funding). Boot
3
+ // order: validate config → load hooks/skills/prompts from config/ → init the Bankr
4
+ // wallet → start polling → run a startup treasury/claim cycle → schedule the rest.
5
+ import { log } from "./log.js";
6
+ import { config } from "./config.js";
7
+ import { envNumber } from "./util.js";
8
+ import { initBankr } from "./wallet.js";
9
+ import { loadPrompts } from "./llm/prompts.js";
10
+ import { setPrompts, loadModelPricing } from "./llm/index.js";
11
+ import { recordEarned } from "./stats.js";
12
+ import { createPoller } from "./reply/poller.js";
13
+ import { getTreasury } from "./treasury/index.js";
14
+ import { startTreasury, runTreasuryCycle } from "./treasury/cycle.js";
15
+ import { loadHooks } from "./hooks/loader.js";
16
+ import { loadSkills } from "./skills/loader.js";
17
+ import { initSkills } from "./skills/registry.js";
18
+ import { startCron } from "./cron/runner.js";
19
+ async function main() {
20
+ if (config.burnBps + config.devTokenBps > 10000) {
21
+ throw new Error(`BURN_BPS (${config.burnBps}) + DEV_TOKEN_BPS (${config.devTokenBps}) exceeds 10000`);
22
+ }
23
+ if (config.devWethBps > 10000) {
24
+ throw new Error(`DEV_WETH_BPS (${config.devWethBps}) exceeds 10000`);
25
+ }
26
+ await loadHooks();
27
+ log.info("initialising Bankr signer");
28
+ const address = await initBankr();
29
+ log.info({ address }, "Bankr wallet ready");
30
+ const skills = await loadSkills();
31
+ initSkills(skills);
32
+ log.info({ count: skills.length, names: skills.map((s) => s.name) }, "skills loaded");
33
+ const prompts = await loadPrompts(skills);
34
+ setPrompts(prompts);
35
+ log.info("prompts loaded");
36
+ // Warm the LLM pricing cache (USD per 1M tokens) so every completion can be costed
37
+ // from its token usage and recorded as inference spend.
38
+ await loadModelPricing();
39
+ const treasury = getTreasury();
40
+ const poller = createPoller(log);
41
+ await poller.start();
42
+ // First treasury/claim cycle runs a short delay after launch (not at t=0). Right at
43
+ // boot the wallet/Bankr fee indexer isn't always ready, so the claimable-fee check
44
+ // could report "no fees" before freshly-accrued fees became visible — then a later
45
+ // cycle would do the claim, making the boot log look wrong. The hourly scheduler below
46
+ // runs independently. (`runTreasuryCycle` self-catches, so this never crashes boot.)
47
+ const startupCycleDelayMs = envNumber("STARTUP_TREASURY_DELAY_MS", 10_000);
48
+ log.info({ delayMs: startupCycleDelayMs }, "scheduling startup treasury cycle");
49
+ const startupCycle = setTimeout(() => {
50
+ void runTreasuryCycle(treasury, log).catch((err) => log.error({ err }, "startup treasury cycle failed"));
51
+ }, startupCycleDelayMs);
52
+ const stopTreasury = startTreasury(treasury, log);
53
+ log.info("treasury scheduler started");
54
+ // Cron scheduler — replays stored prompts (config/skills/cron creates them)
55
+ // through the agent loop on their schedule. See src/cron/runner.ts.
56
+ const stopCron = startCron(log);
57
+ // Poll all-time earnings (creator fees, WETH) from Bankr and record into the
58
+ // ledger. A cheap read-only call; default cadence one minute.
59
+ const pollEarnings = async () => {
60
+ try {
61
+ recordEarned(await treasury.lifetimeEarned());
62
+ }
63
+ catch (err) {
64
+ log.warn({ err }, "earnings poll failed");
65
+ }
66
+ };
67
+ await pollEarnings();
68
+ const earningsTimer = setInterval(() => void pollEarnings(), envNumber("EARNINGS_POLL_INTERVAL_MS", 60_000));
69
+ log.info("yappr is running");
70
+ for (const sig of ["SIGINT", "SIGTERM"]) {
71
+ process.once(sig, () => {
72
+ log.info({ sig }, "shutting down");
73
+ poller.stop();
74
+ stopTreasury();
75
+ stopCron();
76
+ clearTimeout(startupCycle);
77
+ clearInterval(earningsTimer);
78
+ process.exit(0);
79
+ });
80
+ }
81
+ }
82
+ main().catch((err) => {
83
+ log.error(err, "fatal startup error");
84
+ process.exit(1);
85
+ });
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "yappr",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "pre-publish",
6
+ "main": "./dist/src/index.js",
7
+ "types": "./dist/src/index.d.ts",
8
+ "bin": {
9
+ "yappr": "dist/src/cli/index.js"
10
+ },
11
+ "engines": {
12
+ "node": ">=20"
13
+ },
14
+ "exports": {
15
+ ".": {
16
+ "development": "./src/index.ts",
17
+ "types": "./dist/src/index.d.ts",
18
+ "default": "./dist/src/index.js"
19
+ }
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "git+https://github.com/etherlect/yappr.git"
24
+ },
25
+ "homepage": "https://github.com/etherlect/yappr#readme",
26
+ "bugs": "https://github.com/etherlect/yappr/issues",
27
+ "dependencies": {
28
+ "@inquirer/prompts": "^8.5.2",
29
+ "@types/better-sqlite3": "^7.6.13",
30
+ "@x402/evm": "^2.13.0",
31
+ "@x402/fetch": "^2.13.0",
32
+ "asciichart": "^1.5.25",
33
+ "better-sqlite3": "^12.10.0",
34
+ "cli-truncate": "^6.0.0",
35
+ "dotenv": "^16.4.5",
36
+ "jiti": "^2.7.0",
37
+ "node-ssh": "^13.0.0",
38
+ "ora": "^9.4.0",
39
+ "pino": "^10.3.1",
40
+ "pino-pretty": "^11.3.0",
41
+ "playwright-core": "^1.60.0",
42
+ "string-width": "^8.2.1",
43
+ "viem": "^2.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@bankr/cli": "^0.3.1",
47
+ "@types/asciichart": "^1.5.8",
48
+ "@types/node": "^22.0.0",
49
+ "tsx": "^4.19.0",
50
+ "typescript": "^5.6.0"
51
+ }
52
+ }