@harrylabsj/kiwi 0.7.21 → 0.8.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 +45 -10
- package/dist/a2a/node.js +1 -1
- package/dist/a2a/node.js.map +1 -1
- package/dist/agent/buyer/buyer-tools.d.ts +7 -0
- package/dist/agent/buyer/buyer-tools.js +53 -0
- package/dist/agent/buyer/buyer-tools.js.map +1 -1
- package/dist/agent/buyer/scheduler.d.ts +4 -0
- package/dist/agent/buyer/scheduler.js +5 -1
- package/dist/agent/buyer/scheduler.js.map +1 -1
- package/dist/agent/buyer/task-store.d.ts +5 -0
- package/dist/agent/buyer/task-store.js +13 -0
- package/dist/agent/buyer/task-store.js.map +1 -1
- package/dist/agent/chat-tools.js +10 -3
- package/dist/agent/chat-tools.js.map +1 -1
- package/dist/agent/context/fencing.d.ts +27 -0
- package/dist/agent/context/fencing.js +126 -0
- package/dist/agent/context/fencing.js.map +1 -0
- package/dist/agent/context/grounding.d.ts +18 -0
- package/dist/agent/context/grounding.js +22 -0
- package/dist/agent/context/grounding.js.map +1 -0
- package/dist/agent/host/events.d.ts +31 -0
- package/dist/agent/host/events.js +62 -0
- package/dist/agent/host/events.js.map +1 -0
- package/dist/agent/host/tui-renderer.d.ts +17 -0
- package/dist/agent/host/tui-renderer.js +125 -0
- package/dist/agent/host/tui-renderer.js.map +1 -0
- package/dist/agent/host/web-renderer.d.ts +71 -0
- package/dist/agent/host/web-renderer.js +185 -0
- package/dist/agent/host/web-renderer.js.map +1 -0
- package/dist/agent/kernel-builder.d.ts +3 -1
- package/dist/agent/kernel-builder.js +4 -1
- package/dist/agent/kernel-builder.js.map +1 -1
- package/dist/agent/kernel.d.ts +22 -1
- package/dist/agent/kernel.js +294 -22
- package/dist/agent/kernel.js.map +1 -1
- package/dist/agent/memory/schema.d.ts +1 -1
- package/dist/agent/memory/schema.js +67 -1
- package/dist/agent/memory/schema.js.map +1 -1
- package/dist/agent/merchant/intelligence/backend.d.ts +40 -0
- package/dist/agent/merchant/intelligence/backend.js +2 -0
- package/dist/agent/merchant/intelligence/backend.js.map +1 -0
- package/dist/agent/merchant/intelligence/default-backend.d.ts +38 -0
- package/dist/agent/merchant/intelligence/default-backend.js +454 -0
- package/dist/agent/merchant/intelligence/default-backend.js.map +1 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.d.ts +55 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.js +193 -0
- package/dist/agent/merchant/intelligence/http-analytics-source.js.map +1 -0
- package/dist/agent/merchant/intelligence/types.d.ts +109 -0
- package/dist/agent/merchant/intelligence/types.js +2 -0
- package/dist/agent/merchant/intelligence/types.js.map +1 -0
- package/dist/agent/merchant/merchant-enrichment.d.ts +10 -0
- package/dist/agent/merchant/merchant-enrichment.js +38 -0
- package/dist/agent/merchant/merchant-enrichment.js.map +1 -0
- package/dist/agent/merchant/merchant-grounding.d.ts +5 -0
- package/dist/agent/merchant/merchant-grounding.js +76 -0
- package/dist/agent/merchant/merchant-grounding.js.map +1 -0
- package/dist/agent/merchant/merchant-presentations.d.ts +8 -0
- package/dist/agent/merchant/merchant-presentations.js +184 -0
- package/dist/agent/merchant/merchant-presentations.js.map +1 -0
- package/dist/agent/merchant/merchant-tools.d.ts +8 -0
- package/dist/agent/merchant/merchant-tools.js +208 -9
- package/dist/agent/merchant/merchant-tools.js.map +1 -1
- package/dist/agent/presentation/registry.d.ts +14 -0
- package/dist/agent/presentation/registry.js +24 -0
- package/dist/agent/presentation/registry.js.map +1 -0
- package/dist/agent/presentation/runner.d.ts +11 -0
- package/dist/agent/presentation/runner.js +17 -0
- package/dist/agent/presentation/runner.js.map +1 -0
- package/dist/agent/presentation/sanitize.d.ts +16 -0
- package/dist/agent/presentation/sanitize.js +37 -0
- package/dist/agent/presentation/sanitize.js.map +1 -0
- package/dist/agent/presentation/types.d.ts +28 -0
- package/dist/agent/presentation/types.js +8 -0
- package/dist/agent/presentation/types.js.map +1 -0
- package/dist/agent/session.d.ts +1 -1
- package/dist/agent/session.js +2 -2
- package/dist/agent/session.js.map +1 -1
- package/dist/agent/skills/registry.d.ts +11 -0
- package/dist/agent/skills/registry.js +119 -0
- package/dist/agent/skills/registry.js.map +1 -0
- package/dist/agent/skills/tools.d.ts +6 -0
- package/dist/agent/skills/tools.js +36 -0
- package/dist/agent/skills/tools.js.map +1 -0
- package/dist/agent/skills/types.d.ts +9 -0
- package/dist/agent/skills/types.js +2 -0
- package/dist/agent/skills/types.js.map +1 -0
- package/dist/agent/supplier/scheduler.d.ts +86 -0
- package/dist/agent/supplier/scheduler.js +618 -0
- package/dist/agent/supplier/scheduler.js.map +1 -0
- package/dist/agent/supplier/store.d.ts +173 -0
- package/dist/agent/supplier/store.js +387 -0
- package/dist/agent/supplier/store.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +5 -1
- package/dist/agent/system-prompt.js +20 -3
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +177 -12
- package/dist/cli.js.map +1 -1
- package/dist/config/profile.d.ts +21 -0
- package/dist/config/profile.js +59 -0
- package/dist/config/profile.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-record.d.ts +2 -0
- package/dist/discovery/catalog-source/kiwi-record.js.map +1 -1
- package/dist/discovery/catalog-source/kiwi-source.js +2 -0
- package/dist/discovery/catalog-source/kiwi-source.js.map +1 -1
- package/dist/handoff/authorization.js +1 -1
- package/dist/http/merchant-server.d.ts +65 -0
- package/dist/http/merchant-server.js +346 -0
- package/dist/http/merchant-server.js.map +1 -0
- package/dist/merchant/stats-store.d.ts +7 -0
- package/dist/merchant/stats-store.js +11 -0
- package/dist/merchant/stats-store.js.map +1 -1
- package/dist/negotiation/action-candidate.js +1 -1
- package/dist/operator/types.d.ts +1 -1
- package/dist/product-cli.d.ts +2 -2
- package/dist/product-cli.js +14 -2
- package/dist/product-cli.js.map +1 -1
- package/dist/product-supplier.d.ts +148 -0
- package/dist/product-supplier.js +452 -0
- package/dist/product-supplier.js.map +1 -0
- package/dist/runtime/fake-model.d.ts +1 -1
- package/dist/trust/identity/jwk.d.ts +11 -0
- package/dist/trust/identity/jwk.js +2 -0
- package/dist/trust/identity/jwk.js.map +1 -0
- package/dist/trust/identity/jws.d.ts +2 -1
- package/dist/trust/identity/jws.js.map +1 -1
- package/dist/trust/identity/keys.d.ts +2 -1
- package/dist/trust/identity/keys.js.map +1 -1
- package/dist/trust/identity/message-signature.d.ts +1 -14
- package/dist/trust/identity/message-signature.js.map +1 -1
- package/dist/weixin/channel.d.ts +3 -0
- package/dist/weixin/channel.js +18 -2
- package/dist/weixin/channel.js.map +1 -1
- package/examples/profiles/merchant.deepseek.yaml +6 -0
- package/examples/profiles/merchant.fake.yaml +6 -0
- package/examples/profiles/merchant.local.yaml +6 -0
- package/package.json +7 -6
- package/skills/kiwi-buyer/SKILL.md +66 -0
- package/skills/merchant/catalog-operations/SKILL.md +17 -0
- package/skills/merchant/change-approval/SKILL.md +16 -0
- package/skills/merchant/human-review/SKILL.md +17 -0
- package/skills/merchant/inventory-operations/SKILL.md +17 -0
- package/skills/merchant/negotiation-review/SKILL.md +18 -0
- package/skills/merchant/performance-insights/SKILL.md +19 -0
- package/contracts/candidate-agent-dto-1.0.README.md +0 -43
- package/contracts/conformance/python-service/README.md +0 -19
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merchant Experience HTTP/SSE host adapter.
|
|
3
|
+
*
|
|
4
|
+
* This adapter owns transport sessions and event replay only. Merchant business
|
|
5
|
+
* state remains in AgentKernel, WriteApprovalCandidateStore, Ledger and the
|
|
6
|
+
* configured backend.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { createServer } from "node:http";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { buildChatKernel } from "../agent/kernel-builder.js";
|
|
12
|
+
const DEFAULT_MAX_BODY_BYTES = 256 * 1024;
|
|
13
|
+
const DEFAULT_EVENT_BUFFER = 200;
|
|
14
|
+
const DEFAULT_MAX_SESSIONS = 100;
|
|
15
|
+
const DEFAULT_SESSION_IDLE_TTL_MS = 30 * 60 * 1000;
|
|
16
|
+
const MAX_MESSAGE_CHARS = 20_000;
|
|
17
|
+
class HttpError extends Error {
|
|
18
|
+
status;
|
|
19
|
+
code;
|
|
20
|
+
constructor(status, code, message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = "HttpError";
|
|
23
|
+
this.status = status;
|
|
24
|
+
this.code = code;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function sendJson(response, status, body) {
|
|
28
|
+
if (response.headersSent)
|
|
29
|
+
return;
|
|
30
|
+
response.writeHead(status, { "content-type": "application/json; charset=utf-8" });
|
|
31
|
+
response.end(JSON.stringify(body));
|
|
32
|
+
}
|
|
33
|
+
function sendError(response, error) {
|
|
34
|
+
if (error instanceof HttpError) {
|
|
35
|
+
sendJson(response, error.status, { ok: false, error: { code: error.code, message: error.message } });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
sendJson(response, 500, {
|
|
39
|
+
ok: false,
|
|
40
|
+
error: { code: "internal_error", message: "internal server error" },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async function readJson(request, maxBytes) {
|
|
44
|
+
const chunks = [];
|
|
45
|
+
let size = 0;
|
|
46
|
+
for await (const chunk of request) {
|
|
47
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
48
|
+
size += buffer.length;
|
|
49
|
+
if (size > maxBytes)
|
|
50
|
+
throw new HttpError(413, "body_too_large", "request body too large");
|
|
51
|
+
chunks.push(buffer);
|
|
52
|
+
}
|
|
53
|
+
if (size === 0)
|
|
54
|
+
return {};
|
|
55
|
+
let value;
|
|
56
|
+
try {
|
|
57
|
+
value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new HttpError(400, "invalid_json", "request body is not valid JSON");
|
|
61
|
+
}
|
|
62
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
63
|
+
throw new HttpError(400, "invalid_json", "request body must be a JSON object");
|
|
64
|
+
}
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
function decodeSegment(value) {
|
|
68
|
+
try {
|
|
69
|
+
return decodeURIComponent(value);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
throw new HttpError(400, "invalid_path", "path contains invalid encoding");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function positiveSequence(value) {
|
|
76
|
+
if (value === null || value.trim() === "")
|
|
77
|
+
return 0;
|
|
78
|
+
const sequence = Number(value);
|
|
79
|
+
if (!Number.isSafeInteger(sequence) || sequence < 0) {
|
|
80
|
+
throw new HttpError(400, "invalid_sequence", "after must be a non-negative integer");
|
|
81
|
+
}
|
|
82
|
+
return sequence;
|
|
83
|
+
}
|
|
84
|
+
function pendingSummary(kernel) {
|
|
85
|
+
return kernel.listPendingApprovals().map((candidate) => ({
|
|
86
|
+
candidate_id: candidate.candidate_id,
|
|
87
|
+
tool: candidate.tool,
|
|
88
|
+
risk: candidate.risk,
|
|
89
|
+
status: candidate.status,
|
|
90
|
+
expires_at: candidate.expires_at,
|
|
91
|
+
stale_sensitive: true,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
function sseEvent(event) {
|
|
95
|
+
return [
|
|
96
|
+
"id: " + String(event.sequence),
|
|
97
|
+
"event: " + event.type,
|
|
98
|
+
"data: " + JSON.stringify(event),
|
|
99
|
+
"",
|
|
100
|
+
"",
|
|
101
|
+
].join("\n");
|
|
102
|
+
}
|
|
103
|
+
function sseControlEvent(type, data) {
|
|
104
|
+
return ["event: " + type, "data: " + JSON.stringify(data), "", ""].join("\n");
|
|
105
|
+
}
|
|
106
|
+
function writeSse(response, event) {
|
|
107
|
+
if (!response.destroyed)
|
|
108
|
+
response.write(event);
|
|
109
|
+
}
|
|
110
|
+
function defaultFactory(options) {
|
|
111
|
+
return {
|
|
112
|
+
async create(input) {
|
|
113
|
+
return buildChatKernel(options.profile, input.dataDir, options.catalog, input.eventSink, input.eventSessionId, options.analyticsSource);
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export function createMerchantHttpServer(options) {
|
|
118
|
+
if (options.profile.role !== "merchant") {
|
|
119
|
+
throw new Error("Merchant HTTP adapter requires a merchant profile");
|
|
120
|
+
}
|
|
121
|
+
const maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;
|
|
122
|
+
const maxEventBuffer = Math.max(1, Math.min(options.maxEventBuffer ?? DEFAULT_EVENT_BUFFER, 10_000));
|
|
123
|
+
const maxSessions = Math.max(1, Math.min(options.maxSessions ?? DEFAULT_MAX_SESSIONS, 10_000));
|
|
124
|
+
const sessionIdleTtlMs = Math.max(1_000, options.sessionIdleTtlMs ?? DEFAULT_SESSION_IDLE_TTL_MS);
|
|
125
|
+
const nowMs = options.nowMs ?? Date.now;
|
|
126
|
+
const factory = options.kernelFactory ?? defaultFactory(options);
|
|
127
|
+
const sessions = new Map();
|
|
128
|
+
let pendingSessions = 0;
|
|
129
|
+
const authorize = async (request) => {
|
|
130
|
+
try {
|
|
131
|
+
const identity = await options.authenticate(request);
|
|
132
|
+
if (identity === null ||
|
|
133
|
+
typeof identity !== "object" ||
|
|
134
|
+
typeof identity.principal_id !== "string" ||
|
|
135
|
+
typeof identity.merchant_id !== "string" ||
|
|
136
|
+
identity.principal_id === "" ||
|
|
137
|
+
identity.merchant_id === "") {
|
|
138
|
+
throw new Error("invalid identity");
|
|
139
|
+
}
|
|
140
|
+
if (identity.merchant_id !== options.profile.owner_id) {
|
|
141
|
+
throw new HttpError(403, "merchant_forbidden", "authenticated merchant is not this profile owner");
|
|
142
|
+
}
|
|
143
|
+
return identity;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
if (error instanceof HttpError)
|
|
147
|
+
throw error;
|
|
148
|
+
throw new HttpError(401, "unauthorized", "merchant authentication failed");
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const closeSession = async (session) => {
|
|
152
|
+
sessions.delete(session.sessionId);
|
|
153
|
+
for (const subscriber of session.subscribers)
|
|
154
|
+
subscriber.end();
|
|
155
|
+
session.subscribers.clear();
|
|
156
|
+
await session.kernel.close().catch(() => undefined);
|
|
157
|
+
};
|
|
158
|
+
const sweepIdleSessions = async () => {
|
|
159
|
+
const cutoff = nowMs() - sessionIdleTtlMs;
|
|
160
|
+
const expired = [...sessions.values()].filter((session) => session.subscribers.size === 0 && session.lastAccessAt <= cutoff);
|
|
161
|
+
await Promise.allSettled(expired.map(closeSession));
|
|
162
|
+
};
|
|
163
|
+
const getSession = (sessionId, identity) => {
|
|
164
|
+
const session = sessions.get(sessionId);
|
|
165
|
+
if (session === undefined)
|
|
166
|
+
throw new HttpError(404, "session_not_found", "merchant session not found");
|
|
167
|
+
if (session.identity.principal_id !== identity.principal_id ||
|
|
168
|
+
session.identity.merchant_id !== identity.merchant_id) {
|
|
169
|
+
throw new HttpError(403, "session_forbidden", "session does not belong to the authenticated principal");
|
|
170
|
+
}
|
|
171
|
+
session.lastAccessAt = nowMs();
|
|
172
|
+
return session;
|
|
173
|
+
};
|
|
174
|
+
const createSession = async (identity) => {
|
|
175
|
+
if (sessions.size + pendingSessions >= maxSessions) {
|
|
176
|
+
throw new HttpError(429, "session_limit_reached", "merchant session limit reached");
|
|
177
|
+
}
|
|
178
|
+
pendingSessions += 1;
|
|
179
|
+
try {
|
|
180
|
+
const sessionId = randomUUID();
|
|
181
|
+
const events = [];
|
|
182
|
+
let record;
|
|
183
|
+
const eventSink = {
|
|
184
|
+
emit(event) {
|
|
185
|
+
const stored = {
|
|
186
|
+
...event,
|
|
187
|
+
sessionId,
|
|
188
|
+
};
|
|
189
|
+
events.push(stored);
|
|
190
|
+
while (events.length > maxEventBuffer)
|
|
191
|
+
events.shift();
|
|
192
|
+
if (record === undefined)
|
|
193
|
+
return;
|
|
194
|
+
for (const subscriber of record.subscribers)
|
|
195
|
+
writeSse(subscriber, sseEvent(stored));
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
const dataDir = path.join(options.dataRoot, sessionId);
|
|
199
|
+
const kernel = await factory.create({ dataDir, eventSink, eventSessionId: sessionId });
|
|
200
|
+
if (kernel.profile.role !== "merchant" || kernel.profile.owner_id !== options.profile.owner_id) {
|
|
201
|
+
await kernel.close().catch(() => undefined);
|
|
202
|
+
throw new HttpError(500, "kernel_identity_mismatch", "kernel does not match merchant profile");
|
|
203
|
+
}
|
|
204
|
+
record = {
|
|
205
|
+
sessionId,
|
|
206
|
+
identity,
|
|
207
|
+
kernel,
|
|
208
|
+
events,
|
|
209
|
+
subscribers: new Set(),
|
|
210
|
+
createdAt: new Date().toISOString(),
|
|
211
|
+
lastAccessAt: nowMs(),
|
|
212
|
+
};
|
|
213
|
+
sessions.set(sessionId, record);
|
|
214
|
+
return record;
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
pendingSessions -= 1;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const handleEvents = (request, response, session) => {
|
|
221
|
+
const url = new URL(request.url ?? "/", "http://" + (request.headers.host ?? "localhost"));
|
|
222
|
+
const queryAfter = url.searchParams.get("after");
|
|
223
|
+
const headerAfter = request.headers["last-event-id"];
|
|
224
|
+
const after = positiveSequence(queryAfter ?? (typeof headerAfter === "string" ? headerAfter : null));
|
|
225
|
+
response.writeHead(200, {
|
|
226
|
+
"content-type": "text/event-stream; charset=utf-8",
|
|
227
|
+
"cache-control": "no-cache, no-transform",
|
|
228
|
+
connection: "keep-alive",
|
|
229
|
+
"x-accel-buffering": "no",
|
|
230
|
+
});
|
|
231
|
+
const oldest = session.events[0]?.sequence;
|
|
232
|
+
if (oldest !== undefined && after > 0 && after < oldest - 1) {
|
|
233
|
+
writeSse(response, sseControlEvent("replay_gap", { after, oldest }));
|
|
234
|
+
}
|
|
235
|
+
for (const event of session.events) {
|
|
236
|
+
if (event.sequence > after)
|
|
237
|
+
writeSse(response, sseEvent(event));
|
|
238
|
+
}
|
|
239
|
+
session.subscribers.add(response);
|
|
240
|
+
const heartbeat = setInterval(() => writeSse(response, ": keep-alive\n\n"), 15_000);
|
|
241
|
+
heartbeat.unref();
|
|
242
|
+
response.on("close", () => {
|
|
243
|
+
clearInterval(heartbeat);
|
|
244
|
+
session.subscribers.delete(response);
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
const server = createServer(async (request, response) => {
|
|
248
|
+
try {
|
|
249
|
+
await sweepIdleSessions();
|
|
250
|
+
const url = new URL(request.url ?? "/", "http://" + (request.headers.host ?? "localhost"));
|
|
251
|
+
const segments = url.pathname.split("/").filter(Boolean).map(decodeSegment);
|
|
252
|
+
const method = request.method ?? "GET";
|
|
253
|
+
if (method === "GET" && url.pathname === "/health") {
|
|
254
|
+
sendJson(response, 200, { ok: true, service: "kiwi-merchant-http", sessions: sessions.size });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (segments.length === 3 && method === "POST" && segments[0] === "v1" && segments[1] === "merchant" && segments[2] === "sessions") {
|
|
258
|
+
const identity = await authorize(request);
|
|
259
|
+
const session = await createSession(identity);
|
|
260
|
+
sendJson(response, 201, {
|
|
261
|
+
ok: true,
|
|
262
|
+
session_id: session.sessionId,
|
|
263
|
+
created_at: session.createdAt,
|
|
264
|
+
events_url: "/v1/merchant/sessions/" + session.sessionId + "/events",
|
|
265
|
+
});
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (segments.length < 4 ||
|
|
269
|
+
segments[0] !== "v1" ||
|
|
270
|
+
segments[1] !== "merchant" ||
|
|
271
|
+
segments[2] !== "sessions") {
|
|
272
|
+
throw new HttpError(404, "not_found", method + " " + url.pathname);
|
|
273
|
+
}
|
|
274
|
+
const identity = await authorize(request);
|
|
275
|
+
const session = getSession(segments[3], identity);
|
|
276
|
+
const sessionId = segments[3];
|
|
277
|
+
if (segments.length === 5 && method === "GET" && segments[4] === "events") {
|
|
278
|
+
handleEvents(request, response, session);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (segments.length === 4 && method === "GET") {
|
|
282
|
+
sendJson(response, 200, {
|
|
283
|
+
ok: true,
|
|
284
|
+
session_id: sessionId,
|
|
285
|
+
created_at: session.createdAt,
|
|
286
|
+
pending_actions: pendingSummary(session.kernel),
|
|
287
|
+
});
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (segments.length === 5 && method === "POST" && segments[4] === "messages") {
|
|
291
|
+
const body = await readJson(request, maxBodyBytes);
|
|
292
|
+
const message = body.message;
|
|
293
|
+
if (typeof message !== "string" || message.trim() === "") {
|
|
294
|
+
throw new HttpError(400, "invalid_message", "message must be a non-empty string");
|
|
295
|
+
}
|
|
296
|
+
if (message.length > MAX_MESSAGE_CHARS) {
|
|
297
|
+
throw new HttpError(413, "message_too_large", "message exceeds the maximum length");
|
|
298
|
+
}
|
|
299
|
+
const reply = await session.kernel.handleUserText(message);
|
|
300
|
+
sendJson(response, 200, {
|
|
301
|
+
ok: true,
|
|
302
|
+
session_id: sessionId,
|
|
303
|
+
reply: reply.text,
|
|
304
|
+
quit: reply.quit,
|
|
305
|
+
pending_actions: pendingSummary(session.kernel),
|
|
306
|
+
});
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (segments.length === 6 && method === "POST" && segments[4] === "approvals") {
|
|
310
|
+
const candidateId = segments[5];
|
|
311
|
+
const body = await readJson(request, maxBodyBytes);
|
|
312
|
+
const action = body.action;
|
|
313
|
+
if (action === "approve") {
|
|
314
|
+
const result = await session.kernel.approveCandidate(candidateId);
|
|
315
|
+
sendJson(response, 200, { ok: true, session_id: sessionId, candidate_id: candidateId, result });
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (action === "reject") {
|
|
319
|
+
const result = session.kernel.rejectCandidate(candidateId);
|
|
320
|
+
sendJson(response, result.ok ? 200 : 409, {
|
|
321
|
+
ok: result.ok,
|
|
322
|
+
session_id: sessionId,
|
|
323
|
+
candidate_id: candidateId,
|
|
324
|
+
...(result.error === undefined ? {} : { error: { code: "reject_failed", message: result.error } }),
|
|
325
|
+
});
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
throw new HttpError(400, "invalid_approval_action", "action must be approve or reject");
|
|
329
|
+
}
|
|
330
|
+
if (segments.length === 4 && method === "DELETE") {
|
|
331
|
+
await closeSession(session);
|
|
332
|
+
sendJson(response, 200, { ok: true, session_id: sessionId });
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
throw new HttpError(404, "not_found", method + " " + url.pathname);
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
sendError(response, error);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
server.on("close", () => {
|
|
342
|
+
void Promise.allSettled([...sessions.values()].map(closeSession));
|
|
343
|
+
});
|
|
344
|
+
return server;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=merchant-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merchant-server.js","sourceRoot":"","sources":["../../src/http/merchant-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,11 @@ export interface DailyBucket {
|
|
|
42
42
|
contact_events: number;
|
|
43
43
|
negotiations: number;
|
|
44
44
|
}
|
|
45
|
+
/** 单日买家身份集合的去重行,用于跨日粒度聚合。 */
|
|
46
|
+
export interface DailyBuyerIdentity {
|
|
47
|
+
day: string;
|
|
48
|
+
buyer_identity: string;
|
|
49
|
+
}
|
|
45
50
|
/** 单 SKU 聚合。 */
|
|
46
51
|
export interface SkuStat {
|
|
47
52
|
sku: string;
|
|
@@ -66,6 +71,8 @@ export declare class MerchantStatsStore {
|
|
|
66
71
|
totalsSince(sinceDay: string): ContactTotals;
|
|
67
72
|
/** 按日聚合(只返回有数据的天;零填充由调用方做)。 */
|
|
68
73
|
dailySince(sinceDay: string): DailyBucket[];
|
|
74
|
+
/** 按日返回原始身份去重行,避免周/月把同一买家跨日重复相加。 */
|
|
75
|
+
dailyBuyerIdentitiesSince(sinceDay: string): DailyBuyerIdentity[];
|
|
69
76
|
/** SKU 热度榜(按触达事件数降序,sku 升序兜底,截断 limit)。 */
|
|
70
77
|
topSkus(sinceDay: string, limit: number): SkuStat[];
|
|
71
78
|
close(): void;
|
|
@@ -103,6 +103,17 @@ export class MerchantStatsStore {
|
|
|
103
103
|
negotiations: r.negotiations,
|
|
104
104
|
}));
|
|
105
105
|
}
|
|
106
|
+
/** 按日返回原始身份去重行,避免周/月把同一买家跨日重复相加。 */
|
|
107
|
+
dailyBuyerIdentitiesSince(sinceDay) {
|
|
108
|
+
const rows = this.db
|
|
109
|
+
.prepare(`SELECT substr(occurred_at, 1, 10) AS day, buyer_identity
|
|
110
|
+
FROM buyer_contact_events
|
|
111
|
+
WHERE substr(occurred_at, 1, 10) >= ?
|
|
112
|
+
GROUP BY day, buyer_identity
|
|
113
|
+
ORDER BY day, buyer_identity`)
|
|
114
|
+
.all(sinceDay);
|
|
115
|
+
return rows.map((row) => ({ day: row.day, buyer_identity: row.buyer_identity }));
|
|
116
|
+
}
|
|
106
117
|
/** SKU 热度榜(按触达事件数降序,sku 升序兜底,截断 limit)。 */
|
|
107
118
|
topSkus(sinceDay, limit) {
|
|
108
119
|
const rows = this.db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-store.js","sourceRoot":"","sources":["../../src/merchant/stats-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"stats-store.js","sourceRoot":"","sources":["../../src/merchant/stats-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
|
-
* A2A v0.4 candidate model (docs/kiwi-a2a-architecture-baseline.md §7).
|
|
17
|
+
* A2A v0.4 candidate model (docs/kiwi-a2a-architecture-baseline-rev1.3.md §7).
|
|
18
18
|
*
|
|
19
19
|
* ActionCandidate is the unified base class semantics: "Agent 建议执行、但尚未
|
|
20
20
|
* 真正执行的外部有副作用动作" — an external side-effectful action the agent
|
package/dist/operator/types.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
/**
|
|
17
|
-
* Operator control plane types (
|
|
17
|
+
* Operator control plane types (operator control-plane design §5–§10).
|
|
18
18
|
*
|
|
19
19
|
* Three state domains stay separate: the marketplace conversation (owned by
|
|
20
20
|
* shopping-cli), the operator session (this private event stream), and the
|
package/dist/product-cli.d.ts
CHANGED
|
@@ -41,8 +41,8 @@ export declare const DEFAULT_PROFILE_PATH: string;
|
|
|
41
41
|
* profile 覆盖成测试 merchant)。
|
|
42
42
|
*/
|
|
43
43
|
export declare function writeDefaultProfile(yaml: string, profilePath?: string): void;
|
|
44
|
-
/**
|
|
45
|
-
export declare const PRODUCT_VERSION
|
|
44
|
+
/** package.json 是发布版本的唯一来源,避免 CLI 与正式安装包版本漂移。 */
|
|
45
|
+
export declare const PRODUCT_VERSION: string;
|
|
46
46
|
/**
|
|
47
47
|
* 缺省 kiwi-catalog 地址(单一来源,cli.ts 各处解析一致)。
|
|
48
48
|
*
|
package/dist/product-cli.js
CHANGED
|
@@ -30,6 +30,7 @@ import { spawnSync } from "node:child_process";
|
|
|
30
30
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
31
31
|
import { homedir } from "node:os";
|
|
32
32
|
import path from "node:path";
|
|
33
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
33
34
|
import { EXIT } from "./exit-codes.js";
|
|
34
35
|
import { SHOPPING_CLI_COMPAT, compatRangeText, versionInRange } from "./product-compat.js";
|
|
35
36
|
/**
|
|
@@ -50,8 +51,8 @@ export function writeDefaultProfile(yaml, profilePath) {
|
|
|
50
51
|
mkdirSync(path.dirname(target), { recursive: true, mode: 0o700 });
|
|
51
52
|
writeFileSync(target, yaml, { mode: 0o600 });
|
|
52
53
|
}
|
|
53
|
-
/**
|
|
54
|
-
export const PRODUCT_VERSION =
|
|
54
|
+
/** package.json 是发布版本的唯一来源,避免 CLI 与正式安装包版本漂移。 */
|
|
55
|
+
export const PRODUCT_VERSION = packageJson.version;
|
|
55
56
|
/**
|
|
56
57
|
* 缺省 kiwi-catalog 地址(单一来源,cli.ts 各处解析一致)。
|
|
57
58
|
*
|
|
@@ -72,6 +73,17 @@ Usage:
|
|
|
72
73
|
kiwi buyer search <需求描述> [D4] Product-first 搜索(listing → Merchant
|
|
73
74
|
Agent;--catalog/--limit/--category/--region)
|
|
74
75
|
kiwi buyer tasks [--data-dir <dir>] [D4] 查看 Buyer 任务(start 运行后)
|
|
76
|
+
kiwi buyer supplier save <merchant-id> [M1] 保存供应商(不轮询;经 --catalog 解析)
|
|
77
|
+
kiwi buyer supplier watch <merchant-id> [--query <词>] [--region <区域>] [--interval <秒≥3600>] [--expires 90d]
|
|
78
|
+
[M1] 建立观察关系(人类确认;非交互需 --yes)
|
|
79
|
+
kiwi buyer supplier prefer <merchant-id> [--scope <范围>] [--expires 90d]
|
|
80
|
+
[M1] 设为偏好供应商(人类确认;非交互需 --yes)
|
|
81
|
+
kiwi buyer supplier list [M1] 查看本地供应商关系
|
|
82
|
+
kiwi buyer supplier metrics [M0] 供应商关系指标(§14 口径,本地只读)
|
|
83
|
+
kiwi buyer supplier pause <relationship-id>
|
|
84
|
+
[M1] 暂停观察
|
|
85
|
+
kiwi buyer supplier remove <relationship-id>
|
|
86
|
+
[M1] 删除关系(软删:立即停止拉取)
|
|
75
87
|
|
|
76
88
|
Buyer 只需要 Kiwi;不感知 shopping-cli / kiwi-catalog。
|
|
77
89
|
`;
|
package/dist/product-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product-cli.js","sourceRoot":"","sources":["../src/product-cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE3F;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,WAAoB;IACpE,MAAM,MAAM,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,oBAAoB,CAAC;IACvF,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"product-cli.js","sourceRoot":"","sources":["../src/product-cli.ts"],"names":[],"mappings":"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"}
|