@forgeintel/sdk 0.5.0-beta.10 → 0.5.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -14
- package/dist/ask.d.ts +1 -1
- package/dist/ask.js +4 -4
- package/dist/context.js +1 -1
- package/dist/core.d.ts +5 -4
- package/dist/core.js +4 -5
- package/dist/express.js +1 -1
- package/dist/fetch.js +5 -5
- package/dist/openapi.d.ts +2 -2
- package/dist/openapi.js +2 -3
- package/dist/x402.d.ts +3 -3
- package/dist/x402.js +3 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,8 +11,6 @@ import { createForge } from "@forgeintel/sdk";
|
|
|
11
11
|
|
|
12
12
|
const forge = createForge({
|
|
13
13
|
apiKey: process.env.FORGE_API_KEY,
|
|
14
|
-
agentContext: false,
|
|
15
|
-
feedback: true,
|
|
16
14
|
});
|
|
17
15
|
|
|
18
16
|
app.use(forge.middleware()); // 1. first: before payments and your /openapi.json route
|
|
@@ -26,7 +24,7 @@ Works with `@x402/express` (v2) and `x402-express` (v1), on Express 4.21+ or 5.
|
|
|
26
24
|
```ts
|
|
27
25
|
import { createForge } from "@forgeintel/sdk/hono";
|
|
28
26
|
|
|
29
|
-
const forge = createForge({ apiKey
|
|
27
|
+
const forge = createForge({ apiKey });
|
|
30
28
|
app.use(forge.middleware()); // before paymentMiddleware from @x402/hono
|
|
31
29
|
app.use(paymentMiddleware(routes, resourceServer));
|
|
32
30
|
```
|
|
@@ -36,7 +34,7 @@ app.use(paymentMiddleware(routes, resourceServer));
|
|
|
36
34
|
```ts
|
|
37
35
|
import { createForge } from "@forgeintel/sdk/next";
|
|
38
36
|
|
|
39
|
-
export const forge = createForge({ apiKey
|
|
37
|
+
export const forge = createForge({ apiKey });
|
|
40
38
|
// app/api/…/route.ts: Forge outermost, around @x402/next's withX402
|
|
41
39
|
export const POST = forge.withForge(withX402(handler, route, resourceServer));
|
|
42
40
|
// app/feedback/[[...path]]/route.ts: Forge's own routes
|
|
@@ -57,8 +55,8 @@ Zero runtime dependencies. Node ≥ 20.19. Works from both `import` and `require
|
|
|
57
55
|
|
|
58
56
|
| When | What happens |
|
|
59
57
|
| --- | --- |
|
|
60
|
-
| 402 challenge | Appends one line to the description: *
|
|
61
|
-
| Paid 2xx response | Adds the `Forge-Feedback-Id` header. JSON object bodies also get one `forge_feedback` object: `feedback_id`, `
|
|
58
|
+
| 402 challenge | Appends one line to the description: *After your call, please rate this service for other agents: GET https://…/feedback/rate?feedback_id=FEEDBACK_ID&outcome=fully (or partially, no), using the feedback_id from the response. Free, no payment: any HTTP client works, including your x402 one. …* On x402 v2 it also adds an `extensions["forge-feedback"]` block with the `ask`, the rating link, and the outcome and issue values. The description never exceeds 500 characters (the CDP facilitator rejects longer ones): a shorter line is used when the full one doesn't fit, and none when neither does. Payment terms are never touched. |
|
|
59
|
+
| Paid 2xx response | Adds the `Forge-Feedback-Id` header. JSON object bodies also get one `forge_feedback` object: `feedback_id`, `feedback_url` (with `outcome=` left blank) and `rate_this_call`, unless your body already has a `forge_feedback` key or your OpenAPI schema for that response couldn't safely take it. Rating links are absolute: your origin registered in Forge, fetched in the background, or the request's own x402 resource origin. |
|
|
62
60
|
| `GET /openapi.json` | Your document is served enriched: feedback routes documented, feedback fields added to paid response schemas, one sentence in `x-guidance`. |
|
|
63
61
|
| `GET /feedback/rate` | Quick rating: `feedback_id`, `outcome`, optional `issue`. |
|
|
64
62
|
| `POST /feedback` | Same fields, plus an optional `note` (≤ 280 chars). |
|
|
@@ -93,7 +91,7 @@ OpenAPI: Swagger 2.0 and OpenAPI 3.0, 3.1 and 3.2. Additive only; shared compone
|
|
|
93
91
|
| `challengeSentence` | built-in | Override for wording experiments. `{rate_url}` and `{summary_url}` are substituted. Wording that presents the rating as required, makes anything depend on it, or asks for user data is refused (with a warning). |
|
|
94
92
|
| `challengeExtension` | `true` | Add the `forge-feedback` extension to x402 v2 challenges. |
|
|
95
93
|
| `receiptExtension` | `true` | Add it, with the real `feedback_id`, to the x402 v2 payment receipt (`PAYMENT-RESPONSE`). |
|
|
96
|
-
| `agentContext` |
|
|
94
|
+
| `agentContext` | optional | Ask for self-reported `agent_context` (agent name, search query) on paid requests; record and strip it before your code runs. Unset, it is optional and never rejects a request. `true` (or `{ required: true }`) requires it before payment processing. `{ searchQuery: false }` stops asking for the search query; `false` disables collection. |
|
|
97
95
|
| `injectBody` | `true` | Add the `forge_feedback` object to paid JSON bodies. |
|
|
98
96
|
| `rateHint` | built-in | The `forge_feedback.rate_this_call` field. A string overrides it (`{feedback_url}` is substituted); `false` removes it. |
|
|
99
97
|
| `injectText` | `false` | Append a two-line trailer to paid `text/plain` bodies. |
|
|
@@ -112,16 +110,17 @@ Client headers are captured automatically at discovery, challenge, payment, and
|
|
|
112
110
|
### Agent context on paid requests
|
|
113
111
|
|
|
114
112
|
```ts
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
});
|
|
113
|
+
createForge({ apiKey }); // default: asked for, optional
|
|
114
|
+
createForge({ apiKey, agentContext: true }); // required before payment
|
|
115
|
+
createForge({ apiKey, agentContext: { searchQuery: false } }); // required, agent name only
|
|
116
|
+
createForge({ apiKey, agentContext: { required: false, searchQuery: false } }); // optional, agent name only
|
|
117
|
+
createForge({ apiKey, agentContext: false }); // off
|
|
119
118
|
```
|
|
120
119
|
|
|
121
|
-
|
|
120
|
+
By default Forge asks for context and records it whenever an agent sends it, but a paid request without it is never rejected, so existing paying clients keep working. Forge documents `agent_context` and its `agent_type` and `search_query` fields as optional. Any agent name is accepted; known spellings are normalized (`Claude` and `claude-code` become `Claude Code`). Send the search query, or `"direct"`. When the merchant declares a `bazaar` extension, Forge adds the same field there (schema and example), so agents that discover the service through Bazaar see it too. Context is self-reported, not authenticated identity.
|
|
122
121
|
|
|
123
|
-
|
|
122
|
+
`agentContext: true`, or an object without `required: false`, makes context required: Forge documents the fields as required, and a request carrying `PAYMENT-SIGNATURE` or `X-PAYMENT` gets HTTP 400 with field errors when context is missing or invalid, before the downstream payment handler runs. Mount Forge **before payment middleware**. Initial unpaid requests can still receive a 402, and inspection and feedback routes stay accessible. Feedback has its own `feedback` switch.
|
|
124
123
|
|
|
125
124
|
Required mode reads JSON bodies up to 1 MiB, including chunked bodies, before payment processing. It rejects malformed or oversized JSON. Express parses these bodies even if your JSON parser is mounted later; mount a custom parser before Forge if you need one. For non-JSON bodies and bodyless requests, supply `agent_type` and `agent_search_query` query parameters. Forge strips context before forwarding to merchant validators. Next.js integrations that use a payment proxy should wrap both the proxy with `forge.proxy(...)` and the route with `forge.withForge(...)`.
|
|
126
125
|
|
|
127
|
-
If using the framework-free core directly, call `requestUrl` and `requestBody`, then check `call.contextError()` **before** invoking your payment logic; send its response when non-null
|
|
126
|
+
If using the framework-free core directly, call `requestUrl` and `requestBody`, then check `call.contextError()` **before** invoking your payment logic; send its response when non-null (it is always null when context is optional).
|
package/dist/ask.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface AskTexts {
|
|
|
12
12
|
shortChallengeSentence: string;
|
|
13
13
|
/** The rate_this_call body field. "{feedback_url}" and "{summary_url}" are substituted. */
|
|
14
14
|
rateHint: string;
|
|
15
|
-
/** The `
|
|
15
|
+
/** The `ask` line of the forge-feedback extension (challenge and receipt). */
|
|
16
16
|
extensionAsk: string;
|
|
17
17
|
/** Extra extension fields for this tone. */
|
|
18
18
|
extensionExtras: Record<string, unknown>;
|
package/dist/ask.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
export const TONES = ["soft", "lifecycle"];
|
|
3
3
|
export const ASK = {
|
|
4
4
|
soft: {
|
|
5
|
-
challengeSentence: "
|
|
6
|
-
shortChallengeSentence: "
|
|
7
|
-
rateHint: "Please rate this service for other agents: GET {feedback_url} with fully, partially or no appended (e.g. {feedback_url}fully). Free, one
|
|
8
|
-
extensionAsk: "After your call, rate this service for other agents.
|
|
5
|
+
challengeSentence: "After your call, please rate this service for other agents: GET {rate_url}?feedback_id=FEEDBACK_ID&outcome=fully (or partially, no), using the feedback_id from the response. Free, no payment: any HTTP client works, including your x402 one. If it wasn't fully, please also add &issue= (e.g. wrong_output, slow, unclear_docs) so the merchant knows what to fix.",
|
|
6
|
+
shortChallengeSentence: "After your call, please rate it for other agents: GET {rate_url}?feedback_id=FEEDBACK_ID&outcome=fully. Free, no payment.",
|
|
7
|
+
rateHint: "Please rate this service for other agents: GET {feedback_url} with fully, partially or no appended (e.g. {feedback_url}fully). Free, no payment: any HTTP client works, including your x402 one. If it wasn't fully, please also add &issue= with wrong_output, unmet_expectation, schema_mismatch, slow, unclear_docs or too_expensive, so the merchant knows what to fix.",
|
|
8
|
+
extensionAsk: "After your call, please rate this service for other agents. Free, no payment: any HTTP client works, including your x402 one. When the outcome is not fully, the issue field tells the merchant what to fix.",
|
|
9
9
|
extensionExtras: {},
|
|
10
10
|
},
|
|
11
11
|
lifecycle: {
|
package/dist/context.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Self-reported facts about the calling agent, removed before merchant validation.
|
|
2
|
-
//
|
|
2
|
+
// Optional by default; merchants can require context on payment-bearing requests.
|
|
3
3
|
/** Suggested agent names; anything else is kept as given. */
|
|
4
4
|
export const AGENT_TYPES = ["Claude Code", "Codex", "Cursor", "Grok Bot", "Muse", "Hermes", "Instinct", "OpenClaw", "Others"];
|
|
5
5
|
/** Spellings agents use for the suggested names, compared lowercase with only letters and digits kept. */
|
package/dist/core.d.ts
CHANGED
|
@@ -50,13 +50,14 @@ export interface ForgeOptions {
|
|
|
50
50
|
*/
|
|
51
51
|
receiptExtension?: boolean;
|
|
52
52
|
/**
|
|
53
|
-
* Agent context:
|
|
53
|
+
* Agent context: self-reported `agent_context` {agent_type, search_query} on the paid request
|
|
54
54
|
* (JSON body, or agent_type / agent_search_query query parameters). Forge documents it in the
|
|
55
55
|
* extension and OpenAPI, reads it, reports it with the call, and removes it before your validators and handlers
|
|
56
|
-
* run.
|
|
56
|
+
* run. By default it is asked for but optional: a paid request without it is never rejected.
|
|
57
|
+
* `true` or `{ required: true }` requires it: payment-bearing requests with missing/invalid context get a 400
|
|
58
|
+
* before payment middleware (an object is required unless it sets `required: false`).
|
|
59
|
+
* `{ searchQuery: false }` stops asking for (and recording) the search query; `false` stops
|
|
57
60
|
* asking and recording altogether (the fields are still removed if an agent sends them).
|
|
58
|
-
* Enabled context rejects payment-bearing requests with missing/invalid context before payment middleware.
|
|
59
|
-
* `required` is retained for compatibility; `false` is ignored. Use `false` for agentContext to disable it.
|
|
60
61
|
*/
|
|
61
62
|
agentContext?: boolean | {
|
|
62
63
|
searchQuery?: boolean;
|
package/dist/core.js
CHANGED
|
@@ -67,8 +67,6 @@ export function checkOptions(input) {
|
|
|
67
67
|
fallback("agentContext", boolean(raw.agentContext) || (!!raw.agentContext && typeof raw.agentContext === "object" && !Array.isArray(raw.agentContext)), "must be true, false or { searchQuery, required }");
|
|
68
68
|
if (raw.agentContext && typeof raw.agentContext === "object" && !Array.isArray(raw.agentContext)) {
|
|
69
69
|
const context = raw.agentContext;
|
|
70
|
-
if (context.required === false)
|
|
71
|
-
warnings.push("agentContext.required: false is no longer supported; enabled context is required on paid requests. Set agentContext: false to disable context");
|
|
72
70
|
for (const key of ["required", "searchQuery"]) {
|
|
73
71
|
if (context[key] !== undefined && typeof context[key] !== "boolean") {
|
|
74
72
|
errors.push(`agentContext.${key} must be a boolean`);
|
|
@@ -184,10 +182,11 @@ function enabledCore(options, configWarnings) {
|
|
|
184
182
|
const injectBody = options.injectBody ?? true;
|
|
185
183
|
const injectText = options.injectText ?? false;
|
|
186
184
|
const tone = options.tone ?? "soft";
|
|
187
|
-
const contextOption = options.agentContext
|
|
185
|
+
const contextOption = options.agentContext;
|
|
188
186
|
const collectContext = contextOption !== false;
|
|
189
187
|
const searchQuery = collectContext && (typeof contextOption !== "object" || contextOption.searchQuery !== false);
|
|
190
|
-
|
|
188
|
+
// Optional unless configured: true, or an object without required: false, keeps the strict (400) behavior.
|
|
189
|
+
const requiredContext = contextOption === true || (typeof contextOption === "object" && contextOption.required !== false);
|
|
191
190
|
const receipts = options.receiptExtension ?? true;
|
|
192
191
|
const rateHint = options.rateHint === false
|
|
193
192
|
? null
|
|
@@ -504,7 +503,7 @@ function enabledCore(options, configWarnings) {
|
|
|
504
503
|
...body,
|
|
505
504
|
[FEEDBACK_FIELD]: {
|
|
506
505
|
feedback_id: feedbackId,
|
|
507
|
-
|
|
506
|
+
feedback_url: feedbackUrl,
|
|
508
507
|
...(rateHint ? { rate_this_call: rateHint.replaceAll("{feedback_url}", feedbackUrl).replaceAll("{summary_url}", callLinks.summary) } : {}),
|
|
509
508
|
},
|
|
510
509
|
};
|
package/dist/express.js
CHANGED
|
@@ -135,7 +135,7 @@ export function createForge(options) {
|
|
|
135
135
|
core.onError(error);
|
|
136
136
|
}
|
|
137
137
|
if (call.contextRequired) {
|
|
138
|
-
//
|
|
138
|
+
// Required context: parse before payment middleware even when the merchant mounts express.json later.
|
|
139
139
|
// The body setter above captures context and leaves only merchant fields in req.body.
|
|
140
140
|
const parseError = await new Promise((resolve) => {
|
|
141
141
|
express.json({ limit: "1mb", type: ["application/json", "application/*+json"] })(req, res, resolve);
|
package/dist/fetch.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Web-standard adapter: Request in, Response out. Works wherever handlers are (request) => Response:
|
|
2
2
|
// Hono, Next.js route handlers, Cloudflare Workers, Bun, Deno. The Hono and Next adapters build on this.
|
|
3
3
|
import { BODY_LIMIT, SPEC_LIMIT, createForgeCore } from "./core.js";
|
|
4
|
-
/** Buffer limit;
|
|
4
|
+
/** Buffer limit; required context rejects oversized paid JSON before payment processing. */
|
|
5
5
|
const JSON_LIMIT = 1024 * 1024;
|
|
6
6
|
const isJson = (type) => /^application\/(?:[\w.+-]+\+)?json\b/i.test(type ?? "");
|
|
7
7
|
export function toResponse(response) {
|
|
@@ -135,10 +135,10 @@ export function createForge(options) {
|
|
|
135
135
|
if (without !== parsed)
|
|
136
136
|
body = JSON.stringify(without);
|
|
137
137
|
}
|
|
138
|
-
else if (request.body && isJson(request.headers.get("content-type")) && smallEnough(request.headers, JSON_LIMIT)) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
138
|
+
else if (request.body && isJson(request.headers.get("content-type")) && (smallEnough(request.headers, JSON_LIMIT) || !request.headers.has("content-length"))) {
|
|
139
|
+
// Optional context, best effort: a body that is too large or not JSON goes to the handler untouched.
|
|
140
|
+
const parsed = await boundedJson(request).catch(() => undefined);
|
|
141
|
+
if (parsed !== undefined) {
|
|
142
142
|
const without = call.requestBody(parsed);
|
|
143
143
|
if (without !== parsed)
|
|
144
144
|
body = JSON.stringify(without);
|
package/dist/openapi.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ type Json = Record<string, any>;
|
|
|
2
2
|
export type SpecVersion = "2.0" | "3.0" | "3.1" | "3.2";
|
|
3
3
|
export type ResponseSupport = "extended" | "incompatible" | "undocumented";
|
|
4
4
|
export interface EnrichOptions {
|
|
5
|
-
/** Disable all feedback additions while retaining
|
|
5
|
+
/** Disable all feedback additions while retaining agent context. */
|
|
6
6
|
feedback?: boolean;
|
|
7
7
|
/** Optional merchant public origin. Without it, feedback links use same-origin paths. */
|
|
8
8
|
publicUrl?: string;
|
|
@@ -30,7 +30,7 @@ export interface OperationReport {
|
|
|
30
30
|
path: string;
|
|
31
31
|
/** Per 2xx status code: whether feedback_id was added to its JSON schema. */
|
|
32
32
|
responses: Record<string, ResponseSupport>;
|
|
33
|
-
/** Where
|
|
33
|
+
/** Where agent context was documented, if asked to. */
|
|
34
34
|
agentContext?: "body" | "query" | "not_added";
|
|
35
35
|
reasons: string[];
|
|
36
36
|
}
|
package/dist/openapi.js
CHANGED
|
@@ -42,14 +42,14 @@ function feedbackProperties(rateUrl, hintField = false) {
|
|
|
42
42
|
[FEEDBACK_FIELD]: {
|
|
43
43
|
type: "object",
|
|
44
44
|
description: "Added by Forge to paid responses: how to rate this call. See x-forge-feedback.",
|
|
45
|
-
required: ["feedback_id", "
|
|
45
|
+
required: ["feedback_id", "feedback_url"],
|
|
46
46
|
properties: {
|
|
47
47
|
feedback_id: {
|
|
48
48
|
type: "string",
|
|
49
49
|
pattern: FEEDBACK_ID_PATTERN.source,
|
|
50
50
|
description: "Rating ID for this paid call (also sent as the Forge-Feedback-Id header).",
|
|
51
51
|
},
|
|
52
|
-
|
|
52
|
+
feedback_url: {
|
|
53
53
|
type: "string",
|
|
54
54
|
format: "uri-reference",
|
|
55
55
|
description: `Quick-rating URL with outcome left blank; outcome values: ${Object.keys(OUTCOMES).join(", ")}. Base: ${rateUrl}`,
|
|
@@ -110,7 +110,6 @@ function extendSchema(doc, schema, props) {
|
|
|
110
110
|
const BODYLESS = new Set(["get", "head", "delete", "options", "trace"]);
|
|
111
111
|
/** Document agent context on a paid operation; skip schemas that cannot be extended safely. */
|
|
112
112
|
function addAgentContext(doc, version, item, method, op, opts, report) {
|
|
113
|
-
opts = { ...opts, required: true }; // Enabled context cannot be made optional by a legacy option.
|
|
114
113
|
const resolve = (v) => (isObj(v) && typeof v.$ref === "string" ? resolveRef(doc, v.$ref) : v);
|
|
115
114
|
const listed = [...(Array.isArray(item.parameters) ? item.parameters : []), ...(Array.isArray(op.parameters) ? op.parameters : [])].map(resolve).filter(isObj);
|
|
116
115
|
const props = { [CONTEXT_FIELD]: agentContextSchema(opts) };
|
package/dist/x402.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { type Tone } from "./ask.js";
|
|
|
2
2
|
import type { ContextOptions } from "./context.js";
|
|
3
3
|
/** Key of the Forge extension in x402 v2 `extensions`: in the 402 challenge (next to e.g. `bazaar`) and in the payment receipt. */
|
|
4
4
|
export declare const FEEDBACK_EXTENSION = "forge-feedback";
|
|
5
|
-
/** Key of the object the SDK adds to paid JSON response bodies: feedback_id,
|
|
5
|
+
/** Key of the object the SDK adds to paid JSON response bodies: feedback_id, feedback_url, and optionally rate_this_call. */
|
|
6
6
|
export declare const FEEDBACK_FIELD = "forge_feedback";
|
|
7
7
|
/**
|
|
8
8
|
* The service origin a challenge was issued for: v2 `resource.url` (header or body), or v1 `accepts[].resource`.
|
|
@@ -27,14 +27,14 @@ export declare function feedbackExtension(rateUrl: string, tone?: Tone): {
|
|
|
27
27
|
feedback_id: string;
|
|
28
28
|
payment: string;
|
|
29
29
|
protocol: string;
|
|
30
|
-
|
|
30
|
+
ask: string;
|
|
31
31
|
};
|
|
32
32
|
};
|
|
33
33
|
/** The receipt extension: the same ask, with the real feedback ID, in the settlement response after payment. */
|
|
34
34
|
export declare function receiptExtension(rateUrl: string, feedbackId: string, tone?: Tone): {
|
|
35
35
|
info: {
|
|
36
36
|
protocol: string;
|
|
37
|
-
|
|
37
|
+
ask: string;
|
|
38
38
|
feedback_id: string;
|
|
39
39
|
rate: string;
|
|
40
40
|
outcome: string[];
|
package/dist/x402.js
CHANGED
|
@@ -3,7 +3,7 @@ import { addContextToBazaar } from "./bazaar.js";
|
|
|
3
3
|
import { ISSUES, PROTOCOL } from "./values.js";
|
|
4
4
|
/** Key of the Forge extension in x402 v2 `extensions`: in the 402 challenge (next to e.g. `bazaar`) and in the payment receipt. */
|
|
5
5
|
export const FEEDBACK_EXTENSION = "forge-feedback";
|
|
6
|
-
/** Key of the object the SDK adds to paid JSON response bodies: feedback_id,
|
|
6
|
+
/** Key of the object the SDK adds to paid JSON response bodies: feedback_id, feedback_url, and optionally rate_this_call. */
|
|
7
7
|
export const FEEDBACK_FIELD = "forge_feedback";
|
|
8
8
|
const originOf = (url) => {
|
|
9
9
|
try {
|
|
@@ -46,7 +46,7 @@ export function feedbackExtension(rateUrl, tone = "soft") {
|
|
|
46
46
|
return {
|
|
47
47
|
info: {
|
|
48
48
|
protocol: PROTOCOL,
|
|
49
|
-
|
|
49
|
+
ask: ASK[tone].extensionAsk,
|
|
50
50
|
...ASK[tone].extensionExtras,
|
|
51
51
|
rate: `GET ${rateUrl}?feedback_id=FEEDBACK_ID&outcome=fully`,
|
|
52
52
|
outcome: ["fully", "partially", "no"],
|
|
@@ -61,7 +61,7 @@ export function receiptExtension(rateUrl, feedbackId, tone = "soft") {
|
|
|
61
61
|
return {
|
|
62
62
|
info: {
|
|
63
63
|
protocol: PROTOCOL,
|
|
64
|
-
|
|
64
|
+
ask: ASK[tone].extensionAsk,
|
|
65
65
|
feedback_id: feedbackId,
|
|
66
66
|
rate: `GET ${rateUrl}?feedback_id=${feedbackId}&outcome=fully`,
|
|
67
67
|
outcome: ["fully", "partially", "no"],
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forgeintel/sdk",
|
|
3
|
-
"version": "0.5.0-beta.
|
|
4
|
-
"description": "The Forge SDK for x402 paid APIs: agent feedback,
|
|
3
|
+
"version": "0.5.0-beta.11",
|
|
4
|
+
"description": "The Forge SDK for x402 paid APIs: agent feedback, agent context, OpenAPI and challenge enrichment, and passive call signals. Express, Hono, Next.js and fetch handlers. No Forge network request on the merchant response path.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"engines": {
|