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,123 @@
1
+ /** Cooperative, task-scoped cancellation primitives. */
2
+ /** Raised by {@link CancelToken.throwIfCancelled}. */
3
+ export class CancellationError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "CancellationError";
7
+ }
8
+ }
9
+ /**
10
+ * An idempotent, single-threaded cancellation token.
11
+ *
12
+ * Registered callbacks run synchronously in the call stack that wins the
13
+ * first call to {@link cancel}. A callback registered after cancellation
14
+ * runs immediately, before {@link register} returns.
15
+ */
16
+ export class CancelToken {
17
+ #cancelled = false;
18
+ #reason = null;
19
+ #requestedAt = null;
20
+ #callbacks = new Map();
21
+ #nextCallbackId = 0;
22
+ #waiters = new Set();
23
+ #controller = new AbortController();
24
+ get reason() {
25
+ return this.#reason;
26
+ }
27
+ /** `performance.now()` timestamp of the first cancel, or null. */
28
+ get requestedAt() {
29
+ return this.#requestedAt;
30
+ }
31
+ get cancelled() {
32
+ return this.#cancelled;
33
+ }
34
+ /** AbortSignal view of the token, for APIs that accept one. */
35
+ get signal() {
36
+ return this.#controller.signal;
37
+ }
38
+ isCancelled() {
39
+ return this.#cancelled;
40
+ }
41
+ /**
42
+ * Request cancellation. Returns true for the first (winning) call and
43
+ * false for every subsequent call.
44
+ */
45
+ cancel(reason = "cancelled") {
46
+ const effectiveReason = reason || "cancelled";
47
+ if (this.#cancelled) {
48
+ return false;
49
+ }
50
+ this.#reason = effectiveReason;
51
+ this.#requestedAt = performance.now();
52
+ const callbacks = [...this.#callbacks.values()];
53
+ this.#callbacks.clear();
54
+ this.#cancelled = true;
55
+ this.#controller.abort(new CancellationError(effectiveReason));
56
+ for (const callback of callbacks) {
57
+ try {
58
+ callback(effectiveReason);
59
+ }
60
+ catch {
61
+ // Cancellation must remain effective even if a cleanup hook is
62
+ // faulty; owners can report their own cleanup failures.
63
+ continue;
64
+ }
65
+ }
66
+ for (const resolve of this.#waiters) {
67
+ resolve();
68
+ }
69
+ this.#waiters.clear();
70
+ return true;
71
+ }
72
+ /**
73
+ * Resolve true once the token is cancelled. With `timeoutMs`, resolve
74
+ * false instead when the timeout elapses first.
75
+ */
76
+ wait(timeoutMs) {
77
+ if (this.#cancelled) {
78
+ return Promise.resolve(true);
79
+ }
80
+ return new Promise((resolve) => {
81
+ let timer;
82
+ const onCancel = () => {
83
+ if (timer !== undefined) {
84
+ clearTimeout(timer);
85
+ }
86
+ this.#waiters.delete(onCancel);
87
+ resolve(true);
88
+ };
89
+ this.#waiters.add(onCancel);
90
+ if (timeoutMs !== undefined) {
91
+ timer = setTimeout(() => {
92
+ this.#waiters.delete(onCancel);
93
+ resolve(false);
94
+ }, timeoutMs);
95
+ }
96
+ });
97
+ }
98
+ throwIfCancelled() {
99
+ if (this.#cancelled) {
100
+ throw new CancellationError(this.#reason ?? "cancelled");
101
+ }
102
+ }
103
+ /** Register a cancellation hook and return an unregister function. */
104
+ register(callback) {
105
+ if (this.#cancelled) {
106
+ const reason = this.#reason ?? "cancelled";
107
+ try {
108
+ callback(reason);
109
+ }
110
+ catch {
111
+ // Late-registered hooks must not break the registering caller.
112
+ }
113
+ return () => { };
114
+ }
115
+ this.#nextCallbackId += 1;
116
+ const callbackId = this.#nextCallbackId;
117
+ this.#callbacks.set(callbackId, callback);
118
+ return () => {
119
+ this.#callbacks.delete(callbackId);
120
+ };
121
+ }
122
+ }
123
+ //# sourceMappingURL=cancellation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../src/cancellation.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /** Command-line interface and subcommands for laoHuangCode. */
3
+ import { type ClientConnectionSettings } from "./client.ts";
4
+ import { type QueueStatus } from "./commands.ts";
5
+ import { type InputFn as PromptFn } from "./model-selection.ts";
6
+ import { type Submission } from "./session.ts";
7
+ import { PlainEventSink, TerminalUI } from "./terminal/ui.ts";
8
+ export declare const VERSION: string;
9
+ type InputFn = (prompt: string) => string | Promise<string>;
10
+ type OutputFn = (message: string) => void;
11
+ export interface TerminalSupportOptions {
12
+ inputFn?: InputFn | undefined;
13
+ outputFn?: OutputFn | undefined;
14
+ stdin?: {
15
+ isTTY?: boolean | undefined;
16
+ } | undefined;
17
+ stdout?: {
18
+ isTTY?: boolean | undefined;
19
+ } | undefined;
20
+ }
21
+ /** Only enable the interactive UI for the process's real TTY streams. */
22
+ export declare function supportsTerminalUI(options?: TerminalSupportOptions): boolean;
23
+ export interface ReplAgentLike {
24
+ run(text: string): string | Promise<string>;
25
+ }
26
+ export interface ReplUiLike {
27
+ showWelcome(): void;
28
+ prompt(): string | Promise<string>;
29
+ showGoodbye(): void;
30
+ showInterrupted(options?: {
31
+ operation?: boolean;
32
+ }): void;
33
+ showError(message: string): void;
34
+ showAssistant(response: string): void;
35
+ write(message: string): void;
36
+ thinking?(): {
37
+ close(): void;
38
+ } | null;
39
+ }
40
+ export declare function runRepl(agent: ReplAgentLike, options?: {
41
+ commandHandler?: ((command: string) => boolean | Promise<boolean>) | undefined;
42
+ inputFn?: ((prompt: string) => string | Promise<string>) | undefined;
43
+ outputFn?: OutputFn | undefined;
44
+ ui?: ReplUiLike | undefined;
45
+ }): Promise<void>;
46
+ /** Minimal structural view of AgentSession the REPL loops rely on. */
47
+ export interface SessionReplSession {
48
+ readonly eventBus: {
49
+ flush(): Promise<unknown>;
50
+ };
51
+ submitInput(content: string): Promise<Submission>;
52
+ queueStatus(): QueueStatus;
53
+ publishNotice(text: string, options?: {
54
+ style?: string;
55
+ }): unknown;
56
+ waitForIdle(timeoutMs?: number): Promise<boolean>;
57
+ close(options?: {
58
+ wait?: boolean;
59
+ timeoutMs?: number;
60
+ }): Promise<boolean>;
61
+ }
62
+ export interface SessionUiLike {
63
+ commandRegistry?: unknown;
64
+ renderError?: unknown;
65
+ showWelcome?(): void;
66
+ showGoodbye?(): void;
67
+ showError?(message: string): void;
68
+ prompt?(): string | Promise<string>;
69
+ run?(onSubmit: (text: string) => void): void | Promise<void>;
70
+ requestExit?(): void;
71
+ close?(): void;
72
+ startEventRenderer?(): void;
73
+ stopEventRenderer?(): void;
74
+ flushEventRenderer?(): void;
75
+ }
76
+ export type CommandHandler = (command: string) => boolean | Promise<boolean>;
77
+ /** Keep accepting input while AgentSession executes in the background. */
78
+ export declare function runSessionRepl(session: SessionReplSession, options: {
79
+ commandHandler?: CommandHandler | undefined;
80
+ ui: SessionUiLike;
81
+ /** Override for driving a UI whose run() does not read real stdin. */
82
+ runUi?: ((onSubmit: (text: string) => void) => void | Promise<void>) | undefined;
83
+ }): Promise<boolean>;
84
+ /** Run the same event-driven session with append-only plain output. */
85
+ export declare function runPlainSessionRepl(session: SessionReplSession, options: {
86
+ commandHandler?: CommandHandler | undefined;
87
+ inputFn?: ((prompt: string) => string | Promise<string>) | undefined;
88
+ sink: PlainEventSink;
89
+ }): Promise<boolean>;
90
+ /**
91
+ * Route setup/command questions through the running terminal UI loop
92
+ * (mirrors the Python original's `input_fn = terminal_ui.prompt` and
93
+ * `session_secret_input_fn = terminal_ui.prompt_secret`). The loop's ask()
94
+ * coordinates the question with its editor, so no pause/resume is needed —
95
+ * and nothing reads fd 0 behind the driver's raw-mode stream.
96
+ */
97
+ export declare function terminalUiPrompts(ui: Pick<TerminalUI, "prompt" | "promptSecret">): {
98
+ input: PromptFn;
99
+ secretInput: PromptFn;
100
+ };
101
+ export interface MainOptions {
102
+ environ?: Record<string, string | undefined> | undefined;
103
+ configPath?: string | undefined;
104
+ credentialsPath?: string | undefined;
105
+ inputFn?: InputFn | undefined;
106
+ secretInputFn?: InputFn | undefined;
107
+ outputFn?: OutputFn | undefined;
108
+ clientFactory?: ((settings: ClientConnectionSettings) => unknown) | undefined;
109
+ stdin?: {
110
+ isTTY?: boolean | undefined;
111
+ } | undefined;
112
+ stdout?: {
113
+ isTTY?: boolean | undefined;
114
+ } | undefined;
115
+ }
116
+ export declare function main(argv?: readonly string[] | null, options?: MainOptions): Promise<number>;
117
+ export {};