@camstack/server 1.0.0 → 1.0.1

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 (234) hide show
  1. package/{src/agent-status-page.ts → dist/agent-status-page.js} +30 -45
  2. package/dist/api/addon-upload.js +441 -0
  3. package/dist/api/addons-custom.router.js +91 -0
  4. package/dist/api/auth-whoami.js +55 -0
  5. package/dist/api/bridge-addons.router.js +109 -0
  6. package/dist/api/capabilities.router.js +229 -0
  7. package/dist/api/core/addon-settings.router.js +117 -0
  8. package/dist/api/core/agents.router.js +73 -0
  9. package/dist/api/core/auth.router.js +286 -0
  10. package/dist/api/core/bulk-update-coordinator.js +229 -0
  11. package/dist/api/core/cap-providers.js +1124 -0
  12. package/dist/api/core/capabilities.router.js +138 -0
  13. package/dist/api/core/collection-preference.js +17 -0
  14. package/dist/api/core/event-bus-proxy.router.js +45 -0
  15. package/dist/api/core/hwaccel.router.js +91 -0
  16. package/dist/api/core/live-events.router.js +61 -0
  17. package/dist/api/core/logs.router.js +172 -0
  18. package/dist/api/core/notifications.router.js +67 -0
  19. package/dist/api/core/repl.router.js +35 -0
  20. package/dist/api/core/settings-backend.router.js +121 -0
  21. package/dist/api/core/stream-probe.router.js +58 -0
  22. package/dist/api/core/system-events.router.js +100 -0
  23. package/dist/api/health/health.routes.js +68 -0
  24. package/{src/api/oauth2/consent-page.ts → dist/api/oauth2/consent-page.js} +11 -20
  25. package/dist/api/oauth2/oauth2-routes.js +219 -0
  26. package/dist/api/trpc/cap-mount-helpers.js +194 -0
  27. package/dist/api/trpc/cap-route-error-formatter.js +133 -0
  28. package/dist/api/trpc/client-ip.js +147 -0
  29. package/dist/api/trpc/core-cap-bridge.js +115 -0
  30. package/dist/api/trpc/generated-cap-mounts.js +388 -0
  31. package/dist/api/trpc/generated-cap-routers.js +7635 -0
  32. package/dist/api/trpc/scope-access.js +93 -0
  33. package/dist/api/trpc/trpc.context.js +184 -0
  34. package/dist/api/trpc/trpc.middleware.js +139 -0
  35. package/dist/api/trpc/trpc.router.js +188 -0
  36. package/dist/auth/session-cookie.js +47 -0
  37. package/dist/boot/boot-config.js +241 -0
  38. package/dist/boot/integration-id-backfill.js +76 -0
  39. package/dist/boot/post-boot.service.js +85 -0
  40. package/dist/core/addon/addon-call-gateway.js +99 -0
  41. package/dist/core/addon/addon-package.service.js +1560 -0
  42. package/dist/core/addon/addon-registry.service.js +2739 -0
  43. package/{src/core/addon/addon-row-manifest.ts → dist/core/addon/addon-row-manifest.js} +5 -5
  44. package/dist/core/addon/addon-search.service.js +62 -0
  45. package/dist/core/addon/addon-settings-provider.js +102 -0
  46. package/dist/core/addon/addon.tokens.js +5 -0
  47. package/dist/core/addon-bridge/addon-bridge.service.js +145 -0
  48. package/dist/core/addon-pages/addon-pages.service.js +107 -0
  49. package/dist/core/addon-widgets/addon-widgets.service.js +120 -0
  50. package/dist/core/agent/agent-registry.service.js +477 -0
  51. package/dist/core/auth/auth.service.js +10 -0
  52. package/dist/core/capability/capability.service.js +58 -0
  53. package/dist/core/config/config.schema.js +7 -0
  54. package/dist/core/config/config.service.js +10 -0
  55. package/dist/core/events/event-bus.service.js +83 -0
  56. package/dist/core/feature/feature.service.js +10 -0
  57. package/dist/core/lifecycle/lifecycle-state-machine.js +6 -0
  58. package/dist/core/logging/log-ring-buffer.js +6 -0
  59. package/dist/core/logging/logging.service.js +130 -0
  60. package/dist/core/logging/scoped-logger.js +6 -0
  61. package/dist/core/moleculer/cap-call-fn.js +50 -0
  62. package/dist/core/moleculer/cap-route-authority.js +122 -0
  63. package/dist/core/moleculer/moleculer.service.js +898 -0
  64. package/dist/core/network/network-quality.service.js +7 -0
  65. package/dist/core/notification/notification-wrapper.service.js +33 -0
  66. package/dist/core/notification/toast-wrapper.service.js +25 -0
  67. package/dist/core/provider/provider.tokens.js +4 -0
  68. package/dist/core/repl/repl-engine.service.js +140 -0
  69. package/dist/core/storage/fs-storage-backend.js +6 -0
  70. package/dist/core/storage/storage-location-manager.js +6 -0
  71. package/dist/core/storage/storage.service.js +7 -0
  72. package/dist/core/streaming/stream-probe.service.js +209 -0
  73. package/dist/core/topology/topology-emitter.service.js +106 -0
  74. package/dist/launcher.js +325 -0
  75. package/dist/main.js +1098 -0
  76. package/dist/manual-boot.js +227 -0
  77. package/package.json +5 -1
  78. package/src/__tests__/addon-install-e2e.test.ts +0 -74
  79. package/src/__tests__/addon-pages-e2e.test.ts +0 -200
  80. package/src/__tests__/addon-route-session.test.ts +0 -17
  81. package/src/__tests__/addon-settings-router.spec.ts +0 -67
  82. package/src/__tests__/addon-upload.spec.ts +0 -475
  83. package/src/__tests__/agent-registry.spec.ts +0 -179
  84. package/src/__tests__/agent-status-page.spec.ts +0 -82
  85. package/src/__tests__/auth-session-cookie.test.ts +0 -48
  86. package/src/__tests__/bulk-update-coordinator.spec.ts +0 -303
  87. package/src/__tests__/cap-ownership-authority.spec.ts +0 -431
  88. package/src/__tests__/cap-providers/cap-providers-location-import.spec.ts +0 -206
  89. package/src/__tests__/cap-providers/cap-usage-graph.spec.ts +0 -37
  90. package/src/__tests__/cap-providers/compute-topology-categories.spec.ts +0 -110
  91. package/src/__tests__/cap-providers/integrations-delete-cascade.spec.ts +0 -292
  92. package/src/__tests__/cap-providers-bulk-update.spec.ts +0 -408
  93. package/src/__tests__/cap-route-adapter.spec.ts +0 -302
  94. package/src/__tests__/cap-routers/_meta.spec.ts +0 -199
  95. package/src/__tests__/cap-routers/addon-settings.router.spec.ts +0 -115
  96. package/src/__tests__/cap-routers/broker-routing.router.spec.ts +0 -177
  97. package/src/__tests__/cap-routers/cap-route-error-formatter.spec.ts +0 -125
  98. package/src/__tests__/cap-routers/capabilities-node.spec.ts +0 -68
  99. package/src/__tests__/cap-routers/device-link-overlay.spec.ts +0 -137
  100. package/src/__tests__/cap-routers/device-manager-aggregate.router.spec.ts +0 -194
  101. package/src/__tests__/cap-routers/harness.ts +0 -163
  102. package/src/__tests__/cap-routers/metrics-provider.router.spec.ts +0 -133
  103. package/src/__tests__/cap-routers/null-provider-guard.spec.ts +0 -64
  104. package/src/__tests__/cap-routers/pipeline-executor.router.spec.ts +0 -159
  105. package/src/__tests__/cap-routers/settings-store.router.spec.ts +0 -291
  106. package/src/__tests__/capability-e2e.test.ts +0 -384
  107. package/src/__tests__/cli-e2e.test.ts +0 -150
  108. package/src/__tests__/core-cap-bridge.spec.ts +0 -91
  109. package/src/__tests__/dev-bootstrap-shm-ring.spec.ts +0 -40
  110. package/src/__tests__/device-settings-contribution-dispatch.spec.ts +0 -280
  111. package/src/__tests__/embedded-deps-e2e.test.ts +0 -125
  112. package/src/__tests__/event-bus-proxy-router.spec.ts +0 -75
  113. package/src/__tests__/fixtures/mock-analysis-addon-a.ts +0 -37
  114. package/src/__tests__/fixtures/mock-analysis-addon-b.ts +0 -37
  115. package/src/__tests__/fixtures/mock-log-addon.ts +0 -37
  116. package/src/__tests__/fixtures/mock-storage-addon.ts +0 -40
  117. package/src/__tests__/framework-allowlist.spec.ts +0 -96
  118. package/src/__tests__/framework-installer-defer-restart.spec.ts +0 -165
  119. package/src/__tests__/https-e2e.test.ts +0 -124
  120. package/src/__tests__/lifecycle-e2e.test.ts +0 -189
  121. package/src/__tests__/live-events-subscription.spec.ts +0 -149
  122. package/src/__tests__/moleculer/uds-readiness.spec.ts +0 -150
  123. package/src/__tests__/moleculer/uds-topology.spec.ts +0 -418
  124. package/src/__tests__/moleculer/uds-unowned-call.spec.ts +0 -383
  125. package/src/__tests__/moleculer-register-node-idempotency.spec.ts +0 -273
  126. package/src/__tests__/native-cap-route.spec.ts +0 -427
  127. package/src/__tests__/oauth2-account-linking.spec.ts +0 -867
  128. package/src/__tests__/post-boot-restart.spec.ts +0 -161
  129. package/src/__tests__/singleton-contention.test.ts +0 -499
  130. package/src/__tests__/streaming-diagnostic.test.ts +0 -615
  131. package/src/__tests__/streaming-scale.test.ts +0 -314
  132. package/src/__tests__/uds-addon-call-wiring.spec.ts +0 -242
  133. package/src/__tests__/uds-log-ingest.spec.ts +0 -183
  134. package/src/api/__tests__/addons-custom.spec.ts +0 -148
  135. package/src/api/__tests__/capabilities.router.test.ts +0 -56
  136. package/src/api/addon-upload.ts +0 -529
  137. package/src/api/addons-custom.router.ts +0 -101
  138. package/src/api/auth-whoami.ts +0 -101
  139. package/src/api/bridge-addons.router.ts +0 -122
  140. package/src/api/capabilities.router.ts +0 -265
  141. package/src/api/core/__tests__/auth-router-totp.spec.ts +0 -297
  142. package/src/api/core/__tests__/integration-markers.spec.ts +0 -10
  143. package/src/api/core/addon-settings.router.ts +0 -127
  144. package/src/api/core/agents.router.ts +0 -86
  145. package/src/api/core/auth.router.ts +0 -322
  146. package/src/api/core/bulk-update-coordinator.ts +0 -305
  147. package/src/api/core/cap-providers.ts +0 -1339
  148. package/src/api/core/capabilities.router.ts +0 -149
  149. package/src/api/core/collection-preference.ts +0 -40
  150. package/src/api/core/event-bus-proxy.router.ts +0 -45
  151. package/src/api/core/hwaccel.router.ts +0 -108
  152. package/src/api/core/live-events.router.ts +0 -67
  153. package/src/api/core/logs.router.ts +0 -195
  154. package/src/api/core/notifications.router.ts +0 -66
  155. package/src/api/core/repl.router.ts +0 -39
  156. package/src/api/core/settings-backend.router.ts +0 -140
  157. package/src/api/core/stream-probe.router.ts +0 -57
  158. package/src/api/core/system-events.router.ts +0 -125
  159. package/src/api/health/health.routes.ts +0 -117
  160. package/src/api/oauth2/__tests__/oauth2-routes.spec.ts +0 -62
  161. package/src/api/oauth2/oauth2-routes.ts +0 -281
  162. package/src/api/trpc/__tests__/client-ip.spec.ts +0 -146
  163. package/src/api/trpc/__tests__/scope-access-device.spec.ts +0 -268
  164. package/src/api/trpc/__tests__/scope-access.spec.ts +0 -102
  165. package/src/api/trpc/__tests__/webrtc-session-ua-enrich.spec.ts +0 -136
  166. package/src/api/trpc/cap-mount-helpers.ts +0 -245
  167. package/src/api/trpc/cap-route-error-formatter.ts +0 -171
  168. package/src/api/trpc/client-ip.ts +0 -147
  169. package/src/api/trpc/core-cap-bridge.ts +0 -154
  170. package/src/api/trpc/generated-cap-mounts.ts +0 -1240
  171. package/src/api/trpc/generated-cap-routers.ts +0 -11523
  172. package/src/api/trpc/scope-access.ts +0 -110
  173. package/src/api/trpc/trpc.context.ts +0 -258
  174. package/src/api/trpc/trpc.middleware.ts +0 -146
  175. package/src/api/trpc/trpc.router.ts +0 -389
  176. package/src/auth/session-cookie.ts +0 -54
  177. package/src/boot/__tests__/integration-id-backfill.spec.ts +0 -131
  178. package/src/boot/boot-config.ts +0 -259
  179. package/src/boot/integration-id-backfill.ts +0 -109
  180. package/src/boot/post-boot.service.ts +0 -105
  181. package/src/core/addon/__tests__/addon-registry-capability.test.ts +0 -62
  182. package/src/core/addon/__tests__/addon-row-manifest.spec.ts +0 -62
  183. package/src/core/addon/addon-call-gateway.ts +0 -171
  184. package/src/core/addon/addon-package.service.ts +0 -1787
  185. package/src/core/addon/addon-registry.service.ts +0 -3130
  186. package/src/core/addon/addon-search.service.ts +0 -91
  187. package/src/core/addon/addon-settings-provider.ts +0 -220
  188. package/src/core/addon/addon.tokens.ts +0 -2
  189. package/src/core/addon-bridge/addon-bridge.service.ts +0 -130
  190. package/src/core/addon-pages/addon-pages.service.spec.ts +0 -117
  191. package/src/core/addon-pages/addon-pages.service.ts +0 -82
  192. package/src/core/addon-widgets/addon-widgets.service.ts +0 -95
  193. package/src/core/agent/agent-registry.service.ts +0 -529
  194. package/src/core/auth/auth.service.spec.ts +0 -86
  195. package/src/core/auth/auth.service.ts +0 -8
  196. package/src/core/capability/capability.service.ts +0 -66
  197. package/src/core/config/config.schema.ts +0 -3
  198. package/src/core/config/config.service.spec.ts +0 -175
  199. package/src/core/config/config.service.ts +0 -7
  200. package/src/core/events/event-bus.service.spec.ts +0 -235
  201. package/src/core/events/event-bus.service.ts +0 -89
  202. package/src/core/feature/feature.service.spec.ts +0 -99
  203. package/src/core/feature/feature.service.ts +0 -8
  204. package/src/core/lifecycle/lifecycle-state-machine.spec.ts +0 -166
  205. package/src/core/lifecycle/lifecycle-state-machine.ts +0 -3
  206. package/src/core/logging/log-ring-buffer.ts +0 -3
  207. package/src/core/logging/logging.service.spec.ts +0 -287
  208. package/src/core/logging/logging.service.ts +0 -143
  209. package/src/core/logging/scoped-logger.ts +0 -3
  210. package/src/core/moleculer/cap-call-fn.spec.ts +0 -173
  211. package/src/core/moleculer/cap-call-fn.ts +0 -107
  212. package/src/core/moleculer/cap-route-authority.ts +0 -194
  213. package/src/core/moleculer/moleculer.service.ts +0 -1072
  214. package/src/core/network/network-quality.service.spec.ts +0 -53
  215. package/src/core/network/network-quality.service.ts +0 -5
  216. package/src/core/notification/notification-wrapper.service.ts +0 -34
  217. package/src/core/notification/toast-wrapper.service.ts +0 -27
  218. package/src/core/provider/provider.tokens.ts +0 -1
  219. package/src/core/repl/repl-engine.service.spec.ts +0 -444
  220. package/src/core/repl/repl-engine.service.ts +0 -155
  221. package/src/core/storage/fs-storage-backend.spec.ts +0 -70
  222. package/src/core/storage/fs-storage-backend.ts +0 -3
  223. package/src/core/storage/storage-location-manager.spec.ts +0 -130
  224. package/src/core/storage/storage-location-manager.ts +0 -3
  225. package/src/core/storage/storage.service.spec.ts +0 -73
  226. package/src/core/storage/storage.service.ts +0 -3
  227. package/src/core/streaming/stream-probe.service.ts +0 -221
  228. package/src/core/topology/topology-emitter.service.ts +0 -105
  229. package/src/launcher.ts +0 -314
  230. package/src/main.ts +0 -1245
  231. package/src/manual-boot.ts +0 -301
  232. package/tsconfig.build.json +0 -8
  233. package/tsconfig.json +0 -33
  234. package/vitest.config.ts +0 -26
@@ -1,301 +0,0 @@
1
- /**
2
- * Boot — constructs every service by hand in dependency order, runs
3
- * `onModuleInit` hooks in sequence, and exposes a `BootedApp` facade
4
- * around the Fastify instance. This is the only boot path; NestJS was
5
- * removed to drop the accidental DI layer on top of an already-explicit
6
- * dependency graph.
7
- */
8
-
9
- import Fastify from 'fastify'
10
- import type { FastifyInstance } from 'fastify'
11
- import type { InfraContext } from './boot/boot-config'
12
-
13
- import { ConfigService } from './core/config/config.service'
14
- import { LoggingService } from './core/logging/logging.service'
15
- import { EventBusService } from './core/events/event-bus.service'
16
- import { StorageService } from './core/storage/storage.service'
17
- import { CapabilityService } from './core/capability/capability.service'
18
- import { FeatureService } from './core/feature/feature.service'
19
- import { AuthService } from './core/auth/auth.service'
20
- import { StreamProbeService } from './core/streaming/stream-probe.service'
21
- import { NetworkQualityService } from './core/network/network-quality.service'
22
- import { ToastServiceWrapper } from './core/notification/toast-wrapper.service'
23
- import { NotificationServiceWrapper } from './core/notification/notification-wrapper.service'
24
- import { AddonPagesService } from './core/addon-pages/addon-pages.service'
25
- import { AddonWidgetsService } from './core/addon-widgets/addon-widgets.service'
26
- import { AddonBridgeService } from './core/addon-bridge/addon-bridge.service'
27
- import { MoleculerService } from './core/moleculer/moleculer.service'
28
- import { AgentRegistryService } from './core/agent/agent-registry.service'
29
- import { AddonRegistryService } from './core/addon/addon-registry.service'
30
- import { AddonSearchService } from './core/addon/addon-search.service'
31
- import { AddonPackageService } from './core/addon/addon-package.service'
32
- import { ReplEngineService } from './core/repl/repl-engine.service'
33
- import { TopologyEmitterService } from './core/topology/topology-emitter.service'
34
- import { PostBootService } from './boot/post-boot.service'
35
-
36
- // ---------------------------------------------------------------------------
37
- // Types
38
- // ---------------------------------------------------------------------------
39
-
40
- type AnyCtor<T> = abstract new (...args: never[]) => T
41
-
42
- export interface BootedApp {
43
- /** Resolve a service by its constructor. Throws if unregistered. */
44
- get<T>(ctor: AnyCtor<T>): T
45
- /** Returns the Fastify instance for plugin registration. */
46
- getHttpAdapter(): { getInstance(): FastifyInstance }
47
- /** Register a permissive CORS hook (allow all origins). */
48
- enableCors(): void
49
- /** Register SIGTERM/SIGINT → close() for graceful shutdown. */
50
- enableShutdownHooks(): void
51
- /** Run OnModuleInit hooks in the order Nest's dependency graph produces. */
52
- init(): Promise<void>
53
- /** Start the Fastify HTTP server. */
54
- listen(port: number, host: string): Promise<void>
55
- /** Run OnModuleDestroy hooks in reverse init order, then close Fastify. */
56
- close(): Promise<void>
57
- }
58
-
59
- interface BootOptions {
60
- infra: InfraContext
61
- fastifyOpts: Record<string, unknown>
62
- }
63
-
64
- // ---------------------------------------------------------------------------
65
- // Service container — narrowing via `instanceof`, no casts.
66
- // ---------------------------------------------------------------------------
67
-
68
- class ServiceContainer {
69
- private readonly services = new Map<unknown, unknown>()
70
-
71
- register<T extends object>(ctor: AnyCtor<T>, instance: T): void {
72
- this.services.set(ctor, instance)
73
- }
74
-
75
- get<T>(ctor: AnyCtor<T>): T {
76
- const inst = this.services.get(ctor)
77
- if (inst === undefined) {
78
- throw new Error(`ServiceContainer: ${ctor.name} is not registered`)
79
- }
80
- if (!(inst instanceof ctor)) {
81
- throw new Error(`ServiceContainer: ${ctor.name} instance type mismatch at resolve time`)
82
- }
83
- return inst
84
- }
85
- }
86
-
87
- // ---------------------------------------------------------------------------
88
- // Manual boot
89
- // ---------------------------------------------------------------------------
90
-
91
- export async function bootManual(opts: BootOptions): Promise<BootedApp> {
92
- const { infra, fastifyOpts } = opts
93
- void infra // infraContext is consumed by main.ts directly (locationManager, etc.)
94
-
95
- const configPath = process.env.CONFIG_PATH ?? 'camstack-data/config.yaml'
96
-
97
- // ---- Layer 0: services with no service deps -----------------------------
98
- const configService = new ConfigService(configPath)
99
- const storageService = new StorageService()
100
- const capabilityService = new CapabilityService()
101
- const networkQualityService = new NetworkQualityService()
102
- const toastWrapper = new ToastServiceWrapper()
103
-
104
- // ---- Layer 1: need ConfigService / LoggingService -----------------------
105
- const loggingService = new LoggingService(configService)
106
- const eventBusService = new EventBusService(configService)
107
- // Wire device-name cache for log formatter — subscribes here so the
108
- // very first DeviceRegistered event populates the cache before any
109
- // log line needing `deviceName` is emitted.
110
- loggingService.attachDeviceNameStream(eventBusService)
111
- const featureService = new FeatureService(configService)
112
- const authService = new AuthService(configService)
113
- const streamProbeService = new StreamProbeService(loggingService)
114
- const addonBridgeService = new AddonBridgeService(loggingService)
115
- const addonSearchService = new AddonSearchService(loggingService)
116
-
117
- // ---- Layer 2: need Layer 0/1 -------------------------------------------
118
- const notificationWrapper = new NotificationServiceWrapper(capabilityService, loggingService)
119
- const addonPagesService = new AddonPagesService(loggingService, configService, capabilityService)
120
- const moleculerService = new MoleculerService(
121
- eventBusService,
122
- configService,
123
- loggingService,
124
- capabilityService,
125
- streamProbeService,
126
- )
127
-
128
- // ---- Layer 3: need Moleculer / AddonRegistry ---------------------------
129
- const agentRegistryService = new AgentRegistryService(
130
- eventBusService,
131
- moleculerService,
132
- capabilityService,
133
- )
134
- const addonRegistryService = new AddonRegistryService(
135
- loggingService,
136
- eventBusService,
137
- configService,
138
- storageService,
139
- capabilityService,
140
- moleculerService,
141
- streamProbeService,
142
- )
143
- // AgentRegistryService needs the hub addon registry for placement-based
144
- // reconciliation, but is constructed first (it has no other dependency
145
- // on AddonRegistryService) — wire it post-construction.
146
- agentRegistryService.setAddonRegistry(addonRegistryService)
147
-
148
- // ---- Layer 4: need AddonRegistry ---------------------------------------
149
- // AddonWidgetsService — needs AddonRegistryService for the bundled-addon
150
- // dist sub-folder lookup (see service docstring).
151
- const addonWidgetsService = new AddonWidgetsService(
152
- loggingService,
153
- capabilityService,
154
- addonRegistryService,
155
- )
156
- const addonPackageService = new AddonPackageService(
157
- loggingService,
158
- eventBusService,
159
- configService,
160
- addonRegistryService,
161
- notificationWrapper,
162
- toastWrapper,
163
- )
164
- const replEngineService = new ReplEngineService(
165
- addonRegistryService,
166
- eventBusService,
167
- loggingService,
168
- )
169
- const topologyEmitterService = new TopologyEmitterService(
170
- eventBusService,
171
- agentRegistryService,
172
- addonRegistryService,
173
- )
174
- const postBootService = new PostBootService(addonRegistryService, eventBusService, loggingService)
175
-
176
- // ---- Container ---------------------------------------------------------
177
- const container = new ServiceContainer()
178
- container.register(ConfigService, configService)
179
- container.register(LoggingService, loggingService)
180
- container.register(EventBusService, eventBusService)
181
- container.register(StorageService, storageService)
182
- container.register(CapabilityService, capabilityService)
183
- container.register(FeatureService, featureService)
184
- container.register(AuthService, authService)
185
- container.register(StreamProbeService, streamProbeService)
186
- container.register(NetworkQualityService, networkQualityService)
187
- container.register(ToastServiceWrapper, toastWrapper)
188
- container.register(NotificationServiceWrapper, notificationWrapper)
189
- container.register(AddonPagesService, addonPagesService)
190
- container.register(AddonWidgetsService, addonWidgetsService)
191
- container.register(AddonBridgeService, addonBridgeService)
192
- container.register(MoleculerService, moleculerService)
193
- container.register(AgentRegistryService, agentRegistryService)
194
- container.register(AddonRegistryService, addonRegistryService)
195
- container.register(AddonSearchService, addonSearchService)
196
- container.register(AddonPackageService, addonPackageService)
197
- container.register(ReplEngineService, replEngineService)
198
- container.register(TopologyEmitterService, topologyEmitterService)
199
- container.register(PostBootService, postBootService)
200
-
201
- // ---- Fastify instance --------------------------------------------------
202
- const fastify = Fastify(fastifyOpts)
203
-
204
- // /health and /health/* — registered in `main.ts` via
205
- // `registerHealthRoutes` once MoleculerService + AgentRegistryService are
206
- // available. The detailed shape is shared with each agent's `/health`
207
- // (see `packages/agent/src/agent-http.ts`).
208
-
209
- // ---- Shutdown coordination --------------------------------------------
210
- let closed = false
211
- let shutdownHooksRegistered = false
212
-
213
- const close = async (): Promise<void> => {
214
- if (closed) return
215
- closed = true
216
- const logErr = (label: string, err: unknown): void => {
217
- console.error(`[manual-boot] ${label} destroy failed:`, err)
218
- }
219
- try {
220
- topologyEmitterService.onModuleDestroy()
221
- } catch (err) {
222
- logErr('TopologyEmitter', err)
223
- }
224
- try {
225
- await addonRegistryService.onModuleDestroy()
226
- } catch (err) {
227
- logErr('AddonRegistry', err)
228
- }
229
- try {
230
- await addonBridgeService.onModuleDestroy()
231
- } catch (err) {
232
- logErr('AddonBridge', err)
233
- }
234
- try {
235
- await moleculerService.onModuleDestroy()
236
- } catch (err) {
237
- logErr('Moleculer', err)
238
- }
239
- try {
240
- await fastify.close()
241
- } catch (err) {
242
- logErr('Fastify', err)
243
- }
244
- }
245
-
246
- return {
247
- get<T>(ctor: AnyCtor<T>): T {
248
- return container.get(ctor)
249
- },
250
- getHttpAdapter() {
251
- return { getInstance: () => fastify }
252
- },
253
- enableCors() {
254
- fastify.addHook('onRequest', async (request, reply) => {
255
- reply.header('access-control-allow-origin', '*')
256
- reply.header('access-control-allow-methods', 'GET,POST,PUT,DELETE,OPTIONS,PATCH')
257
- reply.header('access-control-allow-headers', 'content-type,authorization')
258
- if (request.method === 'OPTIONS') {
259
- reply.status(204).send()
260
- }
261
- })
262
- },
263
- enableShutdownHooks() {
264
- if (shutdownHooksRegistered) return
265
- shutdownHooksRegistered = true
266
- const handler = (): void => {
267
- close().catch((err) => {
268
- console.error('[manual-boot] shutdown close failed:', err)
269
- })
270
- }
271
- process.once('SIGTERM', handler)
272
- process.once('SIGINT', handler)
273
- },
274
- async init() {
275
- // Init order (dependency-graph-derived):
276
- // 1. MoleculerService — starts broker and calls EventBus.attachBroker()
277
- // 2. AddonBridgeService — no cross-service deps
278
- // 3. AgentRegistryService — subscribes to broker.localBus.on('$node.connected')
279
- // 4. AddonRegistryService — boots every addon (needs broker live + config)
280
- await moleculerService.onModuleInit()
281
- await addonBridgeService.onModuleInit()
282
- agentRegistryService.onModuleInit()
283
- await addonRegistryService.onModuleInit()
284
- // Reconcile already-connected agents now that the hub's installed
285
- // addon set is populated. Agents online before the hub started never
286
- // fire a fresh `$node.connected` event, so the per-connect trigger
287
- // alone would miss them — this catches the boot-time case (e.g. a
288
- // long-running dev-agent with a now-stale addon). Fire-and-forget so
289
- // an unreachable agent never delays boot.
290
- void agentRegistryService.reconcileConnectedAgents()
291
- // Topology emitter must boot AFTER AgentRegistry + AddonRegistry —
292
- // its initial snapshot reads both. Subscribes to lifecycle events
293
- // for incremental snapshots and emits a periodic safety net.
294
- topologyEmitterService.onModuleInit()
295
- },
296
- async listen(port, host) {
297
- await fastify.listen({ port, host })
298
- },
299
- close,
300
- }
301
- }
@@ -1,8 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "rootDir": "src"
5
- },
6
- "include": ["src"],
7
- "exclude": ["src/scripts", "src/__tests__", "src/**/__tests__", "src/**/*.spec.ts", "src/**/*.test.ts"]
8
- }
package/tsconfig.json DELETED
@@ -1,33 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": {
4
- "target": "ES2023",
5
- "module": "CommonJS",
6
- "moduleResolution": "node",
7
- "lib": [
8
- "ES2023"
9
- ],
10
- "strict": true,
11
- "esModuleInterop": true,
12
- "experimentalDecorators": true,
13
- "emitDecoratorMetadata": true,
14
- "declaration": false,
15
- "resolveJsonModule": true,
16
- "skipLibCheck": true,
17
- "types": [
18
- "node"
19
- ],
20
- "baseUrl": "../..",
21
- "ignoreDeprecations": "6.0",
22
- "noEmit": true
23
- },
24
- "include": [
25
- "src"
26
- ],
27
- "exclude": [
28
- "src/scripts",
29
- "src/**/__tests__",
30
- "src/**/*.spec.ts",
31
- "src/**/*.test.ts"
32
- ]
33
- }
package/vitest.config.ts DELETED
@@ -1,26 +0,0 @@
1
- import { defineConfig } from 'vitest/config'
2
- import swc from 'unplugin-swc'
3
-
4
- export default defineConfig({
5
- test: {
6
- globals: true,
7
- root: './src',
8
- // Use threads pool (default) - inherits env vars
9
- fileParallelism: false,
10
- // Exclude e2e/smoke tests — they boot the full server and hang in CI
11
- exclude: [
12
- '**/*.e2e.test.ts',
13
- '**/*e2e*.test.ts',
14
- '**/*smoke*.test.ts',
15
- '**/*diagnostic*.test.ts',
16
- '**/*scale*.test.ts',
17
- '**/node_modules/**',
18
- ],
19
- testTimeout: 30_000,
20
- teardownTimeout: 5_000,
21
- hookTimeout: 10_000,
22
- // Use forks pool to isolate tests in separate processes (prevents hanging from open handles)
23
- pool: 'forks',
24
- },
25
- plugins: [swc.vite({ module: { type: 'es6' } })],
26
- })