@love-moon/ai-sdk 0.2.16

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,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/worker.js ADDED
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+ import readline from "node:readline";
3
+ import { createLocalAiSession } from "./session-factory.js";
4
+ import { serializeError } from "./shared.js";
5
+ let session = null;
6
+ let sessionCreated = false;
7
+ function send(payload) {
8
+ process.stdout.write(`${JSON.stringify(payload)}\n`);
9
+ }
10
+ function attachSessionEvents(aiSession) {
11
+ const forwardedEvents = [
12
+ "session",
13
+ "assistant_message",
14
+ "working_status",
15
+ "auth_required",
16
+ "process.exited",
17
+ ];
18
+ for (const eventName of forwardedEvents) {
19
+ if (typeof aiSession.on !== "function") {
20
+ continue;
21
+ }
22
+ aiSession.on(eventName, (payload) => {
23
+ send({
24
+ type: "event",
25
+ name: eventName,
26
+ payload,
27
+ });
28
+ });
29
+ }
30
+ }
31
+ async function handleCreate(message) {
32
+ if (sessionCreated) {
33
+ throw new Error("AI worker session already created");
34
+ }
35
+ sessionCreated = true;
36
+ session = createLocalAiSession(message.backend, {
37
+ ...(message.options && typeof message.options === "object" ? message.options : {}),
38
+ logger: {
39
+ log: (line) => {
40
+ send({
41
+ type: "event",
42
+ name: "log",
43
+ payload: { message: line },
44
+ });
45
+ },
46
+ },
47
+ });
48
+ attachSessionEvents(session);
49
+ send({
50
+ type: "ready",
51
+ snapshot: typeof session.getSnapshot === "function" ? session.getSnapshot() : null,
52
+ workerPid: process.pid,
53
+ workerProcessPid: process.pid,
54
+ });
55
+ }
56
+ async function handleRequest(message) {
57
+ if (!session) {
58
+ throw new Error("AI worker session has not been created");
59
+ }
60
+ const method = String(message.method || "").trim();
61
+ if (!method || typeof session[method] !== "function") {
62
+ throw new Error(`Unsupported worker method: ${method}`);
63
+ }
64
+ const args = Array.isArray(message.args) ? [...message.args] : [];
65
+ if (method === "runTurn") {
66
+ const prompt = args[0];
67
+ const options = args[1] && typeof args[1] === "object" ? { ...args[1] } : {};
68
+ options.onProgress = (payload) => {
69
+ send({
70
+ type: "progress",
71
+ requestId: message.id,
72
+ payload,
73
+ });
74
+ };
75
+ args[0] = prompt;
76
+ args[1] = options;
77
+ }
78
+ const result = await session[method](...args);
79
+ send({
80
+ type: "response",
81
+ id: message.id,
82
+ result,
83
+ });
84
+ if (method === "close") {
85
+ process.exit(0);
86
+ }
87
+ }
88
+ async function closeSession() {
89
+ if (!session || typeof session.close !== "function") {
90
+ return;
91
+ }
92
+ try {
93
+ await session.close();
94
+ }
95
+ catch {
96
+ // best effort
97
+ }
98
+ }
99
+ process.on("uncaughtException", async (error) => {
100
+ send({
101
+ type: "event",
102
+ name: "worker_error",
103
+ payload: serializeError(error),
104
+ });
105
+ await closeSession();
106
+ process.exit(1);
107
+ });
108
+ process.on("unhandledRejection", async (reason) => {
109
+ send({
110
+ type: "event",
111
+ name: "worker_error",
112
+ payload: serializeError(reason),
113
+ });
114
+ await closeSession();
115
+ process.exit(1);
116
+ });
117
+ process.stdin.on("end", async () => {
118
+ await closeSession();
119
+ process.exit(0);
120
+ });
121
+ const input = readline.createInterface({ input: process.stdin });
122
+ let workQueue = Promise.resolve();
123
+ input.on("line", (line) => {
124
+ workQueue = workQueue
125
+ .catch(() => {
126
+ // keep queue alive after previous failure
127
+ })
128
+ .then(async () => {
129
+ const normalized = String(line || "").trim();
130
+ if (!normalized) {
131
+ return;
132
+ }
133
+ let message;
134
+ try {
135
+ message = JSON.parse(normalized);
136
+ }
137
+ catch (error) {
138
+ send({
139
+ type: "event",
140
+ name: "worker_error",
141
+ payload: serializeError(error),
142
+ });
143
+ return;
144
+ }
145
+ try {
146
+ if (message?.type === "create") {
147
+ await handleCreate(message);
148
+ return;
149
+ }
150
+ if (message?.type === "request") {
151
+ await handleRequest(message);
152
+ }
153
+ }
154
+ catch (error) {
155
+ send({
156
+ type: message?.type === "create" ? "create_error" : "response",
157
+ id: message?.id,
158
+ error: serializeError(error),
159
+ });
160
+ }
161
+ });
162
+ });
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@love-moon/ai-sdk",
3
+ "version": "0.2.16",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "scripts": {
14
+ "build": "tsc -p tsconfig.json",
15
+ "test": "node --test",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "dependencies": {
19
+ "js-yaml": "^4.1.1"
20
+ },
21
+ "devDependencies": {
22
+ "@types/node": "^22.10.2",
23
+ "typescript": "^5.6.3"
24
+ },
25
+ "gitCommitId": "13b4d6c"
26
+ }