@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.
- package/README.md +54 -52
- package/dist/agent-issues-query.js +10 -2
- package/dist/agent-issues-query.js.map +1 -1
- package/dist/agent-runtime-enrollment-events.js +44 -0
- package/dist/agent-runtime-enrollment-events.js.map +1 -0
- package/dist/agent-session-end.js +47 -0
- package/dist/agent-session-end.js.map +1 -1
- package/dist/agent-session-heartbeat.js +250 -0
- package/dist/agent-session-heartbeat.js.map +1 -0
- package/dist/agent-session.js +299 -5
- package/dist/agent-session.js.map +1 -1
- package/dist/capacity-snapshot-emitter.js +73 -0
- package/dist/capacity-snapshot-emitter.js.map +1 -0
- package/dist/claim-queue.js +276 -0
- package/dist/claim-queue.js.map +1 -0
- package/dist/config-set.js +22 -3
- package/dist/config-set.js.map +1 -1
- package/dist/control-plane-sidecar-runner.js +145 -0
- package/dist/control-plane-sidecar-runner.js.map +1 -0
- package/dist/delegation-list.js +160 -1
- package/dist/delegation-list.js.map +1 -1
- package/dist/delegation-role-resolver.js +69 -0
- package/dist/delegation-role-resolver.js.map +1 -0
- package/dist/docs-generate-pack-reference.js +500 -0
- package/dist/docs-generate-pack-reference.js.map +1 -0
- package/dist/docs-sync.js +116 -1
- package/dist/docs-sync.js.map +1 -1
- package/dist/file-edit.js +28 -8
- package/dist/file-edit.js.map +1 -1
- package/dist/file-write.js +29 -5
- package/dist/file-write.js.map +1 -1
- package/dist/gate-co-change.js +25 -7
- package/dist/gate-co-change.js.map +1 -1
- package/dist/gate-conditional.js +19 -7
- package/dist/gate-conditional.js.map +1 -1
- package/dist/gates-runners.js +42 -33
- package/dist/gates-runners.js.map +1 -1
- package/dist/gates-utils.js +34 -20
- package/dist/gates-utils.js.map +1 -1
- package/dist/gates.js +79 -7
- package/dist/gates.js.map +1 -1
- package/dist/hooks/config-resolver.js +10 -1
- package/dist/hooks/config-resolver.js.map +1 -1
- package/dist/init-package-config.js +1 -1
- package/dist/init-package-config.js.map +1 -1
- package/dist/init-scaffolding.js +5 -1
- package/dist/init-scaffolding.js.map +1 -1
- package/dist/init-templates.js +10 -0
- package/dist/init-templates.js.map +1 -1
- package/dist/init.js +1 -1
- package/dist/init.js.map +1 -1
- package/dist/initiative-create.js +17 -0
- package/dist/initiative-create.js.map +1 -1
- package/dist/initiative-remove-wu.js +17 -3
- package/dist/initiative-remove-wu.js.map +1 -1
- package/dist/kernel-event-sync/emitters.js +104 -0
- package/dist/kernel-event-sync/emitters.js.map +1 -0
- package/dist/kernel-event-sync/index.js +13 -0
- package/dist/kernel-event-sync/index.js.map +1 -0
- package/dist/kernel-event-sync/lifecycle-emitters.js +160 -0
- package/dist/kernel-event-sync/lifecycle-emitters.js.map +1 -0
- package/dist/kernel-event-sync/narrow-emissions.js +89 -0
- package/dist/kernel-event-sync/narrow-emissions.js.map +1 -0
- package/dist/kernel-event-sync/software-delivery-emitters.js +297 -0
- package/dist/kernel-event-sync/software-delivery-emitters.js.map +1 -0
- package/dist/lane-lock.js +14 -1
- package/dist/lane-lock.js.map +1 -1
- package/dist/lane-suggest.js +21 -0
- package/dist/lane-suggest.js.map +1 -1
- package/dist/lumenflow-upgrade.js +7 -5
- package/dist/lumenflow-upgrade.js.map +1 -1
- package/dist/mem-context.js +145 -0
- package/dist/mem-context.js.map +1 -1
- package/dist/mem-create.js +39 -6
- package/dist/mem-create.js.map +1 -1
- package/dist/mem-inbox.js +16 -0
- package/dist/mem-inbox.js.map +1 -1
- package/dist/mem-roster.js +95 -0
- package/dist/mem-roster.js.map +1 -0
- package/dist/mem-signal.js +97 -2
- package/dist/mem-signal.js.map +1 -1
- package/dist/metrics-cli.js +3 -2
- package/dist/metrics-cli.js.map +1 -1
- package/dist/metrics-snapshot.js +271 -13
- package/dist/metrics-snapshot.js.map +1 -1
- package/dist/orchestrate-init-status.js +117 -2
- package/dist/orchestrate-init-status.js.map +1 -1
- package/dist/orchestrate-initiative.js +83 -10
- package/dist/orchestrate-initiative.js.map +1 -1
- package/dist/orchestrate-monitor-quality.js +289 -0
- package/dist/orchestrate-monitor-quality.js.map +1 -0
- package/dist/orchestrate-monitor.js +85 -0
- package/dist/orchestrate-monitor.js.map +1 -1
- package/dist/pack-validate.js +127 -2
- package/dist/pack-validate.js.map +1 -1
- package/dist/plan-create.js +18 -0
- package/dist/plan-create.js.map +1 -1
- package/dist/plan-link.js +13 -0
- package/dist/plan-link.js.map +1 -1
- package/dist/plan-promote.js +14 -0
- package/dist/plan-promote.js.map +1 -1
- package/dist/pre-commit-check.js +4 -3
- package/dist/pre-commit-check.js.map +1 -1
- package/dist/public-manifest.js +17 -3
- package/dist/public-manifest.js.map +1 -1
- package/dist/release.js +10 -10
- package/dist/release.js.map +1 -1
- package/dist/session-cross-link.js +139 -0
- package/dist/session-cross-link.js.map +1 -0
- package/dist/sidecar-manager.js +208 -0
- package/dist/sidecar-manager.js.map +1 -0
- package/dist/state-path-resolvers.js +18 -0
- package/dist/state-path-resolvers.js.map +1 -1
- package/dist/stream-heartbeat.js +151 -0
- package/dist/stream-heartbeat.js.map +1 -0
- package/dist/sync-templates.js +56 -2
- package/dist/sync-templates.js.map +1 -1
- package/dist/wu-block.js +47 -5
- package/dist/wu-block.js.map +1 -1
- package/dist/wu-claim-branch.js +8 -4
- package/dist/wu-claim-branch.js.map +1 -1
- package/dist/wu-claim-state.js +5 -3
- package/dist/wu-claim-state.js.map +1 -1
- package/dist/wu-claim-worktree.js +5 -3
- package/dist/wu-claim-worktree.js.map +1 -1
- package/dist/wu-claim.js +261 -9
- package/dist/wu-claim.js.map +1 -1
- package/dist/wu-done-auto-cleanup.js +3 -2
- package/dist/wu-done-auto-cleanup.js.map +1 -1
- package/dist/wu-done-git-ops.js +12 -8
- package/dist/wu-done-git-ops.js.map +1 -1
- package/dist/wu-done-preflight.js +3 -3
- package/dist/wu-done-preflight.js.map +1 -1
- package/dist/wu-done.js +46 -10
- package/dist/wu-done.js.map +1 -1
- package/dist/wu-lifecycle-sync/gate-scope-resolver.js +16 -0
- package/dist/wu-lifecycle-sync/gate-scope-resolver.js.map +1 -0
- package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js +10 -0
- package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js.map +1 -0
- package/dist/wu-prep.js +363 -22
- package/dist/wu-prep.js.map +1 -1
- package/dist/wu-prune.js +68 -27
- package/dist/wu-prune.js.map +1 -1
- package/dist/wu-release.js +34 -3
- package/dist/wu-release.js.map +1 -1
- package/dist/wu-review.js +167 -0
- package/dist/wu-review.js.map +1 -0
- package/dist/wu-spawn-prompt-builders.js +296 -40
- package/dist/wu-spawn-prompt-builders.js.map +1 -1
- package/dist/wu-spawn-strategy-resolver.js +126 -14
- package/dist/wu-spawn-strategy-resolver.js.map +1 -1
- package/dist/wu-unblock.js +52 -22
- package/dist/wu-unblock.js.map +1 -1
- package/package.json +13 -8
- package/packs/agent-runtime/.turbo/turbo-build.log +1 -1
- package/packs/agent-runtime/.turbo/turbo-test.log +25 -0
- package/packs/agent-runtime/.turbo/turbo-typecheck.log +4 -0
- package/packs/agent-runtime/agent-heartbeat.ts +163 -0
- package/packs/agent-runtime/auto-session-integration.ts +874 -0
- package/packs/agent-runtime/delegation-registry-schema.ts +220 -0
- package/packs/agent-runtime/delegation-registry-store.ts +269 -0
- package/packs/agent-runtime/delegation-tree.ts +328 -0
- package/packs/agent-runtime/index.ts +9 -0
- package/packs/agent-runtime/manifest.ts +103 -19
- package/packs/agent-runtime/manifest.yaml +132 -0
- package/packs/agent-runtime/memory-coordination-contract.ts +86 -0
- package/packs/agent-runtime/memory.d.ts +19 -0
- package/packs/agent-runtime/orchestration.ts +238 -23
- package/packs/agent-runtime/package.json +11 -2
- package/packs/agent-runtime/remote-controls/index.ts +7 -0
- package/packs/agent-runtime/remote-controls/operations.ts +399 -0
- package/packs/agent-runtime/remote-controls/port.ts +48 -0
- package/packs/agent-runtime/remote-controls/state-store.ts +258 -0
- package/packs/agent-runtime/remote-controls/types.ts +105 -0
- package/packs/agent-runtime/session-schema.ts +423 -0
- package/packs/agent-runtime/tool-impl/index.ts +1 -0
- package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +252 -0
- package/packs/agent-runtime/tool-impl/remote-controls.ts +273 -0
- package/packs/agent-runtime/tsconfig.json +1 -1
- package/packs/agent-runtime/turn-lifecycle-events.ts +501 -0
- package/packs/sidekick/.lumenflow/state/conductor/outbox/sidekick-events.jsonl +213 -0
- package/packs/sidekick/.turbo/turbo-build.log +1 -1
- package/packs/sidekick/.turbo/turbo-test.log +25 -0
- package/packs/sidekick/.turbo/turbo-typecheck.log +4 -0
- package/packs/sidekick/channel-ingress.ts +137 -0
- package/packs/sidekick/manifest.ts +74 -0
- package/packs/sidekick/manifest.yaml +88 -0
- package/packs/sidekick/package.json +3 -1
- package/packs/sidekick/sidekick-events.ts +517 -0
- package/packs/sidekick/src/adapters/cloud-queue.ts +101 -0
- package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +378 -0
- package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +224 -0
- package/packs/sidekick/src/domain/channel.types.ts +84 -0
- package/packs/sidekick/src/ports/channel-bridge.port.ts +75 -0
- package/packs/sidekick/src/routines/commit.ts +74 -0
- package/packs/sidekick/tool-impl/channel-tools.ts +47 -0
- package/packs/sidekick/tool-impl/memory-tools.ts +17 -0
- package/packs/sidekick/tool-impl/routine-commit.ts +102 -0
- package/packs/sidekick/tool-impl/routine-tools.ts +67 -7
- package/packs/sidekick/tool-impl/runtime-context.ts +4 -0
- package/packs/sidekick/tool-impl/storage.ts +3 -0
- package/packs/sidekick/tool-impl/system-tools.ts +7 -0
- package/packs/sidekick/tool-impl/task-tools.ts +46 -0
- package/packs/sidekick/tsconfig.json +1 -1
- package/packs/software-delivery/.turbo/turbo-build.log +1 -1
- package/packs/software-delivery/.turbo/turbo-test.log +63 -0
- package/packs/software-delivery/.turbo/turbo-typecheck.log +4 -0
- package/packs/software-delivery/manifest-schema.ts +30 -0
- package/packs/software-delivery/manifest.ts +99 -1
- package/packs/software-delivery/manifest.yaml +46 -0
- package/packs/software-delivery/package.json +88 -3
- package/packs/software-delivery/src/commands/index.ts +5 -0
- package/packs/software-delivery/src/config/delivery-review-contract.ts +20 -0
- package/packs/software-delivery/src/config/env-accessors.ts +19 -0
- package/packs/software-delivery/src/config/index.ts +8 -0
- package/packs/software-delivery/src/config/normalize-config-keys.ts +19 -0
- package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +436 -0
- package/packs/software-delivery/src/config/workspace-reader.ts +310 -0
- package/packs/software-delivery/src/constants/backlog-patterns.ts +31 -0
- package/packs/software-delivery/src/constants/client-ids.ts +19 -0
- package/packs/software-delivery/src/constants/config-contract.ts +7 -0
- package/packs/software-delivery/src/constants/docs-layout-presets.ts +50 -0
- package/packs/software-delivery/src/constants/duration-constants.ts +20 -0
- package/packs/software-delivery/src/constants/gate-constants.ts +32 -0
- package/packs/software-delivery/src/constants/index.ts +29 -0
- package/packs/software-delivery/src/constants/lock-constants.ts +35 -0
- package/packs/software-delivery/src/constants/object-guards.ts +12 -0
- package/packs/software-delivery/src/constants/section-headings.ts +107 -0
- package/packs/software-delivery/src/constants/wu-cli-constants.ts +485 -0
- package/packs/software-delivery/src/constants/wu-domain-constants.ts +466 -0
- package/packs/software-delivery/src/constants/wu-git-constants.ts +7 -0
- package/packs/software-delivery/src/constants/wu-id-format.ts +327 -0
- package/packs/software-delivery/src/constants/wu-paths-constants.ts +358 -0
- package/packs/software-delivery/src/constants/wu-statuses.ts +287 -0
- package/packs/software-delivery/src/constants/wu-type-helpers.ts +67 -0
- package/packs/software-delivery/src/constants/wu-ui-constants.ts +267 -0
- package/packs/software-delivery/src/constants/wu-validation-constants.ts +73 -0
- package/packs/software-delivery/src/domain/index.ts +5 -0
- package/packs/software-delivery/src/domain/orchestration.constants.ts +168 -0
- package/packs/software-delivery/src/domain/orchestration.schemas.ts +239 -0
- package/packs/software-delivery/src/domain/orchestration.types.ts +178 -0
- package/packs/software-delivery/src/methodology/incremental-test.ts +90 -0
- package/packs/software-delivery/src/methodology/index.ts +6 -0
- package/packs/software-delivery/src/methodology/manual-test-validator.ts +292 -0
- package/packs/software-delivery/src/policy/coverage-gate.ts +270 -0
- package/packs/software-delivery/src/policy/gates-agent-mode.ts +223 -0
- package/packs/software-delivery/src/policy/gates-config-internal.ts +121 -0
- package/packs/software-delivery/src/policy/gates-config.ts +293 -0
- package/packs/software-delivery/src/policy/gates-coverage.ts +247 -0
- package/packs/software-delivery/src/policy/gates-presets.ts +134 -0
- package/packs/software-delivery/src/policy/gates-schemas.ts +173 -0
- package/packs/software-delivery/src/policy/index.ts +22 -0
- package/packs/software-delivery/src/policy/package-manager-resolver.ts +319 -0
- package/packs/software-delivery/src/policy/resolve-policy.ts +518 -0
- package/packs/software-delivery/src/ports/config.ports.ts +90 -0
- package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +125 -0
- package/packs/software-delivery/src/ports/index.ts +10 -0
- package/packs/software-delivery/src/ports/sync-validator.ports.ts +59 -0
- package/packs/software-delivery/src/ports/wu-helpers.ports.ts +168 -0
- package/packs/software-delivery/src/ports/wu-state.ports.ts +241 -0
- package/packs/software-delivery/src/primitives/index.ts +5 -0
- package/packs/software-delivery/src/runtime/index.ts +6 -0
- package/packs/software-delivery/src/runtime/work-classifier.ts +561 -0
- package/packs/software-delivery/src/sandbox/index.ts +10 -0
- package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +118 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +88 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +154 -0
- package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +47 -0
- package/packs/software-delivery/src/sandbox/sandbox-profile.ts +153 -0
- package/packs/software-delivery/src/schemas/index.ts +5 -0
- package/packs/software-delivery/src/state/date-utils.ts +158 -0
- package/packs/software-delivery/src/state/index.ts +15 -0
- package/packs/software-delivery/src/state/state-machine.ts +119 -0
- package/packs/software-delivery/src/state/wu-doc-types.ts +51 -0
- package/packs/software-delivery/src/state/wu-paths.ts +381 -0
- package/packs/software-delivery/src/state/wu-schema.ts +1139 -0
- package/packs/software-delivery/src/state/wu-state-schema.ts +255 -0
- package/packs/software-delivery/src/state/wu-yaml.ts +338 -0
- package/packs/software-delivery/src/types.d.ts +16 -0
- package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +18 -0
- package/packs/software-delivery/tsconfig.json +28 -2
- package/templates/core/AGENTS.md.template +76 -17
- package/templates/core/LUMENFLOW.md.template +265 -66
- package/templates/core/_frameworks/lumenflow/wu-sizing-guide.md.template +180 -116
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +26 -8
- package/templates/core/ai/onboarding/existing-project-bootstrap.md.template +171 -0
- package/templates/core/ai/onboarding/first-15-mins.md.template +3 -1
- package/templates/core/ai/onboarding/first-wu-mistakes.md.template +1 -1
- package/templates/core/ai/onboarding/initiative-orchestration.md.template +46 -30
- package/templates/core/ai/onboarding/quick-ref-commands.md.template +36 -33
- package/templates/core/ai/onboarding/release-process.md.template +8 -7
- package/templates/core/ai/onboarding/starting-prompt.md.template +2 -0
- package/templates/core/ai/onboarding/troubleshooting-wu-done.md.template +62 -0
- package/templates/vendors/claude/.claude/CLAUDE.md.template +29 -54
- package/templates/vendors/cursor/.cursor/rules/lumenflow.md.template +24 -52
- 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
|
-
|
|
814
|
-
|
|
815
|
-
{
|
|
816
|
-
|
|
817
|
-
|
|
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
|
|
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
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
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:
|
|
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": "
|
|
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",
|