arc402-cli 1.4.48 → 1.5.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 (85) hide show
  1. package/dist/commands/arena-v2.d.ts +5 -0
  2. package/dist/commands/arena-v2.d.ts.map +1 -0
  3. package/dist/commands/arena-v2.js +2265 -0
  4. package/dist/commands/arena-v2.js.map +1 -0
  5. package/dist/commands/arena.d.ts +2 -0
  6. package/dist/commands/arena.d.ts.map +1 -1
  7. package/dist/commands/arena.js +10 -28
  8. package/dist/commands/arena.js.map +1 -1
  9. package/dist/commands/chat.d.ts +3 -0
  10. package/dist/commands/chat.d.ts.map +1 -0
  11. package/dist/commands/chat.js +561 -0
  12. package/dist/commands/chat.js.map +1 -0
  13. package/dist/commands/daemon.d.ts.map +1 -1
  14. package/dist/commands/daemon.js +44 -5
  15. package/dist/commands/daemon.js.map +1 -1
  16. package/dist/commands/hermes-init.d.ts +16 -0
  17. package/dist/commands/hermes-init.d.ts.map +1 -0
  18. package/dist/commands/hermes-init.js +278 -0
  19. package/dist/commands/hermes-init.js.map +1 -0
  20. package/dist/commands/index.d.ts +3 -0
  21. package/dist/commands/index.d.ts.map +1 -0
  22. package/dist/commands/index.js +74 -0
  23. package/dist/commands/index.js.map +1 -0
  24. package/dist/commands/status.d.ts +18 -0
  25. package/dist/commands/status.d.ts.map +1 -0
  26. package/dist/commands/status.js +141 -0
  27. package/dist/commands/status.js.map +1 -0
  28. package/dist/commands/subscription.d.ts +3 -0
  29. package/dist/commands/subscription.d.ts.map +1 -0
  30. package/dist/commands/subscription.js +173 -0
  31. package/dist/commands/subscription.js.map +1 -0
  32. package/dist/commerce-client.d.ts +77 -0
  33. package/dist/commerce-client.d.ts.map +1 -0
  34. package/dist/commerce-client.js +224 -0
  35. package/dist/commerce-client.js.map +1 -0
  36. package/dist/commerce-index.d.ts +39 -0
  37. package/dist/commerce-index.d.ts.map +1 -0
  38. package/dist/commerce-index.js +294 -0
  39. package/dist/commerce-index.js.map +1 -0
  40. package/dist/config.d.ts +6 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js.map +1 -1
  43. package/dist/daemon/config.d.ts +1 -0
  44. package/dist/daemon/config.d.ts.map +1 -1
  45. package/dist/daemon/config.js +7 -3
  46. package/dist/daemon/config.js.map +1 -1
  47. package/dist/daemon/index.d.ts.map +1 -1
  48. package/dist/daemon/index.js +102 -5
  49. package/dist/daemon/index.js.map +1 -1
  50. package/dist/daemon-client.d.ts +46 -0
  51. package/dist/daemon-client.d.ts.map +1 -0
  52. package/dist/daemon-client.js +80 -0
  53. package/dist/daemon-client.js.map +1 -0
  54. package/dist/index.js +40 -34
  55. package/dist/index.js.map +1 -1
  56. package/dist/program.d.ts.map +1 -1
  57. package/dist/program.js +10 -0
  58. package/dist/program.js.map +1 -1
  59. package/hermes/DELIVERY-SPEC.md +219 -0
  60. package/hermes/HERMES-INTEGRATION-SPEC.md +338 -0
  61. package/hermes/plugins/arc402_hermes/__init__.py +5 -0
  62. package/hermes/plugins/arc402_hermes/plugin.py +489 -0
  63. package/hermes/plugins/arc402_hermes/py.typed +0 -0
  64. package/hermes/plugins/arc402_hermes.egg-info/PKG-INFO +24 -0
  65. package/hermes/plugins/arc402_hermes.egg-info/SOURCES.txt +10 -0
  66. package/hermes/plugins/arc402_hermes.egg-info/dependency_links.txt +1 -0
  67. package/hermes/plugins/arc402_hermes.egg-info/entry_points.txt +2 -0
  68. package/hermes/plugins/arc402_hermes.egg-info/requires.txt +5 -0
  69. package/hermes/plugins/arc402_hermes.egg-info/top_level.txt +1 -0
  70. package/hermes/plugins/arc402_plugin.py +489 -0
  71. package/hermes/plugins/dist/arc402_hermes-1.0.0-py3-none-any.whl +0 -0
  72. package/hermes/plugins/dist/arc402_hermes-1.0.0.tar.gz +0 -0
  73. package/hermes/plugins/pyproject.toml +47 -0
  74. package/hermes/skills/arc402-agent/SKILL.md +559 -0
  75. package/hermes/workroom/README.md +174 -0
  76. package/hermes/workroom/hermes-daemon.toml +21 -0
  77. package/hermes/workroom/hermes-worker/IDENTITY.md +44 -0
  78. package/hermes/workroom/hermes-worker/SOUL.md +45 -0
  79. package/hermes/workroom/hermes-worker/config.json +32 -0
  80. package/hermes/workroom/hermes-worker/datasets/.gitkeep +0 -0
  81. package/hermes/workroom/hermes-worker/knowledge/.gitkeep +0 -0
  82. package/hermes/workroom/hermes-worker/memory/learnings.md +9 -0
  83. package/hermes/workroom/hermes-worker/skills/.gitkeep +0 -0
  84. package/package.json +9 -3
  85. package/README.md +0 -288
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.renderOperatorSummary = renderOperatorSummary;
40
+ exports.registerStatusCommand = registerStatusCommand;
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const fs = __importStar(require("fs"));
43
+ const commerce_client_1 = require("../commerce-client");
44
+ const config_1 = require("../config");
45
+ const config_2 = require("../daemon/config");
46
+ function readConfiguredWallet() {
47
+ if (fs.existsSync(config_2.DAEMON_TOML)) {
48
+ try {
49
+ const wallet = (0, config_2.loadDaemonConfig)().wallet.contract_address.trim();
50
+ if (wallet)
51
+ return wallet;
52
+ }
53
+ catch {
54
+ // Ignore invalid daemon config here and fall back to CLI config.
55
+ }
56
+ }
57
+ if ((0, config_1.configExists)()) {
58
+ try {
59
+ return (0, config_1.loadConfig)().walletContractAddress?.trim() || undefined;
60
+ }
61
+ catch {
62
+ // Ignore invalid CLI config and fall back to unknown.
63
+ }
64
+ }
65
+ return undefined;
66
+ }
67
+ function renderDaemonGuidance(target) {
68
+ if (target.mode !== "local") {
69
+ console.log("Next steps:");
70
+ console.log(" 1. Confirm the remote daemon URL is correct and reachable.");
71
+ console.log(" 2. Re-run `arc402 chat --setup` if you want to switch back to a local node.");
72
+ return;
73
+ }
74
+ console.log("Next steps:");
75
+ if (!fs.existsSync(config_2.DAEMON_TOML)) {
76
+ console.log(" 1. Run `arc402 daemon init` or `arc402 setup` to create ~/.arc402/daemon.toml.");
77
+ console.log(" 2. Fill in wallet + node settings, then start the node with `arc402 daemon start`.");
78
+ }
79
+ else {
80
+ console.log(" 1. Start the local node with `arc402 daemon start`.");
81
+ console.log(" 2. If it exits immediately, inspect `arc402 daemon logs` for the startup guidance.");
82
+ }
83
+ console.log(" 3. Run `arc402 chat --setup` and choose Remote if this machine should not host the node.");
84
+ }
85
+ async function renderOperatorSummary(options = {}) {
86
+ const target = (0, commerce_client_1.resolveChatDaemonTarget)({ explicitBaseUrl: options.baseUrl });
87
+ const heading = options.heading ?? { type: "title", text: "◈ ARC-402 status" };
88
+ if (heading.type === "upgrade") {
89
+ console.log(chalk_1.default.bold(`◈ Upgraded from ${heading.from} → ${heading.to}`));
90
+ }
91
+ else {
92
+ console.log(chalk_1.default.bold(heading.text));
93
+ }
94
+ try {
95
+ const [health, wallet, workroom, agreements] = await Promise.all([
96
+ (0, commerce_client_1.fetchDaemonHealth)({ baseUrl: target.baseUrl }),
97
+ (0, commerce_client_1.fetchDaemonWalletStatus)({ baseUrl: target.baseUrl }),
98
+ (0, commerce_client_1.fetchDaemonWorkroomStatus)({ baseUrl: target.baseUrl }),
99
+ (0, commerce_client_1.fetchDaemonAgreements)({ baseUrl: target.baseUrl }),
100
+ ]);
101
+ console.log(` Wallet: ${wallet.wallet}`);
102
+ console.log(` Daemon: ${health.ok ? chalk_1.default.green("online") : chalk_1.default.red("offline")} (${wallet.daemonId})`);
103
+ console.log(` Workroom: ${workroom.status}`);
104
+ console.log(` Node: ${target.mode} (${target.baseUrl})`);
105
+ console.log(` Chain: ${wallet.chainId} via ${wallet.rpcUrl}`);
106
+ console.log(` Agreements ${agreements.agreements.length}`);
107
+ return;
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ const fallbackWallet = readConfiguredWallet();
112
+ const daemonState = target.mode === "local"
113
+ ? fs.existsSync(config_2.DAEMON_TOML)
114
+ ? "configured locally but not responding"
115
+ : "not configured on this machine"
116
+ : "remote node unreachable";
117
+ console.log(` Wallet: ${fallbackWallet ?? "not configured"}`);
118
+ console.log(` Daemon: ${chalk_1.default.yellow(daemonState)}`);
119
+ console.log(` Workroom: waiting for daemon context`);
120
+ console.log(` Node: ${target.mode} (${target.baseUrl})`);
121
+ console.log(` Detail: ${message}`);
122
+ if (options.includeGuidance ?? true) {
123
+ console.log("");
124
+ renderDaemonGuidance(target);
125
+ }
126
+ }
127
+ }
128
+ function registerStatusCommand(program) {
129
+ program
130
+ .command("status")
131
+ .description("Show top-level operator status for the configured node")
132
+ .option("--daemon-url <url>", "Override the daemon API base URL")
133
+ .action(async (opts) => {
134
+ await renderOperatorSummary({
135
+ baseUrl: opts.daemonUrl,
136
+ heading: { type: "title", text: "◈ ARC-402 status" },
137
+ includeGuidance: true,
138
+ });
139
+ });
140
+ }
141
+ //# 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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerSubscriptionCommands(program: Command): void;
3
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/commands/subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6LnE"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerSubscriptionCommands = registerSubscriptionCommands;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const commerce_client_1 = require("../commerce-client");
9
+ function outputScaffold(action, payload, opts) {
10
+ const response = {
11
+ action,
12
+ phase: "Phase 4C scaffold",
13
+ status: "direction-set",
14
+ ...payload,
15
+ };
16
+ if (opts.json) {
17
+ console.log(JSON.stringify(response, null, 2));
18
+ return;
19
+ }
20
+ console.log(chalk_1.default.bold(`◈ ${action}`));
21
+ console.log("");
22
+ for (const [key, value] of Object.entries(response)) {
23
+ console.log(` ${key.padEnd(16)} ${String(value)}`);
24
+ }
25
+ }
26
+ function registerSubscriptionCommands(program) {
27
+ program
28
+ .command("subscribe")
29
+ .description("Inspect a commerce endpoint and stage a SubscriptionAgreement intent")
30
+ .argument("<endpoint>", "Endpoint that may expose x402/subscription headers")
31
+ .option("--plan <id>", "Desired plan identifier")
32
+ .option("--months <n>", "Requested subscription duration", "1")
33
+ .option("--json", "Output as JSON")
34
+ .action(async (endpoint, opts) => {
35
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(endpoint);
36
+ outputScaffold("Subscribe", {
37
+ endpoint,
38
+ requestedPlan: opts.plan ?? inspection.subscription?.plan ?? "unspecified",
39
+ months: Number.parseInt(opts.months, 10),
40
+ paymentOptions: inspection.paymentOptions.join(", ") || "none advertised",
41
+ x402Amount: inspection.x402?.amount ?? "n/a",
42
+ subscriptionRate: inspection.subscription?.rate ?? "n/a",
43
+ note: "Read-only scaffolding. On-chain subscribe flow still needs contract write wiring.",
44
+ }, opts);
45
+ });
46
+ const subscription = program
47
+ .command("subscription")
48
+ .description("SubscriptionAgreement lifecycle scaffolding (Spec 46 §7)");
49
+ subscription
50
+ .command("status")
51
+ .argument("<id>", "Subscription id")
52
+ .option("--json", "Output as JSON")
53
+ .action(async (id, opts) => {
54
+ outputScaffold("Subscription Status", { id, note: "Status lookup contract/subgraph binding pending." }, opts);
55
+ });
56
+ subscription
57
+ .command("list")
58
+ .option("--json", "Output as JSON")
59
+ .action(async (opts) => {
60
+ outputScaffold("Subscription List", { note: "List query scaffolding only. No implicit storage contract assumed." }, opts);
61
+ });
62
+ subscription
63
+ .command("cancel")
64
+ .argument("<id>", "Subscription id")
65
+ .option("--json", "Output as JSON")
66
+ .action(async (id, opts) => {
67
+ outputScaffold("Subscription Cancel", { id, note: "Cancellation write path intentionally not wired in this phase." }, opts);
68
+ });
69
+ subscription
70
+ .command("topup")
71
+ .argument("<id>", "Subscription id")
72
+ .requiredOption("--months <n>", "Additional months to purchase")
73
+ .option("--json", "Output as JSON")
74
+ .action(async (id, opts) => {
75
+ outputScaffold("Subscription Topup", {
76
+ id,
77
+ months: Number.parseInt(opts.months, 10),
78
+ note: "Top-up command shape is in place; funding flow remains to be connected.",
79
+ }, opts);
80
+ });
81
+ const plan = program
82
+ .command("plan")
83
+ .description("Provider-side subscription plan scaffolding (Spec 46 §7)");
84
+ plan
85
+ .command("create")
86
+ .requiredOption("--plan-id <id>", "Plan identifier")
87
+ .requiredOption("--rate <ethPerMonth>", "Monthly rate in ETH")
88
+ .option("--json", "Output as JSON")
89
+ .action(async (opts) => {
90
+ outputScaffold("Plan Create", {
91
+ planId: opts.planId,
92
+ rate: opts.rate,
93
+ note: "Create command is staged for a future SubscriptionAgreement write adapter.",
94
+ }, opts);
95
+ });
96
+ plan
97
+ .command("list")
98
+ .argument("[endpoint]", "Optional endpoint to inspect for advertised plan headers")
99
+ .option("--json", "Output as JSON")
100
+ .action(async (endpoint, opts) => {
101
+ if (endpoint) {
102
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(endpoint);
103
+ outputScaffold("Plan List", {
104
+ endpoint,
105
+ advertisedPlan: inspection.subscription?.plan ?? "n/a",
106
+ advertisedRate: inspection.subscription?.rate ?? "n/a",
107
+ paymentOptions: inspection.paymentOptions.join(", ") || "none advertised",
108
+ }, opts);
109
+ return;
110
+ }
111
+ outputScaffold("Plan List", { note: "Provider plan listing requires a concrete storage/query source." }, opts);
112
+ });
113
+ const x402 = program
114
+ .command("x402")
115
+ .description("x402 bridge inspection helpers (Spec 46 §7)");
116
+ x402
117
+ .command("inspect")
118
+ .argument("<url>", "HTTP endpoint expected to emit 402 payment headers")
119
+ .option("--json", "Output as JSON")
120
+ .action(async (url, opts) => {
121
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(url);
122
+ if (opts.json) {
123
+ console.log(JSON.stringify(inspection, null, 2));
124
+ return;
125
+ }
126
+ console.log(chalk_1.default.bold("◈ x402 Inspect"));
127
+ console.log("");
128
+ console.log(` ${"url".padEnd(16)} ${inspection.url}`);
129
+ console.log(` ${"status".padEnd(16)} ${inspection.status}`);
130
+ console.log(` ${"paymentRequired".padEnd(16)} ${inspection.paymentRequired}`);
131
+ console.log(` ${"options".padEnd(16)} ${inspection.paymentOptions.join(", ") || "none"}`);
132
+ console.log(` ${"receiver".padEnd(16)} ${inspection.x402?.receiver ?? "n/a"}`);
133
+ console.log(` ${"amount".padEnd(16)} ${inspection.x402?.amount ?? "n/a"}`);
134
+ console.log(` ${"subscription".padEnd(16)} ${inspection.subscription?.plan ?? "n/a"}`);
135
+ });
136
+ x402
137
+ .command("issue")
138
+ .description("Fetch a newsletter issue and surface typed x402/subscription responses")
139
+ .requiredOption("--base-url <url>", "Daemon base URL")
140
+ .requiredOption("--newsletter <id>", "Newsletter id")
141
+ .requiredOption("--issue <hash>", "Issue content hash")
142
+ .option("--signer <address>", "Subscriber wallet")
143
+ .option("--signature <sig>", "EIP-191 signature for the issue access message")
144
+ .option("--api-token <token>", "Daemon bearer token for local automation")
145
+ .option("--json", "Output as JSON")
146
+ .action(async (opts) => {
147
+ const result = await (0, commerce_client_1.fetchNewsletterIssue)(opts.baseUrl, opts.newsletter, opts.issue, {
148
+ signer: opts.signer,
149
+ signature: opts.signature,
150
+ apiToken: opts.apiToken,
151
+ });
152
+ if (opts.json) {
153
+ console.log(JSON.stringify({
154
+ ...result,
155
+ accessMessage: (0, commerce_client_1.buildNewsletterAccessMessage)(opts.newsletter, opts.issue),
156
+ }, null, 2));
157
+ return;
158
+ }
159
+ console.log(chalk_1.default.bold("◈ x402 Issue Fetch"));
160
+ console.log("");
161
+ console.log(` ${"status".padEnd(16)} ${result.status}`);
162
+ console.log(` ${"contentType".padEnd(16)} ${result.contentType ?? "n/a"}`);
163
+ console.log(` ${"paymentRequired".padEnd(16)} ${result.paymentRequired}`);
164
+ console.log(` ${"plan".padEnd(16)} ${result.subscription?.plan ?? "n/a"}`);
165
+ console.log(` ${"amount".padEnd(16)} ${result.x402?.amount ?? "n/a"}`);
166
+ console.log(` ${"signMessage".padEnd(16)} ${(0, commerce_client_1.buildNewsletterAccessMessage)(opts.newsletter, opts.issue)}`);
167
+ if (result.body) {
168
+ console.log("");
169
+ console.log(result.body);
170
+ }
171
+ });
172
+ }
173
+ //# sourceMappingURL=subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/commands/subscription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export interface X402PaymentRequirement {
2
+ receiver?: string;
3
+ amount?: string;
4
+ currency?: string;
5
+ network?: string;
6
+ description?: string;
7
+ }
8
+ export interface SubscriptionOfferHint {
9
+ plan?: string;
10
+ rate?: string;
11
+ endpoint?: string;
12
+ }
13
+ export interface CommerceGatewayInspection {
14
+ url: string;
15
+ status: number;
16
+ ok: boolean;
17
+ paymentRequired: boolean;
18
+ paymentOptions: string[];
19
+ x402?: X402PaymentRequirement;
20
+ subscription?: SubscriptionOfferHint;
21
+ }
22
+ export interface NewsletterIssueFetchOptions {
23
+ signer?: string;
24
+ signature?: string;
25
+ apiToken?: string;
26
+ }
27
+ export interface NewsletterIssueFetchResult extends CommerceGatewayInspection {
28
+ body?: string;
29
+ contentType?: string;
30
+ }
31
+ export interface DaemonWalletStatus {
32
+ ok: boolean;
33
+ wallet: string;
34
+ daemonId: string;
35
+ chainId: number;
36
+ rpcUrl: string;
37
+ policyEngineAddress: string;
38
+ }
39
+ export interface DaemonWorkroomStatus {
40
+ ok: boolean;
41
+ status: string;
42
+ }
43
+ export interface DaemonHealthStatus {
44
+ ok: boolean;
45
+ wallet: string;
46
+ }
47
+ export interface DaemonAgreementsResponse {
48
+ ok: boolean;
49
+ agreements: Array<Record<string, unknown>>;
50
+ }
51
+ export interface DaemonCommerceClientOptions {
52
+ baseUrl?: string;
53
+ token?: string;
54
+ }
55
+ export type DaemonNodeMode = "local" | "remote";
56
+ export interface ResolvedChatDaemonTarget {
57
+ baseUrl: string;
58
+ mode: DaemonNodeMode;
59
+ source: "flag" | "config" | "daemon" | "default-local";
60
+ }
61
+ export declare function parseCommerceHeaders(url: string, status: number, headers: Headers): CommerceGatewayInspection;
62
+ export declare function inspectCommerceEndpoint(url: string, init?: RequestInit): Promise<CommerceGatewayInspection>;
63
+ export declare function buildNewsletterAccessMessage(newsletterId: string, issueHash: string): string;
64
+ export declare function fetchNewsletterIssue(baseUrl: string, newsletterId: string, issueHash: string, options?: NewsletterIssueFetchOptions): Promise<NewsletterIssueFetchResult>;
65
+ export declare function loadLocalDaemonToken(): string | undefined;
66
+ export declare function resolveDaemonApiBaseUrl(explicitBaseUrl?: string): string;
67
+ export declare function inferDaemonNodeMode(baseUrl: string): DaemonNodeMode;
68
+ export declare function resolveChatDaemonTarget(options?: {
69
+ explicitBaseUrl?: string;
70
+ explicitNodeMode?: DaemonNodeMode;
71
+ }): ResolvedChatDaemonTarget;
72
+ export declare function fetchDaemonHealth(options?: DaemonCommerceClientOptions): Promise<DaemonHealthStatus>;
73
+ export declare function fetchDaemonWalletStatus(options?: DaemonCommerceClientOptions): Promise<DaemonWalletStatus>;
74
+ export declare function fetchDaemonWorkroomStatus(options?: DaemonCommerceClientOptions): Promise<DaemonWorkroomStatus>;
75
+ export declare function fetchDaemonAgreements(options?: DaemonCommerceClientOptions): Promise<DaemonAgreementsResponse>;
76
+ export declare function getDaemonTokenPath(): string;
77
+ //# sourceMappingURL=commerce-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commerce-client.d.ts","sourceRoot":"","sources":["../src/commerce-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.parseCommerceHeaders = parseCommerceHeaders;
37
+ exports.inspectCommerceEndpoint = inspectCommerceEndpoint;
38
+ exports.buildNewsletterAccessMessage = buildNewsletterAccessMessage;
39
+ exports.fetchNewsletterIssue = fetchNewsletterIssue;
40
+ exports.loadLocalDaemonToken = loadLocalDaemonToken;
41
+ exports.resolveDaemonApiBaseUrl = resolveDaemonApiBaseUrl;
42
+ exports.inferDaemonNodeMode = inferDaemonNodeMode;
43
+ exports.resolveChatDaemonTarget = resolveChatDaemonTarget;
44
+ exports.fetchDaemonHealth = fetchDaemonHealth;
45
+ exports.fetchDaemonWalletStatus = fetchDaemonWalletStatus;
46
+ exports.fetchDaemonWorkroomStatus = fetchDaemonWorkroomStatus;
47
+ exports.fetchDaemonAgreements = fetchDaemonAgreements;
48
+ exports.getDaemonTokenPath = getDaemonTokenPath;
49
+ const fs = __importStar(require("fs"));
50
+ const os = __importStar(require("os"));
51
+ const path = __importStar(require("path"));
52
+ const config_1 = require("./config");
53
+ const config_2 = require("./daemon/config");
54
+ function header(headers, key) {
55
+ const value = headers.get(key);
56
+ return value === null || value.trim() === "" ? undefined : value.trim();
57
+ }
58
+ function parseCommerceHeaders(url, status, headers) {
59
+ const paymentOptions = (header(headers, "x-payment-options") ?? "")
60
+ .split(",")
61
+ .map((entry) => entry.trim())
62
+ .filter(Boolean);
63
+ const x402 = {
64
+ receiver: header(headers, "x-x402-receiver"),
65
+ amount: header(headers, "x-x402-amount"),
66
+ currency: header(headers, "x-x402-currency"),
67
+ network: header(headers, "x-x402-network"),
68
+ description: header(headers, "x-x402-description"),
69
+ };
70
+ const subscription = {
71
+ plan: header(headers, "x-subscription-plan"),
72
+ rate: header(headers, "x-subscription-rate"),
73
+ endpoint: header(headers, "x-subscription-endpoint"),
74
+ };
75
+ return {
76
+ url,
77
+ status,
78
+ ok: status >= 200 && status < 300,
79
+ paymentRequired: (header(headers, "x-payment-required") ?? "").toLowerCase() === "true" || status === 402,
80
+ paymentOptions,
81
+ x402: Object.values(x402).some(Boolean) ? x402 : undefined,
82
+ subscription: Object.values(subscription).some(Boolean) ? subscription : undefined,
83
+ };
84
+ }
85
+ async function inspectCommerceEndpoint(url, init) {
86
+ const response = await fetch(url, {
87
+ method: init?.method ?? "GET",
88
+ redirect: "manual",
89
+ ...init,
90
+ });
91
+ return parseCommerceHeaders(url, response.status, response.headers);
92
+ }
93
+ function buildNewsletterAccessMessage(newsletterId, issueHash) {
94
+ return `arc402:newsletter:${newsletterId}:${issueHash}`;
95
+ }
96
+ async function fetchNewsletterIssue(baseUrl, newsletterId, issueHash, options = {}) {
97
+ const normalizedBase = baseUrl.replace(/\/$/, "");
98
+ const url = `${normalizedBase}/newsletter/${encodeURIComponent(newsletterId)}/issues/${encodeURIComponent(issueHash)}`;
99
+ const headers = {};
100
+ if (options.apiToken) {
101
+ headers.Authorization = `Bearer ${options.apiToken}`;
102
+ }
103
+ if (options.signer) {
104
+ headers["X-ARC402-Signer"] = options.signer;
105
+ }
106
+ if (options.signature) {
107
+ headers["X-ARC402-Signature"] = options.signature;
108
+ }
109
+ const response = await fetch(url, { method: "GET", headers });
110
+ const inspection = parseCommerceHeaders(url, response.status, response.headers);
111
+ return {
112
+ ...inspection,
113
+ body: response.ok ? await response.text() : undefined,
114
+ contentType: header(response.headers, "content-type"),
115
+ };
116
+ }
117
+ const DAEMON_TOKEN_FILE = path.join(config_2.DAEMON_DIR, "daemon.token");
118
+ function trimTrailingSlash(input) {
119
+ return input.replace(/\/$/, "");
120
+ }
121
+ function loadLocalDaemonToken() {
122
+ try {
123
+ const token = fs.readFileSync(DAEMON_TOKEN_FILE, "utf-8").trim();
124
+ return token.length > 0 ? token : undefined;
125
+ }
126
+ catch {
127
+ return undefined;
128
+ }
129
+ }
130
+ function resolveDaemonApiBaseUrl(explicitBaseUrl) {
131
+ if (explicitBaseUrl && explicitBaseUrl.trim().length > 0) {
132
+ return trimTrailingSlash(explicitBaseUrl.trim());
133
+ }
134
+ if (fs.existsSync(config_2.DAEMON_TOML)) {
135
+ try {
136
+ const daemonConfig = (0, config_2.loadDaemonConfig)();
137
+ const port = (daemonConfig.relay.listen_port ?? 4402) + 1;
138
+ return `http://127.0.0.1:${port}`;
139
+ }
140
+ catch {
141
+ // Fall through to the default local API port.
142
+ }
143
+ }
144
+ return "http://127.0.0.1:4403";
145
+ }
146
+ function inferDaemonNodeMode(baseUrl) {
147
+ try {
148
+ const url = new URL(baseUrl);
149
+ const hostname = url.hostname.toLowerCase();
150
+ if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1") {
151
+ return "local";
152
+ }
153
+ }
154
+ catch {
155
+ // Fall through and treat invalid/unparseable endpoints as remote user input.
156
+ }
157
+ return "remote";
158
+ }
159
+ function resolveChatDaemonTarget(options = {}) {
160
+ const savedChat = (0, config_1.configExists)() ? (0, config_1.loadConfig)().chat : undefined;
161
+ const savedBaseUrl = savedChat?.daemonUrl?.trim() ? savedChat.daemonUrl.trim() : undefined;
162
+ if (options.explicitBaseUrl?.trim()) {
163
+ const baseUrl = trimTrailingSlash(options.explicitBaseUrl.trim());
164
+ return {
165
+ baseUrl,
166
+ mode: options.explicitNodeMode ?? inferDaemonNodeMode(baseUrl),
167
+ source: "flag",
168
+ };
169
+ }
170
+ if (savedBaseUrl) {
171
+ return {
172
+ baseUrl: trimTrailingSlash(savedBaseUrl),
173
+ mode: options.explicitNodeMode ?? savedChat?.nodeMode ?? inferDaemonNodeMode(savedBaseUrl),
174
+ source: "config",
175
+ };
176
+ }
177
+ if (fs.existsSync(config_2.DAEMON_TOML)) {
178
+ const baseUrl = resolveDaemonApiBaseUrl();
179
+ return {
180
+ baseUrl,
181
+ mode: options.explicitNodeMode ?? "local",
182
+ source: "daemon",
183
+ };
184
+ }
185
+ const baseUrl = resolveDaemonApiBaseUrl();
186
+ return {
187
+ baseUrl,
188
+ mode: options.explicitNodeMode ?? "local",
189
+ source: "default-local",
190
+ };
191
+ }
192
+ async function daemonJsonRequest(urlPath, options = {}) {
193
+ const baseUrl = resolveDaemonApiBaseUrl(options.baseUrl);
194
+ const token = options.token ?? loadLocalDaemonToken();
195
+ const headers = {};
196
+ if (token) {
197
+ headers.Authorization = `Bearer ${token}`;
198
+ }
199
+ const response = await fetch(`${baseUrl}${urlPath}`, {
200
+ method: "GET",
201
+ headers,
202
+ });
203
+ if (!response.ok) {
204
+ const detail = await response.text().catch(() => "");
205
+ throw new Error(detail || `Daemon request failed (${response.status})`);
206
+ }
207
+ return await response.json();
208
+ }
209
+ async function fetchDaemonHealth(options = {}) {
210
+ return await daemonJsonRequest("/health", options);
211
+ }
212
+ async function fetchDaemonWalletStatus(options = {}) {
213
+ return await daemonJsonRequest("/wallet/status", options);
214
+ }
215
+ async function fetchDaemonWorkroomStatus(options = {}) {
216
+ return await daemonJsonRequest("/workroom/status", options);
217
+ }
218
+ async function fetchDaemonAgreements(options = {}) {
219
+ return await daemonJsonRequest("/agreements", options);
220
+ }
221
+ function getDaemonTokenPath() {
222
+ return path.join(os.homedir(), ".arc402", "daemon.token");
223
+ }
224
+ //# sourceMappingURL=commerce-client.js.map