@troykelly/openclaw-projects 0.0.11 → 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 +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -0
- 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/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-recall.d.ts +28 -0
- package/dist/tools/memory-recall.d.ts.map +1 -1
- package/dist/tools/memory-recall.js +42 -3
- 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/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,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token budget tracking utility for inbound message processing.
|
|
3
|
+
*
|
|
4
|
+
* Provides configurable daily and monthly caps on token expenditure
|
|
5
|
+
* to protect against cost overruns from bulk inbound messages.
|
|
6
|
+
*
|
|
7
|
+
* Part of Issue #1225 — rate limiting and spam protection.
|
|
8
|
+
*/
|
|
9
|
+
/** Default configuration (budget disabled) */
|
|
10
|
+
export const DEFAULT_TOKEN_BUDGET_CONFIG = {
|
|
11
|
+
enabled: false,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Create a token budget tracker.
|
|
15
|
+
*
|
|
16
|
+
* Tracks daily and monthly token usage with automatic reset at
|
|
17
|
+
* UTC midnight (daily) and UTC month boundary (monthly).
|
|
18
|
+
*
|
|
19
|
+
* @param config - Token budget configuration
|
|
20
|
+
* @returns TokenBudget instance
|
|
21
|
+
*/
|
|
22
|
+
export function createTokenBudget(config = DEFAULT_TOKEN_BUDGET_CONFIG) {
|
|
23
|
+
let dailyUsed = 0;
|
|
24
|
+
let monthlyUsed = 0;
|
|
25
|
+
let currentDay = getCurrentDay();
|
|
26
|
+
let currentMonth = getCurrentMonth();
|
|
27
|
+
/**
|
|
28
|
+
* Get the current UTC day as YYYY-MM-DD string.
|
|
29
|
+
*/
|
|
30
|
+
function getCurrentDay() {
|
|
31
|
+
return new Date().toISOString().slice(0, 10);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the current UTC month as YYYY-MM string.
|
|
35
|
+
*/
|
|
36
|
+
function getCurrentMonth() {
|
|
37
|
+
return new Date().toISOString().slice(0, 7);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reset counters if the day or month has changed.
|
|
41
|
+
*/
|
|
42
|
+
function maybeReset() {
|
|
43
|
+
const today = getCurrentDay();
|
|
44
|
+
const thisMonth = getCurrentMonth();
|
|
45
|
+
if (today !== currentDay) {
|
|
46
|
+
dailyUsed = 0;
|
|
47
|
+
currentDay = today;
|
|
48
|
+
}
|
|
49
|
+
if (thisMonth !== currentMonth) {
|
|
50
|
+
monthlyUsed = 0;
|
|
51
|
+
currentMonth = thisMonth;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
check(tokens) {
|
|
56
|
+
if (!config.enabled) {
|
|
57
|
+
return { allowed: true, reason: null };
|
|
58
|
+
}
|
|
59
|
+
maybeReset();
|
|
60
|
+
// Check daily limit
|
|
61
|
+
if (config.dailyTokenLimit !== undefined) {
|
|
62
|
+
if (dailyUsed + tokens > config.dailyTokenLimit) {
|
|
63
|
+
return {
|
|
64
|
+
allowed: false,
|
|
65
|
+
reason: `daily token budget exceeded (${dailyUsed}/${config.dailyTokenLimit} used, requested ${tokens})`,
|
|
66
|
+
remainingDaily: Math.max(0, config.dailyTokenLimit - dailyUsed),
|
|
67
|
+
remainingMonthly: config.monthlyTokenLimit !== undefined ? Math.max(0, config.monthlyTokenLimit - monthlyUsed) : undefined,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Check monthly limit
|
|
72
|
+
if (config.monthlyTokenLimit !== undefined) {
|
|
73
|
+
if (monthlyUsed + tokens > config.monthlyTokenLimit) {
|
|
74
|
+
return {
|
|
75
|
+
allowed: false,
|
|
76
|
+
reason: `monthly token budget exceeded (${monthlyUsed}/${config.monthlyTokenLimit} used, requested ${tokens})`,
|
|
77
|
+
remainingDaily: config.dailyTokenLimit !== undefined ? Math.max(0, config.dailyTokenLimit - dailyUsed) : undefined,
|
|
78
|
+
remainingMonthly: Math.max(0, config.monthlyTokenLimit - monthlyUsed),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
allowed: true,
|
|
84
|
+
reason: null,
|
|
85
|
+
remainingDaily: config.dailyTokenLimit !== undefined ? config.dailyTokenLimit - dailyUsed : undefined,
|
|
86
|
+
remainingMonthly: config.monthlyTokenLimit !== undefined ? config.monthlyTokenLimit - monthlyUsed : undefined,
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
record(tokens) {
|
|
90
|
+
maybeReset();
|
|
91
|
+
dailyUsed += tokens;
|
|
92
|
+
monthlyUsed += tokens;
|
|
93
|
+
},
|
|
94
|
+
tryConsume(tokens) {
|
|
95
|
+
if (!config.enabled) {
|
|
96
|
+
return { allowed: true, reason: null };
|
|
97
|
+
}
|
|
98
|
+
maybeReset();
|
|
99
|
+
// Check daily limit
|
|
100
|
+
if (config.dailyTokenLimit !== undefined) {
|
|
101
|
+
if (dailyUsed + tokens > config.dailyTokenLimit) {
|
|
102
|
+
return {
|
|
103
|
+
allowed: false,
|
|
104
|
+
reason: `daily token budget exceeded (${dailyUsed}/${config.dailyTokenLimit} used, requested ${tokens})`,
|
|
105
|
+
remainingDaily: Math.max(0, config.dailyTokenLimit - dailyUsed),
|
|
106
|
+
remainingMonthly: config.monthlyTokenLimit !== undefined ? Math.max(0, config.monthlyTokenLimit - monthlyUsed) : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Check monthly limit
|
|
111
|
+
if (config.monthlyTokenLimit !== undefined) {
|
|
112
|
+
if (monthlyUsed + tokens > config.monthlyTokenLimit) {
|
|
113
|
+
return {
|
|
114
|
+
allowed: false,
|
|
115
|
+
reason: `monthly token budget exceeded (${monthlyUsed}/${config.monthlyTokenLimit} used, requested ${tokens})`,
|
|
116
|
+
remainingDaily: config.dailyTokenLimit !== undefined ? Math.max(0, config.dailyTokenLimit - dailyUsed) : undefined,
|
|
117
|
+
remainingMonthly: Math.max(0, config.monthlyTokenLimit - monthlyUsed),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Atomically record usage since check passed
|
|
122
|
+
dailyUsed += tokens;
|
|
123
|
+
monthlyUsed += tokens;
|
|
124
|
+
return {
|
|
125
|
+
allowed: true,
|
|
126
|
+
reason: null,
|
|
127
|
+
remainingDaily: config.dailyTokenLimit !== undefined ? config.dailyTokenLimit - dailyUsed : undefined,
|
|
128
|
+
remainingMonthly: config.monthlyTokenLimit !== undefined ? config.monthlyTokenLimit - monthlyUsed : undefined,
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
getStats() {
|
|
132
|
+
maybeReset();
|
|
133
|
+
return {
|
|
134
|
+
dailyUsed,
|
|
135
|
+
monthlyUsed,
|
|
136
|
+
dailyLimit: config.dailyTokenLimit,
|
|
137
|
+
monthlyLimit: config.monthlyTokenLimit,
|
|
138
|
+
};
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=token-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-budget.js","sourceRoot":"","sources":["../../src/utils/token-budget.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "openclaw-projects",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.12",
|
|
4
4
|
"name": "OpenClaw Projects Plugin",
|
|
5
5
|
"description": "Memory provider with projects, todos, and contacts integration",
|
|
6
6
|
"kind": "memory",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
},
|
|
75
75
|
"postmarkFromEmail": {
|
|
76
76
|
"type": "string",
|
|
77
|
-
"
|
|
77
|
+
"pattern": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$",
|
|
78
78
|
"description": "Postmark From Email address (direct value)"
|
|
79
79
|
},
|
|
80
80
|
"postmarkFromEmailFile": {
|
|
@@ -143,7 +143,7 @@
|
|
|
143
143
|
},
|
|
144
144
|
"baseUrl": {
|
|
145
145
|
"type": "string",
|
|
146
|
-
"
|
|
146
|
+
"pattern": "^https?://",
|
|
147
147
|
"description": "Base URL for web app (used for generating note/notebook URLs)"
|
|
148
148
|
}
|
|
149
149
|
},
|