@cleocode/core 2026.3.43 → 2026.3.44

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 (161) hide show
  1. package/dist/admin/export-tasks.d.ts.map +1 -1
  2. package/dist/agents/agent-schema.d.ts +358 -0
  3. package/dist/agents/agent-schema.d.ts.map +1 -0
  4. package/dist/agents/capacity.d.ts +57 -0
  5. package/dist/agents/capacity.d.ts.map +1 -0
  6. package/dist/agents/index.d.ts +17 -0
  7. package/dist/agents/index.d.ts.map +1 -0
  8. package/dist/agents/registry.d.ts +115 -0
  9. package/dist/agents/registry.d.ts.map +1 -0
  10. package/dist/agents/retry.d.ts +83 -0
  11. package/dist/agents/retry.d.ts.map +1 -0
  12. package/dist/hooks/index.d.ts +4 -1
  13. package/dist/hooks/index.d.ts.map +1 -1
  14. package/dist/hooks/payload-schemas.d.ts +214 -0
  15. package/dist/hooks/payload-schemas.d.ts.map +1 -0
  16. package/dist/index.d.ts +3 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +16443 -2160
  19. package/dist/index.js.map +4 -4
  20. package/dist/inject/index.d.ts.map +1 -1
  21. package/dist/intelligence/impact.d.ts +51 -0
  22. package/dist/intelligence/impact.d.ts.map +1 -0
  23. package/dist/intelligence/index.d.ts +15 -0
  24. package/dist/intelligence/index.d.ts.map +1 -0
  25. package/dist/intelligence/patterns.d.ts +66 -0
  26. package/dist/intelligence/patterns.d.ts.map +1 -0
  27. package/dist/intelligence/prediction.d.ts +51 -0
  28. package/dist/intelligence/prediction.d.ts.map +1 -0
  29. package/dist/intelligence/types.d.ts +221 -0
  30. package/dist/intelligence/types.d.ts.map +1 -0
  31. package/dist/internal.d.ts +9 -0
  32. package/dist/internal.d.ts.map +1 -1
  33. package/dist/issue/template-parser.d.ts +8 -2
  34. package/dist/issue/template-parser.d.ts.map +1 -1
  35. package/dist/lifecycle/pipeline.d.ts +2 -2
  36. package/dist/lifecycle/pipeline.d.ts.map +1 -1
  37. package/dist/lifecycle/state-machine.d.ts +1 -1
  38. package/dist/lifecycle/state-machine.d.ts.map +1 -1
  39. package/dist/memory/brain-lifecycle.d.ts.map +1 -1
  40. package/dist/memory/brain-retrieval.d.ts.map +1 -1
  41. package/dist/memory/brain-row-types.d.ts +40 -6
  42. package/dist/memory/brain-row-types.d.ts.map +1 -1
  43. package/dist/memory/brain-search.d.ts.map +1 -1
  44. package/dist/memory/brain-similarity.d.ts.map +1 -1
  45. package/dist/memory/claude-mem-migration.d.ts.map +1 -1
  46. package/dist/nexus/discover.d.ts.map +1 -1
  47. package/dist/orchestration/bootstrap.d.ts.map +1 -1
  48. package/dist/orchestration/skill-ops.d.ts +4 -4
  49. package/dist/orchestration/skill-ops.d.ts.map +1 -1
  50. package/dist/otel/index.d.ts +1 -1
  51. package/dist/otel/index.d.ts.map +1 -1
  52. package/dist/sessions/briefing.d.ts.map +1 -1
  53. package/dist/sessions/handoff.d.ts.map +1 -1
  54. package/dist/sessions/index.d.ts +1 -1
  55. package/dist/sessions/index.d.ts.map +1 -1
  56. package/dist/sessions/types.d.ts +8 -42
  57. package/dist/sessions/types.d.ts.map +1 -1
  58. package/dist/signaldock/signaldock-transport.d.ts +1 -1
  59. package/dist/signaldock/signaldock-transport.d.ts.map +1 -1
  60. package/dist/skills/injection/subagent.d.ts +3 -3
  61. package/dist/skills/injection/subagent.d.ts.map +1 -1
  62. package/dist/skills/manifests/contribution.d.ts +2 -2
  63. package/dist/skills/manifests/contribution.d.ts.map +1 -1
  64. package/dist/skills/orchestrator/spawn.d.ts +6 -6
  65. package/dist/skills/orchestrator/spawn.d.ts.map +1 -1
  66. package/dist/skills/orchestrator/startup.d.ts +1 -1
  67. package/dist/skills/orchestrator/startup.d.ts.map +1 -1
  68. package/dist/skills/orchestrator/validator.d.ts +2 -2
  69. package/dist/skills/orchestrator/validator.d.ts.map +1 -1
  70. package/dist/skills/precedence-types.d.ts +24 -1
  71. package/dist/skills/precedence-types.d.ts.map +1 -1
  72. package/dist/skills/types.d.ts +70 -4
  73. package/dist/skills/types.d.ts.map +1 -1
  74. package/dist/store/export.d.ts +5 -4
  75. package/dist/store/export.d.ts.map +1 -1
  76. package/dist/store/tasks-schema.d.ts +12 -2
  77. package/dist/store/tasks-schema.d.ts.map +1 -1
  78. package/dist/store/typed-query.d.ts +12 -0
  79. package/dist/store/typed-query.d.ts.map +1 -0
  80. package/dist/store/validation-schemas.d.ts +2422 -50
  81. package/dist/store/validation-schemas.d.ts.map +1 -1
  82. package/dist/system/inject-generate.d.ts.map +1 -1
  83. package/dist/validation/doctor/checks.d.ts +5 -0
  84. package/dist/validation/doctor/checks.d.ts.map +1 -1
  85. package/dist/validation/engine.d.ts +10 -10
  86. package/dist/validation/engine.d.ts.map +1 -1
  87. package/dist/validation/index.d.ts +6 -2
  88. package/dist/validation/index.d.ts.map +1 -1
  89. package/dist/validation/protocol-common.d.ts +10 -2
  90. package/dist/validation/protocol-common.d.ts.map +1 -1
  91. package/migrations/drizzle-tasks/20260320013731_wave0-schema-hardening/migration.sql +84 -0
  92. package/migrations/drizzle-tasks/20260320013731_wave0-schema-hardening/snapshot.json +4060 -0
  93. package/migrations/drizzle-tasks/20260320020000_agent-dimension/migration.sql +35 -0
  94. package/migrations/drizzle-tasks/20260320020000_agent-dimension/snapshot.json +4312 -0
  95. package/package.json +2 -2
  96. package/src/admin/export-tasks.ts +2 -5
  97. package/src/agents/__tests__/capacity.test.ts +219 -0
  98. package/src/agents/__tests__/registry.test.ts +457 -0
  99. package/src/agents/__tests__/retry.test.ts +289 -0
  100. package/src/agents/agent-schema.ts +107 -0
  101. package/src/agents/capacity.ts +151 -0
  102. package/src/agents/index.ts +68 -0
  103. package/src/agents/registry.ts +449 -0
  104. package/src/agents/retry.ts +255 -0
  105. package/src/hooks/index.ts +20 -1
  106. package/src/hooks/payload-schemas.ts +199 -0
  107. package/src/index.ts +69 -0
  108. package/src/inject/index.ts +14 -14
  109. package/src/intelligence/__tests__/impact.test.ts +453 -0
  110. package/src/intelligence/__tests__/patterns.test.ts +450 -0
  111. package/src/intelligence/__tests__/prediction.test.ts +418 -0
  112. package/src/intelligence/impact.ts +638 -0
  113. package/src/intelligence/index.ts +47 -0
  114. package/src/intelligence/patterns.ts +621 -0
  115. package/src/intelligence/prediction.ts +621 -0
  116. package/src/intelligence/types.ts +273 -0
  117. package/src/internal.ts +82 -1
  118. package/src/issue/template-parser.ts +65 -4
  119. package/src/lifecycle/pipeline.ts +14 -7
  120. package/src/lifecycle/state-machine.ts +6 -2
  121. package/src/memory/brain-lifecycle.ts +5 -11
  122. package/src/memory/brain-retrieval.ts +44 -38
  123. package/src/memory/brain-row-types.ts +43 -6
  124. package/src/memory/brain-search.ts +53 -32
  125. package/src/memory/brain-similarity.ts +9 -8
  126. package/src/memory/claude-mem-migration.ts +4 -3
  127. package/src/nexus/__tests__/nexus-e2e.test.ts +1481 -0
  128. package/src/nexus/discover.ts +1 -0
  129. package/src/orchestration/bootstrap.ts +11 -17
  130. package/src/orchestration/skill-ops.ts +52 -32
  131. package/src/otel/index.ts +48 -4
  132. package/src/sessions/__tests__/briefing.test.ts +31 -2
  133. package/src/sessions/briefing.ts +27 -42
  134. package/src/sessions/handoff.ts +52 -86
  135. package/src/sessions/index.ts +5 -1
  136. package/src/sessions/types.ts +9 -43
  137. package/src/signaldock/signaldock-transport.ts +5 -2
  138. package/src/skills/injection/subagent.ts +10 -16
  139. package/src/skills/manifests/contribution.ts +5 -13
  140. package/src/skills/orchestrator/__tests__/spawn-tier.test.ts +44 -30
  141. package/src/skills/orchestrator/spawn.ts +18 -31
  142. package/src/skills/orchestrator/startup.ts +78 -65
  143. package/src/skills/orchestrator/validator.ts +26 -31
  144. package/src/skills/precedence-types.ts +24 -1
  145. package/src/skills/types.ts +72 -5
  146. package/src/store/__tests__/test-db-helper.d.ts +4 -4
  147. package/src/store/__tests__/test-db-helper.js +5 -16
  148. package/src/store/__tests__/test-db-helper.ts +5 -18
  149. package/src/store/chain-schema.ts +1 -1
  150. package/src/store/export.ts +22 -12
  151. package/src/store/tasks-schema.ts +65 -8
  152. package/src/store/typed-query.ts +17 -0
  153. package/src/store/validation-schemas.ts +347 -23
  154. package/src/system/inject-generate.ts +9 -23
  155. package/src/validation/doctor/checks.ts +24 -2
  156. package/src/validation/engine.ts +11 -11
  157. package/src/validation/index.ts +131 -3
  158. package/src/validation/protocol-common.ts +54 -3
  159. package/dist/tasks/reparent.d.ts +0 -38
  160. package/dist/tasks/reparent.d.ts.map +0 -1
  161. package/src/tasks/reparent.ts +0 -134
@@ -2,11 +2,30 @@
2
2
  * Hooks System - Barrel Export
3
3
  *
4
4
  * Central export point for the CLEO hooks system.
5
- * Import from here to access the hook registry, types, and handlers.
5
+ * Import from here to access the hook registry, types, handlers, and
6
+ * Zod payload validation schemas.
6
7
  *
7
8
  * @module @cleocode/cleo/hooks
8
9
  */
9
10
 
10
11
  export * from './handlers/index.js';
12
+ export type { PayloadValidationResult } from './payload-schemas.js';
13
+ export {
14
+ HookPayloadSchema,
15
+ OnAgentCompletePayloadSchema,
16
+ OnAgentSpawnPayloadSchema,
17
+ OnCascadeStartPayloadSchema,
18
+ OnErrorPayloadSchema,
19
+ OnFileChangePayloadSchema,
20
+ OnPatrolPayloadSchema,
21
+ OnPromptSubmitPayloadSchema,
22
+ OnResponseCompletePayloadSchema,
23
+ OnSessionEndPayloadSchema,
24
+ OnSessionStartPayloadSchema,
25
+ OnToolCompletePayloadSchema,
26
+ OnToolStartPayloadSchema,
27
+ OnWorkAvailablePayloadSchema,
28
+ validatePayload,
29
+ } from './payload-schemas.js';
11
30
  export { HookRegistry, hooks } from './registry.js';
12
31
  export type * from './types.js';
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Zod validation schemas for hook event payloads.
3
+ *
4
+ * Provides runtime validation for all hook payload types defined in
5
+ * ./types.ts. Each schema mirrors its corresponding TypeScript interface
6
+ * and can be used to validate payloads at dispatch time.
7
+ *
8
+ * @module @cleocode/cleo/hooks/payload-schemas
9
+ */
10
+
11
+ import { z } from 'zod/v4';
12
+ import type { HookEvent } from './types.js';
13
+
14
+ // ============================================================================
15
+ // Base Payload Schema
16
+ // ============================================================================
17
+
18
+ /** Zod schema for {@link HookPayload}. */
19
+ export const HookPayloadSchema = z.object({
20
+ timestamp: z.iso.datetime(),
21
+ sessionId: z.string().optional(),
22
+ taskId: z.string().optional(),
23
+ providerId: z.string().optional(),
24
+ metadata: z.record(z.string(), z.unknown()).optional(),
25
+ });
26
+
27
+ // ============================================================================
28
+ // CAAMP-mapped Event Payload Schemas
29
+ // ============================================================================
30
+
31
+ /** Zod schema for {@link OnSessionStartPayload}. */
32
+ export const OnSessionStartPayloadSchema = HookPayloadSchema.extend({
33
+ sessionId: z.string(),
34
+ name: z.string(),
35
+ scope: z.string(),
36
+ agent: z.string().optional(),
37
+ });
38
+
39
+ /** Zod schema for {@link OnSessionEndPayload}. */
40
+ export const OnSessionEndPayloadSchema = HookPayloadSchema.extend({
41
+ sessionId: z.string(),
42
+ duration: z.number(),
43
+ tasksCompleted: z.array(z.string()),
44
+ });
45
+
46
+ /** Zod schema for {@link OnToolStartPayload}. */
47
+ export const OnToolStartPayloadSchema = HookPayloadSchema.extend({
48
+ taskId: z.string(),
49
+ taskTitle: z.string(),
50
+ previousTask: z.string().optional(),
51
+ });
52
+
53
+ /** Zod schema for {@link OnToolCompletePayload}. */
54
+ export const OnToolCompletePayloadSchema = HookPayloadSchema.extend({
55
+ taskId: z.string(),
56
+ taskTitle: z.string(),
57
+ status: z.enum(['done', 'archived', 'cancelled']),
58
+ });
59
+
60
+ /** Zod schema for {@link OnFileChangePayload}. */
61
+ export const OnFileChangePayloadSchema = HookPayloadSchema.extend({
62
+ filePath: z.string(),
63
+ changeType: z.enum(['write', 'create', 'delete']),
64
+ sizeBytes: z.number().optional(),
65
+ });
66
+
67
+ /** Zod schema for {@link OnErrorPayload}. */
68
+ export const OnErrorPayloadSchema = HookPayloadSchema.extend({
69
+ errorCode: z.union([z.number(), z.string()]),
70
+ message: z.string(),
71
+ domain: z.string().optional(),
72
+ operation: z.string().optional(),
73
+ gateway: z.string().optional(),
74
+ stack: z.string().optional(),
75
+ });
76
+
77
+ /** Zod schema for {@link OnPromptSubmitPayload}. */
78
+ export const OnPromptSubmitPayloadSchema = HookPayloadSchema.extend({
79
+ gateway: z.string(),
80
+ domain: z.string(),
81
+ operation: z.string(),
82
+ source: z.string().optional(),
83
+ });
84
+
85
+ /** Zod schema for {@link OnResponseCompletePayload}. */
86
+ export const OnResponseCompletePayloadSchema = HookPayloadSchema.extend({
87
+ gateway: z.string(),
88
+ domain: z.string(),
89
+ operation: z.string(),
90
+ success: z.boolean(),
91
+ durationMs: z.number().optional(),
92
+ errorCode: z.string().optional(),
93
+ });
94
+
95
+ // ============================================================================
96
+ // CLEO Internal Event Payload Schemas
97
+ // ============================================================================
98
+
99
+ /** Zod schema for {@link OnWorkAvailablePayload}. */
100
+ export const OnWorkAvailablePayloadSchema = HookPayloadSchema.extend({
101
+ taskIds: z.array(z.string()),
102
+ epicId: z.string().optional(),
103
+ chainId: z.string().optional(),
104
+ reason: z.enum(['dependency-cleared', 'new-task', 'retry', 'manual', 'patrol']).optional(),
105
+ });
106
+
107
+ /** Zod schema for {@link OnAgentSpawnPayload}. */
108
+ export const OnAgentSpawnPayloadSchema = HookPayloadSchema.extend({
109
+ agentId: z.string(),
110
+ role: z.string(),
111
+ adapterId: z.string().optional(),
112
+ taskId: z.string().optional(),
113
+ });
114
+
115
+ /** Zod schema for {@link OnAgentCompletePayload}. */
116
+ export const OnAgentCompletePayloadSchema = HookPayloadSchema.extend({
117
+ agentId: z.string(),
118
+ role: z.string(),
119
+ status: z.enum(['complete', 'partial', 'blocked', 'failed']),
120
+ taskId: z.string().optional(),
121
+ summary: z.string().optional(),
122
+ });
123
+
124
+ /** Zod schema for {@link OnCascadeStartPayload}. */
125
+ export const OnCascadeStartPayloadSchema = HookPayloadSchema.extend({
126
+ cascadeId: z.string(),
127
+ chainId: z.string().optional(),
128
+ tesseraId: z.string().optional(),
129
+ taskIds: z.array(z.string()).optional(),
130
+ });
131
+
132
+ /** Zod schema for {@link OnPatrolPayload}. */
133
+ export const OnPatrolPayloadSchema = HookPayloadSchema.extend({
134
+ watcherId: z.string(),
135
+ patrolType: z.enum(['health', 'sweep', 'refinery', 'watcher', 'custom']),
136
+ scope: z.string().optional(),
137
+ });
138
+
139
+ // ============================================================================
140
+ // Event -> Schema Mapping
141
+ // ============================================================================
142
+
143
+ /**
144
+ * Map from hook event name to its corresponding Zod schema.
145
+ *
146
+ * Used by {@link validatePayload} for runtime dispatch. Events not in
147
+ * this map fall back to the base {@link HookPayloadSchema}.
148
+ */
149
+ const EVENT_SCHEMA_MAP: Partial<Record<HookEvent, z.ZodType>> = {
150
+ onSessionStart: OnSessionStartPayloadSchema,
151
+ onSessionEnd: OnSessionEndPayloadSchema,
152
+ onToolStart: OnToolStartPayloadSchema,
153
+ onToolComplete: OnToolCompletePayloadSchema,
154
+ onFileChange: OnFileChangePayloadSchema,
155
+ onError: OnErrorPayloadSchema,
156
+ onPromptSubmit: OnPromptSubmitPayloadSchema,
157
+ onResponseComplete: OnResponseCompletePayloadSchema,
158
+ onWorkAvailable: OnWorkAvailablePayloadSchema,
159
+ onAgentSpawn: OnAgentSpawnPayloadSchema,
160
+ onAgentComplete: OnAgentCompletePayloadSchema,
161
+ onCascadeStart: OnCascadeStartPayloadSchema,
162
+ onPatrol: OnPatrolPayloadSchema,
163
+ };
164
+
165
+ // ============================================================================
166
+ // Validator Function
167
+ // ============================================================================
168
+
169
+ /** Result of payload validation. */
170
+ export interface PayloadValidationResult {
171
+ /** Whether the payload passed validation. */
172
+ valid: boolean;
173
+ /** Validation errors (empty when valid). */
174
+ errors: string[];
175
+ }
176
+
177
+ /**
178
+ * Validate a hook payload against its event-specific Zod schema.
179
+ *
180
+ * Falls back to the base {@link HookPayloadSchema} for events without
181
+ * a dedicated schema. Returns a result object rather than throwing,
182
+ * so callers can decide how to handle validation failures.
183
+ *
184
+ * @param event - The hook event name
185
+ * @param payload - The payload to validate
186
+ * @returns Validation result with any error messages
187
+ */
188
+ export function validatePayload(event: HookEvent, payload: unknown): PayloadValidationResult {
189
+ const schema = EVENT_SCHEMA_MAP[event] ?? HookPayloadSchema;
190
+ const result = schema.safeParse(payload);
191
+
192
+ if (result.success) {
193
+ return { valid: true, errors: [] };
194
+ }
195
+
196
+ const errors = result.error.issues.map((issue) => `${issue.path.join('.')}: ${issue.message}`);
197
+
198
+ return { valid: false, errors };
199
+ }
package/src/index.ts CHANGED
@@ -31,12 +31,14 @@ export * from '@cleocode/contracts';
31
31
  export * as adapters from './adapters/index.js';
32
32
  export * as admin from './admin/index.js';
33
33
  export * as adrs from './adrs/index.js';
34
+ export * as agents from './agents/index.js';
34
35
  export * as caamp from './caamp/index.js';
35
36
  export * as codebaseMap from './codebase-map/index.js';
36
37
  export * as compliance from './compliance/index.js';
37
38
  export * as context from './context/index.js';
38
39
  export * as coreHooks from './hooks/index.js';
39
40
  export * as inject from './inject/index.js';
41
+ export * as intelligence from './intelligence/index.js';
40
42
  export * as issue from './issue/index.js';
41
43
  export * as lifecycle from './lifecycle/index.js';
42
44
  export * as coreMcp from './mcp/index.js';
@@ -71,6 +73,73 @@ export * as templates from './templates/index.js';
71
73
  export * as ui from './ui/index.js';
72
74
  export * as validation from './validation/index.js';
73
75
 
76
+ // ---------------------------------------------------------------------------
77
+ // Canonical Zod enum schemas (flat re-exports for Pattern 3 imports)
78
+ // ---------------------------------------------------------------------------
79
+
80
+ export {
81
+ // Governance enums
82
+ adrStatusSchema,
83
+ // Agent enums
84
+ agentInstanceStatusSchema,
85
+ agentTypeSchema,
86
+ brainConfidenceLevelSchema,
87
+ brainDecisionTypeSchema,
88
+ brainEdgeTypeSchema,
89
+ brainImpactLevelSchema,
90
+ brainLinkTypeSchema,
91
+ brainMemoryTypeSchema,
92
+ brainNodeTypeSchema,
93
+ brainObservationSourceTypeSchema,
94
+ // Brain enums
95
+ brainObservationTypeSchema,
96
+ brainOutcomeTypeSchema,
97
+ brainPatternTypeSchema,
98
+ brainStickyColorSchema,
99
+ brainStickyPrioritySchema,
100
+ brainStickyStatusSchema,
101
+ externalLinkTypeSchema,
102
+ gateStatusSchema,
103
+ insertAgentErrorLogSchema,
104
+ // Agent insert/select schemas
105
+ insertAgentInstanceSchema,
106
+ insertExternalTaskLinkSchema,
107
+ insertPipelineManifestSchema,
108
+ insertReleaseManifestSchema,
109
+ insertSessionSchema,
110
+ // Insert/select schemas
111
+ insertTaskSchema,
112
+ lifecycleEvidenceTypeSchema,
113
+ lifecycleGateResultSchema,
114
+ // Lifecycle enums
115
+ lifecyclePipelineStatusSchema,
116
+ lifecycleStageNameSchema,
117
+ lifecycleStageStatusSchema,
118
+ lifecycleTransitionTypeSchema,
119
+ manifestStatusSchema,
120
+ selectAgentErrorLogSchema,
121
+ selectAgentInstanceSchema,
122
+ selectExternalTaskLinkSchema,
123
+ selectPipelineManifestSchema,
124
+ selectReleaseManifestSchema,
125
+ selectSessionSchema,
126
+ selectTaskSchema,
127
+ // Session enums
128
+ sessionStatusSchema,
129
+ syncDirectionSchema,
130
+ taskPrioritySchema,
131
+ // Relation / link enums
132
+ taskRelationTypeSchema,
133
+ taskSizeSchema,
134
+ // Task enums
135
+ taskStatusSchema,
136
+ taskTypeSchema,
137
+ tokenUsageConfidenceSchema,
138
+ // Token usage enums
139
+ tokenUsageMethodSchema,
140
+ tokenUsageTransportSchema,
141
+ } from './store/validation-schemas.js';
142
+
74
143
  // ---------------------------------------------------------------------------
75
144
  // Store layer (bundled inside core)
76
145
  // ---------------------------------------------------------------------------
@@ -13,7 +13,7 @@
13
13
  * @epic T4454
14
14
  */
15
15
 
16
- import type { Task, TaskFile } from '@cleocode/contracts';
16
+ import type { Task, TaskWorkState } from '@cleocode/contracts';
17
17
  import type { DataAccessor } from '../store/data-accessor.js';
18
18
  import { getAccessor } from '../store/data-accessor.js';
19
19
 
@@ -23,23 +23,25 @@ import { getAccessor } from '../store/data-accessor.js';
23
23
  * @task T4539
24
24
  */
25
25
  function selectTasksForInjection(
26
- data: TaskFile,
26
+ allTasks: Task[],
27
27
  opts: {
28
28
  maxTasks?: number;
29
29
  focusedOnly?: boolean;
30
30
  phase?: string;
31
+ focusedTaskId?: string | null;
32
+ currentPhase?: string | null;
31
33
  },
32
34
  ): Task[] {
33
35
  const maxTasks = opts.maxTasks ?? 8;
34
- let tasks = data.tasks.filter((t) => t.status !== 'done');
36
+ let tasks = allTasks.filter((t) => t.status !== 'done');
35
37
 
36
38
  // Filter by focused task
37
- if (opts.focusedOnly && data.focus?.currentTask) {
38
- tasks = tasks.filter((t) => t.id === data.focus!.currentTask);
39
+ if (opts.focusedOnly && opts.focusedTaskId) {
40
+ tasks = tasks.filter((t) => t.id === opts.focusedTaskId);
39
41
  }
40
42
 
41
43
  // Filter by phase
42
- const phase = opts.phase ?? data.project?.currentPhase ?? undefined;
44
+ const phase = opts.phase ?? opts.currentPhase ?? undefined;
43
45
  if (phase) {
44
46
  const phaseTasks = tasks.filter((t) => t.phase === phase);
45
47
  if (phaseTasks.length > 0) tasks = phaseTasks;
@@ -88,15 +90,13 @@ export async function injectTasks(
88
90
  const acc = accessor ?? (await getAccessor(opts.cwd));
89
91
  const { tasks: allTasks } = await acc.queryTasks({});
90
92
  const projectMeta = await acc.getMetaValue<{ currentPhase?: string }>('project');
91
- const focusMeta = await acc.getMetaValue<{ currentTask?: string }>('focus');
93
+ const focusMeta = await acc.getMetaValue<TaskWorkState>('focus_state');
92
94
 
93
- const data: TaskFile = {
94
- tasks: allTasks,
95
- project: projectMeta as TaskFile['project'],
96
- focus: focusMeta as TaskFile['focus'],
97
- } as TaskFile;
98
-
99
- const selectedTasks = selectTasksForInjection(data, opts);
95
+ const selectedTasks = selectTasksForInjection(allTasks, {
96
+ ...opts,
97
+ focusedTaskId: focusMeta?.currentTask ?? null,
98
+ currentPhase: projectMeta?.currentPhase ?? null,
99
+ });
100
100
  const formatted = formatForInjection(selectedTasks);
101
101
 
102
102
  const phase = opts.phase ?? projectMeta?.currentPhase ?? null;