@lumenflow/cli 4.24.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 (294) 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-snapshot.js +3 -2
  83. package/dist/metrics-snapshot.js.map +1 -1
  84. package/dist/orchestrate-init-status.js +117 -2
  85. package/dist/orchestrate-init-status.js.map +1 -1
  86. package/dist/orchestrate-initiative.js +83 -10
  87. package/dist/orchestrate-initiative.js.map +1 -1
  88. package/dist/orchestrate-monitor-quality.js +289 -0
  89. package/dist/orchestrate-monitor-quality.js.map +1 -0
  90. package/dist/orchestrate-monitor.js +85 -0
  91. package/dist/orchestrate-monitor.js.map +1 -1
  92. package/dist/pack-validate.js +127 -2
  93. package/dist/pack-validate.js.map +1 -1
  94. package/dist/plan-create.js +18 -0
  95. package/dist/plan-create.js.map +1 -1
  96. package/dist/plan-link.js +13 -0
  97. package/dist/plan-link.js.map +1 -1
  98. package/dist/plan-promote.js +14 -0
  99. package/dist/plan-promote.js.map +1 -1
  100. package/dist/pre-commit-check.js +4 -3
  101. package/dist/pre-commit-check.js.map +1 -1
  102. package/dist/public-manifest.js +17 -3
  103. package/dist/public-manifest.js.map +1 -1
  104. package/dist/release.js +10 -10
  105. package/dist/release.js.map +1 -1
  106. package/dist/session-cross-link.js +139 -0
  107. package/dist/session-cross-link.js.map +1 -0
  108. package/dist/sidecar-manager.js +208 -0
  109. package/dist/sidecar-manager.js.map +1 -0
  110. package/dist/state-path-resolvers.js +18 -0
  111. package/dist/state-path-resolvers.js.map +1 -1
  112. package/dist/stream-heartbeat.js +151 -0
  113. package/dist/stream-heartbeat.js.map +1 -0
  114. package/dist/sync-templates.js +56 -2
  115. package/dist/sync-templates.js.map +1 -1
  116. package/dist/wu-block.js +47 -5
  117. package/dist/wu-block.js.map +1 -1
  118. package/dist/wu-claim-branch.js +8 -4
  119. package/dist/wu-claim-branch.js.map +1 -1
  120. package/dist/wu-claim-state.js +5 -3
  121. package/dist/wu-claim-state.js.map +1 -1
  122. package/dist/wu-claim-worktree.js +5 -3
  123. package/dist/wu-claim-worktree.js.map +1 -1
  124. package/dist/wu-claim.js +261 -9
  125. package/dist/wu-claim.js.map +1 -1
  126. package/dist/wu-done-auto-cleanup.js +3 -2
  127. package/dist/wu-done-auto-cleanup.js.map +1 -1
  128. package/dist/wu-done-git-ops.js +12 -8
  129. package/dist/wu-done-git-ops.js.map +1 -1
  130. package/dist/wu-done-preflight.js +3 -3
  131. package/dist/wu-done-preflight.js.map +1 -1
  132. package/dist/wu-done.js +46 -10
  133. package/dist/wu-done.js.map +1 -1
  134. package/dist/wu-lifecycle-sync/gate-scope-resolver.js +16 -0
  135. package/dist/wu-lifecycle-sync/gate-scope-resolver.js.map +1 -0
  136. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js +10 -0
  137. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js.map +1 -0
  138. package/dist/wu-prep.js +363 -22
  139. package/dist/wu-prep.js.map +1 -1
  140. package/dist/wu-prune.js +68 -27
  141. package/dist/wu-prune.js.map +1 -1
  142. package/dist/wu-release.js +34 -3
  143. package/dist/wu-release.js.map +1 -1
  144. package/dist/wu-review.js +167 -0
  145. package/dist/wu-review.js.map +1 -0
  146. package/dist/wu-spawn-prompt-builders.js +296 -40
  147. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  148. package/dist/wu-spawn-strategy-resolver.js +126 -14
  149. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  150. package/dist/wu-unblock.js +52 -22
  151. package/dist/wu-unblock.js.map +1 -1
  152. package/package.json +13 -8
  153. package/packs/agent-runtime/.turbo/turbo-build.log +1 -1
  154. package/packs/agent-runtime/.turbo/turbo-test.log +25 -0
  155. package/packs/agent-runtime/.turbo/turbo-typecheck.log +4 -0
  156. package/packs/agent-runtime/agent-heartbeat.ts +163 -0
  157. package/packs/agent-runtime/auto-session-integration.ts +874 -0
  158. package/packs/agent-runtime/delegation-registry-schema.ts +220 -0
  159. package/packs/agent-runtime/delegation-registry-store.ts +269 -0
  160. package/packs/agent-runtime/delegation-tree.ts +328 -0
  161. package/packs/agent-runtime/index.ts +9 -0
  162. package/packs/agent-runtime/manifest.ts +103 -19
  163. package/packs/agent-runtime/manifest.yaml +132 -0
  164. package/packs/agent-runtime/memory-coordination-contract.ts +86 -0
  165. package/packs/agent-runtime/memory.d.ts +19 -0
  166. package/packs/agent-runtime/orchestration.ts +238 -23
  167. package/packs/agent-runtime/package.json +11 -2
  168. package/packs/agent-runtime/remote-controls/index.ts +7 -0
  169. package/packs/agent-runtime/remote-controls/operations.ts +399 -0
  170. package/packs/agent-runtime/remote-controls/port.ts +48 -0
  171. package/packs/agent-runtime/remote-controls/state-store.ts +258 -0
  172. package/packs/agent-runtime/remote-controls/types.ts +105 -0
  173. package/packs/agent-runtime/session-schema.ts +423 -0
  174. package/packs/agent-runtime/tool-impl/index.ts +1 -0
  175. package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +252 -0
  176. package/packs/agent-runtime/tool-impl/remote-controls.ts +273 -0
  177. package/packs/agent-runtime/tsconfig.json +1 -1
  178. package/packs/agent-runtime/turn-lifecycle-events.ts +501 -0
  179. package/packs/sidekick/.lumenflow/state/conductor/outbox/sidekick-events.jsonl +213 -0
  180. package/packs/sidekick/.turbo/turbo-build.log +1 -1
  181. package/packs/sidekick/.turbo/turbo-test.log +25 -0
  182. package/packs/sidekick/.turbo/turbo-typecheck.log +4 -0
  183. package/packs/sidekick/channel-ingress.ts +137 -0
  184. package/packs/sidekick/manifest.ts +74 -0
  185. package/packs/sidekick/manifest.yaml +88 -0
  186. package/packs/sidekick/package.json +3 -1
  187. package/packs/sidekick/sidekick-events.ts +517 -0
  188. package/packs/sidekick/src/adapters/cloud-queue.ts +101 -0
  189. package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +378 -0
  190. package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +224 -0
  191. package/packs/sidekick/src/domain/channel.types.ts +84 -0
  192. package/packs/sidekick/src/ports/channel-bridge.port.ts +75 -0
  193. package/packs/sidekick/src/routines/commit.ts +74 -0
  194. package/packs/sidekick/tool-impl/channel-tools.ts +47 -0
  195. package/packs/sidekick/tool-impl/memory-tools.ts +17 -0
  196. package/packs/sidekick/tool-impl/routine-commit.ts +102 -0
  197. package/packs/sidekick/tool-impl/routine-tools.ts +67 -7
  198. package/packs/sidekick/tool-impl/runtime-context.ts +4 -0
  199. package/packs/sidekick/tool-impl/storage.ts +3 -0
  200. package/packs/sidekick/tool-impl/system-tools.ts +7 -0
  201. package/packs/sidekick/tool-impl/task-tools.ts +46 -0
  202. package/packs/sidekick/tsconfig.json +1 -1
  203. package/packs/software-delivery/.turbo/turbo-build.log +1 -1
  204. package/packs/software-delivery/.turbo/turbo-test.log +63 -0
  205. package/packs/software-delivery/.turbo/turbo-typecheck.log +4 -0
  206. package/packs/software-delivery/manifest-schema.ts +30 -0
  207. package/packs/software-delivery/manifest.ts +99 -1
  208. package/packs/software-delivery/manifest.yaml +46 -0
  209. package/packs/software-delivery/package.json +88 -3
  210. package/packs/software-delivery/src/commands/index.ts +5 -0
  211. package/packs/software-delivery/src/config/delivery-review-contract.ts +20 -0
  212. package/packs/software-delivery/src/config/env-accessors.ts +19 -0
  213. package/packs/software-delivery/src/config/index.ts +8 -0
  214. package/packs/software-delivery/src/config/normalize-config-keys.ts +19 -0
  215. package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +436 -0
  216. package/packs/software-delivery/src/config/workspace-reader.ts +310 -0
  217. package/packs/software-delivery/src/constants/backlog-patterns.ts +31 -0
  218. package/packs/software-delivery/src/constants/client-ids.ts +19 -0
  219. package/packs/software-delivery/src/constants/config-contract.ts +7 -0
  220. package/packs/software-delivery/src/constants/docs-layout-presets.ts +50 -0
  221. package/packs/software-delivery/src/constants/duration-constants.ts +20 -0
  222. package/packs/software-delivery/src/constants/gate-constants.ts +32 -0
  223. package/packs/software-delivery/src/constants/index.ts +29 -0
  224. package/packs/software-delivery/src/constants/lock-constants.ts +35 -0
  225. package/packs/software-delivery/src/constants/object-guards.ts +12 -0
  226. package/packs/software-delivery/src/constants/section-headings.ts +107 -0
  227. package/packs/software-delivery/src/constants/wu-cli-constants.ts +485 -0
  228. package/packs/software-delivery/src/constants/wu-domain-constants.ts +466 -0
  229. package/packs/software-delivery/src/constants/wu-git-constants.ts +7 -0
  230. package/packs/software-delivery/src/constants/wu-id-format.ts +327 -0
  231. package/packs/software-delivery/src/constants/wu-paths-constants.ts +358 -0
  232. package/packs/software-delivery/src/constants/wu-statuses.ts +287 -0
  233. package/packs/software-delivery/src/constants/wu-type-helpers.ts +67 -0
  234. package/packs/software-delivery/src/constants/wu-ui-constants.ts +267 -0
  235. package/packs/software-delivery/src/constants/wu-validation-constants.ts +73 -0
  236. package/packs/software-delivery/src/domain/index.ts +5 -0
  237. package/packs/software-delivery/src/domain/orchestration.constants.ts +168 -0
  238. package/packs/software-delivery/src/domain/orchestration.schemas.ts +239 -0
  239. package/packs/software-delivery/src/domain/orchestration.types.ts +178 -0
  240. package/packs/software-delivery/src/methodology/incremental-test.ts +90 -0
  241. package/packs/software-delivery/src/methodology/index.ts +6 -0
  242. package/packs/software-delivery/src/methodology/manual-test-validator.ts +292 -0
  243. package/packs/software-delivery/src/policy/coverage-gate.ts +270 -0
  244. package/packs/software-delivery/src/policy/gates-agent-mode.ts +223 -0
  245. package/packs/software-delivery/src/policy/gates-config-internal.ts +121 -0
  246. package/packs/software-delivery/src/policy/gates-config.ts +293 -0
  247. package/packs/software-delivery/src/policy/gates-coverage.ts +247 -0
  248. package/packs/software-delivery/src/policy/gates-presets.ts +134 -0
  249. package/packs/software-delivery/src/policy/gates-schemas.ts +173 -0
  250. package/packs/software-delivery/src/policy/index.ts +22 -0
  251. package/packs/software-delivery/src/policy/package-manager-resolver.ts +319 -0
  252. package/packs/software-delivery/src/policy/resolve-policy.ts +518 -0
  253. package/packs/software-delivery/src/ports/config.ports.ts +90 -0
  254. package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +125 -0
  255. package/packs/software-delivery/src/ports/index.ts +10 -0
  256. package/packs/software-delivery/src/ports/sync-validator.ports.ts +59 -0
  257. package/packs/software-delivery/src/ports/wu-helpers.ports.ts +168 -0
  258. package/packs/software-delivery/src/ports/wu-state.ports.ts +241 -0
  259. package/packs/software-delivery/src/primitives/index.ts +5 -0
  260. package/packs/software-delivery/src/runtime/index.ts +6 -0
  261. package/packs/software-delivery/src/runtime/work-classifier.ts +561 -0
  262. package/packs/software-delivery/src/sandbox/index.ts +10 -0
  263. package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +118 -0
  264. package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +88 -0
  265. package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +154 -0
  266. package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +47 -0
  267. package/packs/software-delivery/src/sandbox/sandbox-profile.ts +153 -0
  268. package/packs/software-delivery/src/schemas/index.ts +5 -0
  269. package/packs/software-delivery/src/state/date-utils.ts +158 -0
  270. package/packs/software-delivery/src/state/index.ts +15 -0
  271. package/packs/software-delivery/src/state/state-machine.ts +119 -0
  272. package/packs/software-delivery/src/state/wu-doc-types.ts +51 -0
  273. package/packs/software-delivery/src/state/wu-paths.ts +381 -0
  274. package/packs/software-delivery/src/state/wu-schema.ts +1139 -0
  275. package/packs/software-delivery/src/state/wu-state-schema.ts +255 -0
  276. package/packs/software-delivery/src/state/wu-yaml.ts +338 -0
  277. package/packs/software-delivery/src/types.d.ts +16 -0
  278. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +18 -0
  279. package/packs/software-delivery/tsconfig.json +28 -2
  280. package/templates/core/AGENTS.md.template +76 -17
  281. package/templates/core/LUMENFLOW.md.template +265 -66
  282. package/templates/core/_frameworks/lumenflow/wu-sizing-guide.md.template +180 -116
  283. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +26 -8
  284. package/templates/core/ai/onboarding/existing-project-bootstrap.md.template +171 -0
  285. package/templates/core/ai/onboarding/first-15-mins.md.template +3 -1
  286. package/templates/core/ai/onboarding/first-wu-mistakes.md.template +1 -1
  287. package/templates/core/ai/onboarding/initiative-orchestration.md.template +46 -30
  288. package/templates/core/ai/onboarding/quick-ref-commands.md.template +36 -33
  289. package/templates/core/ai/onboarding/release-process.md.template +8 -7
  290. package/templates/core/ai/onboarding/starting-prompt.md.template +2 -0
  291. package/templates/core/ai/onboarding/troubleshooting-wu-done.md.template +62 -0
  292. package/templates/vendors/claude/.claude/CLAUDE.md.template +29 -54
  293. package/templates/vendors/cursor/.cursor/rules/lumenflow.md.template +24 -52
  294. package/templates/vendors/windsurf/.windsurf/rules/lumenflow.md.template +24 -52
@@ -0,0 +1,86 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
4
+ import { createError, ErrorCodes } from '@lumenflow/kernel/primitives/error-handler';
5
+
6
+ /**
7
+ * WU-2765: authoritative ADR-014 memory coordination field names.
8
+ *
9
+ * These axes are shared by mem:signal persistence and mem:context roster
10
+ * rendering, so they live with the agent-runtime pack rather than memory core.
11
+ */
12
+ export const MEMORY_COORDINATION_SIGNAL_FIELD_NAMES = [
13
+ 'role',
14
+ 'target_role',
15
+ 'initiative',
16
+ 'delegation_id',
17
+ ] as const;
18
+
19
+ export type MemoryCoordinationFieldName = (typeof MEMORY_COORDINATION_SIGNAL_FIELD_NAMES)[number];
20
+
21
+ export interface MemoryCoordinationSignalFields {
22
+ role?: string;
23
+ target_role?: string;
24
+ initiative?: string;
25
+ delegation_id?: string;
26
+ }
27
+
28
+ export function isNonEmptyCoordinationFieldValue(value: unknown): value is string {
29
+ return typeof value === 'string' && value.trim().length > 0;
30
+ }
31
+
32
+ export function normalizeCoordinationField(
33
+ value: string | undefined,
34
+ fieldName: MemoryCoordinationFieldName,
35
+ ): string | undefined {
36
+ if (value === undefined) {
37
+ return undefined;
38
+ }
39
+
40
+ const normalized = value.trim();
41
+ if (normalized.length === 0) {
42
+ throw createError(
43
+ ErrorCodes.VALIDATION_ERROR,
44
+ `Signal metadata fields must be non-empty strings when provided: ${fieldName}`,
45
+ );
46
+ }
47
+
48
+ return normalized;
49
+ }
50
+
51
+ /**
52
+ * WU-2755/WU-2765: compact signal summary attached to a roster row.
53
+ */
54
+ export interface CoordinationRosterSignalSummary {
55
+ id: string;
56
+ message: string;
57
+ role?: string;
58
+ target_role?: string;
59
+ created_at: string;
60
+ }
61
+
62
+ /**
63
+ * WU-2755/WU-2765: one active delegation/session roster row.
64
+ */
65
+ export interface CoordinationRosterEntry {
66
+ delegation_id: string;
67
+ target_wu_id: string;
68
+ lane?: string;
69
+ requested_role?: string;
70
+ actual_role?: string;
71
+ display_name?: string;
72
+ lifecycle_role?: string;
73
+ specialty_profile?: string;
74
+ current_wu?: string;
75
+ last_heartbeat?: string;
76
+ ownership_scope?: string;
77
+ status?: string;
78
+ recent_signals?: CoordinationRosterSignalSummary[];
79
+ }
80
+
81
+ /**
82
+ * WU-2755/WU-2765: caller-composed coordination roster input for mem:context.
83
+ */
84
+ export interface CoordinationRoster {
85
+ entries: CoordinationRosterEntry[];
86
+ }
@@ -0,0 +1,19 @@
1
+ declare module '@lumenflow/memory' {
2
+ export interface StartSessionOptions {
3
+ wuId: string;
4
+ agentType?: string;
5
+ contextTier?: string;
6
+ }
7
+
8
+ export interface StartSessionResult {
9
+ success: boolean;
10
+ session?: {
11
+ id?: string | null;
12
+ };
13
+ }
14
+
15
+ export function startSession(
16
+ baseDir: string,
17
+ options: StartSessionOptions,
18
+ ): Promise<StartSessionResult>;
19
+ }
@@ -16,6 +16,22 @@ import {
16
16
  AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY,
17
17
  AGENT_RUNTIME_AGENT_WORKFLOW_NODE_ID_METADATA_KEY,
18
18
  } from './constants.js';
19
+ import {
20
+ buildApprovalRequiredEvent,
21
+ buildBudgetThresholdEvent,
22
+ buildScheduledWakeupSetEvent,
23
+ buildToolCalledEvent,
24
+ buildTurnAbortedEvent,
25
+ buildTurnCompletedEvent,
26
+ buildTurnStartedEvent,
27
+ buildWorkflowNodeCompletedEvent,
28
+ buildWorkflowNodeFailedEvent,
29
+ buildWorkflowNodeStartedEvent,
30
+ buildWorkflowPausedEvent,
31
+ createZeroTurnCostBreakdown,
32
+ emitAgentRuntimeEvent,
33
+ type AgentRuntimeEventSink,
34
+ } from './turn-lifecycle-events.js';
19
35
  import {
20
36
  AGENT_RUNTIME_TOOL_NAMES,
21
37
  AGENT_RUNTIME_TURN_STATUSES,
@@ -100,6 +116,7 @@ export interface RunGovernedAgentLoopInput {
100
116
  executeTurnInput: AgentRuntimeExecuteTurnInput;
101
117
  createContext: (metadata: Record<string, unknown>) => ExecutionContext;
102
118
  maxTurns?: number;
119
+ eventSink?: AgentRuntimeEventSink;
103
120
  }
104
121
 
105
122
  export type AgentRuntimeWorkflowStatus =
@@ -196,6 +213,7 @@ export interface ResumeGovernedAgentSessionInput {
196
213
  maxTurnsPerInvocation?: number;
197
214
  continuationMessages?: readonly AgentRuntimeMessage[];
198
215
  now?: () => string;
216
+ eventSink?: AgentRuntimeEventSink;
199
217
  }
200
218
 
201
219
  export interface StartGovernedAgentWorkflowInput {
@@ -205,6 +223,7 @@ export interface StartGovernedAgentWorkflowInput {
205
223
  createContext: (metadata: Record<string, unknown>) => ExecutionContext;
206
224
  maxTurnsPerInvocation?: number;
207
225
  now?: () => string;
226
+ eventSink?: AgentRuntimeEventSink;
208
227
  }
209
228
 
210
229
  export interface ResumeGovernedAgentWorkflowInput {
@@ -215,6 +234,7 @@ export interface ResumeGovernedAgentWorkflowInput {
215
234
  maxTurnsPerInvocation?: number;
216
235
  continuationMessagesByNodeId?: Record<string, readonly AgentRuntimeMessage[]>;
217
236
  now?: () => string;
237
+ eventSink?: AgentRuntimeEventSink;
218
238
  }
219
239
 
220
240
  export interface AgentRuntimeLoopCompletedResult {
@@ -542,6 +562,7 @@ export async function startGovernedAgentWorkflow(
542
562
  createContext: input.createContext,
543
563
  maxTurnsPerInvocation: input.maxTurnsPerInvocation,
544
564
  timestamp,
565
+ eventSink: input.eventSink,
545
566
  });
546
567
 
547
568
  const store = createAgentRuntimeWorkflowStateStore({
@@ -599,6 +620,7 @@ export async function resumeGovernedAgentWorkflow(
599
620
  createContext: input.createContext,
600
621
  maxTurnsPerInvocation: input.maxTurnsPerInvocation,
601
622
  timestamp,
623
+ eventSink: input.eventSink,
602
624
  });
603
625
 
604
626
  await store.save(result.state);
@@ -611,6 +633,7 @@ async function advanceGovernedAgentWorkflowState(input: {
611
633
  createContext: (metadata: Record<string, unknown>) => ExecutionContext;
612
634
  maxTurnsPerInvocation?: number;
613
635
  timestamp: string;
636
+ eventSink?: AgentRuntimeEventSink;
614
637
  }): Promise<{ state: AgentRuntimeWorkflowState; result: AgentRuntimeWorkflowAdvanceResult }> {
615
638
  const workflow = input.state.workflow;
616
639
  if (!workflow) {
@@ -680,6 +703,19 @@ async function advanceGovernedAgentWorkflowState(input: {
680
703
  ),
681
704
  };
682
705
 
706
+ for (const node of scheduledNodes) {
707
+ if (typeof node.wake_at === 'string') {
708
+ emitAgentRuntimeEvent(
709
+ input.eventSink,
710
+ buildScheduledWakeupSetEvent({
711
+ session_id: state.session_id,
712
+ node_id: node.node_id,
713
+ wake_at: node.wake_at,
714
+ }),
715
+ );
716
+ }
717
+ }
718
+
683
719
  return {
684
720
  state: scheduledState,
685
721
  result: {
@@ -712,6 +748,16 @@ async function advanceGovernedAgentWorkflowState(input: {
712
748
  };
713
749
  }
714
750
 
751
+ emitAgentRuntimeEvent(
752
+ input.eventSink,
753
+ buildWorkflowNodeFailedEvent({
754
+ session_id: state.session_id,
755
+ node_id: 'workflow',
756
+ error_code: 'AGENT_RUNTIME_WORKFLOW_STALLED',
757
+ error_message: 'Workflow cannot make progress because no nodes are ready or scheduled.',
758
+ }),
759
+ );
760
+
715
761
  return {
716
762
  state: {
717
763
  ...state,
@@ -739,6 +785,14 @@ async function advanceGovernedAgentWorkflowState(input: {
739
785
  continue;
740
786
  }
741
787
 
788
+ emitAgentRuntimeEvent(
789
+ input.eventSink,
790
+ buildWorkflowNodeStartedEvent({
791
+ session_id: state.session_id,
792
+ node_id: node.node_id,
793
+ }),
794
+ );
795
+
742
796
  const nodeResult = await runGovernedAgentLoopInternal({
743
797
  runtime: input.runtime,
744
798
  executeTurnInput: {
@@ -752,6 +806,7 @@ async function advanceGovernedAgentWorkflowState(input: {
752
806
  }),
753
807
  maxTurns: input.maxTurnsPerInvocation,
754
808
  turnBudgetBehavior: 'suspend',
809
+ eventSink: input.eventSink,
755
810
  initialCursor: {
756
811
  messages: node.messages,
757
812
  history: node.history,
@@ -762,6 +817,44 @@ async function advanceGovernedAgentWorkflowState(input: {
762
817
 
763
818
  state = updateWorkflowStateForNodeResult(state, node.node_id, nodeResult, input.timestamp);
764
819
 
820
+ if (nodeResult.kind === 'completed') {
821
+ emitAgentRuntimeEvent(
822
+ input.eventSink,
823
+ buildWorkflowNodeCompletedEvent({
824
+ session_id: state.session_id,
825
+ node_id: node.node_id,
826
+ }),
827
+ );
828
+ } else if (nodeResult.kind === 'approval_required') {
829
+ emitAgentRuntimeEvent(
830
+ input.eventSink,
831
+ buildWorkflowPausedEvent({
832
+ session_id: state.session_id,
833
+ node_id: node.node_id,
834
+ reason: WORKFLOW_WAITING_REASON,
835
+ }),
836
+ );
837
+ } else if (nodeResult.kind === 'suspended') {
838
+ emitAgentRuntimeEvent(
839
+ input.eventSink,
840
+ buildWorkflowPausedEvent({
841
+ session_id: state.session_id,
842
+ node_id: node.node_id,
843
+ reason: WORKFLOW_SUSPEND_REASON,
844
+ }),
845
+ );
846
+ } else {
847
+ emitAgentRuntimeEvent(
848
+ input.eventSink,
849
+ buildWorkflowNodeFailedEvent({
850
+ session_id: state.session_id,
851
+ node_id: node.node_id,
852
+ error_code: nodeResult.error.code,
853
+ error_message: nodeResult.error.message,
854
+ }),
855
+ );
856
+ }
857
+
765
858
  if (nodeResult.kind === 'approval_required') {
766
859
  return {
767
860
  state,
@@ -801,6 +894,7 @@ async function runGovernedAgentLoopInternal(
801
894
  input: RunGovernedAgentLoopInternalInput,
802
895
  ): Promise<AgentRuntimePersistedSessionResult> {
803
896
  const maxTurns = input.maxTurns ?? DEFAULT_MAX_ORCHESTRATION_TURNS;
897
+ const sessionId = input.executeTurnInput.session_id;
804
898
  const messages = input.initialCursor
805
899
  ? [...input.initialCursor.messages]
806
900
  : [...input.executeTurnInput.messages];
@@ -810,26 +904,71 @@ async function runGovernedAgentLoopInternal(
810
904
  let invocationTurnCount = 0;
811
905
 
812
906
  while (invocationTurnCount < maxTurns) {
813
- const executeTurnOutput = await input.runtime.executeTool(
814
- AGENT_RUNTIME_TOOL_NAMES.EXECUTE_TURN,
815
- {
816
- ...input.executeTurnInput,
817
- messages: [...messages],
818
- },
819
- input.createContext({
820
- [AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY]: turnCount,
821
- [AGENT_RUNTIME_AGENT_TOOL_CALL_COUNT_METADATA_KEY]: toolCallCount,
907
+ emitAgentRuntimeEvent(
908
+ input.eventSink,
909
+ buildTurnStartedEvent({
910
+ session_id: sessionId,
911
+ turn_index: turnCount,
912
+ model_profile: input.executeTurnInput.model_profile,
822
913
  }),
823
914
  );
824
915
 
916
+ let executeTurnOutput: ToolOutput;
917
+ try {
918
+ executeTurnOutput = await input.runtime.executeTool(
919
+ AGENT_RUNTIME_TOOL_NAMES.EXECUTE_TURN,
920
+ {
921
+ ...input.executeTurnInput,
922
+ messages: [...messages],
923
+ },
924
+ input.createContext({
925
+ [AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY]: turnCount,
926
+ [AGENT_RUNTIME_AGENT_TOOL_CALL_COUNT_METADATA_KEY]: toolCallCount,
927
+ }),
928
+ );
929
+ } catch (error) {
930
+ const message = error instanceof Error ? error.message : String(error);
931
+ emitAgentRuntimeEvent(
932
+ input.eventSink,
933
+ buildTurnAbortedEvent({
934
+ session_id: sessionId,
935
+ turn_index: turnCount,
936
+ cleanup_status: 'clean',
937
+ reason: message,
938
+ }),
939
+ );
940
+ return {
941
+ kind: 'error',
942
+ stage: 'execute_turn',
943
+ error: {
944
+ code: TOOL_ERROR_CODES.TOOL_EXECUTION_FAILED,
945
+ message,
946
+ },
947
+ messages,
948
+ turn_count: turnCount,
949
+ tool_call_count: toolCallCount,
950
+ history,
951
+ };
952
+ }
953
+
825
954
  if (!executeTurnOutput.success) {
955
+ const error = normalizeToolError(
956
+ executeTurnOutput.error,
957
+ 'agent:execute-turn failed in the host loop.',
958
+ );
959
+ emitAgentRuntimeEvent(
960
+ input.eventSink,
961
+ buildTurnAbortedEvent({
962
+ session_id: sessionId,
963
+ turn_index: turnCount,
964
+ cleanup_status: 'clean',
965
+ reason: error.message,
966
+ }),
967
+ );
826
968
  return {
827
969
  kind: 'error',
828
970
  stage: 'execute_turn',
829
- error: normalizeToolError(
830
- executeTurnOutput.error,
831
- 'agent:execute-turn failed in the host loop.',
832
- ),
971
+ error,
833
972
  messages,
834
973
  turn_count: turnCount,
835
974
  tool_call_count: toolCallCount,
@@ -839,6 +978,16 @@ async function runGovernedAgentLoopInternal(
839
978
 
840
979
  const normalizedTurn = normalizeTurnOutput(executeTurnOutput.data);
841
980
  if (!normalizedTurn) {
981
+ emitAgentRuntimeEvent(
982
+ input.eventSink,
983
+ buildTurnAbortedEvent({
984
+ session_id: sessionId,
985
+ turn_index: turnCount,
986
+ cleanup_status: 'clean',
987
+ reason:
988
+ 'agent:execute-turn returned a payload that does not match the governed turn contract.',
989
+ }),
990
+ );
842
991
  return {
843
992
  kind: 'error',
844
993
  stage: 'execute_turn',
@@ -863,6 +1012,16 @@ async function runGovernedAgentLoopInternal(
863
1012
  };
864
1013
  history.push(historyEntry);
865
1014
 
1015
+ emitAgentRuntimeEvent(
1016
+ input.eventSink,
1017
+ buildTurnCompletedEvent({
1018
+ session_id: sessionId,
1019
+ turn_index: currentTurnIndex,
1020
+ status: normalizedTurn.status,
1021
+ cost_breakdown: createZeroTurnCostBreakdown(),
1022
+ }),
1023
+ );
1024
+
866
1025
  if (
867
1026
  normalizedTurn.status !== AGENT_RUNTIME_TURN_STATUSES.TOOL_REQUEST ||
868
1027
  !normalizedTurn.requested_tool
@@ -878,24 +1037,70 @@ async function runGovernedAgentLoopInternal(
878
1037
  }
879
1038
 
880
1039
  const toolCallId = `${TOOL_CALL_ID_PREFIX}-${toolCallCount + 1}`;
881
- const toolOutput = await input.runtime.executeTool(
882
- normalizedTurn.requested_tool.name,
883
- normalizedTurn.requested_tool.input,
884
- input.createContext({
885
- [AGENT_RUNTIME_AGENT_INTENT_METADATA_KEY]: normalizedTurn.intent,
886
- [AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY]: currentTurnIndex,
887
- [AGENT_RUNTIME_AGENT_TOOL_CALL_COUNT_METADATA_KEY]: toolCallCount,
888
- }),
889
- );
1040
+ let toolOutput: ToolOutput;
1041
+ try {
1042
+ toolOutput = await input.runtime.executeTool(
1043
+ normalizedTurn.requested_tool.name,
1044
+ normalizedTurn.requested_tool.input,
1045
+ input.createContext({
1046
+ [AGENT_RUNTIME_AGENT_INTENT_METADATA_KEY]: normalizedTurn.intent,
1047
+ [AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY]: currentTurnIndex,
1048
+ [AGENT_RUNTIME_AGENT_TOOL_CALL_COUNT_METADATA_KEY]: toolCallCount,
1049
+ }),
1050
+ );
1051
+ } catch (error) {
1052
+ const message = error instanceof Error ? error.message : String(error);
1053
+ emitAgentRuntimeEvent(
1054
+ input.eventSink,
1055
+ buildTurnAbortedEvent({
1056
+ session_id: sessionId,
1057
+ turn_index: currentTurnIndex,
1058
+ cleanup_status: 'partial',
1059
+ reason: message,
1060
+ }),
1061
+ );
1062
+ return {
1063
+ kind: 'error',
1064
+ stage: 'execute_turn',
1065
+ error: {
1066
+ code: TOOL_ERROR_CODES.TOOL_EXECUTION_FAILED,
1067
+ message,
1068
+ },
1069
+ messages,
1070
+ turn_count: turnCount,
1071
+ tool_call_count: toolCallCount,
1072
+ history,
1073
+ };
1074
+ }
890
1075
 
891
1076
  toolCallCount += 1;
892
1077
  historyEntry.tool_call_id = toolCallId;
893
1078
  historyEntry.tool_output = toolOutput;
894
1079
 
1080
+ emitAgentRuntimeEvent(
1081
+ input.eventSink,
1082
+ buildToolCalledEvent({
1083
+ session_id: sessionId,
1084
+ turn_index: currentTurnIndex,
1085
+ tool_name: normalizedTurn.requested_tool.name,
1086
+ tool_call_id: toolCallId,
1087
+ }),
1088
+ );
1089
+
895
1090
  if (!toolOutput.success && toolOutput.error?.code === TOOL_ERROR_CODES.APPROVAL_REQUIRED) {
1091
+ const requestId = extractApprovalRequestId(toolOutput);
1092
+ emitAgentRuntimeEvent(
1093
+ input.eventSink,
1094
+ buildApprovalRequiredEvent({
1095
+ session_id: sessionId,
1096
+ turn_index: currentTurnIndex,
1097
+ tool_name: normalizedTurn.requested_tool.name,
1098
+ request_id: requestId,
1099
+ }),
1100
+ );
896
1101
  return {
897
1102
  kind: 'approval_required',
898
- pending_request_id: extractApprovalRequestId(toolOutput),
1103
+ pending_request_id: requestId,
899
1104
  requested_tool: normalizedTurn.requested_tool,
900
1105
  last_turn: normalizedTurn,
901
1106
  messages,
@@ -914,6 +1119,16 @@ async function runGovernedAgentLoopInternal(
914
1119
  );
915
1120
  }
916
1121
 
1122
+ emitAgentRuntimeEvent(
1123
+ input.eventSink,
1124
+ buildBudgetThresholdEvent({
1125
+ session_id: sessionId,
1126
+ budget_name: 'max_turns_per_invocation',
1127
+ threshold: maxTurns,
1128
+ observed_value: invocationTurnCount,
1129
+ }),
1130
+ );
1131
+
917
1132
  if (input.turnBudgetBehavior === 'suspend') {
918
1133
  return {
919
1134
  kind: 'suspended',
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/packs-agent-runtime",
3
- "version": "4.24.0",
3
+ "version": "5.0.0",
4
4
  "description": "Agent runtime pack scaffold for LumenFlow — governed model-turn execution, pack config, and provider capability baselines",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -23,6 +23,13 @@
23
23
  "type": "module",
24
24
  "exports": {
25
25
  ".": "./dist/index.js",
26
+ "./agent-heartbeat": "./dist/agent-heartbeat.js",
27
+ "./auto-session-integration": "./dist/auto-session-integration.js",
28
+ "./delegation-registry-schema": "./dist/delegation-registry-schema.js",
29
+ "./delegation-registry-store": "./dist/delegation-registry-store.js",
30
+ "./delegation-tree": "./dist/delegation-tree.js",
31
+ "./memory-coordination-contract": "./dist/memory-coordination-contract.js",
32
+ "./session-schema": "./dist/session-schema.js",
26
33
  "./tools": "./dist/tools/index.js",
27
34
  "./tool-impl": "./dist/tool-impl/index.js"
28
35
  },
@@ -42,7 +49,9 @@
42
49
  "typecheck": "tsc --noEmit"
43
50
  },
44
51
  "dependencies": {
45
- "@lumenflow/kernel": "workspace:^"
52
+ "@lumenflow/kernel": "workspace:^",
53
+ "yaml": "^2.8.2",
54
+ "zod": "^4.3.6"
46
55
  },
47
56
  "devDependencies": {
48
57
  "typescript": "^5.9.3",
@@ -0,0 +1,7 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+
4
+ export * from './port.js';
5
+ export * from './types.js';
6
+ export * from './state-store.js';
7
+ export * from './operations.js';