opencode-hive 0.2.0 → 0.4.4
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/dist/index.js +1 -14
- package/dist/tools/execTools.d.ts +3 -9
- package/dist/tools/execTools.js +9 -12
- package/dist/tools/featureTools.d.ts +4 -34
- package/dist/tools/featureTools.js +5 -34
- package/dist/tools/planTools.d.ts +5 -15
- package/dist/tools/planTools.js +11 -16
- package/dist/tools/taskTools.d.ts +6 -18
- package/dist/tools/taskTools.js +13 -19
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ Plan-first development: Write plan → User reviews → Approve → Execute task
|
|
|
13
13
|
|
|
14
14
|
| Domain | Tools |
|
|
15
15
|
|--------|-------|
|
|
16
|
-
| Feature | hive_feature_create, hive_feature_list, hive_feature_switch, hive_feature_complete
|
|
16
|
+
| Feature | hive_feature_create, hive_feature_list, hive_feature_switch, hive_feature_complete |
|
|
17
17
|
| Plan | hive_plan_write, hive_plan_read, hive_plan_approve |
|
|
18
18
|
| Task | hive_tasks_sync, hive_task_create, hive_task_update |
|
|
19
19
|
| Exec | hive_exec_start, hive_exec_complete, hive_exec_abort |
|
|
@@ -130,19 +130,6 @@ const plugin = async (ctx) => {
|
|
|
130
130
|
return `Feature "${feature}" marked as completed`;
|
|
131
131
|
},
|
|
132
132
|
}),
|
|
133
|
-
hive_status: tool({
|
|
134
|
-
description: 'Get overview of active feature',
|
|
135
|
-
args: { name: tool.schema.string().optional().describe('Feature name (defaults to active)') },
|
|
136
|
-
async execute({ name }) {
|
|
137
|
-
const feature = name || featureService.getActive();
|
|
138
|
-
if (!feature)
|
|
139
|
-
return "Error: No active feature";
|
|
140
|
-
const info = featureService.getInfo(feature);
|
|
141
|
-
if (!info)
|
|
142
|
-
return `Error: Feature "${feature}" not found`;
|
|
143
|
-
return JSON.stringify(info, null, 2);
|
|
144
|
-
},
|
|
145
|
-
}),
|
|
146
133
|
hive_plan_write: tool({
|
|
147
134
|
description: 'Write plan.md (clears existing comments)',
|
|
148
135
|
args: { content: tool.schema.string().describe('Plan markdown content') },
|
|
@@ -4,11 +4,9 @@ export declare function createExecTools(projectRoot: string): {
|
|
|
4
4
|
description: string;
|
|
5
5
|
parameters: z.ZodObject<{
|
|
6
6
|
task: z.ZodString;
|
|
7
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
8
7
|
}, z.core.$strip>;
|
|
9
|
-
execute: ({ task
|
|
8
|
+
execute: ({ task }: {
|
|
10
9
|
task: string;
|
|
11
|
-
featureName?: string;
|
|
12
10
|
}) => Promise<{
|
|
13
11
|
error: string;
|
|
14
12
|
worktreePath?: undefined;
|
|
@@ -27,13 +25,11 @@ export declare function createExecTools(projectRoot: string): {
|
|
|
27
25
|
task: z.ZodString;
|
|
28
26
|
summary: z.ZodString;
|
|
29
27
|
report: z.ZodOptional<z.ZodString>;
|
|
30
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
31
28
|
}, z.core.$strip>;
|
|
32
|
-
execute: ({ task, summary, report
|
|
29
|
+
execute: ({ task, summary, report }: {
|
|
33
30
|
task: string;
|
|
34
31
|
summary: string;
|
|
35
32
|
report?: string;
|
|
36
|
-
featureName?: string;
|
|
37
33
|
}) => Promise<{
|
|
38
34
|
error: string;
|
|
39
35
|
completed?: undefined;
|
|
@@ -52,11 +48,9 @@ export declare function createExecTools(projectRoot: string): {
|
|
|
52
48
|
description: string;
|
|
53
49
|
parameters: z.ZodObject<{
|
|
54
50
|
task: z.ZodString;
|
|
55
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
56
51
|
}, z.core.$strip>;
|
|
57
|
-
execute: ({ task
|
|
52
|
+
execute: ({ task }: {
|
|
58
53
|
task: string;
|
|
59
|
-
featureName?: string;
|
|
60
54
|
}) => Promise<{
|
|
61
55
|
error: string;
|
|
62
56
|
aborted?: undefined;
|
package/dist/tools/execTools.js
CHANGED
|
@@ -12,13 +12,12 @@ export function createExecTools(projectRoot) {
|
|
|
12
12
|
});
|
|
13
13
|
return {
|
|
14
14
|
hive_exec_start: {
|
|
15
|
-
description: 'Create
|
|
15
|
+
description: 'Create worktree and begin work on task',
|
|
16
16
|
parameters: z.object({
|
|
17
17
|
task: z.string().describe('Task folder name (e.g., "01-auth-service")'),
|
|
18
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
19
18
|
}),
|
|
20
|
-
execute: async ({ task
|
|
21
|
-
const feature =
|
|
19
|
+
execute: async ({ task }) => {
|
|
20
|
+
const feature = featureService.getActive();
|
|
22
21
|
if (!feature) {
|
|
23
22
|
return { error: 'No active feature.' };
|
|
24
23
|
}
|
|
@@ -53,15 +52,14 @@ export function createExecTools(projectRoot) {
|
|
|
53
52
|
},
|
|
54
53
|
},
|
|
55
54
|
hive_exec_complete: {
|
|
56
|
-
description: 'Complete
|
|
55
|
+
description: 'Complete task: apply changes, write report',
|
|
57
56
|
parameters: z.object({
|
|
58
57
|
task: z.string().describe('Task folder name'),
|
|
59
58
|
summary: z.string().describe('Summary of what was done'),
|
|
60
59
|
report: z.string().optional().describe('Detailed report (markdown). If not provided, summary is used.'),
|
|
61
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
62
60
|
}),
|
|
63
|
-
execute: async ({ task, summary, report
|
|
64
|
-
const feature =
|
|
61
|
+
execute: async ({ task, summary, report }) => {
|
|
62
|
+
const feature = featureService.getActive();
|
|
65
63
|
if (!feature) {
|
|
66
64
|
return { error: 'No active feature.' };
|
|
67
65
|
}
|
|
@@ -93,13 +91,12 @@ export function createExecTools(projectRoot) {
|
|
|
93
91
|
},
|
|
94
92
|
},
|
|
95
93
|
hive_exec_abort: {
|
|
96
|
-
description: 'Abort
|
|
94
|
+
description: 'Abort task: discard changes, reset status',
|
|
97
95
|
parameters: z.object({
|
|
98
96
|
task: z.string().describe('Task folder name'),
|
|
99
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
100
97
|
}),
|
|
101
|
-
execute: async ({ task
|
|
102
|
-
const feature =
|
|
98
|
+
execute: async ({ task }) => {
|
|
99
|
+
const feature = featureService.getActive();
|
|
103
100
|
if (!feature) {
|
|
104
101
|
return { error: 'No active feature.' };
|
|
105
102
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import type { TaskInfo } from '../types.js';
|
|
3
2
|
export declare function createFeatureTools(projectRoot: string): {
|
|
4
3
|
hive_feature_create: {
|
|
5
4
|
description: string;
|
|
@@ -47,10 +46,11 @@ export declare function createFeatureTools(projectRoot: string): {
|
|
|
47
46
|
hive_feature_complete: {
|
|
48
47
|
description: string;
|
|
49
48
|
parameters: z.ZodObject<{
|
|
50
|
-
|
|
49
|
+
_placeholder: z.ZodBoolean;
|
|
50
|
+
name: z.ZodOptional<z.ZodString>;
|
|
51
51
|
}, z.core.$strip>;
|
|
52
|
-
execute: ({
|
|
53
|
-
|
|
52
|
+
execute: ({ name }: {
|
|
53
|
+
name?: string;
|
|
54
54
|
}) => Promise<{
|
|
55
55
|
error: string;
|
|
56
56
|
pendingTasks?: undefined;
|
|
@@ -71,34 +71,4 @@ export declare function createFeatureTools(projectRoot: string): {
|
|
|
71
71
|
pendingTasks?: undefined;
|
|
72
72
|
}>;
|
|
73
73
|
};
|
|
74
|
-
hive_status: {
|
|
75
|
-
description: string;
|
|
76
|
-
parameters: z.ZodObject<{
|
|
77
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
78
|
-
}, z.core.$strip>;
|
|
79
|
-
execute: ({ featureName }: {
|
|
80
|
-
featureName?: string;
|
|
81
|
-
}) => Promise<{
|
|
82
|
-
error: string;
|
|
83
|
-
feature?: undefined;
|
|
84
|
-
status?: undefined;
|
|
85
|
-
hasPlan?: undefined;
|
|
86
|
-
commentCount?: undefined;
|
|
87
|
-
tasks?: undefined;
|
|
88
|
-
taskSummary?: undefined;
|
|
89
|
-
} | {
|
|
90
|
-
feature: string;
|
|
91
|
-
status: import("../types.js").FeatureStatusType;
|
|
92
|
-
hasPlan: boolean;
|
|
93
|
-
commentCount: number;
|
|
94
|
-
tasks: TaskInfo[];
|
|
95
|
-
taskSummary: {
|
|
96
|
-
pending: number;
|
|
97
|
-
in_progress: number;
|
|
98
|
-
done: number;
|
|
99
|
-
cancelled: number;
|
|
100
|
-
};
|
|
101
|
-
error?: undefined;
|
|
102
|
-
}>;
|
|
103
|
-
};
|
|
104
74
|
};
|
|
@@ -54,12 +54,13 @@ export function createFeatureTools(projectRoot) {
|
|
|
54
54
|
},
|
|
55
55
|
},
|
|
56
56
|
hive_feature_complete: {
|
|
57
|
-
description: 'Mark
|
|
57
|
+
description: 'Mark feature as completed (irreversible)',
|
|
58
58
|
parameters: z.object({
|
|
59
|
-
|
|
59
|
+
_placeholder: z.boolean().describe('Placeholder. Always pass true.'),
|
|
60
|
+
name: z.string().optional(),
|
|
60
61
|
}),
|
|
61
|
-
execute: async ({
|
|
62
|
-
const feature =
|
|
62
|
+
execute: async ({ name }) => {
|
|
63
|
+
const feature = name || featureService.getActive();
|
|
63
64
|
if (!feature) {
|
|
64
65
|
return { error: 'No active feature.' };
|
|
65
66
|
}
|
|
@@ -79,35 +80,5 @@ export function createFeatureTools(projectRoot) {
|
|
|
79
80
|
};
|
|
80
81
|
},
|
|
81
82
|
},
|
|
82
|
-
hive_status: {
|
|
83
|
-
description: 'Get overview of the active feature: status, plan, tasks.',
|
|
84
|
-
parameters: z.object({
|
|
85
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
86
|
-
}),
|
|
87
|
-
execute: async ({ featureName }) => {
|
|
88
|
-
const feature = featureName || featureService.getActive();
|
|
89
|
-
if (!feature) {
|
|
90
|
-
return { error: 'No active feature. Create one with hive_feature_create.' };
|
|
91
|
-
}
|
|
92
|
-
const info = featureService.getInfo(feature);
|
|
93
|
-
if (!info) {
|
|
94
|
-
return { error: `Feature '${feature}' not found` };
|
|
95
|
-
}
|
|
96
|
-
const tasksByStatus = {
|
|
97
|
-
pending: info.tasks.filter((t) => t.status === 'pending').length,
|
|
98
|
-
in_progress: info.tasks.filter((t) => t.status === 'in_progress').length,
|
|
99
|
-
done: info.tasks.filter((t) => t.status === 'done').length,
|
|
100
|
-
cancelled: info.tasks.filter((t) => t.status === 'cancelled').length,
|
|
101
|
-
};
|
|
102
|
-
return {
|
|
103
|
-
feature: info.name,
|
|
104
|
-
status: info.status,
|
|
105
|
-
hasPlan: info.hasPlan,
|
|
106
|
-
commentCount: info.commentCount,
|
|
107
|
-
tasks: info.tasks,
|
|
108
|
-
taskSummary: tasksByStatus,
|
|
109
|
-
};
|
|
110
|
-
},
|
|
111
|
-
},
|
|
112
83
|
};
|
|
113
84
|
}
|
|
@@ -4,11 +4,9 @@ export declare function createPlanTools(projectRoot: string): {
|
|
|
4
4
|
description: string;
|
|
5
5
|
parameters: z.ZodObject<{
|
|
6
6
|
content: z.ZodString;
|
|
7
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
8
7
|
}, z.core.$strip>;
|
|
9
|
-
execute: ({ content
|
|
8
|
+
execute: ({ content }: {
|
|
10
9
|
content: string;
|
|
11
|
-
featureName?: string;
|
|
12
10
|
}) => Promise<{
|
|
13
11
|
error: string;
|
|
14
12
|
path?: undefined;
|
|
@@ -21,23 +19,15 @@ export declare function createPlanTools(projectRoot: string): {
|
|
|
21
19
|
};
|
|
22
20
|
hive_plan_read: {
|
|
23
21
|
description: string;
|
|
24
|
-
parameters: z.ZodObject<{
|
|
25
|
-
|
|
26
|
-
}, z.core.$strip>;
|
|
27
|
-
execute: ({ featureName }: {
|
|
28
|
-
featureName?: string;
|
|
29
|
-
}) => Promise<import("../types.js").PlanReadResult | {
|
|
22
|
+
parameters: z.ZodObject<{}, z.core.$strip>;
|
|
23
|
+
execute: () => Promise<import("../types.js").PlanReadResult | {
|
|
30
24
|
error: string;
|
|
31
25
|
}>;
|
|
32
26
|
};
|
|
33
27
|
hive_plan_approve: {
|
|
34
28
|
description: string;
|
|
35
|
-
parameters: z.ZodObject<{
|
|
36
|
-
|
|
37
|
-
}, z.core.$strip>;
|
|
38
|
-
execute: ({ featureName }: {
|
|
39
|
-
featureName?: string;
|
|
40
|
-
}) => Promise<{
|
|
29
|
+
parameters: z.ZodObject<{}, z.core.$strip>;
|
|
30
|
+
execute: () => Promise<{
|
|
41
31
|
error: string;
|
|
42
32
|
comments?: undefined;
|
|
43
33
|
approved?: undefined;
|
package/dist/tools/planTools.js
CHANGED
|
@@ -6,13 +6,12 @@ export function createPlanTools(projectRoot) {
|
|
|
6
6
|
const featureService = new FeatureService(projectRoot);
|
|
7
7
|
return {
|
|
8
8
|
hive_plan_write: {
|
|
9
|
-
description: '
|
|
9
|
+
description: 'Write plan.md (clears existing comments)',
|
|
10
10
|
parameters: z.object({
|
|
11
11
|
content: z.string().describe('The markdown content for the plan'),
|
|
12
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
13
12
|
}),
|
|
14
|
-
execute: async ({ content
|
|
15
|
-
const feature =
|
|
13
|
+
execute: async ({ content }) => {
|
|
14
|
+
const feature = featureService.getActive();
|
|
16
15
|
if (!feature) {
|
|
17
16
|
return { error: 'No active feature. Create one with hive_feature_create first.' };
|
|
18
17
|
}
|
|
@@ -21,12 +20,10 @@ export function createPlanTools(projectRoot) {
|
|
|
21
20
|
},
|
|
22
21
|
},
|
|
23
22
|
hive_plan_read: {
|
|
24
|
-
description: 'Read
|
|
25
|
-
parameters: z.object({
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
execute: async ({ featureName }) => {
|
|
29
|
-
const feature = featureName || featureService.getActive();
|
|
23
|
+
description: 'Read plan.md and user comments',
|
|
24
|
+
parameters: z.object({}),
|
|
25
|
+
execute: async () => {
|
|
26
|
+
const feature = featureService.getActive();
|
|
30
27
|
if (!feature) {
|
|
31
28
|
return { error: 'No active feature.' };
|
|
32
29
|
}
|
|
@@ -38,12 +35,10 @@ export function createPlanTools(projectRoot) {
|
|
|
38
35
|
},
|
|
39
36
|
},
|
|
40
37
|
hive_plan_approve: {
|
|
41
|
-
description: 'Approve
|
|
42
|
-
parameters: z.object({
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
execute: async ({ featureName }) => {
|
|
46
|
-
const feature = featureName || featureService.getActive();
|
|
38
|
+
description: 'Approve plan for execution',
|
|
39
|
+
parameters: z.object({}),
|
|
40
|
+
execute: async () => {
|
|
41
|
+
const feature = featureService.getActive();
|
|
47
42
|
if (!feature) {
|
|
48
43
|
return { error: 'No active feature.' };
|
|
49
44
|
}
|
|
@@ -2,12 +2,8 @@ import { z } from 'zod';
|
|
|
2
2
|
export declare function createTaskTools(projectRoot: string): {
|
|
3
3
|
hive_tasks_sync: {
|
|
4
4
|
description: string;
|
|
5
|
-
parameters: z.ZodObject<{
|
|
6
|
-
|
|
7
|
-
}, z.core.$strip>;
|
|
8
|
-
execute: ({ featureName }: {
|
|
9
|
-
featureName?: string;
|
|
10
|
-
}) => Promise<{
|
|
5
|
+
parameters: z.ZodObject<{}, z.core.$strip>;
|
|
6
|
+
execute: () => Promise<{
|
|
11
7
|
error: string;
|
|
12
8
|
} | {
|
|
13
9
|
message: string;
|
|
@@ -23,12 +19,10 @@ export declare function createTaskTools(projectRoot: string): {
|
|
|
23
19
|
parameters: z.ZodObject<{
|
|
24
20
|
name: z.ZodString;
|
|
25
21
|
order: z.ZodOptional<z.ZodNumber>;
|
|
26
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
27
22
|
}, z.core.$strip>;
|
|
28
|
-
execute: ({ name, order
|
|
23
|
+
execute: ({ name, order }: {
|
|
29
24
|
name: string;
|
|
30
25
|
order?: number;
|
|
31
|
-
featureName?: string;
|
|
32
26
|
}) => Promise<{
|
|
33
27
|
error: string;
|
|
34
28
|
folder?: undefined;
|
|
@@ -52,13 +46,11 @@ export declare function createTaskTools(projectRoot: string): {
|
|
|
52
46
|
cancelled: "cancelled";
|
|
53
47
|
}>>;
|
|
54
48
|
summary: z.ZodOptional<z.ZodString>;
|
|
55
|
-
featureName: z.ZodOptional<z.ZodString>;
|
|
56
49
|
}, z.core.$strip>;
|
|
57
|
-
execute: ({ task, status, summary
|
|
50
|
+
execute: ({ task, status, summary }: {
|
|
58
51
|
task: string;
|
|
59
52
|
status?: "pending" | "in_progress" | "done" | "cancelled";
|
|
60
53
|
summary?: string;
|
|
61
|
-
featureName?: string;
|
|
62
54
|
}) => Promise<{
|
|
63
55
|
error: string;
|
|
64
56
|
updated?: undefined;
|
|
@@ -75,12 +67,8 @@ export declare function createTaskTools(projectRoot: string): {
|
|
|
75
67
|
};
|
|
76
68
|
hive_task_list: {
|
|
77
69
|
description: string;
|
|
78
|
-
parameters: z.ZodObject<{
|
|
79
|
-
|
|
80
|
-
}, z.core.$strip>;
|
|
81
|
-
execute: ({ featureName }: {
|
|
82
|
-
featureName?: string;
|
|
83
|
-
}) => Promise<{
|
|
70
|
+
parameters: z.ZodObject<{}, z.core.$strip>;
|
|
71
|
+
execute: () => Promise<{
|
|
84
72
|
error: string;
|
|
85
73
|
tasks?: undefined;
|
|
86
74
|
} | {
|
package/dist/tools/taskTools.js
CHANGED
|
@@ -6,12 +6,10 @@ export function createTaskTools(projectRoot) {
|
|
|
6
6
|
const featureService = new FeatureService(projectRoot);
|
|
7
7
|
return {
|
|
8
8
|
hive_tasks_sync: {
|
|
9
|
-
description: '
|
|
10
|
-
parameters: z.object({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
execute: async ({ featureName }) => {
|
|
14
|
-
const feature = featureName || featureService.getActive();
|
|
9
|
+
description: 'Generate tasks from approved plan',
|
|
10
|
+
parameters: z.object({}),
|
|
11
|
+
execute: async () => {
|
|
12
|
+
const feature = featureService.getActive();
|
|
15
13
|
if (!feature) {
|
|
16
14
|
return { error: 'No active feature.' };
|
|
17
15
|
}
|
|
@@ -33,14 +31,13 @@ export function createTaskTools(projectRoot) {
|
|
|
33
31
|
},
|
|
34
32
|
},
|
|
35
33
|
hive_task_create: {
|
|
36
|
-
description: 'Create
|
|
34
|
+
description: 'Create manual task (not from plan)',
|
|
37
35
|
parameters: z.object({
|
|
38
36
|
name: z.string().describe('Task name (will be slugified)'),
|
|
39
37
|
order: z.number().optional().describe('Task order number (defaults to next available)'),
|
|
40
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
41
38
|
}),
|
|
42
|
-
execute: async ({ name, order
|
|
43
|
-
const feature =
|
|
39
|
+
execute: async ({ name, order }) => {
|
|
40
|
+
const feature = featureService.getActive();
|
|
44
41
|
if (!feature) {
|
|
45
42
|
return { error: 'No active feature.' };
|
|
46
43
|
}
|
|
@@ -53,15 +50,14 @@ export function createTaskTools(projectRoot) {
|
|
|
53
50
|
},
|
|
54
51
|
},
|
|
55
52
|
hive_task_update: {
|
|
56
|
-
description: 'Update
|
|
53
|
+
description: 'Update task status or summary',
|
|
57
54
|
parameters: z.object({
|
|
58
55
|
task: z.string().describe('Task folder name (e.g., "01-auth-service")'),
|
|
59
56
|
status: z.enum(['pending', 'in_progress', 'done', 'cancelled']).optional(),
|
|
60
57
|
summary: z.string().optional().describe('Summary of work done'),
|
|
61
|
-
featureName: z.string().optional().describe('Feature name (defaults to active feature)'),
|
|
62
58
|
}),
|
|
63
|
-
execute: async ({ task, status, summary
|
|
64
|
-
const feature =
|
|
59
|
+
execute: async ({ task, status, summary }) => {
|
|
60
|
+
const feature = featureService.getActive();
|
|
65
61
|
if (!feature) {
|
|
66
62
|
return { error: 'No active feature.' };
|
|
67
63
|
}
|
|
@@ -71,11 +67,9 @@ export function createTaskTools(projectRoot) {
|
|
|
71
67
|
},
|
|
72
68
|
hive_task_list: {
|
|
73
69
|
description: 'List all tasks for the active feature.',
|
|
74
|
-
parameters: z.object({
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
execute: async ({ featureName }) => {
|
|
78
|
-
const feature = featureName || featureService.getActive();
|
|
70
|
+
parameters: z.object({}),
|
|
71
|
+
execute: async () => {
|
|
72
|
+
const feature = featureService.getActive();
|
|
79
73
|
if (!feature) {
|
|
80
74
|
return { error: 'No active feature.' };
|
|
81
75
|
}
|