@stellar-agent-services/provider-kit 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +506 -2
  3. package/dist/approve/assets/index-BazIJAI2.css +1 -0
  4. package/dist/approve/assets/index-CL28cSJy.js +420 -0
  5. package/dist/approve/favicon.svg +1 -0
  6. package/dist/approve/index.html +18 -0
  7. package/dist/cli/approval-view.d.ts +80 -0
  8. package/dist/cli/approval-view.d.ts.map +1 -0
  9. package/dist/cli/approval-view.js +5 -0
  10. package/dist/cli/approval-view.js.map +1 -0
  11. package/dist/cli/approval.d.ts +132 -0
  12. package/dist/cli/approval.d.ts.map +1 -0
  13. package/dist/cli/approval.js +542 -0
  14. package/dist/cli/approval.js.map +1 -0
  15. package/dist/cli/check.d.ts +3 -0
  16. package/dist/cli/check.d.ts.map +1 -0
  17. package/dist/cli/check.js +137 -0
  18. package/dist/cli/check.js.map +1 -0
  19. package/dist/cli/dev-account.d.ts +28 -0
  20. package/dist/cli/dev-account.d.ts.map +1 -0
  21. package/dist/cli/dev-account.js +62 -0
  22. package/dist/cli/dev-account.js.map +1 -0
  23. package/dist/cli/dev.d.ts +27 -0
  24. package/dist/cli/dev.d.ts.map +1 -0
  25. package/dist/cli/dev.js +226 -0
  26. package/dist/cli/dev.js.map +1 -0
  27. package/dist/cli/discovery.d.ts +20 -0
  28. package/dist/cli/discovery.d.ts.map +1 -0
  29. package/dist/cli/discovery.js +202 -0
  30. package/dist/cli/discovery.js.map +1 -0
  31. package/dist/cli/env-file.d.ts +16 -0
  32. package/dist/cli/env-file.d.ts.map +1 -0
  33. package/dist/cli/env-file.js +77 -0
  34. package/dist/cli/env-file.js.map +1 -0
  35. package/dist/cli/fly.d.ts +28 -0
  36. package/dist/cli/fly.d.ts.map +1 -0
  37. package/dist/cli/fly.js +92 -0
  38. package/dist/cli/fly.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +11 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/cli/init.d.ts +3 -0
  44. package/dist/cli/init.d.ts.map +1 -0
  45. package/dist/cli/init.js +170 -0
  46. package/dist/cli/init.js.map +1 -0
  47. package/dist/cli/launch.d.ts +21 -0
  48. package/dist/cli/launch.d.ts.map +1 -0
  49. package/dist/cli/launch.js +627 -0
  50. package/dist/cli/launch.js.map +1 -0
  51. package/dist/cli/main.d.ts +2 -0
  52. package/dist/cli/main.d.ts.map +1 -0
  53. package/dist/cli/main.js +158 -0
  54. package/dist/cli/main.js.map +1 -0
  55. package/dist/cli/owner-chain.d.ts +88 -0
  56. package/dist/cli/owner-chain.d.ts.map +1 -0
  57. package/dist/cli/owner-chain.js +284 -0
  58. package/dist/cli/owner-chain.js.map +1 -0
  59. package/dist/cli/owner-steps.d.ts +33 -0
  60. package/dist/cli/owner-steps.d.ts.map +1 -0
  61. package/dist/cli/owner-steps.js +121 -0
  62. package/dist/cli/owner-steps.js.map +1 -0
  63. package/dist/cli/processes.d.ts +47 -0
  64. package/dist/cli/processes.d.ts.map +1 -0
  65. package/dist/cli/processes.js +129 -0
  66. package/dist/cli/processes.js.map +1 -0
  67. package/dist/cli/reconcile.d.ts +3 -0
  68. package/dist/cli/reconcile.d.ts.map +1 -0
  69. package/dist/cli/reconcile.js +76 -0
  70. package/dist/cli/reconcile.js.map +1 -0
  71. package/dist/cli/register.d.ts +9 -0
  72. package/dist/cli/register.d.ts.map +1 -0
  73. package/dist/cli/register.js +209 -0
  74. package/dist/cli/register.js.map +1 -0
  75. package/dist/cli/request-validation.d.ts +5 -0
  76. package/dist/cli/request-validation.d.ts.map +1 -0
  77. package/dist/cli/request-validation.js +144 -0
  78. package/dist/cli/request-validation.js.map +1 -0
  79. package/dist/cli/serve.d.ts +25 -0
  80. package/dist/cli/serve.d.ts.map +1 -0
  81. package/dist/cli/serve.js +73 -0
  82. package/dist/cli/serve.js.map +1 -0
  83. package/dist/cli/shared.d.ts +142 -0
  84. package/dist/cli/shared.d.ts.map +1 -0
  85. package/dist/cli/shared.js +110 -0
  86. package/dist/cli/shared.js.map +1 -0
  87. package/dist/cli/status.d.ts +32 -0
  88. package/dist/cli/status.d.ts.map +1 -0
  89. package/dist/cli/status.js +248 -0
  90. package/dist/cli/status.js.map +1 -0
  91. package/dist/cli/target.d.ts +14 -0
  92. package/dist/cli/target.d.ts.map +1 -0
  93. package/dist/cli/target.js +43 -0
  94. package/dist/cli/target.js.map +1 -0
  95. package/dist/cli/trustline.d.ts +3 -0
  96. package/dist/cli/trustline.d.ts.map +1 -0
  97. package/dist/cli/trustline.js +114 -0
  98. package/dist/cli/trustline.js.map +1 -0
  99. package/dist/cli/try.d.ts +54 -0
  100. package/dist/cli/try.d.ts.map +1 -0
  101. package/dist/cli/try.js +448 -0
  102. package/dist/cli/try.js.map +1 -0
  103. package/dist/cli/tunnel.d.ts +13 -0
  104. package/dist/cli/tunnel.d.ts.map +1 -0
  105. package/dist/cli/tunnel.js +43 -0
  106. package/dist/cli/tunnel.js.map +1 -0
  107. package/dist/cli/validators.d.ts +6 -0
  108. package/dist/cli/validators.d.ts.map +1 -0
  109. package/dist/cli/validators.js +14 -0
  110. package/dist/cli/validators.js.map +1 -0
  111. package/dist/define-service.d.ts +71 -0
  112. package/dist/define-service.d.ts.map +1 -0
  113. package/dist/define-service.js +86 -0
  114. package/dist/define-service.js.map +1 -0
  115. package/dist/gateway/config.d.ts +88 -0
  116. package/dist/gateway/config.d.ts.map +1 -0
  117. package/dist/gateway/config.js +201 -0
  118. package/dist/gateway/config.js.map +1 -0
  119. package/dist/gateway/openapi.d.ts +69 -0
  120. package/dist/gateway/openapi.d.ts.map +1 -0
  121. package/dist/gateway/openapi.js +677 -0
  122. package/dist/gateway/openapi.js.map +1 -0
  123. package/dist/gateway/upstream.d.ts +15 -0
  124. package/dist/gateway/upstream.d.ts.map +1 -0
  125. package/dist/gateway/upstream.js +95 -0
  126. package/dist/gateway/upstream.js.map +1 -0
  127. package/dist/http/bounded.d.ts +3 -0
  128. package/dist/http/bounded.d.ts.map +1 -0
  129. package/dist/http/bounded.js +23 -0
  130. package/dist/http/bounded.js.map +1 -0
  131. package/dist/http/node-server.d.ts +15 -0
  132. package/dist/http/node-server.d.ts.map +1 -0
  133. package/dist/http/node-server.js +120 -0
  134. package/dist/http/node-server.js.map +1 -0
  135. package/dist/http/rate-limit.d.ts +11 -0
  136. package/dist/http/rate-limit.d.ts.map +1 -0
  137. package/dist/http/rate-limit.js +35 -0
  138. package/dist/http/rate-limit.js.map +1 -0
  139. package/dist/http/router.d.ts +29 -0
  140. package/dist/http/router.d.ts.map +1 -0
  141. package/dist/http/router.js +329 -0
  142. package/dist/http/router.js.map +1 -0
  143. package/dist/index.d.ts +20 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +31 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/jobs/memory-store.d.ts +3 -0
  148. package/dist/jobs/memory-store.d.ts.map +1 -0
  149. package/dist/jobs/memory-store.js +121 -0
  150. package/dist/jobs/memory-store.js.map +1 -0
  151. package/dist/jobs/reconcile.d.ts +22 -0
  152. package/dist/jobs/reconcile.d.ts.map +1 -0
  153. package/dist/jobs/reconcile.js +82 -0
  154. package/dist/jobs/reconcile.js.map +1 -0
  155. package/dist/jobs/recovery.d.ts +19 -0
  156. package/dist/jobs/recovery.d.ts.map +1 -0
  157. package/dist/jobs/recovery.js +65 -0
  158. package/dist/jobs/recovery.js.map +1 -0
  159. package/dist/jobs/runner.d.ts +38 -0
  160. package/dist/jobs/runner.d.ts.map +1 -0
  161. package/dist/jobs/runner.js +194 -0
  162. package/dist/jobs/runner.js.map +1 -0
  163. package/dist/jobs/scheduler.d.ts +66 -0
  164. package/dist/jobs/scheduler.d.ts.map +1 -0
  165. package/dist/jobs/scheduler.js +197 -0
  166. package/dist/jobs/scheduler.js.map +1 -0
  167. package/dist/jobs/sqlite-store.d.ts +8 -0
  168. package/dist/jobs/sqlite-store.d.ts.map +1 -0
  169. package/dist/jobs/sqlite-store.js +231 -0
  170. package/dist/jobs/sqlite-store.js.map +1 -0
  171. package/dist/jobs/store.d.ts +118 -0
  172. package/dist/jobs/store.d.ts.map +1 -0
  173. package/dist/jobs/store.js +36 -0
  174. package/dist/jobs/store.js.map +1 -0
  175. package/dist/manifest.d.ts +11 -0
  176. package/dist/manifest.d.ts.map +1 -0
  177. package/dist/manifest.js +99 -0
  178. package/dist/manifest.js.map +1 -0
  179. package/dist/payments/chain.d.ts +23 -0
  180. package/dist/payments/chain.d.ts.map +1 -0
  181. package/dist/payments/chain.js +108 -0
  182. package/dist/payments/chain.js.map +1 -0
  183. package/dist/payments/facilitator.d.ts +44 -0
  184. package/dist/payments/facilitator.d.ts.map +1 -0
  185. package/dist/payments/facilitator.js +125 -0
  186. package/dist/payments/facilitator.js.map +1 -0
  187. package/dist/payments/onchain.d.ts +36 -0
  188. package/dist/payments/onchain.d.ts.map +1 -0
  189. package/dist/payments/onchain.js +191 -0
  190. package/dist/payments/onchain.js.map +1 -0
  191. package/dist/payments/payload-checks.d.ts +22 -0
  192. package/dist/payments/payload-checks.d.ts.map +1 -0
  193. package/dist/payments/payload-checks.js +113 -0
  194. package/dist/payments/payload-checks.js.map +1 -0
  195. package/dist/payments/settlement.d.ts +22 -0
  196. package/dist/payments/settlement.d.ts.map +1 -0
  197. package/dist/payments/settlement.js +65 -0
  198. package/dist/payments/settlement.js.map +1 -0
  199. package/dist/payments/x402-server.d.ts +8 -0
  200. package/dist/payments/x402-server.d.ts.map +1 -0
  201. package/dist/payments/x402-server.js +74 -0
  202. package/dist/payments/x402-server.js.map +1 -0
  203. package/dist/provider.d.ts +63 -0
  204. package/dist/provider.d.ts.map +1 -0
  205. package/dist/provider.js +177 -0
  206. package/dist/provider.js.map +1 -0
  207. package/dist/registration.d.ts +86 -0
  208. package/dist/registration.d.ts.map +1 -0
  209. package/dist/registration.js +162 -0
  210. package/dist/registration.js.map +1 -0
  211. package/dist/testing.d.ts +13 -0
  212. package/dist/testing.d.ts.map +1 -0
  213. package/dist/testing.js +48 -0
  214. package/dist/testing.js.map +1 -0
  215. package/dist/validation-request.d.ts +36 -0
  216. package/dist/validation-request.d.ts.map +1 -0
  217. package/dist/validation-request.js +101 -0
  218. package/dist/validation-request.js.map +1 -0
  219. package/package.json +55 -4
  220. package/schemas/gateway-config.schema.json +140 -0
@@ -0,0 +1,209 @@
1
+ // provider-kit register: puts the provider in the Stellar 8004 identity registry, or updates its
2
+ // registration (docs/provider-standard.md §7).
3
+ //
4
+ // The registration file names the manifest [I1]. It goes on chain as a data: URI when it fits in
5
+ // 8 KiB, or as --agent-uri, an HTTPS URL where you host it (--out writes the file).
6
+ //
7
+ // Who signs:
8
+ // - By default the developer's own wallet, on a local approval page (cli/approval.ts). A new agent is
9
+ // registered from the payTo account: the registry makes the registering account the agent's owner and
10
+ // its wallet, so [I3] holds at once. A payTo without a USDC trustline gets one first [P2], and a new
11
+ // testnet account gets test XLM. An update is signed by the agent's owner, or an address it approved.
12
+ // - With --source, a key in the Stellar CLI keychain (https://developers.stellar.org/docs/tools/cli), for
13
+ // scripts and CI. With an owner other than payTo, set_agent_wallet needs both the owner's and the payTo
14
+ // account's signatures, so the command is printed for a tool that can collect them.
15
+ // This command never sees a secret either way. A new agent's id is saved to the --config file [I2].
16
+ import { readFile, rename, writeFile } from "node:fs/promises";
17
+ import { stellarAddressKind } from "@stellar-agent-services/protocol";
18
+ import { mayActFor, registrationDataUri, registrationFile, registryConfig } from "../registration.js";
19
+ import { ApprovalError, describeOutcome } from "./approval.js";
20
+ import { explorerUrl, networkName, shortAddress } from "./owner-chain.js";
21
+ import { accountSteps, registerStep } from "./owner-steps.js";
22
+ import { ownerIo, quote, UsageError } from "./shared.js";
23
+ import { loadTarget } from "./target.js";
24
+ export async function register(flags, io = ownerIo(flags)) {
25
+ const target = await loadTarget(flags);
26
+ if ("problems" in target) {
27
+ console.error(`The provider would not pass Provider Standard v1 checks, so it is not registered:\n${target.problems.map((problem) => ` ✗ ${problem}`).join("\n")}`);
28
+ return 1;
29
+ }
30
+ const { manifest, manifestUrl } = target;
31
+ const { network, payTo } = manifest.payment.accepts[0];
32
+ if (manifestUrl.startsWith("http://"))
33
+ throw new Error("a dev-mode provider (http://localhost) can't be registered: deploy it on HTTPS first");
34
+ const file = registrationFile(manifest, manifestUrl);
35
+ if (flags.out !== undefined)
36
+ await writeFile(flags.out, `${JSON.stringify(file, null, 2)}\n`);
37
+ let agentUri = flags["agent-uri"];
38
+ if (agentUri === undefined) {
39
+ try {
40
+ agentUri = registrationDataUri(file);
41
+ }
42
+ catch {
43
+ throw new Error("the registration file is over 8 KiB: host it at an HTTPS URL (--out writes it) and pass --agent-uri <url>");
44
+ }
45
+ }
46
+ else if (!agentUri.startsWith("https://")) {
47
+ throw new UsageError("--agent-uri must be an https:// URL");
48
+ }
49
+ console.log(`Registration file [I1]:\n${JSON.stringify(file, null, 2)}\n`);
50
+ const registration = { manifest, manifestUrl, network, payTo, agentUri };
51
+ const signed = flags.source === undefined ? await withWallet(flags, io, registration) : await withStellarCli(flags, io, registration);
52
+ if (signed.agentId !== undefined)
53
+ await saveNewAgentId(flags, signed.agentId);
54
+ return signed.code;
55
+ }
56
+ /** The developer's own wallet signs, on the local approval page. */
57
+ async function withWallet(flags, io, { manifest, manifestUrl, network, payTo, agentUri }) {
58
+ const agentId = manifest.provider.agentId;
59
+ if (flags["dry-run"]) {
60
+ const method = agentId === undefined ? "register_with_uri" : "set_agent_uri";
61
+ console.log(`Dry run. Without --dry-run, a page opens where your wallet signs ${method} on ${network}. Nothing was signed.`);
62
+ return { code: 0 };
63
+ }
64
+ if (agentId === undefined && stellarAddressKind(payTo) !== "account") {
65
+ console.error(`payTo ${payTo} is a contract, which can't sign the registration in a wallet. Register with --source <owner key>, then set the agent wallet to payTo [I3].`);
66
+ return { code: 1 };
67
+ }
68
+ const registry = io.registry(network, flags.rpc);
69
+ const chain = io.chain(network, flags.rpc);
70
+ const owner = agentId === undefined ? payTo : await registry.agentOwner(agentId);
71
+ if (owner === undefined) {
72
+ console.error(`Agent ${agentId} does not exist in the ${network} identity registry [I2]. To register a new agent, remove provider.agentId.`);
73
+ return { code: 1 };
74
+ }
75
+ const name = manifest.provider.name;
76
+ const identity = registryConfig(network).contracts.identity;
77
+ let registered;
78
+ const plan = {
79
+ command: "provider-kit register",
80
+ title: agentId === undefined ? "Register your service" : "Update your registration",
81
+ intro: agentId === undefined
82
+ ? `Add ${name} to the Stellar 8004 identity registry, so agents can find it and check whom they pay.`
83
+ : `Point agent ${agentId}'s registration at your manifest, ${manifestUrl}.`,
84
+ network,
85
+ account: agentId === undefined
86
+ ? { address: payTo, label: "Payout account", reason: "The account your service is paid to (payTo). Registering from it makes it the agent's owner and wallet." }
87
+ : { address: owner, label: "Agent owner", reason: "Only the agent's owner, the address approved for it, or an operator of the owner's can change its registration." },
88
+ outline: [{ id: "register", title: agentId === undefined ? "Register" : "Update registration" }],
89
+ async steps(address) {
90
+ if (agentId === undefined && address !== payTo) {
91
+ throw new ApprovalError("Connect your payout account", `Your wallet connected ${shortAddress(address)}. Switch it to ${shortAddress(payTo)}, the manifest's payTo: the account that registers becomes the agent's wallet, which must be payTo [I3].`, "connect");
92
+ }
93
+ if (agentId !== undefined && !(await mayActFor(registry, agentId, owner, address))) {
94
+ throw new ApprovalError("This account can't change the registration", `Your wallet connected ${shortAddress(address)}. Switch it to agent ${agentId}'s owner, ${shortAddress(owner)}, or an address it approved.`, "connect");
95
+ }
96
+ const steps = await accountSteps(chain, address, { trustline: agentId === undefined });
97
+ steps.push(registerStep(chain, {
98
+ identity,
99
+ caller: address,
100
+ agentUri,
101
+ manifestUrl,
102
+ providerName: name,
103
+ ...(agentId === undefined ? {} : { agentId }),
104
+ onRegistered: (id) => (registered = id),
105
+ }));
106
+ return steps;
107
+ },
108
+ result() {
109
+ if (registered === undefined) {
110
+ return { title: "Registration updated", message: `Agent ${agentId} now names your manifest. Run provider-kit check to confirm.`, details: [{ label: "Agent", value: String(agentId) }] };
111
+ }
112
+ const next = flags.config === undefined ? "Add the id to your provider's config and restart it" : "provider-kit saves the id to your config: restart the provider";
113
+ return {
114
+ title: "Your service is registered",
115
+ message: `It is agent ${registered} on ${networkName(network)}. ${next}, then run provider-kit check.`,
116
+ details: [
117
+ { label: "Agent", value: String(registered) },
118
+ { label: "Owner and wallet", value: payTo, mono: true, href: explorerUrl(network, "account", payTo) },
119
+ ],
120
+ };
121
+ },
122
+ };
123
+ const outcome = await io.approve(plan, chain);
124
+ if (outcome.status !== "done") {
125
+ console.log(describeOutcome(outcome));
126
+ return { code: 1 };
127
+ }
128
+ if (registered === undefined) {
129
+ console.log(`Updated the registration of agent ${agentId} on ${network}.`);
130
+ return { code: 0 };
131
+ }
132
+ console.log(`Registered agent ${registered} on ${network}.`);
133
+ return { code: 0, agentId: registered };
134
+ }
135
+ /** --source: the Stellar CLI signs with a key from its keychain. */
136
+ async function withStellarCli(flags, io, { manifest, network, payTo, agentUri }) {
137
+ const source = flags.source;
138
+ const stellar = await io.stellar();
139
+ const owner = stellar ? (await stellar(["keys", "address", source])).trim() : `$(stellar keys address ${source})`;
140
+ const contracts = registryConfig(network).contracts;
141
+ const cliNetwork = flags.network ?? (network === "stellar:pubnet" ? "mainnet" : "testnet");
142
+ const invoke = (fn, args) => ["contract", "invoke", "--id", contracts.identity, "--source-account", source, "--network", cliNetwork, "--", fn, ...args];
143
+ const agentId = manifest.provider.agentId;
144
+ const write = agentId === undefined
145
+ ? invoke("register_with_uri", ["--caller", owner, "--agent_uri", agentUri])
146
+ : invoke("set_agent_uri", ["--caller", owner, "--agent_id", String(agentId), "--new_uri", agentUri]);
147
+ const walletNote = () => {
148
+ if (owner === payTo)
149
+ return;
150
+ console.log(`\nThe agent wallet must be payTo (${payTo}) [I3]. Setting it needs the owner's and payTo's signatures:`);
151
+ console.log(` stellar ${invoke("set_agent_wallet", ["--caller", owner, "--agent_id", String(agentId ?? "<agent id>"), "--new_wallet", payTo]).map(quote).join(" ")}`);
152
+ console.log("Registering with the payTo account as --source avoids this step.");
153
+ };
154
+ if (flags["dry-run"] || !stellar) {
155
+ if (!stellar)
156
+ console.log("The Stellar CLI (`stellar`) is not installed: https://developers.stellar.org/docs/tools/cli. Run this once it is:");
157
+ else
158
+ console.log("Dry run. This would run:");
159
+ console.log(` stellar ${write.map(quote).join(" ")}`);
160
+ walletNote();
161
+ return { code: stellar ? 0 : 1 };
162
+ }
163
+ console.log(`Signing with "${source}" (${owner}) on ${cliNetwork}...`);
164
+ const stdout = await stellar(write);
165
+ if (agentId !== undefined) {
166
+ console.log(`Updated the registration of agent ${agentId} on ${network}.`);
167
+ walletNote();
168
+ return { code: 0 };
169
+ }
170
+ const id = Number(stdout.trim().replace(/^"|"$/g, ""));
171
+ if (!Number.isInteger(id))
172
+ throw new Error(`the registry answered "${stdout.trim()}", not an agent id`);
173
+ console.log(`Registered agent ${id} on ${network}.`);
174
+ walletNote();
175
+ return { code: 0, agentId: id };
176
+ }
177
+ async function saveNewAgentId(flags, agentId) {
178
+ if (flags.config === undefined) {
179
+ console.log(`Next: add "agentId": ${agentId} to "provider" in your provider's config (AGENT_ID for the example) [I2], restart it, then run provider-kit check.`);
180
+ return;
181
+ }
182
+ if (await saveAgentId(flags.config, agentId))
183
+ console.log(`Saved "agentId": ${agentId} to ${flags.config} [I2].`);
184
+ else
185
+ console.log(`${flags.config} reads provider.agentId from the environment: set it to ${agentId} [I2].`);
186
+ console.log("Next: restart the provider, then run provider-kit check.");
187
+ }
188
+ /**
189
+ * Writes `agentId` into a gateway config's provider object, keeping the rest of the file as it was: its keys,
190
+ * their order and its indentation. False, and nothing written, when the file reads provider.agentId from the
191
+ * environment.
192
+ */
193
+ export async function saveAgentId(path, agentId) {
194
+ const text = await readFile(path, "utf8");
195
+ const config = JSON.parse(text);
196
+ const provider = config.provider;
197
+ if (typeof provider !== "object" || provider === null || Array.isArray(provider))
198
+ throw new Error(`${path} has no "provider" object`);
199
+ if (typeof provider["agentId"] === "string")
200
+ return false;
201
+ provider["agentId"] = agentId;
202
+ const indent = /^[ \t]+(?=")/m.exec(text)?.[0] ?? 2;
203
+ // Written beside the file, then renamed over it, so an interrupted write never leaves half a config.
204
+ const temporary = `${path}.${process.pid}.tmp`;
205
+ await writeFile(temporary, `${JSON.stringify(config, null, indent)}\n`);
206
+ await rename(temporary, path);
207
+ return true;
208
+ }
209
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/cli/register.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type CliFlags, type OwnerIo } from "./shared.js";
2
+ /** Where the command reaches the outside world. Tests replace it. */
3
+ export type RequestValidationIo = OwnerIo;
4
+ export declare function requestValidation(flags: CliFlags, io?: RequestValidationIo): Promise<number>;
5
+ //# sourceMappingURL=request-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-validation.d.ts","sourceRoot":"","sources":["../../src/cli/request-validation.ts"],"names":[],"mappings":"AAoBA,OAAO,EAA8B,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtF,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAU1C,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAE,mBAAoC,GAAG,OAAO,CAAC,MAAM,CAAC,CAalH"}
@@ -0,0 +1,144 @@
1
+ // provider-kit request-validation: asks a verifier to check the provider, with validation_request in the
2
+ // Stellar 8004 Validation Registry (docs/verification.md).
3
+ //
4
+ // prepareValidationRequest() runs first, so nothing is signed for a provider a verifier couldn't validate,
5
+ // an account that may not ask for the agent, or a validator that is the provider itself. The request
6
+ // document goes on chain as a data: URI.
7
+ //
8
+ // Who signs: by default the agent owner's own wallet, on a local approval page (cli/approval.ts). The account
9
+ // the wallet connects is checked as the signer before anything is built. With --source, a key in the
10
+ // Stellar CLI keychain (https://developers.stellar.org/docs/tools/cli), for scripts and CI. This command
11
+ // never sees a secret either way. Afterwards it reads the registry back to confirm the request landed, and
12
+ // prints the request hash, which the verifier's answer names.
13
+ import { writeFile } from "node:fs/promises";
14
+ import { stellarAddressKind, validationRequestBytes } from "@stellar-agent-services/protocol";
15
+ import { prepareValidationRequest, validationRequestArguments, ValidationRequestError } from "../validation-request.js";
16
+ import { ApprovalError, describeOutcome } from "./approval.js";
17
+ import { explorerUrl } from "./owner-chain.js";
18
+ import { accountSteps, validationRequestStep } from "./owner-steps.js";
19
+ import { ownerIo, quote, UsageError } from "./shared.js";
20
+ import { loadTarget } from "./target.js";
21
+ export async function requestValidation(flags, io = ownerIo(flags)) {
22
+ const { source, validator } = flags;
23
+ if (validator === undefined)
24
+ throw new UsageError("request-validation needs --validator <the verifier's G... address>");
25
+ if (stellarAddressKind(validator) !== "account")
26
+ throw new UsageError("--validator must be a G... account address");
27
+ const target = await loadTarget(flags);
28
+ if ("problems" in target) {
29
+ console.error(`The provider would not pass Provider Standard v1 checks, so no validation is requested:\n${target.problems.map((problem) => ` ✗ ${problem}`).join("\n")}`);
30
+ return 1;
31
+ }
32
+ const { manifest, manifestUrl } = target;
33
+ const network = manifest.payment.accepts[0].network;
34
+ const request = { manifest, manifestUrl, validator, network, registry: io.registry(network, flags.rpc) };
35
+ return source === undefined ? withWallet(flags, io, request) : withStellarCli(flags, io, request, source);
36
+ }
37
+ /** The agent owner's own wallet signs, on the local approval page. */
38
+ async function withWallet(flags, io, { manifest, manifestUrl, validator, network, registry }) {
39
+ // One time for the request: checking it again with the wallet's account as the signer gives the same bytes and hash.
40
+ const now = io.now();
41
+ const prepared = await prepareValidationRequest(manifest, manifestUrl, { validator, registry, now: () => now });
42
+ printRequest(prepared);
43
+ if (flags["dry-run"]) {
44
+ console.log(`\nDry run. Without --dry-run, a page opens where the agent owner's wallet signs validation_request on ${network}. Nothing was signed.`);
45
+ return 0;
46
+ }
47
+ const { agentId } = prepared.request;
48
+ const owner = await registry.agentOwner(agentId);
49
+ const chain = io.chain(network, flags.rpc);
50
+ const plan = {
51
+ command: "provider-kit request-validation",
52
+ title: "Request validation",
53
+ intro: `Ask a verifier to check ${manifest.provider.name}. Its answer goes on chain in the Stellar 8004 Validation Registry, and its receipt gives your badges.`,
54
+ network,
55
+ ...(owner === undefined
56
+ ? {}
57
+ : { account: { address: owner, label: "Agent owner", reason: "The registry takes a request only from the agent's owner, the address approved for it, or an operator of the owner's." } }),
58
+ outline: [{ id: "request-validation", title: "Request validation" }],
59
+ async steps(address) {
60
+ try {
61
+ await prepareValidationRequest(manifest, manifestUrl, { validator, registry, signer: address, now: () => now });
62
+ }
63
+ catch (error) {
64
+ if (error instanceof ValidationRequestError)
65
+ throw new ApprovalError("This account can't ask for validation", error.problems.join(" "), "connect");
66
+ throw error;
67
+ }
68
+ const steps = await accountSteps(chain, address, { trustline: false });
69
+ steps.push(validationRequestStep(chain, address, prepared));
70
+ return steps;
71
+ },
72
+ result: () => ({
73
+ title: "Validation requested",
74
+ message: "A verifier running verifier watch finds the request on chain, checks your service and answers there. provider-kit status shows its answer.",
75
+ details: [
76
+ { label: "Request hash", value: prepared.requestHash, mono: true },
77
+ { label: "Verifier", value: validator, mono: true, href: explorerUrl(network, "account", validator) },
78
+ { label: "Agent", value: String(agentId) },
79
+ ],
80
+ }),
81
+ };
82
+ const outcome = await io.approve(plan, chain);
83
+ if (outcome.status !== "done") {
84
+ console.log(describeOutcome(outcome));
85
+ return 1;
86
+ }
87
+ return confirm(flags, registry, prepared, network);
88
+ }
89
+ /** --source: the Stellar CLI signs with a key from its keychain. */
90
+ async function withStellarCli(flags, io, { manifest, manifestUrl, validator, network, registry }, source) {
91
+ const cliNetwork = flags.network ?? (network === "stellar:pubnet" ? "mainnet" : "testnet");
92
+ // The registry checks who asks by the signing key's address. Without the Stellar CLI it stays unknown,
93
+ // and the command is printed for later.
94
+ const stellar = await io.stellar();
95
+ let signer;
96
+ try {
97
+ signer = stellar === undefined ? undefined : (await stellar(["keys", "address", source])).trim();
98
+ }
99
+ catch {
100
+ signer = undefined;
101
+ }
102
+ const prepared = await prepareValidationRequest(manifest, manifestUrl, { validator, registry, now: () => io.now(), ...(signer === undefined ? {} : { signer }) });
103
+ printRequest(prepared);
104
+ const args = validationRequestArguments(prepared, { source, network: cliNetwork, caller: signer ?? `$(stellar keys address ${source})` });
105
+ const command = `stellar ${args.map(quote).join(" ")}`;
106
+ if (stellar === undefined || signer === undefined) {
107
+ console.log(stellar === undefined
108
+ ? "\nThe Stellar CLI (`stellar`) is not installed: https://developers.stellar.org/docs/tools/cli. Run this once it is:"
109
+ : `\nThe Stellar CLI could not read key "${source}". Once it can, run:`);
110
+ console.log(` ${command}`);
111
+ return 1;
112
+ }
113
+ if (flags["dry-run"]) {
114
+ console.log(`\nDry run. This would run:\n ${command}`);
115
+ return 0;
116
+ }
117
+ console.log(`\nSigning with "${source}" (${signer}) on ${cliNetwork}...`);
118
+ await stellar(args);
119
+ return confirm(flags, registry, prepared, network);
120
+ }
121
+ function printRequest(prepared) {
122
+ console.log(`Validation request:\n${JSON.stringify(prepared.request, null, 2)}\n`);
123
+ console.log(` request_hash ${prepared.requestHash}`);
124
+ console.log(` request_uri a data: URI holding the request itself (${prepared.requestUri.length} characters)`);
125
+ }
126
+ /** After sending: writes --out, then reads the registry back before telling the developer what's next. */
127
+ async function confirm(flags, registry, prepared, network) {
128
+ const { request, requestHash } = prepared;
129
+ if (flags.out !== undefined)
130
+ await writeFile(flags.out, validationRequestBytes(request));
131
+ const record = await registry.validation(requestHash);
132
+ if (record?.agentId !== request.agentId || record.validator !== request.validator) {
133
+ console.log("Sent, but the registry does not show the request yet. Look its hash up again before sending another.");
134
+ return 1;
135
+ }
136
+ console.log(`Requested: agent ${request.agentId} asks ${request.validator} for validation on ${network}.`);
137
+ if (flags.out !== undefined)
138
+ console.log(`The request document is in ${flags.out}.`);
139
+ console.log("Next: nothing to send. A verifier running `verifier watch` finds the request on chain, checks the provider and");
140
+ console.log("answers there, and provider-kit status shows its answer. A verifier working by hand answers with:");
141
+ console.log(` verifier publish <receipt.json> --request-hash ${requestHash} --response-uri <https url> --source <its key>`);
142
+ return 0;
143
+ }
144
+ //# sourceMappingURL=request-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-validation.js","sourceRoot":"","sources":["../../src/cli/request-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type Listening } from "../http/node-server.js";
2
+ import { type Provider, type ProviderConfig } from "../provider.js";
3
+ import { type CliFlags } from "./shared.js";
4
+ export interface GatewayOptions {
5
+ /** Allows http://localhost [M6]. */
6
+ dev?: boolean;
7
+ noWorkers?: boolean;
8
+ port?: number;
9
+ /** Serves under another origin than the config's, such as a tunnel's. */
10
+ baseUrl?: string;
11
+ env?: NodeJS.ProcessEnv;
12
+ /** Where the summary goes. Default: the console. */
13
+ log?: (line: string) => void;
14
+ }
15
+ export interface ServedGateway {
16
+ config: ProviderConfig;
17
+ provider: Provider;
18
+ server: Listening;
19
+ }
20
+ /** Loads and checks a gateway config, starts the provider and listens, then prints what it serves. */
21
+ export declare function serveGateway(path: string, options?: GatewayOptions): Promise<ServedGateway>;
22
+ export declare function serve(flags: CliFlags): Promise<number>;
23
+ /** On SIGTERM or SIGINT: runs `stop` once, then exits 0, or 1 when it fails. */
24
+ export declare function stopOnSignals(stop: () => Promise<unknown>, log: (line: string) => void): void;
25
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"AASA,OAAO,EAAU,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,oDAAoD;IACpD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,sGAAsG;AACtG,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BrG;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAU5D;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAgB7F"}
@@ -0,0 +1,73 @@
1
+ // provider-kit serve --config <file>: gateway mode.
2
+ //
3
+ // Loads and checks the config (failing closed), runs the startup checks, then listens. SIGTERM and
4
+ // SIGINT stop it gracefully: no new connections, requests in flight finish, the store closes. Paid
5
+ // jobs that were still queued or running resume on the next start.
6
+ //
7
+ // serveGateway() is the same start, for `provider-kit dev` and for `try` when it starts the provider itself.
8
+ import { loadGatewayConfig } from "../gateway/config.js";
9
+ import { listen } from "../http/node-server.js";
10
+ import { createProvider } from "../provider.js";
11
+ import { UsageError } from "./shared.js";
12
+ /** Loads and checks a gateway config, starts the provider and listens, then prints what it serves. */
13
+ export async function serveGateway(path, options = {}) {
14
+ const log = options.log ?? ((line) => console.log(line));
15
+ const { config, listen: where } = await loadGatewayConfig(path, {
16
+ ...(options.env === undefined ? {} : { env: options.env }),
17
+ overrides: {
18
+ ...(options.dev ? { dev: true } : {}),
19
+ ...(options.noWorkers ? { runQueuedJobs: false } : {}),
20
+ ...(options.port === undefined ? {} : { port: options.port }),
21
+ ...(options.baseUrl === undefined ? {} : { baseUrl: options.baseUrl }),
22
+ },
23
+ });
24
+ const provider = createProvider(config);
25
+ try {
26
+ await provider.ready();
27
+ }
28
+ catch (error) {
29
+ await provider.close();
30
+ throw error;
31
+ }
32
+ const server = await listen(provider, where);
33
+ log(`provider-kit: serving ${config.provider.name}`);
34
+ log(` listening ${server.url}`);
35
+ log(` manifest ${provider.manifestUrl}`);
36
+ log(` network ${config.network}, payTo ${config.payTo}`);
37
+ for (const service of provider.manifest.services) {
38
+ const usdc = Number(service.price.amount) / 1e7;
39
+ log(` service ${service.name}: ${usdc} USDC, ${service.charge}, ${service.capacity?.concurrency} at a time`);
40
+ }
41
+ if (config.dev)
42
+ log(" dev mode: http://localhost is allowed. Never use it in production.");
43
+ return { config, provider, server };
44
+ }
45
+ export async function serve(flags) {
46
+ if (flags.config === undefined)
47
+ throw new UsageError("serve needs --config <file>");
48
+ const port = flags.port === undefined ? undefined : Number(flags.port);
49
+ const { server } = await serveGateway(flags.config, {
50
+ ...(flags.dev ? { dev: true } : {}),
51
+ ...(flags["no-workers"] ? { noWorkers: true } : {}),
52
+ ...(port === undefined ? {} : { port }),
53
+ });
54
+ stopOnSignals(() => server.close(), (line) => console.log(line));
55
+ return -1;
56
+ }
57
+ /** On SIGTERM or SIGINT: runs `stop` once, then exits 0, or 1 when it fails. */
58
+ export function stopOnSignals(stop, log) {
59
+ let stopping = false;
60
+ const handle = (signal) => {
61
+ if (stopping)
62
+ return;
63
+ stopping = true;
64
+ log(`provider-kit: ${signal}, finishing requests in flight`);
65
+ stop().then(() => process.exit(0), (error) => {
66
+ console.error("provider-kit: shutdown failed:", error);
67
+ process.exit(1);
68
+ });
69
+ };
70
+ process.on("SIGTERM", () => handle("SIGTERM"));
71
+ process.on("SIGINT", () => handle("SIGINT"));
72
+ }
73
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/cli/serve.ts"],"names":[],"mappings":"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"}