@harrylabsj/kiwi 0.7.22 → 0.9.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/negotiate.d.ts +6 -2
- package/dist/a2a/negotiate.js +10 -3
- package/dist/a2a/negotiate.js.map +1 -1
- package/dist/a2a/node.d.ts +4 -1
- package/dist/a2a/node.js +57 -4
- package/dist/a2a/node.js.map +1 -1
- package/dist/a2a/server/merchant-handler.d.ts +11 -3
- package/dist/a2a/server/merchant-handler.js +84 -26
- package/dist/a2a/server/merchant-handler.js.map +1 -1
- package/dist/agent/buyer/buyer-tools.js +17 -10
- package/dist/agent/buyer/buyer-tools.js.map +1 -1
- package/dist/agent/buyer/scheduler.d.ts +1 -0
- package/dist/agent/buyer/scheduler.js +5 -1
- package/dist/agent/buyer/scheduler.js.map +1 -1
- package/dist/agent/buyer/task-store.js +5 -2
- 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 +20 -1
- package/dist/agent/kernel.js +255 -14
- package/dist/agent/kernel.js.map +1 -1
- package/dist/agent/memory/schema.d.ts +1 -1
- package/dist/agent/memory/schema.js +9 -1
- package/dist/agent/memory/schema.js.map +1 -1
- package/dist/agent/merchant/action-candidate.d.ts +18 -0
- package/dist/agent/merchant/action-candidate.js +51 -0
- package/dist/agent/merchant/action-candidate.js.map +1 -1
- package/dist/agent/merchant/fake-merchant-client.js +6 -1
- package/dist/agent/merchant/fake-merchant-client.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 +477 -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-client.d.ts +50 -1
- package/dist/agent/merchant/merchant-client.js +157 -8
- package/dist/agent/merchant/merchant-client.js.map +1 -1
- 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 +207 -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 +291 -178
- package/dist/agent/merchant/merchant-tools.js.map +1 -1
- package/dist/agent/merchant/types.d.ts +6 -2
- package/dist/agent/merchant/types.js +45 -0
- package/dist/agent/merchant/types.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 +2 -0
- package/dist/agent/supplier/scheduler.js +101 -22
- package/dist/agent/supplier/scheduler.js.map +1 -1
- package/dist/agent/supplier/store.d.ts +2 -0
- package/dist/agent/supplier/store.js +44 -0
- package/dist/agent/supplier/store.js.map +1 -1
- 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/auth/merchant-authorization.d.ts +49 -0
- package/dist/auth/merchant-authorization.js +61 -0
- package/dist/auth/merchant-authorization.js.map +1 -0
- package/dist/auth/merchant-oauth.d.ts +255 -0
- package/dist/auth/merchant-oauth.js +764 -0
- package/dist/auth/merchant-oauth.js.map +1 -0
- package/dist/auth/merchant-pairing.d.ts +62 -0
- package/dist/auth/merchant-pairing.js +199 -0
- package/dist/auth/merchant-pairing.js.map +1 -0
- package/dist/auth/merchant-sessions.d.ts +71 -0
- package/dist/auth/merchant-sessions.js +168 -0
- package/dist/auth/merchant-sessions.js.map +1 -0
- package/dist/buyer-core/build-service.d.ts +5 -0
- package/dist/buyer-core/build-service.js +12 -0
- package/dist/buyer-core/build-service.js.map +1 -1
- package/dist/buyer-core/errors.d.ts +1 -1
- package/dist/buyer-core/errors.js +2 -0
- package/dist/buyer-core/errors.js.map +1 -1
- package/dist/buyer-core/merchant-index.d.ts +19 -4
- package/dist/buyer-core/merchant-index.js +137 -16
- package/dist/buyer-core/merchant-index.js.map +1 -1
- package/dist/buyer-core/negotiator.d.ts +0 -10
- package/dist/buyer-core/negotiator.js +12 -1
- package/dist/buyer-core/negotiator.js.map +1 -1
- package/dist/buyer-core/quote-fetcher.js +2 -1
- package/dist/buyer-core/quote-fetcher.js.map +1 -1
- package/dist/buyer-core/service.d.ts +104 -0
- package/dist/buyer-core/service.js +105 -1
- package/dist/buyer-core/service.js.map +1 -1
- package/dist/cli.d.ts +4 -2
- package/dist/cli.js +644 -32
- package/dist/cli.js.map +1 -1
- package/dist/config/profile.d.ts +51 -0
- package/dist/config/profile.js +185 -61
- package/dist/config/profile.js.map +1 -1
- package/dist/demo/demo-runner.js +12 -9
- package/dist/demo/demo-runner.js.map +1 -1
- package/dist/discovery/catalog-source/buyer-follows.d.ts +82 -0
- package/dist/discovery/catalog-source/buyer-follows.js +228 -0
- package/dist/discovery/catalog-source/buyer-follows.js.map +1 -0
- package/dist/discovery/catalog-source/connector-identity.d.ts +75 -0
- package/dist/discovery/catalog-source/connector-identity.js +175 -0
- package/dist/discovery/catalog-source/connector-identity.js.map +1 -0
- package/dist/discovery/catalog-source/errors.d.ts +1 -1
- package/dist/discovery/catalog-source/errors.js +2 -0
- package/dist/discovery/catalog-source/errors.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/discovery/catalog-source/merchant-publications.d.ts +65 -0
- package/dist/discovery/catalog-source/merchant-publications.js +207 -0
- package/dist/discovery/catalog-source/merchant-publications.js.map +1 -0
- package/dist/discovery/catalog-source/register.d.ts +24 -0
- package/dist/discovery/catalog-source/register.js +46 -0
- package/dist/discovery/catalog-source/register.js.map +1 -1
- package/dist/discovery/catalog-source/source.js +2 -1
- package/dist/discovery/catalog-source/source.js.map +1 -1
- package/dist/fs/atomic-write.d.ts +18 -0
- package/dist/fs/atomic-write.js +29 -0
- package/dist/fs/atomic-write.js.map +1 -0
- 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/http/server.js +4 -1
- package/dist/http/server.js.map +1 -1
- package/dist/mcp/cli.d.ts +2 -0
- package/dist/mcp/cli.js +7 -6
- package/dist/mcp/cli.js.map +1 -1
- package/dist/mcp/merchant-auth.d.ts +78 -0
- package/dist/mcp/merchant-auth.js +146 -0
- package/dist/mcp/merchant-auth.js.map +1 -0
- package/dist/mcp/merchant-dirs.d.ts +26 -0
- package/dist/mcp/merchant-dirs.js +44 -0
- package/dist/mcp/merchant-dirs.js.map +1 -0
- package/dist/mcp/merchant-resources.d.ts +38 -0
- package/dist/mcp/merchant-resources.js +146 -0
- package/dist/mcp/merchant-resources.js.map +1 -0
- package/dist/mcp/merchant-server.d.ts +106 -0
- package/dist/mcp/merchant-server.js +615 -0
- package/dist/mcp/merchant-server.js.map +1 -0
- package/dist/mcp/merchant-tools.d.ts +103 -0
- package/dist/mcp/merchant-tools.js +517 -0
- package/dist/mcp/merchant-tools.js.map +1 -0
- package/dist/mcp/server.js +4 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +5 -3
- package/dist/mcp/tools.js +102 -5
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/types.d.ts +1 -1
- package/dist/mcp/types.js +4 -0
- package/dist/mcp/types.js.map +1 -1
- package/dist/merchant/ops.d.ts +0 -11
- package/dist/merchant/ops.js +13 -1
- package/dist/merchant/ops.js.map +1 -1
- 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/merchant/workbench-service.d.ts +189 -0
- package/dist/merchant/workbench-service.js +417 -0
- package/dist/merchant/workbench-service.js.map +1 -0
- package/dist/merchant-admin/pending-page.d.ts +35 -0
- package/dist/merchant-admin/pending-page.js +69 -0
- package/dist/merchant-admin/pending-page.js.map +1 -0
- package/dist/merchant-core/commands.d.ts +99 -0
- package/dist/merchant-core/commands.js +179 -0
- package/dist/merchant-core/commands.js.map +1 -0
- package/dist/merchant-core/executor.d.ts +69 -0
- package/dist/merchant-core/executor.js +218 -0
- package/dist/merchant-core/executor.js.map +1 -0
- package/dist/merchant-core/negotiation-adapters.d.ts +55 -0
- package/dist/merchant-core/negotiation-adapters.js +55 -0
- package/dist/merchant-core/negotiation-adapters.js.map +1 -0
- package/dist/merchant-core/network-checks.d.ts +65 -0
- package/dist/merchant-core/network-checks.js +111 -0
- package/dist/merchant-core/network-checks.js.map +1 -0
- package/dist/merchant-core/operations.d.ts +64 -0
- package/dist/merchant-core/operations.js +136 -0
- package/dist/merchant-core/operations.js.map +1 -0
- package/dist/merchant-core/policy-runtime.d.ts +70 -0
- package/dist/merchant-core/policy-runtime.js +181 -0
- package/dist/merchant-core/policy-runtime.js.map +1 -0
- package/dist/merchant-core/product-import.d.ts +67 -0
- package/dist/merchant-core/product-import.js +160 -0
- package/dist/merchant-core/product-import.js.map +1 -0
- package/dist/merchant-core/service.d.ts +203 -0
- package/dist/merchant-core/service.js +402 -0
- package/dist/merchant-core/service.js.map +1 -0
- package/dist/merchant-gateway/catalog-publications.d.ts +71 -0
- package/dist/merchant-gateway/catalog-publications.js +175 -0
- package/dist/merchant-gateway/catalog-publications.js.map +1 -0
- package/dist/merchant-gateway/catalog-tools.d.ts +46 -0
- package/dist/merchant-gateway/catalog-tools.js +277 -0
- package/dist/merchant-gateway/catalog-tools.js.map +1 -0
- package/dist/merchant-gateway/cli.d.ts +75 -0
- package/dist/merchant-gateway/cli.js +458 -0
- package/dist/merchant-gateway/cli.js.map +1 -0
- package/dist/merchant-gateway/credential-vault.d.ts +44 -0
- package/dist/merchant-gateway/credential-vault.js +111 -0
- package/dist/merchant-gateway/credential-vault.js.map +1 -0
- package/dist/merchant-gateway/entry-server.d.ts +117 -0
- package/dist/merchant-gateway/entry-server.js +710 -0
- package/dist/merchant-gateway/entry-server.js.map +1 -0
- package/dist/merchant-gateway/instance-registration.d.ts +143 -0
- package/dist/merchant-gateway/instance-registration.js +382 -0
- package/dist/merchant-gateway/instance-registration.js.map +1 -0
- package/dist/merchant-gateway/instance-tools.d.ts +58 -0
- package/dist/merchant-gateway/instance-tools.js +184 -0
- package/dist/merchant-gateway/instance-tools.js.map +1 -0
- package/dist/merchant-gateway/mcp-proxy.d.ts +25 -0
- package/dist/merchant-gateway/mcp-proxy.js +192 -0
- package/dist/merchant-gateway/mcp-proxy.js.map +1 -0
- package/dist/merchant-gateway/pinned-fetch.d.ts +52 -0
- package/dist/merchant-gateway/pinned-fetch.js +212 -0
- package/dist/merchant-gateway/pinned-fetch.js.map +1 -0
- package/dist/merchant-gateway/tenant-registry.d.ts +82 -0
- package/dist/merchant-gateway/tenant-registry.js +190 -0
- package/dist/merchant-gateway/tenant-registry.js.map +1 -0
- package/dist/merchant-gateway/tool-bundle.d.ts +26 -0
- package/dist/merchant-gateway/tool-bundle.js +56 -0
- package/dist/merchant-gateway/tool-bundle.js.map +1 -0
- package/dist/merchant-runtime/backup.d.ts +48 -0
- package/dist/merchant-runtime/backup.js +226 -0
- package/dist/merchant-runtime/backup.js.map +1 -0
- package/dist/merchant-runtime/health.d.ts +99 -0
- package/dist/merchant-runtime/health.js +206 -0
- package/dist/merchant-runtime/health.js.map +1 -0
- package/dist/merchant-runtime/jobs.d.ts +64 -0
- package/dist/merchant-runtime/jobs.js +107 -0
- package/dist/merchant-runtime/jobs.js.map +1 -0
- package/dist/merchant-runtime/manager.d.ts +94 -0
- package/dist/merchant-runtime/manager.js +305 -0
- package/dist/merchant-runtime/manager.js.map +1 -0
- package/dist/merchant-runtime/services.d.ts +30 -0
- package/dist/merchant-runtime/services.js +51 -0
- package/dist/merchant-runtime/services.js.map +1 -0
- package/dist/negotiation/action-candidate.js +1 -1
- package/dist/net/url.d.ts +26 -0
- package/dist/net/url.js +32 -0
- package/dist/net/url.js.map +1 -0
- package/dist/operator/types.d.ts +1 -1
- package/dist/product-cli.d.ts +2 -2
- package/dist/product-cli.js +27 -6
- package/dist/product-cli.js.map +1 -1
- package/dist/product-compat.d.ts +9 -1
- package/dist/product-compat.js +12 -1
- package/dist/product-compat.js.map +1 -1
- package/dist/product-init.js +17 -5
- package/dist/product-init.js.map +1 -1
- package/dist/product-publish.js +2 -1
- package/dist/product-publish.js.map +1 -1
- package/dist/product-supplier.d.ts +73 -0
- package/dist/product-supplier.js +224 -5
- package/dist/product-supplier.js.map +1 -1
- 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 +9 -7
- package/skills/kiwi-buyer/SKILL.md +68 -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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-visible external data fencing.
|
|
3
|
+
*
|
|
4
|
+
* Protocol payloads are verified before this module is called. This module
|
|
5
|
+
* only creates a sanitized copy for prompts/UI and must never mutate the
|
|
6
|
+
* payload used for signatures, digests, or ledger events.
|
|
7
|
+
*/
|
|
8
|
+
export type ExternalSource = "a2a_message" | "catalog" | "merchant_api" | "buyer_message" | "human_review" | "ucp_profile" | "metric";
|
|
9
|
+
export declare const DEFAULT_FENCE_MAX_CHARS = 12000;
|
|
10
|
+
export declare const DEFAULT_MEMORY_VALUE_MAX_CHARS = 4000;
|
|
11
|
+
/** Sanitize one untrusted string without changing the caller's value. */
|
|
12
|
+
export declare function sanitizeModelText(input: string, options?: {
|
|
13
|
+
maxChars?: number;
|
|
14
|
+
marker?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
/** True when a value carries one of Kiwi's model-visible external-data fences. */
|
|
17
|
+
export declare function containsExternalFence(value: unknown): boolean;
|
|
18
|
+
/** Sanitize every string in a JSON-like value without mutating the source. */
|
|
19
|
+
export declare function sanitizeModelValue(value: unknown, options?: {
|
|
20
|
+
maxChars?: number;
|
|
21
|
+
depth?: number;
|
|
22
|
+
marker?: string;
|
|
23
|
+
}): unknown;
|
|
24
|
+
/** Wrap sanitized data in a fixed, source-specific fence. */
|
|
25
|
+
export declare function fenceModelPayload(source: ExternalSource, payload: unknown, options?: {
|
|
26
|
+
maxChars?: number;
|
|
27
|
+
}): string;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-visible external data fencing.
|
|
3
|
+
*
|
|
4
|
+
* Protocol payloads are verified before this module is called. This module
|
|
5
|
+
* only creates a sanitized copy for prompts/UI and must never mutate the
|
|
6
|
+
* payload used for signatures, digests, or ledger events.
|
|
7
|
+
*/
|
|
8
|
+
import { inspect } from "node:util";
|
|
9
|
+
export const DEFAULT_FENCE_MAX_CHARS = 12_000;
|
|
10
|
+
export const DEFAULT_MEMORY_VALUE_MAX_CHARS = 4_000;
|
|
11
|
+
const TURN_MARKER = /(\r?\n\s*\r?\n\s*)(human|assistant|system|user)\s*:/gi;
|
|
12
|
+
const LEADING_TURN_MARKER = /^\s*(human|assistant|system|user)\s*:/i;
|
|
13
|
+
const SPECIAL_TOKEN = /<\s*\/?\s*(?:(?:[a-z][\w.-]{0,30}:)?(?:transcript|conversation|function_calls|function_results|invoke|tool_use|tool_result|system|human|user|assistant)|[a-z][\w.-]{0,30}:(?:parameter|result))\b[^<>]{0,160}>|<\|[^|<>\r\n]{1,64}\|>/gi;
|
|
14
|
+
const INVISIBLE_RANGES = [
|
|
15
|
+
[0x00ad, 0x00ad],
|
|
16
|
+
[0x061c, 0x061c],
|
|
17
|
+
[0x180e, 0x180e],
|
|
18
|
+
[0x200b, 0x200f],
|
|
19
|
+
[0x2028, 0x2029],
|
|
20
|
+
[0x202a, 0x202e],
|
|
21
|
+
[0x2060, 0x2064],
|
|
22
|
+
[0x2066, 0x2069],
|
|
23
|
+
[0xfeff, 0xfeff],
|
|
24
|
+
[0xfff9, 0xfffb],
|
|
25
|
+
[0xe0000, 0xe007f],
|
|
26
|
+
[0xe0100, 0xe01ef],
|
|
27
|
+
];
|
|
28
|
+
function isInvisible(codePoint) {
|
|
29
|
+
return INVISIBLE_RANGES.some(([start, end]) => codePoint >= start && codePoint <= end);
|
|
30
|
+
}
|
|
31
|
+
function removeInvisibleAndControl(input) {
|
|
32
|
+
return Array.from(input, (character) => {
|
|
33
|
+
const codePoint = character.codePointAt(0) ?? 0;
|
|
34
|
+
if (isInvisible(codePoint))
|
|
35
|
+
return "";
|
|
36
|
+
if (codePoint <= 0x08 ||
|
|
37
|
+
(codePoint >= 0x0b && codePoint <= 0x1f) ||
|
|
38
|
+
(codePoint >= 0x7f && codePoint <= 0x9f)) {
|
|
39
|
+
return " ";
|
|
40
|
+
}
|
|
41
|
+
return character;
|
|
42
|
+
}).join("");
|
|
43
|
+
}
|
|
44
|
+
function truncate(text, maxChars) {
|
|
45
|
+
if (text.length <= maxChars)
|
|
46
|
+
return text;
|
|
47
|
+
if (maxChars <= 1)
|
|
48
|
+
return "…".slice(0, maxChars);
|
|
49
|
+
return `${text.slice(0, maxChars - 1)}…`;
|
|
50
|
+
}
|
|
51
|
+
/** Sanitize one untrusted string without changing the caller's value. */
|
|
52
|
+
export function sanitizeModelText(input, options = {}) {
|
|
53
|
+
const maxChars = Math.max(1, options.maxChars ?? DEFAULT_FENCE_MAX_CHARS);
|
|
54
|
+
const marker = options.marker ?? "";
|
|
55
|
+
let text = removeInvisibleAndControl(input.normalize("NFKC"));
|
|
56
|
+
// Repeat because removing one token can expose another adjacent token.
|
|
57
|
+
for (let i = 0; i < 3; i += 1) {
|
|
58
|
+
const next = text.replace(SPECIAL_TOKEN, " ").replace(TURN_MARKER, "$1");
|
|
59
|
+
const cleaned = next.replace(LEADING_TURN_MARKER, "");
|
|
60
|
+
if (cleaned === text)
|
|
61
|
+
break;
|
|
62
|
+
text = cleaned;
|
|
63
|
+
}
|
|
64
|
+
if (marker !== "") {
|
|
65
|
+
const escaped = marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
66
|
+
text = text.replace(new RegExp(`<\\s*/?\\s*${escaped}(?![A-Za-z0-9_])(?:[^<>]*>)?`, "gi"), " ");
|
|
67
|
+
}
|
|
68
|
+
return truncate(text, maxChars);
|
|
69
|
+
}
|
|
70
|
+
function modelValue(payload) {
|
|
71
|
+
if (typeof payload === "string")
|
|
72
|
+
return payload;
|
|
73
|
+
try {
|
|
74
|
+
return JSON.stringify(payload) ?? "null";
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return inspect(payload, { depth: 5, breakLength: 120 });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** True when a value carries one of Kiwi's model-visible external-data fences. */
|
|
81
|
+
export function containsExternalFence(value) {
|
|
82
|
+
if (typeof value === "string")
|
|
83
|
+
return /<\s*\/?\s*kiwi_(?:external|memory)_data(?:_|\b)/i.test(value);
|
|
84
|
+
if (Array.isArray(value))
|
|
85
|
+
return value.some(containsExternalFence);
|
|
86
|
+
if (value !== null && typeof value === "object") {
|
|
87
|
+
return Object.values(value).some(containsExternalFence);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
/** Sanitize every string in a JSON-like value without mutating the source. */
|
|
92
|
+
export function sanitizeModelValue(value, options = {}) {
|
|
93
|
+
const maxChars = Math.max(1, options.maxChars ?? DEFAULT_MEMORY_VALUE_MAX_CHARS);
|
|
94
|
+
const maxDepth = Math.max(1, Math.min(options.depth ?? 8, 20));
|
|
95
|
+
const visit = (entry, depth) => {
|
|
96
|
+
if (depth > maxDepth)
|
|
97
|
+
return "[nested value omitted]";
|
|
98
|
+
if (typeof entry === "string")
|
|
99
|
+
return sanitizeModelText(entry, { maxChars, marker: options.marker });
|
|
100
|
+
if (Array.isArray(entry))
|
|
101
|
+
return entry.map((item) => visit(item, depth + 1));
|
|
102
|
+
if (entry !== null && typeof entry === "object") {
|
|
103
|
+
return Object.fromEntries(Object.entries(entry).map(([key, item]) => [
|
|
104
|
+
sanitizeModelText(key, { maxChars: 128, marker: options.marker }),
|
|
105
|
+
visit(item, depth + 1),
|
|
106
|
+
]));
|
|
107
|
+
}
|
|
108
|
+
return entry;
|
|
109
|
+
};
|
|
110
|
+
const sanitized = visit(value, 0);
|
|
111
|
+
const serialized = modelValue(sanitized);
|
|
112
|
+
if (serialized.length <= maxChars)
|
|
113
|
+
return sanitized;
|
|
114
|
+
return sanitizeModelText(serialized, { maxChars, marker: options.marker });
|
|
115
|
+
}
|
|
116
|
+
/** Wrap sanitized data in a fixed, source-specific fence. */
|
|
117
|
+
export function fenceModelPayload(source, payload, options = {}) {
|
|
118
|
+
const label = `kiwi_external_data_${source}`;
|
|
119
|
+
const marker = `<${label}>`;
|
|
120
|
+
const body = sanitizeModelText(modelValue(payload), {
|
|
121
|
+
maxChars: options.maxChars ?? DEFAULT_FENCE_MAX_CHARS,
|
|
122
|
+
marker: label,
|
|
123
|
+
});
|
|
124
|
+
return `${marker}\n${body}\n</${label}>`;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=fencing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fencing.js","sourceRoot":"","sources":["../../../src/agent/context/fencing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Deterministic first-read grounding primitives for model turns. */
|
|
2
|
+
export interface GroundingContext {
|
|
3
|
+
latestUserText: string;
|
|
4
|
+
sessionState: Readonly<Record<string, unknown>>;
|
|
5
|
+
}
|
|
6
|
+
export interface GroundingRead {
|
|
7
|
+
tool: string;
|
|
8
|
+
arguments: Record<string, unknown>;
|
|
9
|
+
reason: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GroundingRule {
|
|
12
|
+
name: string;
|
|
13
|
+
priority: number;
|
|
14
|
+
match(context: GroundingContext): GroundingRead | undefined;
|
|
15
|
+
}
|
|
16
|
+
export declare function firstGroundingRead(rules: readonly GroundingRule[], context: GroundingContext): GroundingRead | undefined;
|
|
17
|
+
/** Return at most maxReads unique read-only tools in deterministic priority order. */
|
|
18
|
+
export declare function groundingReads(rules: readonly GroundingRule[], context: GroundingContext, maxReads?: number): GroundingRead[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Deterministic first-read grounding primitives for model turns. */
|
|
2
|
+
export function firstGroundingRead(rules, context) {
|
|
3
|
+
return groundingReads(rules, context, 1)[0];
|
|
4
|
+
}
|
|
5
|
+
/** Return at most maxReads unique read-only tools in deterministic priority order. */
|
|
6
|
+
export function groundingReads(rules, context, maxReads = 2) {
|
|
7
|
+
const seen = new Set();
|
|
8
|
+
const reads = [];
|
|
9
|
+
for (const read of [...rules]
|
|
10
|
+
.sort((a, b) => a.priority - b.priority)
|
|
11
|
+
.map((rule) => rule.match(context))
|
|
12
|
+
.filter((read) => read !== undefined)) {
|
|
13
|
+
if (seen.has(read.tool))
|
|
14
|
+
continue;
|
|
15
|
+
seen.add(read.tool);
|
|
16
|
+
reads.push(read);
|
|
17
|
+
if (reads.length >= Math.max(1, maxReads))
|
|
18
|
+
break;
|
|
19
|
+
}
|
|
20
|
+
return reads;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=grounding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grounding.js","sourceRoot":"","sources":["../../../src/agent/context/grounding.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAmBrE,MAAM,UAAU,kBAAkB,CAChC,KAA+B,EAC/B,OAAyB;IAEzB,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAC5B,KAA+B,EAC/B,OAAyB,EACzB,QAAQ,GAAG,CAAC;IAEZ,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;SAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;SACvC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;SAClC,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;YAAE,MAAM;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional host-facing event protocol for Merchant Experience integrations.
|
|
3
|
+
*
|
|
4
|
+
* Events are projections for TUI/Web/Buddy hosts. They are not a second
|
|
5
|
+
* business state store: protocol, approval, task and ledger stores remain the
|
|
6
|
+
* sources of truth.
|
|
7
|
+
*/
|
|
8
|
+
export type AgentHostEventType = "message" | "text_delta" | "tool_call" | "tool_result" | "grounding_started" | "grounding_completed" | "ui" | "ui_partial" | "candidate_update" | "negotiation_update" | "progress" | "turn_complete" | "error";
|
|
9
|
+
export interface AgentHostEvent<T = unknown> {
|
|
10
|
+
eventId: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
sequence: number;
|
|
13
|
+
type: AgentHostEventType;
|
|
14
|
+
occurredAt: string;
|
|
15
|
+
data: T;
|
|
16
|
+
}
|
|
17
|
+
export interface AgentEventSink {
|
|
18
|
+
emit(event: AgentHostEvent): void | Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare const NOOP_EVENT_SINK: AgentEventSink;
|
|
21
|
+
/** Tool inputs are operator-visible projections, never raw request/log payloads. */
|
|
22
|
+
export declare function sanitizeHostEventData(type: AgentHostEventType, data: unknown): unknown;
|
|
23
|
+
/** Preserve emit order even when the underlying sink performs asynchronous I/O. */
|
|
24
|
+
export declare class SerializedEventSink implements AgentEventSink {
|
|
25
|
+
private readonly target;
|
|
26
|
+
private chain;
|
|
27
|
+
constructor(target: AgentEventSink);
|
|
28
|
+
emit(event: AgentHostEvent): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
/** Best-effort event emission; host transport failure must not fail a business action. */
|
|
31
|
+
export declare function emitHostEvent(sink: AgentEventSink | undefined, event: AgentHostEvent): Promise<void>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional host-facing event protocol for Merchant Experience integrations.
|
|
3
|
+
*
|
|
4
|
+
* Events are projections for TUI/Web/Buddy hosts. They are not a second
|
|
5
|
+
* business state store: protocol, approval, task and ledger stores remain the
|
|
6
|
+
* sources of truth.
|
|
7
|
+
*/
|
|
8
|
+
import { sanitizeModelValue } from "../context/fencing.js";
|
|
9
|
+
export const NOOP_EVENT_SINK = { emit: () => undefined };
|
|
10
|
+
const SENSITIVE_EVENT_KEY = /authorization|bearer|token|secret|password|credential|private_key|vault/i;
|
|
11
|
+
const MAX_REDACTION_DEPTH = 20;
|
|
12
|
+
function redactSensitiveKeys(value, depth = 0) {
|
|
13
|
+
if (depth > MAX_REDACTION_DEPTH)
|
|
14
|
+
return "[nested value omitted]";
|
|
15
|
+
if (Array.isArray(value))
|
|
16
|
+
return value.map((entry) => redactSensitiveKeys(entry, depth + 1));
|
|
17
|
+
if (value !== null && typeof value === "object") {
|
|
18
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
19
|
+
key,
|
|
20
|
+
SENSITIVE_EVENT_KEY.test(key) ? "[redacted]" : redactSensitiveKeys(entry, depth + 1),
|
|
21
|
+
]));
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
/** Tool inputs are operator-visible projections, never raw request/log payloads. */
|
|
26
|
+
export function sanitizeHostEventData(type, data) {
|
|
27
|
+
if (type !== "tool_call" && type !== "tool_result" && type !== "ui_partial" && type !== "text_delta")
|
|
28
|
+
return data;
|
|
29
|
+
try {
|
|
30
|
+
return sanitizeModelValue(redactSensitiveKeys(data), { maxChars: 4_000 });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return { note: "payload omitted" };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Preserve emit order even when the underlying sink performs asynchronous I/O. */
|
|
37
|
+
export class SerializedEventSink {
|
|
38
|
+
target;
|
|
39
|
+
chain = Promise.resolve();
|
|
40
|
+
constructor(target) {
|
|
41
|
+
this.target = target;
|
|
42
|
+
}
|
|
43
|
+
emit(event) {
|
|
44
|
+
this.chain = this.chain.then(async () => {
|
|
45
|
+
await this.target.emit(event);
|
|
46
|
+
}).catch(() => undefined);
|
|
47
|
+
return this.chain;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Best-effort event emission; host transport failure must not fail a business action. */
|
|
51
|
+
export async function emitHostEvent(sink, event) {
|
|
52
|
+
if (sink === undefined)
|
|
53
|
+
return;
|
|
54
|
+
try {
|
|
55
|
+
await sink.emit(event);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Event delivery is an optional projection. The caller owns logging if it
|
|
59
|
+
// needs telemetry, while the business state remains authoritative.
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/agent/host/events.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AA8B3D,MAAM,CAAC,MAAM,eAAe,GAAmB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AAEzE,MAAM,mBAAmB,GAAG,0EAA0E,CAAC;AACvG,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IACpD,IAAI,KAAK,GAAG,mBAAmB;QAAE,OAAO,wBAAwB,CAAC;IACjE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;YACrE,GAAG;YACH,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;SACrF,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,qBAAqB,CAAC,IAAwB,EAAE,IAAa;IAC3E,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAClH,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,OAAO,mBAAmB;IACb,MAAM,CAAiB;IAChC,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEjD,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,KAAqB;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgC,EAChC,KAAqB;IAErB,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,mEAAmE;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
*/
|
|
7
|
+
import type { Writable } from "node:stream";
|
|
8
|
+
import type { AgentEventSink, AgentHostEvent } from "./events.js";
|
|
9
|
+
declare function renderUi(component: string, payload: unknown): string[];
|
|
10
|
+
/** Optional renderer for hosts that want readable TUI projections from events. */
|
|
11
|
+
export declare class TuiEventSink implements AgentEventSink {
|
|
12
|
+
private readonly output;
|
|
13
|
+
private readonly theme;
|
|
14
|
+
constructor(output: Writable);
|
|
15
|
+
emit(event: AgentHostEvent): void;
|
|
16
|
+
}
|
|
17
|
+
export { renderUi as renderTuiEvent };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
*/
|
|
7
|
+
import { createTheme } from "../../tui/styles.js";
|
|
8
|
+
function asRecord(value) {
|
|
9
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
10
|
+
? value
|
|
11
|
+
: {};
|
|
12
|
+
}
|
|
13
|
+
function display(value) {
|
|
14
|
+
if (value === null || value === undefined)
|
|
15
|
+
return "—";
|
|
16
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
|
|
17
|
+
return String(value);
|
|
18
|
+
return JSON.stringify(value) ?? "—";
|
|
19
|
+
}
|
|
20
|
+
function renderUi(component, payload) {
|
|
21
|
+
const value = asRecord(payload);
|
|
22
|
+
if (component === "merchant_digest") {
|
|
23
|
+
const snapshot = asRecord(value.snapshot);
|
|
24
|
+
const alerts = asRecord(snapshot.alerts);
|
|
25
|
+
const metrics = Array.isArray(snapshot.metrics) ? snapshot.metrics : [];
|
|
26
|
+
return [
|
|
27
|
+
"[经营摘要] " + display(value.title),
|
|
28
|
+
...metrics.slice(0, 8).map((metric) => {
|
|
29
|
+
const item = asRecord(metric);
|
|
30
|
+
return ` ${display(item.name)}: ${display(item.value)} ${display(item.unit)}`;
|
|
31
|
+
}),
|
|
32
|
+
` 活跃磋商 ${display(alerts.active_negotiations)} · 人工审核 ${display(alerts.human_reviews)} · 待审批 ${display(alerts.pending_actions)}`,
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
if (component === "metrics") {
|
|
36
|
+
const points = Array.isArray(value.points) ? value.points : [];
|
|
37
|
+
return [
|
|
38
|
+
`[指标] ${display(value.metric)}(${display(value.period)} / ${display(value.granularity)})`,
|
|
39
|
+
...points.slice(0, 20).map((point) => {
|
|
40
|
+
const item = asRecord(point);
|
|
41
|
+
return ` ${display(item.date)} ${display(item.value)}`;
|
|
42
|
+
}),
|
|
43
|
+
...(typeof value.note === "string" && value.note !== "" ? [` 说明:${value.note}`] : []),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
if (component === "catalog") {
|
|
47
|
+
const products = Array.isArray(value.products) ? value.products : [];
|
|
48
|
+
const health = asRecord(value.health);
|
|
49
|
+
return [
|
|
50
|
+
`[目录] 共 ${display(health.total)} 件 · active ${display(health.active)} · paused ${display(health.paused)} · 缺货 ${display(health.out_of_stock)}`,
|
|
51
|
+
...products.slice(0, 20).map((product) => {
|
|
52
|
+
const item = asRecord(product);
|
|
53
|
+
return ` ${display(item.sku)} ${display(item.title)} 价格 ${display(item.price)} 库存 ${display(item.stock)}`;
|
|
54
|
+
}),
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
if (component === "negotiations") {
|
|
58
|
+
const rows = Array.isArray(payload) ? payload : [];
|
|
59
|
+
return [
|
|
60
|
+
`[磋商] ${rows.length} 条`,
|
|
61
|
+
...rows.slice(0, 20).map((row) => {
|
|
62
|
+
const item = asRecord(row);
|
|
63
|
+
return ` ${display(item.negotiation_id)} ${display(item.phase)} ${display(item.updated_at)}`;
|
|
64
|
+
}),
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
if (component === "human_review") {
|
|
68
|
+
const rows = Array.isArray(value.reviews) ? value.reviews : [];
|
|
69
|
+
return [
|
|
70
|
+
`[人工审核] ${rows.length} 条`,
|
|
71
|
+
...rows.slice(0, 20).map((row) => {
|
|
72
|
+
const item = asRecord(row);
|
|
73
|
+
return ` ${display(item.review_id)} ${display(item.severity)} ${display(item.reason)}`;
|
|
74
|
+
}),
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
if (component === "change_preview") {
|
|
78
|
+
const changes = Array.isArray(value.changes) ? value.changes : [];
|
|
79
|
+
return [
|
|
80
|
+
`[变更预览] ${display(value.headline)}(${display(value.status)})`,
|
|
81
|
+
...changes.slice(0, 20).map((change) => {
|
|
82
|
+
const item = asRecord(change);
|
|
83
|
+
return ` ${display(item.field)}: ${display(item.before)} → ${display(item.after)}`;
|
|
84
|
+
}),
|
|
85
|
+
...(typeof value.note === "string" && value.note !== "" ? [` 说明:${value.note}`] : []),
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
if (component === "suggestions") {
|
|
89
|
+
const suggestions = Array.isArray(value.suggestions) ? value.suggestions : [];
|
|
90
|
+
return ["[建议]", ...suggestions.slice(0, 4).map((suggestion) => ` · ${display(suggestion)}`)];
|
|
91
|
+
}
|
|
92
|
+
return [`[ui] ${component}`];
|
|
93
|
+
}
|
|
94
|
+
/** Optional renderer for hosts that want readable TUI projections from events. */
|
|
95
|
+
export class TuiEventSink {
|
|
96
|
+
output;
|
|
97
|
+
theme;
|
|
98
|
+
constructor(output) {
|
|
99
|
+
this.output = output;
|
|
100
|
+
this.theme = createTheme(output);
|
|
101
|
+
}
|
|
102
|
+
emit(event) {
|
|
103
|
+
const data = asRecord(event.data);
|
|
104
|
+
let lines = [];
|
|
105
|
+
if (event.type === "message" && typeof data.text === "string" && data.role !== "user") {
|
|
106
|
+
lines = [data.text];
|
|
107
|
+
}
|
|
108
|
+
else if (event.type === "grounding_started") {
|
|
109
|
+
lines = [`[数据] 正在读取 ${display(data.tool)}…`];
|
|
110
|
+
}
|
|
111
|
+
else if (event.type === "grounding_completed") {
|
|
112
|
+
lines = [`[数据] ${display(data.tool)}:${display(data.status)}`];
|
|
113
|
+
}
|
|
114
|
+
else if (event.type === "ui") {
|
|
115
|
+
lines = renderUi(display(data.component), data.payload);
|
|
116
|
+
}
|
|
117
|
+
else if (event.type === "error") {
|
|
118
|
+
lines = [`[错误] ${display(data.message)}`];
|
|
119
|
+
}
|
|
120
|
+
for (const line of lines)
|
|
121
|
+
this.output.write(`${this.theme.decorate(line)}\n`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export { renderUi as renderTuiEvent };
|
|
125
|
+
//# sourceMappingURL=tui-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui-renderer.js","sourceRoot":"","sources":["../../../src/agent/host/tui-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 harrylabsj
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentHostEvent } from "./events.js";
|
|
8
|
+
export interface MerchantWebMessage {
|
|
9
|
+
role: "user" | "assistant" | "system";
|
|
10
|
+
text: string;
|
|
11
|
+
sequence: number;
|
|
12
|
+
occurredAt: string;
|
|
13
|
+
}
|
|
14
|
+
export interface MerchantWebToolState {
|
|
15
|
+
tool: string;
|
|
16
|
+
callId: string;
|
|
17
|
+
status: "running" | "ok" | "error";
|
|
18
|
+
input?: unknown;
|
|
19
|
+
summary?: string;
|
|
20
|
+
partial?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface MerchantWebViewState {
|
|
23
|
+
lastSequence: number;
|
|
24
|
+
streamText: string;
|
|
25
|
+
messages: MerchantWebMessage[];
|
|
26
|
+
grounding: Record<string, {
|
|
27
|
+
tool: string;
|
|
28
|
+
status: string;
|
|
29
|
+
}>;
|
|
30
|
+
tools: Record<string, MerchantWebToolState>;
|
|
31
|
+
ui: Record<string, {
|
|
32
|
+
payload: unknown;
|
|
33
|
+
sequence: number;
|
|
34
|
+
}>;
|
|
35
|
+
candidates: Record<string, {
|
|
36
|
+
status: string;
|
|
37
|
+
preview?: unknown;
|
|
38
|
+
}>;
|
|
39
|
+
negotiations: Record<string, {
|
|
40
|
+
phase: string;
|
|
41
|
+
summary: string;
|
|
42
|
+
}>;
|
|
43
|
+
progress: Array<{
|
|
44
|
+
message: string;
|
|
45
|
+
operation?: string;
|
|
46
|
+
step?: string;
|
|
47
|
+
}>;
|
|
48
|
+
errors: Array<{
|
|
49
|
+
code: string;
|
|
50
|
+
message: string;
|
|
51
|
+
retryable?: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
replayGap?: {
|
|
54
|
+
after: number;
|
|
55
|
+
oldest: number;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Framework-neutral reducer for Web/Buddy hosts.
|
|
60
|
+
*
|
|
61
|
+
* It is intentionally a state reducer rather than a DOM/React renderer. The
|
|
62
|
+
* transport may replay events, so duplicate or older sequence numbers are
|
|
63
|
+
* ignored. All values are copied and sanitized before entering view state.
|
|
64
|
+
*/
|
|
65
|
+
export declare class MerchantWebEventRenderer {
|
|
66
|
+
private state;
|
|
67
|
+
get snapshot(): MerchantWebViewState;
|
|
68
|
+
reset(): void;
|
|
69
|
+
applyReplayGap(after: number, oldest: number): void;
|
|
70
|
+
apply(event: AgentHostEvent): MerchantWebViewState;
|
|
71
|
+
}
|