@troykelly/openclaw-projects 0.0.1
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/LICENSE +21 -0
- package/README.md +389 -0
- package/dist/api-client.d.ts +81 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +216 -0
- package/dist/api-client.js.map +1 -0
- package/dist/cli.d.ts +112 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +233 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +324 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +287 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +87 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +144 -0
- package/dist/context.js.map +1 -0
- package/dist/gateway/rpc-methods.d.ts +93 -0
- package/dist/gateway/rpc-methods.d.ts.map +1 -0
- package/dist/gateway/rpc-methods.js +145 -0
- package/dist/gateway/rpc-methods.js.map +1 -0
- package/dist/hooks.d.ts +86 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +314 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +106 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +221 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +78 -0
- package/dist/logger.js.map +1 -0
- package/dist/register-openclaw.d.ts +43 -0
- package/dist/register-openclaw.d.ts.map +1 -0
- package/dist/register-openclaw.js +1838 -0
- package/dist/register-openclaw.js.map +1 -0
- package/dist/secrets.d.ts +56 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +161 -0
- package/dist/secrets.js.map +1 -0
- package/dist/services/notification-service.d.ts +60 -0
- package/dist/services/notification-service.d.ts.map +1 -0
- package/dist/services/notification-service.js +145 -0
- package/dist/services/notification-service.js.map +1 -0
- package/dist/tools/contacts.d.ts +139 -0
- package/dist/tools/contacts.d.ts.map +1 -0
- package/dist/tools/contacts.js +333 -0
- package/dist/tools/contacts.js.map +1 -0
- package/dist/tools/email-send.d.ts +71 -0
- package/dist/tools/email-send.d.ts.map +1 -0
- package/dist/tools/email-send.js +132 -0
- package/dist/tools/email-send.js.map +1 -0
- package/dist/tools/file-share.d.ts +64 -0
- package/dist/tools/file-share.d.ts.map +1 -0
- package/dist/tools/file-share.js +133 -0
- package/dist/tools/file-share.js.map +1 -0
- package/dist/tools/index.d.ts +22 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory-forget.d.ts +69 -0
- package/dist/tools/memory-forget.d.ts.map +1 -0
- package/dist/tools/memory-forget.js +224 -0
- package/dist/tools/memory-forget.js.map +1 -0
- package/dist/tools/memory-recall.d.ts +82 -0
- package/dist/tools/memory-recall.d.ts.map +1 -0
- package/dist/tools/memory-recall.js +161 -0
- package/dist/tools/memory-recall.js.map +1 -0
- package/dist/tools/memory-store.d.ts +80 -0
- package/dist/tools/memory-store.d.ts.map +1 -0
- package/dist/tools/memory-store.js +172 -0
- package/dist/tools/memory-store.js.map +1 -0
- package/dist/tools/message-search.d.ts +85 -0
- package/dist/tools/message-search.d.ts.map +1 -0
- package/dist/tools/message-search.js +137 -0
- package/dist/tools/message-search.js.map +1 -0
- package/dist/tools/notebooks.d.ts +155 -0
- package/dist/tools/notebooks.d.ts.map +1 -0
- package/dist/tools/notebooks.js +287 -0
- package/dist/tools/notebooks.js.map +1 -0
- package/dist/tools/notes.d.ts +272 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +530 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/projects.d.ts +139 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +280 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/relationships.d.ts +133 -0
- package/dist/tools/relationships.d.ts.map +1 -0
- package/dist/tools/relationships.js +281 -0
- package/dist/tools/relationships.js.map +1 -0
- package/dist/tools/sms-send.d.ts +62 -0
- package/dist/tools/sms-send.d.ts.map +1 -0
- package/dist/tools/sms-send.js +121 -0
- package/dist/tools/sms-send.js.map +1 -0
- package/dist/tools/threads.d.ts +127 -0
- package/dist/tools/threads.d.ts.map +1 -0
- package/dist/tools/threads.js +202 -0
- package/dist/tools/threads.js.map +1 -0
- package/dist/tools/todos.d.ts +142 -0
- package/dist/tools/todos.d.ts.map +1 -0
- package/dist/tools/todos.js +308 -0
- package/dist/tools/todos.js.map +1 -0
- package/dist/types/openclaw-api.d.ts +215 -0
- package/dist/types/openclaw-api.d.ts.map +1 -0
- package/dist/types/openclaw-api.js +10 -0
- package/dist/types/openclaw-api.js.map +1 -0
- package/dist/utils/zod-to-json-schema.d.ts +19 -0
- package/dist/utils/zod-to-json-schema.d.ts.map +1 -0
- package/dist/utils/zod-to-json-schema.js +132 -0
- package/dist/utils/zod-to-json-schema.js.map +1 -0
- package/openclaw.plugin.json +229 -0
- package/package.json +69 -0
- package/skills/contact-lookup/SKILL.md +30 -0
- package/skills/daily-summary/SKILL.md +23 -0
- package/skills/project-status/SKILL.md +33 -0
- package/skills/send-reminder/SKILL.md +42 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project management tools implementation.
|
|
3
|
+
* Provides project_list, project_get, and project_create tools.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { ApiClient } from '../api-client.js';
|
|
7
|
+
import type { Logger } from '../logger.js';
|
|
8
|
+
import type { PluginConfig } from '../config.js';
|
|
9
|
+
/** Project status enum */
|
|
10
|
+
export declare const ProjectStatus: z.ZodEnum<["active", "completed", "archived"]>;
|
|
11
|
+
export type ProjectStatus = z.infer<typeof ProjectStatus>;
|
|
12
|
+
/** Parameters for project_list tool */
|
|
13
|
+
export declare const ProjectListParamsSchema: z.ZodObject<{
|
|
14
|
+
status: z.ZodOptional<z.ZodEnum<["active", "completed", "archived"]>>;
|
|
15
|
+
limit: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
offset: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
}, "strip", z.ZodTypeAny, {
|
|
18
|
+
status?: "active" | "completed" | "archived" | undefined;
|
|
19
|
+
limit?: number | undefined;
|
|
20
|
+
offset?: number | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
status?: "active" | "completed" | "archived" | undefined;
|
|
23
|
+
limit?: number | undefined;
|
|
24
|
+
offset?: number | undefined;
|
|
25
|
+
}>;
|
|
26
|
+
export type ProjectListParams = z.infer<typeof ProjectListParamsSchema>;
|
|
27
|
+
/** Project item from API */
|
|
28
|
+
export interface Project {
|
|
29
|
+
id: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
title?: string;
|
|
32
|
+
status?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
createdAt?: string;
|
|
35
|
+
updatedAt?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Successful list result */
|
|
38
|
+
export interface ProjectListSuccess {
|
|
39
|
+
success: true;
|
|
40
|
+
data: {
|
|
41
|
+
content: string;
|
|
42
|
+
details: {
|
|
43
|
+
projects: Project[];
|
|
44
|
+
total: number;
|
|
45
|
+
userId: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Failed result */
|
|
50
|
+
export interface ProjectFailure {
|
|
51
|
+
success: false;
|
|
52
|
+
error: string;
|
|
53
|
+
}
|
|
54
|
+
export type ProjectListResult = ProjectListSuccess | ProjectFailure;
|
|
55
|
+
/** Tool configuration */
|
|
56
|
+
export interface ProjectToolOptions {
|
|
57
|
+
client: ApiClient;
|
|
58
|
+
logger: Logger;
|
|
59
|
+
config: PluginConfig;
|
|
60
|
+
userId: string;
|
|
61
|
+
}
|
|
62
|
+
/** Tool definition */
|
|
63
|
+
export interface ProjectListTool {
|
|
64
|
+
name: string;
|
|
65
|
+
description: string;
|
|
66
|
+
parameters: typeof ProjectListParamsSchema;
|
|
67
|
+
execute: (params: ProjectListParams) => Promise<ProjectListResult>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Creates the project_list tool.
|
|
71
|
+
*/
|
|
72
|
+
export declare function createProjectListTool(options: ProjectToolOptions): ProjectListTool;
|
|
73
|
+
/** Parameters for project_get tool */
|
|
74
|
+
export declare const ProjectGetParamsSchema: z.ZodObject<{
|
|
75
|
+
id: z.ZodString;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
id: string;
|
|
78
|
+
}, {
|
|
79
|
+
id: string;
|
|
80
|
+
}>;
|
|
81
|
+
export type ProjectGetParams = z.infer<typeof ProjectGetParamsSchema>;
|
|
82
|
+
/** Successful get result */
|
|
83
|
+
export interface ProjectGetSuccess {
|
|
84
|
+
success: true;
|
|
85
|
+
data: {
|
|
86
|
+
content: string;
|
|
87
|
+
details: {
|
|
88
|
+
project: Project;
|
|
89
|
+
userId: string;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export type ProjectGetResult = ProjectGetSuccess | ProjectFailure;
|
|
94
|
+
export interface ProjectGetTool {
|
|
95
|
+
name: string;
|
|
96
|
+
description: string;
|
|
97
|
+
parameters: typeof ProjectGetParamsSchema;
|
|
98
|
+
execute: (params: ProjectGetParams) => Promise<ProjectGetResult>;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates the project_get tool.
|
|
102
|
+
*/
|
|
103
|
+
export declare function createProjectGetTool(options: ProjectToolOptions): ProjectGetTool;
|
|
104
|
+
/** Parameters for project_create tool */
|
|
105
|
+
export declare const ProjectCreateParamsSchema: z.ZodObject<{
|
|
106
|
+
name: z.ZodString;
|
|
107
|
+
description: z.ZodOptional<z.ZodString>;
|
|
108
|
+
}, "strip", z.ZodTypeAny, {
|
|
109
|
+
name: string;
|
|
110
|
+
description?: string | undefined;
|
|
111
|
+
}, {
|
|
112
|
+
name: string;
|
|
113
|
+
description?: string | undefined;
|
|
114
|
+
}>;
|
|
115
|
+
export type ProjectCreateParams = z.infer<typeof ProjectCreateParamsSchema>;
|
|
116
|
+
/** Successful create result */
|
|
117
|
+
export interface ProjectCreateSuccess {
|
|
118
|
+
success: true;
|
|
119
|
+
data: {
|
|
120
|
+
content: string;
|
|
121
|
+
details: {
|
|
122
|
+
id: string;
|
|
123
|
+
name: string;
|
|
124
|
+
userId: string;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
export type ProjectCreateResult = ProjectCreateSuccess | ProjectFailure;
|
|
129
|
+
export interface ProjectCreateTool {
|
|
130
|
+
name: string;
|
|
131
|
+
description: string;
|
|
132
|
+
parameters: typeof ProjectCreateParamsSchema;
|
|
133
|
+
execute: (params: ProjectCreateParams) => Promise<ProjectCreateResult>;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Creates the project_create tool.
|
|
137
|
+
*/
|
|
138
|
+
export declare function createProjectCreateTool(options: ProjectToolOptions): ProjectCreateTool;
|
|
139
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project management tools implementation.
|
|
3
|
+
* Provides project_list, project_get, and project_create tools.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/** UUID validation regex */
|
|
7
|
+
const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
/** Project status enum */
|
|
9
|
+
export const ProjectStatus = z.enum(['active', 'completed', 'archived']);
|
|
10
|
+
// ==================== project_list ====================
|
|
11
|
+
/** Parameters for project_list tool */
|
|
12
|
+
export const ProjectListParamsSchema = z.object({
|
|
13
|
+
status: ProjectStatus.optional(),
|
|
14
|
+
limit: z.number().int().min(1).max(100).optional(),
|
|
15
|
+
offset: z.number().int().min(0).optional(),
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Create a sanitized error message.
|
|
19
|
+
*/
|
|
20
|
+
function sanitizeErrorMessage(error) {
|
|
21
|
+
if (error instanceof Error) {
|
|
22
|
+
const message = error.message
|
|
23
|
+
.replace(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, '[host]')
|
|
24
|
+
.replace(/:\d{2,5}\b/g, '')
|
|
25
|
+
.replace(/\b(?:localhost|internal[-\w]*)\b/gi, '[internal]');
|
|
26
|
+
if (message.includes('[internal]') || message.includes('[host]')) {
|
|
27
|
+
return 'Operation failed. Please try again.';
|
|
28
|
+
}
|
|
29
|
+
return message;
|
|
30
|
+
}
|
|
31
|
+
return 'An unexpected error occurred.';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Strip HTML tags from a string.
|
|
35
|
+
* Also removes content inside script and style tags for security.
|
|
36
|
+
*/
|
|
37
|
+
function stripHtml(text) {
|
|
38
|
+
return text
|
|
39
|
+
.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
|
|
40
|
+
.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '')
|
|
41
|
+
.replace(/<[^>]*>/g, '')
|
|
42
|
+
.trim();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Truncate text for display.
|
|
46
|
+
*/
|
|
47
|
+
function truncate(text, maxLength = 100) {
|
|
48
|
+
if (text.length <= maxLength)
|
|
49
|
+
return text;
|
|
50
|
+
return text.substring(0, maxLength) + '...';
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates the project_list tool.
|
|
54
|
+
*/
|
|
55
|
+
export function createProjectListTool(options) {
|
|
56
|
+
const { client, logger, userId } = options;
|
|
57
|
+
return {
|
|
58
|
+
name: 'project_list',
|
|
59
|
+
description: 'List all projects. Optionally filter by status (active, completed, archived).',
|
|
60
|
+
parameters: ProjectListParamsSchema,
|
|
61
|
+
async execute(params) {
|
|
62
|
+
const parseResult = ProjectListParamsSchema.safeParse(params);
|
|
63
|
+
if (!parseResult.success) {
|
|
64
|
+
const errorMessage = parseResult.error.errors
|
|
65
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
66
|
+
.join(', ');
|
|
67
|
+
return { success: false, error: errorMessage };
|
|
68
|
+
}
|
|
69
|
+
const { status, limit = 20, offset = 0 } = parseResult.data;
|
|
70
|
+
logger.info('project_list invoked', { userId, status, limit, offset });
|
|
71
|
+
try {
|
|
72
|
+
const queryParams = new URLSearchParams({
|
|
73
|
+
type: 'project',
|
|
74
|
+
limit: String(limit),
|
|
75
|
+
offset: String(offset),
|
|
76
|
+
});
|
|
77
|
+
if (status) {
|
|
78
|
+
queryParams.set('status', status);
|
|
79
|
+
}
|
|
80
|
+
const response = await client.get(`/api/work-items?${queryParams.toString()}`, { userId });
|
|
81
|
+
if (!response.success) {
|
|
82
|
+
logger.error('project_list API error', {
|
|
83
|
+
userId,
|
|
84
|
+
status: response.error.status,
|
|
85
|
+
code: response.error.code,
|
|
86
|
+
});
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
error: response.error.message || 'Failed to list projects',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const projects = response.data.projects ?? response.data.items ?? [];
|
|
93
|
+
const total = response.data.total ?? projects.length;
|
|
94
|
+
if (projects.length === 0) {
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
data: {
|
|
98
|
+
content: 'No projects found.',
|
|
99
|
+
details: { projects: [], total: 0, userId },
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const content = projects
|
|
104
|
+
.map((p) => {
|
|
105
|
+
const name = p.name ?? p.title ?? 'Untitled';
|
|
106
|
+
const desc = p.description ? ` - ${truncate(p.description, 50)}` : '';
|
|
107
|
+
return `- **${name}** [${p.status ?? 'unknown'}]${desc}`;
|
|
108
|
+
})
|
|
109
|
+
.join('\n');
|
|
110
|
+
logger.debug('project_list completed', { userId, count: projects.length });
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
data: {
|
|
114
|
+
content,
|
|
115
|
+
details: { projects, total, userId },
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error('project_list failed', {
|
|
121
|
+
userId,
|
|
122
|
+
error: error instanceof Error ? error.message : String(error),
|
|
123
|
+
});
|
|
124
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// ==================== project_get ====================
|
|
130
|
+
/** Parameters for project_get tool */
|
|
131
|
+
export const ProjectGetParamsSchema = z.object({
|
|
132
|
+
id: z.string().min(1, 'Project ID is required'),
|
|
133
|
+
});
|
|
134
|
+
/**
|
|
135
|
+
* Creates the project_get tool.
|
|
136
|
+
*/
|
|
137
|
+
export function createProjectGetTool(options) {
|
|
138
|
+
const { client, logger, userId } = options;
|
|
139
|
+
return {
|
|
140
|
+
name: 'project_get',
|
|
141
|
+
description: 'Get details of a specific project by ID.',
|
|
142
|
+
parameters: ProjectGetParamsSchema,
|
|
143
|
+
async execute(params) {
|
|
144
|
+
const parseResult = ProjectGetParamsSchema.safeParse(params);
|
|
145
|
+
if (!parseResult.success) {
|
|
146
|
+
const errorMessage = parseResult.error.errors
|
|
147
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
148
|
+
.join(', ');
|
|
149
|
+
return { success: false, error: errorMessage };
|
|
150
|
+
}
|
|
151
|
+
const { id } = parseResult.data;
|
|
152
|
+
// Validate UUID format
|
|
153
|
+
if (!UUID_REGEX.test(id)) {
|
|
154
|
+
return { success: false, error: 'Invalid project ID format. Expected UUID.' };
|
|
155
|
+
}
|
|
156
|
+
logger.info('project_get invoked', { userId, projectId: id });
|
|
157
|
+
try {
|
|
158
|
+
const response = await client.get(`/api/work-items/${id}`, { userId });
|
|
159
|
+
if (!response.success) {
|
|
160
|
+
if (response.error.code === 'NOT_FOUND') {
|
|
161
|
+
return { success: false, error: 'Project not found.' };
|
|
162
|
+
}
|
|
163
|
+
logger.error('project_get API error', {
|
|
164
|
+
userId,
|
|
165
|
+
projectId: id,
|
|
166
|
+
status: response.error.status,
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
error: response.error.message || 'Failed to get project',
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const project = response.data;
|
|
174
|
+
const name = project.name ?? project.title ?? 'Untitled';
|
|
175
|
+
const content = `**${name}** [${project.status ?? 'unknown'}]\n\n${project.description ?? 'No description.'}`;
|
|
176
|
+
logger.debug('project_get completed', { userId, projectId: id });
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
data: {
|
|
180
|
+
content,
|
|
181
|
+
details: { project, userId },
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
logger.error('project_get failed', {
|
|
187
|
+
userId,
|
|
188
|
+
projectId: id,
|
|
189
|
+
error: error instanceof Error ? error.message : String(error),
|
|
190
|
+
});
|
|
191
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
// ==================== project_create ====================
|
|
197
|
+
/** Parameters for project_create tool */
|
|
198
|
+
export const ProjectCreateParamsSchema = z.object({
|
|
199
|
+
name: z
|
|
200
|
+
.string()
|
|
201
|
+
.min(1, 'Project name is required')
|
|
202
|
+
.max(200, 'Project name must be 200 characters or less'),
|
|
203
|
+
description: z
|
|
204
|
+
.string()
|
|
205
|
+
.max(2000, 'Description must be 2000 characters or less')
|
|
206
|
+
.optional(),
|
|
207
|
+
});
|
|
208
|
+
/**
|
|
209
|
+
* Creates the project_create tool.
|
|
210
|
+
*/
|
|
211
|
+
export function createProjectCreateTool(options) {
|
|
212
|
+
const { client, logger, userId } = options;
|
|
213
|
+
return {
|
|
214
|
+
name: 'project_create',
|
|
215
|
+
description: 'Create a new project.',
|
|
216
|
+
parameters: ProjectCreateParamsSchema,
|
|
217
|
+
async execute(params) {
|
|
218
|
+
const parseResult = ProjectCreateParamsSchema.safeParse(params);
|
|
219
|
+
if (!parseResult.success) {
|
|
220
|
+
const errorMessage = parseResult.error.errors
|
|
221
|
+
.map((e) => `${e.path.join('.')}: ${e.message}`)
|
|
222
|
+
.join(', ');
|
|
223
|
+
return { success: false, error: errorMessage };
|
|
224
|
+
}
|
|
225
|
+
const { name, description } = parseResult.data;
|
|
226
|
+
// Sanitize input
|
|
227
|
+
const sanitizedName = stripHtml(name);
|
|
228
|
+
const sanitizedDescription = description ? stripHtml(description) : undefined;
|
|
229
|
+
if (sanitizedName.length === 0) {
|
|
230
|
+
return { success: false, error: 'Project name cannot be empty after sanitization' };
|
|
231
|
+
}
|
|
232
|
+
logger.info('project_create invoked', {
|
|
233
|
+
userId,
|
|
234
|
+
nameLength: sanitizedName.length,
|
|
235
|
+
});
|
|
236
|
+
try {
|
|
237
|
+
const response = await client.post('/api/work-items', {
|
|
238
|
+
title: sanitizedName,
|
|
239
|
+
description: sanitizedDescription,
|
|
240
|
+
type: 'project',
|
|
241
|
+
}, { userId });
|
|
242
|
+
if (!response.success) {
|
|
243
|
+
logger.error('project_create API error', {
|
|
244
|
+
userId,
|
|
245
|
+
status: response.error.status,
|
|
246
|
+
code: response.error.code,
|
|
247
|
+
});
|
|
248
|
+
return {
|
|
249
|
+
success: false,
|
|
250
|
+
error: response.error.message || 'Failed to create project',
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const newProject = response.data;
|
|
254
|
+
logger.debug('project_create completed', {
|
|
255
|
+
userId,
|
|
256
|
+
projectId: newProject.id,
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
success: true,
|
|
260
|
+
data: {
|
|
261
|
+
content: `Created project "${sanitizedName}" (ID: ${newProject.id})`,
|
|
262
|
+
details: {
|
|
263
|
+
id: newProject.id,
|
|
264
|
+
name: sanitizedName,
|
|
265
|
+
userId,
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
logger.error('project_create failed', {
|
|
272
|
+
userId,
|
|
273
|
+
error: error instanceof Error ? error.message : String(error),
|
|
274
|
+
});
|
|
275
|
+
return { success: false, error: sanitizeErrorMessage(error) };
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Relationship management tools implementation.
|
|
3
|
+
* Provides relationship_set and relationship_query tools for OpenClaw agents.
|
|
4
|
+
* Part of Epic #486, Issue #494
|
|
5
|
+
*
|
|
6
|
+
* These tools give agents a simple interface to manage the relationship graph
|
|
7
|
+
* without needing to understand types, directionality, or inverses.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import type { ApiClient } from '../api-client.js';
|
|
11
|
+
import type { Logger } from '../logger.js';
|
|
12
|
+
import type { PluginConfig } from '../config.js';
|
|
13
|
+
/** Parameters for relationship_set tool */
|
|
14
|
+
export declare const RelationshipSetParamsSchema: z.ZodObject<{
|
|
15
|
+
contact_a: z.ZodString;
|
|
16
|
+
contact_b: z.ZodString;
|
|
17
|
+
relationship: z.ZodString;
|
|
18
|
+
notes: z.ZodOptional<z.ZodString>;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
contact_a: string;
|
|
21
|
+
contact_b: string;
|
|
22
|
+
relationship: string;
|
|
23
|
+
notes?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
contact_a: string;
|
|
26
|
+
contact_b: string;
|
|
27
|
+
relationship: string;
|
|
28
|
+
notes?: string | undefined;
|
|
29
|
+
}>;
|
|
30
|
+
export type RelationshipSetParams = z.infer<typeof RelationshipSetParamsSchema>;
|
|
31
|
+
/** Successful set result */
|
|
32
|
+
export interface RelationshipSetSuccess {
|
|
33
|
+
success: true;
|
|
34
|
+
data: {
|
|
35
|
+
content: string;
|
|
36
|
+
details: {
|
|
37
|
+
relationshipId: string;
|
|
38
|
+
created: boolean;
|
|
39
|
+
contactA: {
|
|
40
|
+
id: string;
|
|
41
|
+
displayName: string;
|
|
42
|
+
};
|
|
43
|
+
contactB: {
|
|
44
|
+
id: string;
|
|
45
|
+
displayName: string;
|
|
46
|
+
};
|
|
47
|
+
relationshipType: {
|
|
48
|
+
id: string;
|
|
49
|
+
name: string;
|
|
50
|
+
label: string;
|
|
51
|
+
};
|
|
52
|
+
userId: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Failed result */
|
|
57
|
+
export interface RelationshipFailure {
|
|
58
|
+
success: false;
|
|
59
|
+
error: string;
|
|
60
|
+
}
|
|
61
|
+
export type RelationshipSetResult = RelationshipSetSuccess | RelationshipFailure;
|
|
62
|
+
/** Tool configuration */
|
|
63
|
+
export interface RelationshipToolOptions {
|
|
64
|
+
client: ApiClient;
|
|
65
|
+
logger: Logger;
|
|
66
|
+
config: PluginConfig;
|
|
67
|
+
userId: string;
|
|
68
|
+
}
|
|
69
|
+
/** Tool definition */
|
|
70
|
+
export interface RelationshipSetTool {
|
|
71
|
+
name: string;
|
|
72
|
+
description: string;
|
|
73
|
+
parameters: typeof RelationshipSetParamsSchema;
|
|
74
|
+
execute: (params: RelationshipSetParams) => Promise<RelationshipSetResult>;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Creates the relationship_set tool.
|
|
78
|
+
* Records a relationship between two people, groups, or organisations.
|
|
79
|
+
* The system handles directionality and type matching automatically.
|
|
80
|
+
*/
|
|
81
|
+
export declare function createRelationshipSetTool(options: RelationshipToolOptions): RelationshipSetTool;
|
|
82
|
+
/** Parameters for relationship_query tool */
|
|
83
|
+
export declare const RelationshipQueryParamsSchema: z.ZodObject<{
|
|
84
|
+
contact: z.ZodString;
|
|
85
|
+
type_filter: z.ZodOptional<z.ZodString>;
|
|
86
|
+
}, "strip", z.ZodTypeAny, {
|
|
87
|
+
contact: string;
|
|
88
|
+
type_filter?: string | undefined;
|
|
89
|
+
}, {
|
|
90
|
+
contact: string;
|
|
91
|
+
type_filter?: string | undefined;
|
|
92
|
+
}>;
|
|
93
|
+
export type RelationshipQueryParams = z.infer<typeof RelationshipQueryParamsSchema>;
|
|
94
|
+
/** Related contact entry from API */
|
|
95
|
+
export interface RelatedContact {
|
|
96
|
+
contactId: string;
|
|
97
|
+
contactName: string;
|
|
98
|
+
contactKind: string;
|
|
99
|
+
relationshipId: string;
|
|
100
|
+
relationshipTypeName: string;
|
|
101
|
+
relationshipTypeLabel: string;
|
|
102
|
+
isDirectional: boolean;
|
|
103
|
+
notes: string | null;
|
|
104
|
+
}
|
|
105
|
+
/** Successful query result */
|
|
106
|
+
export interface RelationshipQuerySuccess {
|
|
107
|
+
success: true;
|
|
108
|
+
data: {
|
|
109
|
+
content: string;
|
|
110
|
+
details: {
|
|
111
|
+
contactId: string;
|
|
112
|
+
contactName: string;
|
|
113
|
+
relatedContacts: RelatedContact[];
|
|
114
|
+
userId: string;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export type RelationshipQueryResult = RelationshipQuerySuccess | RelationshipFailure;
|
|
119
|
+
/** Tool definition */
|
|
120
|
+
export interface RelationshipQueryTool {
|
|
121
|
+
name: string;
|
|
122
|
+
description: string;
|
|
123
|
+
parameters: typeof RelationshipQueryParamsSchema;
|
|
124
|
+
execute: (params: RelationshipQueryParams) => Promise<RelationshipQueryResult>;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Creates the relationship_query tool.
|
|
128
|
+
* Queries a contact's relationships, returning all connections
|
|
129
|
+
* including family, partners, group memberships, and professional links.
|
|
130
|
+
* Handles directional relationships automatically.
|
|
131
|
+
*/
|
|
132
|
+
export declare function createRelationshipQueryTool(options: RelationshipToolOptions): RelationshipQueryTool;
|
|
133
|
+
//# sourceMappingURL=relationships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../src/tools/relationships.ts"],"names":[],"mappings":"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"}
|