@troykelly/openclaw-projects 0.0.10 → 0.0.12
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/config.d.ts +30 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -1
- package/dist/config.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +17 -3
- package/dist/hooks.js.map +1 -1
- package/dist/register-openclaw.d.ts +3 -1
- package/dist/register-openclaw.d.ts.map +1 -1
- package/dist/register-openclaw.js +611 -55
- package/dist/register-openclaw.js.map +1 -1
- package/dist/tools/contacts.d.ts +6 -6
- package/dist/tools/contacts.d.ts.map +1 -1
- package/dist/tools/contacts.js +7 -7
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/context-search.d.ts +79 -0
- package/dist/tools/context-search.d.ts.map +1 -0
- package/dist/tools/context-search.js +265 -0
- package/dist/tools/context-search.js.map +1 -0
- package/dist/tools/email-send.d.ts.map +1 -1
- package/dist/tools/email-send.js +1 -14
- package/dist/tools/email-send.js.map +1 -1
- package/dist/tools/entity-links.d.ts +117 -0
- package/dist/tools/entity-links.d.ts.map +1 -0
- package/dist/tools/entity-links.js +446 -0
- package/dist/tools/entity-links.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-forget.js +5 -5
- package/dist/tools/memory-forget.js.map +1 -1
- package/dist/tools/memory-recall.d.ts +28 -0
- package/dist/tools/memory-recall.d.ts.map +1 -1
- package/dist/tools/memory-recall.js +44 -4
- package/dist/tools/memory-recall.js.map +1 -1
- package/dist/tools/memory-store.d.ts +57 -0
- package/dist/tools/memory-store.d.ts.map +1 -1
- package/dist/tools/memory-store.js +29 -2
- package/dist/tools/memory-store.js.map +1 -1
- package/dist/tools/message-search.d.ts +1 -1
- package/dist/tools/message-search.d.ts.map +1 -1
- package/dist/tools/message-search.js +20 -2
- package/dist/tools/message-search.js.map +1 -1
- package/dist/tools/notes.d.ts +2 -2
- package/dist/tools/project-search.d.ts +92 -0
- package/dist/tools/project-search.d.ts.map +1 -0
- package/dist/tools/project-search.js +160 -0
- package/dist/tools/project-search.js.map +1 -0
- package/dist/tools/relationships.js +1 -1
- package/dist/tools/relationships.js.map +1 -1
- package/dist/tools/skill-store.d.ts +12 -12
- package/dist/tools/threads.d.ts +2 -2
- package/dist/tools/threads.d.ts.map +1 -1
- package/dist/tools/threads.js +30 -6
- package/dist/tools/threads.js.map +1 -1
- package/dist/tools/todo-search.d.ts +95 -0
- package/dist/tools/todo-search.d.ts.map +1 -0
- package/dist/tools/todo-search.js +164 -0
- package/dist/tools/todo-search.js.map +1 -0
- package/dist/types/openclaw-api.d.ts +15 -0
- package/dist/types/openclaw-api.d.ts.map +1 -1
- package/dist/utils/auto-linker.d.ts +66 -0
- package/dist/utils/auto-linker.d.ts.map +1 -0
- package/dist/utils/auto-linker.js +354 -0
- package/dist/utils/auto-linker.js.map +1 -0
- package/dist/utils/geo.d.ts +24 -0
- package/dist/utils/geo.d.ts.map +1 -0
- package/dist/utils/geo.js +38 -0
- package/dist/utils/geo.js.map +1 -0
- package/dist/utils/inbound-gate.d.ts +85 -0
- package/dist/utils/inbound-gate.d.ts.map +1 -0
- package/dist/utils/inbound-gate.js +133 -0
- package/dist/utils/inbound-gate.js.map +1 -0
- package/dist/utils/injection-protection.d.ts +81 -0
- package/dist/utils/injection-protection.d.ts.map +1 -0
- package/dist/utils/injection-protection.js +179 -0
- package/dist/utils/injection-protection.js.map +1 -0
- package/dist/utils/nominatim.d.ts +18 -0
- package/dist/utils/nominatim.d.ts.map +1 -0
- package/dist/utils/nominatim.js +56 -0
- package/dist/utils/nominatim.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +81 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +188 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/spam-filter.d.ts +79 -0
- package/dist/utils/spam-filter.d.ts.map +1 -0
- package/dist/utils/spam-filter.js +237 -0
- package/dist/utils/spam-filter.js.map +1 -0
- package/dist/utils/token-budget.d.ts +68 -0
- package/dist/utils/token-budget.d.ts.map +1 -0
- package/dist/utils/token-budget.js +142 -0
- package/dist/utils/token-budget.js.map +1 -0
- package/openclaw.plugin.json +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-linker.js","sourceRoot":"","sources":["../../src/utils/auto-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geo utilities for location-aware memory recall.
|
|
3
|
+
* Part of Epic #1204, Issue #1206.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Calculate the great-circle distance between two points using the Haversine formula.
|
|
7
|
+
* Returns distance in kilometres.
|
|
8
|
+
*/
|
|
9
|
+
export declare function haversineDistanceKm(lat1: number, lng1: number, lat2: number, lng2: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Compute a geo relevance score using exponential decay.
|
|
12
|
+
* Returns 1.0 for distance 0, approaching 0 for large distances.
|
|
13
|
+
* @param distanceKm - distance in kilometres
|
|
14
|
+
* @param scaleKm - decay scale factor (default 10 km)
|
|
15
|
+
*/
|
|
16
|
+
export declare function computeGeoScore(distanceKm: number, scaleKm?: number): number;
|
|
17
|
+
/**
|
|
18
|
+
* Blend a content relevance score with a geo relevance score.
|
|
19
|
+
* @param contentScore - semantic similarity score (0-1)
|
|
20
|
+
* @param geoScore - geo proximity score (0-1)
|
|
21
|
+
* @param weight - weight given to geo score (0 = content only, 1 = geo only)
|
|
22
|
+
*/
|
|
23
|
+
export declare function blendScores(contentScore: number, geoScore: number, weight: number): number;
|
|
24
|
+
//# sourceMappingURL=geo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../../src/utils/geo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,MAAM,CAQR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,MAAM,CAExE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1F"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geo utilities for location-aware memory recall.
|
|
3
|
+
* Part of Epic #1204, Issue #1206.
|
|
4
|
+
*/
|
|
5
|
+
function toRad(deg) {
|
|
6
|
+
return (deg * Math.PI) / 180;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Calculate the great-circle distance between two points using the Haversine formula.
|
|
10
|
+
* Returns distance in kilometres.
|
|
11
|
+
*/
|
|
12
|
+
export function haversineDistanceKm(lat1, lng1, lat2, lng2) {
|
|
13
|
+
const R = 6371; // Earth radius in km
|
|
14
|
+
const dLat = toRad(lat2 - lat1);
|
|
15
|
+
const dLng = toRad(lng2 - lng1);
|
|
16
|
+
const a = Math.sin(dLat / 2) ** 2 +
|
|
17
|
+
Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLng / 2) ** 2;
|
|
18
|
+
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compute a geo relevance score using exponential decay.
|
|
22
|
+
* Returns 1.0 for distance 0, approaching 0 for large distances.
|
|
23
|
+
* @param distanceKm - distance in kilometres
|
|
24
|
+
* @param scaleKm - decay scale factor (default 10 km)
|
|
25
|
+
*/
|
|
26
|
+
export function computeGeoScore(distanceKm, scaleKm = 10) {
|
|
27
|
+
return Math.exp(-distanceKm / scaleKm);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Blend a content relevance score with a geo relevance score.
|
|
31
|
+
* @param contentScore - semantic similarity score (0-1)
|
|
32
|
+
* @param geoScore - geo proximity score (0-1)
|
|
33
|
+
* @param weight - weight given to geo score (0 = content only, 1 = geo only)
|
|
34
|
+
*/
|
|
35
|
+
export function blendScores(contentScore, geoScore, weight) {
|
|
36
|
+
return (1 - weight) * contentScore + weight * geoScore;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=geo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo.js","sourceRoot":"","sources":["../../src/utils/geo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,SAAS,KAAK,CAAC,GAAW;IACxB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY;IAEZ,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,qBAAqB;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,MAAM,CAAC,GACL,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,OAAO,GAAG,EAAE;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,QAAgB,EAAE,MAAc;IAChF,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound message gate — unified pre-processing gate for inbound messages.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates spam filter, rate limiter, and token budget as a single
|
|
5
|
+
* evaluation point before any message processing (embedding, linking, etc.).
|
|
6
|
+
*
|
|
7
|
+
* NOTE: All state (rate limiter windows, token budget counters) is held
|
|
8
|
+
* in-memory and does not persist across process restarts or span multiple
|
|
9
|
+
* instances. This is acceptable for single-instance deployments. For
|
|
10
|
+
* multi-instance deployments, the rate limiter and token budget would need
|
|
11
|
+
* to be backed by skill_store or an external store (e.g. Redis) to share
|
|
12
|
+
* state across processes.
|
|
13
|
+
*
|
|
14
|
+
* Part of Issue #1225 — rate limiting and spam protection.
|
|
15
|
+
*/
|
|
16
|
+
import { type SpamFilterConfig, type InboundMessage } from './spam-filter.js';
|
|
17
|
+
import { type RateLimiterConfig, type SenderTrust } from './rate-limiter.js';
|
|
18
|
+
import { type TokenBudgetConfig } from './token-budget.js';
|
|
19
|
+
import type { Logger } from '../logger.js';
|
|
20
|
+
/** Re-export InboundMessage for convenience */
|
|
21
|
+
export type { InboundMessage } from './spam-filter.js';
|
|
22
|
+
/** Actions the gate can take on a message */
|
|
23
|
+
export type GateAction = 'allow' | 'reject' | 'rate_limited' | 'budget_exceeded' | 'defer';
|
|
24
|
+
/** Result of the inbound gate evaluation */
|
|
25
|
+
export interface InboundGateDecision {
|
|
26
|
+
/** Action to take on the message */
|
|
27
|
+
action: GateAction;
|
|
28
|
+
/** Human-readable reason for the decision, null if allowed */
|
|
29
|
+
reason: string | null;
|
|
30
|
+
/** Whether to skip embedding for this message */
|
|
31
|
+
skipEmbedding: boolean;
|
|
32
|
+
}
|
|
33
|
+
/** Configuration for the inbound gate */
|
|
34
|
+
export interface InboundGateConfig {
|
|
35
|
+
/** Spam filter configuration */
|
|
36
|
+
spamFilter: SpamFilterConfig;
|
|
37
|
+
/** Rate limiter configuration */
|
|
38
|
+
rateLimiter: RateLimiterConfig;
|
|
39
|
+
/** Token budget configuration */
|
|
40
|
+
tokenBudget: TokenBudgetConfig;
|
|
41
|
+
/** Whether to defer processing for unknown senders */
|
|
42
|
+
deferUnknownSenders?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Aggregate gate statistics */
|
|
45
|
+
export interface InboundGateStats {
|
|
46
|
+
/** Total messages evaluated */
|
|
47
|
+
totalEvaluated: number;
|
|
48
|
+
/** Messages allowed through */
|
|
49
|
+
allowed: number;
|
|
50
|
+
/** Messages rejected as spam */
|
|
51
|
+
rejected: number;
|
|
52
|
+
/** Messages rate-limited */
|
|
53
|
+
rateLimited: number;
|
|
54
|
+
/** Messages denied due to budget */
|
|
55
|
+
budgetExceeded: number;
|
|
56
|
+
/** Messages deferred */
|
|
57
|
+
deferred: number;
|
|
58
|
+
}
|
|
59
|
+
/** Inbound gate instance */
|
|
60
|
+
export interface InboundGate {
|
|
61
|
+
/**
|
|
62
|
+
* Evaluate a message and return a gate decision.
|
|
63
|
+
* When estimatedTokens > 0 and the message is allowed, the token budget
|
|
64
|
+
* is atomically consumed during evaluation — callers must NOT separately
|
|
65
|
+
* record token usage or the budget will be double-counted.
|
|
66
|
+
*/
|
|
67
|
+
evaluate(message: InboundMessage, trust: SenderTrust, estimatedTokens?: number): InboundGateDecision;
|
|
68
|
+
/** Get aggregate statistics */
|
|
69
|
+
getStats(): InboundGateStats;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create an inbound message gate.
|
|
73
|
+
*
|
|
74
|
+
* Checks are applied in this order:
|
|
75
|
+
* 1. Spam filter (reject bulk/marketing/known spam)
|
|
76
|
+
* 2. Rate limiter (per-sender and per-recipient caps)
|
|
77
|
+
* 3. Token budget (cost protection)
|
|
78
|
+
* 4. Deferred processing (unknown senders, if configured)
|
|
79
|
+
*
|
|
80
|
+
* @param config - Gate configuration
|
|
81
|
+
* @param logger - Logger for recording decisions
|
|
82
|
+
* @returns InboundGate instance
|
|
83
|
+
*/
|
|
84
|
+
export declare function createInboundGate(config: InboundGateConfig, logger: Logger): InboundGate;
|
|
85
|
+
//# sourceMappingURL=inbound-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-gate.d.ts","sourceRoot":"","sources":["../../src/utils/inbound-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAU,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,EAAqB,KAAK,iBAAiB,EAAoB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAqB,KAAK,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AAChG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,+CAA+C;AAC/C,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,6CAA6C;AAC7C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,iBAAiB,GAAG,OAAO,CAAC;AAE3F,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iDAAiD;IACjD,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,iCAAiC;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,iCAAiC;IACjC,WAAW,EAAE,iBAAiB,CAAC;IAC/B,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,gCAAgC;AAChC,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACrG,+BAA+B;IAC/B,QAAQ,IAAI,gBAAgB,CAAC;CAC9B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,CA4GxF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound message gate — unified pre-processing gate for inbound messages.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates spam filter, rate limiter, and token budget as a single
|
|
5
|
+
* evaluation point before any message processing (embedding, linking, etc.).
|
|
6
|
+
*
|
|
7
|
+
* NOTE: All state (rate limiter windows, token budget counters) is held
|
|
8
|
+
* in-memory and does not persist across process restarts or span multiple
|
|
9
|
+
* instances. This is acceptable for single-instance deployments. For
|
|
10
|
+
* multi-instance deployments, the rate limiter and token budget would need
|
|
11
|
+
* to be backed by skill_store or an external store (e.g. Redis) to share
|
|
12
|
+
* state across processes.
|
|
13
|
+
*
|
|
14
|
+
* Part of Issue #1225 — rate limiting and spam protection.
|
|
15
|
+
*/
|
|
16
|
+
import { isSpam } from './spam-filter.js';
|
|
17
|
+
import { createRateLimiter } from './rate-limiter.js';
|
|
18
|
+
import { createTokenBudget } from './token-budget.js';
|
|
19
|
+
/**
|
|
20
|
+
* Create an inbound message gate.
|
|
21
|
+
*
|
|
22
|
+
* Checks are applied in this order:
|
|
23
|
+
* 1. Spam filter (reject bulk/marketing/known spam)
|
|
24
|
+
* 2. Rate limiter (per-sender and per-recipient caps)
|
|
25
|
+
* 3. Token budget (cost protection)
|
|
26
|
+
* 4. Deferred processing (unknown senders, if configured)
|
|
27
|
+
*
|
|
28
|
+
* @param config - Gate configuration
|
|
29
|
+
* @param logger - Logger for recording decisions
|
|
30
|
+
* @returns InboundGate instance
|
|
31
|
+
*/
|
|
32
|
+
export function createInboundGate(config, logger) {
|
|
33
|
+
const rateLimiter = createRateLimiter(config.rateLimiter);
|
|
34
|
+
const tokenBudget = createTokenBudget(config.tokenBudget);
|
|
35
|
+
let totalEvaluated = 0;
|
|
36
|
+
let allowed = 0;
|
|
37
|
+
let rejected = 0;
|
|
38
|
+
let rateLimited = 0;
|
|
39
|
+
let budgetExceeded = 0;
|
|
40
|
+
let deferred = 0;
|
|
41
|
+
return {
|
|
42
|
+
evaluate(message, trust, estimatedTokens = 0) {
|
|
43
|
+
totalEvaluated++;
|
|
44
|
+
// Step 1: Spam filter
|
|
45
|
+
const spamResult = isSpam(message, config.spamFilter);
|
|
46
|
+
if (spamResult.isSpam) {
|
|
47
|
+
rejected++;
|
|
48
|
+
logger.info('inbound gate: spam rejected', {
|
|
49
|
+
sender: message.sender,
|
|
50
|
+
channel: message.channel,
|
|
51
|
+
reason: spamResult.reason,
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
action: 'reject',
|
|
55
|
+
reason: `spam: ${spamResult.reason}`,
|
|
56
|
+
skipEmbedding: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Step 2: Rate limiter (pass channel for sender normalization)
|
|
60
|
+
const rateResult = rateLimiter.check(message.sender, message.recipient, trust, message.channel);
|
|
61
|
+
if (!rateResult.allowed) {
|
|
62
|
+
rateLimited++;
|
|
63
|
+
logger.warn('inbound gate: rate limited', {
|
|
64
|
+
sender: message.sender,
|
|
65
|
+
channel: message.channel,
|
|
66
|
+
trust,
|
|
67
|
+
reason: rateResult.reason,
|
|
68
|
+
remaining: rateResult.remaining,
|
|
69
|
+
retryAfterMs: rateResult.retryAfterMs,
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
action: 'rate_limited',
|
|
73
|
+
reason: `rate limited: ${rateResult.reason}`,
|
|
74
|
+
skipEmbedding: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
// Step 3: Token budget (uses tryConsume for atomic check-and-record)
|
|
78
|
+
if (estimatedTokens > 0) {
|
|
79
|
+
const budgetResult = tokenBudget.tryConsume(estimatedTokens);
|
|
80
|
+
if (!budgetResult.allowed) {
|
|
81
|
+
budgetExceeded++;
|
|
82
|
+
logger.warn('inbound gate: token budget exceeded', {
|
|
83
|
+
sender: message.sender,
|
|
84
|
+
channel: message.channel,
|
|
85
|
+
estimatedTokens,
|
|
86
|
+
reason: budgetResult.reason,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
action: 'budget_exceeded',
|
|
90
|
+
reason: `budget exceeded: ${budgetResult.reason}`,
|
|
91
|
+
skipEmbedding: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Step 4: Deferred processing for unknown senders
|
|
96
|
+
if (config.deferUnknownSenders && trust === 'unknown') {
|
|
97
|
+
deferred++;
|
|
98
|
+
logger.debug('inbound gate: deferring unknown sender', {
|
|
99
|
+
sender: message.sender,
|
|
100
|
+
channel: message.channel,
|
|
101
|
+
});
|
|
102
|
+
return {
|
|
103
|
+
action: 'defer',
|
|
104
|
+
reason: 'unknown sender deferred for batch processing',
|
|
105
|
+
skipEmbedding: true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// Message is allowed
|
|
109
|
+
allowed++;
|
|
110
|
+
logger.debug('inbound gate: allowed', {
|
|
111
|
+
sender: message.sender,
|
|
112
|
+
channel: message.channel,
|
|
113
|
+
trust,
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
action: 'allow',
|
|
117
|
+
reason: null,
|
|
118
|
+
skipEmbedding: false,
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
getStats() {
|
|
122
|
+
return {
|
|
123
|
+
totalEvaluated,
|
|
124
|
+
allowed,
|
|
125
|
+
rejected,
|
|
126
|
+
rateLimited,
|
|
127
|
+
budgetExceeded,
|
|
128
|
+
deferred,
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=inbound-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbound-gate.js","sourceRoot":"","sources":["../../src/utils/inbound-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt injection protection utilities for inbound message processing.
|
|
3
|
+
*
|
|
4
|
+
* Provides layered defence for external message content before LLM exposure:
|
|
5
|
+
* 1. Unicode/control character sanitisation
|
|
6
|
+
* 2. Data boundary marking (spotlighting)
|
|
7
|
+
* 3. Suspicious pattern detection and logging
|
|
8
|
+
*
|
|
9
|
+
* Issue #1224
|
|
10
|
+
*/
|
|
11
|
+
/** Result of injection pattern detection */
|
|
12
|
+
export interface InjectionDetectionResult {
|
|
13
|
+
/** Whether any injection patterns were detected */
|
|
14
|
+
detected: boolean;
|
|
15
|
+
/** Names of the patterns that matched */
|
|
16
|
+
patterns: string[];
|
|
17
|
+
}
|
|
18
|
+
/** Options for wrapping external messages */
|
|
19
|
+
export interface WrapOptions {
|
|
20
|
+
/** Communication channel (sms, email) */
|
|
21
|
+
channel?: string;
|
|
22
|
+
/** Sender name or identifier */
|
|
23
|
+
sender?: string;
|
|
24
|
+
}
|
|
25
|
+
/** Options for context sanitisation */
|
|
26
|
+
export interface ContextSanitizeOptions {
|
|
27
|
+
/** Message direction */
|
|
28
|
+
direction?: 'inbound' | 'outbound';
|
|
29
|
+
/** Communication channel */
|
|
30
|
+
channel?: string;
|
|
31
|
+
/** Sender name */
|
|
32
|
+
sender?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Sanitize external message content by removing control characters
|
|
36
|
+
* and invisible Unicode characters that could be used for obfuscation.
|
|
37
|
+
*
|
|
38
|
+
* Preserves legitimate Unicode (emoji, CJK, Arabic, etc.) and whitespace
|
|
39
|
+
* characters (tab, newline, carriage return).
|
|
40
|
+
*/
|
|
41
|
+
export declare function sanitizeExternalMessage(text: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Sanitize a metadata field (sender, channel) for safe insertion into
|
|
44
|
+
* the boundary wrapper header. Strips control chars, invisible Unicode,
|
|
45
|
+
* newlines (which could break out of the header line), and boundary markers.
|
|
46
|
+
*/
|
|
47
|
+
export declare function sanitizeMetadataField(field: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Wrap external message content with data boundary markers.
|
|
50
|
+
*
|
|
51
|
+
* Uses the "spotlighting" / data marking pattern to clearly delineate
|
|
52
|
+
* untrusted external content from system instructions. This tells the LLM
|
|
53
|
+
* "this is external data, not instructions to follow."
|
|
54
|
+
*
|
|
55
|
+
* Content, sender, and channel are all sanitized and have boundary markers
|
|
56
|
+
* escaped before wrapping to prevent breakout attacks.
|
|
57
|
+
*/
|
|
58
|
+
export declare function wrapExternalMessage(content: string, options?: WrapOptions): string;
|
|
59
|
+
/**
|
|
60
|
+
* Detect suspicious prompt injection patterns in message content.
|
|
61
|
+
*
|
|
62
|
+
* Returns detection results for logging/monitoring purposes.
|
|
63
|
+
* This function does NOT block or modify the message — it is purely
|
|
64
|
+
* for detection and alerting. Blocking legitimate messages based on
|
|
65
|
+
* pattern matching has too high a false positive rate.
|
|
66
|
+
*
|
|
67
|
+
* The content is sanitized (invisible chars removed) before scanning
|
|
68
|
+
* to prevent Unicode obfuscation from bypassing detection.
|
|
69
|
+
*/
|
|
70
|
+
export declare function detectInjectionPatterns(text: string): InjectionDetectionResult;
|
|
71
|
+
/**
|
|
72
|
+
* Sanitize message content for safe inclusion in LLM context.
|
|
73
|
+
*
|
|
74
|
+
* For inbound (external) messages: sanitizes and wraps with boundary markers.
|
|
75
|
+
* For outbound messages: sanitizes only (no boundary wrapping needed).
|
|
76
|
+
*
|
|
77
|
+
* This is the primary function to call when preparing message content
|
|
78
|
+
* for any LLM-facing output (auto-recall context, tool results, etc.).
|
|
79
|
+
*/
|
|
80
|
+
export declare function sanitizeMessageForContext(content: string, options?: ContextSanitizeOptions): string;
|
|
81
|
+
//# sourceMappingURL=injection-protection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-protection.d.ts","sourceRoot":"","sources":["../../src/utils/injection-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAsFH,4CAA4C;AAC5C,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAC;IAClB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uCAAuC;AACvC,MAAM,WAAW,sBAAsB;IACrC,wBAAwB;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5D;AAcD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAmBtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAc9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,MAAM,CAQR"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt injection protection utilities for inbound message processing.
|
|
3
|
+
*
|
|
4
|
+
* Provides layered defence for external message content before LLM exposure:
|
|
5
|
+
* 1. Unicode/control character sanitisation
|
|
6
|
+
* 2. Data boundary marking (spotlighting)
|
|
7
|
+
* 3. Suspicious pattern detection and logging
|
|
8
|
+
*
|
|
9
|
+
* Issue #1224
|
|
10
|
+
*/
|
|
11
|
+
/** Boundary markers for external message content */
|
|
12
|
+
const EXTERNAL_MSG_START = '[EXTERNAL_MSG_START]';
|
|
13
|
+
const EXTERNAL_MSG_END = '[EXTERNAL_MSG_END]';
|
|
14
|
+
/**
|
|
15
|
+
* Regex matching control characters to strip (ASCII 0x00-0x08, 0x0B, 0x0C, 0x0E-0x1F, 0x7F).
|
|
16
|
+
* Preserves tab (0x09), newline (0x0A), and carriage return (0x0D).
|
|
17
|
+
*/
|
|
18
|
+
const CONTROL_CHARS_REGEX = /[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
|
|
19
|
+
/**
|
|
20
|
+
* Regex matching Unicode characters commonly used for text direction manipulation
|
|
21
|
+
* and zero-width obfuscation:
|
|
22
|
+
* - U+200B Zero-width space
|
|
23
|
+
* - U+200C Zero-width non-joiner
|
|
24
|
+
* - U+200D Zero-width joiner
|
|
25
|
+
* - U+200E Left-to-right mark
|
|
26
|
+
* - U+200F Right-to-left mark
|
|
27
|
+
* - U+202A Left-to-right embedding
|
|
28
|
+
* - U+202B Right-to-left embedding
|
|
29
|
+
* - U+202C Pop directional formatting
|
|
30
|
+
* - U+202D Left-to-right override
|
|
31
|
+
* - U+202E Right-to-left override
|
|
32
|
+
* - U+2066 Left-to-right isolate
|
|
33
|
+
* - U+2067 Right-to-left isolate
|
|
34
|
+
* - U+2068 First strong isolate
|
|
35
|
+
* - U+2069 Pop directional isolate
|
|
36
|
+
* - U+FEFF Byte order mark / zero-width no-break space
|
|
37
|
+
*/
|
|
38
|
+
const UNICODE_INVISIBLE_REGEX = /[\u200B-\u200F\u202A-\u202E\u2066-\u2069\uFEFF]/g;
|
|
39
|
+
const INJECTION_PATTERNS = [
|
|
40
|
+
{
|
|
41
|
+
name: 'instruction_override',
|
|
42
|
+
regex: /\b(?:ignore|disregard|forget|override|bypass)\b.{0,30}\b(?:previous|prior|above|earlier|all|your|system|safety)\b.{0,30}\b(?:instructions?|rules?|guidelines?|prompts?|constraints?|directives?|and\b|do\b|instead\b)/i,
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'role_reassignment',
|
|
46
|
+
regex: /\b(?:you are now|act as|pretend (?:you are|to be)|roleplay as|behave as)\b.{0,50}\b(?:ai|assistant|bot|agent|unrestricted|dan|jailbreak|without.*?(?:restrictions?|limits?|safety|guidelines?))\b/i,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'new_instructions',
|
|
50
|
+
regex: /\b(?:new instructions?|updated? instructions?|revised? instructions?|important (?:system )?update)\b\s*[:]/i,
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'system_prompt_override',
|
|
54
|
+
regex: /^(?:\s*[-=]{3,}\s*\n)?(?:SYSTEM|ADMIN|DEVELOPER|ROOT)\s*[:>]/im,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'forget_everything',
|
|
58
|
+
regex: /\bforget (?:everything|all)\b.{0,30}\b(?:you (?:know|learned|were told)|and (?:start|begin))\b/i,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'prompt_delimiter_exploit',
|
|
62
|
+
regex: /```\s*(?:system|admin|instructions?|prompt)\b/i,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'tool_call_injection',
|
|
66
|
+
regex: /\b(?:call|use|invoke|execute|run)\b.{0,20}\b(?:the\s+)?(?:sms_send|email_send|memory_store|memory_forget|todo_create|contact_create|memory_recall)\b.{0,20}\btool\b/i,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'data_exfiltration',
|
|
70
|
+
regex: /\b(?:send|forward|share|export|transmit|email|text)\b.{0,30}\b(?:all|every|the)\b.{0,20}\b(?:memories?|contacts?|data|information|messages?|threads?|projects?|todos?)\b.{0,30}\b(?:to|@)\b/i,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'system_note_injection',
|
|
74
|
+
regex: /\[\s*(?:SYSTEM|ADMIN|INTERNAL)\s+(?:NOTE|MESSAGE|OVERRIDE|UPDATE)\s*[:]/i,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'remember_for_later',
|
|
78
|
+
regex: /\bremember (?:this|that)\b.{0,30}\b(?:for later|when (?:someone|anyone|a user|the user))\b.{0,30}\b(?:send|forward|share|export)\b/i,
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
/**
|
|
82
|
+
* Sanitize external message content by removing control characters
|
|
83
|
+
* and invisible Unicode characters that could be used for obfuscation.
|
|
84
|
+
*
|
|
85
|
+
* Preserves legitimate Unicode (emoji, CJK, Arabic, etc.) and whitespace
|
|
86
|
+
* characters (tab, newline, carriage return).
|
|
87
|
+
*/
|
|
88
|
+
export function sanitizeExternalMessage(text) {
|
|
89
|
+
return text
|
|
90
|
+
.replace(CONTROL_CHARS_REGEX, '')
|
|
91
|
+
.replace(UNICODE_INVISIBLE_REGEX, '')
|
|
92
|
+
.trim();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Escape boundary marker keywords in a string to prevent breakout attacks.
|
|
96
|
+
* Replaces the keyword portion (EXTERNAL_MSG_START / EXTERNAL_MSG_END)
|
|
97
|
+
* regardless of surrounding brackets, since formatting code may supply
|
|
98
|
+
* brackets that complete a partial marker (e.g., channel `[...START` + `]`).
|
|
99
|
+
*/
|
|
100
|
+
function escapeBoundaryMarkers(text) {
|
|
101
|
+
return text
|
|
102
|
+
.replace(/EXTERNAL_MSG_START/g, 'EXTERNAL_MSG_START_ESCAPED')
|
|
103
|
+
.replace(/EXTERNAL_MSG_END/g, 'EXTERNAL_MSG_END_ESCAPED');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sanitize a metadata field (sender, channel) for safe insertion into
|
|
107
|
+
* the boundary wrapper header. Strips control chars, invisible Unicode,
|
|
108
|
+
* newlines (which could break out of the header line), and boundary markers.
|
|
109
|
+
*/
|
|
110
|
+
export function sanitizeMetadataField(field) {
|
|
111
|
+
return escapeBoundaryMarkers(sanitizeExternalMessage(field).replace(/[\r\n]/g, ' '));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Wrap external message content with data boundary markers.
|
|
115
|
+
*
|
|
116
|
+
* Uses the "spotlighting" / data marking pattern to clearly delineate
|
|
117
|
+
* untrusted external content from system instructions. This tells the LLM
|
|
118
|
+
* "this is external data, not instructions to follow."
|
|
119
|
+
*
|
|
120
|
+
* Content, sender, and channel are all sanitized and have boundary markers
|
|
121
|
+
* escaped before wrapping to prevent breakout attacks.
|
|
122
|
+
*/
|
|
123
|
+
export function wrapExternalMessage(content, options = {}) {
|
|
124
|
+
const sanitized = sanitizeExternalMessage(content);
|
|
125
|
+
// Escape any existing boundary markers in the content to prevent breakout
|
|
126
|
+
const escaped = escapeBoundaryMarkers(sanitized);
|
|
127
|
+
const attribution = [];
|
|
128
|
+
if (options.channel) {
|
|
129
|
+
attribution.push(`[${sanitizeMetadataField(options.channel)}]`);
|
|
130
|
+
}
|
|
131
|
+
if (options.sender) {
|
|
132
|
+
attribution.push(`from: ${sanitizeMetadataField(options.sender)}`);
|
|
133
|
+
}
|
|
134
|
+
const header = attribution.length > 0
|
|
135
|
+
? `${EXTERNAL_MSG_START} ${attribution.join(' ')}`
|
|
136
|
+
: EXTERNAL_MSG_START;
|
|
137
|
+
return `${header}\n${escaped}\n${EXTERNAL_MSG_END}`;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Detect suspicious prompt injection patterns in message content.
|
|
141
|
+
*
|
|
142
|
+
* Returns detection results for logging/monitoring purposes.
|
|
143
|
+
* This function does NOT block or modify the message — it is purely
|
|
144
|
+
* for detection and alerting. Blocking legitimate messages based on
|
|
145
|
+
* pattern matching has too high a false positive rate.
|
|
146
|
+
*
|
|
147
|
+
* The content is sanitized (invisible chars removed) before scanning
|
|
148
|
+
* to prevent Unicode obfuscation from bypassing detection.
|
|
149
|
+
*/
|
|
150
|
+
export function detectInjectionPatterns(text) {
|
|
151
|
+
const sanitized = sanitizeExternalMessage(text);
|
|
152
|
+
const matched = [];
|
|
153
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
154
|
+
if (pattern.regex.test(sanitized)) {
|
|
155
|
+
matched.push(pattern.name);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
detected: matched.length > 0,
|
|
160
|
+
patterns: matched,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Sanitize message content for safe inclusion in LLM context.
|
|
165
|
+
*
|
|
166
|
+
* For inbound (external) messages: sanitizes and wraps with boundary markers.
|
|
167
|
+
* For outbound messages: sanitizes only (no boundary wrapping needed).
|
|
168
|
+
*
|
|
169
|
+
* This is the primary function to call when preparing message content
|
|
170
|
+
* for any LLM-facing output (auto-recall context, tool results, etc.).
|
|
171
|
+
*/
|
|
172
|
+
export function sanitizeMessageForContext(content, options = {}) {
|
|
173
|
+
const { direction = 'inbound', channel, sender } = options;
|
|
174
|
+
if (direction === 'outbound') {
|
|
175
|
+
return sanitizeExternalMessage(content);
|
|
176
|
+
}
|
|
177
|
+
return wrapExternalMessage(content, { channel, sender });
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=injection-protection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-protection.js","sourceRoot":"","sources":["../../src/utils/injection-protection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oDAAoD;AACpD,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAClD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAE9C;;;GAGG;AACH,MAAM,mBAAmB,GAAG,mCAAmC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,uBAAuB,GAAG,kDAAkD,CAAC;AAYnF,MAAM,kBAAkB,GAAuB;IAC7C;QACE,IAAI,EAAE,sBAAsB;QAC5B,KAAK,EAAE,wNAAwN;KAChO;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,oMAAoM;KAC5M;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,6GAA6G;KACrH;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,KAAK,EAAE,gEAAgE;KACxE;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,iGAAiG;KACzG;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,gDAAgD;KACxD;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,sKAAsK;KAC9K;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,8LAA8L;KACtM;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,KAAK,EAAE,0EAA0E;KAClF;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,qIAAqI;KAC7I;CACF,CAAC;AA4BF;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI;SACR,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;SACpC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,SAAS,qBAAqB,CAAC,IAAY;IACzC,OAAO,IAAI;SACR,OAAO,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;SAC5D,OAAO,CAAC,mBAAmB,EAAE,0BAA0B,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,qBAAqB,CAC1B,uBAAuB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,UAAuB,EAAE;IAC5E,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEnD,0EAA0E;IAC1E,MAAM,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CAAC,SAAS,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC,GAAG,kBAAkB,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAClD,CAAC,CAAC,kBAAkB,CAAC;IAEvB,OAAO,GAAG,MAAM,KAAK,OAAO,KAAK,gBAAgB,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;QAC5B,QAAQ,EAAE,OAAO;KAClB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAAe,EACf,UAAkC,EAAE;IAEpC,MAAM,EAAE,SAAS,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3D,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,mBAAmB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nominatim reverse geocoding client with LRU cache.
|
|
3
|
+
* Resolves lat/lng to human-readable address and place label.
|
|
4
|
+
*/
|
|
5
|
+
export interface GeocodedLocation {
|
|
6
|
+
address: string;
|
|
7
|
+
placeLabel: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Reverse geocode a lat/lng pair via Nominatim.
|
|
11
|
+
* Returns null on any failure (timeout, network error, bad response).
|
|
12
|
+
*/
|
|
13
|
+
export declare function reverseGeocode(lat: number, lng: number, nominatimUrl: string): Promise<GeocodedLocation | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Clears the geocode cache (for testing).
|
|
16
|
+
*/
|
|
17
|
+
export declare function clearGeocodeCache(): void;
|
|
18
|
+
//# sourceMappingURL=nominatim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nominatim.d.ts","sourceRoot":"","sources":["../../src/utils/nominatim.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA2ClC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|