@lumenflow/cli 5.4.0 → 5.7.12

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 (227) hide show
  1. package/README.md +42 -40
  2. package/dist/db-journal-recover.js +400 -0
  3. package/dist/db-journal-recover.js.map +1 -0
  4. package/dist/docs-sync.js +8 -3
  5. package/dist/docs-sync.js.map +1 -1
  6. package/dist/gate-defaults.js +191 -9
  7. package/dist/gate-defaults.js.map +1 -1
  8. package/dist/gate-registry.js.map +1 -1
  9. package/dist/gates/monolithic-file-contention-guard.js +167 -0
  10. package/dist/gates/monolithic-file-contention-guard.js.map +1 -0
  11. package/dist/gates/prod-migration-drift.js +207 -0
  12. package/dist/gates/prod-migration-drift.js.map +1 -0
  13. package/dist/gates/test-over-deletion-guard.js +255 -0
  14. package/dist/gates/test-over-deletion-guard.js.map +1 -0
  15. package/dist/gates-runners.js +401 -2
  16. package/dist/gates-runners.js.map +1 -1
  17. package/dist/gates.js +349 -4
  18. package/dist/gates.js.map +1 -1
  19. package/dist/lumenflow-setup.js +144 -0
  20. package/dist/lumenflow-setup.js.map +1 -0
  21. package/dist/lumenflow-upgrade.js +2 -1
  22. package/dist/lumenflow-upgrade.js.map +1 -1
  23. package/dist/mem-create.js +10 -1
  24. package/dist/mem-create.js.map +1 -1
  25. package/dist/mem-signal.js +21 -4
  26. package/dist/mem-signal.js.map +1 -1
  27. package/dist/metrics-cli.js +19 -2
  28. package/dist/metrics-cli.js.map +1 -1
  29. package/dist/metrics-snapshot.js +25 -2
  30. package/dist/metrics-snapshot.js.map +1 -1
  31. package/dist/orchestrate-initiative.js +28 -3
  32. package/dist/orchestrate-initiative.js.map +1 -1
  33. package/dist/public-manifest.js +17 -0
  34. package/dist/public-manifest.js.map +1 -1
  35. package/dist/release.js +53 -18
  36. package/dist/release.js.map +1 -1
  37. package/dist/wu-done-gates.js +121 -8
  38. package/dist/wu-done-gates.js.map +1 -1
  39. package/dist/wu-done.js +30 -6
  40. package/dist/wu-done.js.map +1 -1
  41. package/dist/wu-edit-operations.js +74 -0
  42. package/dist/wu-edit-operations.js.map +1 -1
  43. package/dist/wu-edit-validators.js +58 -0
  44. package/dist/wu-edit-validators.js.map +1 -1
  45. package/dist/wu-edit.js +106 -4
  46. package/dist/wu-edit.js.map +1 -1
  47. package/dist/wu-prep.js +132 -8
  48. package/dist/wu-prep.js.map +1 -1
  49. package/dist/wu-recover.js +6 -0
  50. package/dist/wu-recover.js.map +1 -1
  51. package/dist/wu-release.js +120 -2
  52. package/dist/wu-release.js.map +1 -1
  53. package/dist/wu-sizing-validation.js +47 -17
  54. package/dist/wu-sizing-validation.js.map +1 -1
  55. package/dist/wu-status.js +33 -0
  56. package/dist/wu-status.js.map +1 -1
  57. package/package.json +13 -11
  58. package/packs/agent-runtime/package.json +1 -1
  59. package/packs/sidekick/package.json +1 -1
  60. package/packs/software-delivery/package.json +1 -1
  61. package/templates/core/AGENTS.md.template +162 -26
  62. package/templates/core/LUMENFLOW.md.template +381 -70
  63. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +0 -5
  64. package/templates/core/ai/onboarding/agent-safety-card.md.template +63 -17
  65. package/templates/core/ai/onboarding/initiative-orchestration.md.template +4 -0
  66. package/templates/core/ai/onboarding/release-process.md.template +7 -7
  67. package/templates/core/ai/onboarding/vendor-support.md.template +74 -10
  68. package/templates/vendors/claude/.claude/skills/frontend-design/SKILL.md.template +1 -1
  69. package/templates/vendors/claude/.claude/skills/wu-lifecycle/SKILL.md.template +28 -0
  70. package/packs/agent-runtime/agent-heartbeat.ts +0 -163
  71. package/packs/agent-runtime/auto-session-integration.ts +0 -888
  72. package/packs/agent-runtime/capability-factory.ts +0 -104
  73. package/packs/agent-runtime/constants.ts +0 -21
  74. package/packs/agent-runtime/delegation-registry-schema.ts +0 -220
  75. package/packs/agent-runtime/delegation-registry-store.ts +0 -269
  76. package/packs/agent-runtime/delegation-tree.ts +0 -328
  77. package/packs/agent-runtime/index.ts +0 -20
  78. package/packs/agent-runtime/manifest.ts +0 -348
  79. package/packs/agent-runtime/memory-coordination-contract.ts +0 -86
  80. package/packs/agent-runtime/orchestration.ts +0 -2027
  81. package/packs/agent-runtime/pack-registration.ts +0 -110
  82. package/packs/agent-runtime/policy-factory.ts +0 -165
  83. package/packs/agent-runtime/remote-controls/index.ts +0 -7
  84. package/packs/agent-runtime/remote-controls/operations.ts +0 -405
  85. package/packs/agent-runtime/remote-controls/port.ts +0 -48
  86. package/packs/agent-runtime/remote-controls/state-store.ts +0 -258
  87. package/packs/agent-runtime/remote-controls/types.ts +0 -105
  88. package/packs/agent-runtime/session-schema.ts +0 -467
  89. package/packs/agent-runtime/tool-impl/agent-turn-tools.ts +0 -793
  90. package/packs/agent-runtime/tool-impl/index.ts +0 -6
  91. package/packs/agent-runtime/tool-impl/provider-adapters.ts +0 -1245
  92. package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +0 -256
  93. package/packs/agent-runtime/tool-impl/remote-controls.ts +0 -273
  94. package/packs/agent-runtime/tools/index.ts +0 -4
  95. package/packs/agent-runtime/tools/types.ts +0 -47
  96. package/packs/agent-runtime/turn-lifecycle-events.ts +0 -590
  97. package/packs/agent-runtime/types.ts +0 -128
  98. package/packs/agent-runtime/vitest.config.ts +0 -11
  99. package/packs/sidekick/channel-ingress.ts +0 -137
  100. package/packs/sidekick/constants.ts +0 -10
  101. package/packs/sidekick/index.ts +0 -8
  102. package/packs/sidekick/manifest-schema.ts +0 -49
  103. package/packs/sidekick/manifest.ts +0 -512
  104. package/packs/sidekick/pack-registration.ts +0 -110
  105. package/packs/sidekick/policy-factory.ts +0 -38
  106. package/packs/sidekick/sidekick-events.ts +0 -694
  107. package/packs/sidekick/src/adapters/cloud-queue.ts +0 -101
  108. package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +0 -386
  109. package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +0 -228
  110. package/packs/sidekick/src/domain/channel.types.ts +0 -64
  111. package/packs/sidekick/src/ports/channel-bridge.port.ts +0 -92
  112. package/packs/sidekick/src/routines/commit.ts +0 -74
  113. package/packs/sidekick/tool-impl/channel-tools.ts +0 -577
  114. package/packs/sidekick/tool-impl/channel-transports.ts +0 -75
  115. package/packs/sidekick/tool-impl/index.ts +0 -29
  116. package/packs/sidekick/tool-impl/memory-tools.ts +0 -290
  117. package/packs/sidekick/tool-impl/routine-commit.ts +0 -102
  118. package/packs/sidekick/tool-impl/routine-tools.ts +0 -440
  119. package/packs/sidekick/tool-impl/runtime-context.ts +0 -28
  120. package/packs/sidekick/tool-impl/shared.ts +0 -125
  121. package/packs/sidekick/tool-impl/storage.ts +0 -325
  122. package/packs/sidekick/tool-impl/system-tools.ts +0 -160
  123. package/packs/sidekick/tool-impl/task-tools.ts +0 -506
  124. package/packs/sidekick/tools/channel-tools.ts +0 -53
  125. package/packs/sidekick/tools/index.ts +0 -9
  126. package/packs/sidekick/tools/memory-tools.ts +0 -53
  127. package/packs/sidekick/tools/routine-tools.ts +0 -53
  128. package/packs/sidekick/tools/system-tools.ts +0 -47
  129. package/packs/sidekick/tools/task-tools.ts +0 -61
  130. package/packs/sidekick/tools/types.ts +0 -57
  131. package/packs/sidekick/vitest.config.ts +0 -11
  132. package/packs/software-delivery/constants.ts +0 -10
  133. package/packs/software-delivery/extensions.ts +0 -140
  134. package/packs/software-delivery/gate-policies.ts +0 -134
  135. package/packs/software-delivery/index.ts +0 -8
  136. package/packs/software-delivery/manifest-schema.ts +0 -268
  137. package/packs/software-delivery/manifest.ts +0 -657
  138. package/packs/software-delivery/pack-registration.ts +0 -113
  139. package/packs/software-delivery/src/commands/index.ts +0 -5
  140. package/packs/software-delivery/src/config/delivery-review-contract.ts +0 -256
  141. package/packs/software-delivery/src/config/env-accessors.ts +0 -66
  142. package/packs/software-delivery/src/config/index.ts +0 -8
  143. package/packs/software-delivery/src/config/normalize-config-keys.ts +0 -9
  144. package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +0 -460
  145. package/packs/software-delivery/src/config/workspace-reader.ts +0 -375
  146. package/packs/software-delivery/src/constants/backlog-patterns.ts +0 -31
  147. package/packs/software-delivery/src/constants/client-ids.ts +0 -19
  148. package/packs/software-delivery/src/constants/config-contract.ts +0 -7
  149. package/packs/software-delivery/src/constants/docs-layout-presets.ts +0 -50
  150. package/packs/software-delivery/src/constants/duration-constants.ts +0 -20
  151. package/packs/software-delivery/src/constants/gate-constants.ts +0 -32
  152. package/packs/software-delivery/src/constants/index.ts +0 -29
  153. package/packs/software-delivery/src/constants/lock-constants.ts +0 -35
  154. package/packs/software-delivery/src/constants/object-guards.ts +0 -12
  155. package/packs/software-delivery/src/constants/section-headings.ts +0 -107
  156. package/packs/software-delivery/src/constants/wu-cli-constants.ts +0 -488
  157. package/packs/software-delivery/src/constants/wu-domain-constants.ts +0 -466
  158. package/packs/software-delivery/src/constants/wu-git-constants.ts +0 -7
  159. package/packs/software-delivery/src/constants/wu-id-format.ts +0 -327
  160. package/packs/software-delivery/src/constants/wu-paths-constants.ts +0 -384
  161. package/packs/software-delivery/src/constants/wu-statuses.ts +0 -287
  162. package/packs/software-delivery/src/constants/wu-type-helpers.ts +0 -67
  163. package/packs/software-delivery/src/constants/wu-ui-constants.ts +0 -267
  164. package/packs/software-delivery/src/constants/wu-validation-constants.ts +0 -73
  165. package/packs/software-delivery/src/domain/index.ts +0 -5
  166. package/packs/software-delivery/src/domain/orchestration.constants.ts +0 -166
  167. package/packs/software-delivery/src/domain/orchestration.schemas.ts +0 -238
  168. package/packs/software-delivery/src/domain/orchestration.types.ts +0 -176
  169. package/packs/software-delivery/src/methodology/incremental-test.ts +0 -122
  170. package/packs/software-delivery/src/methodology/index.ts +0 -6
  171. package/packs/software-delivery/src/methodology/manual-test-validator.ts +0 -292
  172. package/packs/software-delivery/src/policy/coverage-gate.ts +0 -270
  173. package/packs/software-delivery/src/policy/gates-agent-mode.ts +0 -223
  174. package/packs/software-delivery/src/policy/gates-config-internal.ts +0 -121
  175. package/packs/software-delivery/src/policy/gates-config.ts +0 -300
  176. package/packs/software-delivery/src/policy/gates-coverage.ts +0 -356
  177. package/packs/software-delivery/src/policy/gates-presets.ts +0 -134
  178. package/packs/software-delivery/src/policy/gates-schemas.ts +0 -173
  179. package/packs/software-delivery/src/policy/index.ts +0 -22
  180. package/packs/software-delivery/src/policy/package-manager-resolver.ts +0 -319
  181. package/packs/software-delivery/src/policy/resolve-policy.ts +0 -601
  182. package/packs/software-delivery/src/ports/config.ports.ts +0 -90
  183. package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +0 -125
  184. package/packs/software-delivery/src/ports/index.ts +0 -10
  185. package/packs/software-delivery/src/ports/sync-validator.ports.ts +0 -59
  186. package/packs/software-delivery/src/ports/wu-helpers.ports.ts +0 -168
  187. package/packs/software-delivery/src/ports/wu-state.ports.ts +0 -241
  188. package/packs/software-delivery/src/primitives/index.ts +0 -5
  189. package/packs/software-delivery/src/runtime/index.ts +0 -6
  190. package/packs/software-delivery/src/runtime/work-classifier.ts +0 -561
  191. package/packs/software-delivery/src/sandbox/index.ts +0 -10
  192. package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +0 -118
  193. package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +0 -88
  194. package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +0 -154
  195. package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +0 -47
  196. package/packs/software-delivery/src/sandbox/sandbox-profile.ts +0 -153
  197. package/packs/software-delivery/src/schemas/index.ts +0 -5
  198. package/packs/software-delivery/src/state/date-utils.ts +0 -158
  199. package/packs/software-delivery/src/state/index.ts +0 -15
  200. package/packs/software-delivery/src/state/state-machine.ts +0 -119
  201. package/packs/software-delivery/src/state/wu-doc-types.ts +0 -51
  202. package/packs/software-delivery/src/state/wu-paths.ts +0 -381
  203. package/packs/software-delivery/src/state/wu-schema.ts +0 -1139
  204. package/packs/software-delivery/src/state/wu-state-schema.ts +0 -255
  205. package/packs/software-delivery/src/state/wu-yaml.ts +0 -338
  206. package/packs/software-delivery/tool-impl/agent-tools.ts +0 -263
  207. package/packs/software-delivery/tool-impl/delegation-tools.ts +0 -66
  208. package/packs/software-delivery/tool-impl/flow-metrics-tools.ts +0 -219
  209. package/packs/software-delivery/tool-impl/git-runner.ts +0 -113
  210. package/packs/software-delivery/tool-impl/git-tools.ts +0 -316
  211. package/packs/software-delivery/tool-impl/index.ts +0 -15
  212. package/packs/software-delivery/tool-impl/initiative-orchestration-tools.ts +0 -720
  213. package/packs/software-delivery/tool-impl/lane-lock.ts +0 -246
  214. package/packs/software-delivery/tool-impl/memory-tools.ts +0 -470
  215. package/packs/software-delivery/tool-impl/pending-runtime-tools.ts +0 -21
  216. package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +0 -329
  217. package/packs/software-delivery/tool-impl/runtime-native-tools.ts +0 -687
  218. package/packs/software-delivery/tool-impl/worker-loader.ts +0 -52
  219. package/packs/software-delivery/tool-impl/worktree-tools.ts +0 -46
  220. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +0 -807
  221. package/packs/software-delivery/tools/delegation-tools.ts +0 -23
  222. package/packs/software-delivery/tools/git-tools.ts +0 -55
  223. package/packs/software-delivery/tools/index.ts +0 -8
  224. package/packs/software-delivery/tools/lane-lock-tool.ts +0 -37
  225. package/packs/software-delivery/tools/types.ts +0 -71
  226. package/packs/software-delivery/tools/worktree-tools.ts +0 -49
  227. package/packs/software-delivery/vitest.config.ts +0 -11
@@ -1,104 +0,0 @@
1
- // Copyright (c) 2026 Hellmai Ltd
2
- // SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
3
-
4
- import type { PackCapabilityFactory } from '@lumenflow/kernel';
5
- import { AGENT_RUNTIME_TOOL_NAMES } from './types.js';
6
- import type { AgentRuntimeModelProfileConfig, AgentRuntimePackConfig } from './types.js';
7
-
8
- export const createAgentRuntimeCapabilityFactory: PackCapabilityFactory = async (input) => {
9
- if (input.tool.name !== AGENT_RUNTIME_TOOL_NAMES.EXECUTE_TURN) {
10
- return {};
11
- }
12
-
13
- const packConfig = normalizePackConfig(input.packConfig);
14
- if (!packConfig) {
15
- return {};
16
- }
17
-
18
- const requiredEnv = new Set<string>();
19
- const providerHosts = new Set<string>();
20
-
21
- for (const [profileName, profile] of Object.entries(packConfig.models)) {
22
- requiredEnv.add(profile.api_key_env);
23
- if (profile.base_url_env) {
24
- requiredEnv.add(profile.base_url_env);
25
- }
26
-
27
- const resolvedBaseUrl = resolveProfileBaseUrl(profileName, profile);
28
- if (!resolvedBaseUrl) {
29
- continue;
30
- }
31
- providerHosts.add(toNetworkAllowlistEntry(profileName, resolvedBaseUrl));
32
- }
33
-
34
- return {
35
- ...(requiredEnv.size > 0 ? { required_env: [...requiredEnv].sort() } : {}),
36
- ...(providerHosts.size > 0
37
- ? {
38
- required_scopes: [
39
- {
40
- type: 'network' as const,
41
- posture: 'allowlist' as const,
42
- allowlist_entries: [...providerHosts].sort(),
43
- },
44
- ],
45
- }
46
- : {}),
47
- };
48
- };
49
-
50
- function normalizePackConfig(value: unknown): AgentRuntimePackConfig | null {
51
- if (!isRecord(value) || !isRecord(value.models)) {
52
- return null;
53
- }
54
-
55
- return value as unknown as AgentRuntimePackConfig;
56
- }
57
-
58
- function resolveProfileBaseUrl(
59
- profileName: string,
60
- profile: AgentRuntimeModelProfileConfig,
61
- ): string | null {
62
- if (typeof profile.base_url === 'string' && profile.base_url.trim().length > 0) {
63
- return profile.base_url.trim();
64
- }
65
-
66
- if (!profile.base_url_env) {
67
- return null;
68
- }
69
-
70
- const environmentValue = process.env[profile.base_url_env];
71
- if (typeof environmentValue !== 'string' || environmentValue.trim().length === 0) {
72
- throw new Error(
73
- `agent_runtime.models.${profileName}.base_url_env references "${profile.base_url_env}" but it is not set.`,
74
- );
75
- }
76
-
77
- return environmentValue.trim();
78
- }
79
-
80
- function toNetworkAllowlistEntry(profileName: string, baseUrl: string): string {
81
- let parsed: URL;
82
- try {
83
- parsed = new URL(baseUrl);
84
- } catch (error) {
85
- throw new Error(
86
- `agent_runtime.models.${profileName} must resolve to a valid absolute base URL, got "${baseUrl}".`,
87
- { cause: error },
88
- );
89
- }
90
-
91
- const port =
92
- parsed.port || (parsed.protocol === 'https:' ? '443' : parsed.protocol === 'http:' ? '80' : '');
93
- if (!port) {
94
- throw new Error(
95
- `agent_runtime.models.${profileName} uses protocol "${parsed.protocol}" without an explicit port.`,
96
- );
97
- }
98
-
99
- return `${parsed.hostname}:${port}`;
100
- }
101
-
102
- function isRecord(value: unknown): value is Record<string, unknown> {
103
- return typeof value === 'object' && value !== null && !Array.isArray(value);
104
- }
@@ -1,21 +0,0 @@
1
- // Copyright (c) 2026 Hellmai Ltd
2
- // SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
3
-
4
- export const AGENT_RUNTIME_PACK_ID = 'agent-runtime' as const;
5
- export const AGENT_RUNTIME_PACK_VERSION = '0.1.0' as const;
6
- export const AGENT_RUNTIME_DOMAIN = AGENT_RUNTIME_PACK_ID;
7
- export const AGENT_RUNTIME_CONFIG_KEY = 'agent_runtime' as const;
8
- export const AGENT_RUNTIME_POLICY_ID_PREFIX = `${AGENT_RUNTIME_PACK_ID}.policy` as const;
9
- export const AGENT_RUNTIME_MANIFEST_FILE_NAME = 'manifest.yaml' as const;
10
- export const AGENT_RUNTIME_CONFIG_SCHEMA_FILE = 'config.schema.json' as const;
11
- export const SHA256_ALGORITHM = 'sha256' as const;
12
- export const UTF8_ENCODING = 'utf8' as const;
13
- export const AGENT_RUNTIME_STORAGE_PATTERN = '.agent-runtime/**' as const;
14
- export const AGENT_RUNTIME_API_KEY_ENV = 'AGENT_RUNTIME_API_KEY' as const;
15
- export const AGENT_RUNTIME_BASE_URL_ENV = 'AGENT_RUNTIME_BASE_URL' as const;
16
- export const AGENT_RUNTIME_STATIC_PROVIDER_ALLOWLIST = ['model-provider.invalid:443'] as const;
17
- export const AGENT_RUNTIME_STATIC_PROVIDER_URLS = ['https://model-provider.invalid/'] as const;
18
- export const AGENT_RUNTIME_AGENT_INTENT_METADATA_KEY = 'agent_intent' as const;
19
- export const AGENT_RUNTIME_AGENT_TURN_INDEX_METADATA_KEY = 'agent_turn_index' as const;
20
- export const AGENT_RUNTIME_AGENT_TOOL_CALL_COUNT_METADATA_KEY = 'agent_tool_call_count' as const;
21
- export const AGENT_RUNTIME_AGENT_WORKFLOW_NODE_ID_METADATA_KEY = 'agent_workflow_node_id' as const;
@@ -1,220 +0,0 @@
1
- // Copyright (c) 2026 Hellmai Ltd
2
- // SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
3
-
4
- /**
5
- * Delegation Registry Schema (ADR-014 follow-up, WU-2763)
6
- *
7
- * Canonical delegation schema and helpers for agent-runtime coordination
8
- * records. Core now re-exports this module as a compatibility shim.
9
- */
10
-
11
- import crypto from 'node:crypto';
12
- import { z } from 'zod';
13
-
14
- /**
15
- * Delegation status values.
16
- */
17
- const DELEGATION_STATUS_COMPLETED = 'completed';
18
-
19
- export const DelegationStatus = {
20
- PENDING: 'pending',
21
- COMPLETED: DELEGATION_STATUS_COMPLETED,
22
- TIMEOUT: 'timeout',
23
- CRASHED: 'crashed',
24
- ESCALATED: 'escalated',
25
- } as const;
26
-
27
- /** Type for delegation status values */
28
- export type DelegationStatusValue = (typeof DelegationStatus)[keyof typeof DelegationStatus];
29
-
30
- /** Array of valid delegation statuses */
31
- export const DELEGATION_STATUSES = [
32
- DelegationStatus.PENDING,
33
- DelegationStatus.COMPLETED,
34
- DelegationStatus.TIMEOUT,
35
- DelegationStatus.CRASHED,
36
- DelegationStatus.ESCALATED,
37
- ] as const;
38
-
39
- /**
40
- * Optional delegation intent source values.
41
- */
42
- export const DelegationIntent = {
43
- DELEGATION: 'delegation',
44
- LEGACY_SPAWN: 'legacy-spawn',
45
- } as const;
46
-
47
- /** Type for delegation intent values */
48
- export type DelegationIntentValue = (typeof DelegationIntent)[keyof typeof DelegationIntent];
49
-
50
- /** Array of valid delegation intent values */
51
- export const DELEGATION_INTENTS = [
52
- DelegationIntent.DELEGATION,
53
- DelegationIntent.LEGACY_SPAWN,
54
- ] as const;
55
-
56
- /**
57
- * Regex patterns for delegation validation.
58
- */
59
- export const DELEGATION_PATTERNS = {
60
- DELEGATION_ID: /^dlg-[0-9a-f]{4}$/,
61
- WU_ID: /^WU-\d+$/,
62
- };
63
-
64
- /**
65
- * Delegation schema version discriminator (WU-2753, ADR-014 extension 1).
66
- *
67
- * v1 records have no `schemaVersion` field (legacy compat path).
68
- * v2 records stamp `schemaVersion: 'v2'` and MUST carry the four ADR-014
69
- * axes: requested_role, actual_role, capabilities, ownership_scope.
70
- *
71
- * Agent-runtime owns the role metadata contract as opaque strings. The
72
- * software-delivery pack still owns the canonical vocabulary.
73
- */
74
- export const DELEGATION_SCHEMA_VERSION_V2 = 'v2' as const;
75
-
76
- /** Known delegation schema versions (extensible by additive pack updates). */
77
- export const DELEGATION_SCHEMA_VERSIONS = [DELEGATION_SCHEMA_VERSION_V2] as const;
78
-
79
- /** Type union for delegation schema version values. */
80
- export type DelegationSchemaVersion = (typeof DELEGATION_SCHEMA_VERSIONS)[number];
81
-
82
- /**
83
- * Error messages for schema validation.
84
- */
85
- const ERROR_MESSAGES = {
86
- DELEGATION_ID: 'Delegation ID must match pattern dlg-XXXX (e.g., dlg-a1b2)',
87
- WU_ID: 'WU ID must match pattern WU-XXX (e.g., WU-1000)',
88
- LANE_REQUIRED: 'Lane is required',
89
- STATUS: `Status must be one of: ${DELEGATION_STATUSES.join(', ')}`,
90
- INTENT: `Intent must be one of: ${DELEGATION_INTENTS.join(', ')}`,
91
- TIMESTAMP_REQUIRED: 'Timestamp is required',
92
- PICKUP_BY_REQUIRED: 'pickedUpBy must be a non-empty string when pickup is recorded',
93
- BRIEF_HASH: 'briefAttestation.promptHash must be a 64-character lowercase sha256 hex digest',
94
- BRIEF_ALGORITHM: 'briefAttestation.algorithm must be sha256',
95
- BRIEF_CLIENT_REQUIRED: 'briefAttestation.clientName must be a non-empty string',
96
- } as const;
97
-
98
- const SHA256_HEX_256_REGEX = /^[a-f0-9]{64}$/;
99
-
100
- /**
101
- * Optional wu:brief prompt attestation captured by wu:delegate.
102
- */
103
- export const DelegationBriefAttestationSchema = z.object({
104
- algorithm: z.literal('sha256', { error: ERROR_MESSAGES.BRIEF_ALGORITHM }),
105
- promptHash: z.string().regex(SHA256_HEX_256_REGEX, { message: ERROR_MESSAGES.BRIEF_HASH }),
106
- promptLength: z.number().int().nonnegative(),
107
- generatedAt: z.string().datetime({ message: ERROR_MESSAGES.TIMESTAMP_REQUIRED }),
108
- clientName: z.string().min(1, { message: ERROR_MESSAGES.BRIEF_CLIENT_REQUIRED }),
109
- });
110
-
111
- /**
112
- * ADR-014 role descriptor — agent-runtime carries opaque strings; the
113
- * software-delivery pack owns the AgentLifecycleRole vocabulary.
114
- */
115
- export const DelegationRoleDescriptorSchema = z.object({
116
- lifecycle_role: z.string().min(1, { message: 'lifecycle_role must be non-empty' }),
117
- specialty_profile: z.string().min(1, { message: 'specialty_profile must be non-empty' }),
118
- role_alias: z.string().min(1).optional(),
119
- capabilities: z.array(z.string()),
120
- });
121
-
122
- /**
123
- * ADR-014 ownership scope for agent coordination.
124
- */
125
- export const DelegationOwnershipScopeSchema = z.object({
126
- initiative_id: z.string().min(1).optional(),
127
- wu_ids: z.array(z.string().min(1)).optional(),
128
- lane: z.string().min(1).optional(),
129
- responsibility_kinds: z.array(z.string().min(1)),
130
- });
131
-
132
- /**
133
- * Delegation event base schema (shared by v1-compat and v2).
134
- */
135
- const DelegationEventBaseSchema = z.object({
136
- id: z.string().regex(DELEGATION_PATTERNS.DELEGATION_ID, {
137
- message: ERROR_MESSAGES.DELEGATION_ID,
138
- }),
139
- parentWuId: z.string().regex(DELEGATION_PATTERNS.WU_ID, { message: ERROR_MESSAGES.WU_ID }),
140
- targetWuId: z.string().regex(DELEGATION_PATTERNS.WU_ID, { message: ERROR_MESSAGES.WU_ID }),
141
- lane: z.string().min(1, { message: ERROR_MESSAGES.LANE_REQUIRED }),
142
- intent: z.enum(DELEGATION_INTENTS, { error: ERROR_MESSAGES.INTENT }).optional(),
143
- delegatedAt: z.string().datetime({ message: ERROR_MESSAGES.TIMESTAMP_REQUIRED }),
144
- status: z.enum(DELEGATION_STATUSES, { error: ERROR_MESSAGES.STATUS }),
145
- completedAt: z.string().datetime().nullable(),
146
- pickedUpAt: z.string().datetime().optional(),
147
- pickedUpBy: z.string().min(1, { message: ERROR_MESSAGES.PICKUP_BY_REQUIRED }).optional(),
148
- briefAttestation: DelegationBriefAttestationSchema.optional(),
149
- });
150
-
151
- /**
152
- * Legacy v1-compat delegation event schema.
153
- */
154
- const DelegationEventV1Schema = DelegationEventBaseSchema.extend({
155
- schemaVersion: z.undefined().optional(),
156
- requested_role: DelegationRoleDescriptorSchema.optional(),
157
- actual_role: DelegationRoleDescriptorSchema.optional(),
158
- capabilities: z.array(z.string()).optional(),
159
- ownership_scope: DelegationOwnershipScopeSchema.optional(),
160
- });
161
-
162
- /**
163
- * v2 delegation event schema (WU-2753, ADR-014 extension 1).
164
- */
165
- const DelegationEventV2Schema = DelegationEventBaseSchema.extend({
166
- schemaVersion: z.literal(DELEGATION_SCHEMA_VERSION_V2),
167
- requested_role: DelegationRoleDescriptorSchema,
168
- actual_role: DelegationRoleDescriptorSchema,
169
- capabilities: z.array(z.string()),
170
- ownership_scope: DelegationOwnershipScopeSchema,
171
- });
172
-
173
- /**
174
- * Delegation event schema — discriminated union across v1-compat and v2.
175
- */
176
- export const DelegationEventSchema = z.union([DelegationEventV2Schema, DelegationEventV1Schema]);
177
-
178
- /** TypeScript type inferred from schema */
179
- export type DelegationEvent = z.infer<typeof DelegationEventSchema>;
180
- export type DelegationEventV1 = z.infer<typeof DelegationEventV1Schema>;
181
- export type DelegationEventV2 = z.infer<typeof DelegationEventV2Schema>;
182
- export type DelegationBriefAttestation = z.infer<typeof DelegationBriefAttestationSchema>;
183
- export type DelegationRoleDescriptor = z.infer<typeof DelegationRoleDescriptorSchema>;
184
- export type DelegationOwnershipScope = z.infer<typeof DelegationOwnershipScopeSchema>;
185
-
186
- /**
187
- * Bundle of the four ADR-014 axes that launch receipts and wu:delegate emit
188
- * on every new delegation (WU-2753).
189
- */
190
- export interface DelegationRoleContract {
191
- requested_role: DelegationRoleDescriptor;
192
- actual_role: DelegationRoleDescriptor;
193
- capabilities: string[];
194
- ownership_scope: DelegationOwnershipScope;
195
- }
196
-
197
- /**
198
- * Validates delegation event data against schema.
199
- */
200
- export function validateDelegationEvent(data: unknown) {
201
- return DelegationEventSchema.safeParse(data);
202
- }
203
-
204
- /**
205
- * Returns true if the delegation event carries the v2 role contract.
206
- */
207
- export function isV2DelegationEvent(event: DelegationEvent): event is DelegationEventV2 {
208
- return event.schemaVersion === DELEGATION_SCHEMA_VERSION_V2;
209
- }
210
-
211
- /**
212
- * Generates a unique delegation ID.
213
- */
214
- export function generateDelegationId(parentWuId: string, targetWuId: string): string {
215
- const timestamp = Date.now().toString();
216
- const randomBytes = crypto.randomBytes(4).toString('hex');
217
- const input = `${parentWuId}:${targetWuId}:${timestamp}:${randomBytes}`;
218
- const hash = crypto.createHash('sha256').update(input).digest('hex');
219
- return `dlg-${hash.slice(0, 4)}`;
220
- }
@@ -1,269 +0,0 @@
1
- // Copyright (c) 2026 Hellmai Ltd
2
- // SPDX-License-Identifier: LicenseRef-LumenFlow-Proprietary
3
-
4
- /**
5
- * Delegation Registry Store (ADR-014 follow-up, WU-2763)
6
- *
7
- * Event-sourced state store for tracking sub-agent delegations.
8
- * Stores events in .lumenflow/state/delegation-registry.jsonl (append-only, git-friendly).
9
- *
10
- * Core now re-exports this module as a compatibility shim.
11
- */
12
-
13
- import fs from 'node:fs/promises';
14
- import path from 'node:path';
15
- import { createError, ErrorCodes } from '@lumenflow/kernel/primitives/error-handler';
16
- import {
17
- validateDelegationEvent,
18
- generateDelegationId,
19
- DelegationStatus,
20
- DELEGATION_SCHEMA_VERSION_V2,
21
- type DelegationEvent,
22
- type DelegationBriefAttestation,
23
- type DelegationIntentValue,
24
- type DelegationRoleContract,
25
- } from './delegation-registry-schema.js';
26
-
27
- interface ValidationIssueLike {
28
- path: PropertyKey[];
29
- message: string;
30
- }
31
-
32
- /** Delegation registry file name constant */
33
- export const DELEGATION_REGISTRY_FILE_NAME = 'delegation-registry.jsonl';
34
-
35
- function formatValidationIssues(issues: readonly ValidationIssueLike[]): string {
36
- return issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`).join(', ');
37
- }
38
-
39
- /**
40
- * Delegation Registry Store class
41
- */
42
- export class DelegationRegistryStore {
43
- private readonly baseDir: string;
44
- private readonly registryFilePath: string;
45
- private readonly delegations: Map<string, DelegationEvent>;
46
- private readonly byParent: Map<string, string[]>;
47
- private readonly byTarget: Map<string, string>;
48
-
49
- /**
50
- * @param {string} baseDir - Directory containing .lumenflow/state/
51
- */
52
- constructor(baseDir: string) {
53
- this.baseDir = baseDir;
54
- this.registryFilePath = path.join(baseDir, DELEGATION_REGISTRY_FILE_NAME);
55
- this.delegations = new Map();
56
- this.byParent = new Map();
57
- this.byTarget = new Map();
58
- }
59
-
60
- /**
61
- * Loads and replays events from JSONL file into current state.
62
- */
63
- async load(): Promise<void> {
64
- this.delegations.clear();
65
- this.byParent.clear();
66
- this.byTarget.clear();
67
-
68
- let content: string;
69
- try {
70
- content = await fs.readFile(this.registryFilePath, 'utf-8');
71
- } catch (error) {
72
- if ((error as NodeJS.ErrnoException).code === 'ENOENT') {
73
- return;
74
- }
75
- throw error;
76
- }
77
-
78
- const lines = content.split('\n');
79
- for (let i = 0; i < lines.length; i++) {
80
- const rawLine = lines[i];
81
- if (typeof rawLine !== 'string') {
82
- continue;
83
- }
84
- const line = rawLine.trim();
85
- if (!line) {
86
- continue;
87
- }
88
-
89
- let parsed;
90
- try {
91
- parsed = JSON.parse(line);
92
- } catch (error) {
93
- throw createError(
94
- ErrorCodes.PARSE_ERROR,
95
- `Malformed JSON on line ${i + 1}: ${error.message}`,
96
- );
97
- }
98
-
99
- const validation = validateDelegationEvent(parsed);
100
- if (!validation.success) {
101
- throw createError(
102
- ErrorCodes.VALIDATION_ERROR,
103
- `Validation error on line ${i + 1}: ${formatValidationIssues(validation.error.issues)}`,
104
- );
105
- }
106
-
107
- this.applyEvent(validation.data);
108
- }
109
- }
110
-
111
- /**
112
- * Applies an event to the in-memory state.
113
- */
114
- private applyEvent(event: DelegationEvent): void {
115
- const { id, parentWuId, targetWuId } = event;
116
- this.delegations.set(id, event);
117
-
118
- if (!this.byParent.has(parentWuId)) {
119
- this.byParent.set(parentWuId, []);
120
- }
121
- const parentDelegations = this.byParent.get(parentWuId);
122
- if (!parentDelegations) {
123
- return;
124
- }
125
- if (!parentDelegations.includes(id)) {
126
- parentDelegations.push(id);
127
- }
128
-
129
- this.byTarget.set(targetWuId, id);
130
- }
131
-
132
- /**
133
- * Appends an event to the registry file.
134
- */
135
- private async appendEvent(event: DelegationEvent): Promise<void> {
136
- const validation = validateDelegationEvent(event);
137
- if (!validation.success) {
138
- throw createError(
139
- ErrorCodes.VALIDATION_ERROR,
140
- `Validation error: ${formatValidationIssues(validation.error.issues)}`,
141
- );
142
- }
143
-
144
- await fs.mkdir(this.baseDir, { recursive: true });
145
- await fs.appendFile(this.registryFilePath, JSON.stringify(event) + '\n', 'utf-8');
146
- }
147
-
148
- /**
149
- * Records a new delegation event with pending status.
150
- */
151
- async record(
152
- parentWuId: string,
153
- targetWuId: string,
154
- lane: string,
155
- intent?: DelegationIntentValue,
156
- briefAttestation?: DelegationBriefAttestation,
157
- delegationId?: string,
158
- roleContract?: DelegationRoleContract,
159
- ): Promise<string> {
160
- const id = delegationId ?? generateDelegationId(parentWuId, targetWuId);
161
-
162
- const event: DelegationEvent = {
163
- id,
164
- parentWuId,
165
- targetWuId,
166
- lane,
167
- ...(intent ? { intent } : {}),
168
- delegatedAt: new Date().toISOString(),
169
- status: DelegationStatus.PENDING,
170
- completedAt: null,
171
- ...(briefAttestation ? { briefAttestation } : {}),
172
- ...(roleContract
173
- ? {
174
- schemaVersion: DELEGATION_SCHEMA_VERSION_V2,
175
- requested_role: roleContract.requested_role,
176
- actual_role: roleContract.actual_role,
177
- capabilities: roleContract.capabilities,
178
- ownership_scope: roleContract.ownership_scope,
179
- }
180
- : {}),
181
- } as DelegationEvent;
182
-
183
- await this.appendEvent(event);
184
- this.applyEvent(event);
185
- return id;
186
- }
187
-
188
- /**
189
- * Updates the status of a delegation.
190
- */
191
- async updateStatus(delegationId: string, status: string): Promise<void> {
192
- const existing = this.delegations.get(delegationId);
193
- if (!existing) {
194
- throw createError(ErrorCodes.DELEGATION_NOT_FOUND, `Delegation ID ${delegationId} not found`);
195
- }
196
-
197
- const event: DelegationEvent = {
198
- ...existing,
199
- status: status as DelegationEvent['status'],
200
- completedAt: new Date().toISOString(),
201
- };
202
-
203
- await this.appendEvent(event);
204
- this.applyEvent(event);
205
- }
206
-
207
- /**
208
- * Records claim-time pickup evidence for a delegation entry.
209
- */
210
- async recordPickup(delegationId: string, pickedUpBy: string, pickedUpAt?: string): Promise<void> {
211
- const existing = this.delegations.get(delegationId);
212
- if (!existing) {
213
- throw createError(ErrorCodes.DELEGATION_NOT_FOUND, `Delegation ID ${delegationId} not found`);
214
- }
215
-
216
- const event: DelegationEvent = {
217
- ...existing,
218
- pickedUpBy,
219
- pickedUpAt: pickedUpAt ?? new Date().toISOString(),
220
- };
221
-
222
- await this.appendEvent(event);
223
- this.applyEvent(event);
224
- }
225
-
226
- /**
227
- * Gets all delegations for a parent WU.
228
- */
229
- getByParent(parentWuId: string): DelegationEvent[] {
230
- const delegationIds = this.byParent.get(parentWuId) ?? [];
231
- return delegationIds
232
- .map((id) => this.delegations.get(id))
233
- .filter((event): event is DelegationEvent => event !== undefined);
234
- }
235
-
236
- /**
237
- * Gets delegation for a target WU.
238
- */
239
- getByTarget(targetWuId: string): DelegationEvent | null {
240
- const delegationId = this.byTarget.get(targetWuId);
241
- if (!delegationId) {
242
- return null;
243
- }
244
- return this.delegations.get(delegationId) ?? null;
245
- }
246
-
247
- /**
248
- * Gets all pending delegations.
249
- */
250
- getPendingDelegations(): DelegationEvent[] {
251
- return Array.from(this.delegations.values()).filter(
252
- (delegation) => delegation.status === DelegationStatus.PENDING,
253
- );
254
- }
255
-
256
- /**
257
- * Gets all delegations as an array.
258
- */
259
- getAllDelegations(): DelegationEvent[] {
260
- return Array.from(this.delegations.values());
261
- }
262
-
263
- /**
264
- * Gets delegation by ID.
265
- */
266
- getById(delegationId: string): DelegationEvent | null {
267
- return this.delegations.get(delegationId) ?? null;
268
- }
269
- }