@troykelly/openclaw-projects 0.0.37 → 0.0.39
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/api-client.js +1 -1
- package/dist/api-client.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -2
- package/dist/config.js.map +1 -1
- package/dist/gateway/oauth-rpc-methods.d.ts +6 -1
- package/dist/gateway/oauth-rpc-methods.d.ts.map +1 -1
- package/dist/gateway/oauth-rpc-methods.js +48 -21
- package/dist/gateway/oauth-rpc-methods.js.map +1 -1
- package/dist/gateway/rpc-methods.d.ts +6 -1
- package/dist/gateway/rpc-methods.d.ts.map +1 -1
- package/dist/gateway/rpc-methods.js +31 -4
- package/dist/gateway/rpc-methods.js.map +1 -1
- package/dist/hooks.js +5 -5
- package/dist/hooks.js.map +1 -1
- package/dist/register-openclaw.d.ts +2 -0
- package/dist/register-openclaw.d.ts.map +1 -1
- package/dist/register-openclaw.js +567 -93
- package/dist/register-openclaw.js.map +1 -1
- package/dist/services/api-source-service.js +9 -9
- package/dist/services/api-source-service.js.map +1 -1
- package/dist/services/notification-service.js +1 -1
- package/dist/services/notification-service.js.map +1 -1
- package/dist/tool-guidance/catalog.d.ts.map +1 -1
- package/dist/tool-guidance/catalog.js +15 -3
- package/dist/tool-guidance/catalog.js.map +1 -1
- package/dist/tools/contacts.js +3 -3
- package/dist/tools/contacts.js.map +1 -1
- package/dist/tools/context-search.d.ts +4 -4
- package/dist/tools/context-search.d.ts.map +1 -1
- package/dist/tools/context-search.js +38 -8
- package/dist/tools/context-search.js.map +1 -1
- package/dist/tools/dev-prompts.d.ts +214 -0
- package/dist/tools/dev-prompts.d.ts.map +1 -0
- package/dist/tools/dev-prompts.js +415 -0
- package/dist/tools/dev-prompts.js.map +1 -0
- package/dist/tools/dev-session-search.d.ts +76 -0
- package/dist/tools/dev-session-search.d.ts.map +1 -0
- package/dist/tools/dev-session-search.js +118 -0
- package/dist/tools/dev-session-search.js.map +1 -0
- package/dist/tools/dev-sessions.d.ts +24 -4
- package/dist/tools/dev-sessions.d.ts.map +1 -1
- package/dist/tools/dev-sessions.js +68 -11
- package/dist/tools/dev-sessions.js.map +1 -1
- package/dist/tools/email-send.js +1 -1
- package/dist/tools/email-send.js.map +1 -1
- package/dist/tools/entity-links.js +8 -8
- package/dist/tools/entity-links.js.map +1 -1
- package/dist/tools/file-share.js +1 -1
- package/dist/tools/file-share.js.map +1 -1
- package/dist/tools/index.d.ts +3 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/memory-forget.js +3 -3
- package/dist/tools/memory-forget.js.map +1 -1
- package/dist/tools/memory-recall.js +1 -1
- package/dist/tools/memory-recall.js.map +1 -1
- package/dist/tools/memory-store.js +1 -1
- package/dist/tools/memory-store.js.map +1 -1
- package/dist/tools/message-search.js +1 -1
- package/dist/tools/message-search.js.map +1 -1
- package/dist/tools/notebooks.js +3 -3
- package/dist/tools/notebooks.js.map +1 -1
- package/dist/tools/notes.js +5 -5
- package/dist/tools/notes.js.map +1 -1
- package/dist/tools/project-search.js +1 -1
- package/dist/tools/project-search.js.map +1 -1
- package/dist/tools/projects.js +3 -3
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/relationships.js +2 -2
- package/dist/tools/relationships.js.map +1 -1
- package/dist/tools/skill-store.js +11 -11
- package/dist/tools/skill-store.js.map +1 -1
- package/dist/tools/sms-send.js +1 -1
- package/dist/tools/sms-send.js.map +1 -1
- package/dist/tools/terminal-connections.js +8 -8
- package/dist/tools/terminal-connections.js.map +1 -1
- package/dist/tools/terminal-search.js +2 -2
- package/dist/tools/terminal-search.js.map +1 -1
- package/dist/tools/terminal-sessions.js +7 -7
- package/dist/tools/terminal-sessions.js.map +1 -1
- package/dist/tools/terminal-tunnels.js +3 -3
- package/dist/tools/terminal-tunnels.js.map +1 -1
- package/dist/tools/threads.js +2 -2
- package/dist/tools/threads.js.map +1 -1
- package/dist/tools/todo-search.js +1 -1
- package/dist/tools/todo-search.js.map +1 -1
- package/dist/tools/todos.js +3 -3
- package/dist/tools/todos.js.map +1 -1
- package/dist/types/openclaw-api.d.ts +324 -41
- package/dist/types/openclaw-api.d.ts.map +1 -1
- package/dist/utils/auto-linker.js +5 -5
- package/dist/utils/auto-linker.js.map +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev prompt tools for OpenClaw plugin (Epic #2011, Issue #2015).
|
|
3
|
+
*
|
|
4
|
+
* Tools: dev_prompt_list, dev_prompt_get, dev_prompt_create,
|
|
5
|
+
* dev_prompt_update, dev_prompt_reset
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import type { ApiClient } from '../api-client.js';
|
|
9
|
+
import type { Logger } from '../logger.js';
|
|
10
|
+
import type { PluginConfig } from '../config.js';
|
|
11
|
+
/** Tool configuration for dev prompt tools */
|
|
12
|
+
export interface DevPromptToolOptions {
|
|
13
|
+
client: ApiClient;
|
|
14
|
+
logger: Logger;
|
|
15
|
+
config: PluginConfig;
|
|
16
|
+
user_id: string;
|
|
17
|
+
}
|
|
18
|
+
/** Dev prompt from API */
|
|
19
|
+
export interface DevPrompt {
|
|
20
|
+
id: string;
|
|
21
|
+
namespace: string;
|
|
22
|
+
prompt_key: string;
|
|
23
|
+
category: string;
|
|
24
|
+
is_system: boolean;
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
body: string;
|
|
28
|
+
default_body: string;
|
|
29
|
+
sort_order: number;
|
|
30
|
+
is_active: boolean;
|
|
31
|
+
deleted_at: string | null;
|
|
32
|
+
created_at: string;
|
|
33
|
+
updated_at: string;
|
|
34
|
+
}
|
|
35
|
+
/** Failure result */
|
|
36
|
+
export interface DevPromptFailure {
|
|
37
|
+
success: false;
|
|
38
|
+
error: string;
|
|
39
|
+
}
|
|
40
|
+
export declare const DevPromptListParamsSchema: z.ZodObject<{
|
|
41
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
42
|
+
category: z.ZodOptional<z.ZodEnum<["identification", "creation", "triage", "shipping", "general", "custom"]>>;
|
|
43
|
+
}, "strip", z.ZodTypeAny, {
|
|
44
|
+
namespace?: string | undefined;
|
|
45
|
+
category?: "custom" | "identification" | "creation" | "triage" | "shipping" | "general" | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
namespace?: string | undefined;
|
|
48
|
+
category?: "custom" | "identification" | "creation" | "triage" | "shipping" | "general" | undefined;
|
|
49
|
+
}>;
|
|
50
|
+
export type DevPromptListParams = z.infer<typeof DevPromptListParamsSchema>;
|
|
51
|
+
export interface DevPromptListSuccess {
|
|
52
|
+
success: true;
|
|
53
|
+
data: {
|
|
54
|
+
content: string;
|
|
55
|
+
details: {
|
|
56
|
+
prompts: Pick<DevPrompt, 'prompt_key' | 'title' | 'category' | 'is_system'>[];
|
|
57
|
+
total: number;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export type DevPromptListResult = DevPromptListSuccess | DevPromptFailure;
|
|
62
|
+
export interface DevPromptListTool {
|
|
63
|
+
name: string;
|
|
64
|
+
description: string;
|
|
65
|
+
parameters: typeof DevPromptListParamsSchema;
|
|
66
|
+
execute: (params: DevPromptListParams) => Promise<DevPromptListResult>;
|
|
67
|
+
}
|
|
68
|
+
export declare function createDevPromptListTool(options: DevPromptToolOptions): DevPromptListTool;
|
|
69
|
+
export declare const DevPromptGetParamsSchema: z.ZodObject<{
|
|
70
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
71
|
+
key: z.ZodString;
|
|
72
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
73
|
+
variables: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
74
|
+
render: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
|
76
|
+
key: string;
|
|
77
|
+
render: boolean;
|
|
78
|
+
namespace?: string | undefined;
|
|
79
|
+
repo?: string | undefined;
|
|
80
|
+
variables?: Record<string, string> | undefined;
|
|
81
|
+
}, {
|
|
82
|
+
key: string;
|
|
83
|
+
namespace?: string | undefined;
|
|
84
|
+
repo?: string | undefined;
|
|
85
|
+
variables?: Record<string, string> | undefined;
|
|
86
|
+
render?: boolean | undefined;
|
|
87
|
+
}>;
|
|
88
|
+
export type DevPromptGetParams = z.infer<typeof DevPromptGetParamsSchema>;
|
|
89
|
+
export interface DevPromptGetSuccess {
|
|
90
|
+
success: true;
|
|
91
|
+
data: {
|
|
92
|
+
content: string;
|
|
93
|
+
details: {
|
|
94
|
+
prompt_key: string;
|
|
95
|
+
title: string;
|
|
96
|
+
category: string;
|
|
97
|
+
is_system: boolean;
|
|
98
|
+
rendered: boolean;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export type DevPromptGetResult = DevPromptGetSuccess | DevPromptFailure;
|
|
103
|
+
export interface DevPromptGetTool {
|
|
104
|
+
name: string;
|
|
105
|
+
description: string;
|
|
106
|
+
parameters: typeof DevPromptGetParamsSchema;
|
|
107
|
+
execute: (params: DevPromptGetParams) => Promise<DevPromptGetResult>;
|
|
108
|
+
}
|
|
109
|
+
export declare function createDevPromptGetTool(options: DevPromptToolOptions): DevPromptGetTool;
|
|
110
|
+
export declare const DevPromptCreateParamsSchema: z.ZodObject<{
|
|
111
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
112
|
+
key: z.ZodString;
|
|
113
|
+
title: z.ZodOptional<z.ZodString>;
|
|
114
|
+
body: z.ZodOptional<z.ZodString>;
|
|
115
|
+
category: z.ZodOptional<z.ZodEnum<["identification", "creation", "triage", "shipping", "general", "custom"]>>;
|
|
116
|
+
repo: z.ZodOptional<z.ZodString>;
|
|
117
|
+
}, "strip", z.ZodTypeAny, {
|
|
118
|
+
key: string;
|
|
119
|
+
namespace?: string | undefined;
|
|
120
|
+
title?: string | undefined;
|
|
121
|
+
category?: "custom" | "identification" | "creation" | "triage" | "shipping" | "general" | undefined;
|
|
122
|
+
body?: string | undefined;
|
|
123
|
+
repo?: string | undefined;
|
|
124
|
+
}, {
|
|
125
|
+
key: string;
|
|
126
|
+
namespace?: string | undefined;
|
|
127
|
+
title?: string | undefined;
|
|
128
|
+
category?: "custom" | "identification" | "creation" | "triage" | "shipping" | "general" | undefined;
|
|
129
|
+
body?: string | undefined;
|
|
130
|
+
repo?: string | undefined;
|
|
131
|
+
}>;
|
|
132
|
+
export type DevPromptCreateParams = z.infer<typeof DevPromptCreateParamsSchema>;
|
|
133
|
+
export interface DevPromptCreateSuccess {
|
|
134
|
+
success: true;
|
|
135
|
+
data: {
|
|
136
|
+
content: string;
|
|
137
|
+
details: {
|
|
138
|
+
id: string;
|
|
139
|
+
prompt_key: string;
|
|
140
|
+
title: string;
|
|
141
|
+
category: string;
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
export type DevPromptCreateResult = DevPromptCreateSuccess | DevPromptFailure;
|
|
146
|
+
export interface DevPromptCreateTool {
|
|
147
|
+
name: string;
|
|
148
|
+
description: string;
|
|
149
|
+
parameters: typeof DevPromptCreateParamsSchema;
|
|
150
|
+
execute: (params: DevPromptCreateParams) => Promise<DevPromptCreateResult>;
|
|
151
|
+
}
|
|
152
|
+
export declare function createDevPromptCreateTool(options: DevPromptToolOptions): DevPromptCreateTool;
|
|
153
|
+
export declare const DevPromptUpdateParamsSchema: z.ZodObject<{
|
|
154
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
155
|
+
key: z.ZodString;
|
|
156
|
+
body: z.ZodString;
|
|
157
|
+
}, "strip", z.ZodTypeAny, {
|
|
158
|
+
key: string;
|
|
159
|
+
body: string;
|
|
160
|
+
namespace?: string | undefined;
|
|
161
|
+
}, {
|
|
162
|
+
key: string;
|
|
163
|
+
body: string;
|
|
164
|
+
namespace?: string | undefined;
|
|
165
|
+
}>;
|
|
166
|
+
export type DevPromptUpdateParams = z.infer<typeof DevPromptUpdateParamsSchema>;
|
|
167
|
+
export interface DevPromptUpdateSuccess {
|
|
168
|
+
success: true;
|
|
169
|
+
data: {
|
|
170
|
+
content: string;
|
|
171
|
+
details: {
|
|
172
|
+
prompt_key: string;
|
|
173
|
+
title: string;
|
|
174
|
+
};
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export type DevPromptUpdateResult = DevPromptUpdateSuccess | DevPromptFailure;
|
|
178
|
+
export interface DevPromptUpdateTool {
|
|
179
|
+
name: string;
|
|
180
|
+
description: string;
|
|
181
|
+
parameters: typeof DevPromptUpdateParamsSchema;
|
|
182
|
+
execute: (params: DevPromptUpdateParams) => Promise<DevPromptUpdateResult>;
|
|
183
|
+
}
|
|
184
|
+
export declare function createDevPromptUpdateTool(options: DevPromptToolOptions): DevPromptUpdateTool;
|
|
185
|
+
export declare const DevPromptResetParamsSchema: z.ZodObject<{
|
|
186
|
+
namespace: z.ZodOptional<z.ZodString>;
|
|
187
|
+
key: z.ZodString;
|
|
188
|
+
}, "strip", z.ZodTypeAny, {
|
|
189
|
+
key: string;
|
|
190
|
+
namespace?: string | undefined;
|
|
191
|
+
}, {
|
|
192
|
+
key: string;
|
|
193
|
+
namespace?: string | undefined;
|
|
194
|
+
}>;
|
|
195
|
+
export type DevPromptResetParams = z.infer<typeof DevPromptResetParamsSchema>;
|
|
196
|
+
export interface DevPromptResetSuccess {
|
|
197
|
+
success: true;
|
|
198
|
+
data: {
|
|
199
|
+
content: string;
|
|
200
|
+
details: {
|
|
201
|
+
prompt_key: string;
|
|
202
|
+
title: string;
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
export type DevPromptResetResult = DevPromptResetSuccess | DevPromptFailure;
|
|
207
|
+
export interface DevPromptResetTool {
|
|
208
|
+
name: string;
|
|
209
|
+
description: string;
|
|
210
|
+
parameters: typeof DevPromptResetParamsSchema;
|
|
211
|
+
execute: (params: DevPromptResetParams) => Promise<DevPromptResetResult>;
|
|
212
|
+
}
|
|
213
|
+
export declare function createDevPromptResetTool(options: DevPromptToolOptions): DevPromptResetTool;
|
|
214
|
+
//# sourceMappingURL=dev-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-prompts.d.ts","sourceRoot":"","sources":["../../src/tools/dev-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev prompt tools for OpenClaw plugin (Epic #2011, Issue #2015).
|
|
3
|
+
*
|
|
4
|
+
* Tools: dev_prompt_list, dev_prompt_get, dev_prompt_create,
|
|
5
|
+
* dev_prompt_update, dev_prompt_reset
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { sanitizeErrorMessage } from '../utils/sanitize.js';
|
|
9
|
+
const CATEGORIES = ['identification', 'creation', 'triage', 'shipping', 'general', 'custom'];
|
|
10
|
+
/**
|
|
11
|
+
* Parse a "org/name" repo string into repo_org and repo_name.
|
|
12
|
+
*/
|
|
13
|
+
function parseRepo(repo) {
|
|
14
|
+
const idx = repo.indexOf('/');
|
|
15
|
+
if (idx <= 0 || idx === repo.length - 1)
|
|
16
|
+
return null;
|
|
17
|
+
return { repo_org: repo.slice(0, idx), repo_name: repo.slice(idx + 1) };
|
|
18
|
+
}
|
|
19
|
+
// ==================== dev_prompt_list ====================
|
|
20
|
+
export const DevPromptListParamsSchema = z.object({
|
|
21
|
+
namespace: z.string().optional().describe('Namespace to list prompts from (defaults to your namespace)'),
|
|
22
|
+
category: z.enum(CATEGORIES).optional().describe('Filter by category'),
|
|
23
|
+
});
|
|
24
|
+
export function createDevPromptListTool(options) {
|
|
25
|
+
const { client, logger, user_id } = options;
|
|
26
|
+
return {
|
|
27
|
+
name: 'dev_prompt_list',
|
|
28
|
+
description: 'Lists available dev prompt templates grouped by category. Use to discover what prompts are available before using dev_prompt_get to retrieve and render one. Returns prompt keys, titles, categories, and whether each is a system or user prompt.',
|
|
29
|
+
parameters: DevPromptListParamsSchema,
|
|
30
|
+
async execute(params) {
|
|
31
|
+
const parseResult = DevPromptListParamsSchema.safeParse(params);
|
|
32
|
+
if (!parseResult.success) {
|
|
33
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
34
|
+
return { success: false, error: errorMessage };
|
|
35
|
+
}
|
|
36
|
+
const { namespace, category } = parseResult.data;
|
|
37
|
+
logger.info('dev_prompt_list invoked', { user_id, namespace, category });
|
|
38
|
+
try {
|
|
39
|
+
const queryParams = new URLSearchParams({ limit: '100', offset: '0' });
|
|
40
|
+
if (namespace)
|
|
41
|
+
queryParams.set('namespace', namespace);
|
|
42
|
+
if (category)
|
|
43
|
+
queryParams.set('category', category);
|
|
44
|
+
const response = await client.get(`/dev-prompts?${queryParams.toString()}`, { user_id });
|
|
45
|
+
if (!response.success) {
|
|
46
|
+
logger.error('dev_prompt_list API error', { user_id, status: response.error.status });
|
|
47
|
+
return { success: false, error: response.error.message || 'Failed to list dev prompts' };
|
|
48
|
+
}
|
|
49
|
+
const items = response.data.items ?? [];
|
|
50
|
+
const total = response.data.total ?? items.length;
|
|
51
|
+
if (items.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
data: {
|
|
55
|
+
content: 'No dev prompts found.',
|
|
56
|
+
details: { prompts: [], total: 0 },
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Group by category
|
|
61
|
+
const grouped = new Map();
|
|
62
|
+
for (const item of items) {
|
|
63
|
+
const cat = item.category;
|
|
64
|
+
if (!grouped.has(cat))
|
|
65
|
+
grouped.set(cat, []);
|
|
66
|
+
grouped.get(cat).push(item);
|
|
67
|
+
}
|
|
68
|
+
const lines = [`Found ${total} dev prompt(s):\n`];
|
|
69
|
+
for (const [cat, prompts] of grouped) {
|
|
70
|
+
lines.push(`**${cat}**`);
|
|
71
|
+
for (const p of prompts) {
|
|
72
|
+
const tag = p.is_system ? '[system]' : '[user]';
|
|
73
|
+
lines.push(` - \`${p.prompt_key}\` — ${p.title} ${tag}`);
|
|
74
|
+
}
|
|
75
|
+
lines.push('');
|
|
76
|
+
}
|
|
77
|
+
logger.debug('dev_prompt_list completed', { user_id, count: items.length });
|
|
78
|
+
return {
|
|
79
|
+
success: true,
|
|
80
|
+
data: {
|
|
81
|
+
content: lines.join('\n').trim(),
|
|
82
|
+
details: {
|
|
83
|
+
prompts: items.map((i) => ({
|
|
84
|
+
prompt_key: i.prompt_key,
|
|
85
|
+
title: i.title,
|
|
86
|
+
category: i.category,
|
|
87
|
+
is_system: i.is_system,
|
|
88
|
+
})),
|
|
89
|
+
total,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
logger.error('dev_prompt_list failed', {
|
|
96
|
+
user_id,
|
|
97
|
+
error: error instanceof Error ? error.message : String(error),
|
|
98
|
+
});
|
|
99
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// ==================== dev_prompt_get ====================
|
|
105
|
+
export const DevPromptGetParamsSchema = z.object({
|
|
106
|
+
namespace: z.string().optional().describe('Namespace to search in (defaults to your namespace)'),
|
|
107
|
+
key: z.string().min(1, 'Prompt key is required').describe('The prompt_key to look up'),
|
|
108
|
+
repo: z.string().optional().describe('Repository in "org/name" format — splits into repo_org and repo_name template variables'),
|
|
109
|
+
variables: z.record(z.string()).optional().describe('Extra variables to pass to the template renderer'),
|
|
110
|
+
render: z.boolean().optional().default(true).describe('Whether to render the template (default: true). Set false to get raw Handlebars template.'),
|
|
111
|
+
});
|
|
112
|
+
export function createDevPromptGetTool(options) {
|
|
113
|
+
const { client, logger, user_id } = options;
|
|
114
|
+
return {
|
|
115
|
+
name: 'dev_prompt_get',
|
|
116
|
+
description: 'Gets a dev prompt by key and renders it with Handlebars template variables. By default returns the fully rendered output. Set render=false to get the raw template. Pass repo="org/name" to populate repo variables. Use dev_prompt_list first to discover available keys.',
|
|
117
|
+
parameters: DevPromptGetParamsSchema,
|
|
118
|
+
async execute(params) {
|
|
119
|
+
const parseResult = DevPromptGetParamsSchema.safeParse(params);
|
|
120
|
+
if (!parseResult.success) {
|
|
121
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
122
|
+
return { success: false, error: errorMessage };
|
|
123
|
+
}
|
|
124
|
+
const { namespace, key, repo, variables, render } = parseResult.data;
|
|
125
|
+
logger.info('dev_prompt_get invoked', { user_id, key, render, hasRepo: !!repo });
|
|
126
|
+
try {
|
|
127
|
+
// Look up prompt by key
|
|
128
|
+
const queryParams = new URLSearchParams();
|
|
129
|
+
if (namespace)
|
|
130
|
+
queryParams.set('namespace', namespace);
|
|
131
|
+
const qs = queryParams.toString();
|
|
132
|
+
const url = `/dev-prompts/by-key/${encodeURIComponent(key)}${qs ? `?${qs}` : ''}`;
|
|
133
|
+
const lookupResponse = await client.get(url, { user_id });
|
|
134
|
+
if (!lookupResponse.success) {
|
|
135
|
+
if (lookupResponse.error.status === 404 || lookupResponse.error.code === 'NOT_FOUND') {
|
|
136
|
+
return { success: false, error: `Dev prompt "${key}" not found. Use dev_prompt_list to see available prompts.` };
|
|
137
|
+
}
|
|
138
|
+
return { success: false, error: lookupResponse.error.message || 'Failed to get dev prompt' };
|
|
139
|
+
}
|
|
140
|
+
const prompt = lookupResponse.data;
|
|
141
|
+
// If render=false, return raw template
|
|
142
|
+
if (!render) {
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
data: {
|
|
146
|
+
content: `**${prompt.title}** (\`${prompt.prompt_key}\`) [${prompt.category}]\n\n${prompt.body}`,
|
|
147
|
+
details: {
|
|
148
|
+
prompt_key: prompt.prompt_key,
|
|
149
|
+
title: prompt.title,
|
|
150
|
+
category: prompt.category,
|
|
151
|
+
is_system: prompt.is_system,
|
|
152
|
+
rendered: false,
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
// Build render variables
|
|
158
|
+
const renderVariables = { ...(variables ?? {}) };
|
|
159
|
+
if (repo) {
|
|
160
|
+
const parsed = parseRepo(repo);
|
|
161
|
+
if (parsed) {
|
|
162
|
+
renderVariables.repo_org = parsed.repo_org;
|
|
163
|
+
renderVariables.repo_name = parsed.repo_name;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Call render endpoint
|
|
167
|
+
const renderResponse = await client.post(`/dev-prompts/${prompt.id}/render`, { variables: renderVariables }, { user_id });
|
|
168
|
+
if (!renderResponse.success) {
|
|
169
|
+
// Fall back to raw template if render fails
|
|
170
|
+
logger.warn('dev_prompt_get render failed, returning raw', {
|
|
171
|
+
key,
|
|
172
|
+
error: renderResponse.error.message,
|
|
173
|
+
});
|
|
174
|
+
return {
|
|
175
|
+
success: true,
|
|
176
|
+
data: {
|
|
177
|
+
content: `**${prompt.title}** (\`${prompt.prompt_key}\`) [${prompt.category}]\n\n${prompt.body}`,
|
|
178
|
+
details: {
|
|
179
|
+
prompt_key: prompt.prompt_key,
|
|
180
|
+
title: prompt.title,
|
|
181
|
+
category: prompt.category,
|
|
182
|
+
is_system: prompt.is_system,
|
|
183
|
+
rendered: false,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
logger.debug('dev_prompt_get completed', { user_id, key, rendered: true });
|
|
189
|
+
return {
|
|
190
|
+
success: true,
|
|
191
|
+
data: {
|
|
192
|
+
content: renderResponse.data.rendered,
|
|
193
|
+
details: {
|
|
194
|
+
prompt_key: prompt.prompt_key,
|
|
195
|
+
title: prompt.title,
|
|
196
|
+
category: prompt.category,
|
|
197
|
+
is_system: prompt.is_system,
|
|
198
|
+
rendered: true,
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
logger.error('dev_prompt_get failed', {
|
|
205
|
+
user_id,
|
|
206
|
+
key,
|
|
207
|
+
error: error instanceof Error ? error.message : String(error),
|
|
208
|
+
});
|
|
209
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// ==================== dev_prompt_create ====================
|
|
215
|
+
export const DevPromptCreateParamsSchema = z.object({
|
|
216
|
+
namespace: z.string().optional().describe('Namespace to create the prompt in (defaults to your namespace)'),
|
|
217
|
+
key: z.string().min(1, 'Prompt key is required').describe('Snake_case key for the prompt (unique per namespace)'),
|
|
218
|
+
title: z.string().optional().describe('Human-readable title (defaults to key if not provided)'),
|
|
219
|
+
body: z.string().optional().describe('Handlebars template body'),
|
|
220
|
+
category: z.enum(CATEGORIES).optional().describe('Prompt category (defaults to "custom")'),
|
|
221
|
+
repo: z.string().optional().describe('Repository in "org/name" format — used for rendering context'),
|
|
222
|
+
});
|
|
223
|
+
export function createDevPromptCreateTool(options) {
|
|
224
|
+
const { client, logger, user_id } = options;
|
|
225
|
+
return {
|
|
226
|
+
name: 'dev_prompt_create',
|
|
227
|
+
description: 'Creates a new user-defined dev prompt template. The key must be snake_case and unique within the namespace. If the key already exists, use dev_prompt_update instead. Use Handlebars syntax ({{ variable }}) in the body for dynamic content.',
|
|
228
|
+
parameters: DevPromptCreateParamsSchema,
|
|
229
|
+
async execute(params) {
|
|
230
|
+
const parseResult = DevPromptCreateParamsSchema.safeParse(params);
|
|
231
|
+
if (!parseResult.success) {
|
|
232
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
233
|
+
return { success: false, error: errorMessage };
|
|
234
|
+
}
|
|
235
|
+
const { namespace, key, title, body, category } = parseResult.data;
|
|
236
|
+
logger.info('dev_prompt_create invoked', { user_id, key, category });
|
|
237
|
+
try {
|
|
238
|
+
const payload = {
|
|
239
|
+
prompt_key: key,
|
|
240
|
+
title: title ?? key,
|
|
241
|
+
body: body ?? '',
|
|
242
|
+
};
|
|
243
|
+
if (category)
|
|
244
|
+
payload.category = category;
|
|
245
|
+
const queryParams = new URLSearchParams();
|
|
246
|
+
if (namespace)
|
|
247
|
+
queryParams.set('namespace', namespace);
|
|
248
|
+
const qs = queryParams.toString();
|
|
249
|
+
const response = await client.post(`/dev-prompts${qs ? `?${qs}` : ''}`, payload, { user_id });
|
|
250
|
+
if (!response.success) {
|
|
251
|
+
if (response.error.status === 409 || response.error.code === 'CONFLICT') {
|
|
252
|
+
return {
|
|
253
|
+
success: false,
|
|
254
|
+
error: `A prompt with key "${key}" already exists. Use dev_prompt_update to modify it.`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
logger.error('dev_prompt_create API error', { user_id, key, status: response.error.status });
|
|
258
|
+
return { success: false, error: response.error.message || 'Failed to create dev prompt' };
|
|
259
|
+
}
|
|
260
|
+
const prompt = response.data;
|
|
261
|
+
logger.debug('dev_prompt_create completed', { user_id, key, id: prompt.id });
|
|
262
|
+
return {
|
|
263
|
+
success: true,
|
|
264
|
+
data: {
|
|
265
|
+
content: `Created dev prompt \`${prompt.prompt_key}\` — "${prompt.title}" [${prompt.category}] (ID: ${prompt.id})`,
|
|
266
|
+
details: {
|
|
267
|
+
id: prompt.id,
|
|
268
|
+
prompt_key: prompt.prompt_key,
|
|
269
|
+
title: prompt.title,
|
|
270
|
+
category: prompt.category,
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
logger.error('dev_prompt_create failed', {
|
|
277
|
+
user_id,
|
|
278
|
+
key,
|
|
279
|
+
error: error instanceof Error ? error.message : String(error),
|
|
280
|
+
});
|
|
281
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// ==================== dev_prompt_update ====================
|
|
287
|
+
export const DevPromptUpdateParamsSchema = z.object({
|
|
288
|
+
namespace: z.string().optional().describe('Namespace of the prompt (defaults to your namespace)'),
|
|
289
|
+
key: z.string().min(1, 'Prompt key is required').describe('The prompt_key to update'),
|
|
290
|
+
body: z.string().min(1, 'Body is required').describe('New Handlebars template body'),
|
|
291
|
+
});
|
|
292
|
+
export function createDevPromptUpdateTool(options) {
|
|
293
|
+
const { client, logger, user_id } = options;
|
|
294
|
+
return {
|
|
295
|
+
name: 'dev_prompt_update',
|
|
296
|
+
description: 'Updates the body of an existing dev prompt by key. For system prompts, only the body can be changed. Looks up the prompt by key first, then patches by ID.',
|
|
297
|
+
parameters: DevPromptUpdateParamsSchema,
|
|
298
|
+
async execute(params) {
|
|
299
|
+
const parseResult = DevPromptUpdateParamsSchema.safeParse(params);
|
|
300
|
+
if (!parseResult.success) {
|
|
301
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
302
|
+
return { success: false, error: errorMessage };
|
|
303
|
+
}
|
|
304
|
+
const { namespace, key, body } = parseResult.data;
|
|
305
|
+
logger.info('dev_prompt_update invoked', { user_id, key });
|
|
306
|
+
try {
|
|
307
|
+
// Look up prompt by key
|
|
308
|
+
const queryParams = new URLSearchParams();
|
|
309
|
+
if (namespace)
|
|
310
|
+
queryParams.set('namespace', namespace);
|
|
311
|
+
const qs = queryParams.toString();
|
|
312
|
+
const lookupUrl = `/dev-prompts/by-key/${encodeURIComponent(key)}${qs ? `?${qs}` : ''}`;
|
|
313
|
+
const lookupResponse = await client.get(lookupUrl, { user_id });
|
|
314
|
+
if (!lookupResponse.success) {
|
|
315
|
+
if (lookupResponse.error.status === 404 || lookupResponse.error.code === 'NOT_FOUND') {
|
|
316
|
+
return { success: false, error: `Dev prompt "${key}" not found. Use dev_prompt_list to see available prompts, or dev_prompt_create to create a new one.` };
|
|
317
|
+
}
|
|
318
|
+
return { success: false, error: lookupResponse.error.message || 'Failed to look up dev prompt' };
|
|
319
|
+
}
|
|
320
|
+
const prompt = lookupResponse.data;
|
|
321
|
+
// PATCH by ID
|
|
322
|
+
const patchResponse = await client.patch(`/dev-prompts/${prompt.id}`, { body }, { user_id });
|
|
323
|
+
if (!patchResponse.success) {
|
|
324
|
+
logger.error('dev_prompt_update patch failed', { user_id, key, id: prompt.id, status: patchResponse.error.status });
|
|
325
|
+
return { success: false, error: patchResponse.error.message || 'Failed to update dev prompt' };
|
|
326
|
+
}
|
|
327
|
+
const updated = patchResponse.data;
|
|
328
|
+
logger.debug('dev_prompt_update completed', { user_id, key, id: prompt.id });
|
|
329
|
+
return {
|
|
330
|
+
success: true,
|
|
331
|
+
data: {
|
|
332
|
+
content: `Updated dev prompt \`${updated.prompt_key}\` — "${updated.title}"`,
|
|
333
|
+
details: {
|
|
334
|
+
prompt_key: updated.prompt_key,
|
|
335
|
+
title: updated.title,
|
|
336
|
+
},
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
logger.error('dev_prompt_update failed', {
|
|
342
|
+
user_id,
|
|
343
|
+
key,
|
|
344
|
+
error: error instanceof Error ? error.message : String(error),
|
|
345
|
+
});
|
|
346
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
// ==================== dev_prompt_reset ====================
|
|
352
|
+
export const DevPromptResetParamsSchema = z.object({
|
|
353
|
+
namespace: z.string().optional().describe('Namespace of the prompt (defaults to your namespace)'),
|
|
354
|
+
key: z.string().min(1, 'Prompt key is required').describe('The prompt_key of the system prompt to reset'),
|
|
355
|
+
});
|
|
356
|
+
export function createDevPromptResetTool(options) {
|
|
357
|
+
const { client, logger, user_id } = options;
|
|
358
|
+
return {
|
|
359
|
+
name: 'dev_prompt_reset',
|
|
360
|
+
description: 'Resets a system dev prompt back to its original default body. Only works for system prompts — user prompts cannot be reset. Use after customizing a system prompt to revert to the original template.',
|
|
361
|
+
parameters: DevPromptResetParamsSchema,
|
|
362
|
+
async execute(params) {
|
|
363
|
+
const parseResult = DevPromptResetParamsSchema.safeParse(params);
|
|
364
|
+
if (!parseResult.success) {
|
|
365
|
+
const errorMessage = parseResult.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
|
|
366
|
+
return { success: false, error: errorMessage };
|
|
367
|
+
}
|
|
368
|
+
const { namespace, key } = parseResult.data;
|
|
369
|
+
logger.info('dev_prompt_reset invoked', { user_id, key });
|
|
370
|
+
try {
|
|
371
|
+
// Look up prompt by key
|
|
372
|
+
const queryParams = new URLSearchParams();
|
|
373
|
+
if (namespace)
|
|
374
|
+
queryParams.set('namespace', namespace);
|
|
375
|
+
const qs = queryParams.toString();
|
|
376
|
+
const lookupUrl = `/dev-prompts/by-key/${encodeURIComponent(key)}${qs ? `?${qs}` : ''}`;
|
|
377
|
+
const lookupResponse = await client.get(lookupUrl, { user_id });
|
|
378
|
+
if (!lookupResponse.success) {
|
|
379
|
+
if (lookupResponse.error.status === 404 || lookupResponse.error.code === 'NOT_FOUND') {
|
|
380
|
+
return { success: false, error: `Dev prompt "${key}" not found. Use dev_prompt_list to see available prompts.` };
|
|
381
|
+
}
|
|
382
|
+
return { success: false, error: lookupResponse.error.message || 'Failed to look up dev prompt' };
|
|
383
|
+
}
|
|
384
|
+
const prompt = lookupResponse.data;
|
|
385
|
+
// Call reset endpoint
|
|
386
|
+
const resetResponse = await client.post(`/dev-prompts/${prompt.id}/reset`, {}, { user_id });
|
|
387
|
+
if (!resetResponse.success) {
|
|
388
|
+
logger.error('dev_prompt_reset API error', { user_id, key, id: prompt.id, status: resetResponse.error.status });
|
|
389
|
+
return { success: false, error: resetResponse.error.message || 'Failed to reset dev prompt' };
|
|
390
|
+
}
|
|
391
|
+
const reset = resetResponse.data;
|
|
392
|
+
logger.debug('dev_prompt_reset completed', { user_id, key, id: prompt.id });
|
|
393
|
+
return {
|
|
394
|
+
success: true,
|
|
395
|
+
data: {
|
|
396
|
+
content: `Reset dev prompt \`${reset.prompt_key}\` — "${reset.title}" to its default body.`,
|
|
397
|
+
details: {
|
|
398
|
+
prompt_key: reset.prompt_key,
|
|
399
|
+
title: reset.title,
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
logger.error('dev_prompt_reset failed', {
|
|
406
|
+
user_id,
|
|
407
|
+
key,
|
|
408
|
+
error: error instanceof Error ? error.message : String(error),
|
|
409
|
+
});
|
|
410
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=dev-prompts.js.map
|