@flisk-sh/flisk 0.0.0-stage → 1.3.190

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 (440) hide show
  1. package/CHANGELOG.md +492 -0
  2. package/LICENSE +21 -0
  3. package/README.md +479 -2
  4. package/Tiltfile +151 -0
  5. package/cli/bin/flisk.js +42 -0
  6. package/cli/dist/agent-runtimes/custom.js +335 -0
  7. package/cli/dist/agent-runtimes/registry.js +34 -0
  8. package/cli/dist/backend-frameworks/elysia.js +38 -0
  9. package/cli/dist/backend-frameworks/express.js +49 -0
  10. package/cli/dist/backend-frameworks/fastify.js +43 -0
  11. package/cli/dist/backend-frameworks/h3.js +37 -0
  12. package/cli/dist/backend-frameworks/koa.js +47 -0
  13. package/cli/dist/backend-frameworks/mcp.js +86 -0
  14. package/cli/dist/backend-frameworks/nestjs.js +55 -0
  15. package/cli/dist/backend-frameworks/registry.js +134 -0
  16. package/cli/dist/backend-frameworks/types.js +1 -0
  17. package/cli/dist/backend-languages/bun.js +76 -0
  18. package/cli/dist/backend-languages/go.js +125 -0
  19. package/cli/dist/backend-languages/node.js +122 -0
  20. package/cli/dist/backend-languages/python.js +94 -0
  21. package/cli/dist/backend-languages/registry.js +37 -0
  22. package/cli/dist/backend-languages/rust.js +82 -0
  23. package/cli/dist/backend-languages/types.js +1 -0
  24. package/cli/dist/cli.js +29 -0
  25. package/cli/dist/commands/__tests__/project-e2e-helpers.js +49 -0
  26. package/cli/dist/commands/__tests__/ui-loading-screen.test.js +16 -0
  27. package/cli/dist/commands/agent.js +182 -0
  28. package/cli/dist/commands/completion-candidates.js +116 -0
  29. package/cli/dist/commands/completion.js +843 -0
  30. package/cli/dist/commands/config.js +362 -0
  31. package/cli/dist/commands/doctor.js +1504 -0
  32. package/cli/dist/commands/down.js +114 -0
  33. package/cli/dist/commands/eject.js +108 -0
  34. package/cli/dist/commands/help.js +152 -0
  35. package/cli/dist/commands/import.js +164 -0
  36. package/cli/dist/commands/logs.js +119 -0
  37. package/cli/dist/commands/maintainers.js +102 -0
  38. package/cli/dist/commands/mcp.js +28 -0
  39. package/cli/dist/commands/networks.js +306 -0
  40. package/cli/dist/commands/project.js +447 -0
  41. package/cli/dist/commands/projects.js +103 -0
  42. package/cli/dist/commands/registry.js +53 -0
  43. package/cli/dist/commands/resource.js +992 -0
  44. package/cli/dist/commands/resources.js +127 -0
  45. package/cli/dist/commands/restart.js +89 -0
  46. package/cli/dist/commands/runtime.js +75 -0
  47. package/cli/dist/commands/stack.js +171 -0
  48. package/cli/dist/commands/stacks.js +71 -0
  49. package/cli/dist/commands/status.js +211 -0
  50. package/cli/dist/commands/ui.js +725 -0
  51. package/cli/dist/commands/up.js +609 -0
  52. package/cli/dist/commands/upgrade.js +840 -0
  53. package/cli/dist/commands/version.js +10 -0
  54. package/cli/dist/components/Accessible.js +11 -0
  55. package/cli/dist/components/BaseTooltip.js +30 -0
  56. package/cli/dist/components/DetailPanel.js +33 -0
  57. package/cli/dist/components/FileTree.js +51 -0
  58. package/cli/dist/components/ResourceSelectInput.js +42 -0
  59. package/cli/dist/components/ResourceTable.js +35 -0
  60. package/cli/dist/components/ServiceIssues.js +13 -0
  61. package/cli/dist/components/TUIHeader.js +27 -0
  62. package/cli/dist/components/TabBar.js +27 -0
  63. package/cli/dist/components/Tooltip.js +13 -0
  64. package/cli/dist/components/index.js +11 -0
  65. package/cli/dist/components/ui-theme.js +120 -0
  66. package/cli/dist/config/platform-standards.js +182 -0
  67. package/cli/dist/frontend-frameworks/lit.js +64 -0
  68. package/cli/dist/frontend-frameworks/preact.js +62 -0
  69. package/cli/dist/frontend-frameworks/qwik.js +61 -0
  70. package/cli/dist/frontend-frameworks/react.js +69 -0
  71. package/cli/dist/frontend-frameworks/registry.js +83 -0
  72. package/cli/dist/frontend-frameworks/solid.js +62 -0
  73. package/cli/dist/frontend-frameworks/svelte.js +67 -0
  74. package/cli/dist/frontend-frameworks/tanstack-router.js +101 -0
  75. package/cli/dist/frontend-frameworks/types.js +1 -0
  76. package/cli/dist/frontend-frameworks/vanilla.js +59 -0
  77. package/cli/dist/frontend-frameworks/vue.js +72 -0
  78. package/cli/dist/generator/__tests__/golden-helpers.js +43 -0
  79. package/cli/dist/generator/extension-fetch.js +291 -0
  80. package/cli/dist/generator/resource-templates.js +133 -0
  81. package/cli/dist/generator/template-engine.js +801 -0
  82. package/cli/dist/index.js +10 -0
  83. package/cli/dist/mcp/server.js +101 -0
  84. package/cli/dist/mcp/tools.js +351 -0
  85. package/cli/dist/program.js +37 -0
  86. package/cli/dist/types/index.js +38 -0
  87. package/cli/dist/utils/agent-host.js +36 -0
  88. package/cli/dist/utils/atomic-write.js +36 -0
  89. package/cli/dist/utils/bun-floor.js +9 -0
  90. package/cli/dist/utils/bun-requirement.js +10 -0
  91. package/cli/dist/utils/cache.js +63 -0
  92. package/cli/dist/utils/cold-preflight.js +257 -0
  93. package/cli/dist/utils/command-helpers.js +57 -0
  94. package/cli/dist/utils/constants.js +160 -0
  95. package/cli/dist/utils/discovery-context.js +71 -0
  96. package/cli/dist/utils/discovery-paths.js +93 -0
  97. package/cli/dist/utils/docker.js +34 -0
  98. package/cli/dist/utils/doctor-crashloop.js +161 -0
  99. package/cli/dist/utils/doctor-fix.js +391 -0
  100. package/cli/dist/utils/doctor-host.js +66 -0
  101. package/cli/dist/utils/doctor-report.js +78 -0
  102. package/cli/dist/utils/doctor-runtime.js +880 -0
  103. package/cli/dist/utils/doctor-starlark.js +132 -0
  104. package/cli/dist/utils/doctor-wiring.js +698 -0
  105. package/cli/dist/utils/down-cleanup.js +125 -0
  106. package/cli/dist/utils/env-validator.js +266 -0
  107. package/cli/dist/utils/errors.js +175 -0
  108. package/cli/dist/utils/exec-async.js +31 -0
  109. package/cli/dist/utils/file-helpers.js +104 -0
  110. package/cli/dist/utils/formatting.js +165 -0
  111. package/cli/dist/utils/generated-paths.js +51 -0
  112. package/cli/dist/utils/help-command.js +11 -0
  113. package/cli/dist/utils/host-port-config.js +140 -0
  114. package/cli/dist/utils/host-port-plan.js +100 -0
  115. package/cli/dist/utils/json-output.js +29 -0
  116. package/cli/dist/utils/machine-output.js +33 -0
  117. package/cli/dist/utils/paths.js +43 -0
  118. package/cli/dist/utils/platform.js +58 -0
  119. package/cli/dist/utils/port-assignment.js +75 -0
  120. package/cli/dist/utils/port-conflict-fix.js +25 -0
  121. package/cli/dist/utils/port-fallback-notice.js +17 -0
  122. package/cli/dist/utils/port-listener-probe.js +20 -0
  123. package/cli/dist/utils/project-config-defaults.js +17 -0
  124. package/cli/dist/utils/project-features.js +91 -0
  125. package/cli/dist/utils/project-templates.js +32 -0
  126. package/cli/dist/utils/prompt.js +97 -0
  127. package/cli/dist/utils/resource-features.js +184 -0
  128. package/cli/dist/utils/resource-kind.js +9 -0
  129. package/cli/dist/utils/schema-version-gate.js +45 -0
  130. package/cli/dist/utils/search-status.js +12 -0
  131. package/cli/dist/utils/secret-redaction.js +73 -0
  132. package/cli/dist/utils/service-config-checks.js +189 -0
  133. package/cli/dist/utils/service-manifest.js +254 -0
  134. package/cli/dist/utils/service-runtime-state.js +66 -0
  135. package/cli/dist/utils/service-urls.js +112 -0
  136. package/cli/dist/utils/services.js +360 -0
  137. package/cli/dist/utils/shared-infra.js +45 -0
  138. package/cli/dist/utils/shared-platform-postgres.js +232 -0
  139. package/cli/dist/utils/single-flight.js +21 -0
  140. package/cli/dist/utils/smoke.js +401 -0
  141. package/cli/dist/utils/spinner.js +40 -0
  142. package/cli/dist/utils/stack-features.js +15 -0
  143. package/cli/dist/utils/stack-status.js +14 -0
  144. package/cli/dist/utils/startup-report.js +78 -0
  145. package/cli/dist/utils/status-message.js +21 -0
  146. package/cli/dist/utils/status-ports.js +33 -0
  147. package/cli/dist/utils/suggestions.js +63 -0
  148. package/cli/dist/utils/tar.js +46 -0
  149. package/cli/dist/utils/tdk-version.js +51 -0
  150. package/cli/dist/utils/terminal-layout.js +19 -0
  151. package/cli/dist/utils/tilt-events.js +194 -0
  152. package/cli/dist/utils/tilt-logs.js +61 -0
  153. package/cli/dist/utils/tilt-port-owner.js +63 -0
  154. package/cli/dist/utils/tilt-process.js +54 -0
  155. package/cli/dist/utils/tilt-resource-state.js +32 -0
  156. package/cli/dist/utils/tilt-startup.js +49 -0
  157. package/cli/dist/utils/tilt-unreachable-message.js +9 -0
  158. package/cli/dist/utils/tilt.js +104 -0
  159. package/cli/dist/utils/ui-keymap.js +129 -0
  160. package/cli/dist/utils/ui-service-state.js +34 -0
  161. package/cli/dist/utils/up-only.js +28 -0
  162. package/cli/dist/utils/up-readiness.js +118 -0
  163. package/cli/dist/utils/url-actions.js +103 -0
  164. package/cli/dist/utils/validation.js +62 -0
  165. package/cli/dist/utils/which.js +56 -0
  166. package/cli/dist/utils/windows-doctor.js +176 -0
  167. package/cli/dist-bundle/chunk-6EA4DGCY.js +2 -0
  168. package/cli/dist-bundle/chunk-BZ4H7MM4.js +3 -0
  169. package/cli/dist-bundle/chunk-CLCUIDBH.js +510 -0
  170. package/cli/dist-bundle/cli.js +2017 -0
  171. package/cli/dist-bundle/cold-preflight-SY26O2IG.js +2 -0
  172. package/cli/dist-bundle/devtools-ZUHXW33W.js +5 -0
  173. package/cli/dist-bundle/extension-fetch-J4FFH7TJ.js +2 -0
  174. package/cli/package.json +83 -0
  175. package/cli/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  176. package/cli/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  177. package/cli/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  178. package/cli/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  179. package/cli/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  180. package/cli/templates/.tiltignore.hbs +72 -0
  181. package/cli/templates/TILT_RESOURCE_DEFAULTS.star.hbs +220 -0
  182. package/cli/templates/TILT_TECH_STACK.star.hbs +149 -0
  183. package/cli/templates/Tiltfile.hbs +381 -0
  184. package/cli/templates/spec.master.hbs +192 -0
  185. package/discovery/AGENTS.md +362 -0
  186. package/discovery/TILT_DISCOVERY.star +429 -0
  187. package/discovery/Tiltfile +58 -0
  188. package/discovery/config.star +265 -0
  189. package/discovery/constants.star +167 -0
  190. package/discovery/deterministic.star +213 -0
  191. package/discovery/discovery_daemon.star +193 -0
  192. package/discovery/discovery_orchestrator.star +492 -0
  193. package/discovery/filtering.star +7 -0
  194. package/discovery/identity-management-backend/service.yaml +26 -0
  195. package/discovery/identity-management-frontend/service.yaml +29 -0
  196. package/discovery/identity-sdk/service.yaml +9 -0
  197. package/discovery/incremental_discovery.star +215 -0
  198. package/discovery/indexing.star +9 -0
  199. package/discovery/json_manifest_scanner.star +57 -0
  200. package/discovery/libraries.star +48 -0
  201. package/discovery/loading.star +25 -0
  202. package/discovery/manifest/constants.star +106 -0
  203. package/discovery/manifest/loading.star +418 -0
  204. package/discovery/manifest/normalize.star +289 -0
  205. package/discovery/manifest/validation.star +110 -0
  206. package/discovery/normalization.star +13 -0
  207. package/discovery/registry.star +562 -0
  208. package/discovery/resource_snapshot.py +384 -0
  209. package/discovery/resource_snapshot.star +145 -0
  210. package/discovery/schemas.star +3 -0
  211. package/discovery/services/platform/cdc/debezium/nats-connector/service.yaml +9 -0
  212. package/discovery/services/platform/cdc/nats-http-bridge/service.yaml +9 -0
  213. package/discovery/services/platform/orchestrator/orchestrator-glue-backend/service.yaml +26 -0
  214. package/discovery/services/platform/synthetic-monitor/service.yaml +9 -0
  215. package/discovery/test_resource_snapshot.py +253 -0
  216. package/discovery/validation.star +80 -0
  217. package/discovery/versioning.star +3 -0
  218. package/engine/AGENTS.md +706 -0
  219. package/engine/README.md +31 -0
  220. package/engine/REFACTORING_MANIFEST_SYSTEM.md +974 -0
  221. package/engine/Tiltfile +86 -0
  222. package/engine/assets/docker/golden-layers.Dockerfile +204 -0
  223. package/engine/assets/docker/wake-gateway/Dockerfile +28 -0
  224. package/engine/assets/docker/wake-gateway/decide.test.ts +177 -0
  225. package/engine/assets/docker/wake-gateway/decide.ts +135 -0
  226. package/engine/assets/docker/wake-gateway/server.ts +363 -0
  227. package/engine/assets/scripts/cleanup-completed-migrator-images.sh +39 -0
  228. package/engine/assets/scripts/cleanup-tilt-images.sh +122 -0
  229. package/engine/assets/scripts/mac-m1-resource-monitor.sh +123 -0
  230. package/engine/config.star +5 -0
  231. package/engine/entrypoint.star +101 -0
  232. package/engine/lifecycle/orchestrator.star +263 -0
  233. package/engine/paths.star +719 -0
  234. package/engine/schemas/project-schema.json +147 -0
  235. package/engine/schemas/service-schema.json +537 -0
  236. package/engine/scripts/README.md +89 -0
  237. package/engine/scripts/build-and-publish-lib.sh +207 -0
  238. package/engine/scripts/check-lib-publish.sh +87 -0
  239. package/engine/scripts/debug-container.sh +265 -0
  240. package/engine/scripts/generate-manifest.sh +200 -0
  241. package/engine/spec.master +702 -0
  242. package/engine/spec.master.example +341 -0
  243. package/engine/topologies/README.md +33 -0
  244. package/engine/topologies/platform/docker/AGENTS.md +59 -0
  245. package/engine/topologies/platform/docker/auth/auth.star +207 -0
  246. package/engine/topologies/platform/docker/build/frontend_build_plan.star +65 -0
  247. package/engine/topologies/platform/docker/build/golden_image.star +37 -0
  248. package/engine/topologies/platform/docker/build/golden_image_build.star +144 -0
  249. package/engine/topologies/platform/docker/build/golden_image_constants.star +100 -0
  250. package/engine/topologies/platform/docker/build/golden_image_dockerfile.star +263 -0
  251. package/engine/topologies/platform/docker/compose/compose.star +637 -0
  252. package/engine/topologies/platform/docker/compose/compose_helpers.star +54 -0
  253. package/engine/topologies/platform/docker/compose/traefik_standalone.star +171 -0
  254. package/engine/topologies/platform/docker/config/bunignore.star +144 -0
  255. package/engine/topologies/platform/docker/config/dockerignore.star +152 -0
  256. package/engine/topologies/platform/docker/config/healthcheck.star +58 -0
  257. package/engine/topologies/platform/docker/constants.star +211 -0
  258. package/engine/topologies/platform/docker/dockerfile/dockerfile.star +56 -0
  259. package/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +264 -0
  260. package/engine/topologies/platform/docker/generators/golden_docker_generator_v2.star +76 -0
  261. package/engine/topologies/platform/docker/index.star +40 -0
  262. package/engine/topologies/platform/docker/layers/bun_helpers.star +25 -0
  263. package/engine/topologies/platform/docker/layers/infisical/index.star +42 -0
  264. package/engine/topologies/platform/docker/layers/infisical/infisical_docker.star +264 -0
  265. package/engine/topologies/platform/docker/layers/l1_base_layers.star +89 -0
  266. package/engine/topologies/platform/docker/layers/l2_dependency_layers.star +147 -0
  267. package/engine/topologies/platform/docker/layers/l3_builder_layers.star +229 -0
  268. package/engine/topologies/platform/docker/layers/l4_runtime_layers.star +282 -0
  269. package/engine/topologies/platform/docker/layers/prisma/constants.star +138 -0
  270. package/engine/topologies/platform/docker/layers/prisma/db_readiness.star +98 -0
  271. package/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +131 -0
  272. package/engine/topologies/platform/docker/layers/prisma/migrate_script.star +100 -0
  273. package/engine/topologies/platform/docker/layers/prisma/prisma_build.star +128 -0
  274. package/engine/topologies/platform/docker/layers/prisma/prisma_runtime.star +205 -0
  275. package/engine/topologies/platform/docker/layers/prisma/secret_resolution.star +121 -0
  276. package/engine/topologies/platform/docker/networking/api_path_constants.star +206 -0
  277. package/engine/topologies/platform/docker/networking/sablier_container_cycle.star +31 -0
  278. package/engine/topologies/platform/docker/networking/traefik.star +266 -0
  279. package/engine/topologies/platform/docker/networking/traefik_constants.star +148 -0
  280. package/engine/topologies/platform/docker/networking/traefik_helpers.star +162 -0
  281. package/engine/topologies/platform/docker/networking/traefik_static_routes.star +165 -0
  282. package/engine/topologies/platform/docker/secrets/env_secrets.star +74 -0
  283. package/engine/topologies/platform/docker/secrets/infisical.star +109 -0
  284. package/engine/topologies/platform/net/AGENTS.md +64 -0
  285. package/engine/topologies/platform/net/proxy.star +6 -0
  286. package/engine/topologies/platform/registries/local.star +6 -0
  287. package/engine/topologies/platform/registries/verdaccio_loader.star +20 -0
  288. package/engine/topologies/platform/security/AGENTS.md +49 -0
  289. package/engine/topologies/platform/security/secrets.star +241 -0
  290. package/engine/topologies/platform/state/AGENTS.md +64 -0
  291. package/engine/topologies/platform/state/relational.star +6 -0
  292. package/engine/topologies/tilt/common/AGENTS.md +59 -0
  293. package/engine/topologies/tilt/common/utils.star +409 -0
  294. package/engine/topologies/tilt/common/utils_debug.star +71 -0
  295. package/engine/topologies/tilt/common/utils_deterministic.star +170 -0
  296. package/engine/topologies/tilt/common/utils_docker_networks.star +54 -0
  297. package/engine/topologies/tilt/common/utils_env.star +92 -0
  298. package/engine/topologies/tilt/common/utils_output.star +99 -0
  299. package/engine/topologies/tilt/config/AGENTS.md +68 -0
  300. package/engine/topologies/tilt/config/defaults.star +5 -0
  301. package/engine/topologies/tilt/config/feature_flags.star +12 -0
  302. package/engine/topologies/tilt/config/global.star +57 -0
  303. package/engine/topologies/tilt/config/profiles.star +398 -0
  304. package/engine/topologies/tilt/generators/agents_md.star +64 -0
  305. package/engine/topologies/tilt/generators/api_gateway.star +147 -0
  306. package/engine/topologies/tilt/generators/index.star +126 -0
  307. package/engine/topologies/tilt/generators/infisical/README.md +424 -0
  308. package/engine/topologies/tilt/generators/infisical/examples.star +314 -0
  309. package/engine/topologies/tilt/generators/infisical/index.star +59 -0
  310. package/engine/topologies/tilt/generators/infisical/machine_identity.star +422 -0
  311. package/engine/topologies/tilt/generators/infisical/organization.star +536 -0
  312. package/engine/topologies/tilt/generators/infisical/path_manager.star +478 -0
  313. package/engine/topologies/tilt/generators/infisical/secrets_generator.star +422 -0
  314. package/engine/topologies/tilt/generators/nginx_conf.star +145 -0
  315. package/engine/topologies/tilt/generators/npmrc.star +132 -0
  316. package/engine/topologies/tilt/generators/tsconfig.star +25 -0
  317. package/engine/topologies/tilt/generators/typescript/backend_library_tsconfig.star +73 -0
  318. package/engine/topologies/tilt/generators/typescript/backend_tsconfig.star +137 -0
  319. package/engine/topologies/tilt/generators/typescript/common.star +9 -0
  320. package/engine/topologies/tilt/generators/typescript/frontend_library_tsconfig.star +78 -0
  321. package/engine/topologies/tilt/generators/typescript/frontend_tsconfig.star +140 -0
  322. package/engine/topologies/tilt/generators/typescript/include.star +25 -0
  323. package/engine/topologies/tilt/generators/typescript/playwright_config.star +42 -0
  324. package/engine/topologies/tilt/generators/typescript/prisma_config.star +51 -0
  325. package/engine/topologies/tilt/generators/validators.star +868 -0
  326. package/engine/topologies/tilt/generators/vite/backend.star +80 -0
  327. package/engine/topologies/tilt/generators/vite/frameworks/lit.star +92 -0
  328. package/engine/topologies/tilt/generators/vite/frameworks/preact.star +94 -0
  329. package/engine/topologies/tilt/generators/vite/frameworks/qwik.star +94 -0
  330. package/engine/topologies/tilt/generators/vite/frameworks/react.star +128 -0
  331. package/engine/topologies/tilt/generators/vite/frameworks/solid.star +94 -0
  332. package/engine/topologies/tilt/generators/vite/frameworks/svelte.star +94 -0
  333. package/engine/topologies/tilt/generators/vite/frameworks/vanilla.star +92 -0
  334. package/engine/topologies/tilt/generators/vite/frameworks/vue.star +94 -0
  335. package/engine/topologies/tilt/generators/vite/frontend.star +153 -0
  336. package/engine/topologies/tilt/generators/vite/generators.star +45 -0
  337. package/engine/topologies/tilt/generators/vite/helpers.star +256 -0
  338. package/engine/topologies/tilt/generators/vite/library.star +67 -0
  339. package/engine/topologies/tilt/generators/vite/sdk.star +75 -0
  340. package/engine/topologies/tilt/generators/vite/templates.star +460 -0
  341. package/engine/topologies/tilt/generators/vite_config.star +24 -0
  342. package/engine/topologies/tilt/manifest/AGENTS.md +61 -0
  343. package/engine/topologies/tilt/manifest/README.md +679 -0
  344. package/engine/topologies/tilt/manifest/__init__.star +220 -0
  345. package/engine/topologies/tilt/manifest/constants.star +262 -0
  346. package/engine/topologies/tilt/manifest/errors.star +268 -0
  347. package/engine/topologies/tilt/manifest/integration.star +348 -0
  348. package/engine/topologies/tilt/manifest/json_to_yaml.py +61 -0
  349. package/engine/topologies/tilt/manifest/loader.star +239 -0
  350. package/engine/topologies/tilt/manifest/mapper.star +229 -0
  351. package/engine/topologies/tilt/manifest/parser.star +490 -0
  352. package/engine/topologies/tilt/manifest/schema.star +502 -0
  353. package/engine/topologies/tilt/manifest/tests/test_integration.star +278 -0
  354. package/engine/topologies/tilt/manifest/tests/test_loader_parser.star +475 -0
  355. package/engine/topologies/tilt/manifest/tests/test_manifest.star +319 -0
  356. package/engine/topologies/tilt/manifest/tests/test_validator.star +472 -0
  357. package/engine/topologies/tilt/manifest/validator.star +744 -0
  358. package/engine/topologies/tilt/manifest/yaml_to_json.py +20 -0
  359. package/engine/topologies/tilt/resources/AGENTS.md +71 -0
  360. package/engine/topologies/tilt/resources/build_concurrency.star +56 -0
  361. package/engine/topologies/tilt/resources/conditions.star +5 -0
  362. package/engine/topologies/tilt/resources/databases.star +246 -0
  363. package/engine/topologies/tilt/resources/declaration.star +5 -0
  364. package/engine/topologies/tilt/resources/deps.star +5 -0
  365. package/engine/topologies/tilt/resources/infra-loader.star +504 -0
  366. package/engine/topologies/tilt/resources/libs.star +32 -0
  367. package/engine/topologies/tilt/resources/libs_discovery.star +104 -0
  368. package/engine/topologies/tilt/resources/libs_paths.star +81 -0
  369. package/engine/topologies/tilt/resources/libs_resource_definition.star +153 -0
  370. package/engine/topologies/tilt/resources/libs_setup.star +166 -0
  371. package/engine/topologies/tilt/resources/libs_tsconfig.star +39 -0
  372. package/engine/topologies/tilt/resources/orchestrator/apply.star +79 -0
  373. package/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +864 -0
  374. package/engine/topologies/tilt/resources/orchestrator/apply_manifest_orchestration.star +90 -0
  375. package/engine/topologies/tilt/resources/orchestrator/apply_migrator_orchestration.star +150 -0
  376. package/engine/topologies/tilt/resources/orchestrator/apply_resource_validation.star +38 -0
  377. package/engine/topologies/tilt/resources/orchestrator/apply_runtime_flags.star +46 -0
  378. package/engine/topologies/tilt/resources/orchestrator/builders/typescript.star +193 -0
  379. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/AGENTS.md +75 -0
  380. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/index.star +23 -0
  381. package/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +136 -0
  382. package/engine/topologies/tilt/resources/orchestrator/generators/env.star +219 -0
  383. package/engine/topologies/tilt/resources/orchestrator/generators/frontend.star +172 -0
  384. package/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +577 -0
  385. package/engine/topologies/tilt/resources/orchestrator/helpers.star +35 -0
  386. package/engine/topologies/tilt/resources/orchestrator.star +56 -0
  387. package/engine/topologies/tilt/resources/ordering.star +5 -0
  388. package/engine/topologies/tilt/resources/shared-platform-postgres.star +30 -0
  389. package/engine/topologies/tilt/resources/triggers.star +5 -0
  390. package/engine/topologies/tilt/resources/watchers.star +304 -0
  391. package/engine/where-things-live.star +719 -0
  392. package/examples/tdk-example/LICENSE +21 -0
  393. package/examples/tdk-example/README.md +23 -0
  394. package/examples/tdk-example/TILT_SERVICE_DEFAULTS.star +42 -0
  395. package/examples/tdk-example/TILT_TECH_STACK.star +67 -0
  396. package/examples/tdk-example/Tiltfile +25 -0
  397. package/examples/tdk-example/services/platform/messaging/docker-compose.yml +26 -0
  398. package/examples/tdk-example/services/shop/orders-api/package.json +20 -0
  399. package/examples/tdk-example/services/shop/orders-api/service.json +14 -0
  400. package/examples/tdk-example/services/shop/orders-api/src/index.ts +81 -0
  401. package/examples/tdk-example/services/shop/orders-app/index.html +12 -0
  402. package/examples/tdk-example/services/shop/orders-app/package.json +23 -0
  403. package/examples/tdk-example/services/shop/orders-app/public/.gitkeep +0 -0
  404. package/examples/tdk-example/services/shop/orders-app/service.json +9 -0
  405. package/examples/tdk-example/services/shop/orders-app/src/main.tsx +9 -0
  406. package/examples/tdk-example/services/shop/orders-app/src/orders.tsx +67 -0
  407. package/examples/tdk-example/services/shop/orders-app/src/style.css +15 -0
  408. package/examples/tdk-example/services/shop/orders-worker/package.json +18 -0
  409. package/examples/tdk-example/services/shop/orders-worker/service.json +13 -0
  410. package/examples/tdk-example/services/shop/orders-worker/src/index.ts +33 -0
  411. package/ext/Tiltfile +66 -0
  412. package/ext/ide-components/README.md +221 -0
  413. package/ext/ide-components/code_viewer/server.py +208 -0
  414. package/ext/ide-components/config_inspector/server.py +1052 -0
  415. package/ext/ide-components/file_browser/server.py +287 -0
  416. package/ext/ide-components/shared/config_service.py +471 -0
  417. package/ext/ide-components/shared/file_utils.py +300 -0
  418. package/ext/ide-components/shared/http_utils.py +234 -0
  419. package/ext/ide-components/shared/static/styles.css +1334 -0
  420. package/ext/ide-components/shared/syntax_highlighter.py +142 -0
  421. package/ext/ide-components/shared/template_engine.py +125 -0
  422. package/ext/ide-components/shared/templates/base.html +121 -0
  423. package/ext/ide-components/shared/test_config_service.py +328 -0
  424. package/ext/ide-components/shared/tilt_integration.py +160 -0
  425. package/ext/ui-enhancements/cron-status-server.sh +51 -0
  426. package/ext/ui-enhancements/cron-status-tracker.sh +148 -0
  427. package/ext/ui-enhancements/extension.yaml +36 -0
  428. package/ext/ui-enhancements/tiltfile.py +101 -0
  429. package/ext/ui-enhancements/ui/cron-jobs-tab.css +396 -0
  430. package/ext/ui-enhancements/ui/help-panel.css +279 -0
  431. package/ext/ui-enhancements/ui/icons.css +125 -0
  432. package/ext/ui-enhancements/ui/tooltips.css +114 -0
  433. package/package.json +94 -4
  434. package/shared-platform-engineering/docker-templates/bun-hoisted-symlink-fix.sh +25 -0
  435. package/shared-platform-engineering/docker-templates/infisical-entrypoint.sh +466 -0
  436. package/shared-platform-engineering/docker-templates/install-deps.sh +154 -0
  437. package/shared-platform-engineering/docker-templates/prisma-bun-client-link-fix.sh +14 -0
  438. package/shared-platform-engineering/docker-templates/prisma-normalize-client.sh +58 -0
  439. package/specs/specs/TILT_SERVICE_DEFAULTS.star +207 -0
  440. package/specs/specs/TILT_TECH_STACK.star +161 -0
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright (c) 2026 Flisk Landscape contributors
3
+ # SPDX-License-Identifier: MIT
4
+ """
5
+ Shared file utilities for Tilt IDE components
6
+ """
7
+
8
+ import os
9
+ import sys
10
+ from pathlib import Path
11
+ from typing import Optional, List, Tuple
12
+
13
+ # Flisk CLI root directory (5 levels up from this file: ext/ide-components/shared/)
14
+ PROJECT_ROOT = Path(__file__).parent.parent.parent.parent.parent
15
+ MAX_FILE_SIZE = 1024 * 1024 # 1MB
16
+
17
+
18
+ class FileUtils:
19
+ """Safe file operations for IDE components"""
20
+
21
+ @staticmethod
22
+ def validate_path(path: str) -> Optional[Path]:
23
+ """
24
+ Validate and sanitize a file path.
25
+ Returns absolute Path if valid, None if invalid.
26
+
27
+ Security: Prevents path traversal attacks by ensuring
28
+ the resolved path is within the project root.
29
+ """
30
+ try:
31
+ # Handle relative paths
32
+ if not path.startswith('/'):
33
+ target = PROJECT_ROOT / path
34
+ else:
35
+ target = Path(path)
36
+
37
+ # Resolve to absolute, removing .. and symlinks
38
+ resolved = target.resolve()
39
+
40
+ # Ensure within project root
41
+ try:
42
+ resolved.relative_to(PROJECT_ROOT.resolve())
43
+ except ValueError:
44
+ return None
45
+
46
+ return resolved
47
+ except (ValueError, OSError, RuntimeError):
48
+ return None
49
+
50
+ @staticmethod
51
+ def get_file_info(file_path: Path) -> dict:
52
+ """Get file metadata for display"""
53
+ stat = file_path.stat()
54
+ size = stat.st_size
55
+
56
+ # Human-readable size
57
+ if size < 1024:
58
+ size_str = f"{size} B"
59
+ elif size < 1024 * 1024:
60
+ size_str = f"{size / 1024:.1f} KB"
61
+ else:
62
+ size_str = f"{size / (1024 * 1024):.1f} MB"
63
+
64
+ # Modified time
65
+ from datetime import datetime
66
+ mtime = datetime.fromtimestamp(stat.st_mtime)
67
+ mtime_str = mtime.strftime("%Y-%m-%d %H:%M")
68
+
69
+ # File type icon
70
+ ext = file_path.suffix.lower()
71
+ icon = FileUtils.get_file_icon(ext, file_path.is_dir(), file_path.name)
72
+
73
+ return {
74
+ 'name': file_path.name,
75
+ 'path': str(file_path.relative_to(PROJECT_ROOT)),
76
+ 'size': size,
77
+ 'size_str': size_str,
78
+ 'modified': mtime_str,
79
+ 'is_dir': file_path.is_dir(),
80
+ 'icon': icon,
81
+ 'extension': ext,
82
+ }
83
+
84
+ @staticmethod
85
+ def get_file_icon(ext: str, is_dir: bool, filename: str = '') -> str:
86
+ """Get emoji icon for file type"""
87
+ if is_dir:
88
+ if filename.startswith('.'):
89
+ return '🔒'
90
+ if filename in ('node_modules', 'vendor', '__pycache__'):
91
+ return '📦'
92
+ return '📁'
93
+
94
+ # Check special filenames first (exact match)
95
+ special_icons = {
96
+ 'Makefile': '🔨',
97
+ 'README': '📖',
98
+ 'LICENSE': '📜',
99
+ 'Dockerfile': '🐳',
100
+ 'docker-compose.yml': '🐳',
101
+ 'docker-compose.yaml': '🐳',
102
+ '.gitignore': '🚫',
103
+ 'go.mod': '🔵',
104
+ 'go.sum': '🔵',
105
+ 'Cargo.toml': '🦀',
106
+ 'Cargo.lock': '🦀',
107
+ 'package.json': '⬡',
108
+ 'package-lock.json': '⬡',
109
+ 'requirements.txt': '🐍',
110
+ 'setup.py': '🐍',
111
+ }
112
+
113
+ if filename in special_icons:
114
+ return special_icons[filename]
115
+
116
+ icons = {
117
+ '.ts': '📘', '.tsx': '📘',
118
+ '.js': '📒', '.jsx': '📒',
119
+ '.mjs': '📒', '.cjs': '📒',
120
+ '.json': '📋',
121
+ '.yaml': '📋', '.yml': '📋',
122
+ '.star': '⭐',
123
+ '.py': '🐍',
124
+ '.pyc': '🐍',
125
+ '.pyo': '🐍',
126
+ '.ipynb': '📓',
127
+ '.md': '📝',
128
+ '.mdx': '📝',
129
+ '.txt': '📄',
130
+ '.prisma': '🗃️',
131
+ '.dockerfile': '🐳', '.docker': '🐳',
132
+ '.sh': '🔧',
133
+ '.bash': '🔧',
134
+ '.zsh': '🔧',
135
+ '.fish': '🔧',
136
+ '.css': '🎨', '.scss': '🎨', '.sass': '🎨', '.less': '🎨',
137
+ '.html': '🌐', '.htm': '🌐', '.xhtml': '🌐',
138
+ '.vue': '💚',
139
+ '.svelte': '🧡',
140
+ '.conf': '⚙️', '.config': '⚙️', '.cfg': '⚙️',
141
+ '.ini': '⚙️',
142
+ '.toml': '⚙️',
143
+ '.env': '🔐',
144
+ '.env.local': '🔐', '.env.production': '🔐', '.env.development': '🔐',
145
+ '.sql': '🗄️',
146
+ '.go': '🔵',
147
+ '.rs': '🦀',
148
+ '.java': '☕',
149
+ '.class': '☕',
150
+ '.jar': '☕',
151
+ '.kt': '💜',
152
+ '.swift': '🦅',
153
+ '.rb': '💎',
154
+ '.php': '🐘',
155
+ '.c': '🇨',
156
+ '.cpp': '🇨🇵',
157
+ '.cc': '🇨🇵',
158
+ '.h': '📋',
159
+ '.hpp': '📋',
160
+ '.zig': '⚡',
161
+ '.lua': '🌙',
162
+ '.r': '📊',
163
+ '.R': '📊',
164
+ '.lock': '🔒',
165
+ }
166
+
167
+ return icons.get(ext, '📄')
168
+
169
+ @staticmethod
170
+ def read_file_safe(file_path: str, max_size: int = MAX_FILE_SIZE) -> Tuple[Optional[str], Optional[str]]:
171
+ """
172
+ Safely read a file with size limit.
173
+
174
+ Returns: (content, error_message)
175
+ - If success: (content, None)
176
+ - If error: (None, error_message)
177
+ """
178
+ resolved = FileUtils.validate_path(file_path)
179
+
180
+ if not resolved:
181
+ return None, "Invalid path or access denied"
182
+
183
+ if not resolved.exists():
184
+ return None, f"File not found: {file_path}"
185
+
186
+ if resolved.is_dir():
187
+ return None, "Path is a directory, not a file"
188
+
189
+ # Check size
190
+ size = resolved.stat().st_size
191
+ if size > max_size:
192
+ return None, f"File too large ({size / (1024*1024):.1f} MB > {max_size / (1024*1024):.1f} MB limit)"
193
+
194
+ try:
195
+ with open(resolved, 'r', encoding='utf-8', errors='replace') as f:
196
+ return f.read(), None
197
+ except Exception as e:
198
+ return None, f"Error reading file: {str(e)}"
199
+
200
+ @staticmethod
201
+ def list_directory(dir_path: str) -> Tuple[Optional[List[dict]], Optional[str]]:
202
+ """
203
+ List directory contents safely.
204
+
205
+ Returns: (items, error_message)
206
+ """
207
+ resolved = FileUtils.validate_path(dir_path)
208
+
209
+ if not resolved:
210
+ return None, "Invalid path or access denied"
211
+
212
+ if not resolved.exists():
213
+ return None, f"Directory not found: {dir_path}"
214
+
215
+ if not resolved.is_dir():
216
+ return None, "Path is not a directory"
217
+
218
+ try:
219
+ items = []
220
+ for entry in sorted(resolved.iterdir()):
221
+ # Skip hidden files
222
+ if entry.name.startswith('.'):
223
+ continue
224
+ items.append(FileUtils.get_file_info(entry))
225
+ return items, None
226
+ except Exception as e:
227
+ return None, f"Error reading directory: {str(e)}"
228
+
229
+ @staticmethod
230
+ def search_files(query: str, max_results: int = 50) -> List[dict]:
231
+ """
232
+ Search for files by name across the project.
233
+
234
+ Returns list of matching file info dicts.
235
+ """
236
+ results = []
237
+ query_lower = query.lower()
238
+
239
+ try:
240
+ for root, dirs, files in os.walk(PROJECT_ROOT):
241
+ # Skip hidden directories and common ignores
242
+ dirs[:] = [d for d in dirs if not d.startswith('.') and
243
+ d not in ('node_modules', 'dist', 'build', '.git', '__pycache__', 'coverage')]
244
+
245
+ for name in files:
246
+ if query_lower in name.lower():
247
+ file_path = Path(root) / name
248
+ try:
249
+ info = FileUtils.get_file_info(file_path)
250
+ results.append(info)
251
+ if len(results) >= max_results:
252
+ return results
253
+ except (OSError, PermissionError):
254
+ continue
255
+
256
+ except Exception:
257
+ pass
258
+
259
+ return results
260
+
261
+ @staticmethod
262
+ def get_language_from_ext(ext: str) -> str:
263
+ """Get language identifier from file extension"""
264
+ languages = {
265
+ '.ts': 'typescript', '.tsx': 'typescript',
266
+ '.js': 'javascript', '.jsx': 'javascript',
267
+ '.json': 'json',
268
+ '.yaml': 'yaml', '.yml': 'yaml',
269
+ '.star': 'python', # Starlark is Python-like
270
+ '.py': 'python',
271
+ '.md': 'markdown',
272
+ '.prisma': 'prisma',
273
+ '.dockerfile': 'dockerfile',
274
+ '.sh': 'bash',
275
+ '.css': 'css', '.scss': 'scss', '.less': 'less',
276
+ '.html': 'html', '.htm': 'html',
277
+ '.sql': 'sql',
278
+ '.go': 'go',
279
+ '.rs': 'rust',
280
+ '.java': 'java',
281
+ }
282
+
283
+ return languages.get(ext, 'text')
284
+
285
+
286
+ if __name__ == '__main__':
287
+ # Quick test
288
+ print(f"Project root: {PROJECT_ROOT}")
289
+
290
+ # Test validate_path
291
+ test_paths = [
292
+ '.',
293
+ 'services/product/staff',
294
+ '../outside', # Should fail
295
+ '/etc/passwd', # Should fail
296
+ ]
297
+
298
+ for path in test_paths:
299
+ result = FileUtils.validate_path(path)
300
+ print(f"Path '{path}': {result}")
@@ -0,0 +1,234 @@
1
+ #!/usr/bin/env python3
2
+ # Copyright (c) 2026 Flisk Landscape contributors
3
+ # SPDX-License-Identifier: MIT
4
+ """
5
+ Shared HTTP handler utilities for Tilt IDE components.
6
+ Provides a base handler class with common HTTP functionality.
7
+ """
8
+
9
+ import json
10
+ from http.server import BaseHTTPRequestHandler
11
+ from pathlib import Path
12
+ from typing import Optional
13
+
14
+
15
+ class BaseIDEHandler(BaseHTTPRequestHandler):
16
+ """
17
+ Base HTTP handler for Tilt IDE components.
18
+
19
+ Provides common functionality:
20
+ - JSON/HTML response helpers
21
+ - HTML escaping for XSS prevention
22
+ - Page rendering with shared template
23
+ - Suppressed logging
24
+ """
25
+
26
+ # Shared template fallback (used when base.html is not found)
27
+ DEFAULT_TEMPLATE = '''<!DOCTYPE html>
28
+ <html lang="en">
29
+ <head>
30
+ <meta charset="UTF-8">
31
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
32
+ <title>{title}</title>
33
+ <link rel="stylesheet" href="/static/styles.css">
34
+ </head>
35
+ <body>
36
+ <header class="header">
37
+ <h1>{icon} {title}</h1>
38
+ {controls}
39
+ </header>
40
+ <div class="container">
41
+ {sidebar}
42
+ <main class="content">{content}</main>
43
+ </div>
44
+ {scripts}
45
+ </body>
46
+ </html>'''
47
+
48
+ def log_message(self, format, *args):
49
+ """Suppress default request logging."""
50
+ pass
51
+
52
+ def send_json_response(self, data: dict, status: int = 200) -> None:
53
+ """
54
+ Send a JSON response with CORS headers.
55
+
56
+ Args:
57
+ data: Response data to serialize as JSON
58
+ status: HTTP status code (default: 200)
59
+ """
60
+ self.send_response(status)
61
+ self.send_header('Content-Type', 'application/json')
62
+ self.send_header('Access-Control-Allow-Origin', '*')
63
+ self.end_headers()
64
+ self.wfile.write(json.dumps(data).encode())
65
+
66
+ def send_html_response(self, html: str, status: int = 200) -> None:
67
+ """
68
+ Send an HTML response with CORS headers.
69
+
70
+ Args:
71
+ html: HTML content to send
72
+ status: HTTP status code (default: 200)
73
+ """
74
+ self.send_response(status)
75
+ self.send_header('Content-Type', 'text/html; charset=utf-8')
76
+ self.send_header('Access-Control-Allow-Origin', '*')
77
+ self.end_headers()
78
+ self.wfile.write(html.encode())
79
+
80
+ def send_css_response(self, css: str) -> None:
81
+ """
82
+ Send a CSS response.
83
+
84
+ Args:
85
+ css: CSS content to send
86
+ """
87
+ self.send_response(200)
88
+ self.send_header('Content-Type', 'text/css')
89
+ self.end_headers()
90
+ self.wfile.write(css.encode())
91
+
92
+ def send_error_response(self, status: int, message: str) -> None:
93
+ """
94
+ Send an error response.
95
+
96
+ Args:
97
+ status: HTTP status code
98
+ message: Error message
99
+ """
100
+ self.send_response(status)
101
+ self.send_header('Content-Type', 'text/plain')
102
+ self.end_headers()
103
+ self.wfile.write(message.encode())
104
+
105
+ @staticmethod
106
+ def escape_html(text: str) -> str:
107
+ """
108
+ Escape HTML special characters to prevent XSS attacks.
109
+
110
+ Args:
111
+ text: Raw text to escape
112
+
113
+ Returns:
114
+ Escaped text safe for HTML insertion
115
+ """
116
+ return (text
117
+ .replace('&', '&amp;')
118
+ .replace('<', '&lt;')
119
+ .replace('>', '&gt;')
120
+ .replace('"', '&quot;')
121
+ .replace("'", '&#x27;'))
122
+
123
+ def render_page(
124
+ self,
125
+ title: str,
126
+ content: str,
127
+ icon: str = '📄',
128
+ sidebar: str = '',
129
+ controls: str = '',
130
+ scripts: str = ''
131
+ ) -> str:
132
+ """
133
+ Render a full HTML page using the base template.
134
+
135
+ Args:
136
+ title: Page title
137
+ content: Main content HTML
138
+ icon: Emoji icon for the page header
139
+ sidebar: Sidebar HTML (optional)
140
+ controls: Header controls HTML (optional)
141
+ scripts: Scripts to include before </body> (optional)
142
+
143
+ Returns:
144
+ Complete HTML page as string
145
+ """
146
+ # Try to load template from file
147
+ template = self._load_template()
148
+
149
+ # Build sidebar wrapper if content provided
150
+ sidebar_html = f'<aside class="sidebar">{sidebar}</aside>' if sidebar else ''
151
+
152
+ # Use string replacement to avoid conflicts with JS braces
153
+ result = template.replace('{title}', self.escape_html(title))
154
+ result = result.replace('{icon}', icon)
155
+ result = result.replace('{favicon}', icon)
156
+ result = result.replace('{controls}', controls)
157
+ result = result.replace('{sidebar}', sidebar_html)
158
+ result = result.replace('{content}', content)
159
+ result = result.replace('{scripts}', scripts)
160
+
161
+ return result
162
+
163
+ def _load_template(self) -> str:
164
+ """Load base template from file or return default."""
165
+ try:
166
+ template_path = self._get_template_path()
167
+ if template_path and template_path.exists():
168
+ with open(template_path, 'r', encoding='utf-8') as f:
169
+ return f.read()
170
+ except Exception:
171
+ pass
172
+ return self.DEFAULT_TEMPLATE
173
+
174
+ def _get_template_path(self) -> Optional[Path]:
175
+ """Get path to base template. Override in subclasses if needed."""
176
+ # Default: look in shared/templates/ relative to this file
177
+ shared_dir = Path(__file__).parent
178
+ return shared_dir / 'templates' / 'base.html'
179
+
180
+ def handle_health_check(self, service_name: str, features: Optional[list] = None) -> None:
181
+ """
182
+ Handle a standard health check request.
183
+
184
+ Args:
185
+ service_name: Name of the service for the response
186
+ features: Optional list of service features/capabilities
187
+ """
188
+ response = {
189
+ 'status': 'ok',
190
+ 'service': service_name
191
+ }
192
+ if features:
193
+ response['features'] = features
194
+ self.send_json_response(response)
195
+
196
+
197
+ def run_server(server_class, port: int, service_name: str, service_description: str) -> None:
198
+ """
199
+ Run an HTTP server with standard configuration.
200
+
201
+ Args:
202
+ server_class: The HTTP handler class to use
203
+ port: Port number to listen on
204
+ service_name: Name of the service for startup message
205
+ service_description: Brief description of the service
206
+ """
207
+ from http.server import HTTPServer
208
+
209
+ server = HTTPServer(('127.0.0.1', port), server_class)
210
+ print(f"{service_name} running at http://localhost:{port}")
211
+ if service_description:
212
+ print(f" {service_description}")
213
+
214
+ try:
215
+ server.serve_forever()
216
+ except KeyboardInterrupt:
217
+ print("\nShutting down...")
218
+ server.shutdown()
219
+
220
+
221
+ # Backwards compatibility: standalone functions that delegate to class methods
222
+ def send_json_response(handler: BaseHTTPRequestHandler, data: dict, status: int = 200) -> None:
223
+ """Standalone function for sending JSON responses (legacy compatibility)."""
224
+ BaseIDEHandler.send_json_response(handler, data, status)
225
+
226
+
227
+ def send_html_response(handler: BaseHTTPRequestHandler, html: str, status: int = 200) -> None:
228
+ """Standalone function for sending HTML responses (legacy compatibility)."""
229
+ BaseIDEHandler.send_html_response(handler, html, status)
230
+
231
+
232
+ def escape_html(text: str) -> str:
233
+ """Standalone function for HTML escaping (legacy compatibility)."""
234
+ return BaseIDEHandler.escape_html(text)