@aaep/typescript-producer 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,124 @@
1
+ /**
2
+ * StreamCoalescer — TypeScript port of the Python StreamCoalescer.
3
+ *
4
+ * Buffers streaming tokens and emits agent.output.streaming events at
5
+ * coalesce boundaries (default: sentence boundaries). The boundary
6
+ * detection regexes match the Python implementation exactly.
7
+ *
8
+ * Usage:
9
+ * const coalescer = new StreamCoalescer({
10
+ * emitter,
11
+ * sessionId: "sess_x",
12
+ * outputId: "out_y",
13
+ * coalesceAt: "sentence",
14
+ * });
15
+ * coalescer.addToken("Hello ");
16
+ * coalescer.addToken("world. "); // sentence boundary -> emit
17
+ * coalescer.addToken("Goodbye.");
18
+ * coalescer.finish(); // final emit with complete=true
19
+ */
20
+ export class StreamCoalescer {
21
+ emitter;
22
+ sessionId;
23
+ outputId;
24
+ coalesceAt;
25
+ language;
26
+ buffer = "";
27
+ position = 0;
28
+ finished = false;
29
+ constructor(options) {
30
+ this.emitter = options.emitter;
31
+ this.sessionId = options.sessionId;
32
+ this.outputId = options.outputId;
33
+ this.coalesceAt = options.coalesceAt ?? "sentence";
34
+ this.language = options.language;
35
+ }
36
+ /**
37
+ * Add a token to the buffer. May emit one or more events if coalesce
38
+ * boundaries are crossed by the addition.
39
+ */
40
+ addToken(token) {
41
+ if (this.finished) {
42
+ throw new Error("Cannot add tokens to a finished coalescer");
43
+ }
44
+ this.buffer += token;
45
+ this.flushAtBoundary();
46
+ }
47
+ /**
48
+ * Flush any remaining buffer and emit the final completion event
49
+ * (complete=true). Idempotent; safe to call multiple times.
50
+ */
51
+ finish() {
52
+ if (this.finished)
53
+ return;
54
+ this.emitChunk(this.buffer, /* complete = */ true);
55
+ this.buffer = "";
56
+ this.finished = true;
57
+ }
58
+ /** Inspect the current buffered text (for tests). */
59
+ get bufferedText() {
60
+ return this.buffer;
61
+ }
62
+ /** Whether finish() has been called. */
63
+ get isFinished() {
64
+ return this.finished;
65
+ }
66
+ // === Internals ===
67
+ flushAtBoundary() {
68
+ // 'completion' coalescing means "flush only on finish()"
69
+ if (this.coalesceAt === "completion")
70
+ return;
71
+ if (this.coalesceAt === "none") {
72
+ // Emit every token as a separate event
73
+ const text = this.buffer;
74
+ this.buffer = "";
75
+ this.emitChunk(text, /* complete = */ false);
76
+ return;
77
+ }
78
+ const boundaries = this.findBoundaries();
79
+ for (const boundaryEnd of boundaries) {
80
+ const chunk = this.buffer.slice(0, boundaryEnd);
81
+ this.buffer = this.buffer.slice(boundaryEnd);
82
+ this.emitChunk(chunk, /* complete = */ false);
83
+ }
84
+ }
85
+ findBoundaries() {
86
+ const boundaries = [];
87
+ let regex;
88
+ if (this.coalesceAt === "word") {
89
+ // End of word: non-space followed by whitespace
90
+ regex = /\S+\s+/g;
91
+ }
92
+ else if (this.coalesceAt === "sentence") {
93
+ // End of sentence: ., !, or ? followed by whitespace or end
94
+ regex = /[.!?](\s|$)/g;
95
+ }
96
+ else if (this.coalesceAt === "paragraph") {
97
+ // Paragraph break: double newline
98
+ regex = /\n\n/g;
99
+ }
100
+ else {
101
+ return [];
102
+ }
103
+ let match;
104
+ while ((match = regex.exec(this.buffer)) !== null) {
105
+ boundaries.push(match.index + match[0].length);
106
+ }
107
+ return boundaries;
108
+ }
109
+ emitChunk(chunk, complete) {
110
+ if (!chunk && !complete)
111
+ return;
112
+ this.emitter.outputStreaming({
113
+ sessionId: this.sessionId,
114
+ outputId: this.outputId,
115
+ chunk,
116
+ position: this.position,
117
+ complete,
118
+ coalesceHint: complete ? "completion" : this.coalesceAt,
119
+ ...(this.language && { language: this.language }),
120
+ });
121
+ this.position += chunk.length;
122
+ }
123
+ }
124
+ //# sourceMappingURL=coalescer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coalescer.js","sourceRoot":"","sources":["../src/coalescer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * AAEPEmitter — TypeScript port of the python-minimal emitter.
3
+ *
4
+ * Same architecture as Python: one method per AAEP event type, transport
5
+ * via a configurable sendEvent callback, Promise-based confirmation flow.
6
+ * The safety machinery (irreversible+high MUST default reject, secret
7
+ * redaction, critical urgency on errored events) matches the Python emitter
8
+ * one-for-one.
9
+ *
10
+ * This module has zero runtime dependencies beyond Node.js stdlib. The
11
+ * `crypto` module is used for ID generation; everything else is built-in
12
+ * language features.
13
+ */
14
+ import type { AAEPEvent, Decision, ErrorCategory, Producer, RiskLevel, ToolStatus } from "./types.js";
15
+ export declare function makeId(prefix: string): string;
16
+ export declare function nowIso(): string;
17
+ export declare function classifyErrorCategory(error: unknown): ErrorCategory;
18
+ export declare function classifyRisk(toolName: string): {
19
+ riskLevel: RiskLevel;
20
+ irreversible: boolean;
21
+ };
22
+ export declare function safeArgsSummary(args: Record<string, unknown>, maxChars?: number): string;
23
+ export interface AAEPEmitterOptions {
24
+ sendEvent: (event: AAEPEvent) => void | Promise<void>;
25
+ agentId?: string;
26
+ agentVersion?: string;
27
+ agentName?: string;
28
+ model?: string;
29
+ }
30
+ export declare class AAEPEmitter {
31
+ private readonly sendEvent;
32
+ private readonly producerInfo;
33
+ private readonly sequenceNumbers;
34
+ private readonly replyResolvers;
35
+ constructor(options: AAEPEmitterOptions);
36
+ /** Read-only view of the producer info (for tests). */
37
+ get producer(): Readonly<Producer>;
38
+ startSession(opts: {
39
+ summaryNormal: string;
40
+ requestText?: string;
41
+ requestedBy?: string;
42
+ expectedDurationMs?: number;
43
+ toolsAvailable?: string[];
44
+ }): string;
45
+ completeSession(opts: {
46
+ sessionId: string;
47
+ summaryNormal: string;
48
+ durationMs?: number;
49
+ toolInvocationsCount?: number;
50
+ }): void;
51
+ errorSession(opts: {
52
+ sessionId: string;
53
+ errorCategory: ErrorCategory;
54
+ summaryNormal: string;
55
+ errorMessage?: string;
56
+ recoverable?: boolean;
57
+ remediationHint?: string;
58
+ }): void;
59
+ cancelledSession(opts: {
60
+ sessionId: string;
61
+ cancelledBy?: "user" | "system" | "timeout" | "policy";
62
+ summaryNormal?: string;
63
+ }): void;
64
+ stateChanged(opts: {
65
+ sessionId: string;
66
+ fromState: string;
67
+ toState: string;
68
+ summaryNormal: string;
69
+ }): void;
70
+ toolInvoked(opts: {
71
+ sessionId: string;
72
+ tool: string;
73
+ toolCallId: string;
74
+ argsSummary: string;
75
+ riskLevel?: RiskLevel;
76
+ irreversible?: boolean;
77
+ summaryNormal?: string;
78
+ }): void;
79
+ toolCompleted(opts: {
80
+ sessionId: string;
81
+ tool: string;
82
+ toolCallId: string;
83
+ status: ToolStatus;
84
+ summaryNormal?: string;
85
+ errorMessage?: string;
86
+ }): void;
87
+ outputStreaming(opts: {
88
+ sessionId: string;
89
+ outputId: string;
90
+ chunk: string;
91
+ position: number;
92
+ complete: boolean;
93
+ coalesceHint?: "none" | "word" | "sentence" | "paragraph" | "completion";
94
+ language?: string;
95
+ }): void;
96
+ awaitConfirmation(opts: {
97
+ sessionId: string;
98
+ action: string;
99
+ consequence: string;
100
+ timeoutSeconds?: number;
101
+ defaultDecision?: Decision;
102
+ riskLevel?: RiskLevel;
103
+ irreversible?: boolean;
104
+ summaryNormal?: string;
105
+ }): string;
106
+ submitReply(replyToken: string, decision: string): boolean;
107
+ waitForDecision(replyToken: string): Promise<string>;
108
+ private nextSeq;
109
+ private emit;
110
+ }
111
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,320 @@
1
+ /**
2
+ * AAEPEmitter — TypeScript port of the python-minimal emitter.
3
+ *
4
+ * Same architecture as Python: one method per AAEP event type, transport
5
+ * via a configurable sendEvent callback, Promise-based confirmation flow.
6
+ * The safety machinery (irreversible+high MUST default reject, secret
7
+ * redaction, critical urgency on errored events) matches the Python emitter
8
+ * one-for-one.
9
+ *
10
+ * This module has zero runtime dependencies beyond Node.js stdlib. The
11
+ * `crypto` module is used for ID generation; everything else is built-in
12
+ * language features.
13
+ */
14
+ import { randomBytes } from "node:crypto";
15
+ import { AAEP_CONTEXT_URL, AAEP_VERSION, } from "./types.js";
16
+ // === ID generation ===
17
+ const ID_PREFIX_PATTERN = /^[a-z]+$/;
18
+ export function makeId(prefix) {
19
+ if (!ID_PREFIX_PATTERN.test(prefix)) {
20
+ throw new Error(`ID prefix must be lowercase letters only, got ${JSON.stringify(prefix)}`);
21
+ }
22
+ return `${prefix}_${randomBytes(8).toString("hex")}`;
23
+ }
24
+ // === RFC 3339 timestamp ===
25
+ export function nowIso() {
26
+ const now = new Date();
27
+ const ms = String(now.getUTCMilliseconds()).padStart(3, "0");
28
+ return now.toISOString().replace(/\.\d{3}Z$/, `.${ms}Z`);
29
+ }
30
+ // === Error classification ===
31
+ export function classifyErrorCategory(error) {
32
+ if (!(error instanceof Error)) {
33
+ return "unknown";
34
+ }
35
+ const name = error.name;
36
+ if (name === "TimeoutError" || name === "AbortError")
37
+ return "timeout";
38
+ if (name === "TypeError" || name === "RangeError")
39
+ return "invalid_input";
40
+ if (error.message.toLowerCase().includes("network"))
41
+ return "network";
42
+ if (error.message.toLowerCase().includes("permission"))
43
+ return "authorization";
44
+ return "unknown";
45
+ }
46
+ // === Risk classification ===
47
+ const HIGH_RISK_PATTERNS = [
48
+ "send_email", "transfer_funds", "delete_record", "delete_file",
49
+ "publish_post", "make_payment", "execute_trade", "send_sms",
50
+ ];
51
+ export function classifyRisk(toolName) {
52
+ const lower = toolName.toLowerCase();
53
+ for (const pattern of HIGH_RISK_PATTERNS) {
54
+ if (lower.includes(pattern)) {
55
+ return { riskLevel: "high", irreversible: true };
56
+ }
57
+ }
58
+ return { riskLevel: "low", irreversible: false };
59
+ }
60
+ // === Safe args summary (redacts secrets) ===
61
+ const SECRET_FIELD_PATTERNS = [
62
+ "password", "secret", "token", "key", "auth", "credential",
63
+ ];
64
+ export function safeArgsSummary(args, maxChars = 1000) {
65
+ const parts = [];
66
+ for (const [k, v] of Object.entries(args)) {
67
+ const lower = k.toLowerCase();
68
+ const isSecret = SECRET_FIELD_PATTERNS.some((p) => lower.includes(p));
69
+ if (isSecret) {
70
+ parts.push(`${k}=[redacted]`);
71
+ }
72
+ else {
73
+ const vStr = String(v);
74
+ parts.push(`${k}=${vStr.length > 80 ? vStr.slice(0, 77) + "..." : vStr}`);
75
+ }
76
+ }
77
+ return parts.join(", ").slice(0, maxChars);
78
+ }
79
+ // === The emitter ===
80
+ export class AAEPEmitter {
81
+ sendEvent;
82
+ producerInfo;
83
+ sequenceNumbers = new Map();
84
+ replyResolvers = new Map();
85
+ constructor(options) {
86
+ this.sendEvent = options.sendEvent;
87
+ this.producerInfo = {
88
+ agent_id: options.agentId ?? "aaep-typescript-producer",
89
+ agent_version: options.agentVersion ?? "1.0.0",
90
+ agent_name: options.agentName ?? "AAEP TypeScript Producer",
91
+ ...(options.model ? { model: options.model } : {}),
92
+ };
93
+ }
94
+ /** Read-only view of the producer info (for tests). */
95
+ get producer() {
96
+ return this.producerInfo;
97
+ }
98
+ // === Session lifecycle ===
99
+ startSession(opts) {
100
+ const sessionId = makeId("sess");
101
+ this.emit({
102
+ "@context": AAEP_CONTEXT_URL,
103
+ aaep_version: AAEP_VERSION,
104
+ type: "aaep:agent.session.started",
105
+ event_id: makeId("evt"),
106
+ session_id: sessionId,
107
+ sequence_number: this.nextSeq(sessionId),
108
+ timestamp: nowIso(),
109
+ producer: { ...this.producerInfo },
110
+ urgency: "normal",
111
+ summary_normal: opts.summaryNormal,
112
+ ...(opts.requestText && { request_text: opts.requestText }),
113
+ ...(opts.requestedBy && { requested_by: opts.requestedBy }),
114
+ ...(opts.expectedDurationMs && { expected_duration_ms: opts.expectedDurationMs }),
115
+ ...(opts.toolsAvailable && { tools_available: opts.toolsAvailable }),
116
+ });
117
+ return sessionId;
118
+ }
119
+ completeSession(opts) {
120
+ this.emit({
121
+ "@context": AAEP_CONTEXT_URL,
122
+ type: "aaep:agent.session.completed",
123
+ event_id: makeId("evt"),
124
+ session_id: opts.sessionId,
125
+ sequence_number: this.nextSeq(opts.sessionId),
126
+ timestamp: nowIso(),
127
+ producer: { ...this.producerInfo },
128
+ urgency: "normal",
129
+ summary_normal: opts.summaryNormal,
130
+ ...(opts.durationMs !== undefined && { duration_ms: opts.durationMs }),
131
+ ...(opts.toolInvocationsCount !== undefined && {
132
+ tool_invocations_count: opts.toolInvocationsCount,
133
+ }),
134
+ });
135
+ }
136
+ errorSession(opts) {
137
+ this.emit({
138
+ "@context": AAEP_CONTEXT_URL,
139
+ type: "aaep:agent.session.errored",
140
+ event_id: makeId("evt"),
141
+ session_id: opts.sessionId,
142
+ sequence_number: this.nextSeq(opts.sessionId),
143
+ timestamp: nowIso(),
144
+ producer: { ...this.producerInfo },
145
+ urgency: "critical", // MUST per Chapter 4 §4.1.3
146
+ error_category: opts.errorCategory,
147
+ summary_normal: opts.summaryNormal,
148
+ ...(opts.errorMessage && { error_message: opts.errorMessage }),
149
+ ...(opts.recoverable !== undefined && { recoverable: opts.recoverable }),
150
+ ...(opts.remediationHint && { remediation_hint: opts.remediationHint }),
151
+ });
152
+ }
153
+ cancelledSession(opts) {
154
+ this.emit({
155
+ "@context": AAEP_CONTEXT_URL,
156
+ type: "aaep:agent.session.cancelled",
157
+ event_id: makeId("evt"),
158
+ session_id: opts.sessionId,
159
+ sequence_number: this.nextSeq(opts.sessionId),
160
+ timestamp: nowIso(),
161
+ producer: { ...this.producerInfo },
162
+ urgency: "normal",
163
+ cancelled_by: opts.cancelledBy ?? "system",
164
+ summary_normal: opts.summaryNormal ?? "Session cancelled.",
165
+ });
166
+ }
167
+ // === State change ===
168
+ stateChanged(opts) {
169
+ this.emit({
170
+ "@context": AAEP_CONTEXT_URL,
171
+ type: "aaep:agent.state.changed",
172
+ event_id: makeId("evt"),
173
+ session_id: opts.sessionId,
174
+ sequence_number: this.nextSeq(opts.sessionId),
175
+ timestamp: nowIso(),
176
+ producer: { ...this.producerInfo },
177
+ urgency: "normal",
178
+ from_state: opts.fromState,
179
+ to_state: opts.toState,
180
+ summary_normal: opts.summaryNormal,
181
+ });
182
+ }
183
+ // === Tool invocation ===
184
+ toolInvoked(opts) {
185
+ this.emit({
186
+ "@context": AAEP_CONTEXT_URL,
187
+ type: "aaep:agent.tool.invoked",
188
+ event_id: makeId("evt"),
189
+ session_id: opts.sessionId,
190
+ sequence_number: this.nextSeq(opts.sessionId),
191
+ timestamp: nowIso(),
192
+ producer: { ...this.producerInfo },
193
+ urgency: "normal",
194
+ tool: opts.tool,
195
+ tool_call_id: opts.toolCallId,
196
+ args_summary: opts.argsSummary,
197
+ risk_level: opts.riskLevel ?? "low",
198
+ irreversible: opts.irreversible ?? false,
199
+ summary_normal: opts.summaryNormal ?? `Calling ${opts.tool}.`,
200
+ });
201
+ }
202
+ toolCompleted(opts) {
203
+ if (!["success", "error", "timeout"].includes(opts.status)) {
204
+ throw new Error(`status must be success/error/timeout, got ${JSON.stringify(opts.status)}`);
205
+ }
206
+ this.emit({
207
+ "@context": AAEP_CONTEXT_URL,
208
+ type: "aaep:agent.tool.completed",
209
+ event_id: makeId("evt"),
210
+ session_id: opts.sessionId,
211
+ sequence_number: this.nextSeq(opts.sessionId),
212
+ timestamp: nowIso(),
213
+ producer: { ...this.producerInfo },
214
+ urgency: "normal",
215
+ tool: opts.tool,
216
+ tool_call_id: opts.toolCallId,
217
+ status: opts.status,
218
+ summary_normal: opts.summaryNormal ?? "",
219
+ ...(opts.errorMessage && { error_message: opts.errorMessage }),
220
+ });
221
+ }
222
+ // === Streaming output ===
223
+ outputStreaming(opts) {
224
+ this.emit({
225
+ "@context": AAEP_CONTEXT_URL,
226
+ type: "aaep:agent.output.streaming",
227
+ event_id: makeId("evt"),
228
+ session_id: opts.sessionId,
229
+ sequence_number: this.nextSeq(opts.sessionId),
230
+ timestamp: nowIso(),
231
+ producer: { ...this.producerInfo },
232
+ urgency: "normal",
233
+ summary_normal: "",
234
+ chunk: opts.chunk,
235
+ position: opts.position,
236
+ complete: opts.complete,
237
+ coalesce_hint: opts.coalesceHint ?? "none",
238
+ output_id: opts.outputId,
239
+ ...(opts.language && { language: opts.language }),
240
+ });
241
+ }
242
+ // === Confirmation flow ===
243
+ awaitConfirmation(opts) {
244
+ const riskLevel = opts.riskLevel ?? "low";
245
+ const irreversible = opts.irreversible ?? false;
246
+ const defaultDecision = opts.defaultDecision ?? "reject";
247
+ // Runtime safety enforcement (mirrors Python emitter)
248
+ if (irreversible
249
+ && (riskLevel === "high" || riskLevel === "medium")
250
+ && defaultDecision !== "reject") {
251
+ throw new Error(`Irreversible ${riskLevel}-risk confirmations MUST have `
252
+ + `default_decision='reject' (got '${defaultDecision}'). `
253
+ + `This is enforced both by the schema and at runtime.`);
254
+ }
255
+ const replyToken = makeId("rpl");
256
+ const promise = new Promise((resolve) => {
257
+ this.replyResolvers.set(replyToken, resolve);
258
+ });
259
+ // Store the promise via the resolver map; expose waitForDecision separately
260
+ this._pendingReplies = this._pendingReplies ?? new Map();
261
+ this._pendingReplies.set(replyToken, promise);
262
+ this.emit({
263
+ "@context": AAEP_CONTEXT_URL,
264
+ type: "aaep:agent.awaiting.confirmation",
265
+ event_id: makeId("evt"),
266
+ session_id: opts.sessionId,
267
+ sequence_number: this.nextSeq(opts.sessionId),
268
+ timestamp: nowIso(),
269
+ producer: { ...this.producerInfo },
270
+ urgency: "critical", // MUST per Chapter 4 §4.4.1
271
+ action: opts.action,
272
+ consequence: opts.consequence,
273
+ reply_token: replyToken,
274
+ timeout_seconds: opts.timeoutSeconds ?? 300,
275
+ default_decision: defaultDecision,
276
+ risk_level: riskLevel,
277
+ irreversible: irreversible,
278
+ summary_normal: opts.summaryNormal ?? `Confirm: ${opts.action}`,
279
+ });
280
+ return replyToken;
281
+ }
282
+ submitReply(replyToken, decision) {
283
+ const resolver = this.replyResolvers.get(replyToken);
284
+ if (!resolver)
285
+ return false;
286
+ resolver(decision);
287
+ this.replyResolvers.delete(replyToken);
288
+ return true;
289
+ }
290
+ async waitForDecision(replyToken) {
291
+ const pending = this._pendingReplies;
292
+ const promise = pending?.get(replyToken);
293
+ if (!promise) {
294
+ throw new Error(`Unknown reply_token: ${replyToken}`);
295
+ }
296
+ try {
297
+ return await promise;
298
+ }
299
+ finally {
300
+ pending.delete(replyToken);
301
+ }
302
+ }
303
+ // === Internals ===
304
+ nextSeq(sessionId) {
305
+ const seq = this.sequenceNumbers.get(sessionId) ?? 0;
306
+ this.sequenceNumbers.set(sessionId, seq + 1);
307
+ return seq;
308
+ }
309
+ emit(event) {
310
+ const result = this.sendEvent(event);
311
+ if (result instanceof Promise) {
312
+ // Fire-and-forget async sender; errors are swallowed
313
+ result.catch((err) => {
314
+ // In production, route this to your logger
315
+ console.error("[AAEPEmitter] sendEvent failed:", err);
316
+ });
317
+ }
318
+ }
319
+ }
320
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * AAEP TypeScript Producer — public API.
3
+ *
4
+ * Reference implementation of an AAEP producer in TypeScript / Node.js.
5
+ * Demonstrates the manual loop pattern with full safety machinery.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { AAEPEmitter, AgentLoop, makeId } from 'aaep-typescript-producer';
10
+ *
11
+ * const emitter = new AAEPEmitter({
12
+ * sendEvent: (event) => console.log(JSON.stringify(event)),
13
+ * agentId: 'my-agent',
14
+ * });
15
+ *
16
+ * const agent = new AgentLoop(emitter);
17
+ * await agent.run('Tell me about retirement planning.');
18
+ * ```
19
+ *
20
+ * See README.md for full usage and design notes.
21
+ */
22
+ export declare const VERSION = "1.0.0";
23
+ export declare const AAEP_SPEC_VERSION = "1.0.0";
24
+ export { AAEPEmitter, classifyErrorCategory, classifyRisk, makeId, nowIso, safeArgsSummary, type AAEPEmitterOptions, } from "./emitter.js";
25
+ export { StreamCoalescer, type StreamCoalescerOptions } from "./coalescer.js";
26
+ export { AgentLoop, type ToolDescriptor, type AgentLoopOptions } from "./agent.js";
27
+ export * from "./types.js";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,iBAAiB,UAAU,CAAC;AAGzC,OAAO,EACH,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,MAAM,EACN,MAAM,EACN,eAAe,EACf,KAAK,kBAAkB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnF,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * AAEP TypeScript Producer — public API.
3
+ *
4
+ * Reference implementation of an AAEP producer in TypeScript / Node.js.
5
+ * Demonstrates the manual loop pattern with full safety machinery.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { AAEPEmitter, AgentLoop, makeId } from 'aaep-typescript-producer';
10
+ *
11
+ * const emitter = new AAEPEmitter({
12
+ * sendEvent: (event) => console.log(JSON.stringify(event)),
13
+ * agentId: 'my-agent',
14
+ * });
15
+ *
16
+ * const agent = new AgentLoop(emitter);
17
+ * await agent.run('Tell me about retirement planning.');
18
+ * ```
19
+ *
20
+ * See README.md for full usage and design notes.
21
+ */
22
+ export const VERSION = "1.0.0";
23
+ export const AAEP_SPEC_VERSION = "1.0.0";
24
+ // Core emitter and helpers
25
+ export { AAEPEmitter, classifyErrorCategory, classifyRisk, makeId, nowIso, safeArgsSummary, } from "./emitter.js";
26
+ // Streaming coalescer
27
+ export { StreamCoalescer } from "./coalescer.js";
28
+ // Agent loop
29
+ export { AgentLoop } from "./agent.js";
30
+ // All type definitions
31
+ export * from "./types.js";
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAC/B,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,2BAA2B;AAC3B,OAAO,EACH,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,MAAM,EACN,MAAM,EACN,eAAe,GAElB,MAAM,cAAc,CAAC;AAEtB,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAA+B,MAAM,gBAAgB,CAAC;AAE9E,aAAa;AACb,OAAO,EAAE,SAAS,EAA8C,MAAM,YAAY,CAAC;AAEnF,uBAAuB;AACvB,cAAc,YAAY,CAAC"}