@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/lib/client.js ADDED
@@ -0,0 +1,295 @@
1
+ window.__ModuleLoader__.load({ id: "@forgeax/engine-dsh", factory: (require) => {
2
+ var module = { exports: {} }; var exports = module.exports;
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/client.tsx
23
+ var client_exports = {};
24
+ __export(client_exports, {
25
+ apply: () => apply,
26
+ inject: () => inject
27
+ });
28
+ module.exports = __toCommonJS(client_exports);
29
+ var import_react = require("react");
30
+
31
+ // src/protocol.ts
32
+ var FEDERATION_PROTOCOL_VERSION = 1;
33
+ var FEDERATION_ROUTE_PREFIX = "/forgeax-federation/v1";
34
+ function isEnginePreviewStatus(value) {
35
+ if (typeof value !== "object" || value === null) return false;
36
+ const record = value;
37
+ 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";
38
+ }
39
+ function isFederationStatus(value) {
40
+ if (typeof value !== "object" || value === null) return false;
41
+ const record = value;
42
+ 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);
43
+ }
44
+ function isEngineProjection(value) {
45
+ if (typeof value !== "object" || value === null) return false;
46
+ const record = value;
47
+ if (record.ready !== true) return false;
48
+ if (record.binding === "external") return typeof record.endpoint === "string";
49
+ return record.binding === "embedded" && typeof record.frameId === "number" && typeof record.tick === "number" && typeof record.state === "number";
50
+ }
51
+
52
+ // src/client.tsx
53
+ var import_jsx_runtime = require("react/jsx-runtime");
54
+ var inject = ["slots"];
55
+ function apply(ctx) {
56
+ ctx.slots.inject(
57
+ "shell.overlay",
58
+ () => ctx.slots.register(
59
+ {
60
+ name: "shell.overlay",
61
+ id: "forgeax-engine",
62
+ order: 80,
63
+ label: "ForgeaX Engine"
64
+ },
65
+ ForgeaXPanel
66
+ )
67
+ );
68
+ }
69
+ function ForgeaXPanel() {
70
+ const [open, setOpen] = (0, import_react.useState)(true);
71
+ const [realm, setRealm] = (0, import_react.useState)();
72
+ const [engine, setEngine] = (0, import_react.useState)();
73
+ const iframe = (0, import_react.useRef)(null);
74
+ const readRealm = (0, import_react.useCallback)(async () => {
75
+ const response = await fetch(`${FEDERATION_ROUTE_PREFIX}/status`, { cache: "no-store" });
76
+ if (!response.ok) return;
77
+ const value = await response.json();
78
+ if (isFederationStatus(value)) setRealm(value);
79
+ }, []);
80
+ const engineEndpoint = realm?.engine.binding === "external" ? realm.engine.endpoint : void 0;
81
+ (0, import_react.useEffect)(() => {
82
+ if (!open) return;
83
+ void readRealm();
84
+ const realmTimer = window.setInterval(() => void readRealm(), 1e3);
85
+ return () => window.clearInterval(realmTimer);
86
+ }, [open, readRealm]);
87
+ (0, import_react.useEffect)(() => {
88
+ if (!open || engineEndpoint === void 0) return;
89
+ const pollTimer = window.setInterval(() => {
90
+ const target = iframe.current?.contentWindow;
91
+ if (target == null) return;
92
+ target.postMessage(
93
+ { protocol: FEDERATION_PROTOCOL_VERSION, kind: "forgeax-engine-poll" },
94
+ new URL(engineEndpoint).origin
95
+ );
96
+ }, 250);
97
+ const onMessage = (event) => {
98
+ if (event.source !== iframe.current?.contentWindow || !isEnginePreviewStatus(event.data))
99
+ return;
100
+ setEngine(event.data);
101
+ };
102
+ window.addEventListener("message", onMessage);
103
+ return () => {
104
+ window.clearInterval(pollTimer);
105
+ window.removeEventListener("message", onMessage);
106
+ };
107
+ }, [engineEndpoint, open]);
108
+ const control = () => {
109
+ if (realm?.engine.binding === "external") {
110
+ iframe.current?.contentWindow?.postMessage(
111
+ {
112
+ protocol: FEDERATION_PROTOCOL_VERSION,
113
+ kind: "forgeax-engine-control",
114
+ action: "toggle"
115
+ },
116
+ new URL(realm.engine.endpoint).origin
117
+ );
118
+ return;
119
+ }
120
+ void fetch(`${FEDERATION_ROUTE_PREFIX}/engine/control`, { method: "POST" }).then(
121
+ () => readRealm()
122
+ );
123
+ };
124
+ const projection = realm?.engine.binding === "external" ? engine : realm?.engine.binding === "embedded" ? realm.engine : void 0;
125
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
126
+ "section",
127
+ {
128
+ "data-forgeax-panel": "mounted",
129
+ style: {
130
+ position: "fixed",
131
+ right: 18,
132
+ bottom: 18,
133
+ zIndex: 100,
134
+ width: open ? 680 : 210,
135
+ border: "1px solid rgba(94, 234, 212, 0.42)",
136
+ borderRadius: 16,
137
+ overflow: "hidden",
138
+ color: "#e6fffb",
139
+ background: "rgba(5, 14, 25, 0.96)",
140
+ boxShadow: "0 24px 70px rgba(0, 0, 0, 0.55)",
141
+ pointerEvents: "auto",
142
+ fontFamily: "ui-sans-serif, system-ui, sans-serif"
143
+ },
144
+ children: [
145
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
146
+ "header",
147
+ {
148
+ style: {
149
+ display: "flex",
150
+ alignItems: "center",
151
+ justifyContent: "space-between",
152
+ padding: "11px 14px",
153
+ background: "linear-gradient(90deg, rgba(13,148,136,.28), rgba(37,99,235,.18))"
154
+ },
155
+ children: [
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
157
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", { style: { fontSize: 14 }, children: "ForgeaX Engine" }),
158
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
159
+ "span",
160
+ {
161
+ "data-forgeax-ready": realm?.ready === true ? "true" : "false",
162
+ style: {
163
+ marginLeft: 9,
164
+ color: realm?.ready === true ? "#5eead4" : "#fbbf24",
165
+ fontSize: 12
166
+ },
167
+ children: realm?.ready === true ? "\u25CF bridge ready" : "\u25CB connecting"
168
+ }
169
+ )
170
+ ] }),
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", { type: "button", onClick: () => setOpen((value) => !value), style: buttonStyle, children: open ? "Hide preview" : "Show preview" })
172
+ ]
173
+ }
174
+ ),
175
+ open ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: 12 }, children: [
176
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
177
+ "div",
178
+ {
179
+ "data-forgeax-status": "live",
180
+ style: {
181
+ display: "grid",
182
+ gridTemplateColumns: "repeat(4, 1fr)",
183
+ gap: 8,
184
+ marginBottom: 10
185
+ },
186
+ children: [
187
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Fact, { label: "binding", value: realm?.engine.binding ?? "pending" }),
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Fact, { label: "frameId", value: String(projection?.frameId ?? 0) }),
189
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Fact, { label: "tick", value: String(projection?.tick ?? 0) }),
190
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Fact, { label: "state", value: String(projection?.state ?? 0) })
191
+ ]
192
+ }
193
+ ),
194
+ engineEndpoint !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
195
+ "iframe",
196
+ {
197
+ ref: iframe,
198
+ "data-forgeax-engine-frame": "real",
199
+ src: engineEndpoint,
200
+ title: "Running ForgeaX Engine",
201
+ onLoad: () => {
202
+ iframe.current?.contentWindow?.postMessage(
203
+ { protocol: FEDERATION_PROTOCOL_VERSION, kind: "forgeax-engine-poll" },
204
+ new URL(engineEndpoint).origin
205
+ );
206
+ },
207
+ style: {
208
+ display: "block",
209
+ width: "100%",
210
+ height: 390,
211
+ border: "1px solid rgba(148,163,184,.25)",
212
+ borderRadius: 10,
213
+ background: "#020617"
214
+ }
215
+ }
216
+ ) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
217
+ "div",
218
+ {
219
+ "data-forgeax-headless": "true",
220
+ style: {
221
+ display: "grid",
222
+ placeItems: "center",
223
+ height: 180,
224
+ borderRadius: 10,
225
+ color: "#94a3b8",
226
+ background: "radial-gradient(circle at center, #123047, #020617 70%)"
227
+ },
228
+ children: "Embedded headless Engine \xB7 no placeholder pixels"
229
+ }
230
+ ),
231
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
232
+ "footer",
233
+ {
234
+ style: {
235
+ display: "flex",
236
+ alignItems: "center",
237
+ justifyContent: "space-between",
238
+ marginTop: 10
239
+ },
240
+ children: [
241
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { style: { color: "#94a3b8", fontSize: 12 }, children: [
242
+ "DSH native Loader \xB7 lease ",
243
+ realm?.leases ?? 0,
244
+ " \xB7 protocol ",
245
+ realm?.protocol ?? "\u2013"
246
+ ] }),
247
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
248
+ "button",
249
+ {
250
+ "data-forgeax-control": "toggle",
251
+ type: "button",
252
+ onClick: control,
253
+ style: buttonStyle,
254
+ children: "Toggle Engine state"
255
+ }
256
+ )
257
+ ]
258
+ }
259
+ )
260
+ ] }) : null
261
+ ]
262
+ }
263
+ );
264
+ }
265
+ function Fact({
266
+ label,
267
+ value
268
+ }) {
269
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: { padding: "7px 9px", borderRadius: 8, background: "rgba(15, 23, 42, .9)" }, children: [
270
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
271
+ "div",
272
+ {
273
+ style: {
274
+ color: "#64748b",
275
+ fontSize: 10,
276
+ textTransform: "uppercase",
277
+ letterSpacing: ".08em"
278
+ },
279
+ children: label
280
+ }
281
+ ),
282
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { color: "#f8fafc", fontSize: 13, fontVariantNumeric: "tabular-nums" }, children: value })
283
+ ] });
284
+ }
285
+ var buttonStyle = {
286
+ padding: "6px 10px",
287
+ border: "1px solid rgba(94,234,212,.35)",
288
+ borderRadius: 8,
289
+ color: "#ccfbf1",
290
+ background: "rgba(15,118,110,.25)",
291
+ cursor: "pointer",
292
+ fontSize: 12
293
+ };
294
+ return module.exports; } });
295
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.tsx","../src/protocol.ts"],"sourcesContent":["import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n type EnginePreviewStatus,\n FEDERATION_PROTOCOL_VERSION,\n FEDERATION_ROUTE_PREFIX,\n type FederationStatus,\n isEnginePreviewStatus,\n isFederationStatus,\n} from './protocol';\n\ninterface SlotService {\n inject(name: string, callback: () => () => void): void;\n register(options: Readonly<Record<string, unknown>>, component: React.ComponentType): () => void;\n}\n\ninterface ClientContext {\n readonly slots: SlotService;\n}\n\nexport const inject = ['slots'];\n\nexport function apply(ctx: ClientContext): void {\n ctx.slots.inject('shell.overlay', () =>\n ctx.slots.register(\n {\n name: 'shell.overlay',\n id: 'forgeax-engine',\n order: 80,\n label: 'ForgeaX Engine',\n },\n ForgeaXPanel,\n ),\n );\n}\n\nfunction ForgeaXPanel(): React.JSX.Element {\n const [open, setOpen] = useState(true);\n const [realm, setRealm] = useState<FederationStatus>();\n const [engine, setEngine] = useState<EnginePreviewStatus>();\n const iframe = useRef<HTMLIFrameElement>(null);\n\n const readRealm = useCallback(async (): Promise<void> => {\n const response = await fetch(`${FEDERATION_ROUTE_PREFIX}/status`, { cache: 'no-store' });\n if (!response.ok) return;\n const value: unknown = await response.json();\n if (isFederationStatus(value)) setRealm(value);\n }, []);\n\n const engineEndpoint = realm?.engine.binding === 'external' ? realm.engine.endpoint : undefined;\n\n useEffect(() => {\n if (!open) return;\n void readRealm();\n const realmTimer = window.setInterval(() => void readRealm(), 1_000);\n return () => window.clearInterval(realmTimer);\n }, [open, readRealm]);\n\n useEffect(() => {\n if (!open || engineEndpoint === undefined) return;\n const pollTimer = window.setInterval(() => {\n const target = iframe.current?.contentWindow;\n if (target == null) return;\n target.postMessage(\n { protocol: FEDERATION_PROTOCOL_VERSION, kind: 'forgeax-engine-poll' },\n new URL(engineEndpoint).origin,\n );\n }, 250);\n const onMessage = (event: MessageEvent): void => {\n if (event.source !== iframe.current?.contentWindow || !isEnginePreviewStatus(event.data))\n return;\n setEngine(event.data);\n };\n window.addEventListener('message', onMessage);\n return () => {\n window.clearInterval(pollTimer);\n window.removeEventListener('message', onMessage);\n };\n }, [engineEndpoint, open]);\n\n const control = (): void => {\n if (realm?.engine.binding === 'external') {\n iframe.current?.contentWindow?.postMessage(\n {\n protocol: FEDERATION_PROTOCOL_VERSION,\n kind: 'forgeax-engine-control',\n action: 'toggle',\n },\n new URL(realm.engine.endpoint).origin,\n );\n return;\n }\n void fetch(`${FEDERATION_ROUTE_PREFIX}/engine/control`, { method: 'POST' }).then(() =>\n readRealm(),\n );\n };\n\n const projection =\n realm?.engine.binding === 'external'\n ? engine\n : realm?.engine.binding === 'embedded'\n ? realm.engine\n : undefined;\n\n return (\n <section\n data-forgeax-panel=\"mounted\"\n style={{\n position: 'fixed',\n right: 18,\n bottom: 18,\n zIndex: 100,\n width: open ? 680 : 210,\n border: '1px solid rgba(94, 234, 212, 0.42)',\n borderRadius: 16,\n overflow: 'hidden',\n color: '#e6fffb',\n background: 'rgba(5, 14, 25, 0.96)',\n boxShadow: '0 24px 70px rgba(0, 0, 0, 0.55)',\n pointerEvents: 'auto',\n fontFamily: 'ui-sans-serif, system-ui, sans-serif',\n }}\n >\n <header\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '11px 14px',\n background: 'linear-gradient(90deg, rgba(13,148,136,.28), rgba(37,99,235,.18))',\n }}\n >\n <div>\n <strong style={{ fontSize: 14 }}>ForgeaX Engine</strong>\n <span\n data-forgeax-ready={realm?.ready === true ? 'true' : 'false'}\n style={{\n marginLeft: 9,\n color: realm?.ready === true ? '#5eead4' : '#fbbf24',\n fontSize: 12,\n }}\n >\n {realm?.ready === true ? '● bridge ready' : '○ connecting'}\n </span>\n </div>\n <button type=\"button\" onClick={() => setOpen((value) => !value)} style={buttonStyle}>\n {open ? 'Hide preview' : 'Show preview'}\n </button>\n </header>\n {open ? (\n <div style={{ padding: 12 }}>\n <div\n data-forgeax-status=\"live\"\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(4, 1fr)',\n gap: 8,\n marginBottom: 10,\n }}\n >\n <Fact label=\"binding\" value={realm?.engine.binding ?? 'pending'} />\n <Fact label=\"frameId\" value={String(projection?.frameId ?? 0)} />\n <Fact label=\"tick\" value={String(projection?.tick ?? 0)} />\n <Fact label=\"state\" value={String(projection?.state ?? 0)} />\n </div>\n {engineEndpoint !== undefined ? (\n <iframe\n ref={iframe}\n data-forgeax-engine-frame=\"real\"\n src={engineEndpoint}\n title=\"Running ForgeaX Engine\"\n onLoad={() => {\n iframe.current?.contentWindow?.postMessage(\n { protocol: FEDERATION_PROTOCOL_VERSION, kind: 'forgeax-engine-poll' },\n new URL(engineEndpoint).origin,\n );\n }}\n style={{\n display: 'block',\n width: '100%',\n height: 390,\n border: '1px solid rgba(148,163,184,.25)',\n borderRadius: 10,\n background: '#020617',\n }}\n />\n ) : (\n <div\n data-forgeax-headless=\"true\"\n style={{\n display: 'grid',\n placeItems: 'center',\n height: 180,\n borderRadius: 10,\n color: '#94a3b8',\n background: 'radial-gradient(circle at center, #123047, #020617 70%)',\n }}\n >\n Embedded headless Engine · no placeholder pixels\n </div>\n )}\n <footer\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 10,\n }}\n >\n <span style={{ color: '#94a3b8', fontSize: 12 }}>\n DSH native Loader · lease {realm?.leases ?? 0} · protocol {realm?.protocol ?? '–'}\n </span>\n <button\n data-forgeax-control=\"toggle\"\n type=\"button\"\n onClick={control}\n style={buttonStyle}\n >\n Toggle Engine state\n </button>\n </footer>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction Fact({\n label,\n value,\n}: {\n readonly label: string;\n readonly value: string;\n}): React.JSX.Element {\n return (\n <div style={{ padding: '7px 9px', borderRadius: 8, background: 'rgba(15, 23, 42, .9)' }}>\n <div\n style={{\n color: '#64748b',\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: '.08em',\n }}\n >\n {label}\n </div>\n <div style={{ color: '#f8fafc', fontSize: 13, fontVariantNumeric: 'tabular-nums' }}>\n {value}\n </div>\n </div>\n );\n}\n\nconst buttonStyle: React.CSSProperties = {\n padding: '6px 10px',\n border: '1px solid rgba(94,234,212,.35)',\n borderRadius: 8,\n color: '#ccfbf1',\n background: 'rgba(15,118,110,.25)',\n cursor: 'pointer',\n fontSize: 12,\n};\n","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"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "@forgeax/engine-dsh",
3
+ "version": "0.1.2",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "sideEffects": false,
8
+ "description": "Lifecycle-safe federation bridge between ForgeaX Engine and DeepSeek Harness.",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "default": "./dist/index.mjs"
14
+ },
15
+ "./engine-host": {
16
+ "types": "./dist/engine-host.d.ts",
17
+ "import": "./dist/engine-host.mjs"
18
+ },
19
+ "./engine-preview": {
20
+ "types": "./dist/engine-preview.d.ts",
21
+ "import": "./dist/engine-preview.mjs"
22
+ },
23
+ "./intelligence": {
24
+ "types": "./dist/intelligence.d.ts",
25
+ "import": "./dist/intelligence.mjs"
26
+ },
27
+ "./protocol": {
28
+ "types": "./dist/protocol.d.ts",
29
+ "import": "./dist/protocol.mjs"
30
+ },
31
+ "./client": {
32
+ "types": "./dist/client.d.ts",
33
+ "default": "./lib/client.js"
34
+ },
35
+ "./cordis.patch.yml": "./cordis.patch.yml",
36
+ "./package.json": "./package.json"
37
+ },
38
+ "main": "./dist/index.mjs",
39
+ "types": "./dist/index.d.ts",
40
+ "files": [
41
+ "dist",
42
+ "lib",
43
+ "cordis.patch.yml",
44
+ "README.md"
45
+ ],
46
+ "dsh": {
47
+ "bundle": {
48
+ "patch": "./cordis.patch.yml"
49
+ },
50
+ "client": {
51
+ "inject": [
52
+ "@deepseek-ai/dsh-client-runtime",
53
+ "@deepseek-ai/dsh-client-ui-layout"
54
+ ],
55
+ "platform": "web"
56
+ }
57
+ },
58
+ "dependencies": {
59
+ "@forgeax/engine-ecs": "0.1.2",
60
+ "@forgeax/engine-intelligence": "0.1.2",
61
+ "@forgeax/engine-plugin": "0.1.2",
62
+ "@forgeax/engine-types": "0.1.2"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^20.14.0",
66
+ "@types/react": "^19.2.17",
67
+ "playwright": "^1.56.1",
68
+ "react": "^19.2.7"
69
+ },
70
+ "forgeax": {
71
+ "metrics": {
72
+ "bundle-size": {
73
+ "enabled": true,
74
+ "path": "dist/engine-host.mjs",
75
+ "compression": "gzip"
76
+ },
77
+ "fps": {
78
+ "enabled": false,
79
+ "reason": "federation is an opt-in control-plane connector outside the frame loop"
80
+ },
81
+ "bench": {
82
+ "enabled": false,
83
+ "reason": "frame-path absence is checked by topology and opt-in integration probes"
84
+ },
85
+ "gate": {
86
+ "enabled": true,
87
+ "command": "pnpm --filter @forgeax/engine-dsh test"
88
+ },
89
+ "spike-report": {
90
+ "enabled": false,
91
+ "reason": "not a spike package"
92
+ }
93
+ }
94
+ },
95
+ "scripts": {
96
+ "build": "tsup",
97
+ "test": "vitest run",
98
+ "pretest:integration": "pnpm build",
99
+ "test:integration": "node scripts/verify-dsh-federation.mjs",
100
+ "pretest:visual": "pnpm build",
101
+ "test:visual": "node scripts/verify-dsh-web-ui.mjs"
102
+ }
103
+ }