@astrasyncai/verification-gateway 1.0.0 → 2.0.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/dist/adapter-interface/interface.d.mts +71 -0
- package/dist/adapter-interface/interface.d.ts +71 -0
- package/dist/adapter-interface/interface.js +36 -0
- package/dist/adapter-interface/interface.js.map +1 -0
- package/dist/adapter-interface/interface.mjs +10 -0
- package/dist/adapter-interface/interface.mjs.map +1 -0
- package/dist/adapter-interface/purpose-mapping.d.mts +28 -0
- package/dist/adapter-interface/purpose-mapping.d.ts +28 -0
- package/dist/adapter-interface/purpose-mapping.js +117 -0
- package/dist/adapter-interface/purpose-mapping.js.map +1 -0
- package/dist/adapter-interface/purpose-mapping.mjs +89 -0
- package/dist/adapter-interface/purpose-mapping.mjs.map +1 -0
- package/dist/adapters/express.d.mts +2 -2
- package/dist/adapters/express.d.ts +2 -2
- package/dist/adapters/express.js +46 -9
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/express.mjs +46 -9
- package/dist/adapters/express.mjs.map +1 -1
- package/dist/adapters/nextjs.d.mts +2 -2
- package/dist/adapters/nextjs.d.ts +2 -2
- package/dist/adapters/nextjs.js +19 -9
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/nextjs.mjs +19 -9
- package/dist/adapters/nextjs.mjs.map +1 -1
- package/dist/adapters/sdk.d.mts +2 -2
- package/dist/adapters/sdk.d.ts +2 -2
- package/dist/adapters/sdk.js +20 -4
- package/dist/adapters/sdk.js.map +1 -1
- package/dist/adapters/sdk.mjs +20 -4
- package/dist/adapters/sdk.mjs.map +1 -1
- package/dist/agent/index.d.mts +2 -0
- package/dist/agent/index.d.ts +2 -0
- package/dist/agent/index.js +354 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/index.mjs +323 -0
- package/dist/agent/index.mjs.map +1 -0
- package/dist/browser/browser-adapter.d.mts +106 -0
- package/dist/browser/browser-adapter.d.ts +106 -0
- package/dist/browser/browser-adapter.js +286 -0
- package/dist/browser/browser-adapter.js.map +1 -0
- package/dist/browser/browser-adapter.mjs +259 -0
- package/dist/browser/browser-adapter.mjs.map +1 -0
- package/dist/cli/index.d.mts +241 -0
- package/dist/cli/index.d.ts +241 -0
- package/dist/cli/index.js +3734 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +3688 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/cursor/cursor-adapter.d.mts +92 -0
- package/dist/cursor/cursor-adapter.d.ts +92 -0
- package/dist/cursor/cursor-adapter.js +273 -0
- package/dist/cursor/cursor-adapter.js.map +1 -0
- package/dist/cursor/cursor-adapter.mjs +246 -0
- package/dist/cursor/cursor-adapter.mjs.map +1 -0
- package/dist/{express-DUDYpvNZ.d.mts → express-Cp4eg77F.d.mts} +1 -1
- package/dist/{express-BhD3mWsL.d.ts → express-DIEyq1Tz.d.ts} +1 -1
- package/dist/gateway/gateway.d.mts +70 -0
- package/dist/gateway/gateway.d.ts +70 -0
- package/dist/gateway/gateway.js +3726 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/gateway.mjs +3706 -0
- package/dist/gateway/gateway.mjs.map +1 -0
- package/dist/git-trigger/git-hooks.d.mts +69 -0
- package/dist/git-trigger/git-hooks.d.ts +69 -0
- package/dist/git-trigger/git-hooks.js +244 -0
- package/dist/git-trigger/git-hooks.js.map +1 -0
- package/dist/git-trigger/git-hooks.mjs +221 -0
- package/dist/git-trigger/git-hooks.mjs.map +1 -0
- package/dist/index-BhTbGU-o.d.mts +206 -0
- package/dist/index-Bhfxq9xI.d.ts +206 -0
- package/dist/index-CNkmHmpi.d.ts +89 -0
- package/dist/index-CoLebmwv.d.mts +89 -0
- package/dist/index.d.mts +8 -295
- package/dist/index.d.ts +8 -295
- package/dist/index.js +60 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +60 -21
- package/dist/index.mjs.map +1 -1
- package/dist/local-evaluator/evaluator.d.mts +55 -0
- package/dist/local-evaluator/evaluator.d.ts +55 -0
- package/dist/local-evaluator/evaluator.js +272 -0
- package/dist/local-evaluator/evaluator.js.map +1 -0
- package/dist/local-evaluator/evaluator.mjs +244 -0
- package/dist/local-evaluator/evaluator.mjs.map +1 -0
- package/dist/{nextjs-C9FPOjSh.d.ts → nextjs-Cag7libc.d.ts} +1 -1
- package/dist/{nextjs-BtqyLSVQ.d.mts → nextjs-_C_FcJY5.d.mts} +1 -1
- package/dist/{sdk-BkVigGjF.d.ts → sdk-CMPDFUjo.d.ts} +3 -1
- package/dist/{sdk-xCbZgeZx.d.mts → sdk-DAJahT3p.d.mts} +3 -1
- package/dist/transport/index.d.mts +2 -0
- package/dist/transport/index.d.ts +2 -0
- package/dist/transport/index.js +211 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/index.mjs +176 -0
- package/dist/transport/index.mjs.map +1 -0
- package/dist/{types-CS6v75-d.d.mts → types-Bf8pML07.d.mts} +9 -1
- package/dist/{types-CS6v75-d.d.ts → types-Bf8pML07.d.ts} +9 -1
- package/dist/types-BvpGdsv1.d.mts +153 -0
- package/dist/types-Ce2mFJkO.d.ts +153 -0
- package/dist/ui/index.d.mts +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/package.json +46 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AstraSyncGateway } from '../gateway/gateway.mjs';
|
|
2
|
+
import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-BvpGdsv1.mjs';
|
|
3
|
+
import '../types-Bf8pML07.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* PlatformAdapter Interface
|
|
7
|
+
*
|
|
8
|
+
* The contract that Layer 4 platform adapters implement.
|
|
9
|
+
* Agent-side interception: governs what agents are allowed to do before they do it.
|
|
10
|
+
*
|
|
11
|
+
* Each adapter is 200-500 lines of platform-specific code.
|
|
12
|
+
* All verification logic lives in the gateway — adapters just translate
|
|
13
|
+
* between the platform's world and AstraSync's world.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
interface AdapterConfig {
|
|
17
|
+
/** The AstraSyncGateway instance (handles mode routing) */
|
|
18
|
+
gateway: AstraSyncGateway;
|
|
19
|
+
/** Platform-specific configuration */
|
|
20
|
+
adapterOptions: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
interface PlatformAdapter {
|
|
23
|
+
/**
|
|
24
|
+
* Interface version for compatibility checking.
|
|
25
|
+
* Current version: 1.
|
|
26
|
+
*/
|
|
27
|
+
readonly interfaceVersion: number;
|
|
28
|
+
/**
|
|
29
|
+
* Platform-specific initialization.
|
|
30
|
+
* Load config, register hooks, establish connections.
|
|
31
|
+
*/
|
|
32
|
+
initialize(config: AdapterConfig): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Graceful shutdown.
|
|
35
|
+
* Drain in-flight verifications, deregister hooks, close connections.
|
|
36
|
+
*/
|
|
37
|
+
shutdown(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Intercept an agent action before execution.
|
|
40
|
+
*
|
|
41
|
+
* How this works depends on the platform:
|
|
42
|
+
* - CLI adapter: proxy server captures outbound request
|
|
43
|
+
* - Browser adapter: content script intercepts DOM interaction
|
|
44
|
+
* - Express: middleware captures inbound request
|
|
45
|
+
*/
|
|
46
|
+
interceptAction(action: AgentAction): Promise<InterceptResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Extract PDLSS-compatible context from a platform-specific action.
|
|
49
|
+
* Maps platform-native action format to the universal PDLSSContext.
|
|
50
|
+
*/
|
|
51
|
+
extractContext(action: AgentAction): PDLSSContext;
|
|
52
|
+
/**
|
|
53
|
+
* Enforce the verification decision in a platform-specific way.
|
|
54
|
+
*
|
|
55
|
+
* How this works depends on the platform:
|
|
56
|
+
* - CLI: block command / allow command / prompt for approval
|
|
57
|
+
* - Browser: block navigation / show confirmation dialog
|
|
58
|
+
* - Express: return 403 / pass through / inject headers
|
|
59
|
+
*/
|
|
60
|
+
enforceDecision(decision: VerificationDecision): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Current adapter interface version.
|
|
64
|
+
*/
|
|
65
|
+
declare const ADAPTER_INTERFACE_VERSION = 1;
|
|
66
|
+
/**
|
|
67
|
+
* Check if an adapter is compatible with the current interface version.
|
|
68
|
+
*/
|
|
69
|
+
declare function isCompatibleAdapter(adapter: PlatformAdapter): boolean;
|
|
70
|
+
|
|
71
|
+
export { ADAPTER_INTERFACE_VERSION, type AdapterConfig, type PlatformAdapter, isCompatibleAdapter };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { AstraSyncGateway } from '../gateway/gateway.js';
|
|
2
|
+
import { A as AgentAction, I as InterceptResult, P as PDLSSContext, V as VerificationDecision } from '../types-Ce2mFJkO.js';
|
|
3
|
+
import '../types-Bf8pML07.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* PlatformAdapter Interface
|
|
7
|
+
*
|
|
8
|
+
* The contract that Layer 4 platform adapters implement.
|
|
9
|
+
* Agent-side interception: governs what agents are allowed to do before they do it.
|
|
10
|
+
*
|
|
11
|
+
* Each adapter is 200-500 lines of platform-specific code.
|
|
12
|
+
* All verification logic lives in the gateway — adapters just translate
|
|
13
|
+
* between the platform's world and AstraSync's world.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
interface AdapterConfig {
|
|
17
|
+
/** The AstraSyncGateway instance (handles mode routing) */
|
|
18
|
+
gateway: AstraSyncGateway;
|
|
19
|
+
/** Platform-specific configuration */
|
|
20
|
+
adapterOptions: Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
interface PlatformAdapter {
|
|
23
|
+
/**
|
|
24
|
+
* Interface version for compatibility checking.
|
|
25
|
+
* Current version: 1.
|
|
26
|
+
*/
|
|
27
|
+
readonly interfaceVersion: number;
|
|
28
|
+
/**
|
|
29
|
+
* Platform-specific initialization.
|
|
30
|
+
* Load config, register hooks, establish connections.
|
|
31
|
+
*/
|
|
32
|
+
initialize(config: AdapterConfig): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Graceful shutdown.
|
|
35
|
+
* Drain in-flight verifications, deregister hooks, close connections.
|
|
36
|
+
*/
|
|
37
|
+
shutdown(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Intercept an agent action before execution.
|
|
40
|
+
*
|
|
41
|
+
* How this works depends on the platform:
|
|
42
|
+
* - CLI adapter: proxy server captures outbound request
|
|
43
|
+
* - Browser adapter: content script intercepts DOM interaction
|
|
44
|
+
* - Express: middleware captures inbound request
|
|
45
|
+
*/
|
|
46
|
+
interceptAction(action: AgentAction): Promise<InterceptResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Extract PDLSS-compatible context from a platform-specific action.
|
|
49
|
+
* Maps platform-native action format to the universal PDLSSContext.
|
|
50
|
+
*/
|
|
51
|
+
extractContext(action: AgentAction): PDLSSContext;
|
|
52
|
+
/**
|
|
53
|
+
* Enforce the verification decision in a platform-specific way.
|
|
54
|
+
*
|
|
55
|
+
* How this works depends on the platform:
|
|
56
|
+
* - CLI: block command / allow command / prompt for approval
|
|
57
|
+
* - Browser: block navigation / show confirmation dialog
|
|
58
|
+
* - Express: return 403 / pass through / inject headers
|
|
59
|
+
*/
|
|
60
|
+
enforceDecision(decision: VerificationDecision): Promise<void>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Current adapter interface version.
|
|
64
|
+
*/
|
|
65
|
+
declare const ADAPTER_INTERFACE_VERSION = 1;
|
|
66
|
+
/**
|
|
67
|
+
* Check if an adapter is compatible with the current interface version.
|
|
68
|
+
*/
|
|
69
|
+
declare function isCompatibleAdapter(adapter: PlatformAdapter): boolean;
|
|
70
|
+
|
|
71
|
+
export { ADAPTER_INTERFACE_VERSION, type AdapterConfig, type PlatformAdapter, isCompatibleAdapter };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/adapter-interface/interface.ts
|
|
21
|
+
var interface_exports = {};
|
|
22
|
+
__export(interface_exports, {
|
|
23
|
+
ADAPTER_INTERFACE_VERSION: () => ADAPTER_INTERFACE_VERSION,
|
|
24
|
+
isCompatibleAdapter: () => isCompatibleAdapter
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(interface_exports);
|
|
27
|
+
var ADAPTER_INTERFACE_VERSION = 1;
|
|
28
|
+
function isCompatibleAdapter(adapter) {
|
|
29
|
+
return adapter.interfaceVersion === ADAPTER_INTERFACE_VERSION;
|
|
30
|
+
}
|
|
31
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
32
|
+
0 && (module.exports = {
|
|
33
|
+
ADAPTER_INTERFACE_VERSION,
|
|
34
|
+
isCompatibleAdapter
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapter-interface/interface.ts"],"sourcesContent":["/**\n * PlatformAdapter Interface\n *\n * The contract that Layer 4 platform adapters implement.\n * Agent-side interception: governs what agents are allowed to do before they do it.\n *\n * Each adapter is 200-500 lines of platform-specific code.\n * All verification logic lives in the gateway — adapters just translate\n * between the platform's world and AstraSync's world.\n */\n\nimport type { AstraSyncGateway } from '../gateway/gateway';\nimport type { PDLSSContext, VerificationDecision, AgentAction, InterceptResult } from '../gateway/types';\n\nexport interface AdapterConfig {\n /** The AstraSyncGateway instance (handles mode routing) */\n gateway: AstraSyncGateway;\n /** Platform-specific configuration */\n adapterOptions: Record<string, unknown>;\n}\n\nexport interface PlatformAdapter {\n /**\n * Interface version for compatibility checking.\n * Current version: 1.\n */\n readonly interfaceVersion: number;\n\n /**\n * Platform-specific initialization.\n * Load config, register hooks, establish connections.\n */\n initialize(config: AdapterConfig): Promise<void>;\n\n /**\n * Graceful shutdown.\n * Drain in-flight verifications, deregister hooks, close connections.\n */\n shutdown(): Promise<void>;\n\n /**\n * Intercept an agent action before execution.\n *\n * How this works depends on the platform:\n * - CLI adapter: proxy server captures outbound request\n * - Browser adapter: content script intercepts DOM interaction\n * - Express: middleware captures inbound request\n */\n interceptAction(action: AgentAction): Promise<InterceptResult>;\n\n /**\n * Extract PDLSS-compatible context from a platform-specific action.\n * Maps platform-native action format to the universal PDLSSContext.\n */\n extractContext(action: AgentAction): PDLSSContext;\n\n /**\n * Enforce the verification decision in a platform-specific way.\n *\n * How this works depends on the platform:\n * - CLI: block command / allow command / prompt for approval\n * - Browser: block navigation / show confirmation dialog\n * - Express: return 403 / pass through / inject headers\n */\n enforceDecision(decision: VerificationDecision): Promise<void>;\n}\n\n/**\n * Current adapter interface version.\n */\nexport const ADAPTER_INTERFACE_VERSION = 1;\n\n/**\n * Check if an adapter is compatible with the current interface version.\n */\nexport function isCompatibleAdapter(adapter: PlatformAdapter): boolean {\n return adapter.interfaceVersion === ADAPTER_INTERFACE_VERSION;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEO,IAAM,4BAA4B;AAKlC,SAAS,oBAAoB,SAAmC;AACrE,SAAO,QAAQ,qBAAqB;AACtC;","names":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/adapter-interface/interface.ts
|
|
2
|
+
var ADAPTER_INTERFACE_VERSION = 1;
|
|
3
|
+
function isCompatibleAdapter(adapter) {
|
|
4
|
+
return adapter.interfaceVersion === ADAPTER_INTERFACE_VERSION;
|
|
5
|
+
}
|
|
6
|
+
export {
|
|
7
|
+
ADAPTER_INTERFACE_VERSION,
|
|
8
|
+
isCompatibleAdapter
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=interface.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapter-interface/interface.ts"],"sourcesContent":["/**\n * PlatformAdapter Interface\n *\n * The contract that Layer 4 platform adapters implement.\n * Agent-side interception: governs what agents are allowed to do before they do it.\n *\n * Each adapter is 200-500 lines of platform-specific code.\n * All verification logic lives in the gateway — adapters just translate\n * between the platform's world and AstraSync's world.\n */\n\nimport type { AstraSyncGateway } from '../gateway/gateway';\nimport type { PDLSSContext, VerificationDecision, AgentAction, InterceptResult } from '../gateway/types';\n\nexport interface AdapterConfig {\n /** The AstraSyncGateway instance (handles mode routing) */\n gateway: AstraSyncGateway;\n /** Platform-specific configuration */\n adapterOptions: Record<string, unknown>;\n}\n\nexport interface PlatformAdapter {\n /**\n * Interface version for compatibility checking.\n * Current version: 1.\n */\n readonly interfaceVersion: number;\n\n /**\n * Platform-specific initialization.\n * Load config, register hooks, establish connections.\n */\n initialize(config: AdapterConfig): Promise<void>;\n\n /**\n * Graceful shutdown.\n * Drain in-flight verifications, deregister hooks, close connections.\n */\n shutdown(): Promise<void>;\n\n /**\n * Intercept an agent action before execution.\n *\n * How this works depends on the platform:\n * - CLI adapter: proxy server captures outbound request\n * - Browser adapter: content script intercepts DOM interaction\n * - Express: middleware captures inbound request\n */\n interceptAction(action: AgentAction): Promise<InterceptResult>;\n\n /**\n * Extract PDLSS-compatible context from a platform-specific action.\n * Maps platform-native action format to the universal PDLSSContext.\n */\n extractContext(action: AgentAction): PDLSSContext;\n\n /**\n * Enforce the verification decision in a platform-specific way.\n *\n * How this works depends on the platform:\n * - CLI: block command / allow command / prompt for approval\n * - Browser: block navigation / show confirmation dialog\n * - Express: return 403 / pass through / inject headers\n */\n enforceDecision(decision: VerificationDecision): Promise<void>;\n}\n\n/**\n * Current adapter interface version.\n */\nexport const ADAPTER_INTERFACE_VERSION = 1;\n\n/**\n * Check if an adapter is compatible with the current interface version.\n */\nexport function isCompatibleAdapter(adapter: PlatformAdapter): boolean {\n return adapter.interfaceVersion === ADAPTER_INTERFACE_VERSION;\n}\n"],"mappings":";AAsEO,IAAM,4BAA4B;AAKlC,SAAS,oBAAoB,SAAmC;AACrE,SAAO,QAAQ,qBAAqB;AACtC;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared purpose mapping utilities for Layer 4 platform adapters.
|
|
3
|
+
*
|
|
4
|
+
* Maps platform-native action names to PDLSS purpose categories.
|
|
5
|
+
* Used by OpenClaw CLI, Cursor, browser, and future adapters.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Map a tool/action name to a PDLSS purpose category.
|
|
9
|
+
* Returns `tool.<name>` for unmapped tools (denied by default).
|
|
10
|
+
*/
|
|
11
|
+
declare function mapToolToPurpose(toolName: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Register additional tool → purpose mappings (e.g. from a platform adapter).
|
|
14
|
+
* Does not overwrite existing mappings.
|
|
15
|
+
*/
|
|
16
|
+
declare function registerToolMappings(mappings: Record<string, string>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Extract the meaningful target string from tool arguments.
|
|
19
|
+
* Uses the purpose category to determine which argument field is relevant.
|
|
20
|
+
*/
|
|
21
|
+
declare function extractTarget(toolName: string, args: Record<string, unknown>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Extract network domains from a URL target.
|
|
24
|
+
* Returns undefined if the target is not a URL.
|
|
25
|
+
*/
|
|
26
|
+
declare function extractNetworkDomains(target: string): string[] | undefined;
|
|
27
|
+
|
|
28
|
+
export { extractNetworkDomains, extractTarget, mapToolToPurpose, registerToolMappings };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared purpose mapping utilities for Layer 4 platform adapters.
|
|
3
|
+
*
|
|
4
|
+
* Maps platform-native action names to PDLSS purpose categories.
|
|
5
|
+
* Used by OpenClaw CLI, Cursor, browser, and future adapters.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Map a tool/action name to a PDLSS purpose category.
|
|
9
|
+
* Returns `tool.<name>` for unmapped tools (denied by default).
|
|
10
|
+
*/
|
|
11
|
+
declare function mapToolToPurpose(toolName: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Register additional tool → purpose mappings (e.g. from a platform adapter).
|
|
14
|
+
* Does not overwrite existing mappings.
|
|
15
|
+
*/
|
|
16
|
+
declare function registerToolMappings(mappings: Record<string, string>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Extract the meaningful target string from tool arguments.
|
|
19
|
+
* Uses the purpose category to determine which argument field is relevant.
|
|
20
|
+
*/
|
|
21
|
+
declare function extractTarget(toolName: string, args: Record<string, unknown>): string;
|
|
22
|
+
/**
|
|
23
|
+
* Extract network domains from a URL target.
|
|
24
|
+
* Returns undefined if the target is not a URL.
|
|
25
|
+
*/
|
|
26
|
+
declare function extractNetworkDomains(target: string): string[] | undefined;
|
|
27
|
+
|
|
28
|
+
export { extractNetworkDomains, extractTarget, mapToolToPurpose, registerToolMappings };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/adapter-interface/purpose-mapping.ts
|
|
21
|
+
var purpose_mapping_exports = {};
|
|
22
|
+
__export(purpose_mapping_exports, {
|
|
23
|
+
extractNetworkDomains: () => extractNetworkDomains,
|
|
24
|
+
extractTarget: () => extractTarget,
|
|
25
|
+
mapToolToPurpose: () => mapToolToPurpose,
|
|
26
|
+
registerToolMappings: () => registerToolMappings
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(purpose_mapping_exports);
|
|
29
|
+
var TOOL_PURPOSE_MAP = {
|
|
30
|
+
// Shell
|
|
31
|
+
shell_exec: "shell.exec",
|
|
32
|
+
run_command: "shell.exec",
|
|
33
|
+
execute: "shell.exec",
|
|
34
|
+
terminal_exec: "shell.exec",
|
|
35
|
+
run_terminal_command: "shell.exec",
|
|
36
|
+
// File read
|
|
37
|
+
file_read: "file.read",
|
|
38
|
+
read_file: "file.read",
|
|
39
|
+
// File write
|
|
40
|
+
file_write: "file.write",
|
|
41
|
+
write_file: "file.write",
|
|
42
|
+
create_file: "file.write",
|
|
43
|
+
edit_file: "file.write",
|
|
44
|
+
// File delete
|
|
45
|
+
file_delete: "file.delete",
|
|
46
|
+
delete_file: "file.delete",
|
|
47
|
+
// Network
|
|
48
|
+
http_request: "network.request",
|
|
49
|
+
fetch: "network.request",
|
|
50
|
+
web_request: "network.request",
|
|
51
|
+
// Email
|
|
52
|
+
send_email: "email.send",
|
|
53
|
+
read_email: "email.read",
|
|
54
|
+
// Calendar
|
|
55
|
+
create_event: "calendar.create",
|
|
56
|
+
// Database
|
|
57
|
+
query_database: "database.query",
|
|
58
|
+
write_database: "database.write",
|
|
59
|
+
// Payment
|
|
60
|
+
payment_execute: "payment.execute"
|
|
61
|
+
};
|
|
62
|
+
function mapToolToPurpose(toolName) {
|
|
63
|
+
return TOOL_PURPOSE_MAP[toolName] || `tool.${toolName}`;
|
|
64
|
+
}
|
|
65
|
+
function registerToolMappings(mappings) {
|
|
66
|
+
for (const [tool, purpose] of Object.entries(mappings)) {
|
|
67
|
+
if (!(tool in TOOL_PURPOSE_MAP)) {
|
|
68
|
+
TOOL_PURPOSE_MAP[tool] = purpose;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function extractTarget(toolName, args) {
|
|
73
|
+
const purpose = mapToolToPurpose(toolName);
|
|
74
|
+
if (purpose.startsWith("shell.")) {
|
|
75
|
+
return String(args.command || args.cmd || args.script || "");
|
|
76
|
+
}
|
|
77
|
+
if (purpose.startsWith("file.")) {
|
|
78
|
+
return String(args.path || args.file || args.filename || args.file_path || "");
|
|
79
|
+
}
|
|
80
|
+
if (purpose.startsWith("network.")) {
|
|
81
|
+
return String(args.url || args.endpoint || args.uri || "");
|
|
82
|
+
}
|
|
83
|
+
if (purpose.startsWith("email.")) {
|
|
84
|
+
return String(args.to || args.recipient || args.address || "");
|
|
85
|
+
}
|
|
86
|
+
if (purpose.startsWith("database.")) {
|
|
87
|
+
return String(args.query || args.table || "");
|
|
88
|
+
}
|
|
89
|
+
if (purpose.startsWith("payment.")) {
|
|
90
|
+
return String(args.description || args.merchant || args.amount || "");
|
|
91
|
+
}
|
|
92
|
+
if (args.command) return String(args.command);
|
|
93
|
+
if (args.path) return String(args.path);
|
|
94
|
+
if (args.url) return String(args.url);
|
|
95
|
+
for (const val of Object.values(args)) {
|
|
96
|
+
if (typeof val === "string" && val.length > 0) return val;
|
|
97
|
+
}
|
|
98
|
+
return toolName;
|
|
99
|
+
}
|
|
100
|
+
function extractNetworkDomains(target) {
|
|
101
|
+
try {
|
|
102
|
+
if (target.startsWith("http://") || target.startsWith("https://")) {
|
|
103
|
+
const url = new URL(target);
|
|
104
|
+
return [url.hostname];
|
|
105
|
+
}
|
|
106
|
+
} catch {
|
|
107
|
+
}
|
|
108
|
+
return void 0;
|
|
109
|
+
}
|
|
110
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
111
|
+
0 && (module.exports = {
|
|
112
|
+
extractNetworkDomains,
|
|
113
|
+
extractTarget,
|
|
114
|
+
mapToolToPurpose,
|
|
115
|
+
registerToolMappings
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=purpose-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapter-interface/purpose-mapping.ts"],"sourcesContent":["/**\n * Shared purpose mapping utilities for Layer 4 platform adapters.\n *\n * Maps platform-native action names to PDLSS purpose categories.\n * Used by OpenClaw CLI, Cursor, browser, and future adapters.\n */\n\n// -----------------------------------------------------------------------\n// Tool → Purpose mapping\n// -----------------------------------------------------------------------\n\n/** Standard tool name → PDLSS purpose mapping used by all adapters */\nconst TOOL_PURPOSE_MAP: Record<string, string> = {\n // Shell\n shell_exec: 'shell.exec',\n run_command: 'shell.exec',\n execute: 'shell.exec',\n terminal_exec: 'shell.exec',\n run_terminal_command: 'shell.exec',\n\n // File read\n file_read: 'file.read',\n read_file: 'file.read',\n\n // File write\n file_write: 'file.write',\n write_file: 'file.write',\n create_file: 'file.write',\n edit_file: 'file.write',\n\n // File delete\n file_delete: 'file.delete',\n delete_file: 'file.delete',\n\n // Network\n http_request: 'network.request',\n fetch: 'network.request',\n web_request: 'network.request',\n\n // Email\n send_email: 'email.send',\n read_email: 'email.read',\n\n // Calendar\n create_event: 'calendar.create',\n\n // Database\n query_database: 'database.query',\n write_database: 'database.write',\n\n // Payment\n payment_execute: 'payment.execute',\n};\n\n/**\n * Map a tool/action name to a PDLSS purpose category.\n * Returns `tool.<name>` for unmapped tools (denied by default).\n */\nexport function mapToolToPurpose(toolName: string): string {\n return TOOL_PURPOSE_MAP[toolName] || `tool.${toolName}`;\n}\n\n/**\n * Register additional tool → purpose mappings (e.g. from a platform adapter).\n * Does not overwrite existing mappings.\n */\nexport function registerToolMappings(mappings: Record<string, string>): void {\n for (const [tool, purpose] of Object.entries(mappings)) {\n if (!(tool in TOOL_PURPOSE_MAP)) {\n TOOL_PURPOSE_MAP[tool] = purpose;\n }\n }\n}\n\n// -----------------------------------------------------------------------\n// Target extraction\n// -----------------------------------------------------------------------\n\n/**\n * Extract the meaningful target string from tool arguments.\n * Uses the purpose category to determine which argument field is relevant.\n */\nexport function extractTarget(toolName: string, args: Record<string, unknown>): string {\n const purpose = mapToolToPurpose(toolName);\n\n if (purpose.startsWith('shell.')) {\n return String(args.command || args.cmd || args.script || '');\n }\n\n if (purpose.startsWith('file.')) {\n return String(args.path || args.file || args.filename || args.file_path || '');\n }\n\n if (purpose.startsWith('network.')) {\n return String(args.url || args.endpoint || args.uri || '');\n }\n\n if (purpose.startsWith('email.')) {\n return String(args.to || args.recipient || args.address || '');\n }\n\n if (purpose.startsWith('database.')) {\n return String(args.query || args.table || '');\n }\n\n if (purpose.startsWith('payment.')) {\n return String(args.description || args.merchant || args.amount || '');\n }\n\n // Fallback: try common field names\n if (args.command) return String(args.command);\n if (args.path) return String(args.path);\n if (args.url) return String(args.url);\n\n // Default: use first non-empty string argument or tool name\n for (const val of Object.values(args)) {\n if (typeof val === 'string' && val.length > 0) return val;\n }\n return toolName;\n}\n\n// -----------------------------------------------------------------------\n// Network domain extraction\n// -----------------------------------------------------------------------\n\n/**\n * Extract network domains from a URL target.\n * Returns undefined if the target is not a URL.\n */\nexport function extractNetworkDomains(target: string): string[] | undefined {\n try {\n if (target.startsWith('http://') || target.startsWith('https://')) {\n const url = new URL(target);\n return [url.hostname];\n }\n } catch {\n // Not a URL\n }\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,IAAM,mBAA2C;AAAA;AAAA,EAE/C,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,eAAe;AAAA,EACf,sBAAsB;AAAA;AAAA,EAGtB,WAAW;AAAA,EACX,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA;AAAA,EAGX,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAGb,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA;AAAA,EAGb,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,cAAc;AAAA;AAAA,EAGd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAGhB,iBAAiB;AACnB;AAMO,SAAS,iBAAiB,UAA0B;AACzD,SAAO,iBAAiB,QAAQ,KAAK,QAAQ,QAAQ;AACvD;AAMO,SAAS,qBAAqB,UAAwC;AAC3E,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACtD,QAAI,EAAE,QAAQ,mBAAmB;AAC/B,uBAAiB,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAUO,SAAS,cAAc,UAAkB,MAAuC;AACrF,QAAM,UAAU,iBAAiB,QAAQ;AAEzC,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,EAAE;AAAA,EAC7D;AAEA,MAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,WAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY,KAAK,aAAa,EAAE;AAAA,EAC/E;AAEA,MAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,WAAO,OAAO,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,EAAE;AAAA,EAC3D;AAEA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,OAAO,KAAK,MAAM,KAAK,aAAa,KAAK,WAAW,EAAE;AAAA,EAC/D;AAEA,MAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,WAAO,OAAO,KAAK,SAAS,KAAK,SAAS,EAAE;AAAA,EAC9C;AAEA,MAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,WAAO,OAAO,KAAK,eAAe,KAAK,YAAY,KAAK,UAAU,EAAE;AAAA,EACtE;AAGA,MAAI,KAAK,QAAS,QAAO,OAAO,KAAK,OAAO;AAC5C,MAAI,KAAK,KAAM,QAAO,OAAO,KAAK,IAAI;AACtC,MAAI,KAAK,IAAK,QAAO,OAAO,KAAK,GAAG;AAGpC,aAAW,OAAO,OAAO,OAAO,IAAI,GAAG;AACrC,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,QAAO;AAAA,EACxD;AACA,SAAO;AACT;AAUO,SAAS,sBAAsB,QAAsC;AAC1E,MAAI;AACF,QAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,GAAG;AACjE,YAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,aAAO,CAAC,IAAI,QAAQ;AAAA,IACtB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// src/adapter-interface/purpose-mapping.ts
|
|
2
|
+
var TOOL_PURPOSE_MAP = {
|
|
3
|
+
// Shell
|
|
4
|
+
shell_exec: "shell.exec",
|
|
5
|
+
run_command: "shell.exec",
|
|
6
|
+
execute: "shell.exec",
|
|
7
|
+
terminal_exec: "shell.exec",
|
|
8
|
+
run_terminal_command: "shell.exec",
|
|
9
|
+
// File read
|
|
10
|
+
file_read: "file.read",
|
|
11
|
+
read_file: "file.read",
|
|
12
|
+
// File write
|
|
13
|
+
file_write: "file.write",
|
|
14
|
+
write_file: "file.write",
|
|
15
|
+
create_file: "file.write",
|
|
16
|
+
edit_file: "file.write",
|
|
17
|
+
// File delete
|
|
18
|
+
file_delete: "file.delete",
|
|
19
|
+
delete_file: "file.delete",
|
|
20
|
+
// Network
|
|
21
|
+
http_request: "network.request",
|
|
22
|
+
fetch: "network.request",
|
|
23
|
+
web_request: "network.request",
|
|
24
|
+
// Email
|
|
25
|
+
send_email: "email.send",
|
|
26
|
+
read_email: "email.read",
|
|
27
|
+
// Calendar
|
|
28
|
+
create_event: "calendar.create",
|
|
29
|
+
// Database
|
|
30
|
+
query_database: "database.query",
|
|
31
|
+
write_database: "database.write",
|
|
32
|
+
// Payment
|
|
33
|
+
payment_execute: "payment.execute"
|
|
34
|
+
};
|
|
35
|
+
function mapToolToPurpose(toolName) {
|
|
36
|
+
return TOOL_PURPOSE_MAP[toolName] || `tool.${toolName}`;
|
|
37
|
+
}
|
|
38
|
+
function registerToolMappings(mappings) {
|
|
39
|
+
for (const [tool, purpose] of Object.entries(mappings)) {
|
|
40
|
+
if (!(tool in TOOL_PURPOSE_MAP)) {
|
|
41
|
+
TOOL_PURPOSE_MAP[tool] = purpose;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function extractTarget(toolName, args) {
|
|
46
|
+
const purpose = mapToolToPurpose(toolName);
|
|
47
|
+
if (purpose.startsWith("shell.")) {
|
|
48
|
+
return String(args.command || args.cmd || args.script || "");
|
|
49
|
+
}
|
|
50
|
+
if (purpose.startsWith("file.")) {
|
|
51
|
+
return String(args.path || args.file || args.filename || args.file_path || "");
|
|
52
|
+
}
|
|
53
|
+
if (purpose.startsWith("network.")) {
|
|
54
|
+
return String(args.url || args.endpoint || args.uri || "");
|
|
55
|
+
}
|
|
56
|
+
if (purpose.startsWith("email.")) {
|
|
57
|
+
return String(args.to || args.recipient || args.address || "");
|
|
58
|
+
}
|
|
59
|
+
if (purpose.startsWith("database.")) {
|
|
60
|
+
return String(args.query || args.table || "");
|
|
61
|
+
}
|
|
62
|
+
if (purpose.startsWith("payment.")) {
|
|
63
|
+
return String(args.description || args.merchant || args.amount || "");
|
|
64
|
+
}
|
|
65
|
+
if (args.command) return String(args.command);
|
|
66
|
+
if (args.path) return String(args.path);
|
|
67
|
+
if (args.url) return String(args.url);
|
|
68
|
+
for (const val of Object.values(args)) {
|
|
69
|
+
if (typeof val === "string" && val.length > 0) return val;
|
|
70
|
+
}
|
|
71
|
+
return toolName;
|
|
72
|
+
}
|
|
73
|
+
function extractNetworkDomains(target) {
|
|
74
|
+
try {
|
|
75
|
+
if (target.startsWith("http://") || target.startsWith("https://")) {
|
|
76
|
+
const url = new URL(target);
|
|
77
|
+
return [url.hostname];
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
}
|
|
81
|
+
return void 0;
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
extractNetworkDomains,
|
|
85
|
+
extractTarget,
|
|
86
|
+
mapToolToPurpose,
|
|
87
|
+
registerToolMappings
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=purpose-mapping.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/adapter-interface/purpose-mapping.ts"],"sourcesContent":["/**\n * Shared purpose mapping utilities for Layer 4 platform adapters.\n *\n * Maps platform-native action names to PDLSS purpose categories.\n * Used by OpenClaw CLI, Cursor, browser, and future adapters.\n */\n\n// -----------------------------------------------------------------------\n// Tool → Purpose mapping\n// -----------------------------------------------------------------------\n\n/** Standard tool name → PDLSS purpose mapping used by all adapters */\nconst TOOL_PURPOSE_MAP: Record<string, string> = {\n // Shell\n shell_exec: 'shell.exec',\n run_command: 'shell.exec',\n execute: 'shell.exec',\n terminal_exec: 'shell.exec',\n run_terminal_command: 'shell.exec',\n\n // File read\n file_read: 'file.read',\n read_file: 'file.read',\n\n // File write\n file_write: 'file.write',\n write_file: 'file.write',\n create_file: 'file.write',\n edit_file: 'file.write',\n\n // File delete\n file_delete: 'file.delete',\n delete_file: 'file.delete',\n\n // Network\n http_request: 'network.request',\n fetch: 'network.request',\n web_request: 'network.request',\n\n // Email\n send_email: 'email.send',\n read_email: 'email.read',\n\n // Calendar\n create_event: 'calendar.create',\n\n // Database\n query_database: 'database.query',\n write_database: 'database.write',\n\n // Payment\n payment_execute: 'payment.execute',\n};\n\n/**\n * Map a tool/action name to a PDLSS purpose category.\n * Returns `tool.<name>` for unmapped tools (denied by default).\n */\nexport function mapToolToPurpose(toolName: string): string {\n return TOOL_PURPOSE_MAP[toolName] || `tool.${toolName}`;\n}\n\n/**\n * Register additional tool → purpose mappings (e.g. from a platform adapter).\n * Does not overwrite existing mappings.\n */\nexport function registerToolMappings(mappings: Record<string, string>): void {\n for (const [tool, purpose] of Object.entries(mappings)) {\n if (!(tool in TOOL_PURPOSE_MAP)) {\n TOOL_PURPOSE_MAP[tool] = purpose;\n }\n }\n}\n\n// -----------------------------------------------------------------------\n// Target extraction\n// -----------------------------------------------------------------------\n\n/**\n * Extract the meaningful target string from tool arguments.\n * Uses the purpose category to determine which argument field is relevant.\n */\nexport function extractTarget(toolName: string, args: Record<string, unknown>): string {\n const purpose = mapToolToPurpose(toolName);\n\n if (purpose.startsWith('shell.')) {\n return String(args.command || args.cmd || args.script || '');\n }\n\n if (purpose.startsWith('file.')) {\n return String(args.path || args.file || args.filename || args.file_path || '');\n }\n\n if (purpose.startsWith('network.')) {\n return String(args.url || args.endpoint || args.uri || '');\n }\n\n if (purpose.startsWith('email.')) {\n return String(args.to || args.recipient || args.address || '');\n }\n\n if (purpose.startsWith('database.')) {\n return String(args.query || args.table || '');\n }\n\n if (purpose.startsWith('payment.')) {\n return String(args.description || args.merchant || args.amount || '');\n }\n\n // Fallback: try common field names\n if (args.command) return String(args.command);\n if (args.path) return String(args.path);\n if (args.url) return String(args.url);\n\n // Default: use first non-empty string argument or tool name\n for (const val of Object.values(args)) {\n if (typeof val === 'string' && val.length > 0) return val;\n }\n return toolName;\n}\n\n// -----------------------------------------------------------------------\n// Network domain extraction\n// -----------------------------------------------------------------------\n\n/**\n * Extract network domains from a URL target.\n * Returns undefined if the target is not a URL.\n */\nexport function extractNetworkDomains(target: string): string[] | undefined {\n try {\n if (target.startsWith('http://') || target.startsWith('https://')) {\n const url = new URL(target);\n return [url.hostname];\n }\n } catch {\n // Not a URL\n }\n return undefined;\n}\n"],"mappings":";AAYA,IAAM,mBAA2C;AAAA;AAAA,EAE/C,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS;AAAA,EACT,eAAe;AAAA,EACf,sBAAsB;AAAA;AAAA,EAGtB,WAAW;AAAA,EACX,WAAW;AAAA;AAAA,EAGX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA;AAAA,EAGX,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAGb,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA;AAAA,EAGb,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA,EAGZ,cAAc;AAAA;AAAA,EAGd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA;AAAA,EAGhB,iBAAiB;AACnB;AAMO,SAAS,iBAAiB,UAA0B;AACzD,SAAO,iBAAiB,QAAQ,KAAK,QAAQ,QAAQ;AACvD;AAMO,SAAS,qBAAqB,UAAwC;AAC3E,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACtD,QAAI,EAAE,QAAQ,mBAAmB;AAC/B,uBAAiB,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAUO,SAAS,cAAc,UAAkB,MAAuC;AACrF,QAAM,UAAU,iBAAiB,QAAQ;AAEzC,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,EAAE;AAAA,EAC7D;AAEA,MAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,WAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY,KAAK,aAAa,EAAE;AAAA,EAC/E;AAEA,MAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,WAAO,OAAO,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,EAAE;AAAA,EAC3D;AAEA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,OAAO,KAAK,MAAM,KAAK,aAAa,KAAK,WAAW,EAAE;AAAA,EAC/D;AAEA,MAAI,QAAQ,WAAW,WAAW,GAAG;AACnC,WAAO,OAAO,KAAK,SAAS,KAAK,SAAS,EAAE;AAAA,EAC9C;AAEA,MAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,WAAO,OAAO,KAAK,eAAe,KAAK,YAAY,KAAK,UAAU,EAAE;AAAA,EACtE;AAGA,MAAI,KAAK,QAAS,QAAO,OAAO,KAAK,OAAO;AAC5C,MAAI,KAAK,KAAM,QAAO,OAAO,KAAK,IAAI;AACtC,MAAI,KAAK,IAAK,QAAO,OAAO,KAAK,GAAG;AAGpC,aAAW,OAAO,OAAO,OAAO,IAAI,GAAG;AACrC,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,QAAO;AAAA,EACxD;AACA,SAAO;AACT;AAUO,SAAS,sBAAsB,QAAsC;AAC1E,MAAI;AACF,QAAI,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,GAAG;AACjE,YAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,aAAO,CAAC,IAAI,QAAQ;AAAA,IACtB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;","names":[]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import 'express';
|
|
2
|
-
import '../types-
|
|
3
|
-
export { c as createMiddleware, a as extractAstraSyncCredentials, r as requireAccess, v as verifyOnly } from '../express-
|
|
2
|
+
import '../types-Bf8pML07.mjs';
|
|
3
|
+
export { c as createMiddleware, a as extractAstraSyncCredentials, r as requireAccess, v as verifyOnly } from '../express-Cp4eg77F.mjs';
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import 'express';
|
|
2
|
-
import '../types-
|
|
3
|
-
export { c as createMiddleware, a as extractAstraSyncCredentials, r as requireAccess, v as verifyOnly } from '../express-
|
|
2
|
+
import '../types-Bf8pML07.js';
|
|
3
|
+
export { c as createMiddleware, a as extractAstraSyncCredentials, r as requireAccess, v as verifyOnly } from '../express-DIEyq1Tz.js';
|
package/dist/adapters/express.js
CHANGED
|
@@ -175,6 +175,7 @@ async function callVerifyAccessAPI(config, request) {
|
|
|
175
175
|
if (requestData.enableRuntimeChallenge) body.enableRuntimeChallenge = requestData.enableRuntimeChallenge;
|
|
176
176
|
if (requestData.createSession) body.createSession = requestData.createSession;
|
|
177
177
|
if (requestData.counterpartyType) body.counterpartyType = requestData.counterpartyType;
|
|
178
|
+
if (requestData.counterpartyUrl) body.counterpartyUrl = requestData.counterpartyUrl;
|
|
178
179
|
if (requestData.runtimeChallengeOptions) body.runtimeChallengeOptions = requestData.runtimeChallengeOptions;
|
|
179
180
|
const headers = {
|
|
180
181
|
"Content-Type": "application/json",
|
|
@@ -222,10 +223,17 @@ async function verify(config, request) {
|
|
|
222
223
|
return cached;
|
|
223
224
|
}
|
|
224
225
|
}
|
|
226
|
+
const enrichedRequest = { ...request };
|
|
227
|
+
if (!enrichedRequest.counterpartyUrl && mergedConfig.counterpartyUrl) {
|
|
228
|
+
enrichedRequest.counterpartyUrl = mergedConfig.counterpartyUrl;
|
|
229
|
+
}
|
|
230
|
+
if (!enrichedRequest.counterpartyType && mergedConfig.counterpartyType) {
|
|
231
|
+
enrichedRequest.counterpartyType = mergedConfig.counterpartyType;
|
|
232
|
+
}
|
|
225
233
|
if (mergedConfig.debug) {
|
|
226
234
|
console.log("[VerificationGateway] Calling verify-access API");
|
|
227
235
|
}
|
|
228
|
-
const apiResponse = await callVerifyAccessAPI(mergedConfig,
|
|
236
|
+
const apiResponse = await callVerifyAccessAPI(mergedConfig, enrichedRequest);
|
|
229
237
|
if (!apiResponse.success) {
|
|
230
238
|
return createGuidanceResponse(mergedConfig, apiResponse.error);
|
|
231
239
|
}
|
|
@@ -241,7 +249,11 @@ async function verify(config, request) {
|
|
|
241
249
|
registrationUrl: `${mergedConfig.apiBaseUrl?.replace("/api", "")}/register`,
|
|
242
250
|
documentationUrl: `${mergedConfig.apiBaseUrl?.replace("/api", "")}/docs/pdlss`
|
|
243
251
|
},
|
|
244
|
-
verifiedAt: /* @__PURE__ */ new Date()
|
|
252
|
+
verifiedAt: /* @__PURE__ */ new Date(),
|
|
253
|
+
// Extract sessionId so decisions can be recorded for denials too
|
|
254
|
+
sessionId: apiResponse.sessionId,
|
|
255
|
+
recommendation: apiResponse.recommendation,
|
|
256
|
+
recommendationReasons: apiResponse.recommendationReasons
|
|
245
257
|
};
|
|
246
258
|
return result2;
|
|
247
259
|
}
|
|
@@ -325,6 +337,16 @@ async function verify(config, request) {
|
|
|
325
337
|
}
|
|
326
338
|
return result;
|
|
327
339
|
}
|
|
340
|
+
async function recordDecision(config, sessionId, decision, reason) {
|
|
341
|
+
const headers = { "Content-Type": "application/json" };
|
|
342
|
+
if (config.apiKey) headers["X-API-Key"] = config.apiKey;
|
|
343
|
+
await fetch(`${config.apiBaseUrl}/agents/verify-access/${sessionId}/decision`, {
|
|
344
|
+
method: "POST",
|
|
345
|
+
headers,
|
|
346
|
+
body: JSON.stringify({ decision, reason })
|
|
347
|
+
}).catch(() => {
|
|
348
|
+
});
|
|
349
|
+
}
|
|
328
350
|
|
|
329
351
|
// src/transport/http.ts
|
|
330
352
|
var HEADER_PREFIX = "X-Astra-";
|
|
@@ -428,6 +450,7 @@ function createMiddleware(options) {
|
|
|
428
450
|
extractPurpose: customExtractPurpose,
|
|
429
451
|
skipPaths = [],
|
|
430
452
|
onDenied = defaultOnDenied,
|
|
453
|
+
recordDecisions,
|
|
431
454
|
...config
|
|
432
455
|
} = options;
|
|
433
456
|
return async (req, res, next) => {
|
|
@@ -461,16 +484,26 @@ function createMiddleware(options) {
|
|
|
461
484
|
return;
|
|
462
485
|
}
|
|
463
486
|
const purpose = customExtractPurpose ? customExtractPurpose(req) : defaultExtractPurpose(req);
|
|
487
|
+
const counterpartyUrl = config.counterpartyUrl || `${req.protocol}://${req.get("host")}`;
|
|
488
|
+
const shouldRecordDecisions = recordDecisions !== false;
|
|
464
489
|
const result = await verify(config, {
|
|
465
490
|
credentials,
|
|
466
491
|
purpose,
|
|
467
492
|
action: req.method.toLowerCase(),
|
|
468
493
|
resource: req.path,
|
|
469
494
|
clientIp: req.ip,
|
|
470
|
-
userAgent: req.headers["user-agent"]
|
|
495
|
+
userAgent: req.headers["user-agent"],
|
|
496
|
+
createSession: shouldRecordDecisions,
|
|
497
|
+
counterpartyUrl,
|
|
498
|
+
counterpartyType: config.counterpartyType || "api"
|
|
471
499
|
});
|
|
472
500
|
req.agentVerification = result;
|
|
501
|
+
const sessionId = result.sessionId;
|
|
473
502
|
if (!hasMinimumAccess(result.accessLevel, routeConfig.minAccessLevel)) {
|
|
503
|
+
if (shouldRecordDecisions && sessionId) {
|
|
504
|
+
recordDecision(config, sessionId, "denied", result.denialReasons?.[0]).catch(() => {
|
|
505
|
+
});
|
|
506
|
+
}
|
|
474
507
|
onDenied(result, req, res);
|
|
475
508
|
return;
|
|
476
509
|
}
|
|
@@ -479,10 +512,18 @@ function createMiddleware(options) {
|
|
|
479
512
|
result.denialReasons = [
|
|
480
513
|
`Trust score ${result.agent.trustScore} is below required ${routeConfig.minTrustScore}`
|
|
481
514
|
];
|
|
515
|
+
if (shouldRecordDecisions && sessionId) {
|
|
516
|
+
recordDecision(config, sessionId, "denied", result.denialReasons[0]).catch(() => {
|
|
517
|
+
});
|
|
518
|
+
}
|
|
482
519
|
onDenied(result, req, res);
|
|
483
520
|
return;
|
|
484
521
|
}
|
|
485
522
|
}
|
|
523
|
+
if (shouldRecordDecisions && sessionId) {
|
|
524
|
+
recordDecision(config, sessionId, "granted").catch(() => {
|
|
525
|
+
});
|
|
526
|
+
}
|
|
486
527
|
next();
|
|
487
528
|
} catch (error) {
|
|
488
529
|
console.error("[VerificationGateway] Middleware error:", error);
|
|
@@ -493,17 +534,13 @@ function createMiddleware(options) {
|
|
|
493
534
|
function requireAccess(minAccessLevel, options) {
|
|
494
535
|
return createMiddleware({
|
|
495
536
|
...options,
|
|
496
|
-
routes: [
|
|
497
|
-
{ pattern: "*", method: "*", minAccessLevel }
|
|
498
|
-
]
|
|
537
|
+
routes: [{ pattern: "*", method: "*", minAccessLevel }]
|
|
499
538
|
});
|
|
500
539
|
}
|
|
501
540
|
function verifyOnly(options) {
|
|
502
541
|
return createMiddleware({
|
|
503
542
|
...options,
|
|
504
|
-
routes: [
|
|
505
|
-
{ pattern: "*", method: "*", minAccessLevel: "none" }
|
|
506
|
-
]
|
|
543
|
+
routes: [{ pattern: "*", method: "*", minAccessLevel: "none" }]
|
|
507
544
|
});
|
|
508
545
|
}
|
|
509
546
|
// Annotate the CommonJS export names for ESM import in node:
|