gorsee 0.2.10 → 0.2.12
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.
- package/README.md +52 -4
- package/bin/gorsee.js +38 -0
- package/dist-pkg/ai/bundle.d.ts +1 -0
- package/dist-pkg/ai/framework-context.d.ts +2 -0
- package/dist-pkg/ai/framework-context.js +6 -1
- package/dist-pkg/ai/ide.d.ts +1 -0
- package/dist-pkg/ai/ide.js +3 -0
- package/dist-pkg/ai/index.d.ts +10 -1
- package/dist-pkg/ai/index.js +13 -2
- package/dist-pkg/ai/mcp.js +4 -0
- package/dist-pkg/ai/session-pack.d.ts +8 -0
- package/dist-pkg/ai/session-pack.js +51 -1
- package/dist-pkg/ai/store.d.ts +25 -1
- package/dist-pkg/ai/store.js +89 -3
- package/dist-pkg/ai/summary.d.ts +88 -0
- package/dist-pkg/ai/summary.js +310 -1
- package/dist-pkg/build/manifest.d.ts +4 -2
- package/dist-pkg/build/manifest.js +32 -2
- package/dist-pkg/cli/cmd-ai.js +66 -0
- package/dist-pkg/cli/cmd-build.js +72 -26
- package/dist-pkg/cli/cmd-check.js +104 -11
- package/dist-pkg/cli/cmd-create.js +333 -7
- package/dist-pkg/cli/cmd-deploy.js +17 -3
- package/dist-pkg/cli/cmd-docs.d.ts +3 -1
- package/dist-pkg/cli/cmd-docs.js +5 -3
- package/dist-pkg/cli/cmd-start.js +8 -1
- package/dist-pkg/cli/cmd-upgrade.d.ts +3 -0
- package/dist-pkg/cli/cmd-upgrade.js +14 -2
- package/dist-pkg/cli/cmd-worker.d.ts +9 -0
- package/dist-pkg/cli/cmd-worker.js +78 -0
- package/dist-pkg/cli/framework-md.js +16 -4
- package/dist-pkg/cli/index.js +5 -0
- package/dist-pkg/runtime/app-config.d.ts +5 -0
- package/dist-pkg/runtime/app-config.js +26 -5
- package/dist-pkg/server/index.d.ts +2 -1
- package/dist-pkg/server/index.js +1 -0
- package/dist-pkg/server/jobs.d.ts +35 -1
- package/dist-pkg/server/jobs.js +226 -3
- package/dist-pkg/server/manifest.d.ts +30 -0
- package/dist-pkg/server/manifest.js +30 -1
- package/dist-pkg/server/redis-client.d.ts +9 -0
- package/dist-pkg/server/redis-client.js +4 -1
- package/dist-pkg/server/redis-job-queue.d.ts +2 -0
- package/dist-pkg/server/redis-job-queue.js +434 -16
- package/dist-pkg/server/worker-service.d.ts +33 -0
- package/dist-pkg/server/worker-service.js +135 -0
- package/dist-pkg/server-entry.d.ts +2 -1
- package/dist-pkg/server-entry.js +4 -0
- package/package.json +3 -2
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { emitAIEvent } from "../ai/index.js";
|
|
2
|
+
export function defineWorkerService(name, start) {
|
|
3
|
+
return { name, start };
|
|
4
|
+
}
|
|
5
|
+
export async function runWorkerService(service, options = {}) {
|
|
6
|
+
const startedAt = Date.now(), workerId = options.workerId ?? crypto.randomUUID(), controller = new AbortController, cleanupTasks = [];
|
|
7
|
+
let readySettled = !1, stopPromise = null, resolveReady, rejectReady;
|
|
8
|
+
const ready = new Promise((resolve, reject) => {
|
|
9
|
+
resolveReady = resolve;
|
|
10
|
+
rejectReady = reject;
|
|
11
|
+
});
|
|
12
|
+
if (options.signal)
|
|
13
|
+
if (options.signal.aborted)
|
|
14
|
+
controller.abort(options.signal.reason);
|
|
15
|
+
else
|
|
16
|
+
options.signal.addEventListener("abort", () => controller.abort(options.signal?.reason), { once: !0 });
|
|
17
|
+
const shutdownPromise = new Promise((resolve) => {
|
|
18
|
+
if (controller.signal.aborted)
|
|
19
|
+
resolve();
|
|
20
|
+
else
|
|
21
|
+
controller.signal.addEventListener("abort", () => resolve(), { once: !0 });
|
|
22
|
+
}), context = {
|
|
23
|
+
name: service.name,
|
|
24
|
+
workerId,
|
|
25
|
+
startedAt,
|
|
26
|
+
signal: controller.signal,
|
|
27
|
+
emitReady: async () => {
|
|
28
|
+
if (readySettled)
|
|
29
|
+
return;
|
|
30
|
+
readySettled = !0;
|
|
31
|
+
resolveReady();
|
|
32
|
+
await emitAIEvent({
|
|
33
|
+
kind: "worker.ready",
|
|
34
|
+
severity: "info",
|
|
35
|
+
source: "runtime",
|
|
36
|
+
message: `worker ready ${service.name}`,
|
|
37
|
+
data: {
|
|
38
|
+
workerId,
|
|
39
|
+
service: service.name,
|
|
40
|
+
startedAt
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
emitHeartbeat: async (message = `worker heartbeat ${service.name}`, data) => {
|
|
45
|
+
await emitAIEvent({
|
|
46
|
+
kind: "worker.heartbeat",
|
|
47
|
+
severity: "info",
|
|
48
|
+
source: "runtime",
|
|
49
|
+
message,
|
|
50
|
+
data: {
|
|
51
|
+
workerId,
|
|
52
|
+
service: service.name,
|
|
53
|
+
startedAt,
|
|
54
|
+
...data ?? {}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
waitForShutdown: async () => shutdownPromise
|
|
59
|
+
};
|
|
60
|
+
await emitAIEvent({
|
|
61
|
+
kind: "worker.start",
|
|
62
|
+
severity: "info",
|
|
63
|
+
source: "runtime",
|
|
64
|
+
message: `starting worker ${service.name}`,
|
|
65
|
+
data: {
|
|
66
|
+
workerId,
|
|
67
|
+
service: service.name,
|
|
68
|
+
startedAt
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
const startResult = await service.start(context);
|
|
73
|
+
if (typeof startResult === "function")
|
|
74
|
+
cleanupTasks.push(startResult);
|
|
75
|
+
else if (startResult?.stop) {
|
|
76
|
+
cleanupTasks.push(startResult.stop);
|
|
77
|
+
if (startResult.ready)
|
|
78
|
+
startResult.ready.then(() => context.emitReady()).catch((error) => {
|
|
79
|
+
rejectReady(error);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (!readySettled && !(typeof startResult === "object" && startResult?.ready))
|
|
83
|
+
await context.emitReady();
|
|
84
|
+
} catch (error) {
|
|
85
|
+
rejectReady(error);
|
|
86
|
+
await emitAIEvent({
|
|
87
|
+
kind: "worker.error",
|
|
88
|
+
severity: "error",
|
|
89
|
+
source: "runtime",
|
|
90
|
+
message: error instanceof Error ? error.message : String(error),
|
|
91
|
+
data: {
|
|
92
|
+
workerId,
|
|
93
|
+
service: service.name,
|
|
94
|
+
startedAt
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
const stop = async () => {
|
|
100
|
+
if (stopPromise)
|
|
101
|
+
return stopPromise;
|
|
102
|
+
stopPromise = (async () => {
|
|
103
|
+
controller.abort();
|
|
104
|
+
for (const cleanup of cleanupTasks.reverse())
|
|
105
|
+
await cleanup();
|
|
106
|
+
await emitAIEvent({
|
|
107
|
+
kind: "worker.stop",
|
|
108
|
+
severity: "info",
|
|
109
|
+
source: "runtime",
|
|
110
|
+
message: `stopped worker ${service.name}`,
|
|
111
|
+
data: {
|
|
112
|
+
workerId,
|
|
113
|
+
service: service.name,
|
|
114
|
+
startedAt,
|
|
115
|
+
stoppedAt: Date.now()
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
})();
|
|
119
|
+
return stopPromise;
|
|
120
|
+
};
|
|
121
|
+
if (options.registerSignalHandlers !== !1 && typeof process.on === "function") {
|
|
122
|
+
const handleSignal = () => {
|
|
123
|
+
stop();
|
|
124
|
+
};
|
|
125
|
+
process.once("SIGINT", handleSignal);
|
|
126
|
+
process.once("SIGTERM", handleSignal);
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
name: service.name,
|
|
130
|
+
workerId,
|
|
131
|
+
startedAt,
|
|
132
|
+
ready,
|
|
133
|
+
stop
|
|
134
|
+
};
|
|
135
|
+
}
|
|
@@ -12,7 +12,8 @@ export { log, setLogLevel } from "./log/index.js";
|
|
|
12
12
|
/** @deprecated Prefer "gorsee/ai" when AI tooling is the primary concern. */
|
|
13
13
|
export { buildAIHealthReport, buildAIContextBundle, buildIDEProjection, configureAIObservability, createAIMCPServer, createAIContextPacket, createAIBridgeHandler, createAIBridgeServer, createIDEProjectionWatcher, createLineReader, emitAIDiagnostic, emitAIEvent, createTraceIds, readAIDiagnosticsSnapshot, readAIEvents, renderAIContextBundleMarkdown, renderAIContextMarkdown, resolveAISessionPackPaths, resolveIDEProjectionPaths, resolveAIStorePaths, resolveAIObservabilityConfig, runWithAITrace, writeAISessionPack, writeIDEProjection, type AIMCPServerOptions, type AIContextPacket, type AIContextBundle, type AIContextSnippet, type AIHealthReport, type AIEvent, type AIEventSeverity, type IDEProjection, type IDEProjectionPaths, type IDEProjectionWatcher, type IDEProjectionWatcherOptions, type AISessionPackConfig, type AISessionPackPaths, type AIStorePaths, type AITraceContext, type AIDiagnostic, type AIObservabilityConfig, type AIBridgeConfig, type AIBridgeServer, type AIBridgeHandler, type AIBridgeServerOptions, type AIBridgeSnapshot, } from "./ai/index.js";
|
|
14
14
|
export { createNodeRedisLikeClient, createIORedisLikeClient, deleteExpiredRedisKeys, type RedisLikeClient, type NodeRedisClientLike, type IORedisClientLike, } from "./server/redis-client.js";
|
|
15
|
-
export { createMemoryJobQueue, defineJob, type JobContext, type JobDefinition, type JobEnqueueOptions, type JobQueue, type JobRunResult, type EnqueuedJob, } from "./server/jobs.js";
|
|
15
|
+
export { createMemoryJobQueue, defineJob, type JobContext, type JobDefinition, type JobEnqueueOptions, type JobRetryOptions, type JobQueue, type JobRunResult, type EnqueuedJob, type QueuedJobRecord, type TerminalJobRecord, type MemoryJobQueueOptions, } from "./server/jobs.js";
|
|
16
|
+
export { defineWorkerService, runWorkerService, type WorkerServiceContext, type WorkerServiceDefinition, type WorkerServiceStartHandle, type RunWorkerServiceOptions, type RunningWorkerService, } from "./server/worker-service.js";
|
|
16
17
|
export { createRedisJobQueue, type RedisJobQueueOptions } from "./server/redis-job-queue.js";
|
|
17
18
|
/** @deprecated Prefer "gorsee/i18n" when locale contracts are the primary concern. */
|
|
18
19
|
export { setupI18n, loadLocale, getLocale, getLocales, getDefaultLocale, getFallbackLocales, setLocale, t, plural, negotiateLocale, resolveLocaleFromPath, stripLocalePrefix, withLocalePath, buildHreflangLinks, formatNumber, formatDate, formatRelativeTime, type I18nConfig, type LocaleNegotiationInput, type LocaleNegotiationResult, } from "./i18n/index.js";
|
package/dist-pkg/server-entry.js
CHANGED
|
@@ -65,6 +65,10 @@ export {
|
|
|
65
65
|
createMemoryJobQueue,
|
|
66
66
|
defineJob
|
|
67
67
|
} from "./server/jobs.js";
|
|
68
|
+
export {
|
|
69
|
+
defineWorkerService,
|
|
70
|
+
runWorkerService
|
|
71
|
+
} from "./server/worker-service.js";
|
|
68
72
|
export { createRedisJobQueue } from "./server/redis-job-queue.js";
|
|
69
73
|
export {
|
|
70
74
|
setupI18n,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gorsee",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "AI-first reactive full-stack TypeScript framework for deterministic human and agent collaboration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "bun@1.3.9",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"web-framework"
|
|
22
22
|
],
|
|
23
23
|
"bin": {
|
|
24
|
-
"gorsee": "
|
|
24
|
+
"gorsee": "bin/gorsee.js"
|
|
25
25
|
},
|
|
26
26
|
"exports": {
|
|
27
27
|
".": "./dist-pkg/index.js",
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
"./deploy": "./dist-pkg/deploy/index.js"
|
|
59
59
|
},
|
|
60
60
|
"files": [
|
|
61
|
+
"bin/",
|
|
61
62
|
"dist-pkg/",
|
|
62
63
|
"README.md",
|
|
63
64
|
"LICENSE"
|