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.
Files changed (49) hide show
  1. package/README.md +52 -4
  2. package/bin/gorsee.js +38 -0
  3. package/dist-pkg/ai/bundle.d.ts +1 -0
  4. package/dist-pkg/ai/framework-context.d.ts +2 -0
  5. package/dist-pkg/ai/framework-context.js +6 -1
  6. package/dist-pkg/ai/ide.d.ts +1 -0
  7. package/dist-pkg/ai/ide.js +3 -0
  8. package/dist-pkg/ai/index.d.ts +10 -1
  9. package/dist-pkg/ai/index.js +13 -2
  10. package/dist-pkg/ai/mcp.js +4 -0
  11. package/dist-pkg/ai/session-pack.d.ts +8 -0
  12. package/dist-pkg/ai/session-pack.js +51 -1
  13. package/dist-pkg/ai/store.d.ts +25 -1
  14. package/dist-pkg/ai/store.js +89 -3
  15. package/dist-pkg/ai/summary.d.ts +88 -0
  16. package/dist-pkg/ai/summary.js +310 -1
  17. package/dist-pkg/build/manifest.d.ts +4 -2
  18. package/dist-pkg/build/manifest.js +32 -2
  19. package/dist-pkg/cli/cmd-ai.js +66 -0
  20. package/dist-pkg/cli/cmd-build.js +72 -26
  21. package/dist-pkg/cli/cmd-check.js +104 -11
  22. package/dist-pkg/cli/cmd-create.js +333 -7
  23. package/dist-pkg/cli/cmd-deploy.js +17 -3
  24. package/dist-pkg/cli/cmd-docs.d.ts +3 -1
  25. package/dist-pkg/cli/cmd-docs.js +5 -3
  26. package/dist-pkg/cli/cmd-start.js +8 -1
  27. package/dist-pkg/cli/cmd-upgrade.d.ts +3 -0
  28. package/dist-pkg/cli/cmd-upgrade.js +14 -2
  29. package/dist-pkg/cli/cmd-worker.d.ts +9 -0
  30. package/dist-pkg/cli/cmd-worker.js +78 -0
  31. package/dist-pkg/cli/framework-md.js +16 -4
  32. package/dist-pkg/cli/index.js +5 -0
  33. package/dist-pkg/runtime/app-config.d.ts +5 -0
  34. package/dist-pkg/runtime/app-config.js +26 -5
  35. package/dist-pkg/server/index.d.ts +2 -1
  36. package/dist-pkg/server/index.js +1 -0
  37. package/dist-pkg/server/jobs.d.ts +35 -1
  38. package/dist-pkg/server/jobs.js +226 -3
  39. package/dist-pkg/server/manifest.d.ts +30 -0
  40. package/dist-pkg/server/manifest.js +30 -1
  41. package/dist-pkg/server/redis-client.d.ts +9 -0
  42. package/dist-pkg/server/redis-client.js +4 -1
  43. package/dist-pkg/server/redis-job-queue.d.ts +2 -0
  44. package/dist-pkg/server/redis-job-queue.js +434 -16
  45. package/dist-pkg/server/worker-service.d.ts +33 -0
  46. package/dist-pkg/server/worker-service.js +135 -0
  47. package/dist-pkg/server-entry.d.ts +2 -1
  48. package/dist-pkg/server-entry.js +4 -0
  49. 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";
@@ -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.10",
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": "dist-pkg/bin/gorsee.js"
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"