@lumenflow/cli 4.23.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/README.md +54 -52
  2. package/dist/agent-issues-query.js +10 -2
  3. package/dist/agent-issues-query.js.map +1 -1
  4. package/dist/agent-runtime-enrollment-events.js +44 -0
  5. package/dist/agent-runtime-enrollment-events.js.map +1 -0
  6. package/dist/agent-session-end.js +47 -0
  7. package/dist/agent-session-end.js.map +1 -1
  8. package/dist/agent-session-heartbeat.js +250 -0
  9. package/dist/agent-session-heartbeat.js.map +1 -0
  10. package/dist/agent-session.js +299 -5
  11. package/dist/agent-session.js.map +1 -1
  12. package/dist/capacity-snapshot-emitter.js +73 -0
  13. package/dist/capacity-snapshot-emitter.js.map +1 -0
  14. package/dist/claim-queue.js +276 -0
  15. package/dist/claim-queue.js.map +1 -0
  16. package/dist/config-set.js +22 -3
  17. package/dist/config-set.js.map +1 -1
  18. package/dist/control-plane-sidecar-runner.js +145 -0
  19. package/dist/control-plane-sidecar-runner.js.map +1 -0
  20. package/dist/delegation-list.js +160 -1
  21. package/dist/delegation-list.js.map +1 -1
  22. package/dist/delegation-role-resolver.js +69 -0
  23. package/dist/delegation-role-resolver.js.map +1 -0
  24. package/dist/docs-generate-pack-reference.js +500 -0
  25. package/dist/docs-generate-pack-reference.js.map +1 -0
  26. package/dist/docs-sync.js +116 -1
  27. package/dist/docs-sync.js.map +1 -1
  28. package/dist/file-edit.js +28 -8
  29. package/dist/file-edit.js.map +1 -1
  30. package/dist/file-write.js +29 -5
  31. package/dist/file-write.js.map +1 -1
  32. package/dist/gate-co-change.js +25 -7
  33. package/dist/gate-co-change.js.map +1 -1
  34. package/dist/gate-conditional.js +19 -7
  35. package/dist/gate-conditional.js.map +1 -1
  36. package/dist/gates-runners.js +42 -33
  37. package/dist/gates-runners.js.map +1 -1
  38. package/dist/gates-utils.js +34 -20
  39. package/dist/gates-utils.js.map +1 -1
  40. package/dist/gates.js +79 -7
  41. package/dist/gates.js.map +1 -1
  42. package/dist/hooks/config-resolver.js +10 -1
  43. package/dist/hooks/config-resolver.js.map +1 -1
  44. package/dist/init-package-config.js +1 -1
  45. package/dist/init-package-config.js.map +1 -1
  46. package/dist/init-scaffolding.js +5 -1
  47. package/dist/init-scaffolding.js.map +1 -1
  48. package/dist/init-templates.js +10 -0
  49. package/dist/init-templates.js.map +1 -1
  50. package/dist/init.js +1 -1
  51. package/dist/init.js.map +1 -1
  52. package/dist/initiative-create.js +17 -0
  53. package/dist/initiative-create.js.map +1 -1
  54. package/dist/initiative-remove-wu.js +17 -3
  55. package/dist/initiative-remove-wu.js.map +1 -1
  56. package/dist/kernel-event-sync/emitters.js +104 -0
  57. package/dist/kernel-event-sync/emitters.js.map +1 -0
  58. package/dist/kernel-event-sync/index.js +13 -0
  59. package/dist/kernel-event-sync/index.js.map +1 -0
  60. package/dist/kernel-event-sync/lifecycle-emitters.js +160 -0
  61. package/dist/kernel-event-sync/lifecycle-emitters.js.map +1 -0
  62. package/dist/kernel-event-sync/narrow-emissions.js +89 -0
  63. package/dist/kernel-event-sync/narrow-emissions.js.map +1 -0
  64. package/dist/kernel-event-sync/software-delivery-emitters.js +297 -0
  65. package/dist/kernel-event-sync/software-delivery-emitters.js.map +1 -0
  66. package/dist/lane-lock.js +14 -1
  67. package/dist/lane-lock.js.map +1 -1
  68. package/dist/lane-suggest.js +21 -0
  69. package/dist/lane-suggest.js.map +1 -1
  70. package/dist/lumenflow-upgrade.js +7 -5
  71. package/dist/lumenflow-upgrade.js.map +1 -1
  72. package/dist/mem-context.js +145 -0
  73. package/dist/mem-context.js.map +1 -1
  74. package/dist/mem-create.js +39 -6
  75. package/dist/mem-create.js.map +1 -1
  76. package/dist/mem-inbox.js +16 -0
  77. package/dist/mem-inbox.js.map +1 -1
  78. package/dist/mem-roster.js +95 -0
  79. package/dist/mem-roster.js.map +1 -0
  80. package/dist/mem-signal.js +97 -2
  81. package/dist/mem-signal.js.map +1 -1
  82. package/dist/metrics-cli.js +3 -2
  83. package/dist/metrics-cli.js.map +1 -1
  84. package/dist/metrics-snapshot.js +271 -13
  85. package/dist/metrics-snapshot.js.map +1 -1
  86. package/dist/orchestrate-init-status.js +117 -2
  87. package/dist/orchestrate-init-status.js.map +1 -1
  88. package/dist/orchestrate-initiative.js +83 -10
  89. package/dist/orchestrate-initiative.js.map +1 -1
  90. package/dist/orchestrate-monitor-quality.js +289 -0
  91. package/dist/orchestrate-monitor-quality.js.map +1 -0
  92. package/dist/orchestrate-monitor.js +85 -0
  93. package/dist/orchestrate-monitor.js.map +1 -1
  94. package/dist/pack-validate.js +127 -2
  95. package/dist/pack-validate.js.map +1 -1
  96. package/dist/plan-create.js +18 -0
  97. package/dist/plan-create.js.map +1 -1
  98. package/dist/plan-link.js +13 -0
  99. package/dist/plan-link.js.map +1 -1
  100. package/dist/plan-promote.js +14 -0
  101. package/dist/plan-promote.js.map +1 -1
  102. package/dist/pre-commit-check.js +4 -3
  103. package/dist/pre-commit-check.js.map +1 -1
  104. package/dist/public-manifest.js +17 -3
  105. package/dist/public-manifest.js.map +1 -1
  106. package/dist/release.js +10 -10
  107. package/dist/release.js.map +1 -1
  108. package/dist/session-cross-link.js +139 -0
  109. package/dist/session-cross-link.js.map +1 -0
  110. package/dist/sidecar-manager.js +208 -0
  111. package/dist/sidecar-manager.js.map +1 -0
  112. package/dist/state-path-resolvers.js +18 -0
  113. package/dist/state-path-resolvers.js.map +1 -1
  114. package/dist/stream-heartbeat.js +151 -0
  115. package/dist/stream-heartbeat.js.map +1 -0
  116. package/dist/sync-templates.js +56 -2
  117. package/dist/sync-templates.js.map +1 -1
  118. package/dist/wu-block.js +47 -5
  119. package/dist/wu-block.js.map +1 -1
  120. package/dist/wu-claim-branch.js +8 -4
  121. package/dist/wu-claim-branch.js.map +1 -1
  122. package/dist/wu-claim-state.js +5 -3
  123. package/dist/wu-claim-state.js.map +1 -1
  124. package/dist/wu-claim-worktree.js +5 -3
  125. package/dist/wu-claim-worktree.js.map +1 -1
  126. package/dist/wu-claim.js +261 -9
  127. package/dist/wu-claim.js.map +1 -1
  128. package/dist/wu-done-auto-cleanup.js +3 -2
  129. package/dist/wu-done-auto-cleanup.js.map +1 -1
  130. package/dist/wu-done-git-ops.js +12 -8
  131. package/dist/wu-done-git-ops.js.map +1 -1
  132. package/dist/wu-done-preflight.js +3 -3
  133. package/dist/wu-done-preflight.js.map +1 -1
  134. package/dist/wu-done.js +46 -10
  135. package/dist/wu-done.js.map +1 -1
  136. package/dist/wu-lifecycle-sync/gate-scope-resolver.js +16 -0
  137. package/dist/wu-lifecycle-sync/gate-scope-resolver.js.map +1 -0
  138. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js +10 -0
  139. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js.map +1 -0
  140. package/dist/wu-prep.js +363 -22
  141. package/dist/wu-prep.js.map +1 -1
  142. package/dist/wu-prune.js +68 -27
  143. package/dist/wu-prune.js.map +1 -1
  144. package/dist/wu-release.js +34 -3
  145. package/dist/wu-release.js.map +1 -1
  146. package/dist/wu-review.js +167 -0
  147. package/dist/wu-review.js.map +1 -0
  148. package/dist/wu-spawn-prompt-builders.js +296 -40
  149. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  150. package/dist/wu-spawn-strategy-resolver.js +126 -14
  151. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  152. package/dist/wu-unblock.js +52 -22
  153. package/dist/wu-unblock.js.map +1 -1
  154. package/package.json +13 -8
  155. package/packs/agent-runtime/.turbo/turbo-build.log +1 -1
  156. package/packs/agent-runtime/.turbo/turbo-test.log +25 -0
  157. package/packs/agent-runtime/.turbo/turbo-typecheck.log +4 -0
  158. package/packs/agent-runtime/agent-heartbeat.ts +163 -0
  159. package/packs/agent-runtime/auto-session-integration.ts +874 -0
  160. package/packs/agent-runtime/delegation-registry-schema.ts +220 -0
  161. package/packs/agent-runtime/delegation-registry-store.ts +269 -0
  162. package/packs/agent-runtime/delegation-tree.ts +328 -0
  163. package/packs/agent-runtime/index.ts +9 -0
  164. package/packs/agent-runtime/manifest.ts +103 -19
  165. package/packs/agent-runtime/manifest.yaml +132 -0
  166. package/packs/agent-runtime/memory-coordination-contract.ts +86 -0
  167. package/packs/agent-runtime/memory.d.ts +19 -0
  168. package/packs/agent-runtime/orchestration.ts +238 -23
  169. package/packs/agent-runtime/package.json +11 -2
  170. package/packs/agent-runtime/remote-controls/index.ts +7 -0
  171. package/packs/agent-runtime/remote-controls/operations.ts +399 -0
  172. package/packs/agent-runtime/remote-controls/port.ts +48 -0
  173. package/packs/agent-runtime/remote-controls/state-store.ts +258 -0
  174. package/packs/agent-runtime/remote-controls/types.ts +105 -0
  175. package/packs/agent-runtime/session-schema.ts +423 -0
  176. package/packs/agent-runtime/tool-impl/index.ts +1 -0
  177. package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +252 -0
  178. package/packs/agent-runtime/tool-impl/remote-controls.ts +273 -0
  179. package/packs/agent-runtime/tsconfig.json +1 -1
  180. package/packs/agent-runtime/turn-lifecycle-events.ts +501 -0
  181. package/packs/sidekick/.lumenflow/state/conductor/outbox/sidekick-events.jsonl +213 -0
  182. package/packs/sidekick/.turbo/turbo-build.log +1 -1
  183. package/packs/sidekick/.turbo/turbo-test.log +25 -0
  184. package/packs/sidekick/.turbo/turbo-typecheck.log +4 -0
  185. package/packs/sidekick/channel-ingress.ts +137 -0
  186. package/packs/sidekick/manifest.ts +74 -0
  187. package/packs/sidekick/manifest.yaml +88 -0
  188. package/packs/sidekick/package.json +3 -1
  189. package/packs/sidekick/sidekick-events.ts +517 -0
  190. package/packs/sidekick/src/adapters/cloud-queue.ts +101 -0
  191. package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +378 -0
  192. package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +224 -0
  193. package/packs/sidekick/src/domain/channel.types.ts +84 -0
  194. package/packs/sidekick/src/ports/channel-bridge.port.ts +75 -0
  195. package/packs/sidekick/src/routines/commit.ts +74 -0
  196. package/packs/sidekick/tool-impl/channel-tools.ts +47 -0
  197. package/packs/sidekick/tool-impl/memory-tools.ts +17 -0
  198. package/packs/sidekick/tool-impl/routine-commit.ts +102 -0
  199. package/packs/sidekick/tool-impl/routine-tools.ts +67 -7
  200. package/packs/sidekick/tool-impl/runtime-context.ts +4 -0
  201. package/packs/sidekick/tool-impl/storage.ts +3 -0
  202. package/packs/sidekick/tool-impl/system-tools.ts +7 -0
  203. package/packs/sidekick/tool-impl/task-tools.ts +46 -0
  204. package/packs/sidekick/tsconfig.json +1 -1
  205. package/packs/software-delivery/.turbo/turbo-build.log +1 -1
  206. package/packs/software-delivery/.turbo/turbo-test.log +63 -0
  207. package/packs/software-delivery/.turbo/turbo-typecheck.log +4 -0
  208. package/packs/software-delivery/manifest-schema.ts +30 -0
  209. package/packs/software-delivery/manifest.ts +99 -1
  210. package/packs/software-delivery/manifest.yaml +46 -0
  211. package/packs/software-delivery/package.json +88 -3
  212. package/packs/software-delivery/src/commands/index.ts +5 -0
  213. package/packs/software-delivery/src/config/delivery-review-contract.ts +20 -0
  214. package/packs/software-delivery/src/config/env-accessors.ts +19 -0
  215. package/packs/software-delivery/src/config/index.ts +8 -0
  216. package/packs/software-delivery/src/config/normalize-config-keys.ts +19 -0
  217. package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +436 -0
  218. package/packs/software-delivery/src/config/workspace-reader.ts +310 -0
  219. package/packs/software-delivery/src/constants/backlog-patterns.ts +31 -0
  220. package/packs/software-delivery/src/constants/client-ids.ts +19 -0
  221. package/packs/software-delivery/src/constants/config-contract.ts +7 -0
  222. package/packs/software-delivery/src/constants/docs-layout-presets.ts +50 -0
  223. package/packs/software-delivery/src/constants/duration-constants.ts +20 -0
  224. package/packs/software-delivery/src/constants/gate-constants.ts +32 -0
  225. package/packs/software-delivery/src/constants/index.ts +29 -0
  226. package/packs/software-delivery/src/constants/lock-constants.ts +35 -0
  227. package/packs/software-delivery/src/constants/object-guards.ts +12 -0
  228. package/packs/software-delivery/src/constants/section-headings.ts +107 -0
  229. package/packs/software-delivery/src/constants/wu-cli-constants.ts +485 -0
  230. package/packs/software-delivery/src/constants/wu-domain-constants.ts +466 -0
  231. package/packs/software-delivery/src/constants/wu-git-constants.ts +7 -0
  232. package/packs/software-delivery/src/constants/wu-id-format.ts +327 -0
  233. package/packs/software-delivery/src/constants/wu-paths-constants.ts +358 -0
  234. package/packs/software-delivery/src/constants/wu-statuses.ts +287 -0
  235. package/packs/software-delivery/src/constants/wu-type-helpers.ts +67 -0
  236. package/packs/software-delivery/src/constants/wu-ui-constants.ts +267 -0
  237. package/packs/software-delivery/src/constants/wu-validation-constants.ts +73 -0
  238. package/packs/software-delivery/src/domain/index.ts +5 -0
  239. package/packs/software-delivery/src/domain/orchestration.constants.ts +168 -0
  240. package/packs/software-delivery/src/domain/orchestration.schemas.ts +239 -0
  241. package/packs/software-delivery/src/domain/orchestration.types.ts +178 -0
  242. package/packs/software-delivery/src/methodology/incremental-test.ts +90 -0
  243. package/packs/software-delivery/src/methodology/index.ts +6 -0
  244. package/packs/software-delivery/src/methodology/manual-test-validator.ts +292 -0
  245. package/packs/software-delivery/src/policy/coverage-gate.ts +270 -0
  246. package/packs/software-delivery/src/policy/gates-agent-mode.ts +223 -0
  247. package/packs/software-delivery/src/policy/gates-config-internal.ts +121 -0
  248. package/packs/software-delivery/src/policy/gates-config.ts +293 -0
  249. package/packs/software-delivery/src/policy/gates-coverage.ts +247 -0
  250. package/packs/software-delivery/src/policy/gates-presets.ts +134 -0
  251. package/packs/software-delivery/src/policy/gates-schemas.ts +173 -0
  252. package/packs/software-delivery/src/policy/index.ts +22 -0
  253. package/packs/software-delivery/src/policy/package-manager-resolver.ts +319 -0
  254. package/packs/software-delivery/src/policy/resolve-policy.ts +518 -0
  255. package/packs/software-delivery/src/ports/config.ports.ts +90 -0
  256. package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +125 -0
  257. package/packs/software-delivery/src/ports/index.ts +10 -0
  258. package/packs/software-delivery/src/ports/sync-validator.ports.ts +59 -0
  259. package/packs/software-delivery/src/ports/wu-helpers.ports.ts +168 -0
  260. package/packs/software-delivery/src/ports/wu-state.ports.ts +241 -0
  261. package/packs/software-delivery/src/primitives/index.ts +5 -0
  262. package/packs/software-delivery/src/runtime/index.ts +6 -0
  263. package/packs/software-delivery/src/runtime/work-classifier.ts +561 -0
  264. package/packs/software-delivery/src/sandbox/index.ts +10 -0
  265. package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +118 -0
  266. package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +88 -0
  267. package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +154 -0
  268. package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +47 -0
  269. package/packs/software-delivery/src/sandbox/sandbox-profile.ts +153 -0
  270. package/packs/software-delivery/src/schemas/index.ts +5 -0
  271. package/packs/software-delivery/src/state/date-utils.ts +158 -0
  272. package/packs/software-delivery/src/state/index.ts +15 -0
  273. package/packs/software-delivery/src/state/state-machine.ts +119 -0
  274. package/packs/software-delivery/src/state/wu-doc-types.ts +51 -0
  275. package/packs/software-delivery/src/state/wu-paths.ts +381 -0
  276. package/packs/software-delivery/src/state/wu-schema.ts +1139 -0
  277. package/packs/software-delivery/src/state/wu-state-schema.ts +255 -0
  278. package/packs/software-delivery/src/state/wu-yaml.ts +338 -0
  279. package/packs/software-delivery/src/types.d.ts +16 -0
  280. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +18 -0
  281. package/packs/software-delivery/tsconfig.json +28 -2
  282. package/templates/core/AGENTS.md.template +76 -17
  283. package/templates/core/LUMENFLOW.md.template +265 -66
  284. package/templates/core/_frameworks/lumenflow/wu-sizing-guide.md.template +180 -116
  285. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +26 -8
  286. package/templates/core/ai/onboarding/existing-project-bootstrap.md.template +171 -0
  287. package/templates/core/ai/onboarding/first-15-mins.md.template +3 -1
  288. package/templates/core/ai/onboarding/first-wu-mistakes.md.template +1 -1
  289. package/templates/core/ai/onboarding/initiative-orchestration.md.template +46 -30
  290. package/templates/core/ai/onboarding/quick-ref-commands.md.template +36 -33
  291. package/templates/core/ai/onboarding/release-process.md.template +8 -7
  292. package/templates/core/ai/onboarding/starting-prompt.md.template +2 -0
  293. package/templates/core/ai/onboarding/troubleshooting-wu-done.md.template +62 -0
  294. package/templates/vendors/claude/.claude/CLAUDE.md.template +29 -54
  295. package/templates/vendors/cursor/.cursor/rules/lumenflow.md.template +24 -52
  296. package/templates/vendors/windsurf/.windsurf/rules/lumenflow.md.template +24 -52
@@ -9,21 +9,220 @@
9
9
  * Usage:
10
10
  * pnpm agent:session --wu WU-1234 --tier 2
11
11
  */
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import { isIP } from 'node:net';
14
+ import { join } from 'node:path';
12
15
  import { Command } from 'commander';
13
16
  import { startSession, getCurrentSession } from '@lumenflow/agent';
14
- import { EXIT_CODES } from '@lumenflow/core/wu-constants';
15
- import { ProcessExitError } from '@lumenflow/core/error-handler';
17
+ import { CONFIG_FILES, ENV_VARS, EXIT_CODES } from '@lumenflow/core/wu-constants';
18
+ import { createError, ErrorCodes, ProcessExitError } from '@lumenflow/core/error-handler';
19
+ import { parseYAML } from '@lumenflow/core/wu-yaml';
16
20
  import chalk from 'chalk';
21
+ import { buildAgentSessionEnrolledEvent, buildAgentSessionStalledEvent, } from './agent-runtime-enrollment-events.js';
22
+ import { resolveConductorEventSink } from './kernel-event-sync/lifecycle-emitters.js';
17
23
  import { runCLI } from './cli-entry-point.js';
24
+ const REACHABILITY_CLASS = {
25
+ REVERSE_TUNNEL: 'reverse-tunnel',
26
+ PUBLIC: 'public',
27
+ LAN: 'lan',
28
+ UNREACHABLE: 'unreachable',
29
+ };
30
+ const REACHABILITY_CLASS_VALUES = [
31
+ REACHABILITY_CLASS.REVERSE_TUNNEL,
32
+ REACHABILITY_CLASS.PUBLIC,
33
+ REACHABILITY_CLASS.LAN,
34
+ REACHABILITY_CLASS.UNREACHABLE,
35
+ ];
36
+ const ENVIRONMENT_KEY = {
37
+ AGENT_HTTP_URL: ENV_VARS.AGENT_HTTP_URL,
38
+ REACHABLE_HTTP_URL: ENV_VARS.REACHABLE_HTTP_URL,
39
+ REACHABILITY_CLASS: ENV_VARS.AGENT_REACHABILITY_CLASS,
40
+ HEALTH_ENDPOINT: ENV_VARS.AGENT_HEALTH_ENDPOINT,
41
+ TLS_FINGERPRINT: ENV_VARS.AGENT_TLS_FINGERPRINT,
42
+ };
43
+ const HTTP_HEADER = {
44
+ AUTHORIZATION: 'authorization',
45
+ CONTENT_TYPE: 'content-type',
46
+ };
47
+ const CONTENT_TYPE_JSON = 'application/json';
48
+ const WORKSPACE_AGENT_HOST_ROUTE_PREFIX = '/api/v1/workspaces';
49
+ const WORKSPACE_AGENT_HOST_ROUTE_SUFFIX = 'agent-hosts';
50
+ const PRIVATE_HOSTNAME_SUFFIXES = ['.internal', '.lan', '.local'];
51
+ const PRIVATE_IPV4_PREFIXES = ['10.', '127.', '169.254.', '192.168.'];
52
+ const PRIVATE_IPV4_SECOND_OCTET_172_MIN = 16;
53
+ const PRIVATE_IPV4_SECOND_OCTET_172_MAX = 31;
54
+ const PRIVATE_IPV6_PREFIXES = ['::1', 'fc', 'fd', 'fe80'];
55
+ const REVERSE_TUNNEL_SUFFIXES = [
56
+ '.gradio.live',
57
+ '.loca.lt',
58
+ '.ngrok-free.app',
59
+ '.ngrok.app',
60
+ '.ngrok.io',
61
+ '.trycloudflare.com',
62
+ '.tunnelmole.net',
63
+ ];
64
+ function asNonEmptyString(value) {
65
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null;
66
+ }
67
+ function normalizeEndpoint(endpoint) {
68
+ return endpoint.endsWith('/') ? endpoint.slice(0, endpoint.length - 1) : endpoint;
69
+ }
70
+ function normalizeHttpUrl(value) {
71
+ const normalizedValue = asNonEmptyString(value);
72
+ if (!normalizedValue) {
73
+ return null;
74
+ }
75
+ try {
76
+ return new URL(normalizedValue).toString().replace(/\/$/, '');
77
+ }
78
+ catch {
79
+ return null;
80
+ }
81
+ }
82
+ function normalizeReachabilityClass(value) {
83
+ if (typeof value !== 'string') {
84
+ return null;
85
+ }
86
+ const normalized = value.trim().toLowerCase();
87
+ return REACHABILITY_CLASS_VALUES.find((entry) => entry === normalized) ?? null;
88
+ }
89
+ function isPrivateIpv4Address(hostname) {
90
+ if (PRIVATE_IPV4_PREFIXES.some((prefix) => hostname.startsWith(prefix))) {
91
+ return true;
92
+ }
93
+ const octets = hostname.split('.');
94
+ if (octets.length !== 4 || octets[0] !== '172') {
95
+ return false;
96
+ }
97
+ const secondOctet = Number.parseInt(octets[1] ?? '', 10);
98
+ return (Number.isFinite(secondOctet) &&
99
+ secondOctet >= PRIVATE_IPV4_SECOND_OCTET_172_MIN &&
100
+ secondOctet <= PRIVATE_IPV4_SECOND_OCTET_172_MAX);
101
+ }
102
+ function isPrivateIpv6Address(hostname) {
103
+ const normalizedHostname = hostname.toLowerCase();
104
+ return PRIVATE_IPV6_PREFIXES.some((prefix) => normalizedHostname.startsWith(prefix));
105
+ }
106
+ function inferReachabilityClass(reachableHttpUrl, explicitReachabilityClass) {
107
+ if (explicitReachabilityClass) {
108
+ return explicitReachabilityClass;
109
+ }
110
+ if (!reachableHttpUrl) {
111
+ return REACHABILITY_CLASS.UNREACHABLE;
112
+ }
113
+ const hostname = new URL(reachableHttpUrl).hostname.toLowerCase();
114
+ if (REVERSE_TUNNEL_SUFFIXES.some((suffix) => hostname.endsWith(suffix))) {
115
+ return REACHABILITY_CLASS.REVERSE_TUNNEL;
116
+ }
117
+ if (hostname === 'localhost' ||
118
+ PRIVATE_HOSTNAME_SUFFIXES.some((suffix) => hostname.endsWith(suffix))) {
119
+ return REACHABILITY_CLASS.LAN;
120
+ }
121
+ const ipKind = isIP(hostname);
122
+ if (ipKind === 4 && isPrivateIpv4Address(hostname)) {
123
+ return REACHABILITY_CLASS.LAN;
124
+ }
125
+ if (ipKind === 6 && isPrivateIpv6Address(hostname)) {
126
+ return REACHABILITY_CLASS.LAN;
127
+ }
128
+ return REACHABILITY_CLASS.PUBLIC;
129
+ }
130
+ function resolveHealthEndpoint(explicitHealthEndpoint, reachableHttpUrl, reachabilityClass) {
131
+ if (reachabilityClass === REACHABILITY_CLASS.UNREACHABLE) {
132
+ return null;
133
+ }
134
+ const normalizedHealthEndpoint = normalizeHttpUrl(explicitHealthEndpoint);
135
+ if (normalizedHealthEndpoint) {
136
+ return normalizedHealthEndpoint;
137
+ }
138
+ if (!reachableHttpUrl) {
139
+ return null;
140
+ }
141
+ return new URL('/health', reachableHttpUrl).toString().replace(/\/$/, '');
142
+ }
143
+ function resolveReachabilityMetadata(input) {
144
+ const reachableHttpUrl = normalizeHttpUrl(input.reachableHttpUrl ??
145
+ input.environment[ENVIRONMENT_KEY.AGENT_HTTP_URL] ??
146
+ input.environment[ENVIRONMENT_KEY.REACHABLE_HTTP_URL]);
147
+ const explicitReachabilityClass = normalizeReachabilityClass(input.reachabilityClass ?? input.environment[ENVIRONMENT_KEY.REACHABILITY_CLASS]);
148
+ const reachabilityClass = inferReachabilityClass(reachableHttpUrl, explicitReachabilityClass);
149
+ return {
150
+ reachable_http_url: reachableHttpUrl,
151
+ reachability_class: reachabilityClass,
152
+ health_endpoint: resolveHealthEndpoint(input.healthEndpoint ?? input.environment[ENVIRONMENT_KEY.HEALTH_ENDPOINT] ?? null, reachableHttpUrl, reachabilityClass),
153
+ tls_fingerprint: asNonEmptyString(input.tlsFingerprint ?? input.environment[ENVIRONMENT_KEY.TLS_FINGERPRINT]),
154
+ };
155
+ }
156
+ function resolveControlPlaneConfig(workspaceRoot, environment) {
157
+ const workspaceConfigPath = join(workspaceRoot, CONFIG_FILES.WORKSPACE_CONFIG);
158
+ if (!existsSync(workspaceConfigPath)) {
159
+ return null;
160
+ }
161
+ let parsedWorkspace;
162
+ try {
163
+ parsedWorkspace = parseYAML(readFileSync(workspaceConfigPath, { encoding: 'utf-8' }));
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ const workspaceId = asNonEmptyString(parsedWorkspace?.id);
169
+ const endpoint = asNonEmptyString(parsedWorkspace?.control_plane?.endpoint);
170
+ const tokenEnv = asNonEmptyString(parsedWorkspace?.control_plane?.auth?.token_env);
171
+ if (!workspaceId || !endpoint || !tokenEnv) {
172
+ return null;
173
+ }
174
+ const token = asNonEmptyString(environment[tokenEnv]);
175
+ if (!token) {
176
+ return null;
177
+ }
178
+ try {
179
+ void new URL(endpoint);
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ return {
185
+ workspaceId,
186
+ endpoint: normalizeEndpoint(endpoint),
187
+ token,
188
+ };
189
+ }
190
+ function buildAgentHostEnrollmentUrl(endpoint, workspaceId) {
191
+ return `${endpoint}${WORKSPACE_AGENT_HOST_ROUTE_PREFIX}/${encodeURIComponent(workspaceId)}/${WORKSPACE_AGENT_HOST_ROUTE_SUFFIX}`;
192
+ }
193
+ async function postAgentHostEnrollment(config, payload) {
194
+ const response = await fetch(buildAgentHostEnrollmentUrl(config.endpoint, config.workspaceId), {
195
+ method: 'POST',
196
+ headers: {
197
+ [HTTP_HEADER.AUTHORIZATION]: `Bearer ${config.token}`,
198
+ [HTTP_HEADER.CONTENT_TYPE]: CONTENT_TYPE_JSON,
199
+ },
200
+ body: JSON.stringify(payload),
201
+ });
202
+ if (!response.ok) {
203
+ throw createError(ErrorCodes.COMMAND_EXECUTION_FAILED, `Agent host enrollment failed for workspace ${config.workspaceId}: HTTP ${response.status}.`, {
204
+ status: response.status,
205
+ workspaceId: config.workspaceId,
206
+ });
207
+ }
208
+ }
18
209
  const program = new Command()
19
210
  .name('agent:session')
20
211
  .description('Start an agent session')
21
212
  .requiredOption('--wu <id>', 'WU ID to work on (e.g., WU-1234)')
22
213
  .requiredOption('--tier <tier>', 'Context tier (1, 2, or 3)')
23
214
  .option('--agent-type <type>', 'Agent type (e.g. claude-code, codex-cli, gemini-cli)', 'claude-code')
215
+ .option('--reachable-http-url <url>', 'Reachable HTTP URL for inbound tool dispatch (overrides env-based detection)')
216
+ .option('--reachability-class <class>', 'Reachability class (reverse-tunnel, public, lan, unreachable)')
217
+ .option('--health-endpoint <url>', 'Optional health endpoint for agent host discovery')
218
+ .option('--tls-fingerprint <fingerprint>', 'Optional TLS fingerprint for the reachable host')
219
+ // WU-2754 (ADR-014 extension 2): carry lifecycle_role + specialty_profile on every session
220
+ // start so the session record links back to its parent delegation registry record.
221
+ .option('--lifecycle-role <role>', 'ADR-014 lifecycle_role for this session (e.g. orchestrator, executor, reviewer, finisher)')
222
+ .option('--specialty-profile <profile>', 'ADR-014 specialty_profile for this session (e.g. delivery, test, general)')
223
+ .option('--delegation-id <id>', 'Parent delegation registry reference (dlg-XXXX) to cross-link this session with delegation:list output')
24
224
  .action(async (opts) => {
25
225
  try {
26
- // Check for existing session
27
226
  const existing = await getCurrentSession();
28
227
  if (existing) {
29
228
  const message = `Session already active for ${existing.wu_id}`;
@@ -31,18 +230,113 @@ const program = new Command()
31
230
  console.error(`Run: pnpm agent:session:end to close it first.`);
32
231
  throw new ProcessExitError(message, EXIT_CODES.ERROR);
33
232
  }
34
- const tier = parseInt(opts.tier, 10);
233
+ const tier = Number.parseInt(opts.tier, 10);
35
234
  if (![1, 2, 3].includes(tier)) {
36
235
  const message = 'Invalid tier. Must be 1, 2, or 3.';
37
236
  console.error(chalk.red(message));
38
237
  throw new ProcessExitError(message, EXIT_CODES.ERROR);
39
238
  }
40
- const sessionId = await startSession(opts.wu, tier, opts.agentType);
239
+ if (opts.reachabilityClass && normalizeReachabilityClass(opts.reachabilityClass) === null) {
240
+ const message = 'Invalid reachability class. Use reverse-tunnel, public, lan, or unreachable.';
241
+ console.error(chalk.red(message));
242
+ throw new ProcessExitError(message, EXIT_CODES.ERROR);
243
+ }
244
+ const sessionId = await startSession(opts.wu, tier, opts.agentType, {
245
+ lifecycleRole: opts.lifecycleRole,
246
+ specialtyProfile: opts.specialtyProfile,
247
+ delegationId: opts.delegationId,
248
+ });
249
+ const activeSession = await getCurrentSession();
250
+ const conductorSink = await resolveConductorEventSink();
251
+ const controlPlaneConfig = resolveControlPlaneConfig(process.cwd(), process.env);
252
+ const activeLane = asNonEmptyString(activeSession?.lane) ?? 'Unknown';
253
+ if (activeSession && controlPlaneConfig) {
254
+ const reachabilityMetadata = resolveReachabilityMetadata({
255
+ reachableHttpUrl: opts.reachableHttpUrl,
256
+ reachabilityClass: opts.reachabilityClass,
257
+ healthEndpoint: opts.healthEndpoint,
258
+ tlsFingerprint: opts.tlsFingerprint,
259
+ environment: process.env,
260
+ });
261
+ const now = new Date().toISOString();
262
+ try {
263
+ await postAgentHostEnrollment(controlPlaneConfig, {
264
+ workspace_id: controlPlaneConfig.workspaceId,
265
+ session_id: sessionId,
266
+ agent_id: activeSession.agent_type,
267
+ host_id: asNonEmptyString(activeSession.host_id),
268
+ client_type: activeSession.client_type ?? activeSession.agent_type,
269
+ agent_version: asNonEmptyString(activeSession.agent_version),
270
+ lane: asNonEmptyString(activeSession.lane),
271
+ wu_id: opts.wu,
272
+ enrolled_at: now,
273
+ last_seen_at: now,
274
+ ...reachabilityMetadata,
275
+ });
276
+ conductorSink(buildAgentSessionEnrolledEvent({
277
+ session_id: sessionId,
278
+ wu_id: opts.wu,
279
+ lane: activeLane,
280
+ client_type: activeSession.client_type ?? activeSession.agent_type,
281
+ }));
282
+ }
283
+ catch (error) {
284
+ const message = error instanceof Error ? error.message : String(error);
285
+ console.warn(chalk.yellow(`Warning: agent session started locally, but host enrollment could not be sent: ${message}`));
286
+ conductorSink(buildAgentSessionStalledEvent({
287
+ session_id: sessionId,
288
+ wu_id: opts.wu,
289
+ lane: activeLane,
290
+ stage: 'enrollment',
291
+ reason: message,
292
+ }));
293
+ }
294
+ }
295
+ // WU-2642 (INIT-057 Phase 4): Start sub-minute control-plane sync
296
+ // sidecar so durable state changes during the session reach the cloud
297
+ // within sync_interval. Best-effort — never blocks session start.
298
+ try {
299
+ const { spawnControlPlaneSidecar } = await import('./sidecar-manager.js');
300
+ const sidecarResult = await spawnControlPlaneSidecar({
301
+ workspaceRoot: process.cwd(),
302
+ logger: {
303
+ warn: (message) => console.warn(chalk.yellow(`[agent:session] ${message}`)),
304
+ },
305
+ });
306
+ if (sidecarResult.spawned) {
307
+ console.log(chalk.dim(` Sidecar: control-plane sync pid=${sidecarResult.pid}`));
308
+ }
309
+ }
310
+ catch (err) {
311
+ const message = err instanceof Error ? err.message : String(err);
312
+ console.warn(chalk.yellow(`Warning: control-plane sync sidecar could not be started: ${message}`));
313
+ conductorSink(buildAgentSessionStalledEvent({
314
+ session_id: sessionId,
315
+ wu_id: opts.wu,
316
+ lane: activeLane,
317
+ stage: 'sidecar_start',
318
+ reason: message,
319
+ }));
320
+ }
41
321
  console.log(chalk.green(`✓ Session started`));
42
322
  console.log(` Session ID: ${chalk.cyan(sessionId.slice(0, 8))}...`);
43
323
  console.log(` WU: ${chalk.cyan(opts.wu)}`);
44
324
  console.log(` Tier: ${chalk.cyan(tier)}`);
45
325
  console.log(` Agent: ${chalk.cyan(opts.agentType)}`);
326
+ // WU-2754 (ADR-014 extension 2): echo role axes when supplied so the
327
+ // operator can confirm the session is correctly tagged.
328
+ if (opts.lifecycleRole) {
329
+ console.log(` Lifecycle role: ${chalk.cyan(opts.lifecycleRole)}`);
330
+ }
331
+ if (opts.specialtyProfile) {
332
+ console.log(` Specialty profile: ${chalk.cyan(opts.specialtyProfile)}`);
333
+ }
334
+ if (opts.delegationId) {
335
+ console.log(` Delegation: ${chalk.cyan(opts.delegationId)}`);
336
+ }
337
+ if (opts.reachableHttpUrl) {
338
+ console.log(` Reachable HTTP URL: ${chalk.cyan(opts.reachableHttpUrl)}`);
339
+ }
46
340
  }
47
341
  catch (err) {
48
342
  if (err instanceof ProcessExitError) {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../src/agent-session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../src/agent-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { KERNEL_EVENT_KINDS } from '@lumenflow/control-plane-sdk';
4
+ import { buildKernelEventV2 } from './kernel-event-sync/emitters.js';
5
+ /**
6
+ * Build the SDK-typed capacity snapshot event. Delegates event_id stamping to
7
+ * the shared emitter factory so replay idempotency works identically to
8
+ * every other conductor kind (WU-2638).
9
+ */
10
+ export function buildOrgCapacitySnapshotEvent(input) {
11
+ const options = {};
12
+ if (input.timestamp !== undefined) {
13
+ options.timestamp = input.timestamp;
14
+ }
15
+ if (input.idempotencyKey !== undefined) {
16
+ options.idempotencyKey = input.idempotencyKey;
17
+ }
18
+ const payload = input.maxActiveWorkers !== undefined
19
+ ? {
20
+ kind: KERNEL_EVENT_KINDS.ORG_CAPACITY_SNAPSHOT,
21
+ org_id: input.orgId,
22
+ available_capacity: input.availableCapacity,
23
+ max_active_workers: input.maxActiveWorkers,
24
+ }
25
+ : {
26
+ kind: KERNEL_EVENT_KINDS.ORG_CAPACITY_SNAPSHOT,
27
+ org_id: input.orgId,
28
+ available_capacity: input.availableCapacity,
29
+ };
30
+ const event = buildKernelEventV2(payload, options);
31
+ return event;
32
+ }
33
+ /**
34
+ * Derive `available_capacity` from a lane-availability map. Each lane with
35
+ * `available: true` contributes one unit; occupied and contaminated lanes
36
+ * contribute zero. Returns 0 for an empty map rather than NaN so downstream
37
+ * arithmetic stays safe.
38
+ */
39
+ export function computeAvailableCapacity(availability) {
40
+ let count = 0;
41
+ for (const entry of Object.values(availability)) {
42
+ if (entry.available) {
43
+ count++;
44
+ }
45
+ }
46
+ return count;
47
+ }
48
+ /**
49
+ * Fire-and-forget capacity snapshot emission. Intended to be called at
50
+ * strategic moments (claim, release, block/unblock, done) and on the sidecar
51
+ * tick; debouncing is left to the caller because the SDK shape does not
52
+ * otherwise carry enough state to hash meaningfully (available_capacity is
53
+ * a single int).
54
+ */
55
+ export function emitOrgCapacitySnapshot(options) {
56
+ const availableCapacity = computeAvailableCapacity(options.availability);
57
+ const input = {
58
+ orgId: options.orgId,
59
+ availableCapacity,
60
+ };
61
+ if (options.maxActiveWorkers !== undefined) {
62
+ input.maxActiveWorkers = options.maxActiveWorkers;
63
+ }
64
+ if (options.timestamp !== undefined) {
65
+ input.timestamp = options.timestamp;
66
+ }
67
+ if (options.idempotencyKey !== undefined) {
68
+ input.idempotencyKey = options.idempotencyKey;
69
+ }
70
+ const event = buildOrgCapacitySnapshotEvent(input);
71
+ options.sink(event);
72
+ }
73
+ //# sourceMappingURL=capacity-snapshot-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capacity-snapshot-emitter.js","sourceRoot":"","sources":["../src/capacity-snapshot-emitter.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAmBzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAgC,MAAM,iCAAiC,CAAC;AAUnG;;;;GAIG;AACH,MAAM,UAAU,6BAA6B,CAC3C,KAA+B;IAE/B,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GACX,KAAK,CAAC,gBAAgB,KAAK,SAAS;QAClC,CAAC,CAAC;YACE,IAAI,EAAE,kBAAkB,CAAC,qBAAqB;YAC9C,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,kBAAkB,EAAE,KAAK,CAAC,iBAAiB;YAC3C,kBAAkB,EAAE,KAAK,CAAC,gBAAgB;SAC3C;QACH,CAAC,CAAC;YACE,IAAI,EAAE,kBAAkB,CAAC,qBAAqB;YAC9C,MAAM,EAAE,KAAK,CAAC,KAAK;YACnB,kBAAkB,EAAE,KAAK,CAAC,iBAAiB;SAC5C,CAAC;IAER,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,KAAiC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,YAAoD;IAEpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAkBD;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAuC;IAC7E,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACzE,MAAM,KAAK,GAA6B;QACtC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,iBAAiB;KAClB,CAAC;IACF,IAAI,OAAO,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC3C,KAAK,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,KAAK,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAChD,CAAC;IACD,MAAM,KAAK,GAAG,6BAA6B,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}