@mallocbaal/agent-framework 1.0.0

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 (50) hide show
  1. package/README.md +137 -0
  2. package/dist/app/app.d.ts +33 -0
  3. package/dist/app/app.d.ts.map +1 -0
  4. package/dist/app/app.js +143 -0
  5. package/dist/app/app.js.map +1 -0
  6. package/dist/communicator/client.d.ts +36 -0
  7. package/dist/communicator/client.d.ts.map +1 -0
  8. package/dist/communicator/client.js +129 -0
  9. package/dist/communicator/client.js.map +1 -0
  10. package/dist/communicator/models.d.ts +323 -0
  11. package/dist/communicator/models.d.ts.map +1 -0
  12. package/dist/communicator/models.js +6 -0
  13. package/dist/communicator/models.js.map +1 -0
  14. package/dist/config/config.d.ts +37 -0
  15. package/dist/config/config.d.ts.map +1 -0
  16. package/dist/config/config.js +81 -0
  17. package/dist/config/config.js.map +1 -0
  18. package/dist/dispatcher/dispatcher.d.ts +14 -0
  19. package/dist/dispatcher/dispatcher.d.ts.map +1 -0
  20. package/dist/dispatcher/dispatcher.js +28 -0
  21. package/dist/dispatcher/dispatcher.js.map +1 -0
  22. package/dist/events/types.d.ts +25 -0
  23. package/dist/events/types.d.ts.map +1 -0
  24. package/dist/events/types.js +4 -0
  25. package/dist/events/types.js.map +1 -0
  26. package/dist/index.d.ts +13 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +17 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/pipeline/pipeline.d.ts +36 -0
  31. package/dist/pipeline/pipeline.d.ts.map +1 -0
  32. package/dist/pipeline/pipeline.js +74 -0
  33. package/dist/pipeline/pipeline.js.map +1 -0
  34. package/dist/rabbitmq/consumer.d.ts +23 -0
  35. package/dist/rabbitmq/consumer.d.ts.map +1 -0
  36. package/dist/rabbitmq/consumer.js +184 -0
  37. package/dist/rabbitmq/consumer.js.map +1 -0
  38. package/dist/saga/events.d.ts +68 -0
  39. package/dist/saga/events.d.ts.map +1 -0
  40. package/dist/saga/events.js +7 -0
  41. package/dist/saga/events.js.map +1 -0
  42. package/dist/saga/logger.d.ts +9 -0
  43. package/dist/saga/logger.d.ts.map +1 -0
  44. package/dist/saga/logger.js +2 -0
  45. package/dist/saga/logger.js.map +1 -0
  46. package/dist/saga/minio.d.ts +19 -0
  47. package/dist/saga/minio.d.ts.map +1 -0
  48. package/dist/saga/minio.js +140 -0
  49. package/dist/saga/minio.js.map +1 -0
  50. package/package.json +43 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAG7F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnF,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACxF;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1G;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACvG,MAAM,MAAM,kBAAkB,GAAG,CAC/B,GAAG,EAAE,WAAW,GAAG,SAAS,EAC5B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,KACrB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,cAAc,CAAC;IAC3B,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC5C;AAED,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAFX,YAAY,EAAE,kBAAkB,EAChC,IAAI,EAAE,YAAY,EAClB,WAAW,GAAE,MAAgB;YAGlC,kBAAkB;IAe1B,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtE,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhF,6FAA6F;IACvF,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;CAIxE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAW3E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,mBAAmB,GAAG,kBAAkB,CAavF"}
@@ -0,0 +1,74 @@
1
+ import { CliFlowInit, CliFlowContinue } from '../events/types.js';
2
+ export class Pipeline {
3
+ communicator;
4
+ step;
5
+ sourceLabel;
6
+ constructor(communicator, step, sourceLabel = 'agent') {
7
+ this.communicator = communicator;
8
+ this.step = step;
9
+ this.sourceLabel = sourceLabel;
10
+ }
11
+ async sendToCommunicator(event, contents) {
12
+ if (!event.chatId)
13
+ throw new Error('chatId not found in event');
14
+ await this.communicator.addAgentMessage({
15
+ chatId: event.chatId,
16
+ contents,
17
+ metadata: {
18
+ participantId: event.participantId,
19
+ eventType: event.eventType,
20
+ source: this.sourceLabel,
21
+ },
22
+ source: this.sourceLabel,
23
+ eventType: event.eventType,
24
+ });
25
+ }
26
+ async executeInit(ctx, event) {
27
+ const result = await this.step.processing(ctx, event);
28
+ if (result?.contents?.length)
29
+ await this.sendToCommunicator(event, result.contents);
30
+ if (this.step.postProcessing)
31
+ await this.step.postProcessing(ctx, event, result ?? { contents: [] });
32
+ }
33
+ async executeContinue(ctx, event) {
34
+ const result = await this.step.processing(ctx, event);
35
+ if (result?.contents?.length)
36
+ await this.sendToCommunicator(event, result.contents);
37
+ if (this.step.postProcessing)
38
+ await this.step.postProcessing(ctx, event, result ?? { contents: [] });
39
+ }
40
+ /** Implement EventHandler so Pipeline can be passed to App.create({ handler: pipeline }). */
41
+ async handle(ctx, event) {
42
+ if (event.eventType === CliFlowInit)
43
+ await this.executeInit(ctx, event);
44
+ else if (event.eventType === CliFlowContinue)
45
+ await this.executeContinue(ctx, event);
46
+ }
47
+ }
48
+ export function createProcessingFunc(stage) {
49
+ return async (ctx, event) => {
50
+ switch (event.eventType) {
51
+ case 'CLI_FLOW_INIT':
52
+ return stage.processInit(ctx, event);
53
+ case 'CLI_FLOW_CONTINUE':
54
+ return stage.processContinue(ctx, event);
55
+ default:
56
+ throw new Error(`Unsupported event type: ${event.eventType}`);
57
+ }
58
+ };
59
+ }
60
+ export function createPostProcessingFunc(stage) {
61
+ return async (ctx, event, result) => {
62
+ switch (event.eventType) {
63
+ case 'CLI_FLOW_INIT':
64
+ await stage.postProcessInit(ctx, event, result);
65
+ break;
66
+ case 'CLI_FLOW_CONTINUE':
67
+ await stage.postProcessContinue(ctx, event, result);
68
+ break;
69
+ default:
70
+ throw new Error(`Unsupported event type: ${event.eventType}`);
71
+ }
72
+ };
73
+ }
74
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Event } from '../events/types.js';
2
+ export type Handler = (ctx: AbortSignal | undefined, event: Event) => Promise<void>;
3
+ export declare class Consumer {
4
+ private readonly url;
5
+ private readonly exchange;
6
+ private readonly queue;
7
+ private readonly bindings;
8
+ private readonly prefetch;
9
+ private readonly maxRetries;
10
+ private conn;
11
+ private ch;
12
+ constructor(url: string, exchange: string, queue: string, bindings: string[], prefetch: number, maxRetries: number);
13
+ ping(): Promise<void>;
14
+ close(): void;
15
+ private ensureConnection;
16
+ private republish;
17
+ /**
18
+ * Consume messages and call handler. Reconnects on failure. Runs until signal aborted.
19
+ */
20
+ consume(signal: AbortSignal | undefined, handler: Handler): Promise<void>;
21
+ }
22
+ export declare function createConsumer(url: string, exchange: string, queue: string, bindings: string[], prefetch: number, maxRetries: number): Consumer;
23
+ //# sourceMappingURL=consumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/rabbitmq/consumer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAkBpF,qBAAa,QAAQ;IAKjB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAT7B,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,EAAE,CAAwB;gBAGf,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM;IAM/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,KAAK,IAAI,IAAI;YAWC,gBAAgB;IAyB9B,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAmGhF;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,QAAQ,CAEV"}
@@ -0,0 +1,184 @@
1
+ import amqp from 'amqplib';
2
+ import { CliFlowContinue } from '../events/types.js';
3
+ const RETRY_HEADER = 'x-retry-count';
4
+ function getRetryCount(headers) {
5
+ if (!headers || !(RETRY_HEADER in headers))
6
+ return 0;
7
+ const v = headers[RETRY_HEADER];
8
+ if (typeof v === 'number')
9
+ return v;
10
+ if (typeof v === 'object' && v !== null && 'value' in v)
11
+ return Number(v.value) ?? 0;
12
+ return Number(v) ?? 0;
13
+ }
14
+ function setRetryHeaders(headers, count) {
15
+ const h = headers ? { ...headers } : {};
16
+ h[RETRY_HEADER] = count;
17
+ return h;
18
+ }
19
+ export class Consumer {
20
+ url;
21
+ exchange;
22
+ queue;
23
+ bindings;
24
+ prefetch;
25
+ maxRetries;
26
+ conn = null;
27
+ ch = null;
28
+ constructor(url, exchange, queue, bindings, prefetch, maxRetries) {
29
+ this.url = url;
30
+ this.exchange = exchange;
31
+ this.queue = queue;
32
+ this.bindings = bindings;
33
+ this.prefetch = prefetch;
34
+ this.maxRetries = maxRetries;
35
+ if (this.prefetch <= 0)
36
+ this.prefetch = 1;
37
+ if (this.maxRetries < 0)
38
+ this.maxRetries = 0;
39
+ }
40
+ async ping() {
41
+ await this.ensureConnection();
42
+ }
43
+ close() {
44
+ if (this.ch) {
45
+ this.ch.close().catch(() => { });
46
+ this.ch = null;
47
+ }
48
+ if (this.conn) {
49
+ this.conn.close().catch(() => { });
50
+ this.conn = null;
51
+ }
52
+ }
53
+ async ensureConnection() {
54
+ try {
55
+ if (this.conn && this.ch) {
56
+ await this.ch.checkQueue(this.queue);
57
+ return;
58
+ }
59
+ }
60
+ catch {
61
+ this.ch = null;
62
+ this.conn = null;
63
+ }
64
+ const conn = await amqp.connect(this.url, { connectionName: 'agent-framework-ts' });
65
+ const ch = await conn.createChannel();
66
+ await ch.assertExchange(this.exchange, 'topic', { durable: true });
67
+ await ch.assertQueue(this.queue, { durable: true });
68
+ for (const rk of this.bindings) {
69
+ if (rk)
70
+ await ch.bindQueue(this.queue, this.exchange, rk);
71
+ }
72
+ await ch.prefetch(this.prefetch);
73
+ this.conn = conn;
74
+ this.ch = ch;
75
+ }
76
+ republish(msg, retry) {
77
+ if (!this.ch)
78
+ return Promise.reject(new Error('channel is closed'));
79
+ const headers = setRetryHeaders(msg.properties.headers, retry);
80
+ this.ch.publish(this.exchange, msg.fields.routingKey, msg.content, {
81
+ contentType: msg.properties.contentType,
82
+ deliveryMode: 2,
83
+ headers: headers,
84
+ });
85
+ return Promise.resolve();
86
+ }
87
+ /**
88
+ * Consume messages and call handler. Reconnects on failure. Runs until signal aborted.
89
+ */
90
+ async consume(signal, handler) {
91
+ console.log(`[RABBITMQ] Starting consumer: exchange=${this.exchange}, queue=${this.queue}, bindings=${this.bindings}, prefetch=${this.prefetch}, maxRetries=${this.maxRetries}`);
92
+ if (!this.url)
93
+ throw new Error('RABBITMQ_URL is required');
94
+ if (!this.exchange)
95
+ throw new Error('RABBITMQ_EXCHANGE is required');
96
+ if (!this.queue)
97
+ throw new Error('RABBITMQ_QUEUE is required');
98
+ if (this.bindings.length === 0)
99
+ throw new Error('RABBITMQ_BINDINGS is required');
100
+ let backoff = 1000;
101
+ const maxBackoff = 30_000;
102
+ while (!signal?.aborted) {
103
+ try {
104
+ await this.ensureConnection();
105
+ backoff = 1000;
106
+ }
107
+ catch (err) {
108
+ console.error(`[RABBITMQ] Connection failed, retrying in ${backoff}ms:`, err);
109
+ await new Promise((r) => setTimeout(r, backoff + Math.random() * (backoff / 2)));
110
+ if (backoff < maxBackoff)
111
+ backoff *= 2;
112
+ continue;
113
+ }
114
+ const ch = this.ch;
115
+ const queue = this.queue;
116
+ const consumer = await ch.consume(queue, async (msg) => {
117
+ if (!msg)
118
+ return;
119
+ const start = Date.now();
120
+ let ev;
121
+ try {
122
+ ev = JSON.parse(msg.content.toString());
123
+ }
124
+ catch (parseErr) {
125
+ console.error('[RABBITMQ] Invalid JSON:', parseErr);
126
+ ch.nack(msg, false, false);
127
+ return;
128
+ }
129
+ if (!ev.eventId || !ev.flowId || !ev.chatId || !ev.participantId || !ev.eventType) {
130
+ console.error(`[RABBITMQ] Invalid event (missing required fields): eventId=${ev.eventId} flowId=${ev.flowId} chatId=${ev.chatId} participantId=${ev.participantId} eventType=${ev.eventType}`);
131
+ ch.nack(msg, false, false);
132
+ return;
133
+ }
134
+ if (ev.eventType === CliFlowContinue) {
135
+ const isAction = ev.data && 'actionType' in ev.data;
136
+ if (!isAction && (ev.message == null || ev.message === '')) {
137
+ console.error(`[RABBITMQ] CLI_FLOW_CONTINUE missing message: eventId=${ev.eventId}`);
138
+ ch.nack(msg, false, false);
139
+ return;
140
+ }
141
+ }
142
+ const ctx = signal ? { get aborted() { return signal.aborted; } } : undefined;
143
+ try {
144
+ await handler(ctx, ev);
145
+ const duration = Date.now() - start;
146
+ console.log(`[RABBITMQ] Handler completed in ${duration}ms: eventId=${ev.eventId}, success=true`);
147
+ ch.ack(msg);
148
+ }
149
+ catch (handlerErr) {
150
+ console.error(`[RABBITMQ] Handler failed: eventId=${ev.eventId}, error=`, handlerErr);
151
+ const rc = getRetryCount(msg.properties.headers);
152
+ if (rc >= this.maxRetries) {
153
+ console.error(`[RABBITMQ] Max retries exceeded (${rc}), dropping message: eventId=${ev.eventId}`);
154
+ ch.ack(msg);
155
+ return;
156
+ }
157
+ try {
158
+ await this.republish(msg, rc + 1);
159
+ ch.ack(msg);
160
+ }
161
+ catch (repErr) {
162
+ console.error('[RABBITMQ] Republish failed, nack requeue:', repErr);
163
+ ch.nack(msg, false, true);
164
+ }
165
+ }
166
+ }, { noAck: false });
167
+ console.log(`[RABBITMQ] Consumer registered: queue=${queue}`);
168
+ await new Promise((resolve, reject) => {
169
+ const onAbort = () => {
170
+ ch.cancel(consumer.consumerTag).then(() => resolve()).catch(reject);
171
+ };
172
+ if (signal?.aborted) {
173
+ onAbort();
174
+ return;
175
+ }
176
+ signal?.addEventListener?.('abort', onAbort, { once: true });
177
+ });
178
+ }
179
+ }
180
+ }
181
+ export function createConsumer(url, exchange, queue, bindings, prefetch, maxRetries) {
182
+ return new Consumer(url, exchange, queue, bindings, prefetch, maxRetries);
183
+ }
184
+ //# sourceMappingURL=consumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer.js","sourceRoot":"","sources":["../../src/rabbitmq/consumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export interface BaseEvent {
2
+ eventType: string;
3
+ timestamp: number;
4
+ }
5
+ export interface PhaseStartedEvent extends BaseEvent {
6
+ eventType: 'PHASE_STARTED';
7
+ phase: string;
8
+ }
9
+ export interface PhaseCompletedEvent extends BaseEvent {
10
+ eventType: 'PHASE_COMPLETED';
11
+ phase: string;
12
+ }
13
+ export interface LLMRequestEvent extends BaseEvent {
14
+ eventType: 'LLM_REQUEST';
15
+ phase?: string;
16
+ requestId: string;
17
+ prompt: string;
18
+ variables?: Record<string, string>;
19
+ temperature?: number;
20
+ maxTokens?: number;
21
+ tone?: string;
22
+ }
23
+ export interface LLMResponseEvent extends BaseEvent {
24
+ eventType: 'LLM_RESPONSE';
25
+ phase?: string;
26
+ requestId: string;
27
+ content: string;
28
+ tokensUsed?: number;
29
+ responseTime?: number;
30
+ model?: string;
31
+ }
32
+ export interface MessageAddedEvent extends BaseEvent {
33
+ eventType: 'MESSAGE_ADDED';
34
+ role: string;
35
+ content: string;
36
+ }
37
+ export interface CollectedDataEvent extends BaseEvent {
38
+ eventType: 'COLLECTED_DATA';
39
+ phase: string;
40
+ field: string;
41
+ value: unknown;
42
+ source: string;
43
+ confidence: number;
44
+ previousValue?: unknown;
45
+ }
46
+ export interface MesaAnalysisEvent extends BaseEvent {
47
+ eventType: 'MESA_ANALYSIS';
48
+ phase: string;
49
+ sessionId: string;
50
+ goal: string;
51
+ issue: string;
52
+ msCore: string;
53
+ psychotype: string;
54
+ confidence: number;
55
+ consistencyScore: number;
56
+ success: boolean;
57
+ }
58
+ export interface AximaMilestoneEvent extends BaseEvent {
59
+ eventType: 'AXIMA_MILESTONE';
60
+ phase: string;
61
+ mapId: string;
62
+ milestoneTitle: string;
63
+ milestoneDescription: string;
64
+ }
65
+ export type SagaEventUnion = PhaseStartedEvent | PhaseCompletedEvent | LLMRequestEvent | LLMResponseEvent | MessageAddedEvent | CollectedDataEvent | MesaAnalysisEvent | AximaMilestoneEvent;
66
+ export declare function newTimestamp(): number;
67
+ export declare function newBaseEvent(eventType: string): BaseEvent;
68
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/saga/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,SAAS,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,CAAC;AAExB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAEzD"}
@@ -0,0 +1,7 @@
1
+ export function newTimestamp() {
2
+ return Math.floor(Date.now() / 1000);
3
+ }
4
+ export function newBaseEvent(eventType) {
5
+ return { eventType, timestamp: newTimestamp() };
6
+ }
7
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/saga/events.ts"],"names":[],"mappings":"AAmFA,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC;AAClD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SagaEventUnion } from './events.js';
2
+ export interface SagaLogger {
3
+ logEvent(accountId: string, chatId: string, event: SagaEventUnion): Promise<void>;
4
+ getEvents(accountId: string, chatId: string, eventTypes?: string[]): Promise<SagaEventUnion[]>;
5
+ getLastEvent(accountId: string, chatId: string, eventType: string): Promise<SagaEventUnion | null>;
6
+ getPhaseEvents(accountId: string, chatId: string, phase: string): Promise<SagaEventUnion[]>;
7
+ getCollectedData(accountId: string, chatId: string): Promise<Record<string, unknown>>;
8
+ }
9
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/saga/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/F,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5F,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/saga/logger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import * as Minio from 'minio';
2
+ import type { SagaLogger } from './logger.js';
3
+ import type { SagaEventUnion } from './events.js';
4
+ export declare class MinIOSagaLogger implements SagaLogger {
5
+ private readonly bucketName;
6
+ private client;
7
+ constructor(client: Minio.Client | null, bucketName: string);
8
+ private objectName;
9
+ private getExistingContent;
10
+ private uploadContent;
11
+ logEvent(accountId: string, chatId: string, event: SagaEventUnion): Promise<void>;
12
+ getEvents(accountId: string, chatId: string, eventTypes?: string[]): Promise<SagaEventUnion[]>;
13
+ getLastEvent(accountId: string, chatId: string, eventType: string): Promise<SagaEventUnion | null>;
14
+ getPhaseEvents(accountId: string, chatId: string, phase: string): Promise<SagaEventUnion[]>;
15
+ getCollectedData(accountId: string, chatId: string): Promise<Record<string, unknown>>;
16
+ }
17
+ export declare function createMinIOSagaLogger(endpoint: string, accessKey: string, secretKey: string, bucket: string, useSSL: boolean): MinIOSagaLogger;
18
+ export declare function createNoopSagaLogger(): SagaLogger;
19
+ //# sourceMappingURL=minio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio.d.ts","sourceRoot":"","sources":["../../src/saga/minio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,aAAa,CAAC;AA4BtE,qBAAa,eAAgB,YAAW,UAAU;IAGP,OAAO,CAAC,QAAQ,CAAC,UAAU;IAFpE,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,EAAmB,UAAU,EAAE,MAAM;IAI5E,OAAO,CAAC,UAAU;YAIJ,kBAAkB;YAclB,aAAa;IAOrB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAM,EAAO,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC;IAiBtB,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAK3B,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAK3F,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAQ5F;AAUD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,GACd,eAAe,CAUjB;AAED,wBAAgB,oBAAoB,IAAI,UAAU,CAgBjD"}
@@ -0,0 +1,140 @@
1
+ import * as Minio from 'minio';
2
+ const OBJECT_PREFIX = (accountId, chatId) => `${accountId}/${chatId}/saga.log`;
3
+ function getEventType(line) {
4
+ try {
5
+ const o = JSON.parse(line);
6
+ return o.eventType ?? null;
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ function parseEvent(line) {
13
+ const eventType = getEventType(line);
14
+ if (!eventType)
15
+ return null;
16
+ try {
17
+ return JSON.parse(line);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ function hasPhase(e, phase) {
24
+ const p = e.phase;
25
+ return p === phase;
26
+ }
27
+ export class MinIOSagaLogger {
28
+ bucketName;
29
+ client;
30
+ constructor(client, bucketName) {
31
+ this.bucketName = bucketName;
32
+ this.client = client;
33
+ }
34
+ objectName(accountId, chatId) {
35
+ return OBJECT_PREFIX(accountId, chatId);
36
+ }
37
+ async getExistingContent(objectName) {
38
+ if (!this.client)
39
+ return Buffer.from('');
40
+ try {
41
+ const stream = await this.client.getObject(this.bucketName, objectName);
42
+ const chunks = [];
43
+ for await (const chunk of stream)
44
+ chunks.push(chunk);
45
+ return Buffer.concat(chunks);
46
+ }
47
+ catch (err) {
48
+ const code = err.code;
49
+ if (code === 'NoSuchKey')
50
+ return Buffer.from('');
51
+ throw err;
52
+ }
53
+ }
54
+ async uploadContent(objectName, content) {
55
+ if (!this.client)
56
+ return;
57
+ await this.client.putObject(this.bucketName, objectName, content, content.length, {
58
+ 'Content-Type': 'application/x-ndjson',
59
+ });
60
+ }
61
+ async logEvent(accountId, chatId, event) {
62
+ const line = JSON.stringify(event) + '\n';
63
+ const objectName = this.objectName(accountId, chatId);
64
+ const existing = await this.getExistingContent(objectName);
65
+ const newContent = Buffer.concat([existing, Buffer.from(line, 'utf8')]);
66
+ await this.uploadContent(objectName, newContent);
67
+ }
68
+ async getEvents(accountId, chatId, eventTypes = []) {
69
+ const objectName = this.objectName(accountId, chatId);
70
+ const content = await this.getExistingContent(objectName);
71
+ if (content.length === 0)
72
+ return [];
73
+ const typesSet = new Set(eventTypes);
74
+ const result = [];
75
+ for (const line of content.toString('utf8').split('\n')) {
76
+ const trimmed = line.trim();
77
+ if (!trimmed)
78
+ continue;
79
+ const event = parseEvent(trimmed);
80
+ if (!event)
81
+ continue;
82
+ if (eventTypes.length === 0 || typesSet.has(event.eventType))
83
+ result.push(event);
84
+ }
85
+ return result;
86
+ }
87
+ async getLastEvent(accountId, chatId, eventType) {
88
+ const events = await this.getEvents(accountId, chatId, [eventType]);
89
+ return events.length > 0 ? events[events.length - 1] : null;
90
+ }
91
+ async getPhaseEvents(accountId, chatId, phase) {
92
+ const all = await this.getEvents(accountId, chatId, []);
93
+ return all.filter((e) => hasPhase(e, phase));
94
+ }
95
+ async getCollectedData(accountId, chatId) {
96
+ const events = await this.getEvents(accountId, chatId, ['COLLECTED_DATA']);
97
+ const data = {};
98
+ for (const e of events) {
99
+ if (e.eventType === 'COLLECTED_DATA')
100
+ data[e.field] = e.value;
101
+ }
102
+ return data;
103
+ }
104
+ }
105
+ function parseEndpoint(endpoint, useSSL) {
106
+ if (endpoint.includes(':')) {
107
+ const [host, portStr] = endpoint.split(':');
108
+ return { host: host, port: parseInt(portStr, 10) || (useSSL ? 443 : 9000) };
109
+ }
110
+ return { host: endpoint, port: useSSL ? 443 : 80 };
111
+ }
112
+ export function createMinIOSagaLogger(endpoint, accessKey, secretKey, bucket, useSSL) {
113
+ const { host, port } = parseEndpoint(endpoint, useSSL);
114
+ const client = new Minio.Client({
115
+ endPoint: host,
116
+ port,
117
+ useSSL,
118
+ accessKey,
119
+ secretKey,
120
+ });
121
+ return new MinIOSagaLogger(client, bucket);
122
+ }
123
+ export function createNoopSagaLogger() {
124
+ return {
125
+ async logEvent() { },
126
+ async getEvents() {
127
+ return [];
128
+ },
129
+ async getLastEvent() {
130
+ return null;
131
+ },
132
+ async getPhaseEvents() {
133
+ return [];
134
+ },
135
+ async getCollectedData() {
136
+ return {};
137
+ },
138
+ };
139
+ }
140
+ //# sourceMappingURL=minio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minio.js","sourceRoot":"","sources":["../../src/saga/minio.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@mallocbaal/agent-framework",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript event-driven agent framework with RabbitMQ and saga logging (analog of Go agent-framework)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "keywords": [
16
+ "agent",
17
+ "rabbitmq",
18
+ "event-driven",
19
+ "saga",
20
+ "minio"
21
+ ],
22
+ "license": "UNLICENSED",
23
+ "engines": {
24
+ "node": ">=20"
25
+ },
26
+ "dependencies": {
27
+ "amqplib": "^0.10.4",
28
+ "minio": "^8.0.2"
29
+ },
30
+ "devDependencies": {
31
+ "@types/amqplib": "^0.10.8",
32
+ "@types/node": "^22.10.1",
33
+ "typescript": "^5.7.2"
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "README.md"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsc",
41
+ "clean": "rm -rf dist"
42
+ }
43
+ }