sorokeep 1.0.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.
- package/CONTRIBUTING.md +296 -0
- package/LICENSE +21 -0
- package/README.md +677 -0
- package/dist/alerts/alerts.d.ts +21 -0
- package/dist/alerts/alerts.d.ts.map +1 -0
- package/dist/alerts/alerts.js +18 -0
- package/dist/alerts/alerts.js.map +1 -0
- package/dist/alerts/discord.d.ts +3 -0
- package/dist/alerts/discord.d.ts.map +1 -0
- package/dist/alerts/discord.js +199 -0
- package/dist/alerts/discord.js.map +1 -0
- package/dist/alerts/dispatcher.d.ts +13 -0
- package/dist/alerts/dispatcher.d.ts.map +1 -0
- package/dist/alerts/dispatcher.js +91 -0
- package/dist/alerts/dispatcher.js.map +1 -0
- package/dist/alerts/keys.d.ts +24 -0
- package/dist/alerts/keys.d.ts.map +1 -0
- package/dist/alerts/keys.js +44 -0
- package/dist/alerts/keys.js.map +1 -0
- package/dist/alerts/pagerduty.d.ts +8 -0
- package/dist/alerts/pagerduty.d.ts.map +1 -0
- package/dist/alerts/pagerduty.js +164 -0
- package/dist/alerts/pagerduty.js.map +1 -0
- package/dist/alerts/resource.d.ts +23 -0
- package/dist/alerts/resource.d.ts.map +1 -0
- package/dist/alerts/resource.js +167 -0
- package/dist/alerts/resource.js.map +1 -0
- package/dist/alerts/slack.d.ts +7 -0
- package/dist/alerts/slack.d.ts.map +1 -0
- package/dist/alerts/slack.js +184 -0
- package/dist/alerts/slack.js.map +1 -0
- package/dist/alerts/telegram.d.ts +9 -0
- package/dist/alerts/telegram.d.ts.map +1 -0
- package/dist/alerts/telegram.js +133 -0
- package/dist/alerts/telegram.js.map +1 -0
- package/dist/alerts/templates.d.ts +109 -0
- package/dist/alerts/templates.d.ts.map +1 -0
- package/dist/alerts/templates.js +139 -0
- package/dist/alerts/templates.js.map +1 -0
- package/dist/alerts/types.d.ts +113 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +87 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/alerts/webhook.d.ts +13 -0
- package/dist/alerts/webhook.d.ts.map +1 -0
- package/dist/alerts/webhook.js +56 -0
- package/dist/alerts/webhook.js.map +1 -0
- package/dist/cli/schemaFormatter.d.ts +11 -0
- package/dist/cli/schemaFormatter.d.ts.map +1 -0
- package/dist/cli/schemaFormatter.js +74 -0
- package/dist/cli/schemaFormatter.js.map +1 -0
- package/dist/commands/alerts.d.ts +3 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +256 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/budget.d.ts +3 -0
- package/dist/commands/budget.d.ts.map +1 -0
- package/dist/commands/budget.js +47 -0
- package/dist/commands/budget.js.map +1 -0
- package/dist/commands/channels.d.ts +3 -0
- package/dist/commands/channels.d.ts.map +1 -0
- package/dist/commands/channels.js +84 -0
- package/dist/commands/channels.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +58 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +36 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/costs.d.ts +15 -0
- package/dist/commands/costs.d.ts.map +1 -0
- package/dist/commands/costs.js +280 -0
- package/dist/commands/costs.js.map +1 -0
- package/dist/commands/daemon.d.ts +3 -0
- package/dist/commands/daemon.d.ts.map +1 -0
- package/dist/commands/daemon.js +93 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/db.d.ts +3 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +140 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/guard.d.ts +3 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +181 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/history.d.ts +3 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +57 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/inspect.d.ts +3 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +82 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +20 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/pause.d.ts +3 -0
- package/dist/commands/pause.d.ts.map +1 -0
- package/dist/commands/pause.js +32 -0
- package/dist/commands/pause.js.map +1 -0
- package/dist/commands/resources.d.ts +3 -0
- package/dist/commands/resources.d.ts.map +1 -0
- package/dist/commands/resources.js +95 -0
- package/dist/commands/resources.js.map +1 -0
- package/dist/commands/restore.d.ts +3 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +92 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/resume.d.ts +3 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +31 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +63 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +163 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/core/aws_secrets.d.ts +13 -0
- package/dist/core/aws_secrets.d.ts.map +1 -0
- package/dist/core/aws_secrets.js +34 -0
- package/dist/core/aws_secrets.js.map +1 -0
- package/dist/core/budget.d.ts +10 -0
- package/dist/core/budget.d.ts.map +1 -0
- package/dist/core/budget.js +31 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/channels.d.ts +67 -0
- package/dist/core/channels.d.ts.map +1 -0
- package/dist/core/channels.js +136 -0
- package/dist/core/channels.js.map +1 -0
- package/dist/core/check.d.ts +25 -0
- package/dist/core/check.d.ts.map +1 -0
- package/dist/core/check.js +85 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/completion.d.ts +9 -0
- package/dist/core/completion.d.ts.map +1 -0
- package/dist/core/completion.js +68 -0
- package/dist/core/completion.js.map +1 -0
- package/dist/core/costs.d.ts +90 -0
- package/dist/core/costs.d.ts.map +1 -0
- package/dist/core/costs.js +147 -0
- package/dist/core/costs.js.map +1 -0
- package/dist/core/decoder.d.ts +7 -0
- package/dist/core/decoder.d.ts.map +1 -0
- package/dist/core/decoder.js +38 -0
- package/dist/core/decoder.js.map +1 -0
- package/dist/core/discovery.d.ts +38 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +208 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/extension.d.ts +83 -0
- package/dist/core/extension.d.ts.map +1 -0
- package/dist/core/extension.js +429 -0
- package/dist/core/extension.js.map +1 -0
- package/dist/core/inspect.d.ts +62 -0
- package/dist/core/inspect.d.ts.map +1 -0
- package/dist/core/inspect.js +303 -0
- package/dist/core/inspect.js.map +1 -0
- package/dist/core/introspection.d.ts +8 -0
- package/dist/core/introspection.d.ts.map +1 -0
- package/dist/core/introspection.js +8 -0
- package/dist/core/introspection.js.map +1 -0
- package/dist/core/monitor.d.ts +42 -0
- package/dist/core/monitor.d.ts.map +1 -0
- package/dist/core/monitor.js +188 -0
- package/dist/core/monitor.js.map +1 -0
- package/dist/core/rent_projection.d.ts +153 -0
- package/dist/core/rent_projection.d.ts.map +1 -0
- package/dist/core/rent_projection.js +146 -0
- package/dist/core/rent_projection.js.map +1 -0
- package/dist/core/scvalTranslator.d.ts +11 -0
- package/dist/core/scvalTranslator.d.ts.map +1 -0
- package/dist/core/scvalTranslator.js +36 -0
- package/dist/core/scvalTranslator.js.map +1 -0
- package/dist/core/state_diff.d.ts +45 -0
- package/dist/core/state_diff.d.ts.map +1 -0
- package/dist/core/state_diff.js +112 -0
- package/dist/core/state_diff.js.map +1 -0
- package/dist/core/status.d.ts +24 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +57 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/vault.d.ts +37 -0
- package/dist/core/vault.d.ts.map +1 -0
- package/dist/core/vault.js +179 -0
- package/dist/core/vault.js.map +1 -0
- package/dist/core/watch.d.ts +36 -0
- package/dist/core/watch.d.ts.map +1 -0
- package/dist/core/watch.js +176 -0
- package/dist/core/watch.js.map +1 -0
- package/dist/daemon/loop.d.ts +38 -0
- package/dist/daemon/loop.d.ts.map +1 -0
- package/dist/daemon/loop.js +169 -0
- package/dist/daemon/loop.js.map +1 -0
- package/dist/db/backup.d.ts +12 -0
- package/dist/db/backup.d.ts.map +1 -0
- package/dist/db/backup.js +132 -0
- package/dist/db/backup.js.map +1 -0
- package/dist/db/budget.d.ts +17 -0
- package/dist/db/budget.d.ts.map +1 -0
- package/dist/db/budget.js +31 -0
- package/dist/db/budget.js.map +1 -0
- package/dist/db/database.d.ts +6 -0
- package/dist/db/database.d.ts.map +1 -0
- package/dist/db/database.js +134 -0
- package/dist/db/database.js.map +1 -0
- package/dist/db/migrations/.gitkeep +1 -0
- package/dist/db/migrations/001_resource_usage_logs.sql +28 -0
- package/dist/db/migrator.d.ts +28 -0
- package/dist/db/migrator.d.ts.map +1 -0
- package/dist/db/migrator.js +75 -0
- package/dist/db/migrator.js.map +1 -0
- package/dist/db/repositories.d.ts +474 -0
- package/dist/db/repositories.d.ts.map +1 -0
- package/dist/db/repositories.js +809 -0
- package/dist/db/repositories.js.map +1 -0
- package/dist/db/schema.sql +207 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +20 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +16 -0
- package/dist/lib.js.map +1 -0
- package/dist/logging/index.d.ts +22 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +34 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +14 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +135 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/types.d.ts +10 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +2 -0
- package/dist/logging/types.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +14 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +51 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-extension-costs.d.ts +4 -0
- package/dist/mcp/tools/get-extension-costs.d.ts.map +1 -0
- package/dist/mcp/tools/get-extension-costs.js +33 -0
- package/dist/mcp/tools/get-extension-costs.js.map +1 -0
- package/dist/mcp/tools/get_contract_status.d.ts +8 -0
- package/dist/mcp/tools/get_contract_status.d.ts.map +1 -0
- package/dist/mcp/tools/get_contract_status.js +33 -0
- package/dist/mcp/tools/get_contract_status.js.map +1 -0
- package/dist/rpc/client.d.ts +154 -0
- package/dist/rpc/client.d.ts.map +1 -0
- package/dist/rpc/client.js +766 -0
- package/dist/rpc/client.js.map +1 -0
- package/dist/utils/config.d.ts +51 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +86 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/formatting.d.ts +10 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +66 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/watch-config.d.ts +13 -0
- package/dist/utils/watch-config.d.ts.map +1 -0
- package/dist/utils/watch-config.js +32 -0
- package/dist/utils/watch-config.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { getDatabase } from "../db/database.js";
|
|
4
|
+
import { getContract, getEntriesForContract } from "../db/repositories.js";
|
|
5
|
+
import { restoreEntries } from "../core/extension.js";
|
|
6
|
+
import { formatContractID } from "../utils/formatting.js";
|
|
7
|
+
import { getLogger } from "../logging/index.js";
|
|
8
|
+
const logger = getLogger().child({ component: "RestoreCommand" });
|
|
9
|
+
export function registerRestoreCommand(program) {
|
|
10
|
+
program
|
|
11
|
+
.command("restore <contractId>")
|
|
12
|
+
.description("Restore archived entries for a contract")
|
|
13
|
+
.option("--keypair <secret>", "Stellar secret key for signing restore transactions")
|
|
14
|
+
.option("--keypair-env <var>", "Environment variable containing the secret key")
|
|
15
|
+
.option("--entry <keyXdr>", "Specific entry key XDR to restore (can be used multiple times)", collect, [])
|
|
16
|
+
.option("--all", "Restore all tracked entries for the contract")
|
|
17
|
+
.action(async (contractId, options) => {
|
|
18
|
+
try {
|
|
19
|
+
const db = getDatabase();
|
|
20
|
+
const contract = getContract(db, contractId);
|
|
21
|
+
if (!contract) {
|
|
22
|
+
console.error(chalk.red(`Contract ${formatContractID(contractId)} not found. Run 'sorokeep watch' first.`));
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
let secretKey;
|
|
26
|
+
if (options.keypairEnv) {
|
|
27
|
+
secretKey = process.env[options.keypairEnv];
|
|
28
|
+
if (!secretKey) {
|
|
29
|
+
console.error(chalk.red(`Environment variable ${options.keypairEnv} is not set`));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if (options.keypair) {
|
|
34
|
+
secretKey = options.keypair;
|
|
35
|
+
}
|
|
36
|
+
if (!secretKey) {
|
|
37
|
+
console.error(chalk.red("--keypair or --keypair-env is required for restoration"));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
let entryKeys;
|
|
41
|
+
if (options.all && options.entry && options.entry.length > 0) {
|
|
42
|
+
console.error(chalk.red("Use either --entry <keyXdr> or --all, not both"));
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
if (options.entry && options.entry.length > 0) {
|
|
46
|
+
entryKeys = options.entry;
|
|
47
|
+
}
|
|
48
|
+
else if (options.all) {
|
|
49
|
+
const entries = getEntriesForContract(db, contractId);
|
|
50
|
+
entryKeys = entries.map(e => e.entry_key_xdr);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.error(chalk.red("Specify --entry <keyXdr> or --all to select entries to restore"));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
if (entryKeys.length === 0) {
|
|
57
|
+
console.log(chalk.yellow("No entries to restore"));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const displayName = contract.name ?? formatContractID(contractId);
|
|
61
|
+
const spinner = ora(`Restoring ${entryKeys.length} entries for ${displayName}...`).start();
|
|
62
|
+
const result = await restoreEntries(db, contractId, entryKeys, secretKey);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
spinner.succeed(chalk.green(`Restored ${result.entriesRestored} entries for ${displayName}`));
|
|
65
|
+
console.log(` Tx hash: ${result.txHash}`);
|
|
66
|
+
console.log(` Ledger: ${result.ledger}`);
|
|
67
|
+
if (result.feeCharged !== undefined) {
|
|
68
|
+
const feeXlm = (result.feeCharged / 10_000_000).toFixed(7);
|
|
69
|
+
console.log(` Fee spent: ${feeXlm} XLM (${result.feeCharged} stroops)`);
|
|
70
|
+
}
|
|
71
|
+
console.log(chalk.dim(`\n Run 'sorokeep status ${formatContractID(contractId)}' to verify.`));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
spinner.fail(chalk.red(`Restore failed: ${result.error}`));
|
|
75
|
+
if (result.txHash) {
|
|
76
|
+
console.log(` Tx hash: ${result.txHash}`);
|
|
77
|
+
}
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
83
|
+
logger.error("Restore command failed", { error: msg });
|
|
84
|
+
console.error(chalk.red(`Error: ${msg}`));
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function collect(value, previous) {
|
|
90
|
+
return previous.concat([value]);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/commands/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,qBAAqB,GAAI,SAAS,OAAO,KAAG,IAwBxD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { getDatabase } from "../db/database.js";
|
|
3
|
+
import { getContract, setContractActiveStatus } from "../db/repositories.js";
|
|
4
|
+
import { formatContractID } from "../utils/formatting.js";
|
|
5
|
+
import { getLogger } from "../logging/index.js";
|
|
6
|
+
const logger = getLogger().child({ component: "ResumeCommand" });
|
|
7
|
+
export const registerResumeCommand = (program) => {
|
|
8
|
+
program
|
|
9
|
+
.command("resume <contract-id>")
|
|
10
|
+
.description("Resume daemon polling and alerting for a paused contract")
|
|
11
|
+
.action(async (contractId) => {
|
|
12
|
+
try {
|
|
13
|
+
const db = getDatabase();
|
|
14
|
+
const contract = getContract(db, contractId);
|
|
15
|
+
if (!contract) {
|
|
16
|
+
console.log(chalk.red(`Contract ${formatContractID(contractId)} is not being watched.`));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
setContractActiveStatus(db, contractId, true);
|
|
21
|
+
console.log(chalk.green(`Successfully resumed monitoring for ${formatContractID(contractId)}.`));
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
25
|
+
logger.error("Resume command failed", { error: errorMessage });
|
|
26
|
+
console.log(chalk.red(`Failed to resume contract: ${errorMessage}`));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;AAEjE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IAC5D,OAAO;SACF,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,EAAE;QACjC,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAE7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,gBAAgB,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACX,CAAC;YAED,uBAAuB,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uCAAuC,gBAAgB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACrG,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmE5D"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { getDatabase } from "../db/database.js";
|
|
3
|
+
import { getContractStatus, ContractNotFoundError } from "../core/status.js";
|
|
4
|
+
import { statusIndicator, formatContractID, } from "../utils/formatting.js";
|
|
5
|
+
export function registerStatusCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("status <contractId>")
|
|
8
|
+
.description("Show TTL and storage health for a watched contract")
|
|
9
|
+
.option("--json", "Output machine-readable JSON")
|
|
10
|
+
.action((contractId, options = {}) => {
|
|
11
|
+
const db = getDatabase();
|
|
12
|
+
try {
|
|
13
|
+
const status = getContractStatus(db, contractId);
|
|
14
|
+
if (options.json) {
|
|
15
|
+
console.log(JSON.stringify(status, null, 2));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const displayName = status.name ?? formatContractID(contractId);
|
|
19
|
+
console.log();
|
|
20
|
+
console.log(chalk.bold(` ${displayName}`) + chalk.dim(` (${formatContractID(contractId)})`));
|
|
21
|
+
console.log(` Network: ${chalk.cyan(status.network)}`);
|
|
22
|
+
if (status.lastCheckedLedger != null) {
|
|
23
|
+
console.log(chalk.dim(` Last checked: ledger ${status.lastCheckedLedger.toLocaleString()}`));
|
|
24
|
+
}
|
|
25
|
+
console.log();
|
|
26
|
+
if (status.entries.length === 0) {
|
|
27
|
+
console.log(chalk.yellow(" No entries tracked for this contract."));
|
|
28
|
+
console.log();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const maxLabelLen = Math.max(...status.entries.map((entry) => entry.label.length));
|
|
32
|
+
for (const entry of status.entries) {
|
|
33
|
+
const paddedLabel = entry.label.padEnd(maxLabelLen);
|
|
34
|
+
if (entry.status === "unknown") {
|
|
35
|
+
console.log(` ${paddedLabel} TTL: ${chalk.dim("unknown")}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
console.log(` ${paddedLabel} TTL: ${entry.remainingTTL.toLocaleString().padStart(9)} ledgers (${entry.approximateTimeRemaining}) ${statusIndicator(entry.status)}`);
|
|
39
|
+
}
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof ContractNotFoundError || (error instanceof Error && error.name === "ContractNotFoundError")) {
|
|
44
|
+
if (options.json) {
|
|
45
|
+
console.log(JSON.stringify({
|
|
46
|
+
success: false,
|
|
47
|
+
error: "contract_not_found",
|
|
48
|
+
contractId,
|
|
49
|
+
message: `Contract ${formatContractID(contractId)} is not registered.`,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(chalk.red(`Contract ${formatContractID(contractId)} is not registered.`));
|
|
54
|
+
console.log(chalk.dim("Run 'sorokeep watch <contractId>' first."));
|
|
55
|
+
}
|
|
56
|
+
process.exit(1);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IAqMvD,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import readline from "node:readline";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { getDatabase } from "../db/database.js";
|
|
5
|
+
import { deleteContract, getContract } from "../db/repositories.js";
|
|
6
|
+
import { getLogger } from "../logging/index.js";
|
|
7
|
+
import { classifyTTL, formatContractID, formatTimeToCloseLedger, statusIndicator, } from "../utils/formatting.js";
|
|
8
|
+
import { watchContract } from "../core/watch.js";
|
|
9
|
+
import { loadWatchContractsFile } from "../utils/watch-config.js";
|
|
10
|
+
const logger = getLogger().child({ component: "WatchCommand" });
|
|
11
|
+
export const registerWatchCommand = (program) => {
|
|
12
|
+
program
|
|
13
|
+
.command("watch [contract-id]")
|
|
14
|
+
.description("Register and start watching a contract")
|
|
15
|
+
.option("-n, --name <name>", "A human-readable name for the contract")
|
|
16
|
+
.option("--network <network>", "The stellar network to use (testnet, mainnet)", "testnet")
|
|
17
|
+
.option("-r, --rpc-url <url>", "Custom RPC URL")
|
|
18
|
+
.option("--storage-keys <keys>", "Comma-separated base64 XDR storage keys to watch")
|
|
19
|
+
.option("--no-introspection", "Skip automatic contract introspection (WASM code fetching)")
|
|
20
|
+
.option("--from-file <path>", "Load multiple contract registrations from a YAML or JSON file")
|
|
21
|
+
.action(async (contractId, options) => {
|
|
22
|
+
try {
|
|
23
|
+
const db = getDatabase();
|
|
24
|
+
if (options.fromFile) {
|
|
25
|
+
const configs = loadWatchContractsFile(options.fromFile);
|
|
26
|
+
const results = [];
|
|
27
|
+
for (const config of configs) {
|
|
28
|
+
const watchResult = await watchContract(db, {
|
|
29
|
+
contractId: config.contractId,
|
|
30
|
+
network: config.network,
|
|
31
|
+
name: config.name,
|
|
32
|
+
rpcUrl: config.rpcUrl,
|
|
33
|
+
storageKeys: config.storageKeys,
|
|
34
|
+
noIntrospection: config.noIntrospection,
|
|
35
|
+
});
|
|
36
|
+
results.push({
|
|
37
|
+
contractId: config.contractId,
|
|
38
|
+
name: config.name,
|
|
39
|
+
network: config.network,
|
|
40
|
+
status: watchResult.success ? "SUCCESS" : "FAILED",
|
|
41
|
+
message: watchResult.success
|
|
42
|
+
? `Registered ${config.name ?? formatContractID(config.contractId)}`
|
|
43
|
+
: watchResult.error,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
printBatchSummary(results);
|
|
47
|
+
if (results.some((result) => result.status === "FAILED")) {
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!contractId) {
|
|
53
|
+
console.log(chalk.red("A contract ID is required unless --from-file is provided."));
|
|
54
|
+
process.exit(1);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const displayId = formatContractID(contractId);
|
|
58
|
+
const spinner = ora(`Registering contract ${formatContractID(contractId)} and discovering entries...`).start();
|
|
59
|
+
const watchResult = await watchContract(db, {
|
|
60
|
+
contractId,
|
|
61
|
+
network: options.network,
|
|
62
|
+
name: options.name,
|
|
63
|
+
rpcUrl: options.rpcUrl,
|
|
64
|
+
storageKeys: options.storageKeys,
|
|
65
|
+
noIntrospection: options.noIntrospection,
|
|
66
|
+
});
|
|
67
|
+
if (!watchResult.success) {
|
|
68
|
+
spinner.fail(chalk.red(watchResult.error));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
spinner.succeed(chalk.green(`Contract ${options.name || displayId} registered successfully.`));
|
|
73
|
+
const entryCount = 1 +
|
|
74
|
+
(watchResult.wasm ? 1 : 0) +
|
|
75
|
+
(options.storageKeys ? options.storageKeys.split(",").length : 0);
|
|
76
|
+
console.log(`\n Contract: ${chalk.cyan(options.name ?? displayId)} (${chalk.dim(displayId)})`);
|
|
77
|
+
console.log(` Network: ${chalk.cyan(options.network)}`);
|
|
78
|
+
console.log(` Entries: ${chalk.cyan(entryCount)} discovered`);
|
|
79
|
+
const instanceTTL = watchResult.instance.remainingTTL;
|
|
80
|
+
const instanceStatus = classifyTTL(instanceTTL);
|
|
81
|
+
console.log(` Instance TTL: ${instanceTTL.toLocaleString()} ledgers (${formatTimeToCloseLedger(instanceTTL)}) ${statusIndicator(instanceStatus)}`);
|
|
82
|
+
if (watchResult.wasm) {
|
|
83
|
+
const wasmTTL = watchResult.wasm.remainingTTL;
|
|
84
|
+
const wasmStatus = classifyTTL(wasmTTL);
|
|
85
|
+
console.log(` WASM Code TTL: ${wasmTTL.toLocaleString()} ledgers (${formatTimeToCloseLedger(wasmTTL)}) ${statusIndicator(wasmStatus)}`);
|
|
86
|
+
}
|
|
87
|
+
if (watchResult.wasmWarning) {
|
|
88
|
+
console.warn(chalk.yellow(`\n ⚠ ${watchResult.wasmWarning}`));
|
|
89
|
+
}
|
|
90
|
+
console.log(chalk.dim("\n Run 'sorokeep status " +
|
|
91
|
+
formatContractID(contractId) +
|
|
92
|
+
"' to check TTLs anytime."));
|
|
93
|
+
console.log(chalk.dim(" Run 'sorokeep guard " +
|
|
94
|
+
formatContractID(contractId) +
|
|
95
|
+
"' to enable auto-extension."));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
99
|
+
logger.error("Watch command failed", { error: errorMessage });
|
|
100
|
+
console.log(chalk.red(`Failed to watch contract: ${errorMessage}`));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
program
|
|
105
|
+
.command("unwatch <contract-id>")
|
|
106
|
+
.description("Remove a registered contract and clean up associated logs")
|
|
107
|
+
.option("-y, --yes", "Skip confirmation prompt")
|
|
108
|
+
.action(async (contractId, options) => {
|
|
109
|
+
try {
|
|
110
|
+
const db = getDatabase();
|
|
111
|
+
const contract = getContract(db, contractId);
|
|
112
|
+
if (!contract) {
|
|
113
|
+
console.log(chalk.red(`Contract ${formatContractID(contractId)} is not being watched.`));
|
|
114
|
+
process.exit(1);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const proceedWithDeletion = async () => {
|
|
118
|
+
deleteContract(db, contractId);
|
|
119
|
+
console.log(chalk.green(`Successfully unwatched contract ${formatContractID(contractId)}.`));
|
|
120
|
+
};
|
|
121
|
+
if (options.yes) {
|
|
122
|
+
await proceedWithDeletion();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const rl = readline.createInterface({
|
|
126
|
+
input: process.stdin,
|
|
127
|
+
output: process.stdout,
|
|
128
|
+
});
|
|
129
|
+
rl.question(chalk.yellow(`Are you sure you want to unwatch ${formatContractID(contractId)}? All associated logs, alerts, and policies will be permanently deleted. (y/N): `), async (answer) => {
|
|
130
|
+
rl.close();
|
|
131
|
+
if (answer.toLowerCase() === "y" || answer.toLowerCase() === "yes") {
|
|
132
|
+
await proceedWithDeletion();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
console.log("Unwatch cancelled.");
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
142
|
+
logger.error("Unwatch command failed", { error: errorMessage });
|
|
143
|
+
console.log(chalk.red(`Failed to unwatch contract: ${errorMessage}`));
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
function printBatchSummary(results) {
|
|
149
|
+
const rows = results.map((result) => {
|
|
150
|
+
const label = result.name ?? formatContractID(result.contractId);
|
|
151
|
+
return `${result.status.padEnd(7)} | ${label.padEnd(18)} | ${result.network.padEnd(8)} | ${result.message}`;
|
|
152
|
+
});
|
|
153
|
+
const successCount = results.filter((result) => result.status === "SUCCESS").length;
|
|
154
|
+
const failureCount = results.length - successCount;
|
|
155
|
+
console.log("\nBatch registration summary");
|
|
156
|
+
console.log("STATUS | CONTRACT | NETWORK | MESSAGE");
|
|
157
|
+
console.log("--------|--------------------|----------|--------");
|
|
158
|
+
for (const row of rows) {
|
|
159
|
+
console.log(row);
|
|
160
|
+
}
|
|
161
|
+
console.log(`\n${successCount} succeeded, ${failureCount} failed`);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=watch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface AWSSecretsResolverConfig {
|
|
2
|
+
region?: string;
|
|
3
|
+
profile?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class AWSSecretsResolver {
|
|
6
|
+
private region;
|
|
7
|
+
private profile?;
|
|
8
|
+
private clientPromise?;
|
|
9
|
+
constructor(config?: AWSSecretsResolverConfig);
|
|
10
|
+
private getClient;
|
|
11
|
+
resolveKey(secretId: string): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=aws_secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws_secrets.d.ts","sourceRoot":"","sources":["../../src/core/aws_secrets.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,aAAa,CAAC,CAAe;gBAEzB,MAAM,GAAE,wBAA6B;YAKnC,SAAS;IAiBV,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAa7D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export class AWSSecretsResolver {
|
|
2
|
+
region;
|
|
3
|
+
profile;
|
|
4
|
+
clientPromise;
|
|
5
|
+
constructor(config = {}) {
|
|
6
|
+
this.region = config.region || "us-east-1";
|
|
7
|
+
this.profile = config.profile;
|
|
8
|
+
}
|
|
9
|
+
async getClient() {
|
|
10
|
+
if (!this.clientPromise) {
|
|
11
|
+
this.clientPromise = (async () => {
|
|
12
|
+
const { SecretsManagerClient } = await import("@aws-sdk/client-secrets-manager");
|
|
13
|
+
const clientConfig = { region: this.region };
|
|
14
|
+
if (this.profile) {
|
|
15
|
+
const { fromIni } = await import("@aws-sdk/credential-providers");
|
|
16
|
+
clientConfig.credentials = fromIni({ profile: this.profile });
|
|
17
|
+
}
|
|
18
|
+
return new SecretsManagerClient(clientConfig);
|
|
19
|
+
})();
|
|
20
|
+
}
|
|
21
|
+
return this.clientPromise;
|
|
22
|
+
}
|
|
23
|
+
async resolveKey(secretId) {
|
|
24
|
+
const client = await this.getClient();
|
|
25
|
+
const { GetSecretValueCommand } = await import("@aws-sdk/client-secrets-manager");
|
|
26
|
+
const command = new GetSecretValueCommand({ SecretId: secretId });
|
|
27
|
+
const response = await client.send(command);
|
|
28
|
+
if (!response.SecretString) {
|
|
29
|
+
throw new Error(`SecretString is empty for secret: ${secretId}`);
|
|
30
|
+
}
|
|
31
|
+
return response.SecretString;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=aws_secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws_secrets.js","sourceRoot":"","sources":["../../src/core/aws_secrets.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,kBAAkB;IACnB,MAAM,CAAS;IACf,OAAO,CAAU;IACjB,aAAa,CAAgB;IAErC,YAAY,SAAmC,EAAE;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC7B,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;gBAEjF,MAAM,YAAY,GAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;oBAClE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClE,CAAC;gBAED,OAAO,IAAI,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC,CAAC,EAAE,CAAC;QACT,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,QAAgB;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAElF,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,QAAQ,CAAC,YAAY,CAAC;IACjC,CAAC;CACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
export interface SpendProgress {
|
|
3
|
+
limit: number;
|
|
4
|
+
spend: number;
|
|
5
|
+
percentage: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function setContractBudget(db: Database.Database, contractId: string, limit: number): void;
|
|
8
|
+
export declare function getContractBudget(db: Database.Database, contractId: string): number | null;
|
|
9
|
+
export declare function getMonthlySpendProgress(db: Database.Database, contractId: string): SpendProgress | null;
|
|
10
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/core/budget.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQhG;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1F;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAcvG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getContractCostSummary } from "../db/repositories.js";
|
|
2
|
+
export function setContractBudget(db, contractId, limit) {
|
|
3
|
+
db.prepare(`
|
|
4
|
+
INSERT INTO contract_budgets (contract_id, monthly_limit_xlm, updated_at)
|
|
5
|
+
VALUES (?, ?, CURRENT_TIMESTAMP)
|
|
6
|
+
ON CONFLICT(contract_id) DO UPDATE SET
|
|
7
|
+
monthly_limit_xlm = excluded.monthly_limit_xlm,
|
|
8
|
+
updated_at = CURRENT_TIMESTAMP
|
|
9
|
+
`).run(contractId, limit);
|
|
10
|
+
}
|
|
11
|
+
export function getContractBudget(db, contractId) {
|
|
12
|
+
const row = db.prepare(`
|
|
13
|
+
SELECT monthly_limit_xlm FROM contract_budgets WHERE contract_id = ?
|
|
14
|
+
`).get(contractId);
|
|
15
|
+
return row ? row.monthly_limit_xlm : null;
|
|
16
|
+
}
|
|
17
|
+
export function getMonthlySpendProgress(db, contractId) {
|
|
18
|
+
const limit = getContractBudget(db, contractId);
|
|
19
|
+
if (limit === null)
|
|
20
|
+
return null;
|
|
21
|
+
// Use past 30 days as a proxy for monthly spend
|
|
22
|
+
const summary = getContractCostSummary(db, contractId, 30);
|
|
23
|
+
const spend = summary.total_cost_xlm;
|
|
24
|
+
const percentage = limit > 0 ? (spend / limit) * 100 : 0;
|
|
25
|
+
return {
|
|
26
|
+
limit,
|
|
27
|
+
spend,
|
|
28
|
+
percentage
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/core/budget.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQ/D,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,UAAkB,EAAE,KAAa;IACtF,EAAE,CAAC,OAAO,CAAC;;;;;;KAMV,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,UAAkB;IACvE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC;;KAEtB,CAAC,CAAC,GAAG,CAAC,UAAU,CAA8C,CAAC;IAEhE,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,EAAqB,EAAE,UAAkB;IAC7E,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAEhC,gDAAgD;IAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,OAAO;QACH,KAAK;QACL,KAAK;QACL,UAAU;KACb,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import { type ChannelAccount } from "../db/repositories.js";
|
|
3
|
+
export interface ChannelSlot {
|
|
4
|
+
publicKey: string;
|
|
5
|
+
keypairSource: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface ChannelBalance {
|
|
8
|
+
publicKey: string;
|
|
9
|
+
balanceXlm: number | null;
|
|
10
|
+
balanceCheckedAt: string | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pool of channel accounts for concurrent TTL extensions.
|
|
14
|
+
*
|
|
15
|
+
* Each account tracks its own sequence number on Stellar, so concurrent
|
|
16
|
+
* transactions submitted through different accounts avoid sequence conflicts.
|
|
17
|
+
* acquire() hands out a slot in round-robin order, blocking callers until
|
|
18
|
+
* a slot is free. release() returns the slot and unblocks the next waiter.
|
|
19
|
+
*/
|
|
20
|
+
export declare class ChannelAccountPool {
|
|
21
|
+
private readonly db;
|
|
22
|
+
private readonly network;
|
|
23
|
+
private readonly accounts;
|
|
24
|
+
/** Tracks which publicKeys are currently in use. */
|
|
25
|
+
private readonly inUse;
|
|
26
|
+
/** Queue of resolve callbacks waiting for the next free slot. */
|
|
27
|
+
private readonly waiters;
|
|
28
|
+
/** Round-robin cursor. */
|
|
29
|
+
private cursor;
|
|
30
|
+
constructor(db: Database.Database, network: string);
|
|
31
|
+
/** Number of registered channel accounts. */
|
|
32
|
+
size(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Acquire an available channel account slot.
|
|
35
|
+
* If all slots are in use, waits until one is released.
|
|
36
|
+
*/
|
|
37
|
+
acquire(): Promise<ChannelSlot>;
|
|
38
|
+
/**
|
|
39
|
+
* Release a slot back to the pool.
|
|
40
|
+
* Unblocks the oldest waiting acquire() call if any.
|
|
41
|
+
*/
|
|
42
|
+
release(publicKey: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Returns current balance information for all accounts in the pool.
|
|
45
|
+
* Reads from the DB — does not call the RPC.
|
|
46
|
+
*/
|
|
47
|
+
getBalances(): ChannelBalance[];
|
|
48
|
+
/**
|
|
49
|
+
* Fetch native XLM balances for all accounts from the RPC and persist them.
|
|
50
|
+
* Errors per-account are logged and swallowed — does not throw.
|
|
51
|
+
*/
|
|
52
|
+
refreshBalances(rpcUrl?: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Find the next free account in round-robin order.
|
|
55
|
+
* Returns undefined if all accounts are in use.
|
|
56
|
+
*/
|
|
57
|
+
private nextFreeSlot;
|
|
58
|
+
}
|
|
59
|
+
export interface FundChannelsResult {
|
|
60
|
+
funded: number;
|
|
61
|
+
txHash: string;
|
|
62
|
+
errors: string[];
|
|
63
|
+
}
|
|
64
|
+
export declare function addChannel(db: Database.Database, publicKey: string, network: string, label?: string): void;
|
|
65
|
+
export declare function listChannels(db: Database.Database, network: string): ChannelAccount[];
|
|
66
|
+
export declare function fundChannels(db: Database.Database, masterSecretKey: string, amountXlm: string, network: string, rpcUrl?: string): Promise<FundChannelsResult>;
|
|
67
|
+
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/core/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAKH,KAAK,cAAc,EACtB,MAAM,uBAAuB,CAAC;AAK/B,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;IAClE,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAK;gBAEP,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM;IAMlD,6CAA6C;IAC7C,IAAI,IAAI,MAAM;IAId;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAa/B;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAYhC;;;OAGG;IACH,WAAW,IAAI,cAAc,EAAE;IAQ/B;;;OAGG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrD;;;OAGG;IACH,OAAO,CAAC,YAAY;CAYvB;AAED,MAAM,WAAW,kBAAkB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,UAAU,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACf,IAAI,CAEN;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAErF;AAED,wBAAsB,YAAY,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
|