@waiaas/daemon 2.9.0 → 2.10.0-rc

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 (172) hide show
  1. package/dist/api/middleware/master-auth.d.ts +3 -0
  2. package/dist/api/middleware/master-auth.d.ts.map +1 -1
  3. package/dist/api/middleware/master-auth.js +14 -0
  4. package/dist/api/middleware/master-auth.js.map +1 -1
  5. package/dist/api/routes/admin.d.ts +4 -0
  6. package/dist/api/routes/admin.d.ts.map +1 -1
  7. package/dist/api/routes/admin.js +186 -1
  8. package/dist/api/routes/admin.js.map +1 -1
  9. package/dist/api/routes/audit-logs.d.ts +15 -0
  10. package/dist/api/routes/audit-logs.d.ts.map +1 -0
  11. package/dist/api/routes/audit-logs.js +119 -0
  12. package/dist/api/routes/audit-logs.js.map +1 -0
  13. package/dist/api/routes/index.d.ts +2 -1
  14. package/dist/api/routes/index.d.ts.map +1 -1
  15. package/dist/api/routes/index.js +2 -1
  16. package/dist/api/routes/index.js.map +1 -1
  17. package/dist/api/routes/openapi-schemas.d.ts +324 -6
  18. package/dist/api/routes/openapi-schemas.d.ts.map +1 -1
  19. package/dist/api/routes/openapi-schemas.js +76 -0
  20. package/dist/api/routes/openapi-schemas.js.map +1 -1
  21. package/dist/api/routes/sessions.d.ts +2 -0
  22. package/dist/api/routes/sessions.d.ts.map +1 -1
  23. package/dist/api/routes/sessions.js +21 -0
  24. package/dist/api/routes/sessions.js.map +1 -1
  25. package/dist/api/routes/transactions.d.ts +2 -1
  26. package/dist/api/routes/transactions.d.ts.map +1 -1
  27. package/dist/api/routes/transactions.js +72 -1
  28. package/dist/api/routes/transactions.js.map +1 -1
  29. package/dist/api/routes/wallets.d.ts.map +1 -1
  30. package/dist/api/routes/wallets.js +25 -0
  31. package/dist/api/routes/wallets.js.map +1 -1
  32. package/dist/api/routes/webhooks.d.ts +17 -0
  33. package/dist/api/routes/webhooks.d.ts.map +1 -0
  34. package/dist/api/routes/webhooks.js +218 -0
  35. package/dist/api/routes/webhooks.js.map +1 -0
  36. package/dist/api/server.d.ts +27 -0
  37. package/dist/api/server.d.ts.map +1 -1
  38. package/dist/api/server.js +31 -5
  39. package/dist/api/server.js.map +1 -1
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/infrastructure/backup/backup-format.d.ts +107 -0
  45. package/dist/infrastructure/backup/backup-format.d.ts.map +1 -0
  46. package/dist/infrastructure/backup/backup-format.js +134 -0
  47. package/dist/infrastructure/backup/backup-format.js.map +1 -0
  48. package/dist/infrastructure/backup/encrypted-backup-service.d.ts +56 -0
  49. package/dist/infrastructure/backup/encrypted-backup-service.d.ts.map +1 -0
  50. package/dist/infrastructure/backup/encrypted-backup-service.js +269 -0
  51. package/dist/infrastructure/backup/encrypted-backup-service.js.map +1 -0
  52. package/dist/infrastructure/backup/index.d.ts +3 -0
  53. package/dist/infrastructure/backup/index.d.ts.map +1 -1
  54. package/dist/infrastructure/backup/index.js +2 -0
  55. package/dist/infrastructure/backup/index.js.map +1 -1
  56. package/dist/infrastructure/config/loader.d.ts +23 -0
  57. package/dist/infrastructure/config/loader.d.ts.map +1 -1
  58. package/dist/infrastructure/config/loader.js +8 -0
  59. package/dist/infrastructure/config/loader.js.map +1 -1
  60. package/dist/infrastructure/database/audit-helper.d.ts +29 -0
  61. package/dist/infrastructure/database/audit-helper.d.ts.map +1 -0
  62. package/dist/infrastructure/database/audit-helper.js +30 -0
  63. package/dist/infrastructure/database/audit-helper.js.map +1 -0
  64. package/dist/infrastructure/database/index.d.ts +2 -0
  65. package/dist/infrastructure/database/index.d.ts.map +1 -1
  66. package/dist/infrastructure/database/index.js +1 -0
  67. package/dist/infrastructure/database/index.js.map +1 -1
  68. package/dist/infrastructure/database/migrate.d.ts +1 -1
  69. package/dist/infrastructure/database/migrate.d.ts.map +1 -1
  70. package/dist/infrastructure/database/migrate.js +83 -2
  71. package/dist/infrastructure/database/migrate.js.map +1 -1
  72. package/dist/infrastructure/database/schema.d.ts +343 -1
  73. package/dist/infrastructure/database/schema.d.ts.map +1 -1
  74. package/dist/infrastructure/database/schema.js +41 -1
  75. package/dist/infrastructure/database/schema.js.map +1 -1
  76. package/dist/infrastructure/metrics/in-memory-counter.d.ts +34 -0
  77. package/dist/infrastructure/metrics/in-memory-counter.d.ts.map +1 -0
  78. package/dist/infrastructure/metrics/in-memory-counter.js +88 -0
  79. package/dist/infrastructure/metrics/in-memory-counter.js.map +1 -0
  80. package/dist/infrastructure/settings/hot-reload.d.ts +1 -0
  81. package/dist/infrastructure/settings/hot-reload.d.ts.map +1 -1
  82. package/dist/infrastructure/settings/hot-reload.js +23 -2
  83. package/dist/infrastructure/settings/hot-reload.js.map +1 -1
  84. package/dist/infrastructure/settings/setting-keys.d.ts.map +1 -1
  85. package/dist/infrastructure/settings/setting-keys.js +4 -0
  86. package/dist/infrastructure/settings/setting-keys.js.map +1 -1
  87. package/dist/infrastructure/telegram/telegram-bot-service.d.ts +2 -0
  88. package/dist/infrastructure/telegram/telegram-bot-service.d.ts.map +1 -1
  89. package/dist/infrastructure/telegram/telegram-bot-service.js +36 -19
  90. package/dist/infrastructure/telegram/telegram-bot-service.js.map +1 -1
  91. package/dist/lifecycle/daemon.d.ts +21 -1
  92. package/dist/lifecycle/daemon.d.ts.map +1 -1
  93. package/dist/lifecycle/daemon.js +131 -2
  94. package/dist/lifecycle/daemon.js.map +1 -1
  95. package/dist/pipeline/dry-run.d.ts +68 -0
  96. package/dist/pipeline/dry-run.d.ts.map +1 -0
  97. package/dist/pipeline/dry-run.js +426 -0
  98. package/dist/pipeline/dry-run.js.map +1 -0
  99. package/dist/pipeline/index.d.ts +1 -0
  100. package/dist/pipeline/index.d.ts.map +1 -1
  101. package/dist/pipeline/index.js +2 -0
  102. package/dist/pipeline/index.js.map +1 -1
  103. package/dist/pipeline/pipeline.d.ts +18 -1
  104. package/dist/pipeline/pipeline.d.ts.map +1 -1
  105. package/dist/pipeline/pipeline.js +38 -0
  106. package/dist/pipeline/pipeline.js.map +1 -1
  107. package/dist/pipeline/stages.d.ts +31 -1
  108. package/dist/pipeline/stages.d.ts.map +1 -1
  109. package/dist/pipeline/stages.js +120 -22
  110. package/dist/pipeline/stages.js.map +1 -1
  111. package/dist/services/admin-stats-service.d.ts +48 -0
  112. package/dist/services/admin-stats-service.d.ts.map +1 -0
  113. package/dist/services/admin-stats-service.js +182 -0
  114. package/dist/services/admin-stats-service.js.map +1 -0
  115. package/dist/services/autostop/autostop-service.d.ts +83 -0
  116. package/dist/services/autostop/autostop-service.d.ts.map +1 -0
  117. package/dist/services/autostop/autostop-service.js +252 -0
  118. package/dist/services/autostop/autostop-service.js.map +1 -0
  119. package/dist/services/autostop/index.d.ts +15 -0
  120. package/dist/services/autostop/index.d.ts.map +1 -0
  121. package/dist/services/autostop/index.js +11 -0
  122. package/dist/services/autostop/index.js.map +1 -0
  123. package/dist/services/autostop/rule-registry.d.ts +42 -0
  124. package/dist/services/autostop/rule-registry.d.ts.map +1 -0
  125. package/dist/services/autostop/rule-registry.js +54 -0
  126. package/dist/services/autostop/rule-registry.js.map +1 -0
  127. package/dist/services/autostop/rules/consecutive-failures.rule.d.ts +38 -0
  128. package/dist/services/autostop/rules/consecutive-failures.rule.d.ts.map +1 -0
  129. package/dist/services/autostop/rules/consecutive-failures.rule.js +75 -0
  130. package/dist/services/autostop/rules/consecutive-failures.rule.js.map +1 -0
  131. package/dist/services/autostop/rules/idle-timeout.rule.d.ts +43 -0
  132. package/dist/services/autostop/rules/idle-timeout.rule.d.ts.map +1 -0
  133. package/dist/services/autostop/rules/idle-timeout.rule.js +128 -0
  134. package/dist/services/autostop/rules/idle-timeout.rule.js.map +1 -0
  135. package/dist/services/autostop/rules/unusual-activity.rule.d.ts +33 -0
  136. package/dist/services/autostop/rules/unusual-activity.rule.d.ts.map +1 -0
  137. package/dist/services/autostop/rules/unusual-activity.rule.js +73 -0
  138. package/dist/services/autostop/rules/unusual-activity.rule.js.map +1 -0
  139. package/dist/services/autostop/types.d.ts +49 -0
  140. package/dist/services/autostop/types.d.ts.map +1 -0
  141. package/dist/services/autostop/types.js +10 -0
  142. package/dist/services/autostop/types.js.map +1 -0
  143. package/dist/services/autostop-rules.d.ts +11 -74
  144. package/dist/services/autostop-rules.d.ts.map +1 -1
  145. package/dist/services/autostop-rules.js +9 -169
  146. package/dist/services/autostop-rules.js.map +1 -1
  147. package/dist/services/autostop-service.d.ts +6 -77
  148. package/dist/services/autostop-service.d.ts.map +1 -1
  149. package/dist/services/autostop-service.js +5 -212
  150. package/dist/services/autostop-service.js.map +1 -1
  151. package/dist/services/kill-switch-service.d.ts.map +1 -1
  152. package/dist/services/kill-switch-service.js +36 -21
  153. package/dist/services/kill-switch-service.js.map +1 -1
  154. package/dist/services/signing-sdk/sign-response-handler.d.ts +3 -0
  155. package/dist/services/signing-sdk/sign-response-handler.d.ts.map +1 -1
  156. package/dist/services/signing-sdk/sign-response-handler.js +5 -0
  157. package/dist/services/signing-sdk/sign-response-handler.js.map +1 -1
  158. package/dist/services/webhook-delivery-queue.d.ts +53 -0
  159. package/dist/services/webhook-delivery-queue.d.ts.map +1 -0
  160. package/dist/services/webhook-delivery-queue.js +118 -0
  161. package/dist/services/webhook-delivery-queue.js.map +1 -0
  162. package/dist/services/webhook-service.d.ts +46 -0
  163. package/dist/services/webhook-service.d.ts.map +1 -0
  164. package/dist/services/webhook-service.js +160 -0
  165. package/dist/services/webhook-service.js.map +1 -0
  166. package/dist/workflow/approval-workflow.d.ts +2 -0
  167. package/dist/workflow/approval-workflow.d.ts.map +1 -1
  168. package/dist/workflow/approval-workflow.js +6 -1
  169. package/dist/workflow/approval-workflow.js.map +1 -1
  170. package/package.json +5 -5
  171. package/public/admin/assets/{index-CBU6NfOH.js → index-RagPnRU1.js} +2 -2
  172. package/public/admin/index.html +1 -1
@@ -0,0 +1,54 @@
1
+ /**
2
+ * RuleRegistry: Map-based storage for IAutoStopRule instances.
3
+ *
4
+ * Supports register/unregister, enable/disable per-rule, and
5
+ * query by event type or tickable capability.
6
+ *
7
+ * @see PLUG-01 requirements
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // RuleRegistry implementation
11
+ // ---------------------------------------------------------------------------
12
+ export class RuleRegistry {
13
+ rules = new Map();
14
+ /** Register a rule (replaces existing rule with same id). */
15
+ register(rule) {
16
+ this.rules.set(rule.id, rule);
17
+ }
18
+ /** Unregister a rule by id. */
19
+ unregister(ruleId) {
20
+ this.rules.delete(ruleId);
21
+ }
22
+ /** Get all rules in insertion order. */
23
+ getRules() {
24
+ return Array.from(this.rules.values());
25
+ }
26
+ /** Get a single rule by id. */
27
+ getRule(id) {
28
+ return this.rules.get(id);
29
+ }
30
+ /** Get only enabled rules. */
31
+ getEnabledRules() {
32
+ return this.getRules().filter((r) => r.enabled);
33
+ }
34
+ /** Get enabled rules that subscribe to the given event type. */
35
+ getRulesForEvent(eventType) {
36
+ return this.getEnabledRules().filter((r) => r.subscribedEvents.includes(eventType));
37
+ }
38
+ /** Get enabled rules that have a tick() method. */
39
+ getTickableRules() {
40
+ return this.getEnabledRules().filter((r) => typeof r.tick === 'function');
41
+ }
42
+ /** Set enabled state for a specific rule. */
43
+ setEnabled(ruleId, enabled) {
44
+ const rule = this.rules.get(ruleId);
45
+ if (rule) {
46
+ rule.enabled = enabled;
47
+ }
48
+ }
49
+ /** Number of registered rules. */
50
+ get size() {
51
+ return this.rules.size;
52
+ }
53
+ }
54
+ //# sourceMappingURL=rule-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../../../src/services/autostop/rule-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,6DAA6D;IAC7D,QAAQ,CAAC,IAAmB;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,+BAA+B;IAC/B,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,wCAAwC;IACxC,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,+BAA+B;IAC/B,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,8BAA8B;IAC9B,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,gEAAgE;IAChE,gBAAgB,CAAC,SAA4B;QAC3C,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,mDAAmD;IACnD,gBAAgB;QACd,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAC5E,CAAC;IAED,6CAA6C;IAC7C,UAAU,CAAC,MAAc,EAAE,OAAgB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ConsecutiveFailuresRule: IAutoStopRule implementation.
3
+ *
4
+ * Tracks consecutive transaction failures per wallet.
5
+ * Triggers SUSPEND_WALLET when a wallet reaches N consecutive failures (default: 5).
6
+ *
7
+ * @see AUTO-01 requirement
8
+ */
9
+ import type { IAutoStopRule, AutoStopEvent, AutoStopEventType, RuleResult, RuleStatus } from '../types.js';
10
+ export declare class ConsecutiveFailuresRule implements IAutoStopRule {
11
+ readonly id = "consecutive_failures";
12
+ readonly displayName = "Consecutive Failures";
13
+ readonly description = "Suspends wallet after N consecutive transaction failures";
14
+ readonly subscribedEvents: AutoStopEventType[];
15
+ enabled: boolean;
16
+ private failureCounts;
17
+ private _threshold;
18
+ constructor(threshold?: number);
19
+ get threshold(): number;
20
+ evaluate(event: AutoStopEvent): RuleResult;
21
+ getStatus(): RuleStatus;
22
+ updateConfig(config: Record<string, unknown>): void;
23
+ reset(): void;
24
+ /** Reset counter after trigger (prevents repeated triggers without new failures). */
25
+ resetWallet(walletId: string): void;
26
+ /** Record a transaction failure (backward compat -- delegates to evaluate). */
27
+ onTransactionFailed(walletId: string): {
28
+ triggered: boolean;
29
+ walletId: string;
30
+ };
31
+ /** Reset failure counter on successful transaction (backward compat). */
32
+ onTransactionCompleted(walletId: string): void;
33
+ /** Update threshold at runtime (backward compat). */
34
+ updateThreshold(threshold: number): void;
35
+ /** Current state for monitoring (backward compat). */
36
+ getTrackedCount(): number;
37
+ }
38
+ //# sourceMappingURL=consecutive-failures.rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consecutive-failures.rule.d.ts","sourceRoot":"","sources":["../../../../src/services/autostop/rules/consecutive-failures.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3G,qBAAa,uBAAwB,YAAW,aAAa;IAC3D,QAAQ,CAAC,EAAE,0BAA0B;IACrC,QAAQ,CAAC,WAAW,0BAA0B;IAC9C,QAAQ,CAAC,WAAW,8DAA8D;IAClF,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAmD;IACjG,OAAO,UAAQ;IAEf,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,SAAI;IAIzB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;IAkB1C,SAAS,IAAI,UAAU;IAQvB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMnD,KAAK,IAAI,IAAI;IAIb,qFAAqF;IACrF,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC,+EAA+E;IAC/E,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAI/E,yEAAyE;IACzE,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI9C,qDAAqD;IACrD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIxC,sDAAsD;IACtD,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * ConsecutiveFailuresRule: IAutoStopRule implementation.
3
+ *
4
+ * Tracks consecutive transaction failures per wallet.
5
+ * Triggers SUSPEND_WALLET when a wallet reaches N consecutive failures (default: 5).
6
+ *
7
+ * @see AUTO-01 requirement
8
+ */
9
+ export class ConsecutiveFailuresRule {
10
+ id = 'consecutive_failures';
11
+ displayName = 'Consecutive Failures';
12
+ description = 'Suspends wallet after N consecutive transaction failures';
13
+ subscribedEvents = ['transaction:failed', 'transaction:completed'];
14
+ enabled = true;
15
+ failureCounts = new Map();
16
+ _threshold;
17
+ constructor(threshold = 5) {
18
+ this._threshold = threshold;
19
+ }
20
+ get threshold() {
21
+ return this._threshold;
22
+ }
23
+ evaluate(event) {
24
+ if (event.type === 'transaction:completed') {
25
+ // Reset failure counter on successful transaction
26
+ this.failureCounts.set(event.walletId, 0);
27
+ return { triggered: false, walletId: event.walletId };
28
+ }
29
+ // transaction:failed
30
+ const count = (this.failureCounts.get(event.walletId) ?? 0) + 1;
31
+ this.failureCounts.set(event.walletId, count);
32
+ return {
33
+ triggered: count >= this._threshold,
34
+ walletId: event.walletId,
35
+ action: count >= this._threshold ? 'SUSPEND_WALLET' : undefined,
36
+ };
37
+ }
38
+ getStatus() {
39
+ return {
40
+ trackedCount: this.failureCounts.size,
41
+ config: { threshold: this._threshold },
42
+ state: {},
43
+ };
44
+ }
45
+ updateConfig(config) {
46
+ if (config.threshold !== undefined) {
47
+ this._threshold = Number(config.threshold);
48
+ }
49
+ }
50
+ reset() {
51
+ this.failureCounts.clear();
52
+ }
53
+ /** Reset counter after trigger (prevents repeated triggers without new failures). */
54
+ resetWallet(walletId) {
55
+ this.failureCounts.delete(walletId);
56
+ }
57
+ // --- Backward-compatible methods ---
58
+ /** Record a transaction failure (backward compat -- delegates to evaluate). */
59
+ onTransactionFailed(walletId) {
60
+ return this.evaluate({ type: 'transaction:failed', walletId, timestamp: Date.now() / 1000 });
61
+ }
62
+ /** Reset failure counter on successful transaction (backward compat). */
63
+ onTransactionCompleted(walletId) {
64
+ this.evaluate({ type: 'transaction:completed', walletId, timestamp: Date.now() / 1000 });
65
+ }
66
+ /** Update threshold at runtime (backward compat). */
67
+ updateThreshold(threshold) {
68
+ this._threshold = threshold;
69
+ }
70
+ /** Current state for monitoring (backward compat). */
71
+ getTrackedCount() {
72
+ return this.failureCounts.size;
73
+ }
74
+ }
75
+ //# sourceMappingURL=consecutive-failures.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consecutive-failures.rule.js","sourceRoot":"","sources":["../../../../src/services/autostop/rules/consecutive-failures.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,OAAO,uBAAuB;IACzB,EAAE,GAAG,sBAAsB,CAAC;IAC5B,WAAW,GAAG,sBAAsB,CAAC;IACrC,WAAW,GAAG,0DAA0D,CAAC;IACzE,gBAAgB,GAAwB,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,CAAC;IACjG,OAAO,GAAG,IAAI,CAAC;IAEP,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,UAAU,CAAS;IAE3B,YAAY,SAAS,GAAG,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YAC3C,kDAAkD;YAClD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxD,CAAC;QAED,qBAAqB;QACrB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE9C,OAAO;YACL,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU;YACnC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;SAChE,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;YACrC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;YACtC,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAA+B;QAC1C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,qFAAqF;IACrF,WAAW,CAAC,QAAgB;QAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,sCAAsC;IAEtC,+EAA+E;IAC/E,mBAAmB,CAAC,QAAgB;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED,yEAAyE;IACzE,sBAAsB,CAAC,QAAgB;QACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,qDAAqD;IACrD,eAAe,CAAC,SAAiB;QAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,sDAAsD;IACtD,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * IdleTimeoutRule: IAutoStopRule implementation.
3
+ *
4
+ * Tracks session last-activity timestamps per wallet.
5
+ * tick() returns idle sessions whose inactivity exceeds the configured timeout.
6
+ *
7
+ * @see AUTO-03 requirement
8
+ */
9
+ import type { IAutoStopRule, AutoStopEvent, AutoStopEventType, RuleResult, RuleTickResult, RuleStatus } from '../types.js';
10
+ /** Type alias for backward compatibility with old tests. */
11
+ export interface IdleSession {
12
+ walletId: string;
13
+ sessionId: string;
14
+ }
15
+ export declare class IdleTimeoutRule implements IAutoStopRule {
16
+ readonly id = "idle_timeout";
17
+ readonly displayName = "Idle Session Timeout";
18
+ readonly description = "Notifies when sessions remain idle beyond configured timeout";
19
+ readonly subscribedEvents: AutoStopEventType[];
20
+ enabled: boolean;
21
+ private lastActivity;
22
+ private _idleTimeoutSec;
23
+ constructor(idleTimeoutSec?: number);
24
+ get idleTimeoutSec(): number;
25
+ evaluate(event: AutoStopEvent): RuleResult;
26
+ tick(nowSec: number): RuleTickResult[];
27
+ getStatus(): RuleStatus;
28
+ updateConfig(config: Record<string, unknown>): void;
29
+ reset(): void;
30
+ /** Register a new session with current timestamp. */
31
+ registerSession(walletId: string, sessionId: string, nowSec: number): void;
32
+ /** Update last activity time for a session (or all sessions of a wallet). */
33
+ onWalletActivity(walletId: string, nowSec: number, sessionId?: string): void;
34
+ /** Check all tracked sessions and return those that have been idle beyond the timeout. */
35
+ checkIdle(nowSec: number): IdleSession[];
36
+ /** Remove a session from tracking (after revocation). */
37
+ removeSession(walletId: string, sessionId: string): void;
38
+ /** Update timeout at runtime (backward compat). */
39
+ updateTimeout(idleTimeoutSec: number): void;
40
+ /** Current state for monitoring (backward compat). */
41
+ getTrackedSessionCount(): number;
42
+ }
43
+ //# sourceMappingURL=idle-timeout.rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-timeout.rule.d.ts","sourceRoot":"","sources":["../../../../src/services/autostop/rules/idle-timeout.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3H,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,EAAE,kBAAkB;IAC7B,QAAQ,CAAC,WAAW,0BAA0B;IAC9C,QAAQ,CAAC,WAAW,kEAAkE;IACtF,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAuB;IACrE,OAAO,UAAQ;IAGf,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,eAAe,CAAS;gBAEpB,cAAc,SAAO;IAIjC,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;IAc1C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE;IAYtC,SAAS,IAAI,UAAU;IAYvB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMnD,KAAK,IAAI,IAAI;IAMb,qDAAqD;IACrD,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAS1E,6EAA6E;IAC7E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAc5E,0FAA0F;IAC1F,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAYxC,yDAAyD;IACzD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAUxD,mDAAmD;IACnD,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAI3C,sDAAsD;IACtD,sBAAsB,IAAI,MAAM;CAOjC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * IdleTimeoutRule: IAutoStopRule implementation.
3
+ *
4
+ * Tracks session last-activity timestamps per wallet.
5
+ * tick() returns idle sessions whose inactivity exceeds the configured timeout.
6
+ *
7
+ * @see AUTO-03 requirement
8
+ */
9
+ export class IdleTimeoutRule {
10
+ id = 'idle_timeout';
11
+ displayName = 'Idle Session Timeout';
12
+ description = 'Notifies when sessions remain idle beyond configured timeout';
13
+ subscribedEvents = ['wallet:activity'];
14
+ enabled = true;
15
+ // Map<walletId, Map<sessionId, lastActivityTimestampSec>>
16
+ lastActivity = new Map();
17
+ _idleTimeoutSec;
18
+ constructor(idleTimeoutSec = 3600) {
19
+ this._idleTimeoutSec = idleTimeoutSec;
20
+ }
21
+ get idleTimeoutSec() {
22
+ return this._idleTimeoutSec;
23
+ }
24
+ evaluate(event) {
25
+ // Session registration and activity updates via evaluate
26
+ if (event.details?.activity === 'SESSION_CREATED' && event.details?.sessionId) {
27
+ this.registerSession(event.walletId, event.details.sessionId, event.timestamp);
28
+ }
29
+ else if (event.details?.sessionId) {
30
+ this.onWalletActivity(event.walletId, event.timestamp, event.details.sessionId);
31
+ }
32
+ else {
33
+ this.onWalletActivity(event.walletId, event.timestamp);
34
+ }
35
+ // Idle detection is via tick(), not evaluate
36
+ return { triggered: false, walletId: event.walletId };
37
+ }
38
+ tick(nowSec) {
39
+ const results = [];
40
+ for (const [walletId, sessions] of this.lastActivity) {
41
+ for (const [sessionId, lastTime] of sessions) {
42
+ if (nowSec - lastTime > this._idleTimeoutSec) {
43
+ results.push({ walletId, sessionId, action: 'NOTIFY_IDLE' });
44
+ }
45
+ }
46
+ }
47
+ return results;
48
+ }
49
+ getStatus() {
50
+ let sessionCount = 0;
51
+ for (const sessions of this.lastActivity.values()) {
52
+ sessionCount += sessions.size;
53
+ }
54
+ return {
55
+ trackedCount: sessionCount,
56
+ config: { idleTimeoutSec: this._idleTimeoutSec },
57
+ state: {},
58
+ };
59
+ }
60
+ updateConfig(config) {
61
+ if (config.idleTimeoutSec !== undefined) {
62
+ this._idleTimeoutSec = Number(config.idleTimeoutSec);
63
+ }
64
+ }
65
+ reset() {
66
+ this.lastActivity.clear();
67
+ }
68
+ // --- Public methods (used by AutoStopService directly) ---
69
+ /** Register a new session with current timestamp. */
70
+ registerSession(walletId, sessionId, nowSec) {
71
+ let walletSessions = this.lastActivity.get(walletId);
72
+ if (!walletSessions) {
73
+ walletSessions = new Map();
74
+ this.lastActivity.set(walletId, walletSessions);
75
+ }
76
+ walletSessions.set(sessionId, nowSec);
77
+ }
78
+ /** Update last activity time for a session (or all sessions of a wallet). */
79
+ onWalletActivity(walletId, nowSec, sessionId) {
80
+ const walletSessions = this.lastActivity.get(walletId);
81
+ if (!walletSessions)
82
+ return;
83
+ if (sessionId && walletSessions.has(sessionId)) {
84
+ walletSessions.set(sessionId, nowSec);
85
+ }
86
+ else if (!sessionId) {
87
+ // Update all sessions for this wallet
88
+ for (const sid of walletSessions.keys()) {
89
+ walletSessions.set(sid, nowSec);
90
+ }
91
+ }
92
+ }
93
+ /** Check all tracked sessions and return those that have been idle beyond the timeout. */
94
+ checkIdle(nowSec) {
95
+ const idle = [];
96
+ for (const [walletId, sessions] of this.lastActivity) {
97
+ for (const [sessionId, lastTime] of sessions) {
98
+ if (nowSec - lastTime > this._idleTimeoutSec) {
99
+ idle.push({ walletId, sessionId });
100
+ }
101
+ }
102
+ }
103
+ return idle;
104
+ }
105
+ /** Remove a session from tracking (after revocation). */
106
+ removeSession(walletId, sessionId) {
107
+ const walletSessions = this.lastActivity.get(walletId);
108
+ if (walletSessions) {
109
+ walletSessions.delete(sessionId);
110
+ if (walletSessions.size === 0) {
111
+ this.lastActivity.delete(walletId);
112
+ }
113
+ }
114
+ }
115
+ /** Update timeout at runtime (backward compat). */
116
+ updateTimeout(idleTimeoutSec) {
117
+ this._idleTimeoutSec = idleTimeoutSec;
118
+ }
119
+ /** Current state for monitoring (backward compat). */
120
+ getTrackedSessionCount() {
121
+ let count = 0;
122
+ for (const sessions of this.lastActivity.values()) {
123
+ count += sessions.size;
124
+ }
125
+ return count;
126
+ }
127
+ }
128
+ //# sourceMappingURL=idle-timeout.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-timeout.rule.js","sourceRoot":"","sources":["../../../../src/services/autostop/rules/idle-timeout.rule.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * UnusualActivityRule: IAutoStopRule implementation.
3
+ *
4
+ * Sliding window frequency detection per wallet.
5
+ * Triggers SUSPEND_WALLET when activity count within a time window exceeds threshold.
6
+ *
7
+ * @see AUTO-02 requirement
8
+ */
9
+ import type { IAutoStopRule, AutoStopEvent, AutoStopEventType, RuleResult, RuleStatus } from '../types.js';
10
+ export declare class UnusualActivityRule implements IAutoStopRule {
11
+ readonly id = "unusual_activity";
12
+ readonly displayName = "Unusual Activity";
13
+ readonly description = "Suspends wallet when activity frequency exceeds threshold in sliding window";
14
+ readonly subscribedEvents: AutoStopEventType[];
15
+ enabled: boolean;
16
+ private activityTimestamps;
17
+ private _threshold;
18
+ private _windowSec;
19
+ constructor(threshold?: number, windowSec?: number);
20
+ get threshold(): number;
21
+ get windowSec(): number;
22
+ evaluate(event: AutoStopEvent): RuleResult;
23
+ getStatus(): RuleStatus;
24
+ updateConfig(config: Record<string, unknown>): void;
25
+ reset(): void;
26
+ /** Update threshold at runtime. */
27
+ updateThreshold(threshold: number): void;
28
+ /** Update window at runtime. */
29
+ updateWindow(windowSec: number): void;
30
+ /** Current state for monitoring. */
31
+ getTrackedCount(): number;
32
+ }
33
+ //# sourceMappingURL=unusual-activity.rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unusual-activity.rule.d.ts","sourceRoot":"","sources":["../../../../src/services/autostop/rules/unusual-activity.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3G,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,EAAE,sBAAsB;IACjC,QAAQ,CAAC,WAAW,sBAAsB;IAC1C,QAAQ,CAAC,WAAW,iFAAiF;IACrG,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAuB;IACrE,OAAO,UAAQ;IAEf,OAAO,CAAC,kBAAkB,CAA+B;IACzD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,SAAS,SAAK,EAAE,SAAS,SAAM;IAK3C,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU;IAgB1C,SAAS,IAAI,UAAU;IAQvB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IASnD,KAAK,IAAI,IAAI;IAMb,mCAAmC;IACnC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIxC,gCAAgC;IAChC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,oCAAoC;IACpC,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * UnusualActivityRule: IAutoStopRule implementation.
3
+ *
4
+ * Sliding window frequency detection per wallet.
5
+ * Triggers SUSPEND_WALLET when activity count within a time window exceeds threshold.
6
+ *
7
+ * @see AUTO-02 requirement
8
+ */
9
+ export class UnusualActivityRule {
10
+ id = 'unusual_activity';
11
+ displayName = 'Unusual Activity';
12
+ description = 'Suspends wallet when activity frequency exceeds threshold in sliding window';
13
+ subscribedEvents = ['wallet:activity'];
14
+ enabled = true;
15
+ activityTimestamps = new Map();
16
+ _threshold;
17
+ _windowSec;
18
+ constructor(threshold = 20, windowSec = 300) {
19
+ this._threshold = threshold;
20
+ this._windowSec = windowSec;
21
+ }
22
+ get threshold() {
23
+ return this._threshold;
24
+ }
25
+ get windowSec() {
26
+ return this._windowSec;
27
+ }
28
+ evaluate(event) {
29
+ const cutoff = event.timestamp - this._windowSec;
30
+ let timestamps = this.activityTimestamps.get(event.walletId) ?? [];
31
+ // Prune timestamps outside the sliding window
32
+ timestamps = timestamps.filter((t) => t > cutoff);
33
+ timestamps.push(event.timestamp);
34
+ this.activityTimestamps.set(event.walletId, timestamps);
35
+ return {
36
+ triggered: timestamps.length >= this._threshold,
37
+ walletId: event.walletId,
38
+ action: timestamps.length >= this._threshold ? 'SUSPEND_WALLET' : undefined,
39
+ };
40
+ }
41
+ getStatus() {
42
+ return {
43
+ trackedCount: this.activityTimestamps.size,
44
+ config: { threshold: this._threshold, windowSec: this._windowSec },
45
+ state: {},
46
+ };
47
+ }
48
+ updateConfig(config) {
49
+ if (config.threshold !== undefined) {
50
+ this._threshold = Number(config.threshold);
51
+ }
52
+ if (config.windowSec !== undefined) {
53
+ this._windowSec = Number(config.windowSec);
54
+ }
55
+ }
56
+ reset() {
57
+ this.activityTimestamps.clear();
58
+ }
59
+ // --- Backward-compatible methods (used by existing tests and hot-reload) ---
60
+ /** Update threshold at runtime. */
61
+ updateThreshold(threshold) {
62
+ this._threshold = threshold;
63
+ }
64
+ /** Update window at runtime. */
65
+ updateWindow(windowSec) {
66
+ this._windowSec = windowSec;
67
+ }
68
+ /** Current state for monitoring. */
69
+ getTrackedCount() {
70
+ return this.activityTimestamps.size;
71
+ }
72
+ }
73
+ //# sourceMappingURL=unusual-activity.rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unusual-activity.rule.js","sourceRoot":"","sources":["../../../../src/services/autostop/rules/unusual-activity.rule.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,OAAO,mBAAmB;IACrB,EAAE,GAAG,kBAAkB,CAAC;IACxB,WAAW,GAAG,kBAAkB,CAAC;IACjC,WAAW,GAAG,6EAA6E,CAAC;IAC5F,gBAAgB,GAAwB,CAAC,iBAAiB,CAAC,CAAC;IACrE,OAAO,GAAG,IAAI,CAAC;IAEP,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,UAAU,CAAS;IACnB,UAAU,CAAS;IAE3B,YAAY,SAAS,GAAG,EAAE,EAAE,SAAS,GAAG,GAAG;QACzC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,KAAoB;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QACjD,IAAI,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnE,8CAA8C;QAC9C,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAClD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAExD,OAAO;YACL,SAAS,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU;YAC/C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI;YAC1C,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;YAClE,KAAK,EAAE,EAAE;SACV,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,MAA+B;QAC1C,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,8EAA8E;IAE9E,mCAAmC;IACnC,eAAe,CAAC,SAAiB;QAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,gCAAgC;IAChC,YAAY,CAAC,SAAiB;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,oCAAoC;IACpC,eAAe;QACb,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * AutoStop plugin architecture types.
3
+ *
4
+ * IAutoStopRule defines the contract for pluggable rules.
5
+ * RuleRegistry manages rule lifecycle (register/unregister/query).
6
+ *
7
+ * @see PLUG-01, PLUG-02 requirements
8
+ */
9
+ export type AutoStopEventType = 'transaction:failed' | 'transaction:completed' | 'wallet:activity';
10
+ export type RuleAction = 'SUSPEND_WALLET' | 'NOTIFY_IDLE' | 'KILL_SWITCH_CASCADE';
11
+ export interface AutoStopEvent {
12
+ type: AutoStopEventType;
13
+ walletId: string;
14
+ timestamp: number;
15
+ details?: Record<string, unknown>;
16
+ }
17
+ export interface RuleResult {
18
+ triggered: boolean;
19
+ walletId: string;
20
+ action?: RuleAction;
21
+ }
22
+ export interface RuleTickResult {
23
+ walletId: string;
24
+ sessionId?: string;
25
+ action: RuleAction;
26
+ }
27
+ export interface RuleStatus {
28
+ trackedCount: number;
29
+ config: Record<string, unknown>;
30
+ state: Record<string, unknown>;
31
+ }
32
+ export interface IAutoStopRule {
33
+ readonly id: string;
34
+ readonly displayName: string;
35
+ readonly description: string;
36
+ readonly subscribedEvents: AutoStopEventType[];
37
+ enabled: boolean;
38
+ /** Evaluate an event against this rule. */
39
+ evaluate(event: AutoStopEvent): RuleResult;
40
+ /** Periodic tick for time-based rules (e.g., idle timeout). Optional. */
41
+ tick?(nowSec: number): RuleTickResult[];
42
+ /** Get current rule status for monitoring. */
43
+ getStatus(): RuleStatus;
44
+ /** Update rule configuration at runtime. */
45
+ updateConfig(config: Record<string, unknown>): void;
46
+ /** Reset all internal state. */
47
+ reset(): void;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/autostop/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,iBAAiB,CAAC;AAEnG,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,aAAa,GAAG,qBAAqB,CAAC;AAElF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAMD,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAMD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IAEjB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,CAAC;IAE3C,yEAAyE;IACzE,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAExC,8CAA8C;IAC9C,SAAS,IAAI,UAAU,CAAC;IAExB,4CAA4C;IAC5C,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAEpD,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * AutoStop plugin architecture types.
3
+ *
4
+ * IAutoStopRule defines the contract for pluggable rules.
5
+ * RuleRegistry manages rule lifecycle (register/unregister/query).
6
+ *
7
+ * @see PLUG-01, PLUG-02 requirements
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/autostop/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,79 +1,16 @@
1
1
  /**
2
- * AutoStop rule implementations: pure in-memory logic for detecting anomalous behavior.
2
+ * Backward-compatible re-export barrel for autostop rule classes.
3
3
  *
4
- * Three rules:
5
- * 1. ConsecutiveFailuresRule -- Track consecutive transaction failures per wallet.
6
- * Triggers when a wallet reaches N consecutive failures (default: 5).
4
+ * The actual implementations have been moved to:
5
+ * - services/autostop/rules/consecutive-failures.rule.ts
6
+ * - services/autostop/rules/unusual-activity.rule.ts
7
+ * - services/autostop/rules/idle-timeout.rule.ts
7
8
  *
8
- * 2. UnusualActivityRule -- Sliding window frequency detection per wallet.
9
- * Triggers when activity count within a time window exceeds threshold.
10
- *
11
- * 3. IdleTimeoutRule -- Track session last-activity timestamps per wallet.
12
- * Returns idle sessions whose inactivity exceeds the configured timeout.
13
- *
14
- * All rules are stateless with respect to external dependencies (no DB, no network).
15
- * State is held in in-memory Maps and is lost on restart (acceptable for reactive rules).
16
- *
17
- * MANUAL_TRIGGER is handled directly by AutoStopService (no separate rule class).
18
- *
19
- * @see AUTO-01, AUTO-02, AUTO-03 requirements
9
+ * @deprecated Import from './autostop/rules/*.rule.js' directly.
20
10
  */
21
- export interface RuleResult {
22
- triggered: boolean;
23
- walletId: string;
24
- }
25
- export interface IdleSession {
26
- walletId: string;
27
- sessionId: string;
28
- }
29
- export declare class ConsecutiveFailuresRule {
30
- private failureCounts;
31
- private _threshold;
32
- constructor(threshold?: number);
33
- get threshold(): number;
34
- /** Record a transaction failure for a wallet. Returns triggered=true if threshold reached. */
35
- onTransactionFailed(walletId: string): RuleResult;
36
- /** Reset failure counter on successful transaction. */
37
- onTransactionCompleted(walletId: string): void;
38
- /** Reset counter after trigger (prevents repeated triggers without new failures). */
39
- resetWallet(walletId: string): void;
40
- /** Update threshold at runtime. */
41
- updateThreshold(threshold: number): void;
42
- /** Current state for monitoring. */
43
- getTrackedCount(): number;
44
- }
45
- export declare class UnusualActivityRule {
46
- private activityTimestamps;
47
- private _threshold;
48
- private _windowSec;
49
- constructor(threshold?: number, windowSec?: number);
50
- get threshold(): number;
51
- get windowSec(): number;
52
- /** Record wallet activity. Returns triggered=true if frequency exceeds threshold. */
53
- onWalletActivity(walletId: string, timestamp: number): RuleResult;
54
- /** Update threshold at runtime. */
55
- updateThreshold(threshold: number): void;
56
- /** Update window at runtime. */
57
- updateWindow(windowSec: number): void;
58
- /** Current state for monitoring. */
59
- getTrackedCount(): number;
60
- }
61
- export declare class IdleTimeoutRule {
62
- private lastActivity;
63
- private _idleTimeoutSec;
64
- constructor(idleTimeoutSec?: number);
65
- get idleTimeoutSec(): number;
66
- /** Register a new session with current timestamp. */
67
- registerSession(walletId: string, sessionId: string, nowSec: number): void;
68
- /** Update last activity time for a session (or all sessions of a wallet). */
69
- onWalletActivity(walletId: string, nowSec: number, sessionId?: string): void;
70
- /** Check all tracked sessions and return those that have been idle beyond the timeout. */
71
- checkIdle(nowSec: number): IdleSession[];
72
- /** Remove a session from tracking (after revocation). */
73
- removeSession(walletId: string, sessionId: string): void;
74
- /** Update timeout at runtime. */
75
- updateTimeout(idleTimeoutSec: number): void;
76
- /** Current state for monitoring. */
77
- getTrackedSessionCount(): number;
78
- }
11
+ export { ConsecutiveFailuresRule } from './autostop/rules/consecutive-failures.rule.js';
12
+ export { UnusualActivityRule } from './autostop/rules/unusual-activity.rule.js';
13
+ export { IdleTimeoutRule } from './autostop/rules/idle-timeout.rule.js';
14
+ export type { IdleSession } from './autostop/rules/idle-timeout.rule.js';
15
+ export type { RuleResult } from './autostop/types.js';
79
16
  //# sourceMappingURL=autostop-rules.d.ts.map