laohuang 0.3.2 → 0.4.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 (86) hide show
  1. package/README.md +142 -16
  2. package/dist/agent.d.ts +166 -0
  3. package/dist/agent.js +858 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/bash-runner.d.ts +79 -0
  6. package/dist/bash-runner.js +464 -0
  7. package/dist/bash-runner.js.map +1 -0
  8. package/dist/cancellation.d.ts +36 -0
  9. package/dist/cancellation.js +123 -0
  10. package/dist/cancellation.js.map +1 -0
  11. package/dist/cli.d.ts +117 -0
  12. package/dist/cli.js +1307 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/client.d.ts +21 -0
  15. package/dist/client.js +17 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/commands.d.ts +123 -0
  18. package/dist/commands.js +660 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +51 -0
  21. package/dist/config.js +183 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/credentials.d.ts +12 -0
  24. package/dist/credentials.js +102 -0
  25. package/dist/credentials.js.map +1 -0
  26. package/dist/events.d.ts +288 -0
  27. package/dist/events.js +838 -0
  28. package/dist/events.js.map +1 -0
  29. package/dist/model-adapter.d.ts +138 -0
  30. package/dist/model-adapter.js +244 -0
  31. package/dist/model-adapter.js.map +1 -0
  32. package/dist/model-selection.d.ts +67 -0
  33. package/dist/model-selection.js +148 -0
  34. package/dist/model-selection.js.map +1 -0
  35. package/dist/model-stream.d.ts +128 -0
  36. package/dist/model-stream.js +582 -0
  37. package/dist/model-stream.js.map +1 -0
  38. package/dist/project-instructions.d.ts +99 -0
  39. package/dist/project-instructions.js +348 -0
  40. package/dist/project-instructions.js.map +1 -0
  41. package/dist/providers.d.ts +9 -0
  42. package/dist/providers.js +26 -0
  43. package/dist/providers.js.map +1 -0
  44. package/dist/routing.d.ts +170 -0
  45. package/dist/routing.js +669 -0
  46. package/dist/routing.js.map +1 -0
  47. package/dist/semantic-classifier.d.ts +66 -0
  48. package/dist/semantic-classifier.js +86 -0
  49. package/dist/semantic-classifier.js.map +1 -0
  50. package/dist/session.d.ts +162 -0
  51. package/dist/session.js +871 -0
  52. package/dist/session.js.map +1 -0
  53. package/dist/system-prompt.d.ts +16 -0
  54. package/dist/system-prompt.js +42 -0
  55. package/dist/system-prompt.js.map +1 -0
  56. package/dist/terminal/editor.d.ts +161 -0
  57. package/dist/terminal/editor.js +1060 -0
  58. package/dist/terminal/editor.js.map +1 -0
  59. package/dist/terminal/input.d.ts +61 -0
  60. package/dist/terminal/input.js +276 -0
  61. package/dist/terminal/input.js.map +1 -0
  62. package/dist/terminal/markdown.d.ts +20 -0
  63. package/dist/terminal/markdown.js +621 -0
  64. package/dist/terminal/markdown.js.map +1 -0
  65. package/dist/terminal/screen.d.ts +66 -0
  66. package/dist/terminal/screen.js +624 -0
  67. package/dist/terminal/screen.js.map +1 -0
  68. package/dist/terminal/theme.d.ts +23 -0
  69. package/dist/terminal/theme.js +101 -0
  70. package/dist/terminal/theme.js.map +1 -0
  71. package/dist/terminal/ui.d.ts +285 -0
  72. package/dist/terminal/ui.js +1815 -0
  73. package/dist/terminal/ui.js.map +1 -0
  74. package/dist/tools.d.ts +95 -0
  75. package/dist/tools.js +444 -0
  76. package/dist/tools.js.map +1 -0
  77. package/dist/ui-state.d.ts +51 -0
  78. package/dist/ui-state.js +194 -0
  79. package/dist/ui-state.js.map +1 -0
  80. package/dist/web.d.ts +56 -0
  81. package/dist/web.js +247 -0
  82. package/dist/web.js.map +1 -0
  83. package/package.json +24 -21
  84. package/bin/laohuang.js +0 -10
  85. package/lib/launcher.js +0 -133
  86. package/vendor/laohuangcode-0.3.2-py3-none-any.whl +0 -0
@@ -0,0 +1,288 @@
1
+ /** Canonical events and the event bus used by the runtime. */
2
+ export declare const EventKind: {
3
+ readonly InputUserMessage: "input.user_message";
4
+ /** Compatibility alias for InputUserMessage. */
5
+ readonly InputReceived: "input.user_message";
6
+ readonly InputSlashCommand: "input.slash_command";
7
+ readonly InputPending: "input.pending";
8
+ readonly InputHeld: "input.held";
9
+ readonly InputCancelRequested: "input.cancel_requested";
10
+ readonly TaskStarted: "task.started";
11
+ readonly TaskStateChanged: "task.state_changed";
12
+ readonly TaskCompleted: "task.completed";
13
+ readonly TaskFailed: "task.failed";
14
+ readonly TaskCancelled: "task.cancelled";
15
+ readonly ModelRequestStarted: "model.request_started";
16
+ readonly ModelTextDelta: "model.text_delta";
17
+ readonly ModelReasoningDelta: "model.reasoning_delta";
18
+ readonly ModelToolCallDelta: "model.tool_call_delta";
19
+ readonly ModelResponseValidating: "model.response_validating";
20
+ readonly ModelResponseCommitted: "model.response_committed";
21
+ readonly ModelResponseAborted: "model.response_aborted";
22
+ readonly ModelRequestFailed: "model.request_failed";
23
+ readonly ModelResponseSummary: "model.response_summary";
24
+ readonly ModelSwitched: "model.switched";
25
+ readonly AgentGuardTriggered: "agent.guard_triggered";
26
+ readonly AgentGuardFailed: "agent.guard_failed";
27
+ readonly ToolStarted: "tool.started";
28
+ readonly ToolOutputDelta: "tool.output_delta";
29
+ readonly ToolFinished: "tool.finished";
30
+ readonly SessionReady: "session.ready";
31
+ readonly SessionStopped: "session.stopped";
32
+ readonly UiMessage: "ui.message";
33
+ readonly RoutingDecided: "routing.decided";
34
+ /** Compatibility alias for RoutingDecided. */
35
+ readonly RouteDecided: "routing.decided";
36
+ readonly RoutingRejected: "routing.rejected";
37
+ };
38
+ export type EventKind = (typeof EventKind)[keyof typeof EventKind];
39
+ export declare const EventSource: {
40
+ readonly User: "user";
41
+ readonly Cli: "cli";
42
+ readonly Model: "model";
43
+ readonly Tool: "tool";
44
+ readonly Session: "session";
45
+ readonly Router: "router";
46
+ readonly System: "system";
47
+ };
48
+ export type EventSource = (typeof EventSource)[keyof typeof EventSource];
49
+ export declare class EventValidationError extends Error {
50
+ constructor(message: string, options?: {
51
+ cause?: unknown;
52
+ });
53
+ }
54
+ /**
55
+ * Payload carried by an event. Every payload may gain a projection gap marker
56
+ * when a subscriber mailbox drops or coalesces events under backpressure.
57
+ */
58
+ export interface EventPayloadBase {
59
+ _projection_dropped?: number;
60
+ [field: string]: unknown;
61
+ }
62
+ export interface UserMessagePayload extends EventPayloadBase {
63
+ content: string;
64
+ strategy?: string;
65
+ }
66
+ export interface SlashCommandPayload extends EventPayloadBase {
67
+ content: string;
68
+ }
69
+ export interface InputPendingPayload extends EventPayloadBase {
70
+ pending_count: number;
71
+ }
72
+ export interface InputHeldPayload extends EventPayloadBase {
73
+ held_count: number;
74
+ }
75
+ export interface TaskStateChangedPayload extends EventPayloadBase {
76
+ state: string;
77
+ }
78
+ export interface ModelRequestStartedPayload extends EventPayloadBase {
79
+ request_id: string;
80
+ }
81
+ export interface ModelDeltaPayload extends EventPayloadBase {
82
+ text: string;
83
+ request_id?: string;
84
+ coalesced_from_sequence?: number;
85
+ }
86
+ export interface ModelToolCallDeltaPayload extends EventPayloadBase {
87
+ index: number;
88
+ request_id?: string;
89
+ coalesced_from_sequence?: number;
90
+ }
91
+ export interface AgentGuardPayload extends EventPayloadBase {
92
+ reason: string;
93
+ tool_rounds?: number;
94
+ model_requests?: number;
95
+ total_tokens?: number;
96
+ elapsed_ms?: number;
97
+ }
98
+ export interface ToolStartedPayload extends EventPayloadBase {
99
+ name: string;
100
+ arguments: Record<string, unknown>;
101
+ }
102
+ export interface ToolOutputDeltaPayload extends EventPayloadBase {
103
+ stream: string;
104
+ text: string;
105
+ coalesced_from_sequence?: number;
106
+ }
107
+ export interface ToolFinishedPayload extends EventPayloadBase {
108
+ status: string;
109
+ }
110
+ export interface UiMessagePayload extends EventPayloadBase {
111
+ text: string;
112
+ style?: string;
113
+ }
114
+ export interface RoutingDecidedPayload extends EventPayloadBase {
115
+ destination: string;
116
+ reason: string;
117
+ }
118
+ export interface RoutingRejectedPayload extends EventPayloadBase {
119
+ reason: string;
120
+ }
121
+ export interface EventPayloadMap {
122
+ "input.user_message": UserMessagePayload;
123
+ "input.slash_command": SlashCommandPayload;
124
+ "input.pending": InputPendingPayload;
125
+ "input.held": InputHeldPayload;
126
+ "input.cancel_requested": EventPayloadBase;
127
+ "task.started": EventPayloadBase;
128
+ "task.state_changed": TaskStateChangedPayload;
129
+ "task.completed": EventPayloadBase;
130
+ "task.failed": EventPayloadBase;
131
+ "task.cancelled": EventPayloadBase;
132
+ "model.request_started": ModelRequestStartedPayload;
133
+ "model.text_delta": ModelDeltaPayload;
134
+ "model.reasoning_delta": ModelDeltaPayload;
135
+ "model.tool_call_delta": ModelToolCallDeltaPayload;
136
+ "model.response_validating": EventPayloadBase;
137
+ "model.response_committed": EventPayloadBase;
138
+ "model.response_aborted": EventPayloadBase;
139
+ "model.request_failed": EventPayloadBase;
140
+ "model.response_summary": EventPayloadBase;
141
+ "model.switched": EventPayloadBase;
142
+ "agent.guard_triggered": AgentGuardPayload;
143
+ "agent.guard_failed": AgentGuardPayload;
144
+ "tool.started": ToolStartedPayload;
145
+ "tool.output_delta": ToolOutputDeltaPayload;
146
+ "tool.finished": ToolFinishedPayload;
147
+ "session.ready": EventPayloadBase;
148
+ "session.stopped": EventPayloadBase;
149
+ "ui.message": UiMessagePayload;
150
+ "routing.decided": RoutingDecidedPayload;
151
+ "routing.rejected": RoutingRejectedPayload;
152
+ }
153
+ export type DeepReadonly<T> = T extends (...args: never[]) => unknown ? T : T extends readonly (infer U)[] ? readonly DeepReadonly<U>[] : T extends object ? {
154
+ readonly [P in keyof T]: DeepReadonly<T[P]>;
155
+ } : T;
156
+ /**
157
+ * Immutable transport envelope.
158
+ *
159
+ * ``sequence`` is zero before publication. {@link EventBus} replaces it with
160
+ * a strictly increasing session-wide sequence while retaining ``event_id``.
161
+ */
162
+ export interface EventEnvelope<K extends EventKind = EventKind> {
163
+ readonly event_id: string;
164
+ readonly kind: K;
165
+ readonly source: EventSource;
166
+ readonly session_id: string;
167
+ readonly task_id: string | null;
168
+ readonly correlation_id: string | null;
169
+ readonly sequence: number;
170
+ readonly payload: DeepReadonly<EventPayloadMap[K]>;
171
+ }
172
+ /** Discriminated union over all known event kinds. */
173
+ export type AnyEventEnvelope = {
174
+ [K in EventKind]: EventEnvelope<K>;
175
+ }[EventKind];
176
+ export type PayloadFieldType = "string" | "integer" | "object";
177
+ export type EventValidator = (event: AnyEventEnvelope) => boolean | void;
178
+ export interface EventSpecOptions {
179
+ kind: EventKind;
180
+ sources?: ReadonlySet<EventSource> | null;
181
+ required_payload?: ReadonlySet<string>;
182
+ payload_types?: Readonly<Record<string, PayloadFieldType>>;
183
+ require_task_id?: boolean;
184
+ require_correlation_id?: boolean;
185
+ max_payload_chars?: number;
186
+ validator?: EventValidator | null;
187
+ }
188
+ /** Validation rules for a single event kind. */
189
+ export declare class EventSpec {
190
+ readonly kind: EventKind;
191
+ readonly sources: ReadonlySet<EventSource> | null;
192
+ readonly required_payload: ReadonlySet<string>;
193
+ readonly payload_types: Readonly<Record<string, PayloadFieldType>>;
194
+ readonly require_task_id: boolean;
195
+ readonly require_correlation_id: boolean;
196
+ readonly max_payload_chars: number;
197
+ readonly validator: EventValidator | null;
198
+ constructor(options: EventSpecOptions);
199
+ validate(event: AnyEventEnvelope): void;
200
+ }
201
+ export declare const EVENT_SPECS: ReadonlyMap<EventKind, EventSpec>;
202
+ export interface CreateEventOptions<K extends EventKind> {
203
+ source: EventSource | string;
204
+ session_id: string;
205
+ task_id?: string | null;
206
+ correlation_id?: string | null;
207
+ sequence?: number;
208
+ payload?: EventPayloadMap[K];
209
+ event_id?: string;
210
+ }
211
+ /** Create validated envelopes without assigning publication order. */
212
+ export declare class EventFactory {
213
+ private readonly specs;
214
+ constructor(specs?: ReadonlyMap<EventKind, EventSpec>);
215
+ register(eventSpec: EventSpec): void;
216
+ create<K extends EventKind>(kind: K | string, options: CreateEventOptions<K>): EventEnvelope<K>;
217
+ validate(event: AnyEventEnvelope): void;
218
+ }
219
+ export interface ProjectedEvent {
220
+ event_id: string;
221
+ kind: EventKind;
222
+ source: EventSource;
223
+ session_id: string;
224
+ task_id: string | null;
225
+ correlation_id: string | null;
226
+ sequence: number;
227
+ payload: unknown;
228
+ }
229
+ /** Produce JSON-friendly, recursively redacted audience projections. */
230
+ export declare class EventProjector {
231
+ static readonly AUDIENCES: ReadonlySet<string>;
232
+ project(event: AnyEventEnvelope, audience?: string): ProjectedEvent;
233
+ }
234
+ export type SubscriberCallback = (event: AnyEventEnvelope) => void | Promise<void>;
235
+ export interface EventBusOptions {
236
+ factory?: EventFactory;
237
+ max_buffered_events?: number;
238
+ subscriber_mailbox_size?: number;
239
+ }
240
+ export declare class EventBufferEmptyError extends Error {
241
+ constructor();
242
+ }
243
+ export declare class EventBufferTimeoutError extends Error {
244
+ constructor();
245
+ }
246
+ /**
247
+ * Thrown by publish/subscribe and used to reject pending pull waiters once
248
+ * the bus has been closed, so consumers can detect shutdown via `instanceof`
249
+ * instead of matching the message.
250
+ */
251
+ export declare class EventBusClosedError extends Error {
252
+ constructor();
253
+ }
254
+ /** A FIFO bus that assigns one strict sequence across all publishers. */
255
+ export declare class EventBus {
256
+ readonly factory: EventFactory;
257
+ private readonly maxBufferedEvents;
258
+ private readonly subscriberMailboxSize;
259
+ private readonly buffer;
260
+ private readonly bufferWaiters;
261
+ private readonly subscribers;
262
+ private subscriberId;
263
+ private sequence;
264
+ private closed;
265
+ constructor(options?: EventBusOptions);
266
+ get last_sequence(): number;
267
+ publish<K extends EventKind>(kind: K, options: Omit<CreateEventOptions<K>, "sequence" | "event_id">): EventEnvelope<K>;
268
+ publishEvent<K extends EventKind>(event: EventEnvelope<K>): EventEnvelope<K>;
269
+ /** Wait until every published event reached current subscribers. */
270
+ flush(): Promise<void>;
271
+ /** Deliver queued events and stop subscriber workers exactly once. */
272
+ close(): Promise<void>;
273
+ /**
274
+ * Fan out every future event and return an unsubscribe callback.
275
+ *
276
+ * The returned callback detaches the subscriber immediately and resolves
277
+ * only after the mailbox drained, so once it returns no further events
278
+ * can be delivered to that callback (matching Python's blocking
279
+ * ``unsubscribe``).
280
+ */
281
+ subscribe(callback: SubscriberCallback): () => Promise<void>;
282
+ /** Pull the next buffered event, waiting up to ``timeoutMs`` if given. */
283
+ get(timeoutMs?: number): Promise<AnyEventEnvelope>;
284
+ getNowait(): AnyEventEnvelope;
285
+ drain(limit?: number): AnyEventEnvelope[];
286
+ qsize(): number;
287
+ private feedBufferWaiters;
288
+ }