@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.
Files changed (88) hide show
  1. package/dist/config.d.ts +8 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +6 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/hooks.d.ts.map +1 -1
  6. package/dist/hooks.js +17 -3
  7. package/dist/hooks.js.map +1 -1
  8. package/dist/register-openclaw.d.ts +3 -1
  9. package/dist/register-openclaw.d.ts.map +1 -1
  10. package/dist/register-openclaw.js +611 -55
  11. package/dist/register-openclaw.js.map +1 -1
  12. package/dist/tools/context-search.d.ts +79 -0
  13. package/dist/tools/context-search.d.ts.map +1 -0
  14. package/dist/tools/context-search.js +265 -0
  15. package/dist/tools/context-search.js.map +1 -0
  16. package/dist/tools/email-send.d.ts.map +1 -1
  17. package/dist/tools/email-send.js +1 -14
  18. package/dist/tools/email-send.js.map +1 -1
  19. package/dist/tools/entity-links.d.ts +117 -0
  20. package/dist/tools/entity-links.d.ts.map +1 -0
  21. package/dist/tools/entity-links.js +446 -0
  22. package/dist/tools/entity-links.js.map +1 -0
  23. package/dist/tools/index.d.ts +4 -0
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +8 -0
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/memory-recall.d.ts +28 -0
  28. package/dist/tools/memory-recall.d.ts.map +1 -1
  29. package/dist/tools/memory-recall.js +42 -3
  30. package/dist/tools/memory-recall.js.map +1 -1
  31. package/dist/tools/memory-store.d.ts +57 -0
  32. package/dist/tools/memory-store.d.ts.map +1 -1
  33. package/dist/tools/memory-store.js +29 -2
  34. package/dist/tools/memory-store.js.map +1 -1
  35. package/dist/tools/message-search.d.ts +1 -1
  36. package/dist/tools/message-search.d.ts.map +1 -1
  37. package/dist/tools/message-search.js +20 -2
  38. package/dist/tools/message-search.js.map +1 -1
  39. package/dist/tools/notes.d.ts +2 -2
  40. package/dist/tools/project-search.d.ts +92 -0
  41. package/dist/tools/project-search.d.ts.map +1 -0
  42. package/dist/tools/project-search.js +160 -0
  43. package/dist/tools/project-search.js.map +1 -0
  44. package/dist/tools/skill-store.d.ts +12 -12
  45. package/dist/tools/threads.d.ts +2 -2
  46. package/dist/tools/threads.d.ts.map +1 -1
  47. package/dist/tools/threads.js +30 -6
  48. package/dist/tools/threads.js.map +1 -1
  49. package/dist/tools/todo-search.d.ts +95 -0
  50. package/dist/tools/todo-search.d.ts.map +1 -0
  51. package/dist/tools/todo-search.js +164 -0
  52. package/dist/tools/todo-search.js.map +1 -0
  53. package/dist/types/openclaw-api.d.ts +15 -0
  54. package/dist/types/openclaw-api.d.ts.map +1 -1
  55. package/dist/utils/auto-linker.d.ts +66 -0
  56. package/dist/utils/auto-linker.d.ts.map +1 -0
  57. package/dist/utils/auto-linker.js +354 -0
  58. package/dist/utils/auto-linker.js.map +1 -0
  59. package/dist/utils/geo.d.ts +24 -0
  60. package/dist/utils/geo.d.ts.map +1 -0
  61. package/dist/utils/geo.js +38 -0
  62. package/dist/utils/geo.js.map +1 -0
  63. package/dist/utils/inbound-gate.d.ts +85 -0
  64. package/dist/utils/inbound-gate.d.ts.map +1 -0
  65. package/dist/utils/inbound-gate.js +133 -0
  66. package/dist/utils/inbound-gate.js.map +1 -0
  67. package/dist/utils/injection-protection.d.ts +81 -0
  68. package/dist/utils/injection-protection.d.ts.map +1 -0
  69. package/dist/utils/injection-protection.js +179 -0
  70. package/dist/utils/injection-protection.js.map +1 -0
  71. package/dist/utils/nominatim.d.ts +18 -0
  72. package/dist/utils/nominatim.d.ts.map +1 -0
  73. package/dist/utils/nominatim.js +56 -0
  74. package/dist/utils/nominatim.js.map +1 -0
  75. package/dist/utils/rate-limiter.d.ts +81 -0
  76. package/dist/utils/rate-limiter.d.ts.map +1 -0
  77. package/dist/utils/rate-limiter.js +188 -0
  78. package/dist/utils/rate-limiter.js.map +1 -0
  79. package/dist/utils/spam-filter.d.ts +79 -0
  80. package/dist/utils/spam-filter.d.ts.map +1 -0
  81. package/dist/utils/spam-filter.js +237 -0
  82. package/dist/utils/spam-filter.js.map +1 -0
  83. package/dist/utils/token-budget.d.ts +68 -0
  84. package/dist/utils/token-budget.d.ts.map +1 -0
  85. package/dist/utils/token-budget.js +142 -0
  86. package/dist/utils/token-budget.js.map +1 -0
  87. package/openclaw.plugin.json +3 -3
  88. 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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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "id": "openclaw-projects",
3
- "version": "0.0.11",
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
- "format": "email",
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
- "format": "uri",
146
+ "pattern": "^https?://",
147
147
  "description": "Base URL for web app (used for generating note/notebook URLs)"
148
148
  }
149
149
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@troykelly/openclaw-projects",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "description": "OpenClaw memory plugin with projects, todos, and contacts integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",