persona-core-opencode 1.0.0

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 (61) hide show
  1. package/dist/client/index.d.ts +5 -0
  2. package/dist/client/index.d.ts.map +1 -0
  3. package/dist/client/index.js +6 -0
  4. package/dist/client/index.js.map +1 -0
  5. package/dist/client/personaCoreClient.d.ts +102 -0
  6. package/dist/client/personaCoreClient.d.ts.map +1 -0
  7. package/dist/client/personaCoreClient.js +166 -0
  8. package/dist/client/personaCoreClient.js.map +1 -0
  9. package/dist/client/workflowHandle.d.ts +62 -0
  10. package/dist/client/workflowHandle.d.ts.map +1 -0
  11. package/dist/client/workflowHandle.js +100 -0
  12. package/dist/client/workflowHandle.js.map +1 -0
  13. package/dist/generators/index.d.ts +5 -0
  14. package/dist/generators/index.d.ts.map +1 -0
  15. package/dist/generators/index.js +5 -0
  16. package/dist/generators/index.js.map +1 -0
  17. package/dist/generators/toolFileGenerator.d.ts +15 -0
  18. package/dist/generators/toolFileGenerator.d.ts.map +1 -0
  19. package/dist/generators/toolFileGenerator.js +385 -0
  20. package/dist/generators/toolFileGenerator.js.map +1 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +26 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/persona/index.d.ts +5 -0
  26. package/dist/persona/index.d.ts.map +1 -0
  27. package/dist/persona/index.js +5 -0
  28. package/dist/persona/index.js.map +1 -0
  29. package/dist/persona/personaRegistry.d.ts +79 -0
  30. package/dist/persona/personaRegistry.d.ts.map +1 -0
  31. package/dist/persona/personaRegistry.js +151 -0
  32. package/dist/persona/personaRegistry.js.map +1 -0
  33. package/dist/session/index.d.ts +6 -0
  34. package/dist/session/index.d.ts.map +1 -0
  35. package/dist/session/index.js +6 -0
  36. package/dist/session/index.js.map +1 -0
  37. package/dist/session/sessionHandle.d.ts +82 -0
  38. package/dist/session/sessionHandle.d.ts.map +1 -0
  39. package/dist/session/sessionHandle.js +82 -0
  40. package/dist/session/sessionHandle.js.map +1 -0
  41. package/dist/session/sessionManager.d.ts +72 -0
  42. package/dist/session/sessionManager.d.ts.map +1 -0
  43. package/dist/session/sessionManager.js +300 -0
  44. package/dist/session/sessionManager.js.map +1 -0
  45. package/dist/types/common.d.ts +94 -0
  46. package/dist/types/common.d.ts.map +1 -0
  47. package/dist/types/common.js +5 -0
  48. package/dist/types/common.js.map +1 -0
  49. package/dist/types/index.d.ts +7 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +7 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/dist/types/nodes.d.ts +313 -0
  54. package/dist/types/nodes.d.ts.map +1 -0
  55. package/dist/types/nodes.js +5 -0
  56. package/dist/types/nodes.js.map +1 -0
  57. package/dist/types/persona.d.ts +58 -0
  58. package/dist/types/persona.d.ts.map +1 -0
  59. package/dist/types/persona.js +35 -0
  60. package/dist/types/persona.js.map +1 -0
  61. package/package.json +60 -0
@@ -0,0 +1,385 @@
1
+ /**
2
+ * Tool 文件生成器
3
+ * 将 ActionNodeType 转换为 opencode tool 文件内容
4
+ */
5
+ /**
6
+ * 生成 opencode tool 文件内容
7
+ */
8
+ export function generateToolFile(actionType, persona) {
9
+ const imports = generateImports(actionType);
10
+ const argsSchema = generateArgsSchema(actionType);
11
+ const executeBody = generateExecuteBody(actionType, persona);
12
+ return `${imports}
13
+
14
+ export default tool({
15
+ description: ${JSON.stringify(actionType.description || actionType.name)},
16
+ args: {
17
+ ${argsSchema}
18
+ },
19
+ async execute(args, context) {
20
+ ${executeBody}
21
+ },
22
+ });
23
+ `;
24
+ }
25
+ /**
26
+ * 生成导入语句
27
+ */
28
+ function generateImports(actionType) {
29
+ const imports = ['import { tool } from "@opencode-ai/plugin"'];
30
+ if (actionType.executionType === 'file_write' || actionType.executionType === 'file_read') {
31
+ imports.push('import * as fs from "fs/promises"');
32
+ imports.push('import * as path from "path"');
33
+ }
34
+ // API 调用可能需要保存文件
35
+ if (actionType.executionType === 'api_call' && actionType.apiConfig?.response?.saveToFile?.enabled) {
36
+ if (!imports.includes('import * as fs from "fs/promises"')) {
37
+ imports.push('import * as fs from "fs/promises"');
38
+ }
39
+ if (!imports.includes('import * as path from "path"')) {
40
+ imports.push('import * as path from "path"');
41
+ }
42
+ }
43
+ return imports.join('\n');
44
+ }
45
+ /**
46
+ * 生成参数 schema
47
+ */
48
+ function generateArgsSchema(actionType) {
49
+ const lines = [];
50
+ for (const field of actionType.inputFields) {
51
+ const schemaType = mapTypeHintToSchema(field.typeHint || 'string');
52
+ const optional = field.required ? '' : '.optional()';
53
+ const describe = field.description ? `.describe(${JSON.stringify(field.description)})` : '';
54
+ // Don't add () if schemaType already ends with () (like array(...) or object(...))
55
+ const schemaCall = schemaType.endsWith(')')
56
+ ? `tool.schema.${schemaType}`
57
+ : `tool.schema.${schemaType}()`;
58
+ lines.push(` ${field.name}: ${schemaCall}${optional}${describe},`);
59
+ }
60
+ return lines.join('\n');
61
+ }
62
+ /**
63
+ * 生成执行体代码
64
+ */
65
+ function generateExecuteBody(actionType, persona) {
66
+ switch (actionType.executionType) {
67
+ case 'api_call':
68
+ return generateApiCallBody(actionType);
69
+ case 'file_write':
70
+ return generateFileWriteBody(actionType);
71
+ case 'file_read':
72
+ return generateFileReadBody(actionType);
73
+ case 'http_request':
74
+ return generateHttpRequestBody(actionType);
75
+ case 'llm_call':
76
+ return generateLlmCallBody(actionType);
77
+ default:
78
+ return ` throw new Error('Unsupported execution type: ${actionType.executionType}');`;
79
+ }
80
+ }
81
+ /**
82
+ * 生成 API 调用执行体
83
+ */
84
+ function generateApiCallBody(actionType) {
85
+ const apiConfig = actionType.apiConfig;
86
+ if (!apiConfig) {
87
+ return ` throw new Error('Missing apiConfig for api_call action type: ${actionType.id}');`;
88
+ }
89
+ const method = apiConfig.method || 'GET';
90
+ const hasBody = ['POST', 'PUT', 'PATCH'].includes(method);
91
+ // 生成 headers 代码
92
+ let headersCode = '';
93
+ if (apiConfig.headers) {
94
+ if (apiConfig.headers.type === 'static' && apiConfig.headers.values) {
95
+ headersCode = `
96
+ const headers: Record<string, string> = ${JSON.stringify(apiConfig.headers.values)};`;
97
+ }
98
+ else if (apiConfig.headers.type === 'template' && apiConfig.headers.template) {
99
+ headersCode = `
100
+ // Template headers - render at runtime
101
+ const nunjucks = await import('nunjucks');
102
+ const headersTemplate = ${JSON.stringify(apiConfig.headers.template)};
103
+ const headersStr = nunjucks.renderString(headersTemplate, args);
104
+ const headers: Record<string, string> = JSON.parse(headersStr);`;
105
+ }
106
+ else {
107
+ headersCode = `
108
+ const headers: Record<string, string> = {};`;
109
+ }
110
+ // 添加 base headers
111
+ if (apiConfig.headers.base) {
112
+ headersCode += `
113
+ // Base headers
114
+ Object.assign(headers, ${JSON.stringify(apiConfig.headers.base)});`;
115
+ }
116
+ }
117
+ else {
118
+ headersCode = `
119
+ const headers: Record<string, string> = { 'Content-Type': 'application/json' };`;
120
+ }
121
+ // 生成 body 代码
122
+ let bodyCode = '';
123
+ if (hasBody && apiConfig.body) {
124
+ if (apiConfig.body.contentType === 'json') {
125
+ const includeFields = apiConfig.body.includeFields;
126
+ const excludeFields = apiConfig.body.excludeFields || [];
127
+ if (includeFields) {
128
+ const fieldsStr = includeFields.map(f => `${f}: args.${f}`).join(', ');
129
+ bodyCode = `
130
+ const body = JSON.stringify({ ${fieldsStr} });`;
131
+ }
132
+ else {
133
+ bodyCode = `
134
+ const body = JSON.stringify(Object.fromEntries(
135
+ Object.entries(args).filter(([k]) => !${JSON.stringify(excludeFields)}.includes(k))
136
+ ));`;
137
+ }
138
+ }
139
+ else if (apiConfig.body.contentType === 'template' && apiConfig.body.template) {
140
+ // 检查模板是否使用 Nunjucks 语法
141
+ const usesNunjucks = apiConfig.body.template.includes('{{') ||
142
+ apiConfig.body.template.includes('{%') ||
143
+ apiConfig.body.template.includes('{#');
144
+ if (usesNunjucks) {
145
+ bodyCode = `
146
+ // Render Nunjucks template
147
+ const nunjucks = await import('nunjucks');
148
+ const env = new nunjucks.Environment(null, { autoescape: false });
149
+ const bodyTemplate = ${JSON.stringify(apiConfig.body.template)};
150
+ const body = env.renderString(bodyTemplate, args);`;
151
+ }
152
+ else {
153
+ bodyCode = `
154
+ const bodyTemplate = ${JSON.stringify(apiConfig.body.template)};
155
+ const body = bodyTemplate.replace(/\\$\\{(\\w+)\\}/g, (_, key) => {
156
+ const value = args[key];
157
+ return typeof value === 'string' ? value : JSON.stringify(value);
158
+ });`;
159
+ }
160
+ }
161
+ else if (apiConfig.body.contentType === 'raw' && apiConfig.body.rawField) {
162
+ bodyCode = `
163
+ const body = String(args.${apiConfig.body.rawField});`;
164
+ }
165
+ }
166
+ // 生成 URL 替换代码
167
+ const urlCode = `
168
+ // Build URL with variable substitution
169
+ let url = ${JSON.stringify(apiConfig.url)};
170
+ url = url.replace(/\\$\\{(\\w+)\\}/g, (_, key) => {
171
+ const value = args[key as keyof typeof args];
172
+ return encodeURIComponent(String(value ?? ''));
173
+ });`;
174
+ // 生成 fetch 调用
175
+ let fetchCode = `
176
+ const response = await fetch(url, {
177
+ method: ${JSON.stringify(method)},
178
+ headers,${hasBody && apiConfig.body ? '\n body,' : ''}
179
+ });
180
+
181
+ if (!response.ok) {
182
+ const errorText = await response.text();
183
+ throw new Error(\`API call failed: \${response.status} \${response.statusText} - \${errorText}\`);
184
+ }`;
185
+ // 生成响应处理代码
186
+ let responseCode = '';
187
+ const responseConfig = apiConfig.response;
188
+ if (responseConfig?.type === 'text') {
189
+ responseCode = `
190
+ const result = await response.text();
191
+ return result;`;
192
+ }
193
+ else if (responseConfig?.type === 'binary') {
194
+ responseCode = `
195
+ const buffer = await response.arrayBuffer();
196
+ return Buffer.from(buffer).toString('base64');`;
197
+ }
198
+ else {
199
+ // JSON response (default)
200
+ // 添加 getByPath 辅助函数
201
+ const getByPathHelper = `
202
+ // Extract fields using JSONPath
203
+ function getByPath(obj: unknown, pathStr: string): unknown {
204
+ return pathStr.split('.').reduce((acc: unknown, key) => {
205
+ if (acc && typeof acc === 'object') {
206
+ // Handle array index like "0"
207
+ if (Array.isArray(acc) && /^\\d+$/.test(key)) {
208
+ return acc[parseInt(key, 10)];
209
+ }
210
+ if (key in acc) {
211
+ return (acc as Record<string, unknown>)[key];
212
+ }
213
+ }
214
+ return undefined;
215
+ }, obj);
216
+ }`;
217
+ // 检查是否需要保存文件
218
+ if (responseConfig?.saveToFile?.enabled) {
219
+ const saveConfig = responseConfig.saveToFile;
220
+ responseCode = `
221
+ const data = await response.json();
222
+ ${getByPathHelper}
223
+
224
+ // Extract and save file
225
+ const filePath = args.${saveConfig.pathField} as string;
226
+ const rawImageData = getByPath(data, ${JSON.stringify(saveConfig.dataPath)});
227
+
228
+ // Handle different response formats
229
+ let imageDataStr: string | null = null;
230
+ if (typeof rawImageData === 'string') {
231
+ imageDataStr = rawImageData;
232
+ } else if (rawImageData && typeof rawImageData === 'object' && 'url' in rawImageData) {
233
+ // Handle object with url property
234
+ imageDataStr = (rawImageData as { url: string }).url;
235
+ }
236
+
237
+ if (imageDataStr) {
238
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
239
+
240
+ ${saveConfig.dataFormat === 'base64' ? `
241
+ // Handle base64 data URI
242
+ let base64Data = imageDataStr;
243
+ if (imageDataStr.startsWith('data:')) {
244
+ // Remove data URI prefix (e.g., "data:image/png;base64,")
245
+ base64Data = imageDataStr.split(',')[1] || imageDataStr;
246
+ }
247
+ const buffer = Buffer.from(base64Data, 'base64');
248
+ await fs.writeFile(filePath, buffer);
249
+ ` : `
250
+ await fs.writeFile(filePath, imageDataStr, 'utf8');
251
+ `}
252
+
253
+ return JSON.stringify({
254
+ success: true,
255
+ ${saveConfig.outputField || 'savedFilePath'}: filePath,
256
+ message: 'File saved successfully',
257
+ });
258
+ } else {
259
+ return JSON.stringify({
260
+ success: false,
261
+ error: 'No data found at path: ${saveConfig.dataPath}',
262
+ extractedValue: rawImageData,
263
+ rawResponse: JSON.stringify(data).substring(0, 500),
264
+ });
265
+ }`;
266
+ }
267
+ else if (responseConfig?.extract) {
268
+ const extractCode = Object.entries(responseConfig.extract)
269
+ .map(([key, p]) => ` ${key}: getByPath(data, ${JSON.stringify(p)})`)
270
+ .join(',\n');
271
+ responseCode = `
272
+ const data = await response.json();
273
+ ${getByPathHelper}
274
+
275
+ const result = {
276
+ ${extractCode}
277
+ };
278
+ return JSON.stringify(result, null, 2);`;
279
+ }
280
+ else {
281
+ responseCode = `
282
+ const result = await response.json();
283
+ return JSON.stringify(result, null, 2);`;
284
+ }
285
+ }
286
+ return ` // API Call: ${actionType.name}${urlCode}${headersCode}${bodyCode}${fetchCode}${responseCode}`;
287
+ }
288
+ /**
289
+ * 生成文件写入执行体
290
+ */
291
+ function generateFileWriteBody(actionType) {
292
+ return ` // File Write: ${actionType.name}
293
+ const filePath = args.filePath as string;
294
+ const content = args.content as string;
295
+
296
+ // Ensure directory exists
297
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
298
+
299
+ // Write file
300
+ await fs.writeFile(filePath, content, 'utf8');
301
+
302
+ const stats = await fs.stat(filePath);
303
+
304
+ return JSON.stringify({
305
+ success: true,
306
+ filePath,
307
+ bytesWritten: stats.size,
308
+ });`;
309
+ }
310
+ /**
311
+ * 生成文件读取执行体
312
+ */
313
+ function generateFileReadBody(actionType) {
314
+ return ` // File Read: ${actionType.name}
315
+ const filePath = args.filePath as string;
316
+
317
+ const content = await fs.readFile(filePath, 'utf8');
318
+ const stats = await fs.stat(filePath);
319
+
320
+ return JSON.stringify({
321
+ success: true,
322
+ filePath,
323
+ content,
324
+ fileSize: stats.size,
325
+ });`;
326
+ }
327
+ /**
328
+ * 生成 HTTP 请求执行体
329
+ */
330
+ function generateHttpRequestBody(actionType) {
331
+ // Similar to api_call but more generic
332
+ return generateApiCallBody(actionType);
333
+ }
334
+ /**
335
+ * 生成 LLM 调用执行体
336
+ */
337
+ function generateLlmCallBody(actionType) {
338
+ return ` // LLM Call: ${actionType.name}
339
+ // This should be handled by the opencode agent itself
340
+ // Returning the prompt for the agent to process
341
+ const prompt = args.prompt as string;
342
+ return JSON.stringify({
343
+ type: 'llm_request',
344
+ prompt,
345
+ message: 'This action requires LLM processing. The agent should handle this.',
346
+ });`;
347
+ }
348
+ /**
349
+ * 将 typeHint 映射到 zod schema 类型
350
+ */
351
+ function mapTypeHintToSchema(typeHint) {
352
+ // Handle basic types
353
+ switch (typeHint.toLowerCase()) {
354
+ case 'number':
355
+ return 'number';
356
+ case 'boolean':
357
+ return 'boolean';
358
+ case 'array':
359
+ return 'array(tool.schema.unknown())';
360
+ case 'object':
361
+ return 'object({}).passthrough()';
362
+ default:
363
+ // Check for array syntax
364
+ if (typeHint.startsWith('Array<') || typeHint.endsWith('[]')) {
365
+ return 'array(tool.schema.unknown())';
366
+ }
367
+ // Check for object syntax
368
+ if (typeHint.startsWith('{')) {
369
+ return 'object({}).passthrough()';
370
+ }
371
+ return 'string';
372
+ }
373
+ }
374
+ /**
375
+ * 生成 tool 文件名
376
+ */
377
+ export function getToolFileName(actionType) {
378
+ // Convert id to snake_case filename
379
+ return actionType.id
380
+ .replace(/([A-Z])/g, '_$1')
381
+ .toLowerCase()
382
+ .replace(/^_/, '')
383
+ .replace(/-/g, '_');
384
+ }
385
+ //# sourceMappingURL=toolFileGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolFileGenerator.js","sourceRoot":"","sources":["../../src/generators/toolFileGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * persona-core-opencode
3
+ *
4
+ * 使用 opencode 作为执行引擎的 PersonaCore 实现。
5
+ *
6
+ * 核心概念:
7
+ * - PersonaCoreClient: 主要的客户端 API,提供 Persona 管理和消息发送功能
8
+ * - Persona: 人格/角色定义,包含 SystemPrompt 和可用的 ActionTypes
9
+ * - ActionNodeType: 动作节点类型定义,如 API 调用、文件读写等
10
+ */
11
+ export { PersonaCoreClient, PersonaCoreClientConfig, SendMessageOptions, } from './client/personaCoreClient.js';
12
+ export { Persona, CreatePersonaInput, findActionType, validatePersonaActionTypes, } from './types/persona.js';
13
+ export { ActionNodeType, ThinkingNodeType, BranchNodeType, NodeType, } from './types/nodes.js';
14
+ export { PersonaId, NodeId, } from './types/common.js';
15
+ export { SessionExecutionResult, ToolCallRecord, } from './session/sessionHandle.js';
16
+ export { PersonaRegistry, RegisteredPersona } from './persona/personaRegistry.js';
17
+ export { SessionManager } from './session/sessionManager.js';
18
+ export { generateToolFile, getToolFileName } from './generators/toolFileGenerator.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAOvC,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,SAAS,EACT,MAAM,GACP,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * persona-core-opencode
3
+ *
4
+ * 使用 opencode 作为执行引擎的 PersonaCore 实现。
5
+ *
6
+ * 核心概念:
7
+ * - PersonaCoreClient: 主要的客户端 API,提供 Persona 管理和消息发送功能
8
+ * - Persona: 人格/角色定义,包含 SystemPrompt 和可用的 ActionTypes
9
+ * - ActionNodeType: 动作节点类型定义,如 API 调用、文件读写等
10
+ */
11
+ // ============================================================
12
+ // 主要导出:PersonaCoreClient
13
+ // ============================================================
14
+ export { PersonaCoreClient, } from './client/personaCoreClient.js';
15
+ // ============================================================
16
+ // 类型定义
17
+ // ============================================================
18
+ // Persona 相关类型
19
+ export { findActionType, validatePersonaActionTypes, } from './types/persona.js';
20
+ // ============================================================
21
+ // 内部实现(仅供高级用户使用,不保证 API 稳定性)
22
+ // ============================================================
23
+ export { PersonaRegistry } from './persona/personaRegistry.js';
24
+ export { SessionManager } from './session/sessionManager.js';
25
+ export { generateToolFile, getToolFileName } from './generators/toolFileGenerator.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+DAA+D;AAC/D,yBAAyB;AACzB,+DAA+D;AAC/D,OAAO,EACL,iBAAiB,GAGlB,MAAM,+BAA+B,CAAC;AAEvC,+DAA+D;AAC/D,OAAO;AACP,+DAA+D;AAE/D,eAAe;AACf,OAAO,EAGL,cAAc,EACd,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAsB5B,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAqB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Persona module exports
3
+ */
4
+ export * from './personaRegistry.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persona/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Persona module exports
3
+ */
4
+ export * from './personaRegistry.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/persona/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Persona 注册器
3
+ * 负责注册 Persona、创建工作目录、生成 tool 文件
4
+ */
5
+ import { Persona, CreatePersonaInput } from '../types/persona.js';
6
+ /**
7
+ * 已注册的 Persona 信息
8
+ */
9
+ export interface RegisteredPersona {
10
+ /** 唯一标识符 */
11
+ id: string;
12
+ /** 原始 Persona 定义 */
13
+ persona: Persona;
14
+ /** 工作目录路径 */
15
+ workspacePath: string;
16
+ /** .opencode/tools/ 路径 */
17
+ toolsPath: string;
18
+ /** 创建时间 */
19
+ createdAt: Date;
20
+ }
21
+ /**
22
+ * PersonaRegistry 配置
23
+ */
24
+ export interface PersonaRegistryConfig {
25
+ /** 工作空间根目录 */
26
+ workspaceRoot?: string;
27
+ }
28
+ /**
29
+ * Persona 注册器
30
+ */
31
+ export declare class PersonaRegistry {
32
+ private workspaceRoot;
33
+ private registeredPersonas;
34
+ constructor(config?: PersonaRegistryConfig);
35
+ /**
36
+ * 注册 Persona
37
+ * 1. 生成唯一 ID
38
+ * 2. 创建工作目录
39
+ * 3. 生成 tool 文件
40
+ */
41
+ registerPersona(input: CreatePersonaInput): Promise<string>;
42
+ /**
43
+ * 直接注册已有的 Persona 对象
44
+ */
45
+ registerExistingPersona(persona: Persona): Promise<string>;
46
+ /**
47
+ * 获取已注册的 Persona
48
+ */
49
+ getPersona(personaId: string): RegisteredPersona | undefined;
50
+ /**
51
+ * 获取所有已注册的 Persona
52
+ */
53
+ getAllPersonas(): RegisteredPersona[];
54
+ /**
55
+ * 检查 Persona 是否已注册
56
+ */
57
+ hasPersona(personaId: string): boolean;
58
+ /**
59
+ * 删除已注册的 Persona(包括工作目录)
60
+ */
61
+ unregisterPersona(personaId: string): Promise<boolean>;
62
+ /**
63
+ * 清理所有工作目录
64
+ */
65
+ cleanup(): Promise<void>;
66
+ /**
67
+ * 获取工作空间根目录
68
+ */
69
+ getWorkspaceRoot(): string;
70
+ /**
71
+ * 生成唯一 ID
72
+ */
73
+ private generateId;
74
+ /**
75
+ * 生成 Persona 唯一 ID
76
+ */
77
+ private generatePersonaId;
78
+ }
79
+ //# sourceMappingURL=personaRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personaRegistry.d.ts","sourceRoot":"","sources":["../../src/persona/personaRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGlE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW;IACX,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,cAAc;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAA6C;gBAE3D,MAAM,GAAE,qBAA0B;IAI9C;;;;;OAKG;IACG,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IA6DjE;;OAEG;IACG,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAUhE;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI5D;;OAEG;IACH,cAAc,IAAI,iBAAiB,EAAE;IAIrC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB5D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK1B"}