@johpaz/hive-core 1.0.6 → 1.0.7

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.
@@ -0,0 +1,171 @@
1
+ import type { Tool } from "./registry.ts";
2
+ import type { WorkspaceLoader } from "../agent/workspace";
3
+
4
+ export function createWorkspaceTools(loader: WorkspaceLoader): Tool[] {
5
+ return [
6
+ {
7
+ name: "workspace_read",
8
+ description:
9
+ "Lee el contenido actual de SOUL.md (tu identidad), " +
10
+ "USER.md (contexto del usuario) o ETHICS.md (lineamientos éticos). " +
11
+ "Usa esta herramienta cuando necesites consultar tu configuración actual " +
12
+ "o verificar qué información tienes sobre el usuario.",
13
+ parameters: {
14
+ type: "object",
15
+ properties: {
16
+ file: {
17
+ type: "string",
18
+ enum: ["soul", "user", "ethics"],
19
+ description:
20
+ "soul = tu identidad y personalidad, " +
21
+ "user = información sobre el usuario, " +
22
+ "ethics = lineamientos éticos (solo lectura)",
23
+ },
24
+ },
25
+ required: ["file"],
26
+ },
27
+ execute: async (params: Record<string, unknown>) => {
28
+ const file = params.file as "soul" | "user" | "ethics";
29
+ const content = await loader.read(file);
30
+ return {
31
+ file,
32
+ content,
33
+ length: content.length,
34
+ };
35
+ },
36
+ },
37
+
38
+ {
39
+ name: "workspace_write",
40
+ description:
41
+ "Reescribe completamente SOUL.md o USER.md. " +
42
+ "Usa esta herramienta solo cuando necesites hacer cambios extensos. " +
43
+ "Para cambios pequeños, usa workspace_patch en su lugar. " +
44
+ "NUNCA puedes escribir en ETHICS.md.",
45
+ parameters: {
46
+ type: "object",
47
+ properties: {
48
+ file: {
49
+ type: "string",
50
+ enum: ["soul", "user"],
51
+ description: "El archivo a escribir. ETHICS.md no está permitido.",
52
+ },
53
+ content: {
54
+ type: "string",
55
+ description: "El contenido completo del archivo en formato Markdown.",
56
+ },
57
+ reason: {
58
+ type: "string",
59
+ description:
60
+ "Razón del cambio. Se registra en los logs. " +
61
+ "Ej: 'Usuario indicó nueva ubicación'",
62
+ },
63
+ },
64
+ required: ["file", "content", "reason"],
65
+ },
66
+ execute: async (params: Record<string, unknown>) => {
67
+ const file = params.file as "soul" | "user";
68
+ const content = params.content as string;
69
+ const reason = params.reason as string;
70
+ await loader.write(file, content);
71
+ return {
72
+ ok: true,
73
+ file,
74
+ reason,
75
+ savedAt: new Date().toISOString(),
76
+ message: `${file}.md actualizado correctamente`,
77
+ };
78
+ },
79
+ },
80
+
81
+ {
82
+ name: "workspace_patch",
83
+ description:
84
+ "Modifica una sección específica de SOUL.md o USER.md " +
85
+ "sin reescribir el archivo completo. " +
86
+ "Esta es la herramienta preferida para cambios pequeños y precisos. " +
87
+ "La sección se identifica por su encabezado Markdown (## Sección). " +
88
+ "Si la sección no existe, se crea al final del archivo.",
89
+ parameters: {
90
+ type: "object",
91
+ properties: {
92
+ file: {
93
+ type: "string",
94
+ enum: ["soul", "user"],
95
+ description: "El archivo a modificar.",
96
+ },
97
+ section: {
98
+ type: "string",
99
+ description:
100
+ "El nombre de la sección a modificar, sin los ## del encabezado. " +
101
+ "Ej: 'Ubicación', 'Preferencias', 'Trabajo'",
102
+ },
103
+ newContent: {
104
+ type: "string",
105
+ description: "El nuevo contenido de esa sección en Markdown.",
106
+ },
107
+ reason: {
108
+ type: "string",
109
+ description: "Razón del cambio para el registro de logs.",
110
+ },
111
+ },
112
+ required: ["file", "section", "newContent", "reason"],
113
+ },
114
+ execute: async (params: Record<string, unknown>) => {
115
+ const file = params.file as "soul" | "user";
116
+ const section = params.section as string;
117
+ const newContent = params.newContent as string;
118
+ const reason = params.reason as string;
119
+ await loader.patch(file, section, newContent);
120
+ return {
121
+ ok: true,
122
+ file,
123
+ section,
124
+ reason,
125
+ savedAt: new Date().toISOString(),
126
+ message: `Sección "${section}" de ${file}.md actualizada`,
127
+ };
128
+ },
129
+ },
130
+
131
+ {
132
+ name: "workspace_append",
133
+ description:
134
+ "Añade nueva información a una sección de USER.md " +
135
+ "sin eliminar el contenido existente. " +
136
+ "Ideal para acumular información sobre el usuario con el tiempo.",
137
+ parameters: {
138
+ type: "object",
139
+ properties: {
140
+ section: {
141
+ type: "string",
142
+ description: "El nombre de la sección donde añadir la información.",
143
+ },
144
+ content: {
145
+ type: "string",
146
+ description: "La información a añadir.",
147
+ },
148
+ reason: {
149
+ type: "string",
150
+ description: "Por qué se añade esta información.",
151
+ },
152
+ },
153
+ required: ["section", "content", "reason"],
154
+ },
155
+ execute: async (params: Record<string, unknown>) => {
156
+ const section = params.section as string;
157
+ const content = params.content as string;
158
+ const reason = params.reason as string;
159
+ await loader.append("user", section, content);
160
+ return {
161
+ ok: true,
162
+ file: "user",
163
+ section,
164
+ reason,
165
+ savedAt: new Date().toISOString(),
166
+ message: `Información añadida a la sección "${section}" de USER.md`,
167
+ };
168
+ },
169
+ },
170
+ ];
171
+ }