@forgeax/engine-dsh 0.1.2

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 (47) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +78 -0
  3. package/cordis.patch.yml +5 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/__tests__/dsh-activity-http.test.d.ts +30 -0
  6. package/dist/__tests__/dsh-activity-http.test.d.ts.map +1 -0
  7. package/dist/__tests__/dsh-host.test.d.ts +16 -0
  8. package/dist/__tests__/dsh-host.test.d.ts.map +1 -0
  9. package/dist/__tests__/engine-host.test.d.ts +2 -0
  10. package/dist/__tests__/engine-host.test.d.ts.map +1 -0
  11. package/dist/__tests__/engine-preview.test.d.ts +2 -0
  12. package/dist/__tests__/engine-preview.test.d.ts.map +1 -0
  13. package/dist/__tests__/intelligence.test.d.ts +2 -0
  14. package/dist/__tests__/intelligence.test.d.ts.map +1 -0
  15. package/dist/__tests__/launch-binding-owner.test-d.d.ts +2 -0
  16. package/dist/__tests__/launch-binding-owner.test-d.d.ts.map +1 -0
  17. package/dist/__tests__/protocol.test.d.ts +2 -0
  18. package/dist/__tests__/protocol.test.d.ts.map +1 -0
  19. package/dist/client.d.ts +12 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/embedded.d.ts +2 -0
  22. package/dist/embedded.d.ts.map +1 -0
  23. package/dist/embedded.mjs +250 -0
  24. package/dist/embedded.mjs.map +1 -0
  25. package/dist/engine-host.d.ts +43 -0
  26. package/dist/engine-host.d.ts.map +1 -0
  27. package/dist/engine-host.mjs +384 -0
  28. package/dist/engine-host.mjs.map +1 -0
  29. package/dist/engine-preview.d.ts +12 -0
  30. package/dist/engine-preview.d.ts.map +1 -0
  31. package/dist/engine-preview.mjs +70 -0
  32. package/dist/engine-preview.mjs.map +1 -0
  33. package/dist/index.d.ts +26 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.mjs +187 -0
  36. package/dist/index.mjs.map +1 -0
  37. package/dist/intelligence.d.ts +5 -0
  38. package/dist/intelligence.d.ts.map +1 -0
  39. package/dist/intelligence.mjs +60 -0
  40. package/dist/intelligence.mjs.map +1 -0
  41. package/dist/protocol.d.ts +60 -0
  42. package/dist/protocol.d.ts.map +1 -0
  43. package/dist/protocol.mjs +36 -0
  44. package/dist/protocol.mjs.map +1 -0
  45. package/lib/client.js +295 -0
  46. package/lib/client.js.map +1 -0
  47. package/package.json +103 -0
package/dist/index.mjs ADDED
@@ -0,0 +1,187 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { World, createWorldContext, Update } from '@forgeax/engine-ecs';
3
+
4
+ // src/index.ts
5
+
6
+ // src/protocol.ts
7
+ var FEDERATION_PROTOCOL_VERSION = 1;
8
+ var FEDERATION_ROUTE_PREFIX = "/forgeax-federation/v1";
9
+
10
+ // src/index.ts
11
+ var MAX_ACTIVITY_BODY_BYTES = 65536;
12
+ var inject = ["webServer"];
13
+ async function apply(ctx, config = {}) {
14
+ const identity = config.identity ?? `dsh-${randomUUID()}`;
15
+ const leases = /* @__PURE__ */ new Set();
16
+ let tick = 0;
17
+ let state = 0;
18
+ let embeddedContext;
19
+ let timer;
20
+ const disposers = [];
21
+ let disposed = false;
22
+ ctx.effect(
23
+ () => async () => {
24
+ if (disposed) return;
25
+ disposed = true;
26
+ for (const dispose of disposers.reverse()) dispose();
27
+ leases.clear();
28
+ if (timer !== void 0) clearInterval(timer);
29
+ await embeddedContext?.fiber.dispose();
30
+ },
31
+ "forgeax-federation: routes and embedded engine"
32
+ );
33
+ if (config.engineEndpoint === void 0) {
34
+ const world = new World();
35
+ embeddedContext = await createWorldContext(world);
36
+ world.addSystem(Update, {
37
+ name: "forgeax-federation-headless-tick",
38
+ queries: [],
39
+ fn: () => {
40
+ tick += 1;
41
+ }
42
+ }).unwrap();
43
+ timer = setInterval(() => {
44
+ const result = world.update(1 / 30);
45
+ if (!result.ok) ctx.logger.warn(result.error);
46
+ }, 1e3 / 30);
47
+ }
48
+ const status = () => ({
49
+ protocol: FEDERATION_PROTOCOL_VERSION,
50
+ identity,
51
+ ready: true,
52
+ realm: "dsh",
53
+ capabilities: ["lease", "community-probe", "engine-projection"],
54
+ leases: leases.size,
55
+ engine: config.engineEndpoint === void 0 ? { binding: "embedded", ready: true, frameId: tick, tick, state } : { binding: "external", endpoint: config.engineEndpoint, ready: true }
56
+ });
57
+ disposers.push(
58
+ ctx.webServer.register({
59
+ kind: "exact",
60
+ path: `${FEDERATION_ROUTE_PREFIX}/status`,
61
+ handler(_request, response) {
62
+ writeJson(response, 200, status());
63
+ }
64
+ }),
65
+ ctx.webServer.register({
66
+ kind: "exact",
67
+ path: `${FEDERATION_ROUTE_PREFIX}/activity`,
68
+ async handler(request, response) {
69
+ if (request.method !== "POST") {
70
+ writeJson(response, 405, { code: "federation-method-not-allowed" });
71
+ return;
72
+ }
73
+ const candidate = ctx.get("forgeaxIntelligenceCapability");
74
+ if (candidate === void 0 || typeof candidate.run !== "function") {
75
+ writeJson(response, 404, { code: "federation-intelligence-capability-missing" });
76
+ return;
77
+ }
78
+ const parsed = await readJsonBody(request);
79
+ if (!parsed.ok) {
80
+ writeJson(response, parsed.status, parsed.body);
81
+ return;
82
+ }
83
+ const body = parsed.value;
84
+ if (typeof body !== "object" || body === null || typeof Reflect.get(body, "input") !== "string" || typeof Reflect.get(body, "sessionId") !== "string") {
85
+ writeJson(response, 400, { code: "federation-activity-invalid" });
86
+ return;
87
+ }
88
+ writeJson(
89
+ response,
90
+ 200,
91
+ await candidate.run(Reflect.get(body, "input"), Reflect.get(body, "sessionId"))
92
+ );
93
+ }
94
+ }),
95
+ ctx.webServer.register({
96
+ kind: "exact",
97
+ path: `${FEDERATION_ROUTE_PREFIX}/lease`,
98
+ handler(request, response) {
99
+ if (request.method === "POST") {
100
+ const leaseId = randomUUID();
101
+ leases.add(leaseId);
102
+ writeJson(response, 201, { leaseId });
103
+ return;
104
+ }
105
+ if (request.method === "DELETE") {
106
+ const leaseId = new URL(request.url ?? "/", "http://localhost").searchParams.get(
107
+ "leaseId"
108
+ );
109
+ if (leaseId !== null) leases.delete(leaseId);
110
+ writeJson(response, 200, { released: leaseId !== null });
111
+ return;
112
+ }
113
+ writeJson(response, 405, { code: "federation-method-not-allowed" });
114
+ }
115
+ }),
116
+ ctx.webServer.register({
117
+ kind: "exact",
118
+ path: `${FEDERATION_ROUTE_PREFIX}/community`,
119
+ async handler(_request, response) {
120
+ const candidate = ctx.get("forgeaxFederationCapability");
121
+ if (candidate === void 0 || typeof candidate.inspect !== "function") {
122
+ writeJson(response, 404, { code: "federation-community-capability-missing" });
123
+ return;
124
+ }
125
+ let community;
126
+ try {
127
+ community = await candidate.inspect();
128
+ } catch {
129
+ writeJson(response, 503, { code: "federation-community-capability-failed" });
130
+ return;
131
+ }
132
+ writeJson(response, 200, community);
133
+ }
134
+ }),
135
+ ctx.webServer.register({
136
+ kind: "exact",
137
+ path: `${FEDERATION_ROUTE_PREFIX}/engine/control`,
138
+ handler(request, response) {
139
+ if (request.method !== "POST" || config.engineEndpoint !== void 0) {
140
+ writeJson(response, 409, { code: "federation-engine-control-unavailable" });
141
+ return;
142
+ }
143
+ state = state === 0 ? 1 : 0;
144
+ writeJson(response, 200, status().engine);
145
+ }
146
+ })
147
+ );
148
+ }
149
+ async function readJsonBody(request) {
150
+ const chunks = [];
151
+ let size = 0;
152
+ let tooLarge = false;
153
+ for await (const chunk of request) {
154
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
155
+ if (tooLarge) continue;
156
+ size += buffer.byteLength;
157
+ if (size > MAX_ACTIVITY_BODY_BYTES) {
158
+ tooLarge = true;
159
+ chunks.length = 0;
160
+ continue;
161
+ }
162
+ chunks.push(buffer);
163
+ }
164
+ if (tooLarge) {
165
+ return {
166
+ ok: false,
167
+ status: 413,
168
+ body: { code: "federation-activity-body-too-large", limit: MAX_ACTIVITY_BODY_BYTES }
169
+ };
170
+ }
171
+ try {
172
+ return { ok: true, value: JSON.parse(Buffer.concat(chunks).toString("utf8")) };
173
+ } catch {
174
+ return { ok: false, status: 400, body: { code: "federation-activity-invalid" } };
175
+ }
176
+ }
177
+ function writeJson(response, status, value) {
178
+ response.writeHead(status, {
179
+ "cache-control": "no-store",
180
+ "content-type": "application/json; charset=utf-8"
181
+ });
182
+ response.end(JSON.stringify(value));
183
+ }
184
+
185
+ export { apply, inject };
186
+ //# sourceMappingURL=index.mjs.map
187
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export const FEDERATION_PROTOCOL_VERSION = 1 as const;\nexport const FEDERATION_ROUTE_PREFIX = '/forgeax-federation/v1' as const;\n\nexport type FederationBinding = 'attach' | 'external' | 'embedded';\nexport type FederationOwnership = 'lease' | 'instance';\n\nexport interface FederationStatus {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly identity: string;\n readonly ready: true;\n readonly realm: 'dsh';\n readonly capabilities: readonly string[];\n readonly leases: number;\n readonly engine: EngineProjection;\n}\n\nexport type EngineProjection = EngineEndpointProjection | EmbeddedEngineProjection;\n\nexport interface EngineEndpointProjection {\n readonly binding: 'external';\n readonly endpoint: string;\n readonly ready: true;\n}\n\nexport interface EmbeddedEngineProjection {\n readonly binding: 'embedded';\n readonly ready: true;\n readonly frameId: number;\n readonly tick: number;\n readonly state: number;\n}\n\nexport interface FederationLease {\n readonly leaseId: string;\n}\n\nexport interface FederationCommunityCapability {\n readonly id: string;\n readonly value: string;\n}\n\nexport interface FederationActivityResult {\n readonly output: string;\n}\n\nexport function isFederationCommunityCapability(\n value: unknown,\n): value is FederationCommunityCapability {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return typeof record.id === 'string' && typeof record.value === 'string';\n}\n\nexport interface EnginePreviewStatus {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-status';\n readonly binding: 'external';\n readonly ready: true;\n readonly frameId: number;\n readonly tick: number;\n readonly state: number;\n}\n\nexport interface EnginePreviewPoll {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-poll';\n}\n\nexport interface EnginePreviewControl {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-control';\n readonly action: 'toggle';\n}\n\nexport type EnginePreviewRequest = EnginePreviewPoll | EnginePreviewControl;\n\nexport function isEnginePreviewRequest(value: unknown): value is EnginePreviewRequest {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n if (record.protocol !== FEDERATION_PROTOCOL_VERSION) return false;\n if (record.kind === 'forgeax-engine-poll') return true;\n return record.kind === 'forgeax-engine-control' && record.action === 'toggle';\n}\n\nexport function isEnginePreviewStatus(value: unknown): value is EnginePreviewStatus {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return (\n record.protocol === FEDERATION_PROTOCOL_VERSION &&\n record.kind === 'forgeax-engine-status' &&\n record.binding === 'external' &&\n record.ready === true &&\n typeof record.frameId === 'number' &&\n typeof record.tick === 'number' &&\n typeof record.state === 'number'\n );\n}\n\nexport function isFederationStatus(value: unknown): value is FederationStatus {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return (\n record.protocol === FEDERATION_PROTOCOL_VERSION &&\n record.realm === 'dsh' &&\n record.ready === true &&\n typeof record.identity === 'string' &&\n Array.isArray(record.capabilities) &&\n record.capabilities.every((capability) => typeof capability === 'string') &&\n Number.isInteger(record.leases) &&\n (record.leases as number) >= 0 &&\n isEngineProjection(record.engine)\n );\n}\n\nfunction isEngineProjection(value: unknown): value is EngineProjection {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n if (record.ready !== true) return false;\n if (record.binding === 'external') return typeof record.endpoint === 'string';\n return (\n record.binding === 'embedded' &&\n typeof record.frameId === 'number' &&\n typeof record.tick === 'number' &&\n typeof record.state === 'number'\n );\n}\n","import { randomUUID } from 'node:crypto';\nimport type { IncomingMessage, ServerResponse } from 'node:http';\n\nimport { createWorldContext, Update, World } from '@forgeax/engine-ecs';\nimport type { Context } from '@forgeax/engine-plugin';\n\nimport {\n FEDERATION_PROTOCOL_VERSION,\n FEDERATION_ROUTE_PREFIX,\n type FederationActivityResult,\n type FederationCommunityCapability,\n type FederationStatus,\n} from './protocol';\n\ninterface WebRoute {\n readonly kind: 'exact' | 'prefix';\n readonly path: string;\n readonly handler: (request: IncomingMessage, response: ServerResponse) => void | Promise<void>;\n}\n\ninterface WebServerService {\n register(route: WebRoute): () => void;\n}\n\ninterface DshHostContext {\n readonly webServer: WebServerService;\n readonly logger: { warn(error: unknown): void };\n effect(callback: () => void | (() => void | Promise<void>), label?: string): void;\n get(name: string): unknown;\n}\n\ninterface CommunityProbeService {\n inspect(): FederationCommunityCapability | Promise<FederationCommunityCapability>;\n}\n\ninterface IntelligenceCapabilityService {\n run(\n input: string,\n sessionId: string,\n ): FederationActivityResult | Promise<FederationActivityResult>;\n}\n\nconst MAX_ACTIVITY_BODY_BYTES = 65_536 as const;\n\ntype ActivityBodyResult =\n | { readonly ok: true; readonly value: unknown }\n | {\n readonly ok: false;\n readonly status: 400;\n readonly body: { readonly code: 'federation-activity-invalid' };\n }\n | {\n readonly ok: false;\n readonly status: 413;\n readonly body: {\n readonly code: 'federation-activity-body-too-large';\n readonly limit: typeof MAX_ACTIVITY_BODY_BYTES;\n };\n };\n\nexport interface Config {\n readonly engineEndpoint?: string;\n readonly identity?: string;\n}\n\nexport const inject = ['webServer'];\n\n/** DSH-native Host half. DSH's Loader mounts this ordinary plugin from the package patch. */\nexport async function apply(ctx: DshHostContext, config: Config = {}): Promise<void> {\n const identity = config.identity ?? `dsh-${randomUUID()}`;\n const leases = new Set<string>();\n let tick = 0;\n let state = 0;\n let embeddedContext: Context | undefined;\n let timer: ReturnType<typeof setInterval> | undefined;\n const disposers: Array<() => void> = [];\n let disposed = false;\n\n ctx.effect(\n () => async () => {\n if (disposed) return;\n disposed = true;\n for (const dispose of disposers.reverse()) dispose();\n leases.clear();\n if (timer !== undefined) clearInterval(timer);\n await embeddedContext?.fiber.dispose();\n },\n 'forgeax-federation: routes and embedded engine',\n );\n\n if (config.engineEndpoint === undefined) {\n const world = new World();\n embeddedContext = await createWorldContext(world);\n world\n .addSystem(Update, {\n name: 'forgeax-federation-headless-tick',\n queries: [],\n fn: () => {\n tick += 1;\n },\n })\n .unwrap();\n timer = setInterval(() => {\n const result = world.update(1 / 30);\n if (!result.ok) ctx.logger.warn(result.error);\n }, 1000 / 30);\n }\n\n const status = (): FederationStatus => ({\n protocol: FEDERATION_PROTOCOL_VERSION,\n identity,\n ready: true,\n realm: 'dsh',\n capabilities: ['lease', 'community-probe', 'engine-projection'],\n leases: leases.size,\n engine:\n config.engineEndpoint === undefined\n ? { binding: 'embedded', ready: true, frameId: tick, tick, state }\n : { binding: 'external', endpoint: config.engineEndpoint, ready: true },\n });\n\n disposers.push(\n ctx.webServer.register({\n kind: 'exact',\n path: `${FEDERATION_ROUTE_PREFIX}/status`,\n handler(_request, response) {\n writeJson(response, 200, status());\n },\n }),\n ctx.webServer.register({\n kind: 'exact',\n path: `${FEDERATION_ROUTE_PREFIX}/activity`,\n async handler(request, response) {\n if (request.method !== 'POST') {\n writeJson(response, 405, { code: 'federation-method-not-allowed' });\n return;\n }\n const candidate = ctx.get('forgeaxIntelligenceCapability') as\n | IntelligenceCapabilityService\n | undefined;\n if (candidate === undefined || typeof candidate.run !== 'function') {\n writeJson(response, 404, { code: 'federation-intelligence-capability-missing' });\n return;\n }\n const parsed = await readJsonBody(request);\n if (!parsed.ok) {\n writeJson(response, parsed.status, parsed.body);\n return;\n }\n const body = parsed.value;\n if (\n typeof body !== 'object' ||\n body === null ||\n typeof Reflect.get(body, 'input') !== 'string' ||\n typeof Reflect.get(body, 'sessionId') !== 'string'\n ) {\n writeJson(response, 400, { code: 'federation-activity-invalid' });\n return;\n }\n writeJson(\n response,\n 200,\n await candidate.run(Reflect.get(body, 'input'), Reflect.get(body, 'sessionId')),\n );\n },\n }),\n ctx.webServer.register({\n kind: 'exact',\n path: `${FEDERATION_ROUTE_PREFIX}/lease`,\n handler(request, response) {\n if (request.method === 'POST') {\n const leaseId = randomUUID();\n leases.add(leaseId);\n writeJson(response, 201, { leaseId });\n return;\n }\n if (request.method === 'DELETE') {\n const leaseId = new URL(request.url ?? '/', 'http://localhost').searchParams.get(\n 'leaseId',\n );\n if (leaseId !== null) leases.delete(leaseId);\n writeJson(response, 200, { released: leaseId !== null });\n return;\n }\n writeJson(response, 405, { code: 'federation-method-not-allowed' });\n },\n }),\n ctx.webServer.register({\n kind: 'exact',\n path: `${FEDERATION_ROUTE_PREFIX}/community`,\n async handler(_request, response) {\n const candidate = ctx.get('forgeaxFederationCapability') as\n | CommunityProbeService\n | undefined;\n if (candidate === undefined || typeof candidate.inspect !== 'function') {\n writeJson(response, 404, { code: 'federation-community-capability-missing' });\n return;\n }\n let community: FederationCommunityCapability;\n try {\n community = await candidate.inspect();\n } catch {\n writeJson(response, 503, { code: 'federation-community-capability-failed' });\n return;\n }\n writeJson(response, 200, community);\n },\n }),\n ctx.webServer.register({\n kind: 'exact',\n path: `${FEDERATION_ROUTE_PREFIX}/engine/control`,\n handler(request, response) {\n if (request.method !== 'POST' || config.engineEndpoint !== undefined) {\n writeJson(response, 409, { code: 'federation-engine-control-unavailable' });\n return;\n }\n state = state === 0 ? 1 : 0;\n writeJson(response, 200, status().engine);\n },\n }),\n );\n}\n\nasync function readJsonBody(request: IncomingMessage): Promise<ActivityBodyResult> {\n const chunks: Buffer[] = [];\n let size = 0;\n let tooLarge = false;\n for await (const chunk of request) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n if (tooLarge) continue;\n size += buffer.byteLength;\n if (size > MAX_ACTIVITY_BODY_BYTES) {\n tooLarge = true;\n chunks.length = 0;\n continue;\n }\n chunks.push(buffer);\n }\n if (tooLarge) {\n return {\n ok: false,\n status: 413,\n body: { code: 'federation-activity-body-too-large', limit: MAX_ACTIVITY_BODY_BYTES },\n };\n }\n try {\n return { ok: true, value: JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown };\n } catch {\n return { ok: false, status: 400, body: { code: 'federation-activity-invalid' } };\n }\n}\n\nfunction writeJson(response: ServerResponse, status: number, value: unknown): void {\n response.writeHead(status, {\n 'cache-control': 'no-store',\n 'content-type': 'application/json; charset=utf-8',\n });\n response.end(JSON.stringify(value));\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { type IntelligenceProvider } from '@forgeax/engine-intelligence';
2
+ import type { DshRealmConnection } from './engine-host';
3
+ /** Adapt one ready DSH realm bridge to the provider-neutral AI Native Activity contract. */
4
+ export declare function createDshRealmIntelligenceProvider(connection: DshRealmConnection): IntelligenceProvider;
5
+ //# sourceMappingURL=intelligence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelligence.d.ts","sourceRoot":"","sources":["../src/intelligence.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQxD,4FAA4F;AAC5F,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,kBAAkB,GAC7B,oBAAoB,CAyDtB"}
@@ -0,0 +1,60 @@
1
+ import { IntelligenceError } from '@forgeax/engine-intelligence';
2
+ import { err, ok } from '@forgeax/engine-types';
3
+
4
+ // src/intelligence.ts
5
+ function createDshRealmIntelligenceProvider(connection) {
6
+ const running = /* @__PURE__ */ new Map();
7
+ let closed = false;
8
+ return {
9
+ id: "deepseek-harness-federated",
10
+ start(submission, sink) {
11
+ if (closed) {
12
+ return err(new IntelligenceError({ code: "intelligence-closed", detail: {} }));
13
+ }
14
+ const controller = new AbortController();
15
+ const task = run(submission, sink, controller);
16
+ running.set(submission.id, { controller, sink, task });
17
+ return ok(void 0);
18
+ },
19
+ cancel(id) {
20
+ const activity = running.get(id);
21
+ if (activity === void 0) {
22
+ return err(
23
+ new IntelligenceError({
24
+ code: "intelligence-activity-not-found",
25
+ detail: { activityId: id }
26
+ })
27
+ );
28
+ }
29
+ activity.controller.abort();
30
+ return ok(void 0);
31
+ },
32
+ async close() {
33
+ if (closed) return;
34
+ closed = true;
35
+ for (const activity of running.values()) activity.controller.abort();
36
+ await Promise.allSettled([...running.values()].map((activity) => activity.task));
37
+ running.clear();
38
+ }
39
+ };
40
+ async function run(submission, sink, controller) {
41
+ try {
42
+ const result = await connection.activity(
43
+ submission.input,
44
+ submission.session.id,
45
+ controller.signal
46
+ );
47
+ sink.text(result.output);
48
+ sink.complete(result.output);
49
+ } catch (error) {
50
+ if (controller.signal.aborted) sink.cancelled();
51
+ else sink.fail(error);
52
+ } finally {
53
+ running.delete(submission.id);
54
+ }
55
+ }
56
+ }
57
+
58
+ export { createDshRealmIntelligenceProvider };
59
+ //# sourceMappingURL=intelligence.mjs.map
60
+ //# sourceMappingURL=intelligence.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/intelligence.ts"],"names":[],"mappings":";;;;AAkBO,SAAS,mCACd,UAAA,EACsB;AACtB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAiC;AACrD,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,4BAAA;AAAA,IACJ,KAAA,CAAM,YAAY,IAAA,EAAM;AACtB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,GAAA,CAAI,IAAI,iBAAA,CAAkB,EAAE,IAAA,EAAM,uBAAuB,MAAA,EAAQ,EAAC,EAAG,CAAC,CAAA;AAAA,MAC/E;AACA,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,EAAY,IAAA,EAAM,UAAU,CAAA;AAC7C,MAAA,OAAA,CAAQ,IAAI,UAAA,CAAW,EAAA,EAAI,EAAE,UAAA,EAAY,IAAA,EAAM,MAAM,CAAA;AACrD,MAAA,OAAO,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,OAAO,EAAA,EAAI;AACT,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC/B,MAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,QAAA,OAAO,GAAA;AAAA,UACL,IAAI,iBAAA,CAAkB;AAAA,YACpB,IAAA,EAAM,iCAAA;AAAA,YACN,MAAA,EAAQ,EAAE,UAAA,EAAY,EAAA;AAAG,WAC1B;AAAA,SACH;AAAA,MACF;AACA,MAAA,QAAA,CAAS,WAAW,KAAA,EAAM;AAC1B,MAAA,OAAO,GAAG,MAAS,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,MAAM,KAAA,GAAQ;AACZ,MAAA,IAAI,MAAA,EAAQ;AACZ,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,KAAA,MAAW,YAAY,OAAA,CAAQ,MAAA,EAAO,EAAG,QAAA,CAAS,WAAW,KAAA,EAAM;AACnE,MAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAG,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa,QAAA,CAAS,IAAI,CAAC,CAAA;AAC/E,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,eAAe,GAAA,CACb,UAAA,EACA,IAAA,EACA,UAAA,EACe;AACf,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,QAAA;AAAA,QAC9B,UAAA,CAAW,KAAA;AAAA,QACX,WAAW,OAAA,CAAQ,EAAA;AAAA,QACnB,UAAA,CAAW;AAAA,OACb;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,CAAA;AACvB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,UAAA,CAAW,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,SAAA,EAAU;AAAA,WACzC,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,EAAE,CAAA;AAAA,IAC9B;AAAA,EACF;AACF","file":"intelligence.mjs","sourcesContent":["import {\n type ActivityId,\n type ActivitySink,\n type ActivitySubmission,\n IntelligenceError,\n type IntelligenceProvider,\n} from '@forgeax/engine-intelligence';\nimport { err, ok } from '@forgeax/engine-types';\n\nimport type { DshRealmConnection } from './engine-host';\n\ninterface RunningActivity {\n readonly controller: AbortController;\n readonly sink: ActivitySink;\n readonly task: Promise<void>;\n}\n\n/** Adapt one ready DSH realm bridge to the provider-neutral AI Native Activity contract. */\nexport function createDshRealmIntelligenceProvider(\n connection: DshRealmConnection,\n): IntelligenceProvider {\n const running = new Map<ActivityId, RunningActivity>();\n let closed = false;\n\n return {\n id: 'deepseek-harness-federated',\n start(submission, sink) {\n if (closed) {\n return err(new IntelligenceError({ code: 'intelligence-closed', detail: {} }));\n }\n const controller = new AbortController();\n const task = run(submission, sink, controller);\n running.set(submission.id, { controller, sink, task });\n return ok(undefined);\n },\n cancel(id) {\n const activity = running.get(id);\n if (activity === undefined) {\n return err(\n new IntelligenceError({\n code: 'intelligence-activity-not-found',\n detail: { activityId: id },\n }),\n );\n }\n activity.controller.abort();\n return ok(undefined);\n },\n async close() {\n if (closed) return;\n closed = true;\n for (const activity of running.values()) activity.controller.abort();\n await Promise.allSettled([...running.values()].map((activity) => activity.task));\n running.clear();\n },\n };\n\n async function run(\n submission: ActivitySubmission,\n sink: ActivitySink,\n controller: AbortController,\n ): Promise<void> {\n try {\n const result = await connection.activity(\n submission.input,\n submission.session.id,\n controller.signal,\n );\n sink.text(result.output);\n sink.complete(result.output);\n } catch (error) {\n if (controller.signal.aborted) sink.cancelled();\n else sink.fail(error);\n } finally {\n running.delete(submission.id);\n }\n }\n}\n"]}
@@ -0,0 +1,60 @@
1
+ export declare const FEDERATION_PROTOCOL_VERSION: 1;
2
+ export declare const FEDERATION_ROUTE_PREFIX: "/forgeax-federation/v1";
3
+ export type FederationBinding = 'attach' | 'external' | 'embedded';
4
+ export type FederationOwnership = 'lease' | 'instance';
5
+ export interface FederationStatus {
6
+ readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;
7
+ readonly identity: string;
8
+ readonly ready: true;
9
+ readonly realm: 'dsh';
10
+ readonly capabilities: readonly string[];
11
+ readonly leases: number;
12
+ readonly engine: EngineProjection;
13
+ }
14
+ export type EngineProjection = EngineEndpointProjection | EmbeddedEngineProjection;
15
+ export interface EngineEndpointProjection {
16
+ readonly binding: 'external';
17
+ readonly endpoint: string;
18
+ readonly ready: true;
19
+ }
20
+ export interface EmbeddedEngineProjection {
21
+ readonly binding: 'embedded';
22
+ readonly ready: true;
23
+ readonly frameId: number;
24
+ readonly tick: number;
25
+ readonly state: number;
26
+ }
27
+ export interface FederationLease {
28
+ readonly leaseId: string;
29
+ }
30
+ export interface FederationCommunityCapability {
31
+ readonly id: string;
32
+ readonly value: string;
33
+ }
34
+ export interface FederationActivityResult {
35
+ readonly output: string;
36
+ }
37
+ export declare function isFederationCommunityCapability(value: unknown): value is FederationCommunityCapability;
38
+ export interface EnginePreviewStatus {
39
+ readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;
40
+ readonly kind: 'forgeax-engine-status';
41
+ readonly binding: 'external';
42
+ readonly ready: true;
43
+ readonly frameId: number;
44
+ readonly tick: number;
45
+ readonly state: number;
46
+ }
47
+ export interface EnginePreviewPoll {
48
+ readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;
49
+ readonly kind: 'forgeax-engine-poll';
50
+ }
51
+ export interface EnginePreviewControl {
52
+ readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;
53
+ readonly kind: 'forgeax-engine-control';
54
+ readonly action: 'toggle';
55
+ }
56
+ export type EnginePreviewRequest = EnginePreviewPoll | EnginePreviewControl;
57
+ export declare function isEnginePreviewRequest(value: unknown): value is EnginePreviewRequest;
58
+ export declare function isEnginePreviewStatus(value: unknown): value is EnginePreviewStatus;
59
+ export declare function isFederationStatus(value: unknown): value is FederationStatus;
60
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,EAAG,CAAU,CAAC;AACtD,eAAO,MAAM,uBAAuB,EAAG,wBAAiC,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AACnE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,2BAA2B,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;CACnC;AAED,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,GAAG,wBAAwB,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,6BAA6B,CAIxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,2BAA2B,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,2BAA2B,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,2BAA2B,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;CAC3B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAE5E,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAMpF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAYlF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAc5E"}
@@ -0,0 +1,36 @@
1
+ // src/protocol.ts
2
+ var FEDERATION_PROTOCOL_VERSION = 1;
3
+ var FEDERATION_ROUTE_PREFIX = "/forgeax-federation/v1";
4
+ function isFederationCommunityCapability(value) {
5
+ if (typeof value !== "object" || value === null) return false;
6
+ const record = value;
7
+ return typeof record.id === "string" && typeof record.value === "string";
8
+ }
9
+ function isEnginePreviewRequest(value) {
10
+ if (typeof value !== "object" || value === null) return false;
11
+ const record = value;
12
+ if (record.protocol !== FEDERATION_PROTOCOL_VERSION) return false;
13
+ if (record.kind === "forgeax-engine-poll") return true;
14
+ return record.kind === "forgeax-engine-control" && record.action === "toggle";
15
+ }
16
+ function isEnginePreviewStatus(value) {
17
+ if (typeof value !== "object" || value === null) return false;
18
+ const record = value;
19
+ return record.protocol === FEDERATION_PROTOCOL_VERSION && record.kind === "forgeax-engine-status" && record.binding === "external" && record.ready === true && typeof record.frameId === "number" && typeof record.tick === "number" && typeof record.state === "number";
20
+ }
21
+ function isFederationStatus(value) {
22
+ if (typeof value !== "object" || value === null) return false;
23
+ const record = value;
24
+ return record.protocol === FEDERATION_PROTOCOL_VERSION && record.realm === "dsh" && record.ready === true && typeof record.identity === "string" && Array.isArray(record.capabilities) && record.capabilities.every((capability) => typeof capability === "string") && Number.isInteger(record.leases) && record.leases >= 0 && isEngineProjection(record.engine);
25
+ }
26
+ function isEngineProjection(value) {
27
+ if (typeof value !== "object" || value === null) return false;
28
+ const record = value;
29
+ if (record.ready !== true) return false;
30
+ if (record.binding === "external") return typeof record.endpoint === "string";
31
+ return record.binding === "embedded" && typeof record.frameId === "number" && typeof record.tick === "number" && typeof record.state === "number";
32
+ }
33
+
34
+ export { FEDERATION_PROTOCOL_VERSION, FEDERATION_ROUTE_PREFIX, isEnginePreviewRequest, isEnginePreviewStatus, isFederationCommunityCapability, isFederationStatus };
35
+ //# sourceMappingURL=protocol.mjs.map
36
+ //# sourceMappingURL=protocol.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol.ts"],"names":[],"mappings":";AAAO,IAAM,2BAAA,GAA8B;AACpC,IAAM,uBAAA,GAA0B;AA4ChC,SAAS,gCACd,KAAA,EACwC;AACxC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OAAO,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,IAAY,OAAO,OAAO,KAAA,KAAU,QAAA;AAClE;AAyBO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,2BAAA,EAA6B,OAAO,KAAA;AAC5D,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,qBAAA,EAAuB,OAAO,IAAA;AAClD,EAAA,OAAO,MAAA,CAAO,IAAA,KAAS,wBAAA,IAA4B,MAAA,CAAO,MAAA,KAAW,QAAA;AACvE;AAEO,SAAS,sBAAsB,KAAA,EAA8C;AAClF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OACE,MAAA,CAAO,aAAa,2BAAA,IACpB,MAAA,CAAO,SAAS,uBAAA,IAChB,MAAA,CAAO,OAAA,KAAY,UAAA,IACnB,MAAA,CAAO,KAAA,KAAU,QACjB,OAAO,MAAA,CAAO,YAAY,QAAA,IAC1B,OAAO,OAAO,IAAA,KAAS,QAAA,IACvB,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA;AAE5B;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OACE,OAAO,QAAA,KAAa,2BAAA,IACpB,MAAA,CAAO,KAAA,KAAU,SACjB,MAAA,CAAO,KAAA,KAAU,IAAA,IACjB,OAAO,OAAO,QAAA,KAAa,QAAA,IAC3B,KAAA,CAAM,OAAA,CAAQ,OAAO,YAAY,CAAA,IACjC,MAAA,CAAO,YAAA,CAAa,MAAM,CAAC,UAAA,KAAe,OAAO,UAAA,KAAe,QAAQ,CAAA,IACxE,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA,IAC7B,MAAA,CAAO,UAAqB,CAAA,IAC7B,kBAAA,CAAmB,OAAO,MAAM,CAAA;AAEpC;AAEA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,IAAI,MAAA,CAAO,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAClC,EAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAO,OAAO,OAAO,QAAA,KAAa,QAAA;AACrE,EAAA,OACE,MAAA,CAAO,OAAA,KAAY,UAAA,IACnB,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,IAC1B,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,IACvB,OAAO,OAAO,KAAA,KAAU,QAAA;AAE5B","file":"protocol.mjs","sourcesContent":["export const FEDERATION_PROTOCOL_VERSION = 1 as const;\nexport const FEDERATION_ROUTE_PREFIX = '/forgeax-federation/v1' as const;\n\nexport type FederationBinding = 'attach' | 'external' | 'embedded';\nexport type FederationOwnership = 'lease' | 'instance';\n\nexport interface FederationStatus {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly identity: string;\n readonly ready: true;\n readonly realm: 'dsh';\n readonly capabilities: readonly string[];\n readonly leases: number;\n readonly engine: EngineProjection;\n}\n\nexport type EngineProjection = EngineEndpointProjection | EmbeddedEngineProjection;\n\nexport interface EngineEndpointProjection {\n readonly binding: 'external';\n readonly endpoint: string;\n readonly ready: true;\n}\n\nexport interface EmbeddedEngineProjection {\n readonly binding: 'embedded';\n readonly ready: true;\n readonly frameId: number;\n readonly tick: number;\n readonly state: number;\n}\n\nexport interface FederationLease {\n readonly leaseId: string;\n}\n\nexport interface FederationCommunityCapability {\n readonly id: string;\n readonly value: string;\n}\n\nexport interface FederationActivityResult {\n readonly output: string;\n}\n\nexport function isFederationCommunityCapability(\n value: unknown,\n): value is FederationCommunityCapability {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return typeof record.id === 'string' && typeof record.value === 'string';\n}\n\nexport interface EnginePreviewStatus {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-status';\n readonly binding: 'external';\n readonly ready: true;\n readonly frameId: number;\n readonly tick: number;\n readonly state: number;\n}\n\nexport interface EnginePreviewPoll {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-poll';\n}\n\nexport interface EnginePreviewControl {\n readonly protocol: typeof FEDERATION_PROTOCOL_VERSION;\n readonly kind: 'forgeax-engine-control';\n readonly action: 'toggle';\n}\n\nexport type EnginePreviewRequest = EnginePreviewPoll | EnginePreviewControl;\n\nexport function isEnginePreviewRequest(value: unknown): value is EnginePreviewRequest {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n if (record.protocol !== FEDERATION_PROTOCOL_VERSION) return false;\n if (record.kind === 'forgeax-engine-poll') return true;\n return record.kind === 'forgeax-engine-control' && record.action === 'toggle';\n}\n\nexport function isEnginePreviewStatus(value: unknown): value is EnginePreviewStatus {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return (\n record.protocol === FEDERATION_PROTOCOL_VERSION &&\n record.kind === 'forgeax-engine-status' &&\n record.binding === 'external' &&\n record.ready === true &&\n typeof record.frameId === 'number' &&\n typeof record.tick === 'number' &&\n typeof record.state === 'number'\n );\n}\n\nexport function isFederationStatus(value: unknown): value is FederationStatus {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return (\n record.protocol === FEDERATION_PROTOCOL_VERSION &&\n record.realm === 'dsh' &&\n record.ready === true &&\n typeof record.identity === 'string' &&\n Array.isArray(record.capabilities) &&\n record.capabilities.every((capability) => typeof capability === 'string') &&\n Number.isInteger(record.leases) &&\n (record.leases as number) >= 0 &&\n isEngineProjection(record.engine)\n );\n}\n\nfunction isEngineProjection(value: unknown): value is EngineProjection {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n if (record.ready !== true) return false;\n if (record.binding === 'external') return typeof record.endpoint === 'string';\n return (\n record.binding === 'embedded' &&\n typeof record.frameId === 'number' &&\n typeof record.tick === 'number' &&\n typeof record.state === 'number'\n );\n}\n"]}