@agentlang/agentmanager 0.0.3

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 (507) hide show
  1. package/README.md +122 -0
  2. package/apps/agentcraft/README.md +237 -0
  3. package/apps/agentcraft/src/agentcraft-core.module.ts +40 -0
  4. package/apps/agentcraft/src/app.module.ts +28 -0
  5. package/apps/agentcraft/src/architect/architect.controller.ts +69 -0
  6. package/apps/agentcraft/src/architect/architect.module.ts +11 -0
  7. package/apps/agentcraft/src/architect/architect.service.ts +193 -0
  8. package/apps/agentcraft/src/architect/architect.store.ts +63 -0
  9. package/apps/agentcraft/src/architect/dto/ingest-signal.dto.ts +20 -0
  10. package/apps/agentcraft/src/architect/interfaces/architect.interfaces.ts +20 -0
  11. package/apps/agentcraft/src/autonomous/autonomous.controller.ts +92 -0
  12. package/apps/agentcraft/src/autonomous/autonomous.module.ts +9 -0
  13. package/apps/agentcraft/src/autonomous/autonomous.service.ts +160 -0
  14. package/apps/agentcraft/src/autonomous/dto/run-autonomous.dto.ts +16 -0
  15. package/apps/agentcraft/src/autonomous/dto/watch-kb.dto.ts +16 -0
  16. package/apps/agentcraft/src/config/configuration.ts +74 -0
  17. package/apps/agentcraft/src/health/health.controller.ts +22 -0
  18. package/apps/agentcraft/src/health/health.module.ts +9 -0
  19. package/apps/agentcraft/src/main.ts +53 -0
  20. package/apps/agentcraft/src/resolver/dto/create-resolver.dto.ts +14 -0
  21. package/apps/agentcraft/src/resolver/dto/install-registry.dto.ts +10 -0
  22. package/apps/agentcraft/src/resolver/dto/search-registry-query.dto.ts +10 -0
  23. package/apps/agentcraft/src/resolver/dto/submit-action.dto.ts +4 -0
  24. package/apps/agentcraft/src/resolver/resolver-session.store.ts +39 -0
  25. package/apps/agentcraft/src/resolver/resolver.controller.ts +86 -0
  26. package/apps/agentcraft/src/resolver/resolver.module.ts +10 -0
  27. package/apps/agentcraft/src/resolver/resolver.service.ts +128 -0
  28. package/apps/agentcraft/src/sessions/dto/create-session.dto.ts +12 -0
  29. package/apps/agentcraft/src/sessions/dto/submit-action.dto.ts +1 -0
  30. package/apps/agentcraft/src/sessions/dto/submit-idea.dto.ts +8 -0
  31. package/apps/agentcraft/src/sessions/session.store.ts +39 -0
  32. package/apps/agentcraft/src/sessions/sessions.controller.ts +87 -0
  33. package/apps/agentcraft/src/sessions/sessions.module.ts +10 -0
  34. package/apps/agentcraft/src/sessions/sessions.service.ts +277 -0
  35. package/apps/agentcraft/tsconfig.app.json +8 -0
  36. package/apps/agentmanager/README.md +141 -0
  37. package/apps/agentmanager/src/agentmanager-core.module.ts +45 -0
  38. package/apps/agentmanager/src/app.module.ts +26 -0
  39. package/apps/agentmanager/src/config/configuration.ts +63 -0
  40. package/apps/agentmanager/src/deployments/deployments.controller.ts +21 -0
  41. package/apps/agentmanager/src/deployments/deployments.module.ts +10 -0
  42. package/apps/agentmanager/src/deployments/deployments.service.ts +166 -0
  43. package/apps/agentmanager/src/deployments/errors/deployment.errors.ts +13 -0
  44. package/apps/agentmanager/src/deployments/interfaces/deployment.interfaces.ts +25 -0
  45. package/apps/agentmanager/src/discovery/discovery.controller.ts +14 -0
  46. package/apps/agentmanager/src/discovery/discovery.module.ts +36 -0
  47. package/apps/agentmanager/src/discovery/discovery.service.ts +174 -0
  48. package/apps/agentmanager/src/discovery/dto/discover.dto.ts +8 -0
  49. package/apps/agentmanager/src/discovery/interfaces/discovery.interfaces.ts +22 -0
  50. package/apps/agentmanager/src/discovery/llm/anthropic-llm.service.ts +67 -0
  51. package/apps/agentmanager/src/discovery/llm/llm-provider.interface.ts +17 -0
  52. package/apps/agentmanager/src/discovery/llm/llm.errors.ts +7 -0
  53. package/apps/agentmanager/src/discovery/llm/openai-llm.service.ts +67 -0
  54. package/apps/agentmanager/src/employee-code/dto/put-config.dto.ts +8 -0
  55. package/apps/agentmanager/src/employee-code/dto/put-module.dto.ts +8 -0
  56. package/apps/agentmanager/src/employee-code/dto/put-package.dto.ts +13 -0
  57. package/apps/agentmanager/src/employee-code/employee-code.controller.ts +114 -0
  58. package/apps/agentmanager/src/employee-code/employee-code.module.ts +10 -0
  59. package/apps/agentmanager/src/employee-code/employee-code.service.ts +55 -0
  60. package/apps/agentmanager/src/employees/dto/register-employee.dto.ts +9 -0
  61. package/apps/agentmanager/src/employees/employees.controller.ts +53 -0
  62. package/apps/agentmanager/src/employees/employees.module.ts +10 -0
  63. package/apps/agentmanager/src/employees/employees.service.ts +29 -0
  64. package/apps/agentmanager/src/health/health.controller.ts +22 -0
  65. package/apps/agentmanager/src/health/health.module.ts +9 -0
  66. package/apps/agentmanager/src/inbox/dto/list-messages-query.dto.ts +12 -0
  67. package/apps/agentmanager/src/inbox/dto/push-message.dto.ts +55 -0
  68. package/apps/agentmanager/src/inbox/dto/respond-message.dto.ts +9 -0
  69. package/apps/agentmanager/src/inbox/inbox.controller.ts +87 -0
  70. package/apps/agentmanager/src/inbox/inbox.module.ts +10 -0
  71. package/apps/agentmanager/src/inbox/inbox.service.ts +209 -0
  72. package/apps/agentmanager/src/main.ts +53 -0
  73. package/apps/agentmanager/src/projects/dto/create-project.dto.ts +10 -0
  74. package/apps/agentmanager/src/projects/projects.controller.ts +47 -0
  75. package/apps/agentmanager/src/projects/projects.module.ts +10 -0
  76. package/apps/agentmanager/src/projects/projects.service.ts +24 -0
  77. package/apps/agentmanager/tsconfig.app.json +8 -0
  78. package/apps/fabric/Dockerfile +22 -0
  79. package/apps/fabric/docker-compose.yml +14 -0
  80. package/apps/fabric/ecosystem.config.cjs +17 -0
  81. package/apps/fabric/src/ai-agent/ai-agent.module.ts +43 -0
  82. package/apps/fabric/src/ai-agent/ai-agent.service.ts +374 -0
  83. package/apps/fabric/src/ai-agent/probe-investigation.types.ts +24 -0
  84. package/apps/fabric/src/app.module.ts +40 -0
  85. package/apps/fabric/src/auth/current-user.decorator.ts +11 -0
  86. package/apps/fabric/src/auth/request-user.ts +4 -0
  87. package/apps/fabric/src/config/configuration.ts +266 -0
  88. package/apps/fabric/src/database/entities/deployment-event.entity.ts +33 -0
  89. package/apps/fabric/src/database/entities/environment.entity.ts +25 -0
  90. package/apps/fabric/src/database/entities/index.ts +25 -0
  91. package/apps/fabric/src/database/entities/project.entity.ts +25 -0
  92. package/apps/fabric/src/database/entities/runtime.entity.ts +55 -0
  93. package/apps/fabric/src/database/entities/user-config.entity.ts +22 -0
  94. package/apps/fabric/src/database/entities/version.entity.ts +22 -0
  95. package/apps/fabric/src/database/migrations-data-source.ts +27 -0
  96. package/apps/fabric/src/deployment-events/deployment-events.controller.ts +27 -0
  97. package/apps/fabric/src/deployment-events/deployment-events.module.ts +11 -0
  98. package/apps/fabric/src/deployment-events/deployment-events.service.ts +58 -0
  99. package/apps/fabric/src/deployment-events/deployment-events.store.ts +162 -0
  100. package/apps/fabric/src/deployment-events/deployment-events.types.ts +24 -0
  101. package/apps/fabric/src/employees/dto/deploy.dto.ts +71 -0
  102. package/apps/fabric/src/employees/employees.controller.ts +217 -0
  103. package/apps/fabric/src/employees/employees.module.ts +32 -0
  104. package/apps/fabric/src/employees/employees.service.ts +1333 -0
  105. package/apps/fabric/src/employees/employees.types.ts +69 -0
  106. package/apps/fabric/src/employees/errors/employee-deployment.errors.ts +80 -0
  107. package/apps/fabric/src/employees/runtime.store.ts +304 -0
  108. package/apps/fabric/src/environments/dto/environment.dto.ts +26 -0
  109. package/apps/fabric/src/environments/environments.controller.ts +48 -0
  110. package/apps/fabric/src/environments/environments.module.ts +11 -0
  111. package/apps/fabric/src/environments/environments.service.ts +92 -0
  112. package/apps/fabric/src/environments/environments.store.ts +146 -0
  113. package/apps/fabric/src/environments/environments.types.ts +11 -0
  114. package/apps/fabric/src/environments/errors/environment.errors.ts +14 -0
  115. package/apps/fabric/src/fabric-core.module.ts +48 -0
  116. package/apps/fabric/src/health/health.controller.ts +19 -0
  117. package/apps/fabric/src/health/health.module.ts +12 -0
  118. package/apps/fabric/src/health/provider-health.indicator.ts +33 -0
  119. package/apps/fabric/src/healthcheck/healthcheck.module.ts +24 -0
  120. package/apps/fabric/src/healthcheck/healthcheck.service.ts +494 -0
  121. package/apps/fabric/src/logs/logs.module.ts +10 -0
  122. package/apps/fabric/src/logs/logs.service.ts +149 -0
  123. package/apps/fabric/src/main.ts +57 -0
  124. package/apps/fabric/src/notifications/notifications.module.ts +23 -0
  125. package/apps/fabric/src/notifications/notifications.service.ts +141 -0
  126. package/apps/fabric/src/project-source/errors/project-source.errors.ts +8 -0
  127. package/apps/fabric/src/project-source/project-source.module.ts +8 -0
  128. package/apps/fabric/src/project-source/project-source.service.ts +75 -0
  129. package/apps/fabric/src/project-source/project-source.types.ts +5 -0
  130. package/apps/fabric/src/projects/dto/project.dto.ts +25 -0
  131. package/apps/fabric/src/projects/errors/project.errors.ts +17 -0
  132. package/apps/fabric/src/projects/projects-data.service.ts +60 -0
  133. package/apps/fabric/src/projects/projects.controller.ts +92 -0
  134. package/apps/fabric/src/projects/projects.module.ts +20 -0
  135. package/apps/fabric/src/projects/projects.service.ts +323 -0
  136. package/apps/fabric/src/projects/projects.store.ts +142 -0
  137. package/apps/fabric/src/projects/projects.types.ts +9 -0
  138. package/apps/fabric/src/providers/docker-provider.ts +141 -0
  139. package/apps/fabric/src/providers/eks-provider.ts +279 -0
  140. package/apps/fabric/src/providers/pm2-provider.ts +205 -0
  141. package/apps/fabric/src/providers/port-allocator.ts +57 -0
  142. package/apps/fabric/src/providers/provider-factory.ts +32 -0
  143. package/apps/fabric/src/providers/provider.interface.ts +50 -0
  144. package/apps/fabric/src/providers/providers.module.ts +26 -0
  145. package/apps/fabric/src/provisioners/cognito-provisioner.service.ts +168 -0
  146. package/apps/fabric/src/provisioners/postgres-provisioner.service.ts +124 -0
  147. package/apps/fabric/src/provisioners/provisioners.module.ts +40 -0
  148. package/apps/fabric/src/user-config/user-config.module.ts +9 -0
  149. package/apps/fabric/src/user-config/user-config.service.ts +54 -0
  150. package/apps/fabric/src/user-config/user-config.store.ts +120 -0
  151. package/apps/fabric/src/user-config/user-config.types.ts +11 -0
  152. package/apps/fabric/src/versions/versions.controller.ts +24 -0
  153. package/apps/fabric/src/versions/versions.module.ts +11 -0
  154. package/apps/fabric/src/versions/versions.service.ts +65 -0
  155. package/apps/fabric/src/versions/versions.store.ts +160 -0
  156. package/apps/fabric/src/versions/versions.types.ts +12 -0
  157. package/apps/fabric/src/watcher/deployment-watcher.module.ts +22 -0
  158. package/apps/fabric/src/watcher/deployment-watcher.service.ts +92 -0
  159. package/apps/fabric/src/watcher/pod-probe.service.ts +231 -0
  160. package/apps/fabric/tsconfig.app.json +8 -0
  161. package/apps/integrations/prisma/.integrations/integrations.sqlite +0 -0
  162. package/apps/integrations/prisma/prisma.config.ts +8 -0
  163. package/apps/integrations/prisma/prisma.sqlite.config.ts +8 -0
  164. package/apps/integrations/prisma/schema.postgres.prisma +27 -0
  165. package/apps/integrations/prisma/schema.sqlite.prisma +27 -0
  166. package/apps/integrations/scripts/prepare-db.cjs +92 -0
  167. package/apps/integrations/src/api/auth-flow.controller.ts +39 -0
  168. package/apps/integrations/src/api/connections.controller.ts +26 -0
  169. package/apps/integrations/src/api/health.controller.ts +34 -0
  170. package/apps/integrations/src/api/providers.controller.ts +60 -0
  171. package/apps/integrations/src/api/tenant-config.controller.ts +62 -0
  172. package/apps/integrations/src/app.module.ts +38 -0
  173. package/apps/integrations/src/config/configuration.ts +134 -0
  174. package/apps/integrations/src/generated/prisma-postgres/browser.ts +24 -0
  175. package/apps/integrations/src/generated/prisma-postgres/client.ts +46 -0
  176. package/apps/integrations/src/generated/prisma-postgres/commonInputTypes.ts +297 -0
  177. package/apps/integrations/src/generated/prisma-postgres/enums.ts +15 -0
  178. package/apps/integrations/src/generated/prisma-postgres/internal/class.ts +204 -0
  179. package/apps/integrations/src/generated/prisma-postgres/internal/prismaNamespace.ts +794 -0
  180. package/apps/integrations/src/generated/prisma-postgres/internal/prismaNamespaceBrowser.ts +126 -0
  181. package/apps/integrations/src/generated/prisma-postgres/models/IntegrationEntity.ts +1273 -0
  182. package/apps/integrations/src/generated/prisma-postgres/models.ts +12 -0
  183. package/apps/integrations/src/generated/prisma-sqlite/browser.ts +24 -0
  184. package/apps/integrations/src/generated/prisma-sqlite/client.ts +46 -0
  185. package/apps/integrations/src/generated/prisma-sqlite/commonInputTypes.ts +278 -0
  186. package/apps/integrations/src/generated/prisma-sqlite/enums.ts +15 -0
  187. package/apps/integrations/src/generated/prisma-sqlite/internal/class.ts +204 -0
  188. package/apps/integrations/src/generated/prisma-sqlite/internal/prismaNamespace.ts +770 -0
  189. package/apps/integrations/src/generated/prisma-sqlite/internal/prismaNamespaceBrowser.ts +123 -0
  190. package/apps/integrations/src/generated/prisma-sqlite/models/IntegrationEntity.ts +1271 -0
  191. package/apps/integrations/src/generated/prisma-sqlite/models.ts +12 -0
  192. package/apps/integrations/src/integrations-core.module.ts +52 -0
  193. package/apps/integrations/src/main.ts +63 -0
  194. package/apps/integrations/src/modules/auth-flow/auth-flow.module.ts +21 -0
  195. package/apps/integrations/src/modules/auth-flow/auth-flow.service.ts +275 -0
  196. package/apps/integrations/src/modules/auth-flow/dto/auth-flow.dto.ts +36 -0
  197. package/apps/integrations/src/modules/auth-flow/scheduler.service.ts +73 -0
  198. package/apps/integrations/src/modules/connections/connections.module.ts +11 -0
  199. package/apps/integrations/src/modules/connections/connections.service.ts +109 -0
  200. package/apps/integrations/src/modules/credentials/credentials.module.ts +11 -0
  201. package/apps/integrations/src/modules/credentials/encryption.service.ts +71 -0
  202. package/apps/integrations/src/modules/credentials/token-store.service.ts +82 -0
  203. package/apps/integrations/src/modules/discovery/discovery.module.ts +8 -0
  204. package/apps/integrations/src/modules/discovery/oidc-discovery.service.ts +114 -0
  205. package/apps/integrations/src/modules/platform/metadata-store.service.ts +337 -0
  206. package/apps/integrations/src/modules/platform/platform.module.ts +8 -0
  207. package/apps/integrations/src/modules/platform/platform.types.ts +10 -0
  208. package/apps/integrations/src/modules/platform/resilient-fetch.ts +53 -0
  209. package/apps/integrations/src/modules/providers/base/api-key.provider.ts +43 -0
  210. package/apps/integrations/src/modules/providers/base/basic-auth.provider.ts +44 -0
  211. package/apps/integrations/src/modules/providers/base/oauth2.provider.ts +233 -0
  212. package/apps/integrations/src/modules/providers/base/oidc.provider.ts +87 -0
  213. package/apps/integrations/src/modules/providers/builtin/google-drive.provider.ts +40 -0
  214. package/apps/integrations/src/modules/providers/dto/provider.dto.ts +53 -0
  215. package/apps/integrations/src/modules/providers/provider.factory.ts +68 -0
  216. package/apps/integrations/src/modules/providers/provider.registry.ts +123 -0
  217. package/apps/integrations/src/modules/providers/provider.types.ts +185 -0
  218. package/apps/integrations/src/modules/providers/providers.module.ts +34 -0
  219. package/apps/integrations/src/modules/tenant-config/dto/tenant-config.dto.ts +28 -0
  220. package/apps/integrations/src/modules/tenant-config/tenant-config.module.ts +11 -0
  221. package/apps/integrations/src/modules/tenant-config/tenant-config.service.ts +212 -0
  222. package/apps/integrations/tsconfig.app.json +8 -0
  223. package/apps/knowledge/prisma/prisma.config.ts +8 -0
  224. package/apps/knowledge/prisma/schema.postgres.prisma +29 -0
  225. package/apps/knowledge/prisma/schema.sqlite.prisma +29 -0
  226. package/apps/knowledge/scripts/prepare-db.cjs +72 -0
  227. package/apps/knowledge/src/api/auth.controller.ts +54 -0
  228. package/apps/knowledge/src/api/connections.controller.ts +99 -0
  229. package/apps/knowledge/src/api/documents.controller.ts +45 -0
  230. package/apps/knowledge/src/api/graph.controller.ts +67 -0
  231. package/apps/knowledge/src/api/health.controller.ts +39 -0
  232. package/apps/knowledge/src/api/ingestion.controller.ts +45 -0
  233. package/apps/knowledge/src/api/knowledge-query.controller.ts +27 -0
  234. package/apps/knowledge/src/api/oauth.controller.ts +38 -0
  235. package/apps/knowledge/src/api/recommendations.controller.ts +63 -0
  236. package/apps/knowledge/src/api/scheduler.controller.ts +32 -0
  237. package/apps/knowledge/src/api/topics.controller.ts +46 -0
  238. package/apps/knowledge/src/app.module.ts +68 -0
  239. package/apps/knowledge/src/config/configuration.ts +149 -0
  240. package/apps/knowledge/src/generated/prisma-postgres/browser.ts +24 -0
  241. package/apps/knowledge/src/generated/prisma-postgres/client.ts +46 -0
  242. package/apps/knowledge/src/generated/prisma-postgres/commonInputTypes.ts +297 -0
  243. package/apps/knowledge/src/generated/prisma-postgres/enums.ts +15 -0
  244. package/apps/knowledge/src/generated/prisma-postgres/internal/class.ts +204 -0
  245. package/apps/knowledge/src/generated/prisma-postgres/internal/prismaNamespace.ts +795 -0
  246. package/apps/knowledge/src/generated/prisma-postgres/internal/prismaNamespaceBrowser.ts +127 -0
  247. package/apps/knowledge/src/generated/prisma-postgres/models/KnowledgeEntity.ts +1301 -0
  248. package/apps/knowledge/src/generated/prisma-postgres/models.ts +12 -0
  249. package/apps/knowledge/src/generated/prisma-sqlite/browser.ts +24 -0
  250. package/apps/knowledge/src/generated/prisma-sqlite/client.ts +46 -0
  251. package/apps/knowledge/src/generated/prisma-sqlite/commonInputTypes.ts +278 -0
  252. package/apps/knowledge/src/generated/prisma-sqlite/enums.ts +15 -0
  253. package/apps/knowledge/src/generated/prisma-sqlite/internal/class.ts +204 -0
  254. package/apps/knowledge/src/generated/prisma-sqlite/internal/prismaNamespace.ts +771 -0
  255. package/apps/knowledge/src/generated/prisma-sqlite/internal/prismaNamespaceBrowser.ts +124 -0
  256. package/apps/knowledge/src/generated/prisma-sqlite/models/KnowledgeEntity.ts +1299 -0
  257. package/apps/knowledge/src/generated/prisma-sqlite/models.ts +12 -0
  258. package/apps/knowledge/src/main.ts +48 -0
  259. package/apps/knowledge/src/modules/auth/auth.module.ts +8 -0
  260. package/apps/knowledge/src/modules/auth/auth.service.ts +290 -0
  261. package/apps/knowledge/src/modules/documents/documents.module.ts +12 -0
  262. package/apps/knowledge/src/modules/documents/documents.service.ts +179 -0
  263. package/apps/knowledge/src/modules/documents/dto/document.dto.ts +68 -0
  264. package/apps/knowledge/src/modules/graph/graph.module.ts +10 -0
  265. package/apps/knowledge/src/modules/graph/graph.service.ts +223 -0
  266. package/apps/knowledge/src/modules/ingestion/dto/ingestion.dto.ts +58 -0
  267. package/apps/knowledge/src/modules/ingestion/ingestion-workflows.service.ts +246 -0
  268. package/apps/knowledge/src/modules/ingestion/ingestion.module.ts +14 -0
  269. package/apps/knowledge/src/modules/ingestion/ingestion.service.ts +619 -0
  270. package/apps/knowledge/src/modules/oauth-bridge/oauth-bridge.module.ts +8 -0
  271. package/apps/knowledge/src/modules/oauth-bridge/oauth-bridge.service.ts +135 -0
  272. package/apps/knowledge/src/modules/platform/metadata-store.service.ts +314 -0
  273. package/apps/knowledge/src/modules/platform/platform.module.ts +9 -0
  274. package/apps/knowledge/src/modules/platform/platform.types.ts +23 -0
  275. package/apps/knowledge/src/modules/platform/vector-store.service.ts +235 -0
  276. package/apps/knowledge/src/modules/recommendations/recommendations.module.ts +10 -0
  277. package/apps/knowledge/src/modules/recommendations/recommendations.service.ts +121 -0
  278. package/apps/knowledge/src/modules/storage/storage.module.ts +8 -0
  279. package/apps/knowledge/src/modules/storage/storage.service.ts +150 -0
  280. package/apps/knowledge/src/modules/sync/scheduler.service.ts +175 -0
  281. package/apps/knowledge/src/modules/sync/sync.module.ts +11 -0
  282. package/apps/knowledge/src/modules/topics/dto/topic.dto.ts +50 -0
  283. package/apps/knowledge/src/modules/topics/topics.module.ts +10 -0
  284. package/apps/knowledge/src/modules/topics/topics.service.ts +86 -0
  285. package/apps/knowledge/tsconfig.app.json +8 -0
  286. package/apps/monolith/src/app.module.ts +75 -0
  287. package/apps/monolith/src/config/configuration.ts +93 -0
  288. package/apps/monolith/src/health/health.controller.ts +22 -0
  289. package/apps/monolith/src/health/health.module.ts +9 -0
  290. package/apps/monolith/src/main.ts +56 -0
  291. package/apps/monolith/tsconfig.app.json +8 -0
  292. package/libs/agentcraft/src/agentcraft.module.d.ts +12 -0
  293. package/libs/agentcraft/src/agentcraft.module.js +142 -0
  294. package/libs/agentcraft/src/agentcraft.module.js.map +1 -0
  295. package/libs/agentcraft/src/agentcraft.module.ts +161 -0
  296. package/libs/agentcraft/src/constants.d.ts +2 -0
  297. package/libs/agentcraft/src/constants.js +6 -0
  298. package/libs/agentcraft/src/constants.js.map +1 -0
  299. package/libs/agentcraft/src/constants.ts +2 -0
  300. package/libs/agentcraft/src/dto/submit-action.dto.ts +20 -0
  301. package/libs/agentcraft/src/errors/domain.error.d.ts +8 -0
  302. package/libs/agentcraft/src/errors/domain.error.js +27 -0
  303. package/libs/agentcraft/src/errors/domain.error.js.map +1 -0
  304. package/libs/agentcraft/src/errors/domain.error.ts +14 -0
  305. package/libs/agentcraft/src/errors/llm.errors.d.ts +10 -0
  306. package/libs/agentcraft/src/errors/llm.errors.js +26 -0
  307. package/libs/agentcraft/src/errors/llm.errors.js.map +1 -0
  308. package/libs/agentcraft/src/errors/llm.errors.ts +19 -0
  309. package/libs/agentcraft/src/index.d.ts +64 -0
  310. package/libs/agentcraft/src/index.js +195 -0
  311. package/libs/agentcraft/src/index.js.map +1 -0
  312. package/libs/agentcraft/src/index.ts +171 -0
  313. package/libs/agentcraft/src/instructions/step6-data-model.ts +181 -0
  314. package/libs/agentcraft/src/instructions/step7-workflows.ts +544 -0
  315. package/libs/agentcraft/src/instructions/step8-agents.ts +114 -0
  316. package/libs/agentcraft/src/interfaces/llm-provider.interface.d.ts +16 -0
  317. package/libs/agentcraft/src/interfaces/llm-provider.interface.js +3 -0
  318. package/libs/agentcraft/src/interfaces/llm-provider.interface.js.map +1 -0
  319. package/libs/agentcraft/src/interfaces/llm-provider.interface.ts +18 -0
  320. package/libs/agentcraft/src/prompts/assembly.prompt.ts +104 -0
  321. package/libs/agentcraft/src/prompts/codegen.prompt.ts +162 -0
  322. package/libs/agentcraft/src/prompts/decomposition.prompt.ts +32 -0
  323. package/libs/agentcraft/src/prompts/examples-provider.ts +63 -0
  324. package/libs/agentcraft/src/prompts/planning.prompt.ts +52 -0
  325. package/libs/agentcraft/src/prompts/resolver.prompt.ts +364 -0
  326. package/libs/agentcraft/src/prompts/semantics-guide.ts +134 -0
  327. package/libs/agentcraft/src/services/anthropic-craft-llm.service.ts +186 -0
  328. package/libs/agentcraft/src/services/anthropic-llm.service.d.ts +9 -0
  329. package/libs/agentcraft/src/services/anthropic-llm.service.js +90 -0
  330. package/libs/agentcraft/src/services/anthropic-llm.service.js.map +1 -0
  331. package/libs/agentcraft/src/services/anthropic-llm.service.ts +61 -0
  332. package/libs/agentcraft/src/services/api-adapter.service.d.ts +65 -0
  333. package/libs/agentcraft/src/services/api-adapter.service.js +167 -0
  334. package/libs/agentcraft/src/services/api-adapter.service.js.map +1 -0
  335. package/libs/agentcraft/src/services/api-adapter.service.ts +186 -0
  336. package/libs/agentcraft/src/services/architect-loop.service.d.ts +16 -0
  337. package/libs/agentcraft/src/services/architect-loop.service.js +92 -0
  338. package/libs/agentcraft/src/services/architect-loop.service.js.map +1 -0
  339. package/libs/agentcraft/src/services/architect-loop.service.ts +407 -0
  340. package/libs/agentcraft/src/services/autonomous-runner.service.ts +178 -0
  341. package/libs/agentcraft/src/services/craft-config.service.d.ts +11 -0
  342. package/libs/agentcraft/src/services/craft-config.service.js +127 -0
  343. package/libs/agentcraft/src/services/craft-config.service.js.map +1 -0
  344. package/libs/agentcraft/src/services/craft-config.service.ts +92 -0
  345. package/libs/agentcraft/src/services/craft-llm-adapter.service.d.ts +12 -0
  346. package/libs/agentcraft/src/services/craft-llm-adapter.service.js +73 -0
  347. package/libs/agentcraft/src/services/craft-llm-adapter.service.js.map +1 -0
  348. package/libs/agentcraft/src/services/craft-llm-adapter.service.ts +52 -0
  349. package/libs/agentcraft/src/services/decomposer.service.ts +115 -0
  350. package/libs/agentcraft/src/services/design-generator.service.ts +672 -0
  351. package/libs/agentcraft/src/services/executor.service.ts +452 -0
  352. package/libs/agentcraft/src/services/kb-watcher.service.ts +150 -0
  353. package/libs/agentcraft/src/services/openai-llm.service.d.ts +9 -0
  354. package/libs/agentcraft/src/services/openai-llm.service.js +91 -0
  355. package/libs/agentcraft/src/services/openai-llm.service.js.map +1 -0
  356. package/libs/agentcraft/src/services/openai-llm.service.ts +61 -0
  357. package/libs/agentcraft/src/services/output-parser.service.d.ts +9 -0
  358. package/libs/agentcraft/src/services/output-parser.service.js +80 -0
  359. package/libs/agentcraft/src/services/output-parser.service.js.map +1 -0
  360. package/libs/agentcraft/src/services/output-parser.service.ts +68 -0
  361. package/libs/agentcraft/src/services/pipeline-state.service.d.ts +19 -0
  362. package/libs/agentcraft/src/services/pipeline-state.service.js +134 -0
  363. package/libs/agentcraft/src/services/pipeline-state.service.js.map +1 -0
  364. package/libs/agentcraft/src/services/pipeline-state.service.ts +108 -0
  365. package/libs/agentcraft/src/services/pipeline-steps.service.d.ts +10 -0
  366. package/libs/agentcraft/src/services/pipeline-steps.service.js +147 -0
  367. package/libs/agentcraft/src/services/pipeline-steps.service.js.map +1 -0
  368. package/libs/agentcraft/src/services/pipeline-steps.service.ts +126 -0
  369. package/libs/agentcraft/src/services/planner.service.ts +189 -0
  370. package/libs/agentcraft/src/services/readme-generator.service.ts +229 -0
  371. package/libs/agentcraft/src/services/registry-client.service.d.ts +14 -0
  372. package/libs/agentcraft/src/services/registry-client.service.js +158 -0
  373. package/libs/agentcraft/src/services/registry-client.service.js.map +1 -0
  374. package/libs/agentcraft/src/services/registry-client.service.ts +139 -0
  375. package/libs/agentcraft/src/services/requirements-generator.service.ts +238 -0
  376. package/libs/agentcraft/src/services/spec-fetcher.service.d.ts +3 -0
  377. package/libs/agentcraft/src/services/spec-fetcher.service.js +46 -0
  378. package/libs/agentcraft/src/services/spec-fetcher.service.js.map +1 -0
  379. package/libs/agentcraft/src/services/spec-fetcher.service.ts +21 -0
  380. package/libs/agentcraft/src/services/ui-blueprint-generator.service.ts +387 -0
  381. package/libs/agentcraft/src/types/architect.types.ts +156 -0
  382. package/libs/agentcraft/src/types/autonomous.types.ts +71 -0
  383. package/libs/agentcraft/src/types/llm.types.d.ts +26 -0
  384. package/libs/agentcraft/src/types/llm.types.js +3 -0
  385. package/libs/agentcraft/src/types/llm.types.js.map +1 -0
  386. package/libs/agentcraft/src/types/llm.types.ts +60 -0
  387. package/libs/agentcraft/src/types/pipeline.types.d.ts +55 -0
  388. package/libs/agentcraft/src/types/pipeline.types.js +37 -0
  389. package/libs/agentcraft/src/types/pipeline.types.js.map +1 -0
  390. package/libs/agentcraft/src/types/pipeline.types.ts +61 -0
  391. package/libs/agentcraft/src/types/resolver.types.d.ts +27 -0
  392. package/libs/agentcraft/src/types/resolver.types.js +3 -0
  393. package/libs/agentcraft/src/types/resolver.types.js.map +1 -0
  394. package/libs/agentcraft/src/types/resolver.types.ts +22 -0
  395. package/libs/agentcraft/src/types/signal.types.d.ts +16 -0
  396. package/libs/agentcraft/src/types/signal.types.js +3 -0
  397. package/libs/agentcraft/src/types/signal.types.js.map +1 -0
  398. package/libs/agentcraft/src/types/signal.types.ts +18 -0
  399. package/libs/agentcraft/src/utils/kb-loader.ts +67 -0
  400. package/libs/agentcraft/src/utils/output-writer.ts +71 -0
  401. package/libs/agentcraft/src/utils/spec-fetcher.ts +20 -0
  402. package/libs/agentcraft/src/utils/spec-trimmer.ts +280 -0
  403. package/libs/agentcraft/src/utils/text-utils.ts +49 -0
  404. package/libs/agentcraft/src/utils/validator.ts +231 -0
  405. package/libs/agentcraft/tsconfig.lib.json +9 -0
  406. package/libs/auth/src/auth.guard.ts +188 -0
  407. package/libs/auth/src/auth.module.ts +11 -0
  408. package/libs/auth/src/index.ts +3 -0
  409. package/libs/auth/src/public.decorator.ts +5 -0
  410. package/libs/auth/tsconfig.lib.json +9 -0
  411. package/libs/common/src/database/data-source.service.ts +75 -0
  412. package/libs/common/src/database/database-connection.holder.ts +41 -0
  413. package/libs/common/src/database/database.config.ts +14 -0
  414. package/libs/common/src/database/database.module.ts +42 -0
  415. package/libs/common/src/database/embedded-database.service.ts +120 -0
  416. package/libs/common/src/database/file-store.factory.ts +20 -0
  417. package/libs/common/src/database/file-store.ts +47 -0
  418. package/libs/common/src/errors/domain.error.ts +11 -0
  419. package/libs/common/src/filters/domain-exception.filter.ts +62 -0
  420. package/libs/common/src/index.ts +15 -0
  421. package/libs/common/src/interceptors/logging.interceptor.ts +60 -0
  422. package/libs/common/tsconfig.lib.json +9 -0
  423. package/libs/project-provider/src/constants.d.ts +7 -0
  424. package/libs/project-provider/src/constants.js +18 -0
  425. package/libs/project-provider/src/constants.js.map +1 -0
  426. package/libs/project-provider/src/constants.ts +7 -0
  427. package/libs/project-provider/src/errors/domain.error.d.ts +4 -0
  428. package/libs/project-provider/src/errors/domain.error.js +13 -0
  429. package/libs/project-provider/src/errors/domain.error.js.map +1 -0
  430. package/libs/project-provider/src/errors/domain.error.ts +1 -0
  431. package/libs/project-provider/src/errors/employee-code.errors.d.ts +13 -0
  432. package/libs/project-provider/src/errors/employee-code.errors.js +42 -0
  433. package/libs/project-provider/src/errors/employee-code.errors.js.map +1 -0
  434. package/libs/project-provider/src/errors/employee-code.errors.ts +37 -0
  435. package/libs/project-provider/src/errors/inbox.errors.d.ts +13 -0
  436. package/libs/project-provider/src/errors/inbox.errors.js +36 -0
  437. package/libs/project-provider/src/errors/inbox.errors.js.map +1 -0
  438. package/libs/project-provider/src/errors/inbox.errors.ts +31 -0
  439. package/libs/project-provider/src/errors/registry.errors.d.ts +16 -0
  440. package/libs/project-provider/src/errors/registry.errors.js +46 -0
  441. package/libs/project-provider/src/errors/registry.errors.js.map +1 -0
  442. package/libs/project-provider/src/errors/registry.errors.ts +40 -0
  443. package/libs/project-provider/src/index.d.ts +67 -0
  444. package/libs/project-provider/src/index.js +220 -0
  445. package/libs/project-provider/src/index.js.map +1 -0
  446. package/libs/project-provider/src/index.ts +82 -0
  447. package/libs/project-provider/src/interfaces/employee-code-provider.interface.d.ts +36 -0
  448. package/libs/project-provider/src/interfaces/employee-code-provider.interface.js +3 -0
  449. package/libs/project-provider/src/interfaces/employee-code-provider.interface.js.map +1 -0
  450. package/libs/project-provider/src/interfaces/employee-code-provider.interface.ts +37 -0
  451. package/libs/project-provider/src/interfaces/inbox-client.interface.d.ts +3 -0
  452. package/libs/project-provider/src/interfaces/inbox-client.interface.js +3 -0
  453. package/libs/project-provider/src/interfaces/inbox-client.interface.js.map +1 -0
  454. package/libs/project-provider/src/interfaces/inbox-client.interface.ts +3 -0
  455. package/libs/project-provider/src/interfaces/inbox-handler.interface.ts +10 -0
  456. package/libs/project-provider/src/interfaces/knowledge-base.interface.d.ts +5 -0
  457. package/libs/project-provider/src/interfaces/knowledge-base.interface.js +3 -0
  458. package/libs/project-provider/src/interfaces/knowledge-base.interface.js.map +1 -0
  459. package/libs/project-provider/src/interfaces/knowledge-base.interface.ts +6 -0
  460. package/libs/project-provider/src/interfaces/registry-provider.interface.d.ts +24 -0
  461. package/libs/project-provider/src/interfaces/registry-provider.interface.js +3 -0
  462. package/libs/project-provider/src/interfaces/registry-provider.interface.js.map +1 -0
  463. package/libs/project-provider/src/interfaces/registry-provider.interface.ts +36 -0
  464. package/libs/project-provider/src/project-provider.module.d.ts +10 -0
  465. package/libs/project-provider/src/project-provider.module.js +137 -0
  466. package/libs/project-provider/src/project-provider.module.js.map +1 -0
  467. package/libs/project-provider/src/project-provider.module.ts +119 -0
  468. package/libs/project-provider/src/services/al-parser.service.d.ts +6 -0
  469. package/libs/project-provider/src/services/al-parser.service.js +103 -0
  470. package/libs/project-provider/src/services/al-parser.service.js.map +1 -0
  471. package/libs/project-provider/src/services/al-parser.service.ts +92 -0
  472. package/libs/project-provider/src/services/direct-inbox-client.service.ts +24 -0
  473. package/libs/project-provider/src/services/file-knowledge-base.service.d.ts +8 -0
  474. package/libs/project-provider/src/services/file-knowledge-base.service.js +158 -0
  475. package/libs/project-provider/src/services/file-knowledge-base.service.js.map +1 -0
  476. package/libs/project-provider/src/services/file-knowledge-base.service.ts +81 -0
  477. package/libs/project-provider/src/services/filesystem-employee-code.service.d.ts +49 -0
  478. package/libs/project-provider/src/services/filesystem-employee-code.service.js +227 -0
  479. package/libs/project-provider/src/services/filesystem-employee-code.service.js.map +1 -0
  480. package/libs/project-provider/src/services/filesystem-employee-code.service.ts +220 -0
  481. package/libs/project-provider/src/services/filesystem-registry.service.d.ts +34 -0
  482. package/libs/project-provider/src/services/filesystem-registry.service.js +231 -0
  483. package/libs/project-provider/src/services/filesystem-registry.service.js.map +1 -0
  484. package/libs/project-provider/src/services/filesystem-registry.service.ts +271 -0
  485. package/libs/project-provider/src/services/http-inbox-client.service.d.ts +7 -0
  486. package/libs/project-provider/src/services/http-inbox-client.service.js +66 -0
  487. package/libs/project-provider/src/services/http-inbox-client.service.js.map +1 -0
  488. package/libs/project-provider/src/services/http-inbox-client.service.ts +29 -0
  489. package/libs/project-provider/src/services/noop-inbox-client.service.d.ts +4 -0
  490. package/libs/project-provider/src/services/noop-inbox-client.service.js +32 -0
  491. package/libs/project-provider/src/services/noop-inbox-client.service.js.map +1 -0
  492. package/libs/project-provider/src/services/noop-inbox-client.service.ts +9 -0
  493. package/libs/project-provider/src/types/messaging.types.d.ts +49 -0
  494. package/libs/project-provider/src/types/messaging.types.js +11 -0
  495. package/libs/project-provider/src/types/messaging.types.js.map +1 -0
  496. package/libs/project-provider/src/types/messaging.types.ts +59 -0
  497. package/libs/project-provider/src/types/project.types.d.ts +44 -0
  498. package/libs/project-provider/src/types/project.types.js +3 -0
  499. package/libs/project-provider/src/types/project.types.js.map +1 -0
  500. package/libs/project-provider/src/types/project.types.ts +58 -0
  501. package/libs/project-provider/tsconfig.lib.json +9 -0
  502. package/nest-cli.json +114 -0
  503. package/package.json +206 -0
  504. package/scripts/agentmanager.mjs +1126 -0
  505. package/scripts/monolith-daemon-run.mjs +77 -0
  506. package/scripts/monolith-daemon-run.sh +27 -0
  507. package/tsconfig.json +35 -0
@@ -0,0 +1,1126 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI: configure daemon env, install launchd (macOS), systemd (Linux), or Task Scheduler
4
+ * (Windows) entry, start monolith.
5
+ * Usage: agentmanager --start-daemon (alias: --start-demon)
6
+ */
7
+ import { spawn, spawnSync, execSync } from 'node:child_process';
8
+ import {
9
+ existsSync,
10
+ mkdirSync,
11
+ readFileSync,
12
+ writeFileSync,
13
+ chmodSync,
14
+ } from 'node:fs';
15
+ import { createInterface } from 'node:readline/promises';
16
+ import { stdin as input, stdout as output } from 'node:process';
17
+ import { dirname, join, resolve } from 'node:path';
18
+ import { fileURLToPath } from 'node:url';
19
+ import os from 'node:os';
20
+
21
+ const __dirname = dirname(fileURLToPath(import.meta.url));
22
+
23
+ function readPackageVersion() {
24
+ try {
25
+ const pkgPath = join(__dirname, '..', 'package.json');
26
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
27
+ return typeof pkg.version === 'string' ? pkg.version : '0.0.0';
28
+ } catch {
29
+ return '0.0.0';
30
+ }
31
+ }
32
+
33
+ const PKG_VERSION = readPackageVersion();
34
+
35
+ /** @returns {boolean} */
36
+ function colorEnabled() {
37
+ if (process.env.NO_COLOR != null && process.env.NO_COLOR !== '') return false;
38
+ if (process.env.FORCE_COLOR === '0') return false;
39
+ if (process.env.FORCE_COLOR === '1' || process.env.FORCE_COLOR === '2')
40
+ return true;
41
+ return output.isTTY === true;
42
+ }
43
+
44
+ const ansi = colorEnabled()
45
+ ? {
46
+ reset: '\u001b[0m',
47
+ bold: '\u001b[1m',
48
+ dim: '\u001b[2m',
49
+ italic: '\u001b[3m',
50
+ red: '\u001b[31m',
51
+ green: '\u001b[32m',
52
+ yellow: '\u001b[33m',
53
+ blue: '\u001b[34m',
54
+ magenta: '\u001b[35m',
55
+ cyan: '\u001b[36m',
56
+ white: '\u001b[37m',
57
+ gray: '\u001b[90m',
58
+ bgBlue: '\u001b[44m',
59
+ bgMagenta: '\u001b[45m',
60
+ }
61
+ : {
62
+ reset: '',
63
+ bold: '',
64
+ dim: '',
65
+ italic: '',
66
+ red: '',
67
+ green: '',
68
+ yellow: '',
69
+ blue: '',
70
+ magenta: '',
71
+ cyan: '',
72
+ white: '',
73
+ gray: '',
74
+ bgBlue: '',
75
+ bgMagenta: '',
76
+ };
77
+
78
+ /**
79
+ * @param {string} s
80
+ * @param {...string} codes
81
+ */
82
+ function paint(s, ...codes) {
83
+ return `${codes.join('')}${s}${ansi.reset}`;
84
+ }
85
+
86
+ function printCliVersionLine() {
87
+ output.write(
88
+ paint('agentmanager', ansi.bold, ansi.magenta) +
89
+ paint(' v', ansi.dim) +
90
+ paint(PKG_VERSION, ansi.cyan, ansi.bold) +
91
+ '\n',
92
+ );
93
+ }
94
+
95
+ /** @param {string} key */
96
+ function isSensitiveEnvKey(key) {
97
+ const u = key.toUpperCase();
98
+ return (
99
+ u.includes('SECRET') ||
100
+ u.includes('PASSWORD') ||
101
+ u.includes('API_KEY') ||
102
+ /(^|_)KEY($|_)/.test(u) ||
103
+ u.includes('TOKEN')
104
+ );
105
+ }
106
+
107
+ /**
108
+ * @param {string} key
109
+ * @param {string} value
110
+ */
111
+ function formatHintForDisplay(key, value) {
112
+ if (value === '') return '';
113
+ if (!isSensitiveEnvKey(key)) return value;
114
+ if (value.length <= 6) return '••••';
115
+ return `${value.slice(0, 3)}…${value.slice(-2)}`;
116
+ }
117
+
118
+ const SERVICE_LABEL = 'io.agentlang.agentmanager.monolith';
119
+ const SYSTEMD_UNIT = 'agentmanager-monolith.service';
120
+ const WINDOWS_TASK_NAME = 'AgentManagerMonolith';
121
+
122
+ /** Interactive wizard only covers these; `daemon.env` is rewritten to this set only. */
123
+ const DAEMON_WIZARD_VARS = [
124
+ {
125
+ key: 'PORT',
126
+ description:
127
+ 'HTTP port the monolith listens on (overrides default when set).',
128
+ },
129
+ {
130
+ key: 'OPENAI_API_KEY',
131
+ description: 'OpenAI API key for models used by Fabric / craft flows.',
132
+ },
133
+ {
134
+ key: 'ANTHROPIC_API_KEY',
135
+ description: 'Anthropic API key for Claude when that provider is used.',
136
+ },
137
+ {
138
+ key: 'AWS_REGION',
139
+ description: 'Default AWS region for the SDK (S3, Cognito, SES, etc.).',
140
+ },
141
+ {
142
+ key: 'AWS_ACCESS_KEY',
143
+ description: 'AWS access key ID (programmatic IAM access).',
144
+ },
145
+ {
146
+ key: 'AWS_SECRET_KEY',
147
+ description: 'AWS secret access key (paired with AWS_ACCESS_KEY).',
148
+ },
149
+ {
150
+ key: 'AWS_COGNITO_CLIENT_ID',
151
+ description: 'Amazon Cognito app client ID used for auth integration.',
152
+ },
153
+ {
154
+ key: 'AWS_COGNITO_USER_POOL_ID',
155
+ description: 'Amazon Cognito user pool ID for your user directory.',
156
+ },
157
+ {
158
+ key: 'SES_FROM_EMAIL',
159
+ description:
160
+ "Verified 'From' address in SES for escalation / notification mail.",
161
+ },
162
+ {
163
+ key: 'SES_TO_EMAIL',
164
+ description: 'Recipient address for escalation or notification emails.',
165
+ },
166
+ {
167
+ key: 'FABRIC_ESCALATION_TO_EMAIL',
168
+ description:
169
+ 'Set true or false: whether Fabric sends escalation emails via SES.',
170
+ },
171
+ ];
172
+
173
+ function configDir() {
174
+ return process.env.XDG_CONFIG_HOME || join(os.homedir(), '.config');
175
+ }
176
+
177
+ function appStateDir() {
178
+ const d = join(configDir(), 'agentmanager');
179
+ mkdirSync(d, { recursive: true });
180
+ return d;
181
+ }
182
+
183
+ function daemonEnvPath() {
184
+ return join(appStateDir(), 'daemon.env');
185
+ }
186
+
187
+ function repoRootPathFile() {
188
+ return join(appStateDir(), 'repo-root.txt');
189
+ }
190
+
191
+ function logDir() {
192
+ const d = join(appStateDir(), 'logs');
193
+ mkdirSync(d, { recursive: true });
194
+ return d;
195
+ }
196
+
197
+ function monolithStdoutLogPath() {
198
+ return join(logDir(), 'monolith.stdout.log');
199
+ }
200
+
201
+ function monolithStderrLogPath() {
202
+ return join(logDir(), 'monolith.stderr.log');
203
+ }
204
+
205
+ /** @param {'stdout' | 'stderr'} which */
206
+ function cmdTailMonolithLog(which) {
207
+ const logPath =
208
+ which === 'stderr' ? monolithStderrLogPath() : monolithStdoutLogPath();
209
+ if (!existsSync(logPath)) {
210
+ writeFileSync(logPath, '', 'utf8');
211
+ }
212
+ const label = which === 'stderr' ? 'stderr' : 'stdout';
213
+ output.write(
214
+ paint('↳ ', ansi.cyan, ansi.bold) +
215
+ paint(`Following monolith.${label}.log`, ansi.bold) +
216
+ paint(' ', ansi.dim) +
217
+ paint('tail -f', ansi.gray) +
218
+ '\n' +
219
+ paint(' ', ansi.dim) +
220
+ paint(logPath, ansi.yellow) +
221
+ '\n' +
222
+ paint(' Ctrl+C to stop\n\n', ansi.dim),
223
+ );
224
+ const child = spawn('tail', ['-f', logPath], { stdio: 'inherit' });
225
+ const onSigint = () => {
226
+ child.kill('SIGTERM');
227
+ process.exit(0);
228
+ };
229
+ process.once('SIGINT', onSigint);
230
+ child.on('error', (err) => {
231
+ const e = /** @type {NodeJS.ErrnoException} */ (err);
232
+ if (e.code === 'ENOENT') {
233
+ output.write(
234
+ paint('✗ ', ansi.red, ansi.bold) +
235
+ paint(
236
+ '`tail` not found. Install coreutils or run from a shell that provides tail.\n',
237
+ ansi.red,
238
+ ),
239
+ );
240
+ process.exit(1);
241
+ }
242
+ throw err;
243
+ });
244
+ child.on('close', (code, signal) => {
245
+ process.removeListener('SIGINT', onSigint);
246
+ if (signal) process.exit(0);
247
+ process.exit(code === null ? 1 : code);
248
+ });
249
+ }
250
+
251
+ function runnerScriptPath() {
252
+ return join(__dirname, 'monolith-daemon-run.sh');
253
+ }
254
+
255
+ function runnerNodeScriptPath() {
256
+ return join(__dirname, 'monolith-daemon-run.mjs');
257
+ }
258
+
259
+ /** @param {string} s */
260
+ function xmlEscape(s) {
261
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
262
+ }
263
+
264
+ /**
265
+ * PATH recorded when running `agentmanager --start-daemon` so launchd/systemd/Task Scheduler
266
+ * can find `pm2`, `npx`, etc. (GUI daemons use a minimal PATH by default).
267
+ */
268
+ function daemonServicePathEnv() {
269
+ const isWin = os.platform() === 'win32';
270
+ const sep = isWin ? ';' : ':';
271
+ const fallback = isWin
272
+ ? 'C:\\Program Files\\nodejs;C:\\Program Files (x86)\\nodejs'
273
+ : '/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin';
274
+ const raw = process.env.PATH;
275
+ let base =
276
+ typeof raw === 'string' && raw.trim() !== '' ? raw.trim() : fallback;
277
+ const nodeDir = dirname(process.execPath);
278
+ if (nodeDir && !base.split(sep).includes(nodeDir)) {
279
+ base = `${nodeDir}${sep}${base}`;
280
+ }
281
+ return base;
282
+ }
283
+
284
+ /** @param {string} s */
285
+ function systemdEnvValueEscape(s) {
286
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\$/g, '$$');
287
+ }
288
+
289
+ /** Path token for unit file (quote when needed). */
290
+ function systemdPathToken(p) {
291
+ if (/[\s"'\\]/.test(p))
292
+ return `"${p.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
293
+ return p;
294
+ }
295
+
296
+ /** Directory layout for this monorepo (clone or npm pack contents). */
297
+ function isValidMonorepoRoot(dir) {
298
+ const pkgPath = join(dir, 'package.json');
299
+ const nestPath = join(dir, 'nest-cli.json');
300
+ if (!existsSync(pkgPath) || !existsSync(nestPath)) return false;
301
+ try {
302
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
303
+ return !!(pkg.scripts && pkg.scripts['start:monolith']);
304
+ } catch {
305
+ return false;
306
+ }
307
+ }
308
+
309
+ function findRepoRoot(startDir = process.cwd()) {
310
+ let dir = resolve(startDir);
311
+ for (;;) {
312
+ if (isValidMonorepoRoot(dir)) return dir;
313
+ const parent = dirname(dir);
314
+ if (parent === dir) break;
315
+ dir = parent;
316
+ }
317
+ return null;
318
+ }
319
+
320
+ /** When installed with `npm i -g`, the package root is next to `scripts/`. */
321
+ function resolveGlobalInstallMonorepoRoot() {
322
+ const candidate = resolve(join(__dirname, '..'));
323
+ return isValidMonorepoRoot(candidate) ? candidate : null;
324
+ }
325
+
326
+ function resolveRepoRoot(argv) {
327
+ const i = argv.indexOf('--repo-root');
328
+ if (i !== -1 && argv[i + 1]) return resolve(argv[i + 1]);
329
+ const env = process.env.AGENTMANAGER_MONO_ROOT;
330
+ if (env) return resolve(env);
331
+ const fromFile = existsSync(repoRootPathFile())
332
+ ? readFileSync(repoRootPathFile(), 'utf8').trim()
333
+ : '';
334
+ if (fromFile && isValidMonorepoRoot(fromFile)) return resolve(fromFile);
335
+ const fromCwd = findRepoRoot();
336
+ if (fromCwd) return fromCwd;
337
+ return resolveGlobalInstallMonorepoRoot();
338
+ }
339
+
340
+ /** @param {string} content */
341
+ function parseDotenvValues(content) {
342
+ const out = {};
343
+ for (const line of content.split('\n')) {
344
+ const m = line.match(
345
+ /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/,
346
+ );
347
+ if (!m) continue;
348
+ let v = m[2].trim();
349
+ if (
350
+ (v.startsWith('"') && v.endsWith('"')) ||
351
+ (v.startsWith("'") && v.endsWith("'"))
352
+ ) {
353
+ v = v.slice(1, -1);
354
+ }
355
+ out[m[1]] = v;
356
+ }
357
+ return out;
358
+ }
359
+
360
+ /** @param {Record<string, string>} obj */
361
+ function serializeDotenv(obj) {
362
+ const keys = Object.keys(obj).sort();
363
+ const lines = [];
364
+ for (const k of keys) {
365
+ const v = obj[k];
366
+ if (v === undefined || v === '') continue;
367
+ const needsQuote = /[\s#"']|=/.test(v) || v !== String(v);
368
+ if (needsQuote)
369
+ lines.push(
370
+ `${k}="${String(v).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`,
371
+ );
372
+ else lines.push(`${k}=${v}`);
373
+ }
374
+ return lines.join('\n') + (lines.length ? '\n' : '');
375
+ }
376
+
377
+ /**
378
+ * @param {typeof DAEMON_WIZARD_VARS} entries
379
+ * @param {Record<string, string>} existingDaemon
380
+ * @param {Record<string, string>} dotenvFromRepo
381
+ * @returns {Promise<Record<string, string>>}
382
+ */
383
+ async function promptWizardVars(entries, existingDaemon, dotenvFromRepo) {
384
+ const rl = createInterface({ input, output });
385
+ /** @type {Record<string, string>} */
386
+ const result = {};
387
+ const total = entries.length;
388
+
389
+ try {
390
+ output.write('\n');
391
+ output.write(
392
+ paint('── Environment ──', ansi.bold, ansi.cyan) +
393
+ paint(` ${total} variables`, ansi.dim) +
394
+ '\n',
395
+ );
396
+ output.write(
397
+ paint(
398
+ 'Enter keeps saved value; leave empty to skip when nothing saved yet.',
399
+ ansi.dim,
400
+ ) + '\n\n',
401
+ );
402
+
403
+ let i = 0;
404
+ for (const { key, description } of entries) {
405
+ i += 1;
406
+ const fromExisting = existingDaemon[key];
407
+ const fromRepo = dotenvFromRepo[key];
408
+ const rawHint = fromExisting ?? fromRepo ?? '';
409
+ const shownHint =
410
+ rawHint !== '' ? formatHintForDisplay(key, rawHint) : '';
411
+ const display =
412
+ shownHint !== ''
413
+ ? ` ${paint(`[${shownHint}]`, ansi.yellow, ansi.dim)}`
414
+ : '';
415
+
416
+ output.write(
417
+ paint(`[${i}/${total}]`, ansi.gray, ansi.dim) +
418
+ ' ' +
419
+ paint(key, ansi.bold, ansi.magenta) +
420
+ ' ' +
421
+ paint('(optional)', ansi.cyan, ansi.dim) +
422
+ '\n',
423
+ );
424
+ output.write(paint(` ${description}`, ansi.dim, ansi.white) + '\n');
425
+ const promptLine =
426
+ paint(' › ', ansi.green, ansi.bold) +
427
+ paint(key, ansi.bold, ansi.cyan) +
428
+ paint(' =', ansi.dim) +
429
+ display +
430
+ paint(' ', ansi.reset);
431
+ const ans = await rl.question(promptLine);
432
+ const t = ans.trim();
433
+ if (t === '') {
434
+ if (fromExisting !== undefined) result[key] = fromExisting;
435
+ continue;
436
+ }
437
+ result[key] = t;
438
+ }
439
+ output.write('\n');
440
+ } finally {
441
+ rl.close();
442
+ }
443
+ return result;
444
+ }
445
+
446
+ function ensureRunnerExecutable() {
447
+ if (os.platform() === 'win32') return;
448
+ const p = runnerScriptPath();
449
+ if (existsSync(p)) chmodSync(p, 0o755);
450
+ }
451
+
452
+ /** Escape for `set "VAR=value"` in a .cmd file (double percent). */
453
+ function cmdSetValueEscape(s) {
454
+ return s.replace(/%/g, '%%');
455
+ }
456
+
457
+ function writeWindowsLauncherCmd({
458
+ repoRoot,
459
+ envFile,
460
+ nodeExecPath,
461
+ pathEnv,
462
+ runnerMjs,
463
+ stdoutLog,
464
+ stderrLog,
465
+ }) {
466
+ const launcherPath = join(appStateDir(), 'monolith-daemon-launcher.cmd');
467
+ const lines = [
468
+ '@echo off',
469
+ 'setlocal',
470
+ `set "AGENTMANAGER_MONO_ROOT=${cmdSetValueEscape(repoRoot)}"`,
471
+ `set "AGENTMANAGER_MONO_ENV_FILE=${cmdSetValueEscape(envFile)}"`,
472
+ `set "AGENTMANAGER_MONO_NODE_EXEC=${cmdSetValueEscape(nodeExecPath)}"`,
473
+ `set "AGENTMANAGER_MONO_PATH=${cmdSetValueEscape(pathEnv)}"`,
474
+ `set "AGENTMANAGER_MONO_OUTLOG=${cmdSetValueEscape(stdoutLog)}"`,
475
+ `set "AGENTMANAGER_MONO_ERRLOG=${cmdSetValueEscape(stderrLog)}"`,
476
+ `set "AGENTMANAGER_MONO_RUNNER=${cmdSetValueEscape(runnerMjs)}"`,
477
+ 'cd /d "%AGENTMANAGER_MONO_ROOT%"',
478
+ '"%AGENTMANAGER_MONO_NODE_EXEC%" "%AGENTMANAGER_MONO_RUNNER%" >>"%AGENTMANAGER_MONO_OUTLOG%" 2>>"%AGENTMANAGER_MONO_ERRLOG%"',
479
+ ];
480
+ writeFileSync(launcherPath, `${lines.join('\r\n')}\r\n`, 'utf8');
481
+ return launcherPath;
482
+ }
483
+
484
+ function writeWindowsScheduledTaskXml(launcherCmdPath) {
485
+ const xmlPath = join(appStateDir(), 'monolith-daemon-task.xml');
486
+ const cmd = xmlEscape(launcherCmdPath);
487
+ const xml = `<?xml version="1.0" encoding="UTF-16"?>
488
+ <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
489
+ <RegistrationInfo>
490
+ <Description>AgentManager monolith (agentmanager CLI)</Description>
491
+ </RegistrationInfo>
492
+ <Triggers>
493
+ <LogonTrigger>
494
+ <Enabled>true</Enabled>
495
+ </LogonTrigger>
496
+ </Triggers>
497
+ <Principals>
498
+ <Principal id="Author">
499
+ <LogonType>InteractiveToken</LogonType>
500
+ <RunLevel>LeastPrivilege</RunLevel>
501
+ </Principal>
502
+ </Principals>
503
+ <Settings>
504
+ <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
505
+ <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
506
+ <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
507
+ <AllowHardTerminate>true</AllowHardTerminate>
508
+ <StartWhenAvailable>true</StartWhenAvailable>
509
+ <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
510
+ <Enabled>true</Enabled>
511
+ <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
512
+ <RestartOnFailure>
513
+ <Interval>PT1M</Interval>
514
+ <Count>3</Count>
515
+ </RestartOnFailure>
516
+ </Settings>
517
+ <Actions Context="Author">
518
+ <Exec>
519
+ <Command>${cmd}</Command>
520
+ </Exec>
521
+ </Actions>
522
+ </Task>
523
+ `;
524
+ writeFileSync(xmlPath, `\uFEFF${xml}`, 'utf16le');
525
+ return xmlPath;
526
+ }
527
+
528
+ /** @returns {number} exit code, 0 = success */
529
+ function registerWindowsScheduledTask(xmlPath) {
530
+ spawnSync('schtasks', ['/End', '/TN', WINDOWS_TASK_NAME], { stdio: 'pipe' });
531
+ spawnSync('schtasks', ['/Delete', '/TN', WINDOWS_TASK_NAME, '/F'], {
532
+ stdio: 'pipe',
533
+ });
534
+ const r = spawnSync(
535
+ 'schtasks',
536
+ ['/Create', '/TN', WINDOWS_TASK_NAME, '/XML', xmlPath, '/F'],
537
+ { stdio: 'inherit' },
538
+ );
539
+ return r.status ?? 1;
540
+ }
541
+
542
+ function printManualDaemonRun(repoRoot, envFile) {
543
+ if (os.platform() === 'win32') {
544
+ const runner = runnerNodeScriptPath();
545
+ const node = process.execPath;
546
+ output.write(
547
+ paint(' ', ansi.dim) +
548
+ paint(
549
+ `set "AGENTMANAGER_MONO_ROOT=${repoRoot}" & set "AGENTMANAGER_MONO_ENV_FILE=${envFile}" & set "AGENTMANAGER_MONO_NODE_EXEC=${node}" & "${node}" "${runner}"`,
550
+ ansi.cyan,
551
+ ) +
552
+ '\n',
553
+ );
554
+ } else {
555
+ output.write(
556
+ paint(' ', ansi.dim) +
557
+ paint(
558
+ `AGENTMANAGER_MONO_ROOT=${repoRoot} AGENTMANAGER_MONO_ENV_FILE=${envFile} ${runnerScriptPath()}`,
559
+ ansi.cyan,
560
+ ) +
561
+ '\n',
562
+ );
563
+ }
564
+ }
565
+
566
+ function prepareMonolithBundle(repoRoot) {
567
+ output.write(
568
+ paint('▸ ', ansi.cyan, ansi.bold) +
569
+ paint('integrations:prepare-db', ansi.bold) +
570
+ paint(' …\n', ansi.dim),
571
+ );
572
+ const r1 = spawnSync('npm', ['run', 'integrations:prepare-db'], {
573
+ cwd: repoRoot,
574
+ stdio: 'inherit',
575
+ shell: os.platform() === 'win32',
576
+ });
577
+ if (r1.status !== 0) process.exit(r1.status ?? 1);
578
+ output.write(
579
+ paint('✓ ', ansi.green, ansi.bold) +
580
+ paint('prepare-db', ansi.green) +
581
+ paint(' done\n', ansi.dim),
582
+ );
583
+ output.write(
584
+ paint('▸ ', ansi.cyan, ansi.bold) +
585
+ paint('build:monolith', ansi.bold) +
586
+ paint(' …\n', ansi.dim),
587
+ );
588
+ const r2 = spawnSync('npm', ['run', 'build:monolith'], {
589
+ cwd: repoRoot,
590
+ stdio: 'inherit',
591
+ shell: os.platform() === 'win32',
592
+ });
593
+ if (r2.status !== 0) process.exit(r2.status ?? 1);
594
+ output.write(
595
+ paint('✓ ', ansi.green, ansi.bold) +
596
+ paint('monolith build', ansi.green) +
597
+ paint(' done\n', ansi.dim),
598
+ );
599
+ }
600
+
601
+ function writeLaunchdPlist({
602
+ repoRoot,
603
+ envFile,
604
+ runner,
605
+ stdoutLog,
606
+ stderrLog,
607
+ nodeExecPath,
608
+ pathEnv,
609
+ }) {
610
+ const plistPath = launchdPlistPath();
611
+ mkdirSync(dirname(plistPath), { recursive: true });
612
+ const xml = `<?xml version="1.0" encoding="UTF-8"?>
613
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
614
+ <plist version="1.0">
615
+ <dict>
616
+ <key>Label</key>
617
+ <string>${SERVICE_LABEL}</string>
618
+ <key>ProgramArguments</key>
619
+ <array>
620
+ <string>${xmlEscape(runner)}</string>
621
+ </array>
622
+ <key>EnvironmentVariables</key>
623
+ <dict>
624
+ <key>AGENTMANAGER_MONO_ROOT</key>
625
+ <string>${xmlEscape(repoRoot)}</string>
626
+ <key>AGENTMANAGER_MONO_ENV_FILE</key>
627
+ <string>${xmlEscape(envFile)}</string>
628
+ <key>AGENTMANAGER_MONO_NODE_EXEC</key>
629
+ <string>${xmlEscape(nodeExecPath)}</string>
630
+ <key>AGENTMANAGER_MONO_PATH</key>
631
+ <string>${xmlEscape(pathEnv)}</string>
632
+ </dict>
633
+ <key>WorkingDirectory</key>
634
+ <string>${xmlEscape(repoRoot)}</string>
635
+ <key>RunAtLoad</key>
636
+ <true/>
637
+ <key>KeepAlive</key>
638
+ <true/>
639
+ <key>StandardOutPath</key>
640
+ <string>${xmlEscape(stdoutLog)}</string>
641
+ <key>StandardErrorPath</key>
642
+ <string>${xmlEscape(stderrLog)}</string>
643
+ </dict>
644
+ </plist>
645
+ `;
646
+ writeFileSync(plistPath, xml, 'utf8');
647
+ return plistPath;
648
+ }
649
+
650
+ function writeSystemdUserUnit({
651
+ repoRoot,
652
+ envFile,
653
+ runner,
654
+ stdoutLog,
655
+ stderrLog,
656
+ nodeExecPath,
657
+ pathEnv,
658
+ }) {
659
+ const unitDir = join(configDir(), 'systemd/user');
660
+ mkdirSync(unitDir, { recursive: true });
661
+ const unitPath = join(unitDir, SYSTEMD_UNIT);
662
+ const body = `[Unit]
663
+ Description=AgentManager monolith (agentmanager)
664
+ After=network-online.target
665
+
666
+ [Service]
667
+ Type=simple
668
+ Environment="AGENTMANAGER_MONO_ROOT=${systemdEnvValueEscape(repoRoot)}"
669
+ Environment="AGENTMANAGER_MONO_ENV_FILE=${systemdEnvValueEscape(envFile)}"
670
+ Environment="AGENTMANAGER_MONO_NODE_EXEC=${systemdEnvValueEscape(nodeExecPath)}"
671
+ Environment="AGENTMANAGER_MONO_PATH=${systemdEnvValueEscape(pathEnv)}"
672
+ WorkingDirectory=${systemdPathToken(repoRoot)}
673
+ ExecStart=${systemdPathToken(runner)}
674
+ Restart=on-failure
675
+ RestartSec=5
676
+ StandardOutput=append:${systemdPathToken(stdoutLog)}
677
+ StandardError=append:${systemdPathToken(stderrLog)}
678
+
679
+ [Install]
680
+ WantedBy=default.target
681
+ `;
682
+ writeFileSync(unitPath, body, 'utf8');
683
+ return unitPath;
684
+ }
685
+
686
+ function launchdPlistPath() {
687
+ return join(os.homedir(), 'Library/LaunchAgents', `${SERVICE_LABEL}.plist`);
688
+ }
689
+
690
+ function launchctlUnload() {
691
+ const uid =
692
+ typeof process.getuid === 'function'
693
+ ? String(process.getuid())
694
+ : execSync('id -u', { encoding: 'utf8' }).trim();
695
+ const plist = launchdPlistPath();
696
+ if (existsSync(plist)) {
697
+ spawnSync('launchctl', ['bootout', `gui/${uid}`, plist], { stdio: 'pipe' });
698
+ }
699
+ spawnSync('launchctl', ['unload', '-w', plist], { stdio: 'pipe' });
700
+ }
701
+
702
+ function launchctlLoad(plistPath) {
703
+ const uid =
704
+ process.getuid?.() ?? execSync('id -u', { encoding: 'utf8' }).trim();
705
+ launchctlUnload();
706
+ const r = spawnSync('launchctl', ['bootstrap', `gui/${uid}`, plistPath], {
707
+ stdio: 'inherit',
708
+ });
709
+ if (r.status !== 0) {
710
+ const r2 = spawnSync('launchctl', ['load', '-w', plistPath], {
711
+ stdio: 'inherit',
712
+ });
713
+ if (r2.status !== 0) process.exit(r2.status ?? 1);
714
+ }
715
+ }
716
+
717
+ function systemctlUser(args) {
718
+ const r = spawnSync('systemctl', ['--user', ...args], { stdio: 'inherit' });
719
+ return r.status ?? 1;
720
+ }
721
+
722
+ async function cmdStartDaemon(argv) {
723
+ const repoRoot = resolveRepoRoot(argv);
724
+ if (!repoRoot) {
725
+ output.write(
726
+ paint('✗ ', ansi.red, ansi.bold) +
727
+ paint(
728
+ 'Could not find repo root. Pass --repo-root /path/to/repo, set AGENTMANAGER_MONO_ROOT, run from a clone, or reinstall the npm package so apps/ and nest-cli.json exist next to the CLI.\n',
729
+ ansi.red,
730
+ ) +
731
+ '\n',
732
+ );
733
+ process.exit(1);
734
+ }
735
+
736
+ const envFile = daemonEnvPath();
737
+ const existingDaemon = existsSync(envFile)
738
+ ? parseDotenvValues(readFileSync(envFile, 'utf8'))
739
+ : {};
740
+ const dotenvRepo = existsSync(join(repoRoot, '.env'))
741
+ ? parseDotenvValues(readFileSync(join(repoRoot, '.env'), 'utf8'))
742
+ : {};
743
+
744
+ output.write('\n');
745
+ const bar = '═'.repeat(56);
746
+ output.write(
747
+ paint(`╔${bar}╗\n`, ansi.magenta, ansi.bold) +
748
+ paint('║', ansi.magenta, ansi.bold) +
749
+ ' ' +
750
+ paint('AgentManager', ansi.bold, ansi.white) +
751
+ paint(' — ', ansi.dim) +
752
+ paint('daemon setup', ansi.cyan, ansi.bold) +
753
+ ' '.repeat(27) +
754
+ paint('║\n', ansi.magenta, ansi.bold) +
755
+ paint('║', ansi.magenta, ansi.bold) +
756
+ ' ' +
757
+ paint('Monolith environment & launch', ansi.dim, ansi.cyan) +
758
+ ' '.repeat(25) +
759
+ paint('║\n', ansi.magenta, ansi.bold) +
760
+ paint(`╚${bar}╝\n`, ansi.magenta, ansi.bold),
761
+ );
762
+ output.write(
763
+ '\n' +
764
+ paint(' repo ', ansi.dim) +
765
+ paint(repoRoot, ansi.yellow) +
766
+ '\n' +
767
+ paint(' env ', ansi.dim) +
768
+ paint(envFile, ansi.cyan) +
769
+ '\n\n',
770
+ );
771
+
772
+ const values = await promptWizardVars(
773
+ DAEMON_WIZARD_VARS,
774
+ existingDaemon,
775
+ dotenvRepo,
776
+ );
777
+ const serialized = serializeDotenv(values);
778
+ writeFileSync(envFile, serialized, 'utf8');
779
+ try {
780
+ chmodSync(envFile, 0o600);
781
+ } catch {
782
+ /* ignore */
783
+ }
784
+ output.write(
785
+ paint('✓ ', ansi.green, ansi.bold) +
786
+ paint('Saved ', ansi.green) +
787
+ paint(envFile, ansi.cyan, ansi.bold) +
788
+ '\n',
789
+ );
790
+ writeFileSync(repoRootPathFile(), `${repoRoot}\n`, 'utf8');
791
+
792
+ ensureRunnerExecutable();
793
+ output.write(
794
+ '\n' +
795
+ paint('── ', ansi.blue, ansi.bold) +
796
+ paint('Build', ansi.bold, ansi.white) +
797
+ paint(' ──\n', ansi.blue, ansi.bold),
798
+ );
799
+ prepareMonolithBundle(repoRoot);
800
+
801
+ const runnerSh = runnerScriptPath();
802
+ const runnerMjs = runnerNodeScriptPath();
803
+ const platform = os.platform();
804
+ if (platform === 'win32') {
805
+ if (!existsSync(runnerMjs)) {
806
+ output.write(
807
+ paint('✗ ', ansi.red, ansi.bold) +
808
+ paint(`Runner script missing: ${runnerMjs}\n`, ansi.red),
809
+ );
810
+ process.exit(1);
811
+ }
812
+ } else if (!existsSync(runnerSh)) {
813
+ output.write(
814
+ paint('✗ ', ansi.red, ansi.bold) +
815
+ paint(`Runner script missing: ${runnerSh}\n`, ansi.red),
816
+ );
817
+ process.exit(1);
818
+ }
819
+
820
+ const outLog = join(logDir(), 'monolith.stdout.log');
821
+ const errLog = join(logDir(), 'monolith.stderr.log');
822
+ const nodeExecPath = process.execPath;
823
+ const pathEnv = daemonServicePathEnv();
824
+
825
+ if (platform === 'darwin') {
826
+ const plist = writeLaunchdPlist({
827
+ repoRoot,
828
+ envFile,
829
+ runner: runnerSh,
830
+ stdoutLog: outLog,
831
+ stderrLog: errLog,
832
+ nodeExecPath,
833
+ pathEnv,
834
+ });
835
+ launchctlLoad(plist);
836
+ output.write(
837
+ '\n' +
838
+ paint('✓ ', ansi.green, ansi.bold) +
839
+ paint('launchd loaded', ansi.green) +
840
+ '\n' +
841
+ paint(' ', ansi.dim) +
842
+ paint(plist, ansi.cyan) +
843
+ '\n' +
844
+ paint(' logs ', ansi.dim) +
845
+ paint(outLog, ansi.yellow) +
846
+ paint(' ', ansi.dim) +
847
+ paint(errLog, ansi.yellow) +
848
+ '\n',
849
+ );
850
+ } else if (platform === 'linux') {
851
+ let hasSystemctl = false;
852
+ try {
853
+ execSync('command -v systemctl', { stdio: 'pipe' });
854
+ hasSystemctl = true;
855
+ } catch {
856
+ hasSystemctl = false;
857
+ }
858
+ if (!hasSystemctl) {
859
+ output.write(
860
+ paint('✗ ', ansi.red, ansi.bold) +
861
+ paint(
862
+ 'systemctl not found. Install a systemd user session or run manually:\n',
863
+ ansi.yellow,
864
+ ),
865
+ );
866
+ printManualDaemonRun(repoRoot, envFile);
867
+ process.exit(1);
868
+ }
869
+ const unit = writeSystemdUserUnit({
870
+ repoRoot,
871
+ envFile,
872
+ runner: runnerSh,
873
+ stdoutLog: outLog,
874
+ stderrLog: errLog,
875
+ nodeExecPath,
876
+ pathEnv,
877
+ });
878
+ systemctlUser(['daemon-reload']);
879
+ systemctlUser(['enable', '--now', SYSTEMD_UNIT]);
880
+ output.write(
881
+ '\n' +
882
+ paint('✓ ', ansi.green, ansi.bold) +
883
+ paint('systemd user unit enabled', ansi.green) +
884
+ '\n' +
885
+ paint(' ', ansi.dim) +
886
+ paint(unit, ansi.cyan) +
887
+ '\n' +
888
+ paint(' logs ', ansi.dim) +
889
+ paint(outLog, ansi.yellow) +
890
+ paint(' ', ansi.dim) +
891
+ paint(errLog, ansi.yellow) +
892
+ '\n',
893
+ );
894
+ } else if (platform === 'win32') {
895
+ const launcher = writeWindowsLauncherCmd({
896
+ repoRoot,
897
+ envFile,
898
+ nodeExecPath,
899
+ pathEnv,
900
+ runnerMjs,
901
+ stdoutLog: outLog,
902
+ stderrLog: errLog,
903
+ });
904
+ const xmlPath = writeWindowsScheduledTaskXml(launcher);
905
+ const code = registerWindowsScheduledTask(xmlPath);
906
+ if (code !== 0) {
907
+ output.write(
908
+ paint('✗ ', ansi.red, ansi.bold) +
909
+ paint('schtasks failed. Run manually from cmd.exe:\n', ansi.yellow),
910
+ );
911
+ printManualDaemonRun(repoRoot, envFile);
912
+ process.exit(1);
913
+ }
914
+ const rRun = spawnSync('schtasks', ['/Run', '/TN', WINDOWS_TASK_NAME], {
915
+ stdio: 'inherit',
916
+ });
917
+ if (rRun.status !== 0) {
918
+ output.write(
919
+ paint('! ', ansi.yellow, ansi.bold) +
920
+ paint(
921
+ 'Task registered but schtasks /Run failed; it will start at next logon.\n',
922
+ ansi.yellow,
923
+ ),
924
+ );
925
+ }
926
+ output.write(
927
+ '\n' +
928
+ paint('✓ ', ansi.green, ansi.bold) +
929
+ paint('Scheduled Task registered', ansi.green) +
930
+ '\n' +
931
+ paint(' ', ansi.dim) +
932
+ paint(WINDOWS_TASK_NAME, ansi.cyan) +
933
+ '\n' +
934
+ paint(' launcher ', ansi.dim) +
935
+ paint(launcher, ansi.cyan) +
936
+ '\n' +
937
+ paint(' ', ansi.dim) +
938
+ paint(xmlPath, ansi.gray) +
939
+ '\n' +
940
+ paint(' logs ', ansi.dim) +
941
+ paint(outLog, ansi.yellow) +
942
+ paint(' ', ansi.dim) +
943
+ paint(errLog, ansi.yellow) +
944
+ '\n',
945
+ );
946
+ } else {
947
+ output.write(
948
+ paint('! ', ansi.yellow, ansi.bold) +
949
+ paint(`${platform}: `, ansi.yellow) +
950
+ paint(
951
+ 'no launchd/systemd/Task Scheduler template. Run manually:\n',
952
+ ansi.dim,
953
+ ),
954
+ );
955
+ printManualDaemonRun(repoRoot, envFile);
956
+ }
957
+ }
958
+
959
+ function cmdStopDaemon() {
960
+ const platform = os.platform();
961
+ if (platform === 'darwin') {
962
+ launchctlUnload();
963
+ output.write(
964
+ paint('■ ', ansi.yellow, ansi.bold) +
965
+ paint('launchd unload attempted for ', ansi.yellow) +
966
+ paint(SERVICE_LABEL, ansi.cyan) +
967
+ '\n',
968
+ );
969
+ } else if (platform === 'linux') {
970
+ systemctlUser(['disable', '--now', SYSTEMD_UNIT]);
971
+ output.write(
972
+ paint('■ ', ansi.yellow, ansi.bold) +
973
+ paint('systemd user service stopped: ', ansi.yellow) +
974
+ paint(SYSTEMD_UNIT, ansi.cyan) +
975
+ '\n',
976
+ );
977
+ } else if (platform === 'win32') {
978
+ spawnSync('schtasks', ['/End', '/TN', WINDOWS_TASK_NAME], {
979
+ stdio: 'pipe',
980
+ });
981
+ spawnSync('schtasks', ['/Delete', '/TN', WINDOWS_TASK_NAME, '/F'], {
982
+ stdio: 'pipe',
983
+ });
984
+ output.write(
985
+ paint('■ ', ansi.yellow, ansi.bold) +
986
+ paint('Scheduled task end/delete attempted: ', ansi.yellow) +
987
+ paint(WINDOWS_TASK_NAME, ansi.cyan) +
988
+ '\n',
989
+ );
990
+ } else {
991
+ output.write(
992
+ paint('✗ ', ansi.red, ansi.bold) +
993
+ paint('stop-daemon: unsupported platform\n', ansi.red),
994
+ );
995
+ }
996
+ }
997
+
998
+ function cmdDaemonStatus() {
999
+ const platform = os.platform();
1000
+ if (platform === 'darwin') {
1001
+ const uid =
1002
+ typeof process.getuid === 'function'
1003
+ ? String(process.getuid())
1004
+ : execSync('id -u', { encoding: 'utf8' }).trim();
1005
+ spawnSync('launchctl', ['print', `gui/${uid}/${SERVICE_LABEL}`], {
1006
+ stdio: 'inherit',
1007
+ });
1008
+ } else if (platform === 'linux') {
1009
+ systemctlUser(['status', SYSTEMD_UNIT]);
1010
+ } else if (platform === 'win32') {
1011
+ spawnSync(
1012
+ 'schtasks',
1013
+ ['/Query', '/TN', WINDOWS_TASK_NAME, '/V', '/FO', 'LIST'],
1014
+ { stdio: 'inherit' },
1015
+ );
1016
+ } else {
1017
+ output.write(
1018
+ paint('✗ ', ansi.red, ansi.bold) +
1019
+ paint('daemon-status: unsupported platform\n', ansi.red),
1020
+ );
1021
+ }
1022
+ }
1023
+
1024
+ function printHelp() {
1025
+ const stateHint = join(configDir(), 'agentmanager');
1026
+ output.write(
1027
+ '\n' +
1028
+ paint('AgentManager', ansi.bold, ansi.magenta) +
1029
+ paint(' — ', ansi.dim) +
1030
+ paint('craft, deploy, and manage AI employees\n\n', ansi.cyan) +
1031
+ ' ' +
1032
+ paint('--start-daemon', ansi.green, ansi.bold) +
1033
+ paint(
1034
+ ' Interactive env wizard, build, install & start the monolith daemon\n',
1035
+ ansi.dim,
1036
+ ) +
1037
+ ' ' +
1038
+ paint('--stop-daemon', ansi.yellow, ansi.bold) +
1039
+ paint(
1040
+ ' Stop launchd / systemd user service / Windows Scheduled Task\n',
1041
+ ansi.dim,
1042
+ ) +
1043
+ ' ' +
1044
+ paint('--daemon-status', ansi.blue, ansi.bold) +
1045
+ paint(' Service status ', ansi.dim) +
1046
+ paint('(launchctl / systemctl --user / schtasks)\n', ansi.gray) +
1047
+ ' ' +
1048
+ paint('-v, --version', ansi.gray, ansi.bold) +
1049
+ paint(' Print package version and exit\n', ansi.dim) +
1050
+ ' ' +
1051
+ paint('--logs', ansi.green, ansi.bold) +
1052
+ paint(' ', ansi.reset) +
1053
+ paint('tail -f monolith ', ansi.dim) +
1054
+ paint('stdout', ansi.green) +
1055
+ paint('.log\n', ansi.dim) +
1056
+ ' ' +
1057
+ paint('--errors', ansi.red, ansi.bold) +
1058
+ paint(' ', ansi.reset) +
1059
+ paint('tail -f monolith ', ansi.dim) +
1060
+ paint('stderr', ansi.red) +
1061
+ paint('.log\n', ansi.dim) +
1062
+ ' ' +
1063
+ paint('--repo-root PATH', ansi.cyan, ansi.bold) +
1064
+ paint(' Monorepo root ', ansi.dim) +
1065
+ paint(
1066
+ `(default: cwd, ${join(stateHint, 'repo-root.txt')}, or npm global package dir)\n`,
1067
+ ansi.gray,
1068
+ ) +
1069
+ '\n' +
1070
+ paint('Config ', ansi.dim) +
1071
+ paint(join(stateHint, 'daemon.env'), ansi.yellow) +
1072
+ '\n' +
1073
+ paint('Logs ', ansi.dim) +
1074
+ paint(join(stateHint, 'logs', 'monolith.stdout.log'), ansi.green) +
1075
+ paint(' · ', ansi.dim) +
1076
+ paint(join(stateHint, 'logs', 'monolith.stderr.log'), ansi.red) +
1077
+ '\n' +
1078
+ paint('NO_COLOR=1 ', ansi.dim) +
1079
+ paint('disables ANSI colors.\n', ansi.gray) +
1080
+ '\n',
1081
+ );
1082
+ }
1083
+
1084
+ function main() {
1085
+ const argv = process.argv.slice(2);
1086
+ if (argv.includes('--version') || argv.includes('-v')) {
1087
+ output.write(`${PKG_VERSION}\n`);
1088
+ return;
1089
+ }
1090
+ printCliVersionLine();
1091
+ if (argv.includes('--start-daemon') || argv.includes('--start-daemon=true')) {
1092
+ cmdStartDaemon(argv).catch((e) => {
1093
+ console.error(paint(String(e?.stack ?? e), ansi.red));
1094
+ process.exit(1);
1095
+ });
1096
+ return;
1097
+ }
1098
+ if (argv.includes('--stop-daemon')) {
1099
+ cmdStopDaemon();
1100
+ return;
1101
+ }
1102
+ if (argv.includes('--daemon-status')) {
1103
+ cmdDaemonStatus();
1104
+ return;
1105
+ }
1106
+ if (argv.includes('--logs')) {
1107
+ cmdTailMonolithLog('stdout');
1108
+ return;
1109
+ }
1110
+ if (argv.includes('--errors')) {
1111
+ cmdTailMonolithLog('stderr');
1112
+ return;
1113
+ }
1114
+ if (argv.includes('-h') || argv.includes('--help') || argv.length === 0) {
1115
+ printHelp();
1116
+ return;
1117
+ }
1118
+ output.write(
1119
+ paint('✗ ', ansi.red, ansi.bold) +
1120
+ paint(`Unknown arguments: ${argv.join(' ')}\n`, ansi.red),
1121
+ );
1122
+ printHelp();
1123
+ process.exit(1);
1124
+ }
1125
+
1126
+ main();