@humanleg/sandbox 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.
package/README.md CHANGED
@@ -1,3 +1,8 @@
1
- # Temporary Holding Version
1
+ # @humanleg/sandbox
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ In-memory synthetic HumanLeg.ai API for local demos. It moves no funds, stores no identity data and
4
+ must not be exposed as a production service.
5
+
6
+ ```bash
7
+ npx @humanleg/sandbox
8
+ ```
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,287 @@
1
+ #!/usr/bin/env node
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { createServer, } from "node:http";
4
+ const port = Number(process.env.PORT ?? 8787);
5
+ const token = process.env.HUMANLEG_AGENT_TOKEN ?? "sandbox-agent-token";
6
+ const tasks = new Map();
7
+ const quotes = new Map();
8
+ const events = [];
9
+ function canonicalJson(value) {
10
+ if (value === null || typeof value !== "object")
11
+ return JSON.stringify(value);
12
+ if (Array.isArray(value))
13
+ return `[${value.map(canonicalJson).join(",")}]`;
14
+ const record = value;
15
+ return `{${Object.keys(record)
16
+ .sort()
17
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`)
18
+ .join(",")}}`;
19
+ }
20
+ function contentSnapshot(task) {
21
+ return {
22
+ taskId: task.id,
23
+ contentVersion: task.contentVersion,
24
+ category: task.category,
25
+ title: task.title,
26
+ instructions: task.instructions,
27
+ evidenceRequirements: task.evidenceRequirements,
28
+ rewardAtomic: task.rewardAtomic,
29
+ displayAudCents: task.displayAudCents,
30
+ deadline: task.deadline,
31
+ country: task.country,
32
+ physicalPresenceRequired: task.physicalPresenceRequired,
33
+ };
34
+ }
35
+ function reviewTask(task) {
36
+ const contentHash = createHash("sha256")
37
+ .update(canonicalJson(contentSnapshot(task)))
38
+ .digest("hex");
39
+ const text = `${task.title}\n${task.instructions}`.toLowerCase();
40
+ const prohibited = [
41
+ [
42
+ /gift[ -]?card|cash transfer|bank transfer|wire transfer/,
43
+ "P_FINANCIAL_VALUE_TRANSFER",
44
+ ],
45
+ [
46
+ /password|one[ -]?time password|\botp\b|seed phrase|private key/,
47
+ "P_CREDENTIAL_THEFT",
48
+ ],
49
+ [/phishing|impersonat(e|ion)|doxx/, "P_FRAUD_OR_HARASSMENT"],
50
+ ];
51
+ const match = prohibited.find(([pattern]) => pattern.test(text));
52
+ return {
53
+ contentHash,
54
+ complianceReview: {
55
+ id: randomUUID(),
56
+ decision: match ? "REJECT" : "APPROVE",
57
+ reasonCode: match?.[1] ?? null,
58
+ contentVersion: task.contentVersion,
59
+ contentHash,
60
+ expiresAt: new Date(Date.now() + 60 * 60 * 1000).toISOString(),
61
+ },
62
+ };
63
+ }
64
+ function json(response, status, body) {
65
+ response.writeHead(status, {
66
+ "content-type": "application/json; charset=utf-8",
67
+ "access-control-allow-origin": "*",
68
+ });
69
+ response.end(JSON.stringify(body));
70
+ }
71
+ function problem(response, status, code, detail) {
72
+ json(response, status, {
73
+ type: `https://humanleg.ai/problems/${code}`,
74
+ title: detail,
75
+ status,
76
+ code,
77
+ detail,
78
+ });
79
+ }
80
+ async function body(request) {
81
+ const chunks = [];
82
+ for await (const chunk of request)
83
+ chunks.push(Buffer.from(chunk));
84
+ if (chunks.length === 0)
85
+ return {};
86
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
87
+ }
88
+ function authenticate(request, response) {
89
+ if (request.headers.authorization !== `Bearer ${token}`) {
90
+ problem(response, 401, "unauthorized", "A valid sandbox bearer token is required.");
91
+ return false;
92
+ }
93
+ return true;
94
+ }
95
+ function requireIdempotency(request, response) {
96
+ const key = request.headers["idempotency-key"];
97
+ if (typeof key !== "string" || key.length < 8) {
98
+ problem(response, 400, "idempotency_key_required", "Idempotency-Key must be at least 8 characters.");
99
+ return false;
100
+ }
101
+ return true;
102
+ }
103
+ function emit(type, task) {
104
+ events.push({
105
+ id: randomUUID(),
106
+ type,
107
+ taskId: task.id,
108
+ at: new Date().toISOString(),
109
+ });
110
+ }
111
+ const server = createServer(async (request, response) => {
112
+ try {
113
+ const method = request.method ?? "GET";
114
+ const url = new URL(request.url ?? "/", `http://${request.headers.host ?? "localhost"}`);
115
+ if (method === "OPTIONS") {
116
+ response.writeHead(204, {
117
+ "access-control-allow-origin": "*",
118
+ "access-control-allow-headers": "authorization,content-type,idempotency-key",
119
+ "access-control-allow-methods": "GET,POST,PATCH,OPTIONS",
120
+ });
121
+ return response.end();
122
+ }
123
+ if (method === "GET" && url.pathname === "/health") {
124
+ return json(response, 200, { status: "ok", mode: "synthetic-sandbox" });
125
+ }
126
+ if (!authenticate(request, response))
127
+ return;
128
+ if (method === "POST" && url.pathname === "/v1/fee-quotes") {
129
+ if (!requireIdempotency(request, response))
130
+ return;
131
+ const input = await body(request);
132
+ const rewardAtomic = Number(input.rewardAtomic);
133
+ const displayAudCents = Number(input.displayAudCents);
134
+ if (!Number.isInteger(rewardAtomic) || rewardAtomic < 20_000_000) {
135
+ return problem(response, 422, "reward_too_low", "Sandbox reward must be at least 20 USDC.");
136
+ }
137
+ const quote = {
138
+ id: randomUUID(),
139
+ rewardAtomic,
140
+ displayAudCents,
141
+ feeAtomic: Math.max(3_000_000, Math.ceil(rewardAtomic * 0.15)),
142
+ expiresAt: new Date(Date.now() + 15 * 60 * 1000).toISOString(),
143
+ };
144
+ quotes.set(String(quote.id), quote);
145
+ return json(response, 201, quote);
146
+ }
147
+ if (method === "POST" && url.pathname === "/v1/tasks") {
148
+ if (!requireIdempotency(request, response))
149
+ return;
150
+ const input = await body(request);
151
+ if (!quotes.has(String(input.feeQuoteId))) {
152
+ return problem(response, 422, "fee_quote_invalid", "Create a current fee quote first.");
153
+ }
154
+ const base = {
155
+ id: randomUUID(),
156
+ contentVersion: 1,
157
+ category: "REMOTE_VERIFICATION",
158
+ title: String(input.title ?? ""),
159
+ instructions: String(input.instructions ?? ""),
160
+ evidenceRequirements: Array.isArray(input.evidenceRequirements)
161
+ ? input.evidenceRequirements.map(String)
162
+ : [],
163
+ rewardAtomic: Number(input.rewardAtomic),
164
+ displayAudCents: Number(input.displayAudCents),
165
+ deadline: String(input.deadline),
166
+ country: "AU",
167
+ physicalPresenceRequired: false,
168
+ feeQuoteId: String(input.feeQuoteId),
169
+ };
170
+ if (base.title.length < 3 ||
171
+ base.instructions.length < 10 ||
172
+ base.evidenceRequirements.length < 1) {
173
+ return problem(response, 422, "task_invalid", "Title, instructions and evidence requirements are required.");
174
+ }
175
+ const review = reviewTask(base);
176
+ const task = { ...base, ...review, status: "DRAFT", funded: false };
177
+ tasks.set(task.id, task);
178
+ emit("task.created", task);
179
+ return json(response, 201, task);
180
+ }
181
+ const taskMatch = url.pathname.match(/^\/v1\/tasks\/([^/]+)(?:\/(.*))?$/);
182
+ if (taskMatch) {
183
+ const id = decodeURIComponent(taskMatch[1] ?? "");
184
+ const action = taskMatch[2];
185
+ const task = tasks.get(id);
186
+ if (!task)
187
+ return problem(response, 404, "task_not_found", "Task not found.");
188
+ if (method === "GET" && !action)
189
+ return json(response, 200, task);
190
+ if (method === "GET" && action === "compliance-review") {
191
+ return json(response, 200, task.complianceReview);
192
+ }
193
+ if (method === "PATCH" && !action) {
194
+ if (!requireIdempotency(request, response))
195
+ return;
196
+ const input = await body(request);
197
+ if (Number(input.expectedVersion) !== task.contentVersion) {
198
+ return problem(response, 409, "version_conflict", "Task version changed; reload before editing.");
199
+ }
200
+ const base = {
201
+ id: task.id,
202
+ contentVersion: task.contentVersion + 1,
203
+ category: task.category,
204
+ title: String(input.title ?? task.title),
205
+ instructions: String(input.instructions ?? task.instructions),
206
+ evidenceRequirements: Array.isArray(input.evidenceRequirements)
207
+ ? input.evidenceRequirements.map(String)
208
+ : task.evidenceRequirements,
209
+ rewardAtomic: task.rewardAtomic,
210
+ displayAudCents: task.displayAudCents,
211
+ deadline: String(input.deadline ?? task.deadline),
212
+ country: task.country,
213
+ physicalPresenceRequired: task.physicalPresenceRequired,
214
+ feeQuoteId: task.feeQuoteId,
215
+ };
216
+ const updated = {
217
+ ...task,
218
+ ...base,
219
+ ...reviewTask(base),
220
+ status: "DRAFT",
221
+ funded: false,
222
+ };
223
+ tasks.set(id, updated);
224
+ emit("task.updated", updated);
225
+ return json(response, 200, updated);
226
+ }
227
+ if (method === "POST" && action === "funding-intents") {
228
+ if (!requireIdempotency(request, response))
229
+ return;
230
+ if (task.complianceReview.decision !== "APPROVE") {
231
+ return problem(response, 409, "compliance_not_approved", "Rejected tasks cannot be funded.");
232
+ }
233
+ task.funded = true;
234
+ task.status = "FUNDED";
235
+ emit("task.funded", task);
236
+ return json(response, 201, {
237
+ id: randomUUID(),
238
+ taskId: id,
239
+ status: "CONFIRMED",
240
+ simulated: true,
241
+ });
242
+ }
243
+ if (method === "POST" && action === "open") {
244
+ if (!requireIdempotency(request, response))
245
+ return;
246
+ const input = await body(request);
247
+ const review = task.complianceReview;
248
+ if (review.decision !== "APPROVE" ||
249
+ review.contentVersion !== task.contentVersion ||
250
+ review.contentHash !== task.contentHash ||
251
+ Date.parse(review.expiresAt) <= Date.now()) {
252
+ return problem(response, 409, "compliance_not_current", "Exact current approval is required.");
253
+ }
254
+ if (!task.funded)
255
+ return problem(response, 409, "task_not_funded", "Fund the task before publication.");
256
+ if (Number(input.expectedVersion) !== task.contentVersion) {
257
+ return problem(response, 409, "version_conflict", "Task version changed before publication.");
258
+ }
259
+ task.status = "OPEN";
260
+ emit("task.opened", task);
261
+ return json(response, 200, task);
262
+ }
263
+ if (method === "POST" && action === "cancel") {
264
+ if (!requireIdempotency(request, response))
265
+ return;
266
+ task.status = "CANCELLED";
267
+ emit("task.cancelled", task);
268
+ return json(response, 200, task);
269
+ }
270
+ }
271
+ if (method === "GET" && url.pathname === "/v1/events") {
272
+ const after = url.searchParams.get("after");
273
+ const filtered = after
274
+ ? events.filter((event) => String(event.at) > after)
275
+ : events;
276
+ return json(response, 200, { events: filtered });
277
+ }
278
+ return problem(response, 404, "route_not_found", "Route not found.");
279
+ }
280
+ catch (error) {
281
+ return problem(response, 500, "sandbox_error", error instanceof Error ? error.message : "Unexpected sandbox error.");
282
+ }
283
+ });
284
+ server.listen(port, "127.0.0.1", () => {
285
+ console.log(`HumanLeg synthetic sandbox listening on http://127.0.0.1:${port}`);
286
+ });
287
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "@humanleg/sandbox",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Synthetic in-memory HumanLeg.ai sandbox API for local development.",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "main": "dist/server.js",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.json",
14
+ "start": "node dist/server.js"
15
+ },
16
+ "bin": {
17
+ "humanleg-sandbox": "dist/server.js"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/humanleg-ai/humanleg.git",
22
+ "directory": "packages/sandbox"
23
+ },
24
+ "engines": {
25
+ "node": ">=20"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "provenance": true
30
+ }
31
+ }