agenshield 0.1.0

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 (184) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +201 -0
  3. package/README.md +91 -0
  4. package/package.json +61 -0
  5. package/src/cli.d.ts +25 -0
  6. package/src/cli.d.ts.map +1 -0
  7. package/src/cli.js +78 -0
  8. package/src/cli.js.map +1 -0
  9. package/src/commands/daemon.d.ts +11 -0
  10. package/src/commands/daemon.d.ts.map +1 -0
  11. package/src/commands/daemon.js +107 -0
  12. package/src/commands/daemon.js.map +1 -0
  13. package/src/commands/dev.d.ts +15 -0
  14. package/src/commands/dev.d.ts.map +1 -0
  15. package/src/commands/dev.js +387 -0
  16. package/src/commands/dev.js.map +1 -0
  17. package/src/commands/doctor.d.ts +11 -0
  18. package/src/commands/doctor.d.ts.map +1 -0
  19. package/src/commands/doctor.js +129 -0
  20. package/src/commands/doctor.js.map +1 -0
  21. package/src/commands/index.d.ts +12 -0
  22. package/src/commands/index.d.ts.map +1 -0
  23. package/src/commands/index.js +12 -0
  24. package/src/commands/index.js.map +1 -0
  25. package/src/commands/setup.d.ts +13 -0
  26. package/src/commands/setup.d.ts.map +1 -0
  27. package/src/commands/setup.js +203 -0
  28. package/src/commands/setup.js.map +1 -0
  29. package/src/commands/status.d.ts +11 -0
  30. package/src/commands/status.d.ts.map +1 -0
  31. package/src/commands/status.js +63 -0
  32. package/src/commands/status.js.map +1 -0
  33. package/src/commands/uninstall.d.ts +11 -0
  34. package/src/commands/uninstall.d.ts.map +1 -0
  35. package/src/commands/uninstall.js +164 -0
  36. package/src/commands/uninstall.js.map +1 -0
  37. package/src/detect/index.d.ts +9 -0
  38. package/src/detect/index.d.ts.map +1 -0
  39. package/src/detect/index.js +9 -0
  40. package/src/detect/index.js.map +1 -0
  41. package/src/dev-tui/DevApp.d.ts +13 -0
  42. package/src/dev-tui/DevApp.d.ts.map +1 -0
  43. package/src/dev-tui/DevApp.js +118 -0
  44. package/src/dev-tui/DevApp.js.map +1 -0
  45. package/src/dev-tui/DevSetupApp.d.ts +22 -0
  46. package/src/dev-tui/DevSetupApp.d.ts.map +1 -0
  47. package/src/dev-tui/DevSetupApp.js +407 -0
  48. package/src/dev-tui/DevSetupApp.js.map +1 -0
  49. package/src/dev-tui/components/ActionMenu.d.ts +11 -0
  50. package/src/dev-tui/components/ActionMenu.d.ts.map +1 -0
  51. package/src/dev-tui/components/ActionMenu.js +25 -0
  52. package/src/dev-tui/components/ActionMenu.js.map +1 -0
  53. package/src/dev-tui/components/ActionResult.d.ts +12 -0
  54. package/src/dev-tui/components/ActionResult.d.ts.map +1 -0
  55. package/src/dev-tui/components/ActionResult.js +27 -0
  56. package/src/dev-tui/components/ActionResult.js.map +1 -0
  57. package/src/dev-tui/components/DevConfirm.d.ts +22 -0
  58. package/src/dev-tui/components/DevConfirm.d.ts.map +1 -0
  59. package/src/dev-tui/components/DevConfirm.js +73 -0
  60. package/src/dev-tui/components/DevConfirm.js.map +1 -0
  61. package/src/dev-tui/components/DevModeSelect.d.ts +12 -0
  62. package/src/dev-tui/components/DevModeSelect.d.ts.map +1 -0
  63. package/src/dev-tui/components/DevModeSelect.js +69 -0
  64. package/src/dev-tui/components/DevModeSelect.js.map +1 -0
  65. package/src/dev-tui/components/LogViewer.d.ts +11 -0
  66. package/src/dev-tui/components/LogViewer.d.ts.map +1 -0
  67. package/src/dev-tui/components/LogViewer.js +18 -0
  68. package/src/dev-tui/components/LogViewer.js.map +1 -0
  69. package/src/dev-tui/components/PathPrompt.d.ts +13 -0
  70. package/src/dev-tui/components/PathPrompt.d.ts.map +1 -0
  71. package/src/dev-tui/components/PathPrompt.js +48 -0
  72. package/src/dev-tui/components/PathPrompt.js.map +1 -0
  73. package/src/dev-tui/components/StatusBar.d.ts +13 -0
  74. package/src/dev-tui/components/StatusBar.d.ts.map +1 -0
  75. package/src/dev-tui/components/StatusBar.js +36 -0
  76. package/src/dev-tui/components/StatusBar.js.map +1 -0
  77. package/src/dev-tui/index.d.ts +7 -0
  78. package/src/dev-tui/index.d.ts.map +1 -0
  79. package/src/dev-tui/index.js +5 -0
  80. package/src/dev-tui/index.js.map +1 -0
  81. package/src/dev-tui/runner.d.ts +17 -0
  82. package/src/dev-tui/runner.d.ts.map +1 -0
  83. package/src/dev-tui/runner.js +53 -0
  84. package/src/dev-tui/runner.js.map +1 -0
  85. package/src/dev-tui/state.d.ts +34 -0
  86. package/src/dev-tui/state.d.ts.map +1 -0
  87. package/src/dev-tui/state.js +77 -0
  88. package/src/dev-tui/state.js.map +1 -0
  89. package/src/index.d.ts +15 -0
  90. package/src/index.d.ts.map +1 -0
  91. package/src/index.js +19 -0
  92. package/src/index.js.map +1 -0
  93. package/src/setup-server/index.d.ts +8 -0
  94. package/src/setup-server/index.d.ts.map +1 -0
  95. package/src/setup-server/index.js +7 -0
  96. package/src/setup-server/index.js.map +1 -0
  97. package/src/setup-server/routes.d.ts +22 -0
  98. package/src/setup-server/routes.d.ts.map +1 -0
  99. package/src/setup-server/routes.js +279 -0
  100. package/src/setup-server/routes.js.map +1 -0
  101. package/src/setup-server/server.d.ts +16 -0
  102. package/src/setup-server/server.d.ts.map +1 -0
  103. package/src/setup-server/server.js +125 -0
  104. package/src/setup-server/server.js.map +1 -0
  105. package/src/setup-server/sse.d.ts +31 -0
  106. package/src/setup-server/sse.d.ts.map +1 -0
  107. package/src/setup-server/sse.js +76 -0
  108. package/src/setup-server/sse.js.map +1 -0
  109. package/src/setup-server/static.d.ts +11 -0
  110. package/src/setup-server/static.d.ts.map +1 -0
  111. package/src/setup-server/static.js +33 -0
  112. package/src/setup-server/static.js.map +1 -0
  113. package/src/utils/daemon.d.ts +63 -0
  114. package/src/utils/daemon.d.ts.map +1 -0
  115. package/src/utils/daemon.js +377 -0
  116. package/src/utils/daemon.js.map +1 -0
  117. package/src/utils/find-test-harness.d.ts +5 -0
  118. package/src/utils/find-test-harness.d.ts.map +1 -0
  119. package/src/utils/find-test-harness.js +23 -0
  120. package/src/utils/find-test-harness.js.map +1 -0
  121. package/src/utils/index.d.ts +8 -0
  122. package/src/utils/index.d.ts.map +1 -0
  123. package/src/utils/index.js +8 -0
  124. package/src/utils/index.js.map +1 -0
  125. package/src/utils/privileges.d.ts +51 -0
  126. package/src/utils/privileges.d.ts.map +1 -0
  127. package/src/utils/privileges.js +125 -0
  128. package/src/utils/privileges.js.map +1 -0
  129. package/src/utils/sudo-env.d.ts +27 -0
  130. package/src/utils/sudo-env.d.ts.map +1 -0
  131. package/src/utils/sudo-env.js +63 -0
  132. package/src/utils/sudo-env.js.map +1 -0
  133. package/src/wizard/App.d.ts +6 -0
  134. package/src/wizard/App.d.ts.map +1 -0
  135. package/src/wizard/App.js +215 -0
  136. package/src/wizard/App.js.map +1 -0
  137. package/src/wizard/Uninstall.d.ts +16 -0
  138. package/src/wizard/Uninstall.d.ts.map +1 -0
  139. package/src/wizard/Uninstall.js +163 -0
  140. package/src/wizard/Uninstall.js.map +1 -0
  141. package/src/wizard/components/AdvancedConfig.d.ts +42 -0
  142. package/src/wizard/components/AdvancedConfig.d.ts.map +1 -0
  143. package/src/wizard/components/AdvancedConfig.js +131 -0
  144. package/src/wizard/components/AdvancedConfig.js.map +1 -0
  145. package/src/wizard/components/Confirm.d.ts +31 -0
  146. package/src/wizard/components/Confirm.d.ts.map +1 -0
  147. package/src/wizard/components/Confirm.js +148 -0
  148. package/src/wizard/components/Confirm.js.map +1 -0
  149. package/src/wizard/components/Header.d.ts +6 -0
  150. package/src/wizard/components/Header.d.ts.map +1 -0
  151. package/src/wizard/components/Header.js +11 -0
  152. package/src/wizard/components/Header.js.map +1 -0
  153. package/src/wizard/components/ModeSelect.d.ts +12 -0
  154. package/src/wizard/components/ModeSelect.d.ts.map +1 -0
  155. package/src/wizard/components/ModeSelect.js +74 -0
  156. package/src/wizard/components/ModeSelect.js.map +1 -0
  157. package/src/wizard/components/PasscodeSetup.d.ts +16 -0
  158. package/src/wizard/components/PasscodeSetup.d.ts.map +1 -0
  159. package/src/wizard/components/PasscodeSetup.js +119 -0
  160. package/src/wizard/components/PasscodeSetup.js.map +1 -0
  161. package/src/wizard/components/ProgressBar.d.ts +12 -0
  162. package/src/wizard/components/ProgressBar.d.ts.map +1 -0
  163. package/src/wizard/components/ProgressBar.js +18 -0
  164. package/src/wizard/components/ProgressBar.js.map +1 -0
  165. package/src/wizard/components/StepList.d.ts +12 -0
  166. package/src/wizard/components/StepList.d.ts.map +1 -0
  167. package/src/wizard/components/StepList.js +37 -0
  168. package/src/wizard/components/StepList.js.map +1 -0
  169. package/src/wizard/components/Summary.d.ts +12 -0
  170. package/src/wizard/components/Summary.d.ts.map +1 -0
  171. package/src/wizard/components/Summary.js +44 -0
  172. package/src/wizard/components/Summary.js.map +1 -0
  173. package/src/wizard/engine.d.ts +29 -0
  174. package/src/wizard/engine.d.ts.map +1 -0
  175. package/src/wizard/engine.js +866 -0
  176. package/src/wizard/engine.js.map +1 -0
  177. package/src/wizard/index.d.ts +8 -0
  178. package/src/wizard/index.d.ts.map +1 -0
  179. package/src/wizard/index.js +8 -0
  180. package/src/wizard/index.js.map +1 -0
  181. package/src/wizard/types.d.ts +190 -0
  182. package/src/wizard/types.d.ts.map +1 -0
  183. package/src/wizard/types.js +193 -0
  184. package/src/wizard/types.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/setup-server/routes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * REST API routes for the setup server\n *\n * Wraps the existing WizardEngine with HTTP endpoints and streams\n * engine.onStateChange as SSE events.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport {\n createUserConfig,\n createPathsConfig,\n userExists,\n groupExists,\n scanDiscovery,\n autoDetectPreset,\n} from '@agenshield/sandbox';\nimport type { WizardEngine } from '../wizard/engine.js';\nimport type { WizardState, WizardContext, WizardStepId } from '../wizard/types.js';\nimport { computeNames } from '../wizard/components/AdvancedConfig.js';\nimport { broadcastSetupEvent } from './sse.js';\n\nexport interface ExecutableInfo {\n name: string;\n path: string;\n dir: string;\n isProxied: boolean;\n isWrapped: boolean;\n isAllowed: boolean;\n category: 'system' | 'package-manager' | 'network' | 'shell' | 'other';\n}\n\n/**\n * Sanitize context for API response — strip non-serializable and sensitive data\n */\nfunction sanitizeContext(context: WizardContext): Record<string, unknown> {\n const { preset, passcodeValue, ...rest } = context as Record<string, unknown>;\n return {\n ...rest,\n // Add serializable preset info\n presetName: (context.preset as { name?: string } | undefined)?.name ?? null,\n presetId: (context.preset as { id?: string } | undefined)?.id ?? null,\n };\n}\n\n/** Race guard — prevent double-triggering async phases */\nlet isRunning = false;\n\n/**\n * Register all setup API routes\n */\nexport async function registerRoutes(app: FastifyInstance, engine: WizardEngine): Promise<void> {\n // --- Health ---\n app.get('/api/health', async () => {\n return {\n success: true,\n data: {\n ok: true,\n timestamp: new Date().toISOString(),\n mode: 'setup' as const,\n },\n };\n });\n\n // --- Auth status (fake — no auth needed for setup) ---\n app.get('/api/auth/status', async () => {\n return {\n protectionEnabled: false,\n passcodeSet: false,\n allowAnonymousReadOnly: true,\n lockedOut: false,\n };\n });\n\n // --- Setup state ---\n app.get('/api/setup/state', async () => {\n // Determine phase\n let phase: string = 'detection';\n const hasConfirm = engine.state.steps.find(s => s.id === 'confirm');\n const hasComplete = engine.state.steps.find(s => s.id === 'complete');\n\n if (engine.state.isComplete || hasComplete?.status === 'completed') {\n phase = 'complete';\n } else if (engine.state.steps.find(s => s.id === 'setup-passcode')?.status === 'running') {\n phase = 'passcode';\n } else if (hasConfirm?.status === 'completed') {\n phase = 'execution';\n } else if (engine.context.presetDetection?.found) {\n phase = 'configuration';\n }\n\n return {\n success: true,\n data: {\n state: engine.state,\n context: sanitizeContext(engine.context),\n phase,\n targetInstallable: engine.context.targetInstallable ?? false,\n },\n };\n });\n\n // --- Configure (set mode + baseName) ---\n app.post<{ Body: { mode: 'quick' | 'advanced'; baseName?: string } }>(\n '/api/setup/configure',\n async (request) => {\n const { mode, baseName } = request.body;\n\n const effectiveBaseName = mode === 'quick' ? 'default' : (baseName || 'default');\n\n // Update engine context\n engine.context.options = {\n ...engine.context.options,\n baseName: effectiveBaseName,\n };\n\n // Create user config\n const userConfig = createUserConfig({ baseName: effectiveBaseName });\n engine.context.userConfig = userConfig;\n engine.context.pathsConfig = createPathsConfig(userConfig);\n\n const names = computeNames(effectiveBaseName);\n\n broadcastSetupEvent('setup:state_change', {\n state: engine.state,\n context: sanitizeContext(engine.context),\n phase: 'configuration',\n });\n\n return {\n success: true,\n data: { mode, baseName: effectiveBaseName, names },\n };\n },\n );\n\n // --- Check conflicts ---\n app.post<{ Body: { baseName: string } }>(\n '/api/setup/check-conflicts',\n async (request) => {\n const { baseName } = request.body;\n const names = computeNames(baseName);\n\n const existingUsers: string[] = [];\n const existingGroups: string[] = [];\n\n if (await userExists(names.agentUser)) existingUsers.push(names.agentUser);\n if (await userExists(names.brokerUser)) existingUsers.push(names.brokerUser);\n if (await groupExists(names.socketGroup)) existingGroups.push(names.socketGroup);\n if (await groupExists(names.workspaceGroup)) existingGroups.push(names.workspaceGroup);\n\n return {\n success: true,\n data: {\n hasConflicts: existingUsers.length > 0 || existingGroups.length > 0,\n users: existingUsers,\n groups: existingGroups,\n names,\n },\n };\n },\n );\n\n // --- Install target (npm install -g openclaw) ---\n app.post('/api/setup/install-target', async () => {\n if (isRunning) {\n return { success: false, error: { code: 'ALREADY_RUNNING', message: 'An operation is already in progress' } };\n }\n\n isRunning = true;\n\n try {\n const { execSync } = await import('node:child_process');\n execSync('npm install -g openclaw', {\n encoding: 'utf-8',\n timeout: 120_000,\n stdio: 'pipe',\n });\n\n // Re-run detection\n const result = await autoDetectPreset();\n if (!result) {\n isRunning = false;\n return {\n success: false,\n error: { code: 'DETECT_FAILED', message: 'openclaw was installed but could not be detected. Check your PATH.' },\n };\n }\n\n // Update engine context\n engine.context.preset = result.preset;\n engine.context.presetDetection = result.detection;\n engine.context.targetInstallable = false;\n engine.context.installTargetRequested = true;\n\n // Update step statuses\n const installTargetStep = engine.state.steps.find(s => s.id === 'install-target');\n if (installTargetStep) {\n installTargetStep.status = 'completed';\n }\n\n broadcastSetupEvent('setup:state_change', {\n state: engine.state,\n context: sanitizeContext(engine.context),\n phase: 'detection',\n });\n\n isRunning = false;\n\n return {\n success: true,\n data: {\n installed: true,\n preset: result.preset.name,\n version: result.detection.version,\n },\n };\n } catch (err) {\n isRunning = false;\n return {\n success: false,\n error: { code: 'INSTALL_FAILED', message: (err as Error).message },\n };\n }\n });\n\n // --- Confirm (triggers setup phase) ---\n app.post('/api/setup/confirm', async () => {\n if (isRunning) {\n return { success: false, error: { code: 'ALREADY_RUNNING', message: 'Setup is already in progress' } };\n }\n\n isRunning = true;\n\n // Run setup phase asynchronously — progress streams via SSE\n engine.runSetupPhase().then(() => {\n isRunning = false;\n if (engine.state.hasError) {\n broadcastSetupEvent('setup:error', {\n state: engine.state,\n context: sanitizeContext(engine.context),\n });\n }\n }).catch((err) => {\n isRunning = false;\n broadcastSetupEvent('setup:error', {\n error: (err as Error).message,\n state: engine.state,\n });\n });\n\n return { success: true, data: { started: true } };\n });\n\n // --- Passcode (triggers final phase) ---\n app.post<{ Body: { passcode?: string; skip?: boolean } }>(\n '/api/setup/passcode',\n async (request) => {\n if (isRunning) {\n return { success: false, error: { code: 'ALREADY_RUNNING', message: 'Final phase is already in progress' } };\n }\n\n const { passcode, skip } = request.body;\n\n if (skip) {\n engine.context.passcodeSetup = { configured: false, skipped: true };\n } else if (passcode) {\n engine.context.passcodeValue = passcode;\n }\n\n isRunning = true;\n\n engine.runFinalPhase().then(() => {\n isRunning = false;\n broadcastSetupEvent('setup:complete', {\n state: engine.state,\n context: sanitizeContext(engine.context),\n });\n }).catch((err) => {\n isRunning = false;\n broadcastSetupEvent('setup:error', {\n error: (err as Error).message,\n state: engine.state,\n });\n });\n\n return { success: true, data: { started: true } };\n },\n );\n\n // --- Executables scan (using shared discovery module) ---\n let discoveryCache: { data: ReturnType<typeof scanDiscovery>; cachedAt: number } | null = null;\n const EXEC_CACHE_TTL = 60_000;\n\n app.get('/api/setup/executables', async () => {\n const now = Date.now();\n if (discoveryCache && now - discoveryCache.cachedAt < EXEC_CACHE_TTL) {\n const result = discoveryCache.data;\n return {\n success: true,\n data: {\n discovery: result,\n executables: result.binaries.map((b) => ({\n name: b.name,\n path: b.path,\n dir: b.dir,\n isProxied: b.protection === 'proxied',\n isWrapped: b.protection === 'wrapped',\n isAllowed: b.protection === 'allowed',\n category: b.category === 'language-runtime' ? 'other' : b.category,\n })),\n },\n };\n }\n\n const result = scanDiscovery({\n scanSkills: !!engine.context.presetDetection?.found,\n agentHome: engine.context.userConfig?.agentUser?.home,\n workspaceDir: engine.context.userConfig\n ? `${engine.context.userConfig.agentUser.home}/workspace`\n : undefined,\n });\n\n discoveryCache = { data: result, cachedAt: now };\n\n return {\n success: true,\n data: {\n discovery: result,\n executables: result.binaries.map((b) => ({\n name: b.name,\n path: b.path,\n dir: b.dir,\n isProxied: b.protection === 'proxied',\n isWrapped: b.protection === 'wrapped',\n isAllowed: b.protection === 'allowed',\n category: b.category === 'language-runtime' ? 'other' : b.category,\n })),\n },\n };\n });\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Setup server lifecycle
3
+ *
4
+ * Fastify server that wraps the WizardEngine with HTTP endpoints,
5
+ * serves the shield-ui SPA, and streams state changes via SSE.
6
+ *
7
+ * Auto-shuts down 5s after completion or 5min idle (no SSE connections).
8
+ */
9
+ import type { WizardEngine } from '../wizard/engine.js';
10
+ export interface SetupServer {
11
+ start(port: number): Promise<string>;
12
+ stop(): Promise<void>;
13
+ waitForCompletion(): Promise<void>;
14
+ }
15
+ export declare function createSetupServer(engine: WizardEngine): SetupServer;
16
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/setup-server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASxD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAyHnE"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Setup server lifecycle
3
+ *
4
+ * Fastify server that wraps the WizardEngine with HTTP endpoints,
5
+ * serves the shield-ui SPA, and streams state changes via SSE.
6
+ *
7
+ * Auto-shuts down 5s after completion or 5min idle (no SSE connections).
8
+ */
9
+ import Fastify from 'fastify';
10
+ import cors from '@fastify/cors';
11
+ import fastifyStatic from '@fastify/static';
12
+ import { registerRoutes } from './routes.js';
13
+ import { registerSSE, broadcastSetupEvent, getActiveConnections, closeAllSSEConnections } from './sse.js';
14
+ import { getUiAssetsPath } from './static.js';
15
+ const IDLE_TIMEOUT = 5 * 60 * 1000; // 5 minutes
16
+ const SHUTDOWN_DELAY = 5_000; // 5 seconds after completion
17
+ const IDLE_CHECK_INTERVAL = 30_000; // Check idle every 30s
18
+ export function createSetupServer(engine) {
19
+ let app = null;
20
+ let completionResolve = null;
21
+ let idleTimer = null;
22
+ let lastActivity = Date.now();
23
+ let isComplete = false;
24
+ // Wire engine state changes to SSE broadcast
25
+ const originalOnStateChange = engine.onStateChange;
26
+ engine.onStateChange = (state) => {
27
+ lastActivity = Date.now();
28
+ originalOnStateChange?.(state);
29
+ broadcastSetupEvent('setup:state_change', {
30
+ state,
31
+ phase: state.isComplete ? 'complete' : 'execution',
32
+ });
33
+ // Auto-shutdown after completion
34
+ if (state.isComplete && !isComplete) {
35
+ isComplete = true;
36
+ setTimeout(() => {
37
+ completionResolve?.();
38
+ }, SHUTDOWN_DELAY);
39
+ }
40
+ };
41
+ return {
42
+ async start(port) {
43
+ app = Fastify({ logger: false });
44
+ // CORS
45
+ await app.register(cors, { origin: true, methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'] });
46
+ // Request logging
47
+ app.addHook('onResponse', (request, reply, done) => {
48
+ if (!request.url.startsWith('/sse') && !request.url.includes('.') && !request.url.endsWith('/health')) {
49
+ const ms = Math.round(reply.elapsedTime);
50
+ const status = reply.statusCode;
51
+ const color = status >= 400 ? '\x1b[31m' : status >= 300 ? '\x1b[33m' : '\x1b[32m';
52
+ console.log(`${color}${request.method}\x1b[0m ${request.url} \x1b[2m${status} ${ms}ms\x1b[0m`);
53
+ }
54
+ done();
55
+ });
56
+ // Error handler — log details and send structured response
57
+ app.setErrorHandler((error, request, reply) => {
58
+ const status = error.statusCode ?? 500;
59
+ console.error(`\x1b[31mERROR\x1b[0m ${request.method} ${request.url} \x1b[2m${status}\x1b[0m — ${error.message}`);
60
+ reply.status(status).send({
61
+ success: false,
62
+ error: { message: error.message, statusCode: status },
63
+ });
64
+ });
65
+ // API routes
66
+ await registerRoutes(app, engine);
67
+ // SSE endpoint
68
+ await registerSSE(app);
69
+ // Serve static UI assets
70
+ const uiPath = getUiAssetsPath();
71
+ if (uiPath) {
72
+ await app.register(fastifyStatic, {
73
+ root: uiPath,
74
+ prefix: '/',
75
+ });
76
+ // SPA fallback: non-/api and non-/sse paths serve index.html
77
+ app.setNotFoundHandler(async (request, reply) => {
78
+ if (request.url.startsWith('/api') || request.url.startsWith('/sse') || request.url.startsWith('/rpc')) {
79
+ return reply.code(404).send({ error: 'Not found' });
80
+ }
81
+ return reply.sendFile('index.html');
82
+ });
83
+ }
84
+ else {
85
+ // No UI assets found — still serve the API
86
+ app.setNotFoundHandler(async (_request, reply) => {
87
+ return reply.code(404).send({
88
+ error: 'UI assets not found. Build shield-ui first: npx nx build shield-ui',
89
+ });
90
+ });
91
+ }
92
+ // Start idle-timeout checker
93
+ idleTimer = setInterval(() => {
94
+ const idleTime = Date.now() - lastActivity;
95
+ const connections = getActiveConnections();
96
+ if (connections === 0 && idleTime > IDLE_TIMEOUT) {
97
+ console.log('Setup server idle timeout — shutting down');
98
+ completionResolve?.();
99
+ }
100
+ }, IDLE_CHECK_INTERVAL);
101
+ // Listen on localhost only
102
+ await app.listen({ port, host: '127.0.0.1' });
103
+ const url = `http://localhost:${port}`;
104
+ return url;
105
+ },
106
+ async stop() {
107
+ if (idleTimer) {
108
+ clearInterval(idleTimer);
109
+ idleTimer = null;
110
+ }
111
+ // Close SSE connections first so Fastify doesn't wait for them
112
+ closeAllSSEConnections();
113
+ if (app) {
114
+ await app.close();
115
+ app = null;
116
+ }
117
+ },
118
+ waitForCompletion() {
119
+ return new Promise((resolve) => {
120
+ completionResolve = resolve;
121
+ });
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/setup-server/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Setup server lifecycle\n *\n * Fastify server that wraps the WizardEngine with HTTP endpoints,\n * serves the shield-ui SPA, and streams state changes via SSE.\n *\n * Auto-shuts down 5s after completion or 5min idle (no SSE connections).\n */\n\nimport Fastify, { type FastifyInstance } from 'fastify';\nimport cors from '@fastify/cors';\nimport fastifyStatic from '@fastify/static';\nimport type { WizardEngine } from '../wizard/engine.js';\nimport { registerRoutes } from './routes.js';\nimport { registerSSE, broadcastSetupEvent, getActiveConnections, closeAllSSEConnections } from './sse.js';\nimport { getUiAssetsPath } from './static.js';\n\nconst IDLE_TIMEOUT = 5 * 60 * 1000; // 5 minutes\nconst SHUTDOWN_DELAY = 5_000; // 5 seconds after completion\nconst IDLE_CHECK_INTERVAL = 30_000; // Check idle every 30s\n\nexport interface SetupServer {\n start(port: number): Promise<string>;\n stop(): Promise<void>;\n waitForCompletion(): Promise<void>;\n}\n\nexport function createSetupServer(engine: WizardEngine): SetupServer {\n let app: FastifyInstance | null = null;\n let completionResolve: (() => void) | null = null;\n let idleTimer: ReturnType<typeof setInterval> | null = null;\n let lastActivity = Date.now();\n let isComplete = false;\n\n // Wire engine state changes to SSE broadcast\n const originalOnStateChange = engine.onStateChange;\n engine.onStateChange = (state) => {\n lastActivity = Date.now();\n originalOnStateChange?.(state);\n\n broadcastSetupEvent('setup:state_change', {\n state,\n phase: state.isComplete ? 'complete' : 'execution',\n });\n\n // Auto-shutdown after completion\n if (state.isComplete && !isComplete) {\n isComplete = true;\n setTimeout(() => {\n completionResolve?.();\n }, SHUTDOWN_DELAY);\n }\n };\n\n return {\n async start(port: number): Promise<string> {\n app = Fastify({ logger: false });\n\n // CORS\n await app.register(cors, { origin: true, methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'] });\n\n // Request logging\n app.addHook('onResponse', (request, reply, done) => {\n if (!request.url.startsWith('/sse') && !request.url.includes('.') && !request.url.endsWith('/health')) {\n const ms = Math.round(reply.elapsedTime);\n const status = reply.statusCode;\n const color = status >= 400 ? '\\x1b[31m' : status >= 300 ? '\\x1b[33m' : '\\x1b[32m';\n console.log(`${color}${request.method}\\x1b[0m ${request.url} \\x1b[2m${status} ${ms}ms\\x1b[0m`);\n }\n done();\n });\n\n // Error handler — log details and send structured response\n app.setErrorHandler((error: { statusCode?: number; message: string }, request, reply) => {\n const status = error.statusCode ?? 500;\n console.error(`\\x1b[31mERROR\\x1b[0m ${request.method} ${request.url} \\x1b[2m${status}\\x1b[0m — ${error.message}`);\n reply.status(status).send({\n success: false,\n error: { message: error.message, statusCode: status },\n });\n });\n\n // API routes\n await registerRoutes(app, engine);\n\n // SSE endpoint\n await registerSSE(app);\n\n // Serve static UI assets\n const uiPath = getUiAssetsPath();\n if (uiPath) {\n await app.register(fastifyStatic, {\n root: uiPath,\n prefix: '/',\n });\n\n // SPA fallback: non-/api and non-/sse paths serve index.html\n app.setNotFoundHandler(async (request, reply) => {\n if (request.url.startsWith('/api') || request.url.startsWith('/sse') || request.url.startsWith('/rpc')) {\n return reply.code(404).send({ error: 'Not found' });\n }\n return reply.sendFile('index.html');\n });\n } else {\n // No UI assets found — still serve the API\n app.setNotFoundHandler(async (_request, reply) => {\n return reply.code(404).send({\n error: 'UI assets not found. Build shield-ui first: npx nx build shield-ui',\n });\n });\n }\n\n // Start idle-timeout checker\n idleTimer = setInterval(() => {\n const idleTime = Date.now() - lastActivity;\n const connections = getActiveConnections();\n if (connections === 0 && idleTime > IDLE_TIMEOUT) {\n console.log('Setup server idle timeout — shutting down');\n completionResolve?.();\n }\n }, IDLE_CHECK_INTERVAL);\n\n // Listen on localhost only\n await app.listen({ port, host: '127.0.0.1' });\n\n const url = `http://localhost:${port}`;\n return url;\n },\n\n async stop(): Promise<void> {\n if (idleTimer) {\n clearInterval(idleTimer);\n idleTimer = null;\n }\n // Close SSE connections first so Fastify doesn't wait for them\n closeAllSSEConnections();\n if (app) {\n await app.close();\n app = null;\n }\n },\n\n waitForCompletion(): Promise<void> {\n return new Promise((resolve) => {\n completionResolve = resolve;\n });\n },\n };\n}\n"]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * SSE endpoint for the setup server
3
+ *
4
+ * Streams wizard engine state changes to the browser UI in real-time.
5
+ * Uses a local EventEmitter (NOT the daemon's singleton).
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ import type { FastifyInstance } from 'fastify';
9
+ export type SetupSSEEventType = 'setup:state_change' | 'setup:complete' | 'setup:error' | 'heartbeat';
10
+ export interface SetupSSEEvent {
11
+ type: SetupSSEEventType;
12
+ data: Record<string, unknown>;
13
+ }
14
+ /**
15
+ * Local event emitter for setup SSE — not shared with the daemon
16
+ */
17
+ export declare const setupEmitter: EventEmitter<[never]>;
18
+ export declare function getActiveConnections(): number;
19
+ /**
20
+ * Close all active SSE connections so the server can shut down cleanly
21
+ */
22
+ export declare function closeAllSSEConnections(): void;
23
+ /**
24
+ * Broadcast an event to all connected SSE clients
25
+ */
26
+ export declare function broadcastSetupEvent(type: SetupSSEEventType, data: Record<string, unknown>): void;
27
+ /**
28
+ * Register the SSE endpoint on a Fastify instance
29
+ */
30
+ export declare function registerSSE(app: FastifyInstance): Promise<void>;
31
+ //# sourceMappingURL=sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/setup-server/sse.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAI7E,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,gBAAgB,GAChB,aAAa,GACb,WAAW,CAAC;AAEhB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,uBAAqB,CAAC;AAO/C,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAS7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEhG;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCrE"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SSE endpoint for the setup server
3
+ *
4
+ * Streams wizard engine state changes to the browser UI in real-time.
5
+ * Uses a local EventEmitter (NOT the daemon's singleton).
6
+ */
7
+ import { EventEmitter } from 'node:events';
8
+ const HEARTBEAT_INTERVAL = 15_000; // 15 seconds
9
+ /**
10
+ * Local event emitter for setup SSE — not shared with the daemon
11
+ */
12
+ export const setupEmitter = new EventEmitter();
13
+ setupEmitter.setMaxListeners(20);
14
+ /** Track active SSE connections for idle-timeout */
15
+ let activeConnections = 0;
16
+ const activeReplies = new Set();
17
+ export function getActiveConnections() {
18
+ return activeConnections;
19
+ }
20
+ /**
21
+ * Close all active SSE connections so the server can shut down cleanly
22
+ */
23
+ export function closeAllSSEConnections() {
24
+ for (const raw of activeReplies) {
25
+ try {
26
+ raw.end();
27
+ }
28
+ catch {
29
+ // Already closed
30
+ }
31
+ }
32
+ activeReplies.clear();
33
+ }
34
+ /**
35
+ * Broadcast an event to all connected SSE clients
36
+ */
37
+ export function broadcastSetupEvent(type, data) {
38
+ setupEmitter.emit('event', { type, data });
39
+ }
40
+ /**
41
+ * Register the SSE endpoint on a Fastify instance
42
+ */
43
+ export async function registerSSE(app) {
44
+ app.get('/sse/events', async (request, reply) => {
45
+ // Set SSE headers
46
+ reply.raw.writeHead(200, {
47
+ 'Content-Type': 'text/event-stream',
48
+ 'Cache-Control': 'no-cache',
49
+ Connection: 'keep-alive',
50
+ 'Access-Control-Allow-Origin': '*',
51
+ });
52
+ activeConnections++;
53
+ activeReplies.add(reply.raw);
54
+ // Heartbeat timer
55
+ const heartbeat = setInterval(() => {
56
+ reply.raw.write(`event: heartbeat\ndata: ${JSON.stringify({ timestamp: new Date().toISOString() })}\n\n`);
57
+ }, HEARTBEAT_INTERVAL);
58
+ // Event listener
59
+ const onEvent = (event) => {
60
+ reply.raw.write(`event: ${event.type}\ndata: ${JSON.stringify(event.data)}\n\n`);
61
+ };
62
+ setupEmitter.on('event', onEvent);
63
+ // Send initial connected event
64
+ reply.raw.write(`event: heartbeat\ndata: ${JSON.stringify({ timestamp: new Date().toISOString(), connected: true })}\n\n`);
65
+ // Cleanup on close
66
+ request.raw.on('close', () => {
67
+ activeConnections--;
68
+ activeReplies.delete(reply.raw);
69
+ clearInterval(heartbeat);
70
+ setupEmitter.off('event', onEvent);
71
+ });
72
+ // Keep the connection open (don't call reply.send)
73
+ await reply.hijack();
74
+ });
75
+ }
76
+ //# sourceMappingURL=sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/setup-server/sse.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SSE endpoint for the setup server\n *\n * Streams wizard engine state changes to the browser UI in real-time.\n * Uses a local EventEmitter (NOT the daemon's singleton).\n */\n\nimport { EventEmitter } from 'node:events';\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\n\nconst HEARTBEAT_INTERVAL = 15_000; // 15 seconds\n\nexport type SetupSSEEventType =\n | 'setup:state_change'\n | 'setup:complete'\n | 'setup:error'\n | 'heartbeat';\n\nexport interface SetupSSEEvent {\n type: SetupSSEEventType;\n data: Record<string, unknown>;\n}\n\n/**\n * Local event emitter for setup SSE — not shared with the daemon\n */\nexport const setupEmitter = new EventEmitter();\nsetupEmitter.setMaxListeners(20);\n\n/** Track active SSE connections for idle-timeout */\nlet activeConnections = 0;\nconst activeReplies: Set<import('node:http').ServerResponse> = new Set();\n\nexport function getActiveConnections(): number {\n return activeConnections;\n}\n\n/**\n * Close all active SSE connections so the server can shut down cleanly\n */\nexport function closeAllSSEConnections(): void {\n for (const raw of activeReplies) {\n try {\n raw.end();\n } catch {\n // Already closed\n }\n }\n activeReplies.clear();\n}\n\n/**\n * Broadcast an event to all connected SSE clients\n */\nexport function broadcastSetupEvent(type: SetupSSEEventType, data: Record<string, unknown>): void {\n setupEmitter.emit('event', { type, data });\n}\n\n/**\n * Register the SSE endpoint on a Fastify instance\n */\nexport async function registerSSE(app: FastifyInstance): Promise<void> {\n app.get('/sse/events', async (request: FastifyRequest, reply: FastifyReply) => {\n // Set SSE headers\n reply.raw.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n });\n\n activeConnections++;\n activeReplies.add(reply.raw);\n\n // Heartbeat timer\n const heartbeat = setInterval(() => {\n reply.raw.write(`event: heartbeat\\ndata: ${JSON.stringify({ timestamp: new Date().toISOString() })}\\n\\n`);\n }, HEARTBEAT_INTERVAL);\n\n // Event listener\n const onEvent = (event: SetupSSEEvent) => {\n reply.raw.write(`event: ${event.type}\\ndata: ${JSON.stringify(event.data)}\\n\\n`);\n };\n\n setupEmitter.on('event', onEvent);\n\n // Send initial connected event\n reply.raw.write(`event: heartbeat\\ndata: ${JSON.stringify({ timestamp: new Date().toISOString(), connected: true })}\\n\\n`);\n\n // Cleanup on close\n request.raw.on('close', () => {\n activeConnections--;\n activeReplies.delete(reply.raw);\n clearInterval(heartbeat);\n setupEmitter.off('event', onEvent);\n });\n\n // Keep the connection open (don't call reply.send)\n await reply.hijack();\n });\n}\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Static asset resolver for embedded UI (setup server variant)
3
+ *
4
+ * Same logic as libs/shield-daemon/src/static.ts but relative to CLI package paths.
5
+ */
6
+ /**
7
+ * Get the path to UI assets for the setup server
8
+ * @returns Path to UI assets or null if not found
9
+ */
10
+ export declare function getUiAssetsPath(): string | null;
11
+ //# sourceMappingURL=static.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../../src/setup-server/static.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAmB/C"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Static asset resolver for embedded UI (setup server variant)
3
+ *
4
+ * Same logic as libs/shield-daemon/src/static.ts but relative to CLI package paths.
5
+ */
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ /**
12
+ * Get the path to UI assets for the setup server
13
+ * @returns Path to UI assets or null if not found
14
+ */
15
+ export function getUiAssetsPath() {
16
+ // Check for bundled UI assets (production) — <cli-dist>/ui-assets/
17
+ const bundledPath = path.join(__dirname, '..', 'ui-assets');
18
+ if (fs.existsSync(bundledPath)) {
19
+ return bundledPath;
20
+ }
21
+ // Check for development build — <monorepo-root>/dist/apps/shield-ui/
22
+ const devPaths = [
23
+ path.join(__dirname, '..', '..', '..', '..', 'dist', 'apps', 'shield-ui'),
24
+ path.join(process.cwd(), 'dist', 'apps', 'shield-ui'),
25
+ ];
26
+ for (const devPath of devPaths) {
27
+ if (fs.existsSync(devPath)) {
28
+ return devPath;
29
+ }
30
+ }
31
+ return null;
32
+ }
33
+ //# sourceMappingURL=static.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/setup-server/static.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,mEAAmE;IACnE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,qEAAqE;IACrE,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;KACtD,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["/**\n * Static asset resolver for embedded UI (setup server variant)\n *\n * Same logic as libs/shield-daemon/src/static.ts but relative to CLI package paths.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n/**\n * Get the path to UI assets for the setup server\n * @returns Path to UI assets or null if not found\n */\nexport function getUiAssetsPath(): string | null {\n // Check for bundled UI assets (production) — <cli-dist>/ui-assets/\n const bundledPath = path.join(__dirname, '..', 'ui-assets');\n if (fs.existsSync(bundledPath)) {\n return bundledPath;\n }\n\n // Check for development build — <monorepo-root>/dist/apps/shield-ui/\n const devPaths = [\n path.join(__dirname, '..', '..', '..', '..', 'dist', 'apps', 'shield-ui'),\n path.join(process.cwd(), 'dist', 'apps', 'shield-ui'),\n ];\n for (const devPath of devPaths) {\n if (fs.existsSync(devPath)) {\n return devPath;\n }\n }\n\n return null;\n}\n"]}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Daemon management utilities
3
+ *
4
+ * Provides functions for starting, stopping, and monitoring the AgenShield daemon.
5
+ */
6
+ /**
7
+ * Daemon configuration
8
+ */
9
+ export declare const DAEMON_CONFIG: {
10
+ PID_FILE: string;
11
+ PORT: number;
12
+ HOST: string;
13
+ DISPLAY_HOST: string;
14
+ LOG_DIR: string;
15
+ SOCKET_DIR: string;
16
+ };
17
+ /**
18
+ * Status of the daemon
19
+ */
20
+ export interface DaemonStatus {
21
+ running: boolean;
22
+ pid?: number;
23
+ port?: number;
24
+ uptime?: string;
25
+ url?: string;
26
+ }
27
+ /**
28
+ * Get the current daemon status
29
+ */
30
+ export declare function getDaemonStatus(): Promise<DaemonStatus>;
31
+ /**
32
+ * Find the daemon executable path
33
+ */
34
+ export declare function findDaemonExecutable(): string | null;
35
+ /**
36
+ * Find the daemon TypeScript source (for tsx fallback in dev)
37
+ */
38
+ export declare function findDaemonSource(): string | null;
39
+ /**
40
+ * Start the daemon
41
+ */
42
+ export declare function startDaemon(options?: {
43
+ foreground?: boolean;
44
+ }): Promise<{
45
+ success: boolean;
46
+ message: string;
47
+ pid?: number;
48
+ }>;
49
+ /**
50
+ * Stop the daemon
51
+ */
52
+ export declare function stopDaemon(): Promise<{
53
+ success: boolean;
54
+ message: string;
55
+ }>;
56
+ /**
57
+ * Restart the daemon
58
+ */
59
+ export declare function restartDaemon(): Promise<{
60
+ success: boolean;
61
+ message: string;
62
+ }>;
63
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/utils/daemon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;CAOzB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAiC7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAiBpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAMhD;AAgED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC;IACjF,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC,CA4JD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAiED;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAUD"}