arc402-cli 1.4.50 → 1.6.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 (291) hide show
  1. package/dist/commands/agreements.d.ts.map +1 -1
  2. package/dist/commands/agreements.js +19 -0
  3. package/dist/commands/agreements.js.map +1 -1
  4. package/dist/commands/arena-v2.d.ts.map +1 -1
  5. package/dist/commands/arena-v2.js +129 -4
  6. package/dist/commands/arena-v2.js.map +1 -1
  7. package/dist/commands/auth.d.ts +11 -0
  8. package/dist/commands/auth.d.ts.map +1 -0
  9. package/dist/commands/auth.js +188 -0
  10. package/dist/commands/auth.js.map +1 -0
  11. package/dist/commands/chat.d.ts +3 -0
  12. package/dist/commands/chat.d.ts.map +1 -0
  13. package/dist/commands/chat.js +752 -0
  14. package/dist/commands/chat.js.map +1 -0
  15. package/dist/commands/compute.d.ts.map +1 -1
  16. package/dist/commands/compute.js +84 -10
  17. package/dist/commands/compute.js.map +1 -1
  18. package/dist/commands/daemon.d.ts.map +1 -1
  19. package/dist/commands/daemon.js +44 -5
  20. package/dist/commands/daemon.js.map +1 -1
  21. package/dist/commands/discover.d.ts.map +1 -1
  22. package/dist/commands/discover.js +20 -0
  23. package/dist/commands/discover.js.map +1 -1
  24. package/dist/commands/hermes-init.d.ts +1 -1
  25. package/dist/commands/hermes-init.js +9 -9
  26. package/dist/commands/hermes-init.js.map +1 -1
  27. package/dist/commands/hire.d.ts.map +1 -1
  28. package/dist/commands/hire.js +20 -0
  29. package/dist/commands/hire.js.map +1 -1
  30. package/dist/commands/index.d.ts +3 -0
  31. package/dist/commands/index.d.ts.map +1 -0
  32. package/dist/commands/index.js +74 -0
  33. package/dist/commands/index.js.map +1 -0
  34. package/dist/commands/lifecycle.d.ts +3 -0
  35. package/dist/commands/lifecycle.d.ts.map +1 -0
  36. package/dist/commands/lifecycle.js +58 -0
  37. package/dist/commands/lifecycle.js.map +1 -0
  38. package/dist/commands/security.d.ts +3 -0
  39. package/dist/commands/security.d.ts.map +1 -0
  40. package/dist/commands/security.js +44 -0
  41. package/dist/commands/security.js.map +1 -0
  42. package/dist/commands/status.d.ts +18 -0
  43. package/dist/commands/status.d.ts.map +1 -0
  44. package/dist/commands/status.js +179 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/commands/subscription.d.ts +3 -0
  47. package/dist/commands/subscription.d.ts.map +1 -0
  48. package/dist/commands/subscription.js +465 -0
  49. package/dist/commands/subscription.js.map +1 -0
  50. package/dist/commands/workroom.d.ts.map +1 -1
  51. package/dist/commands/workroom.js +13 -0
  52. package/dist/commands/workroom.js.map +1 -1
  53. package/dist/commerce-client.d.ts +77 -0
  54. package/dist/commerce-client.d.ts.map +1 -0
  55. package/dist/commerce-client.js +224 -0
  56. package/dist/commerce-client.js.map +1 -0
  57. package/dist/commerce-index.d.ts +39 -0
  58. package/dist/commerce-index.d.ts.map +1 -0
  59. package/dist/commerce-index.js +294 -0
  60. package/dist/commerce-index.js.map +1 -0
  61. package/dist/config.d.ts +6 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js.map +1 -1
  64. package/dist/daemon/config.d.ts +1 -0
  65. package/dist/daemon/config.d.ts.map +1 -1
  66. package/dist/daemon/config.js +7 -3
  67. package/dist/daemon/config.js.map +1 -1
  68. package/dist/daemon/index.d.ts.map +1 -1
  69. package/dist/daemon/index.js +18 -4
  70. package/dist/daemon/index.js.map +1 -1
  71. package/dist/daemon-client.d.ts +46 -0
  72. package/dist/daemon-client.d.ts.map +1 -0
  73. package/dist/daemon-client.js +80 -0
  74. package/dist/daemon-client.js.map +1 -0
  75. package/dist/index.js +40 -34
  76. package/dist/index.js.map +1 -1
  77. package/dist/program.d.ts.map +1 -1
  78. package/dist/program.js +14 -0
  79. package/dist/program.js.map +1 -1
  80. package/dist/tui/App.d.ts.map +1 -1
  81. package/dist/tui/App.js +61 -58
  82. package/dist/tui/App.js.map +1 -1
  83. package/dist/tui/InputLine.d.ts +4 -2
  84. package/dist/tui/InputLine.d.ts.map +1 -1
  85. package/dist/tui/InputLine.js +79 -60
  86. package/dist/tui/InputLine.js.map +1 -1
  87. package/dist/tui/KernelPayloadRenderer.d.ts +12 -0
  88. package/dist/tui/KernelPayloadRenderer.d.ts.map +1 -0
  89. package/dist/tui/KernelPayloadRenderer.js +41 -0
  90. package/dist/tui/KernelPayloadRenderer.js.map +1 -0
  91. package/dist/tui/Viewport.d.ts +15 -5
  92. package/dist/tui/Viewport.d.ts.map +1 -1
  93. package/dist/tui/Viewport.js +18 -24
  94. package/dist/tui/Viewport.js.map +1 -1
  95. package/dist/tui/command-catalog.d.ts +11 -0
  96. package/dist/tui/command-catalog.d.ts.map +1 -0
  97. package/dist/tui/command-catalog.js +119 -0
  98. package/dist/tui/command-catalog.js.map +1 -0
  99. package/dist/tui/command-renderers.d.ts +33 -0
  100. package/dist/tui/command-renderers.d.ts.map +1 -0
  101. package/dist/tui/command-renderers.js +215 -0
  102. package/dist/tui/command-renderers.js.map +1 -0
  103. package/dist/tui/commerce-format.d.ts +3 -0
  104. package/dist/tui/commerce-format.d.ts.map +1 -0
  105. package/dist/tui/commerce-format.js +19 -0
  106. package/dist/tui/commerce-format.js.map +1 -0
  107. package/dist/tui/components/commerce/AgentPicker.d.ts +7 -0
  108. package/dist/tui/components/commerce/AgentPicker.d.ts.map +1 -0
  109. package/dist/tui/components/commerce/AgentPicker.js +33 -0
  110. package/dist/tui/components/commerce/AgentPicker.js.map +1 -0
  111. package/dist/tui/components/commerce/AgreementList.d.ts +18 -0
  112. package/dist/tui/components/commerce/AgreementList.d.ts.map +1 -0
  113. package/dist/tui/components/commerce/AgreementList.js +25 -0
  114. package/dist/tui/components/commerce/AgreementList.js.map +1 -0
  115. package/dist/tui/components/commerce/ComputeCard.d.ts +14 -0
  116. package/dist/tui/components/commerce/ComputeCard.d.ts.map +1 -0
  117. package/dist/tui/components/commerce/ComputeCard.js +9 -0
  118. package/dist/tui/components/commerce/ComputeCard.js.map +1 -0
  119. package/dist/tui/components/commerce/DiscoverList.d.ts +20 -0
  120. package/dist/tui/components/commerce/DiscoverList.d.ts.map +1 -0
  121. package/dist/tui/components/commerce/DiscoverList.js +22 -0
  122. package/dist/tui/components/commerce/DiscoverList.js.map +1 -0
  123. package/dist/tui/components/commerce/HireCard.d.ts +14 -0
  124. package/dist/tui/components/commerce/HireCard.d.ts.map +1 -0
  125. package/dist/tui/components/commerce/HireCard.js +11 -0
  126. package/dist/tui/components/commerce/HireCard.js.map +1 -0
  127. package/dist/tui/components/commerce/ProfileCard.d.ts +19 -0
  128. package/dist/tui/components/commerce/ProfileCard.d.ts.map +1 -0
  129. package/dist/tui/components/commerce/ProfileCard.js +10 -0
  130. package/dist/tui/components/commerce/ProfileCard.js.map +1 -0
  131. package/dist/tui/components/commerce/RoundsList.d.ts +18 -0
  132. package/dist/tui/components/commerce/RoundsList.d.ts.map +1 -0
  133. package/dist/tui/components/commerce/RoundsList.js +9 -0
  134. package/dist/tui/components/commerce/RoundsList.js.map +1 -0
  135. package/dist/tui/components/commerce/SquadCard.d.ts +25 -0
  136. package/dist/tui/components/commerce/SquadCard.d.ts.map +1 -0
  137. package/dist/tui/components/commerce/SquadCard.js +10 -0
  138. package/dist/tui/components/commerce/SquadCard.js.map +1 -0
  139. package/dist/tui/components/commerce/StatusCard.d.ts +21 -0
  140. package/dist/tui/components/commerce/StatusCard.d.ts.map +1 -0
  141. package/dist/tui/components/commerce/StatusCard.js +10 -0
  142. package/dist/tui/components/commerce/StatusCard.js.map +1 -0
  143. package/dist/tui/components/commerce/SubscribeCard.d.ts +13 -0
  144. package/dist/tui/components/commerce/SubscribeCard.d.ts.map +1 -0
  145. package/dist/tui/components/commerce/SubscribeCard.js +10 -0
  146. package/dist/tui/components/commerce/SubscribeCard.js.map +1 -0
  147. package/dist/tui/components/commerce/WorkroomCard.d.ts +18 -0
  148. package/dist/tui/components/commerce/WorkroomCard.d.ts.map +1 -0
  149. package/dist/tui/components/commerce/WorkroomCard.js +10 -0
  150. package/dist/tui/components/commerce/WorkroomCard.js.map +1 -0
  151. package/dist/tui/components/commerce/common.d.ts +53 -0
  152. package/dist/tui/components/commerce/common.d.ts.map +1 -0
  153. package/dist/tui/components/commerce/common.js +71 -0
  154. package/dist/tui/components/commerce/common.js.map +1 -0
  155. package/dist/tui/components/commerce/index.d.ts +11 -0
  156. package/dist/tui/components/commerce/index.d.ts.map +1 -0
  157. package/dist/tui/components/commerce/index.js +27 -0
  158. package/dist/tui/components/commerce/index.js.map +1 -0
  159. package/dist/tui/hire-interactive.d.ts +13 -0
  160. package/dist/tui/hire-interactive.d.ts.map +1 -0
  161. package/dist/tui/hire-interactive.js +157 -0
  162. package/dist/tui/hire-interactive.js.map +1 -0
  163. package/dist/tui/kernel-payload.d.ts +45 -0
  164. package/dist/tui/kernel-payload.d.ts.map +1 -0
  165. package/dist/tui/kernel-payload.js +8 -0
  166. package/dist/tui/kernel-payload.js.map +1 -0
  167. package/dist/tui/kernel.d.ts +6 -0
  168. package/dist/tui/kernel.d.ts.map +1 -0
  169. package/dist/tui/kernel.js +791 -0
  170. package/dist/tui/kernel.js.map +1 -0
  171. package/dist/tui/render-inline.d.ts +9 -0
  172. package/dist/tui/render-inline.d.ts.map +1 -0
  173. package/dist/tui/render-inline.js +32 -0
  174. package/dist/tui/render-inline.js.map +1 -0
  175. package/dist/tui/useChat.d.ts.map +1 -1
  176. package/dist/tui/useChat.js +2 -2
  177. package/dist/tui/useChat.js.map +1 -1
  178. package/dist/tui/useCommand.d.ts +2 -2
  179. package/dist/tui/useCommand.d.ts.map +1 -1
  180. package/dist/tui/useCommand.js +57 -19
  181. package/dist/tui/useCommand.js.map +1 -1
  182. package/dist/tui/useDaemonEvents.d.ts +4 -0
  183. package/dist/tui/useDaemonEvents.d.ts.map +1 -0
  184. package/dist/tui/useDaemonEvents.js +69 -0
  185. package/dist/tui/useDaemonEvents.js.map +1 -0
  186. package/dist/tui/useTerminalSize.d.ts +11 -0
  187. package/dist/tui/useTerminalSize.d.ts.map +1 -0
  188. package/dist/tui/useTerminalSize.js +32 -0
  189. package/dist/tui/useTerminalSize.js.map +1 -0
  190. package/dist/tui-esm/App.js +136 -0
  191. package/dist/tui-esm/App.js.map +1 -0
  192. package/dist/tui-esm/Footer.js +13 -0
  193. package/dist/tui-esm/Footer.js.map +1 -0
  194. package/dist/tui-esm/Header.js +19 -0
  195. package/dist/tui-esm/Header.js.map +1 -0
  196. package/dist/tui-esm/InputLine.js +121 -0
  197. package/dist/tui-esm/InputLine.js.map +1 -0
  198. package/dist/tui-esm/Viewport.js +39 -0
  199. package/dist/tui-esm/Viewport.js.map +1 -0
  200. package/dist/tui-esm/WalletConnectPairing.js +61 -0
  201. package/dist/tui-esm/WalletConnectPairing.js.map +1 -0
  202. package/dist/tui-esm/command-catalog.js +20 -0
  203. package/dist/tui-esm/command-catalog.js.map +1 -0
  204. package/dist/tui-esm/command-renderers.js +180 -0
  205. package/dist/tui-esm/command-renderers.js.map +1 -0
  206. package/dist/tui-esm/commerce-format.js +19 -0
  207. package/dist/tui-esm/commerce-format.js.map +1 -0
  208. package/dist/tui-esm/components/Button.js +21 -0
  209. package/dist/tui-esm/components/Button.js.map +1 -0
  210. package/dist/tui-esm/components/CeremonyView.js +10 -0
  211. package/dist/tui-esm/components/CeremonyView.js.map +1 -0
  212. package/dist/tui-esm/components/CompletionDropdown.js +23 -0
  213. package/dist/tui-esm/components/CompletionDropdown.js.map +1 -0
  214. package/dist/tui-esm/components/ConfirmPrompt.js +10 -0
  215. package/dist/tui-esm/components/ConfirmPrompt.js.map +1 -0
  216. package/dist/tui-esm/components/CustomTextInput.js +99 -0
  217. package/dist/tui-esm/components/CustomTextInput.js.map +1 -0
  218. package/dist/tui-esm/components/InteractiveTable.js +61 -0
  219. package/dist/tui-esm/components/InteractiveTable.js.map +1 -0
  220. package/dist/tui-esm/components/StepSpinner.js +32 -0
  221. package/dist/tui-esm/components/StepSpinner.js.map +1 -0
  222. package/dist/tui-esm/components/Toast.js +29 -0
  223. package/dist/tui-esm/components/Toast.js.map +1 -0
  224. package/dist/tui-esm/components/commerce/AgreementList.js +25 -0
  225. package/dist/tui-esm/components/commerce/AgreementList.js.map +1 -0
  226. package/dist/tui-esm/components/commerce/ComputeCard.js +9 -0
  227. package/dist/tui-esm/components/commerce/ComputeCard.js.map +1 -0
  228. package/dist/tui-esm/components/commerce/DiscoverList.js +14 -0
  229. package/dist/tui-esm/components/commerce/DiscoverList.js.map +1 -0
  230. package/dist/tui-esm/components/commerce/HireCard.js +11 -0
  231. package/dist/tui-esm/components/commerce/HireCard.js.map +1 -0
  232. package/dist/tui-esm/components/commerce/RoundsList.js +9 -0
  233. package/dist/tui-esm/components/commerce/RoundsList.js.map +1 -0
  234. package/dist/tui-esm/components/commerce/SquadCard.js +10 -0
  235. package/dist/tui-esm/components/commerce/SquadCard.js.map +1 -0
  236. package/dist/tui-esm/components/commerce/StatusCard.js +10 -0
  237. package/dist/tui-esm/components/commerce/StatusCard.js.map +1 -0
  238. package/dist/tui-esm/components/commerce/SubscribeCard.js +10 -0
  239. package/dist/tui-esm/components/commerce/SubscribeCard.js.map +1 -0
  240. package/dist/tui-esm/components/commerce/WorkroomCard.js +10 -0
  241. package/dist/tui-esm/components/commerce/WorkroomCard.js.map +1 -0
  242. package/dist/tui-esm/components/commerce/common.js +71 -0
  243. package/dist/tui-esm/components/commerce/common.js.map +1 -0
  244. package/dist/tui-esm/components/commerce/index.js +27 -0
  245. package/dist/tui-esm/components/commerce/index.js.map +1 -0
  246. package/dist/tui-esm/index.js +55 -0
  247. package/dist/tui-esm/index.js.map +1 -0
  248. package/dist/tui-esm/kernel.js +734 -0
  249. package/dist/tui-esm/kernel.js.map +1 -0
  250. package/dist/tui-esm/render-inline.js +32 -0
  251. package/dist/tui-esm/render-inline.js.map +1 -0
  252. package/dist/tui-esm/useChat.js +91 -0
  253. package/dist/tui-esm/useChat.js.map +1 -0
  254. package/dist/tui-esm/useCommand.js +142 -0
  255. package/dist/tui-esm/useCommand.js.map +1 -0
  256. package/dist/tui-esm/useNotifications.js +17 -0
  257. package/dist/tui-esm/useNotifications.js.map +1 -0
  258. package/dist/tui-esm/useScroll.js +46 -0
  259. package/dist/tui-esm/useScroll.js.map +1 -0
  260. package/dist/tui-esm/useTerminalSize.js +32 -0
  261. package/dist/tui-esm/useTerminalSize.js.map +1 -0
  262. package/dist/ui/banner.d.ts.map +1 -1
  263. package/dist/ui/banner.js +46 -2
  264. package/dist/ui/banner.js.map +1 -1
  265. package/hermes/DELIVERY-SPEC.md +219 -0
  266. package/hermes/HERMES-INTEGRATION-SPEC.md +338 -0
  267. package/hermes/plugins/arc402_hermes/__init__.py +5 -0
  268. package/hermes/plugins/arc402_hermes/plugin.py +489 -0
  269. package/hermes/plugins/arc402_hermes/py.typed +0 -0
  270. package/hermes/plugins/arc402_hermes.egg-info/PKG-INFO +24 -0
  271. package/hermes/plugins/arc402_hermes.egg-info/SOURCES.txt +10 -0
  272. package/hermes/plugins/arc402_hermes.egg-info/dependency_links.txt +1 -0
  273. package/hermes/plugins/arc402_hermes.egg-info/entry_points.txt +2 -0
  274. package/hermes/plugins/arc402_hermes.egg-info/requires.txt +5 -0
  275. package/hermes/plugins/arc402_hermes.egg-info/top_level.txt +1 -0
  276. package/hermes/plugins/arc402_plugin.py +489 -0
  277. package/hermes/plugins/dist/arc402_hermes-1.0.0-py3-none-any.whl +0 -0
  278. package/hermes/plugins/dist/arc402_hermes-1.0.0.tar.gz +0 -0
  279. package/hermes/plugins/pyproject.toml +47 -0
  280. package/hermes/skills/arc402-agent/SKILL.md +559 -0
  281. package/hermes/workroom/README.md +174 -0
  282. package/hermes/workroom/hermes-daemon.toml +21 -0
  283. package/hermes/workroom/hermes-worker/IDENTITY.md +44 -0
  284. package/hermes/workroom/hermes-worker/SOUL.md +45 -0
  285. package/hermes/workroom/hermes-worker/config.json +32 -0
  286. package/hermes/workroom/hermes-worker/datasets/.gitkeep +0 -0
  287. package/hermes/workroom/hermes-worker/knowledge/.gitkeep +0 -0
  288. package/hermes/workroom/hermes-worker/memory/learnings.md +9 -0
  289. package/hermes/workroom/hermes-worker/skills/.gitkeep +0 -0
  290. package/package.json +9 -3
  291. package/README.md +0 -288
@@ -0,0 +1,179 @@
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
+ const render_inline_1 = require("../tui/render-inline");
47
+ const command_renderers_1 = require("../tui/command-renderers");
48
+ function readConfiguredWallet() {
49
+ if (fs.existsSync(config_2.DAEMON_TOML)) {
50
+ try {
51
+ const wallet = (0, config_2.loadDaemonConfig)().wallet.contract_address.trim();
52
+ if (wallet)
53
+ return wallet;
54
+ }
55
+ catch {
56
+ // Ignore invalid daemon config here and fall back to CLI config.
57
+ }
58
+ }
59
+ if ((0, config_1.configExists)()) {
60
+ try {
61
+ return (0, config_1.loadConfig)().walletContractAddress?.trim() || undefined;
62
+ }
63
+ catch {
64
+ // Ignore invalid CLI config and fall back to unknown.
65
+ }
66
+ }
67
+ return undefined;
68
+ }
69
+ function renderDaemonGuidance(target) {
70
+ if (target.mode !== "local") {
71
+ console.log("Next steps:");
72
+ console.log(" 1. Confirm the remote daemon URL is correct and reachable.");
73
+ console.log(" 2. Re-run `arc402 chat --setup` if you want to switch back to a local node.");
74
+ return;
75
+ }
76
+ console.log("Next steps:");
77
+ if (!fs.existsSync(config_2.DAEMON_TOML)) {
78
+ console.log(" 1. Run `arc402 daemon init` or `arc402 setup` to create ~/.arc402/daemon.toml.");
79
+ console.log(" 2. Fill in wallet + node settings, then start the node with `arc402 daemon start`.");
80
+ }
81
+ else {
82
+ console.log(" 1. Start the local node with `arc402 daemon start`.");
83
+ console.log(" 2. If it exits immediately, inspect `arc402 daemon logs` for the startup guidance.");
84
+ }
85
+ console.log(" 3. Run `arc402 chat --setup` and choose Remote if this machine should not host the node.");
86
+ }
87
+ async function renderOperatorSummary(options = {}) {
88
+ const target = (0, commerce_client_1.resolveChatDaemonTarget)({ explicitBaseUrl: options.baseUrl });
89
+ const heading = options.heading ?? { type: "title", text: "◈ ARC-402 status" };
90
+ if (heading.type === "upgrade") {
91
+ console.log(chalk_1.default.bold(`◈ Upgraded from ${heading.from} → ${heading.to}`));
92
+ }
93
+ else {
94
+ console.log(chalk_1.default.bold(heading.text));
95
+ }
96
+ try {
97
+ const [health, wallet, workroom, agreements] = await Promise.all([
98
+ (0, commerce_client_1.fetchDaemonHealth)({ baseUrl: target.baseUrl }),
99
+ (0, commerce_client_1.fetchDaemonWalletStatus)({ baseUrl: target.baseUrl }),
100
+ (0, commerce_client_1.fetchDaemonWorkroomStatus)({ baseUrl: target.baseUrl }),
101
+ (0, commerce_client_1.fetchDaemonAgreements)({ baseUrl: target.baseUrl }),
102
+ ]);
103
+ if ((0, render_inline_1.isTuiRenderMode)()) {
104
+ const active = agreements.agreements.filter((agreement) => {
105
+ const status = String((agreement.status ?? agreement.state ?? "")).toLowerCase();
106
+ return status.includes("accept") || status.includes("active") || status.includes("proposed");
107
+ }).length;
108
+ const pendingVerification = agreements.agreements.filter((agreement) => {
109
+ const status = String((agreement.status ?? agreement.state ?? "")).toLowerCase();
110
+ return status.includes("verify") || status.includes("pending");
111
+ }).length;
112
+ const disputed = agreements.agreements.filter((agreement) => String((agreement.status ?? agreement.state ?? "")).toLowerCase().includes("disput")).length;
113
+ await (0, command_renderers_1.printStatusCard)({
114
+ wallet: wallet.wallet,
115
+ network: `chain ${wallet.chainId}`,
116
+ balance: target.mode === "local" ? target.baseUrl : `${target.mode} · ${target.baseUrl}`,
117
+ endpoint: wallet.rpcUrl,
118
+ agreements: { active, pendingVerification, disputed },
119
+ workroom: { status: workroom.status },
120
+ status: { label: health.ok ? "online" : "offline", tone: health.ok ? "success" : "danger" },
121
+ });
122
+ return;
123
+ }
124
+ console.log(` Wallet: ${wallet.wallet}`);
125
+ console.log(` Daemon: ${health.ok ? chalk_1.default.green("online") : chalk_1.default.red("offline")} (${wallet.daemonId})`);
126
+ console.log(` Workroom: ${workroom.status}`);
127
+ console.log(` Node: ${target.mode} (${target.baseUrl})`);
128
+ console.log(` Chain: ${wallet.chainId} via ${wallet.rpcUrl}`);
129
+ console.log(` Agreements ${agreements.agreements.length}`);
130
+ return;
131
+ }
132
+ catch (error) {
133
+ const message = error instanceof Error ? error.message : String(error);
134
+ const fallbackWallet = readConfiguredWallet();
135
+ const daemonState = target.mode === "local"
136
+ ? fs.existsSync(config_2.DAEMON_TOML)
137
+ ? "configured locally but not responding"
138
+ : "not configured on this machine"
139
+ : "remote node unreachable";
140
+ if ((0, render_inline_1.isTuiRenderMode)()) {
141
+ await (0, command_renderers_1.printStatusCard)({
142
+ wallet: fallbackWallet ?? "not configured",
143
+ network: `${target.mode} node`,
144
+ balance: target.baseUrl,
145
+ endpoint: message,
146
+ workroom: { status: "waiting for daemon context" },
147
+ status: { label: daemonState, tone: "warning" },
148
+ });
149
+ if (options.includeGuidance ?? true) {
150
+ console.log("");
151
+ renderDaemonGuidance(target);
152
+ }
153
+ return;
154
+ }
155
+ console.log(` Wallet: ${fallbackWallet ?? "not configured"}`);
156
+ console.log(` Daemon: ${chalk_1.default.yellow(daemonState)}`);
157
+ console.log(` Workroom: waiting for daemon context`);
158
+ console.log(` Node: ${target.mode} (${target.baseUrl})`);
159
+ console.log(` Detail: ${message}`);
160
+ if (options.includeGuidance ?? true) {
161
+ console.log("");
162
+ renderDaemonGuidance(target);
163
+ }
164
+ }
165
+ }
166
+ function registerStatusCommand(program) {
167
+ program
168
+ .command("status")
169
+ .description("Show top-level operator status for the configured node")
170
+ .option("--daemon-url <url>", "Override the daemon API base URL")
171
+ .action(async (opts) => {
172
+ await renderOperatorSummary({
173
+ baseUrl: opts.daemonUrl,
174
+ heading: { type: "title", text: "◈ ARC-402 status" },
175
+ includeGuidance: true,
176
+ });
177
+ });
178
+ }
179
+ //# 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;AAwEpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAicnE"}
@@ -0,0 +1,465 @@
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.registerSubscriptionCommands = registerSubscriptionCommands;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const readline = __importStar(require("readline"));
42
+ const ethers_1 = require("ethers");
43
+ const commerce_client_1 = require("../commerce-client");
44
+ const render_inline_1 = require("../tui/render-inline");
45
+ const command_renderers_1 = require("../tui/command-renderers");
46
+ const config_1 = require("../config");
47
+ const client_1 = require("../client");
48
+ const wallet_router_1 = require("../wallet-router");
49
+ const SUBSCRIPTION_AGREEMENT_ABI = [
50
+ "function subscribe(address provider, string planId, uint256 months, address token) payable returns (bytes32)",
51
+ "function cancel(bytes32 subscriptionId) external",
52
+ "function topup(bytes32 subscriptionId, uint256 months) payable external",
53
+ "function getSubscription(bytes32 id) external view returns (tuple(address subscriber, address provider, string planId, uint256 ratePerMonth, address token, uint256 startTime, uint256 endTime, bool active))",
54
+ "function getSubscriptions(address subscriber) external view returns (bytes32[])",
55
+ "function getPlan(address provider, string planId) external view returns (tuple(string planId, uint256 ratePerMonth, address token, bool active))",
56
+ ];
57
+ function outputScaffold(action, payload, opts) {
58
+ const response = {
59
+ action,
60
+ ...payload,
61
+ };
62
+ if (opts.json) {
63
+ console.log(JSON.stringify(response, null, 2));
64
+ return;
65
+ }
66
+ console.log(chalk_1.default.bold(`◈ ${action}`));
67
+ console.log("");
68
+ for (const [key, value] of Object.entries(response)) {
69
+ console.log(` ${key.padEnd(16)} ${String(value)}`);
70
+ }
71
+ }
72
+ function noContract() {
73
+ console.log(chalk_1.default.yellow(" Subscription contract not configured. Add subscriptionAgreementAddress to ~/.arc402/config.json"));
74
+ }
75
+ async function confirm(question) {
76
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
77
+ return new Promise((resolve) => {
78
+ rl.question(question, (answer) => {
79
+ rl.close();
80
+ resolve(answer.trim().toLowerCase() === "y");
81
+ });
82
+ });
83
+ }
84
+ function getContract(address, provider) {
85
+ return new ethers_1.ethers.Contract(address, SUBSCRIPTION_AGREEMENT_ABI, provider);
86
+ }
87
+ function registerSubscriptionCommands(program) {
88
+ program
89
+ .command("subscribe")
90
+ .description("Inspect a commerce endpoint and create a SubscriptionAgreement on-chain")
91
+ .argument("<endpoint>", "Endpoint that may expose x402/subscription headers")
92
+ .option("--plan <id>", "Desired plan identifier")
93
+ .option("--months <n>", "Requested subscription duration", "1")
94
+ .option("--json", "Output as JSON")
95
+ .action(async (endpoint, opts) => {
96
+ const config = (0, config_1.loadConfig)();
97
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(endpoint);
98
+ const planId = opts.plan ?? inspection.subscription?.plan ?? "unspecified";
99
+ const months = Number.parseInt(opts.months, 10);
100
+ const rateLabel = inspection.subscription?.rate ?? inspection.x402?.amount ?? "n/a";
101
+ if (!opts.json && (0, render_inline_1.isTuiRenderMode)()) {
102
+ await (0, command_renderers_1.printSubscribeCard)({
103
+ provider: endpoint,
104
+ planId,
105
+ rateLabel,
106
+ months,
107
+ paymentOptions: inspection.paymentOptions,
108
+ accessSummary: [
109
+ inspection.subscription?.endpoint ?? endpoint,
110
+ inspection.x402?.description ?? "read-only scaffold",
111
+ ],
112
+ status: {
113
+ label: inspection.paymentRequired ? "payment required" : "inspect",
114
+ tone: inspection.paymentRequired ? "warning" : "info",
115
+ },
116
+ });
117
+ }
118
+ else {
119
+ outputScaffold("Subscribe", {
120
+ endpoint,
121
+ requestedPlan: planId,
122
+ months,
123
+ paymentOptions: inspection.paymentOptions.join(", ") || "none advertised",
124
+ x402Amount: inspection.x402?.amount ?? "n/a",
125
+ subscriptionRate: rateLabel,
126
+ }, opts);
127
+ }
128
+ // On-chain subscribe if plan given and contract configured
129
+ if (!opts.plan)
130
+ return;
131
+ if (!config.subscriptionAgreementAddress) {
132
+ noContract();
133
+ return;
134
+ }
135
+ // Parse rate to ETH value for confirmation
136
+ const rateEth = rateLabel.replace(/[^0-9.]/g, "");
137
+ const totalEth = rateEth ? (parseFloat(rateEth) * months).toFixed(6) : "?";
138
+ if (!opts.json) {
139
+ const ok = await confirm(`\n Subscribe to plan "${planId}" for ${totalEth} ETH (${months} month${months > 1 ? "s" : ""})? (y/n) `);
140
+ if (!ok) {
141
+ console.log(chalk_1.default.gray(" Cancelled."));
142
+ return;
143
+ }
144
+ }
145
+ try {
146
+ const { signer, address } = await (0, client_1.requireSigner)(config);
147
+ const value = rateEth ? ethers_1.ethers.parseEther((parseFloat(rateEth) * months).toFixed(18)) : 0n;
148
+ const tx = await (0, wallet_router_1.executeContractWriteViaWallet)(config.walletContractAddress ?? address, signer, config.subscriptionAgreementAddress, SUBSCRIPTION_AGREEMENT_ABI, "subscribe", [endpoint, planId, BigInt(months), ethers_1.ethers.ZeroAddress], value);
149
+ const receipt = await tx.wait();
150
+ if (opts.json) {
151
+ console.log(JSON.stringify({ txHash: tx.hash, blockNumber: receipt?.blockNumber }, null, 2));
152
+ }
153
+ else {
154
+ console.log(chalk_1.default.green(`\n ✓ Subscribed — tx: ${tx.hash}`));
155
+ }
156
+ }
157
+ catch (err) {
158
+ const msg = err instanceof Error ? err.message : String(err);
159
+ if (opts.json) {
160
+ console.log(JSON.stringify({ error: msg }, null, 2));
161
+ }
162
+ else {
163
+ console.log(chalk_1.default.red(` ✗ Error: ${msg}`));
164
+ }
165
+ }
166
+ });
167
+ const subscription = program
168
+ .command("subscription")
169
+ .description("SubscriptionAgreement lifecycle (Spec 46 §7)");
170
+ subscription
171
+ .command("status")
172
+ .argument("<id>", "Subscription id")
173
+ .option("--json", "Output as JSON")
174
+ .action(async (id, opts) => {
175
+ const config = (0, config_1.loadConfig)();
176
+ if (!config.subscriptionAgreementAddress) {
177
+ noContract();
178
+ return;
179
+ }
180
+ try {
181
+ const { signer, address } = await (0, client_1.requireSigner)(config);
182
+ const contract = getContract(config.subscriptionAgreementAddress, signer.provider);
183
+ const sub = await contract.getSubscription(id);
184
+ const data = {
185
+ id,
186
+ subscriber: sub.subscriber,
187
+ provider: sub.provider,
188
+ planId: sub.planId,
189
+ ratePerMonth: ethers_1.ethers.formatEther(sub.ratePerMonth) + " ETH",
190
+ token: sub.token,
191
+ startTime: new Date(Number(sub.startTime) * 1000).toISOString(),
192
+ endTime: new Date(Number(sub.endTime) * 1000).toISOString(),
193
+ active: sub.active,
194
+ };
195
+ if (opts.json) {
196
+ console.log(JSON.stringify(data, null, 2));
197
+ return;
198
+ }
199
+ if ((0, render_inline_1.isTuiRenderMode)()) {
200
+ await (0, command_renderers_1.printSubscribeCard)({
201
+ provider: sub.provider,
202
+ planId: sub.planId,
203
+ rateLabel: ethers_1.ethers.formatEther(sub.ratePerMonth) + " ETH/mo",
204
+ accessSummary: [
205
+ `subscriber: ${sub.subscriber}`,
206
+ `expires: ${new Date(Number(sub.endTime) * 1000).toISOString()}`,
207
+ ],
208
+ status: { label: sub.active ? "active" : "inactive", tone: sub.active ? "success" : "warning" },
209
+ });
210
+ }
211
+ else {
212
+ outputScaffold("Subscription Status", data, opts);
213
+ }
214
+ }
215
+ catch (err) {
216
+ const msg = err instanceof Error ? err.message : String(err);
217
+ if (opts.json) {
218
+ console.log(JSON.stringify({ error: msg }, null, 2));
219
+ }
220
+ else {
221
+ console.log(chalk_1.default.red(` ✗ Error: ${msg}`));
222
+ }
223
+ }
224
+ });
225
+ subscription
226
+ .command("list")
227
+ .option("--json", "Output as JSON")
228
+ .action(async (opts) => {
229
+ const config = (0, config_1.loadConfig)();
230
+ if (!config.subscriptionAgreementAddress) {
231
+ noContract();
232
+ return;
233
+ }
234
+ try {
235
+ const { signer, address } = await (0, client_1.requireSigner)(config);
236
+ const contract = getContract(config.subscriptionAgreementAddress, signer.provider);
237
+ const ids = await contract.getSubscriptions(address);
238
+ const subs = await Promise.all(ids.map(async (id) => {
239
+ const sub = await contract.getSubscription(id);
240
+ return {
241
+ id,
242
+ provider: sub.provider,
243
+ planId: sub.planId,
244
+ ratePerMonth: ethers_1.ethers.formatEther(sub.ratePerMonth) + " ETH",
245
+ endTime: new Date(Number(sub.endTime) * 1000).toISOString(),
246
+ active: sub.active,
247
+ };
248
+ }));
249
+ if (opts.json) {
250
+ console.log(JSON.stringify(subs, null, 2));
251
+ return;
252
+ }
253
+ console.log(chalk_1.default.bold("◈ Subscriptions"));
254
+ console.log("");
255
+ if (subs.length === 0) {
256
+ console.log(" No active subscriptions.");
257
+ return;
258
+ }
259
+ for (const s of subs) {
260
+ console.log(` ${chalk_1.default.cyan(s.id.slice(0, 12))}… plan=${s.planId} rate=${s.ratePerMonth} expires=${s.endTime} ${s.active ? chalk_1.default.green("active") : chalk_1.default.gray("inactive")}`);
261
+ }
262
+ }
263
+ catch (err) {
264
+ const msg = err instanceof Error ? err.message : String(err);
265
+ if (opts.json) {
266
+ console.log(JSON.stringify({ error: msg }, null, 2));
267
+ }
268
+ else {
269
+ console.log(chalk_1.default.red(` ✗ Error: ${msg}`));
270
+ }
271
+ }
272
+ });
273
+ subscription
274
+ .command("cancel")
275
+ .argument("<id>", "Subscription id")
276
+ .option("--json", "Output as JSON")
277
+ .action(async (id, opts) => {
278
+ const config = (0, config_1.loadConfig)();
279
+ if (!config.subscriptionAgreementAddress) {
280
+ noContract();
281
+ return;
282
+ }
283
+ if (!opts.json) {
284
+ const ok = await confirm(` Cancel subscription ${id}? (y/n) `);
285
+ if (!ok) {
286
+ console.log(chalk_1.default.gray(" Cancelled."));
287
+ return;
288
+ }
289
+ }
290
+ try {
291
+ const { signer, address } = await (0, client_1.requireSigner)(config);
292
+ const tx = await (0, wallet_router_1.executeContractWriteViaWallet)(config.walletContractAddress ?? address, signer, config.subscriptionAgreementAddress, SUBSCRIPTION_AGREEMENT_ABI, "cancel", [id]);
293
+ const receipt = await tx.wait();
294
+ if (opts.json) {
295
+ console.log(JSON.stringify({ txHash: tx.hash, blockNumber: receipt?.blockNumber }, null, 2));
296
+ }
297
+ else {
298
+ console.log(chalk_1.default.green(` ✓ Cancelled — tx: ${tx.hash}`));
299
+ }
300
+ }
301
+ catch (err) {
302
+ const msg = err instanceof Error ? err.message : String(err);
303
+ if (opts.json) {
304
+ console.log(JSON.stringify({ error: msg }, null, 2));
305
+ }
306
+ else {
307
+ console.log(chalk_1.default.red(` ✗ Error: ${msg}`));
308
+ }
309
+ }
310
+ });
311
+ subscription
312
+ .command("topup")
313
+ .argument("<id>", "Subscription id")
314
+ .requiredOption("--months <n>", "Additional months to purchase")
315
+ .option("--json", "Output as JSON")
316
+ .action(async (id, opts) => {
317
+ const config = (0, config_1.loadConfig)();
318
+ if (!config.subscriptionAgreementAddress) {
319
+ noContract();
320
+ return;
321
+ }
322
+ const months = Number.parseInt(opts.months, 10);
323
+ if (!opts.json) {
324
+ // Fetch current rate for confirmation message
325
+ let rateLabel = "?";
326
+ try {
327
+ const { signer, address } = await (0, client_1.requireSigner)(config);
328
+ const contract = getContract(config.subscriptionAgreementAddress, signer.provider);
329
+ const sub = await contract.getSubscription(id);
330
+ const totalEth = parseFloat(ethers_1.ethers.formatEther(sub.ratePerMonth)) * months;
331
+ rateLabel = totalEth.toFixed(6) + " ETH";
332
+ }
333
+ catch {
334
+ // ignore, proceed without rate
335
+ }
336
+ const ok = await confirm(` Top up ${months} month${months > 1 ? "s" : ""} for ~${rateLabel}? (y/n) `);
337
+ if (!ok) {
338
+ console.log(chalk_1.default.gray(" Cancelled."));
339
+ return;
340
+ }
341
+ }
342
+ try {
343
+ const { signer, address } = await (0, client_1.requireSigner)(config);
344
+ // Determine value from current subscription rate
345
+ let value = 0n;
346
+ try {
347
+ const contract = getContract(config.subscriptionAgreementAddress, signer.provider);
348
+ const sub = await contract.getSubscription(id);
349
+ value = BigInt(sub.ratePerMonth) * BigInt(months);
350
+ }
351
+ catch {
352
+ // if we can't fetch rate, send 0 and let contract revert if needed
353
+ }
354
+ const tx = await (0, wallet_router_1.executeContractWriteViaWallet)(config.walletContractAddress ?? address, signer, config.subscriptionAgreementAddress, SUBSCRIPTION_AGREEMENT_ABI, "topup", [id, BigInt(months)], value);
355
+ const receipt = await tx.wait();
356
+ if (opts.json) {
357
+ console.log(JSON.stringify({ txHash: tx.hash, blockNumber: receipt?.blockNumber }, null, 2));
358
+ }
359
+ else {
360
+ console.log(chalk_1.default.green(` ✓ Topped up ${months} month${months > 1 ? "s" : ""} — tx: ${tx.hash}`));
361
+ }
362
+ }
363
+ catch (err) {
364
+ const msg = err instanceof Error ? err.message : String(err);
365
+ if (opts.json) {
366
+ console.log(JSON.stringify({ error: msg }, null, 2));
367
+ }
368
+ else {
369
+ console.log(chalk_1.default.red(` ✗ Error: ${msg}`));
370
+ }
371
+ }
372
+ });
373
+ const plan = program
374
+ .command("plan")
375
+ .description("Provider-side subscription plan scaffolding (Spec 46 §7)");
376
+ plan
377
+ .command("create")
378
+ .requiredOption("--plan-id <id>", "Plan identifier")
379
+ .requiredOption("--rate <ethPerMonth>", "Monthly rate in ETH")
380
+ .option("--json", "Output as JSON")
381
+ .action(async (opts) => {
382
+ outputScaffold("Plan Create", {
383
+ planId: opts.planId,
384
+ rate: opts.rate,
385
+ note: "Create command is staged for a future SubscriptionAgreement write adapter.",
386
+ }, opts);
387
+ });
388
+ plan
389
+ .command("list")
390
+ .argument("[endpoint]", "Optional endpoint to inspect for advertised plan headers")
391
+ .option("--json", "Output as JSON")
392
+ .action(async (endpoint, opts) => {
393
+ if (endpoint) {
394
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(endpoint);
395
+ outputScaffold("Plan List", {
396
+ endpoint,
397
+ advertisedPlan: inspection.subscription?.plan ?? "n/a",
398
+ advertisedRate: inspection.subscription?.rate ?? "n/a",
399
+ paymentOptions: inspection.paymentOptions.join(", ") || "none advertised",
400
+ }, opts);
401
+ return;
402
+ }
403
+ outputScaffold("Plan List", { note: "Provider plan listing requires a concrete storage/query source." }, opts);
404
+ });
405
+ const x402 = program
406
+ .command("x402")
407
+ .description("x402 bridge inspection helpers (Spec 46 §7)");
408
+ x402
409
+ .command("inspect")
410
+ .argument("<url>", "HTTP endpoint expected to emit 402 payment headers")
411
+ .option("--json", "Output as JSON")
412
+ .action(async (url, opts) => {
413
+ const inspection = await (0, commerce_client_1.inspectCommerceEndpoint)(url);
414
+ if (opts.json) {
415
+ console.log(JSON.stringify(inspection, null, 2));
416
+ return;
417
+ }
418
+ console.log(chalk_1.default.bold("◈ x402 Inspect"));
419
+ console.log("");
420
+ console.log(` ${"url".padEnd(16)} ${inspection.url}`);
421
+ console.log(` ${"status".padEnd(16)} ${inspection.status}`);
422
+ console.log(` ${"paymentRequired".padEnd(16)} ${inspection.paymentRequired}`);
423
+ console.log(` ${"options".padEnd(16)} ${inspection.paymentOptions.join(", ") || "none"}`);
424
+ console.log(` ${"receiver".padEnd(16)} ${inspection.x402?.receiver ?? "n/a"}`);
425
+ console.log(` ${"amount".padEnd(16)} ${inspection.x402?.amount ?? "n/a"}`);
426
+ console.log(` ${"subscription".padEnd(16)} ${inspection.subscription?.plan ?? "n/a"}`);
427
+ });
428
+ x402
429
+ .command("issue")
430
+ .description("Fetch a newsletter issue and surface typed x402/subscription responses")
431
+ .requiredOption("--base-url <url>", "Daemon base URL")
432
+ .requiredOption("--newsletter <id>", "Newsletter id")
433
+ .requiredOption("--issue <hash>", "Issue content hash")
434
+ .option("--signer <address>", "Subscriber wallet")
435
+ .option("--signature <sig>", "EIP-191 signature for the issue access message")
436
+ .option("--api-token <token>", "Daemon bearer token for local automation")
437
+ .option("--json", "Output as JSON")
438
+ .action(async (opts) => {
439
+ const result = await (0, commerce_client_1.fetchNewsletterIssue)(opts.baseUrl, opts.newsletter, opts.issue, {
440
+ signer: opts.signer,
441
+ signature: opts.signature,
442
+ apiToken: opts.apiToken,
443
+ });
444
+ if (opts.json) {
445
+ console.log(JSON.stringify({
446
+ ...result,
447
+ accessMessage: (0, commerce_client_1.buildNewsletterAccessMessage)(opts.newsletter, opts.issue),
448
+ }, null, 2));
449
+ return;
450
+ }
451
+ console.log(chalk_1.default.bold("◈ x402 Issue Fetch"));
452
+ console.log("");
453
+ console.log(` ${"status".padEnd(16)} ${result.status}`);
454
+ console.log(` ${"contentType".padEnd(16)} ${result.contentType ?? "n/a"}`);
455
+ console.log(` ${"paymentRequired".padEnd(16)} ${result.paymentRequired}`);
456
+ console.log(` ${"plan".padEnd(16)} ${result.subscription?.plan ?? "n/a"}`);
457
+ console.log(` ${"amount".padEnd(16)} ${result.x402?.amount ?? "n/a"}`);
458
+ console.log(` ${"signMessage".padEnd(16)} ${(0, commerce_client_1.buildNewsletterAccessMessage)(opts.newsletter, opts.issue)}`);
459
+ if (result.body) {
460
+ console.log("");
461
+ console.log(result.body);
462
+ }
463
+ });
464
+ }
465
+ //# sourceMappingURL=subscription.js.map