@astrive-ai/plugins 1.0.1

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.
@@ -0,0 +1,21 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+ export interface AnalyticsMetrics {
4
+ requestCount: number;
5
+ errorCount: number;
6
+ totalLatencyMs: number;
7
+ toolUsage: Record<string, number>;
8
+ }
9
+ export interface ComputedAnalyticsMetrics extends AnalyticsMetrics {
10
+ averageLatency: number;
11
+ errorRate: number;
12
+ }
13
+ export declare class AnalyticsPlugin extends BasePlugin {
14
+ private metrics;
15
+ constructor();
16
+ install(context: PluginContext): Promise<void>;
17
+ getMetrics(): ComputedAnalyticsMetrics;
18
+ reset(): void;
19
+ private getInitialMetrics;
20
+ }
21
+ //# sourceMappingURL=analytics-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-plugin.d.ts","sourceRoot":"","sources":["../src/analytics-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,OAAO,CAAC,OAAO,CAAmB;;IAWrB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpD,UAAU,IAAI,wBAAwB;IAStC,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,iBAAiB;CAQ1B"}
@@ -0,0 +1,55 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ export class AnalyticsPlugin extends BasePlugin {
3
+ metrics;
4
+ constructor() {
5
+ super({
6
+ name: 'analytics',
7
+ version: '1.0.0',
8
+ description: 'Tracks analytics metrics for agent usage',
9
+ });
10
+ this.metrics = this.getInitialMetrics();
11
+ }
12
+ async install(context) {
13
+ if (!context.events)
14
+ return;
15
+ let requestStartTime = 0;
16
+ context.events.on('request:start', (data) => {
17
+ requestStartTime = Date.now();
18
+ this.metrics.requestCount++;
19
+ });
20
+ context.events.on('request:end', (data) => {
21
+ if (requestStartTime) {
22
+ this.metrics.totalLatencyMs += Date.now() - requestStartTime;
23
+ }
24
+ });
25
+ context.events.on('error', (error) => {
26
+ this.metrics.errorCount++;
27
+ });
28
+ context.events.on('tool:start', (data) => {
29
+ if (data && data.name) {
30
+ const name = data.name;
31
+ this.metrics.toolUsage[name] = (this.metrics.toolUsage[name] || 0) + 1;
32
+ }
33
+ });
34
+ }
35
+ getMetrics() {
36
+ const baseMetrics = { ...this.metrics, toolUsage: { ...this.metrics.toolUsage } };
37
+ return {
38
+ ...baseMetrics,
39
+ averageLatency: baseMetrics.requestCount > 0 ? baseMetrics.totalLatencyMs / baseMetrics.requestCount : 0,
40
+ errorRate: baseMetrics.requestCount > 0 ? baseMetrics.errorCount / baseMetrics.requestCount : 0
41
+ };
42
+ }
43
+ reset() {
44
+ this.metrics = this.getInitialMetrics();
45
+ }
46
+ getInitialMetrics() {
47
+ return {
48
+ requestCount: 0,
49
+ errorCount: 0,
50
+ totalLatencyMs: 0,
51
+ toolUsage: {},
52
+ };
53
+ }
54
+ }
55
+ //# sourceMappingURL=analytics-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-plugin.js","sourceRoot":"","sources":["../src/analytics-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAe9C,MAAM,OAAO,eAAgB,SAAQ,UAAU;IACrC,OAAO,CAAmB;IAElC;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,0CAA0C;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAsB;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAE5B,IAAI,gBAAgB,GAAW,CAAC,CAAC;QAEjC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE;YAC/C,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAS,EAAE,EAAE;YAC7C,IAAI,gBAAgB,EAAE,CAAC;gBACrB,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;YAC5C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,EAAE;YAC5C,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;gBACjC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACzE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,UAAU;QACf,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAClF,OAAO;YACL,GAAG,WAAW;YACd,cAAc,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,cAAc,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACxG,SAAS,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SAChG,CAAC;IACJ,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC;IAEO,iBAAiB;QACvB,OAAO;YACL,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,CAAC;YACb,cAAc,EAAE,CAAC;YACjB,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { IPlugin, PluginManifest, PluginContext } from '@astrive-ai/types';
2
+ export declare abstract class BasePlugin implements IPlugin {
3
+ readonly name: string;
4
+ readonly version: string;
5
+ readonly description: string;
6
+ constructor(manifest: PluginManifest);
7
+ abstract install(context: PluginContext): Promise<void>;
8
+ uninstall(context: PluginContext): Promise<void>;
9
+ onInit(): Promise<void>;
10
+ onDestroy(): Promise<void>;
11
+ }
12
+ //# sourceMappingURL=base-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-plugin.d.ts","sourceRoot":"","sources":["../src/base-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEhF,8BAAsB,UAAW,YAAW,OAAO;IACjD,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,QAAQ,EAAE,cAAc;aAMpB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAEjD,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAGxC"}
@@ -0,0 +1,20 @@
1
+ export class BasePlugin {
2
+ name;
3
+ version;
4
+ description;
5
+ constructor(manifest) {
6
+ this.name = manifest.name;
7
+ this.version = manifest.version;
8
+ this.description = manifest.description;
9
+ }
10
+ async uninstall(context) {
11
+ // Default implementation does nothing
12
+ }
13
+ async onInit() {
14
+ // Default implementation does nothing
15
+ }
16
+ async onDestroy() {
17
+ // Default implementation does nothing
18
+ }
19
+ }
20
+ //# sourceMappingURL=base-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-plugin.js","sourceRoot":"","sources":["../src/base-plugin.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,UAAU;IACd,IAAI,CAAS;IACb,OAAO,CAAS;IAChB,WAAW,CAAS;IAEpC,YAAY,QAAwB;QAClC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IAC1C,CAAC;IAIM,KAAK,CAAC,SAAS,CAAC,OAAsB;QAC3C,sCAAsC;IACxC,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,sCAAsC;IACxC,CAAC;IAEM,KAAK,CAAC,SAAS;QACpB,sCAAsC;IACxC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+ export interface CachePluginConfig {
4
+ ttlMs?: number;
5
+ }
6
+ export declare class CachePlugin extends BasePlugin {
7
+ private ttlMs;
8
+ private cache;
9
+ private pendingRequests;
10
+ constructor(config?: CachePluginConfig);
11
+ install(context: PluginContext): Promise<void>;
12
+ private generateKey;
13
+ }
14
+ //# sourceMappingURL=cache-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-plugin.d.ts","sourceRoot":"","sources":["../src/cache-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAY,SAAQ,UAAU;IACzC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAgE;IAC7E,OAAO,CAAC,eAAe,CAAkC;gBAE7C,MAAM,GAAE,iBAAsB;IAS7B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B3D,OAAO,CAAC,WAAW;CAKpB"}
@@ -0,0 +1,45 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ export class CachePlugin extends BasePlugin {
3
+ ttlMs;
4
+ cache = new Map();
5
+ pendingRequests = new Map();
6
+ constructor(config = {}) {
7
+ super({
8
+ name: 'cache',
9
+ version: '1.0.0',
10
+ description: 'In-memory caching for agent responses',
11
+ });
12
+ this.ttlMs = config.ttlMs || 300000; // default 5 minutes
13
+ }
14
+ async install(context) {
15
+ if (!context.events)
16
+ return;
17
+ context.events.on('request:start', async (data) => {
18
+ const request = data.request;
19
+ const cacheKey = this.generateKey(request);
20
+ const cached = this.cache.get(cacheKey);
21
+ if (cached && Date.now() < cached.expiresAt) {
22
+ data.cachedResponse = cached.data;
23
+ }
24
+ else if (data.requestId) {
25
+ this.pendingRequests.set(data.requestId, cacheKey);
26
+ }
27
+ });
28
+ context.events.on('request:end', async (data) => {
29
+ if (data.requestId && this.pendingRequests.has(data.requestId)) {
30
+ const cacheKey = this.pendingRequests.get(data.requestId);
31
+ this.cache.set(cacheKey, {
32
+ data: data.response,
33
+ expiresAt: Date.now() + this.ttlMs
34
+ });
35
+ this.pendingRequests.delete(data.requestId);
36
+ }
37
+ });
38
+ }
39
+ generateKey(req) {
40
+ const inputStr = Array.isArray(req?.messages) ? JSON.stringify(req.messages) : (req?.prompt || '');
41
+ // using base64 for simplest environment agnostic hashing
42
+ return Buffer.from(inputStr).toString('base64');
43
+ }
44
+ }
45
+ //# sourceMappingURL=cache-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-plugin.js","sourceRoot":"","sources":["../src/cache-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAO9C,MAAM,OAAO,WAAY,SAAQ,UAAU;IACjC,KAAK,CAAS;IACd,KAAK,GAAsD,IAAI,GAAG,EAAE,CAAC;IACrE,eAAe,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEzD,YAAY,SAA4B,EAAE;QACxC,KAAK,CAAC;YACJ,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,uCAAuC;SACrD,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,oBAAoB;IAC3D,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAsB;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAE5B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAkC,CAAC;YACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC5C,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;YACpC,CAAC;iBAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAmB,EAAE,QAAQ,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YACnD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAmB,CAAC,EAAE,CAAC;gBACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,SAAmB,CAAE,CAAC;gBACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;oBACvB,IAAI,EAAE,IAAI,CAAC,QAAQ;oBACnB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;iBACnC,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAmB,CAAC,CAAC;YACxD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,GAA4B;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAgB,IAAI,EAAE,CAAC,CAAC;QAC7G,yDAAyD;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export * from './base-plugin.js';
2
+ export * from './logging-plugin.js';
3
+ export * from './rate-limit-plugin.js';
4
+ export * from './cache-plugin.js';
5
+ export * from './analytics-plugin.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './base-plugin.js';
2
+ export * from './logging-plugin.js';
3
+ export * from './rate-limit-plugin.js';
4
+ export * from './cache-plugin.js';
5
+ export * from './analytics-plugin.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+ export interface LoggingPluginConfig {
4
+ level?: 'debug' | 'info' | 'warn' | 'error';
5
+ }
6
+ export declare class LoggingPlugin extends BasePlugin {
7
+ private level;
8
+ constructor(config?: LoggingPluginConfig);
9
+ install(context: PluginContext): Promise<void>;
10
+ private log;
11
+ }
12
+ //# sourceMappingURL=logging-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-plugin.d.ts","sourceRoot":"","sources":["../src/logging-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAC7C;AAED,qBAAa,aAAc,SAAQ,UAAU;IAC3C,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,GAAE,mBAAwB;IAS/B,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B3D,OAAO,CAAC,GAAG;CAKZ"}
@@ -0,0 +1,38 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ export class LoggingPlugin extends BasePlugin {
3
+ level;
4
+ constructor(config = {}) {
5
+ super({
6
+ name: 'logging',
7
+ version: '1.0.0',
8
+ description: 'Logs agent events and interactions',
9
+ });
10
+ this.level = config.level || 'info';
11
+ }
12
+ async install(context) {
13
+ if (!context.events) {
14
+ return;
15
+ }
16
+ context.events.on('request:start', (data) => {
17
+ this.log('Request started', data);
18
+ });
19
+ context.events.on('request:end', (data) => {
20
+ this.log('Request ended', data);
21
+ });
22
+ context.events.on('tool:start', (data) => {
23
+ this.log('Tool execution started', data);
24
+ });
25
+ context.events.on('tool:end', (data) => {
26
+ this.log('Tool execution ended', data);
27
+ });
28
+ context.events.on('error', (error) => {
29
+ console.error(`[Plugin: logging] ERROR:`, error);
30
+ });
31
+ }
32
+ log(message, data) {
33
+ if (this.level === 'debug' || this.level === 'info') {
34
+ console.log(`[Plugin: logging] ${message}`, data ? data : '');
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=logging-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-plugin.js","sourceRoot":"","sources":["../src/logging-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAO9C,MAAM,OAAO,aAAc,SAAQ,UAAU;IACnC,KAAK,CAAS;IAEtB,YAAY,SAA8B,EAAE;QAC1C,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,oCAAoC;SAClD,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAsB;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE;YAC/C,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,IAAS,EAAE,EAAE;YAC7C,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,IAAS,EAAE,EAAE;YAC5C,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,IAAS,EAAE,EAAE;YAC1C,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAc,EAAE,EAAE;YAC5C,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,GAAG,CAAC,OAAe,EAAE,IAAc;QACzC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+ export interface RateLimitPluginConfig {
4
+ maxRequests?: number;
5
+ windowMs?: number;
6
+ }
7
+ export declare class RateLimitPlugin extends BasePlugin {
8
+ private maxRequests;
9
+ private windowMs;
10
+ private requestCounts;
11
+ constructor(config?: RateLimitPluginConfig);
12
+ install(context: PluginContext): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=rate-limit-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-plugin.d.ts","sourceRoot":"","sources":["../src/rate-limit-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAgE;gBAEzE,MAAM,GAAE,qBAA0B;IAUjC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB5D"}
@@ -0,0 +1,35 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ export class RateLimitPlugin extends BasePlugin {
3
+ maxRequests;
4
+ windowMs;
5
+ requestCounts = new Map();
6
+ constructor(config = {}) {
7
+ super({
8
+ name: 'rate-limit',
9
+ version: '1.0.0',
10
+ description: 'Provides rate limiting for agent requests',
11
+ });
12
+ this.maxRequests = config.maxRequests || 10;
13
+ this.windowMs = config.windowMs || 60000;
14
+ }
15
+ async install(context) {
16
+ if (!context.events)
17
+ return;
18
+ context.events.on('request:start', async (data) => {
19
+ const request = (data.request || {});
20
+ const key = request.userId || 'default';
21
+ const now = Date.now();
22
+ const record = this.requestCounts.get(key) || { count: 0, resetTime: now + this.windowMs };
23
+ if (now > record.resetTime) {
24
+ record.count = 0;
25
+ record.resetTime = now + this.windowMs;
26
+ }
27
+ if (record.count >= this.maxRequests) {
28
+ throw new Error(`Rate limit exceeded for user ${key}. Max ${this.maxRequests} requests per ${this.windowMs}ms.`);
29
+ }
30
+ record.count++;
31
+ this.requestCounts.set(key, record);
32
+ });
33
+ }
34
+ }
35
+ //# sourceMappingURL=rate-limit-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-plugin.js","sourceRoot":"","sources":["../src/rate-limit-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ9C,MAAM,OAAO,eAAgB,SAAQ,UAAU;IACrC,WAAW,CAAS;IACpB,QAAQ,CAAS;IACjB,aAAa,GAAsD,IAAI,GAAG,EAAE,CAAC;IAErF,YAAY,SAAgC,EAAE;QAC5C,KAAK,CAAC;YACJ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,2CAA2C;SACzD,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAsB;QACzC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAE5B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,IAAS,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YAChE,MAAM,GAAG,GAAI,OAAO,CAAC,MAAiB,IAAI,SAAS,CAAC;YACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE3F,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;gBACjB,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzC,CAAC;YAED,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrC,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,SAAS,IAAI,CAAC,WAAW,iBAAiB,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;YACnH,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@astrive-ai/plugins",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "clean": "rm -rf dist"
16
+ },
17
+ "dependencies": {
18
+ "@astrive-ai/types": "*"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "5.4.5"
22
+ }
23
+ }
@@ -0,0 +1,77 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+
4
+ export interface AnalyticsMetrics {
5
+ requestCount: number;
6
+ errorCount: number;
7
+ totalLatencyMs: number;
8
+ toolUsage: Record<string, number>;
9
+ }
10
+
11
+ export interface ComputedAnalyticsMetrics extends AnalyticsMetrics {
12
+ averageLatency: number;
13
+ errorRate: number;
14
+ }
15
+
16
+ export class AnalyticsPlugin extends BasePlugin {
17
+ private metrics: AnalyticsMetrics;
18
+
19
+ constructor() {
20
+ super({
21
+ name: 'analytics',
22
+ version: '1.0.0',
23
+ description: 'Tracks analytics metrics for agent usage',
24
+ });
25
+ this.metrics = this.getInitialMetrics();
26
+ }
27
+
28
+ public async install(context: PluginContext): Promise<void> {
29
+ if (!context.events) return;
30
+
31
+ let requestStartTime: number = 0;
32
+
33
+ context.events.on('request:start', (data: any) => {
34
+ requestStartTime = Date.now();
35
+ this.metrics.requestCount++;
36
+ });
37
+
38
+ context.events.on('request:end', (data: any) => {
39
+ if (requestStartTime) {
40
+ this.metrics.totalLatencyMs += Date.now() - requestStartTime;
41
+ }
42
+ });
43
+
44
+ context.events.on('error', (error: unknown) => {
45
+ this.metrics.errorCount++;
46
+ });
47
+
48
+ context.events.on('tool:start', (data: any) => {
49
+ if (data && data.name) {
50
+ const name = data.name as string;
51
+ this.metrics.toolUsage[name] = (this.metrics.toolUsage[name] || 0) + 1;
52
+ }
53
+ });
54
+ }
55
+
56
+ public getMetrics(): ComputedAnalyticsMetrics {
57
+ const baseMetrics = { ...this.metrics, toolUsage: { ...this.metrics.toolUsage } };
58
+ return {
59
+ ...baseMetrics,
60
+ averageLatency: baseMetrics.requestCount > 0 ? baseMetrics.totalLatencyMs / baseMetrics.requestCount : 0,
61
+ errorRate: baseMetrics.requestCount > 0 ? baseMetrics.errorCount / baseMetrics.requestCount : 0
62
+ };
63
+ }
64
+
65
+ public reset(): void {
66
+ this.metrics = this.getInitialMetrics();
67
+ }
68
+
69
+ private getInitialMetrics(): AnalyticsMetrics {
70
+ return {
71
+ requestCount: 0,
72
+ errorCount: 0,
73
+ totalLatencyMs: 0,
74
+ toolUsage: {},
75
+ };
76
+ }
77
+ }
@@ -0,0 +1,27 @@
1
+ import type { IPlugin, PluginManifest, PluginContext } from '@astrive-ai/types';
2
+
3
+ export abstract class BasePlugin implements IPlugin {
4
+ public readonly name: string;
5
+ public readonly version: string;
6
+ public readonly description: string;
7
+
8
+ constructor(manifest: PluginManifest) {
9
+ this.name = manifest.name;
10
+ this.version = manifest.version;
11
+ this.description = manifest.description;
12
+ }
13
+
14
+ public abstract install(context: PluginContext): Promise<void>;
15
+
16
+ public async uninstall(context: PluginContext): Promise<void> {
17
+ // Default implementation does nothing
18
+ }
19
+
20
+ public async onInit(): Promise<void> {
21
+ // Default implementation does nothing
22
+ }
23
+
24
+ public async onDestroy(): Promise<void> {
25
+ // Default implementation does nothing
26
+ }
27
+ }
@@ -0,0 +1,54 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+
4
+ export interface CachePluginConfig {
5
+ ttlMs?: number;
6
+ }
7
+
8
+ export class CachePlugin extends BasePlugin {
9
+ private ttlMs: number;
10
+ private cache: Map<string, { data: unknown; expiresAt: number }> = new Map();
11
+ private pendingRequests: Map<string, string> = new Map();
12
+
13
+ constructor(config: CachePluginConfig = {}) {
14
+ super({
15
+ name: 'cache',
16
+ version: '1.0.0',
17
+ description: 'In-memory caching for agent responses',
18
+ });
19
+ this.ttlMs = config.ttlMs || 300000; // default 5 minutes
20
+ }
21
+
22
+ public async install(context: PluginContext): Promise<void> {
23
+ if (!context.events) return;
24
+
25
+ context.events.on('request:start', async (data: any) => {
26
+ const request = data.request as Record<string, unknown>;
27
+ const cacheKey = this.generateKey(request);
28
+ const cached = this.cache.get(cacheKey);
29
+
30
+ if (cached && Date.now() < cached.expiresAt) {
31
+ data.cachedResponse = cached.data;
32
+ } else if (data.requestId) {
33
+ this.pendingRequests.set(data.requestId as string, cacheKey);
34
+ }
35
+ });
36
+
37
+ context.events.on('request:end', async (data: any) => {
38
+ if (data.requestId && this.pendingRequests.has(data.requestId as string)) {
39
+ const cacheKey = this.pendingRequests.get(data.requestId as string)!;
40
+ this.cache.set(cacheKey, {
41
+ data: data.response,
42
+ expiresAt: Date.now() + this.ttlMs
43
+ });
44
+ this.pendingRequests.delete(data.requestId as string);
45
+ }
46
+ });
47
+ }
48
+
49
+ private generateKey(req: Record<string, unknown>): string {
50
+ const inputStr = Array.isArray(req?.messages) ? JSON.stringify(req.messages) : (req?.prompt as string || '');
51
+ // using base64 for simplest environment agnostic hashing
52
+ return Buffer.from(inputStr).toString('base64');
53
+ }
54
+ }
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './base-plugin.js';
2
+ export * from './logging-plugin.js';
3
+ export * from './rate-limit-plugin.js';
4
+ export * from './cache-plugin.js';
5
+ export * from './analytics-plugin.js';
@@ -0,0 +1,51 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+
4
+ export interface LoggingPluginConfig {
5
+ level?: 'debug' | 'info' | 'warn' | 'error';
6
+ }
7
+
8
+ export class LoggingPlugin extends BasePlugin {
9
+ private level: string;
10
+
11
+ constructor(config: LoggingPluginConfig = {}) {
12
+ super({
13
+ name: 'logging',
14
+ version: '1.0.0',
15
+ description: 'Logs agent events and interactions',
16
+ });
17
+ this.level = config.level || 'info';
18
+ }
19
+
20
+ public async install(context: PluginContext): Promise<void> {
21
+ if (!context.events) {
22
+ return;
23
+ }
24
+
25
+ context.events.on('request:start', (data: any) => {
26
+ this.log('Request started', data);
27
+ });
28
+
29
+ context.events.on('request:end', (data: any) => {
30
+ this.log('Request ended', data);
31
+ });
32
+
33
+ context.events.on('tool:start', (data: any) => {
34
+ this.log('Tool execution started', data);
35
+ });
36
+
37
+ context.events.on('tool:end', (data: any) => {
38
+ this.log('Tool execution ended', data);
39
+ });
40
+
41
+ context.events.on('error', (error: unknown) => {
42
+ console.error(`[Plugin: logging] ERROR:`, error);
43
+ });
44
+ }
45
+
46
+ private log(message: string, data?: unknown): void {
47
+ if (this.level === 'debug' || this.level === 'info') {
48
+ console.log(`[Plugin: logging] ${message}`, data ? data : '');
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,46 @@
1
+ import { BasePlugin } from './base-plugin.js';
2
+ import type { PluginContext } from '@astrive-ai/types';
3
+
4
+ export interface RateLimitPluginConfig {
5
+ maxRequests?: number;
6
+ windowMs?: number;
7
+ }
8
+
9
+ export class RateLimitPlugin extends BasePlugin {
10
+ private maxRequests: number;
11
+ private windowMs: number;
12
+ private requestCounts: Map<string, { count: number; resetTime: number }> = new Map();
13
+
14
+ constructor(config: RateLimitPluginConfig = {}) {
15
+ super({
16
+ name: 'rate-limit',
17
+ version: '1.0.0',
18
+ description: 'Provides rate limiting for agent requests',
19
+ });
20
+ this.maxRequests = config.maxRequests || 10;
21
+ this.windowMs = config.windowMs || 60000;
22
+ }
23
+
24
+ public async install(context: PluginContext): Promise<void> {
25
+ if (!context.events) return;
26
+
27
+ context.events.on('request:start', async (data: any) => {
28
+ const request = (data.request || {}) as Record<string, unknown>;
29
+ const key = (request.userId as string) || 'default';
30
+ const now = Date.now();
31
+ const record = this.requestCounts.get(key) || { count: 0, resetTime: now + this.windowMs };
32
+
33
+ if (now > record.resetTime) {
34
+ record.count = 0;
35
+ record.resetTime = now + this.windowMs;
36
+ }
37
+
38
+ if (record.count >= this.maxRequests) {
39
+ throw new Error(`Rate limit exceeded for user ${key}. Max ${this.maxRequests} requests per ${this.windowMs}ms.`);
40
+ }
41
+
42
+ record.count++;
43
+ this.requestCounts.set(key, record);
44
+ });
45
+ }
46
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src"
6
+ },
7
+ "include": ["src/**/*"]
8
+ }