@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.
Files changed (96) hide show
  1. package/dist/config.d.ts +30 -1
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +28 -1
  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/contacts.d.ts +6 -6
  13. package/dist/tools/contacts.d.ts.map +1 -1
  14. package/dist/tools/contacts.js +7 -7
  15. package/dist/tools/contacts.js.map +1 -1
  16. package/dist/tools/context-search.d.ts +79 -0
  17. package/dist/tools/context-search.d.ts.map +1 -0
  18. package/dist/tools/context-search.js +265 -0
  19. package/dist/tools/context-search.js.map +1 -0
  20. package/dist/tools/email-send.d.ts.map +1 -1
  21. package/dist/tools/email-send.js +1 -14
  22. package/dist/tools/email-send.js.map +1 -1
  23. package/dist/tools/entity-links.d.ts +117 -0
  24. package/dist/tools/entity-links.d.ts.map +1 -0
  25. package/dist/tools/entity-links.js +446 -0
  26. package/dist/tools/entity-links.js.map +1 -0
  27. package/dist/tools/index.d.ts +4 -0
  28. package/dist/tools/index.d.ts.map +1 -1
  29. package/dist/tools/index.js +8 -0
  30. package/dist/tools/index.js.map +1 -1
  31. package/dist/tools/memory-forget.js +5 -5
  32. package/dist/tools/memory-forget.js.map +1 -1
  33. package/dist/tools/memory-recall.d.ts +28 -0
  34. package/dist/tools/memory-recall.d.ts.map +1 -1
  35. package/dist/tools/memory-recall.js +44 -4
  36. package/dist/tools/memory-recall.js.map +1 -1
  37. package/dist/tools/memory-store.d.ts +57 -0
  38. package/dist/tools/memory-store.d.ts.map +1 -1
  39. package/dist/tools/memory-store.js +29 -2
  40. package/dist/tools/memory-store.js.map +1 -1
  41. package/dist/tools/message-search.d.ts +1 -1
  42. package/dist/tools/message-search.d.ts.map +1 -1
  43. package/dist/tools/message-search.js +20 -2
  44. package/dist/tools/message-search.js.map +1 -1
  45. package/dist/tools/notes.d.ts +2 -2
  46. package/dist/tools/project-search.d.ts +92 -0
  47. package/dist/tools/project-search.d.ts.map +1 -0
  48. package/dist/tools/project-search.js +160 -0
  49. package/dist/tools/project-search.js.map +1 -0
  50. package/dist/tools/relationships.js +1 -1
  51. package/dist/tools/relationships.js.map +1 -1
  52. package/dist/tools/skill-store.d.ts +12 -12
  53. package/dist/tools/threads.d.ts +2 -2
  54. package/dist/tools/threads.d.ts.map +1 -1
  55. package/dist/tools/threads.js +30 -6
  56. package/dist/tools/threads.js.map +1 -1
  57. package/dist/tools/todo-search.d.ts +95 -0
  58. package/dist/tools/todo-search.d.ts.map +1 -0
  59. package/dist/tools/todo-search.js +164 -0
  60. package/dist/tools/todo-search.js.map +1 -0
  61. package/dist/types/openclaw-api.d.ts +15 -0
  62. package/dist/types/openclaw-api.d.ts.map +1 -1
  63. package/dist/utils/auto-linker.d.ts +66 -0
  64. package/dist/utils/auto-linker.d.ts.map +1 -0
  65. package/dist/utils/auto-linker.js +354 -0
  66. package/dist/utils/auto-linker.js.map +1 -0
  67. package/dist/utils/geo.d.ts +24 -0
  68. package/dist/utils/geo.d.ts.map +1 -0
  69. package/dist/utils/geo.js +38 -0
  70. package/dist/utils/geo.js.map +1 -0
  71. package/dist/utils/inbound-gate.d.ts +85 -0
  72. package/dist/utils/inbound-gate.d.ts.map +1 -0
  73. package/dist/utils/inbound-gate.js +133 -0
  74. package/dist/utils/inbound-gate.js.map +1 -0
  75. package/dist/utils/injection-protection.d.ts +81 -0
  76. package/dist/utils/injection-protection.d.ts.map +1 -0
  77. package/dist/utils/injection-protection.js +179 -0
  78. package/dist/utils/injection-protection.js.map +1 -0
  79. package/dist/utils/nominatim.d.ts +18 -0
  80. package/dist/utils/nominatim.d.ts.map +1 -0
  81. package/dist/utils/nominatim.js +56 -0
  82. package/dist/utils/nominatim.js.map +1 -0
  83. package/dist/utils/rate-limiter.d.ts +81 -0
  84. package/dist/utils/rate-limiter.d.ts.map +1 -0
  85. package/dist/utils/rate-limiter.js +188 -0
  86. package/dist/utils/rate-limiter.js.map +1 -0
  87. package/dist/utils/spam-filter.d.ts +79 -0
  88. package/dist/utils/spam-filter.d.ts.map +1 -0
  89. package/dist/utils/spam-filter.js +237 -0
  90. package/dist/utils/spam-filter.js.map +1 -0
  91. package/dist/utils/token-budget.d.ts +68 -0
  92. package/dist/utils/token-budget.d.ts.map +1 -0
  93. package/dist/utils/token-budget.js +142 -0
  94. package/dist/utils/token-budget.js.map +1 -0
  95. package/openclaw.plugin.json +3 -3
  96. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spam-filter.js","sourceRoot":"","sources":["../../src/utils/spam-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
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
+ /** Configuration for token budget tracking */
10
+ export interface TokenBudgetConfig {
11
+ /** Whether token budget enforcement is enabled */
12
+ enabled: boolean;
13
+ /** Maximum tokens per day (optional, no limit if omitted) */
14
+ dailyTokenLimit?: number;
15
+ /** Maximum tokens per month (optional, no limit if omitted) */
16
+ monthlyTokenLimit?: number;
17
+ }
18
+ /** Result of a token budget check */
19
+ export interface TokenBudgetResult {
20
+ /** Whether the token request is allowed */
21
+ allowed: boolean;
22
+ /** Human-readable reason if denied, null if allowed */
23
+ reason: string | null;
24
+ /** Tokens remaining in daily budget (undefined if no daily limit) */
25
+ remainingDaily?: number;
26
+ /** Tokens remaining in monthly budget (undefined if no monthly limit) */
27
+ remainingMonthly?: number;
28
+ }
29
+ /** Token budget usage statistics */
30
+ export interface TokenBudgetStats {
31
+ /** Tokens used today */
32
+ dailyUsed: number;
33
+ /** Tokens used this month */
34
+ monthlyUsed: number;
35
+ /** Daily token limit (undefined if not set) */
36
+ dailyLimit?: number;
37
+ /** Monthly token limit (undefined if not set) */
38
+ monthlyLimit?: number;
39
+ }
40
+ /** Token budget instance */
41
+ export interface TokenBudget {
42
+ /** Check if a token expenditure is allowed (read-only, does not record) */
43
+ check(tokens: number): TokenBudgetResult;
44
+ /** Record actual token usage */
45
+ record(tokens: number): void;
46
+ /**
47
+ * Atomically check and record token usage.
48
+ * Prevents TOCTOU races where concurrent check() calls both pass
49
+ * before either records, allowing the budget to be exceeded.
50
+ * Returns the check result; if allowed, tokens are already recorded.
51
+ */
52
+ tryConsume(tokens: number): TokenBudgetResult;
53
+ /** Get current usage statistics */
54
+ getStats(): TokenBudgetStats;
55
+ }
56
+ /** Default configuration (budget disabled) */
57
+ export declare const DEFAULT_TOKEN_BUDGET_CONFIG: TokenBudgetConfig;
58
+ /**
59
+ * Create a token budget tracker.
60
+ *
61
+ * Tracks daily and monthly token usage with automatic reset at
62
+ * UTC midnight (daily) and UTC month boundary (monthly).
63
+ *
64
+ * @param config - Token budget configuration
65
+ * @returns TokenBudget instance
66
+ */
67
+ export declare function createTokenBudget(config?: TokenBudgetConfig): TokenBudget;
68
+ //# sourceMappingURL=token-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-budget.d.ts","sourceRoot":"","sources":["../../src/utils/token-budget.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8CAA8C;AAC9C,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,4BAA4B;AAC5B,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACzC,gCAAgC;IAChC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;IAC9C,mCAAmC;IACnC,QAAQ,IAAI,gBAAgB,CAAC;CAC9B;AAED,8CAA8C;AAC9C,eAAO,MAAM,2BAA2B,EAAE,iBAEzC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,iBAA+C,GAAG,WAAW,CAyItG"}
@@ -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.10",
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.10",
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",