@pellux/goodvibes-sdk 0.26.0 → 0.26.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.
Files changed (36) hide show
  1. package/dist/_internal/contracts/artifacts/operator-contract.json +388 -361
  2. package/dist/_internal/contracts/generated/foundation-client-types.d.ts +7 -1
  3. package/dist/_internal/contracts/generated/foundation-client-types.d.ts.map +1 -1
  4. package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
  5. package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
  6. package/dist/_internal/contracts/generated/operator-contract.d.ts.map +1 -1
  7. package/dist/_internal/contracts/generated/operator-contract.js +388 -361
  8. package/dist/_internal/daemon/runtime-session-routes.d.ts.map +1 -1
  9. package/dist/_internal/daemon/runtime-session-routes.js +3 -2
  10. package/dist/_internal/platform/agents/orchestrator-runner.d.ts.map +1 -1
  11. package/dist/_internal/platform/agents/orchestrator-runner.js +2 -1
  12. package/dist/_internal/platform/agents/orchestrator.d.ts +1 -0
  13. package/dist/_internal/platform/agents/orchestrator.d.ts.map +1 -1
  14. package/dist/_internal/platform/channels/builtin/homeassistant.d.ts.map +1 -1
  15. package/dist/_internal/platform/channels/builtin/homeassistant.js +11 -0
  16. package/dist/_internal/platform/companion/companion-chat-manager.d.ts.map +1 -1
  17. package/dist/_internal/platform/companion/companion-chat-manager.js +2 -1
  18. package/dist/_internal/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  19. package/dist/_internal/platform/control-plane/method-catalog-control-core.js +4 -3
  20. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.d.ts +4 -0
  21. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  22. package/dist/_internal/platform/control-plane/operator-contract-schemas-runtime.js +11 -0
  23. package/dist/_internal/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  24. package/dist/_internal/platform/core/orchestrator-turn-loop.js +2 -1
  25. package/dist/_internal/platform/permissions/manager.d.ts.map +1 -1
  26. package/dist/_internal/platform/permissions/manager.js +4 -0
  27. package/dist/_internal/platform/runtime/services.d.ts.map +1 -1
  28. package/dist/_internal/platform/runtime/services.js +1 -0
  29. package/dist/_internal/platform/tools/goodvibes-runtime/index.d.ts +23 -0
  30. package/dist/_internal/platform/tools/goodvibes-runtime/index.d.ts.map +1 -0
  31. package/dist/_internal/platform/tools/goodvibes-runtime/index.js +400 -0
  32. package/dist/_internal/platform/tools/index.d.ts +3 -1
  33. package/dist/_internal/platform/tools/index.d.ts.map +1 -1
  34. package/dist/_internal/platform/tools/index.js +15 -0
  35. package/dist/_internal/platform/version.js +1 -1
  36. package/package.json +1 -1
@@ -0,0 +1,400 @@
1
+ import { isValidConfigKey } from '../../config/schema.js';
2
+ import { CloudflareControlPlaneManager } from '../../cloudflare/manager.js';
3
+ import { summarizeError } from '../../utils/error-display.js';
4
+ export const GOODVIBES_RUNTIME_AWARENESS_PROMPT = [
5
+ 'You are running inside a GoodVibes host surface such as the TUI, daemon, companion app, Home Assistant, ntfy, Slack, or another configured client.',
6
+ 'Do not guess local settings, configured integrations, current provider/model, available tools, or host capabilities.',
7
+ 'For questions about GoodVibes settings, configured surfaces, available integrations, local harness state, Home Assistant, Cloudflare, ntfy, Slack, providers, models, tools, or what this runtime can do, call the goodvibes_context tool first.',
8
+ 'Do not spawn agents or WRFC chains for ordinary questions, environment inspection, or research that can be answered with direct tools in the current turn. Use agent/WRFC tools only when the user explicitly asks for delegated implementation, review, or multi-agent work.',
9
+ 'Use goodvibes_settings only when the user explicitly asks you to change a setting. Never reveal raw secrets; report only redacted credential posture.',
10
+ ].join('\n');
11
+ export function appendGoodVibesRuntimeAwarenessPrompt(systemPrompt) {
12
+ const base = systemPrompt?.trim() ?? '';
13
+ if (base.includes('goodvibes_context'))
14
+ return base;
15
+ return base ? `${base}\n\n${GOODVIBES_RUNTIME_AWARENESS_PROMPT}` : GOODVIBES_RUNTIME_AWARENESS_PROMPT;
16
+ }
17
+ export function createGoodVibesContextTool(deps) {
18
+ const definition = {
19
+ name: 'goodvibes_context',
20
+ description: 'Inspect the current GoodVibes runtime and host harness. Use before answering questions about settings, configured integrations, surfaces, providers, models, tools, Home Assistant, Cloudflare, ntfy, Slack, companion apps, or daemon/TUI capabilities. Returns redacted config only.',
21
+ parameters: {
22
+ type: 'object',
23
+ properties: {
24
+ mode: {
25
+ type: 'string',
26
+ enum: ['summary', 'config_get', 'config_schema', 'integrations', 'tools', 'cloudflare_status', 'cloudflare_token_requirements'],
27
+ },
28
+ key: { type: 'string' },
29
+ category: { type: 'string' },
30
+ prefix: { type: 'string' },
31
+ surface: { type: 'string' },
32
+ includeSchema: { type: 'boolean' },
33
+ includeParameters: { type: 'boolean' },
34
+ includeBootstrap: { type: 'boolean' },
35
+ components: { type: 'object', additionalProperties: { type: 'boolean' } },
36
+ limit: { type: 'number' },
37
+ },
38
+ required: ['mode'],
39
+ additionalProperties: false,
40
+ },
41
+ sideEffects: ['state'],
42
+ concurrency: 'parallel',
43
+ };
44
+ async function execute(args) {
45
+ try {
46
+ const mode = readString(args.mode);
47
+ switch (mode) {
48
+ case 'summary':
49
+ return ok(await buildRuntimeSummary(deps));
50
+ case 'config_get':
51
+ return ok(buildConfigSnapshot(deps, args));
52
+ case 'config_schema':
53
+ return ok(buildConfigSchema(deps, args));
54
+ case 'integrations':
55
+ return ok(await buildIntegrationSnapshot(deps, args));
56
+ case 'tools':
57
+ return ok(buildToolSnapshot(deps, args));
58
+ case 'cloudflare_status':
59
+ return ok({ cloudflare: redactCloudflareStatus(await createCloudflareManager(deps).describeStatus()) });
60
+ case 'cloudflare_token_requirements':
61
+ return ok({
62
+ cloudflare: createCloudflareManager(deps).tokenRequirements({
63
+ components: readComponents(args.components),
64
+ includeBootstrap: args.includeBootstrap === true,
65
+ }),
66
+ });
67
+ default:
68
+ return { success: false, error: `Unknown goodvibes_context mode: ${String(args.mode)}` };
69
+ }
70
+ }
71
+ catch (error) {
72
+ return { success: false, error: summarizeError(error) };
73
+ }
74
+ }
75
+ return { definition, execute };
76
+ }
77
+ export function createGoodVibesSettingsTool(deps) {
78
+ const definition = {
79
+ name: 'goodvibes_settings',
80
+ description: 'Change GoodVibes settings through the SDK config manager. Use only when the user explicitly asks to set or reset a setting. Raw secret/token/password values are rejected; store secrets separately and set settings to secret references.',
81
+ parameters: {
82
+ type: 'object',
83
+ properties: {
84
+ mode: { type: 'string', enum: ['set', 'reset'] },
85
+ key: { type: 'string' },
86
+ value: {},
87
+ confirm: { type: 'boolean' },
88
+ },
89
+ required: ['mode', 'key', 'confirm'],
90
+ additionalProperties: false,
91
+ },
92
+ sideEffects: ['state'],
93
+ concurrency: 'serial',
94
+ };
95
+ async function execute(args) {
96
+ try {
97
+ if (args.confirm !== true) {
98
+ return { success: false, error: 'Set confirm=true to change GoodVibes settings.' };
99
+ }
100
+ const key = readString(args.key);
101
+ if (!key || !isValidConfigKey(key)) {
102
+ return { success: false, error: `Unknown config key: ${key || '<missing>'}` };
103
+ }
104
+ const previous = deps.configManager.get(key);
105
+ if (args.mode === 'reset') {
106
+ deps.configManager.reset(key);
107
+ return ok({
108
+ key,
109
+ action: 'reset',
110
+ previous: redactConfigValue(key, previous),
111
+ current: redactConfigValue(key, deps.configManager.get(key)),
112
+ });
113
+ }
114
+ if (args.mode !== 'set') {
115
+ return { success: false, error: `Unknown goodvibes_settings mode: ${String(args.mode)}` };
116
+ }
117
+ if (isSensitiveConfigKey(key) && rejectsRawSecretValue(args.value)) {
118
+ return {
119
+ success: false,
120
+ error: `Refusing to persist a raw credential in ${key}. Store it as a GoodVibes secret and set this key to a goodvibes:// secret reference.`,
121
+ };
122
+ }
123
+ deps.configManager.setDynamic(key, args.value);
124
+ return ok({
125
+ key,
126
+ action: 'set',
127
+ previous: redactConfigValue(key, previous),
128
+ current: redactConfigValue(key, deps.configManager.get(key)),
129
+ });
130
+ }
131
+ catch (error) {
132
+ return { success: false, error: summarizeError(error) };
133
+ }
134
+ }
135
+ return { definition, execute };
136
+ }
137
+ async function buildRuntimeSummary(deps) {
138
+ const currentModel = safeCall(() => deps.providerRegistry.getCurrentModel());
139
+ const cloudflareStatus = await safeAsync(() => createCloudflareManager(deps).describeStatus());
140
+ const channels = await safeAsync(async () => ({
141
+ descriptors: deps.channelRegistry?.listDescriptors() ?? [],
142
+ status: deps.channelRegistry ? await deps.channelRegistry.listStatus() : [],
143
+ }));
144
+ return {
145
+ runtime: {
146
+ surfaceRoot: deps.surfaceRoot,
147
+ workingDirectory: deps.workingDirectory,
148
+ homeDirectory: deps.homeDirectory ?? null,
149
+ },
150
+ provider: currentModel
151
+ ? {
152
+ current: {
153
+ id: currentModel.id,
154
+ provider: currentModel.provider,
155
+ registryKey: currentModel.registryKey ?? `${currentModel.provider}:${currentModel.id}`,
156
+ displayName: currentModel.displayName,
157
+ },
158
+ providerCount: deps.providerRegistry.listProviders().length,
159
+ modelCount: deps.providerRegistry.listModels().length,
160
+ configuredProviderIds: deps.providerRegistry.getConfiguredProviderIds(),
161
+ }
162
+ : null,
163
+ settings: {
164
+ keyCount: deps.configManager.getSchema().length,
165
+ categories: listConfigCategories(deps.configManager.getSchema()),
166
+ readTool: 'goodvibes_context',
167
+ writeTool: 'goodvibes_settings',
168
+ secrets: 'redacted',
169
+ },
170
+ integrations: {
171
+ channels: channels.value ?? channels.error,
172
+ cloudflare: cloudflareStatus.value ? redactCloudflareStatus(cloudflareStatus.value) : { error: cloudflareStatus.error },
173
+ batch: {
174
+ mode: deps.configManager.get('batch.mode'),
175
+ queueBackend: deps.configManager.get('batch.queueBackend'),
176
+ },
177
+ tts: {
178
+ provider: deps.configManager.get('tts.provider'),
179
+ voice: deps.configManager.get('tts.voice') ? 'configured' : 'default',
180
+ },
181
+ },
182
+ tools: {
183
+ count: deps.toolRegistry.list().length,
184
+ names: deps.toolRegistry.list().map((tool) => tool.definition.name).sort(),
185
+ },
186
+ };
187
+ }
188
+ function buildConfigSnapshot(deps, args) {
189
+ const schema = selectSchema(deps.configManager.getSchema(), args);
190
+ return {
191
+ settings: schema.map((setting) => describeSetting(deps.configManager, setting, args.includeSchema !== false)),
192
+ redaction: 'Values whose key or content looks like a credential are redacted. Raw secrets are never returned.',
193
+ };
194
+ }
195
+ function buildConfigSchema(deps, args) {
196
+ return {
197
+ settings: selectSchema(deps.configManager.getSchema(), args).map((setting) => ({
198
+ key: setting.key,
199
+ category: setting.key.split('.')[0],
200
+ type: setting.type,
201
+ default: redactConfigValue(setting.key, setting.default),
202
+ description: setting.description,
203
+ ...(setting.enumValues ? { enumValues: setting.enumValues } : {}),
204
+ })),
205
+ };
206
+ }
207
+ async function buildIntegrationSnapshot(deps, args) {
208
+ const surface = readString(args.surface);
209
+ const channelRegistry = deps.channelRegistry ?? null;
210
+ const channels = channelRegistry
211
+ ? {
212
+ descriptors: channelRegistry.listDescriptors().filter((entry) => !surface || entry.surface === surface),
213
+ status: (await channelRegistry.listStatus()).filter((entry) => !surface || entry.surface === surface),
214
+ capabilities: await channelRegistry.listCapabilities(surface),
215
+ tools: await channelRegistry.listTools(surface),
216
+ }
217
+ : null;
218
+ const services = deps.serviceRegistry
219
+ ? await inspectServices(deps.serviceRegistry)
220
+ : [];
221
+ return {
222
+ channels,
223
+ services,
224
+ cloudflare: redactCloudflareStatus(await createCloudflareManager(deps).describeStatus()),
225
+ configuredSurfaces: listSurfaceConfig(deps.configManager),
226
+ };
227
+ }
228
+ function buildToolSnapshot(deps, args) {
229
+ const includeParameters = args.includeParameters === true;
230
+ const limit = clampLimit(args.limit, 250, 1000);
231
+ const tools = deps.toolRegistry.list()
232
+ .map((tool) => ({
233
+ name: tool.definition.name,
234
+ description: tool.definition.description,
235
+ sideEffects: tool.definition.sideEffects ?? [],
236
+ concurrency: tool.definition.concurrency ?? 'parallel',
237
+ supportsProgress: tool.definition.supportsProgress ?? false,
238
+ supportsStreamingOutput: tool.definition.supportsStreamingOutput ?? false,
239
+ ...(includeParameters ? { parameters: tool.definition.parameters } : {}),
240
+ }))
241
+ .sort((a, b) => a.name.localeCompare(b.name))
242
+ .slice(0, limit);
243
+ return { tools, returned: tools.length, total: deps.toolRegistry.list().length };
244
+ }
245
+ function describeSetting(configManager, setting, includeSchema) {
246
+ const value = safeCall(() => configManager.get(setting.key));
247
+ return {
248
+ key: setting.key,
249
+ category: setting.key.split('.')[0],
250
+ value: redactConfigValue(setting.key, value),
251
+ configured: !valuesEqual(value, setting.default),
252
+ ...(includeSchema
253
+ ? {
254
+ type: setting.type,
255
+ default: redactConfigValue(setting.key, setting.default),
256
+ description: setting.description,
257
+ ...(setting.enumValues ? { enumValues: setting.enumValues } : {}),
258
+ }
259
+ : {}),
260
+ };
261
+ }
262
+ function selectSchema(schema, args) {
263
+ const key = readString(args.key);
264
+ if (key)
265
+ return isValidConfigKey(key) ? schema.filter((setting) => setting.key === key) : [];
266
+ const prefix = readString(args.prefix);
267
+ const category = readString(args.category);
268
+ return schema.filter((setting) => {
269
+ if (prefix && !setting.key.startsWith(prefix))
270
+ return false;
271
+ if (category && setting.key.split('.')[0] !== category)
272
+ return false;
273
+ return true;
274
+ });
275
+ }
276
+ function listConfigCategories(schema) {
277
+ return [...new Set(schema.map((setting) => setting.key.split('.')[0]))].sort();
278
+ }
279
+ function listSurfaceConfig(configManager) {
280
+ const surfaces = new Map();
281
+ for (const setting of configManager.getSchema()) {
282
+ const match = /^surfaces\.([^.]+)\.(.+)$/.exec(setting.key);
283
+ if (!match)
284
+ continue;
285
+ const [, surface, field] = match;
286
+ const entry = surfaces.get(surface) ?? { surface, settings: {} };
287
+ const settings = entry.settings;
288
+ settings[field] = redactConfigValue(setting.key, configManager.get(setting.key));
289
+ surfaces.set(surface, entry);
290
+ }
291
+ return [...surfaces.values()].sort((a, b) => String(a.surface).localeCompare(String(b.surface)));
292
+ }
293
+ async function inspectServices(serviceRegistry) {
294
+ const services = serviceRegistry.getAll();
295
+ const records = [];
296
+ for (const [id, config] of Object.entries(services)) {
297
+ const inspection = await serviceRegistry.inspect(id);
298
+ records.push({
299
+ id,
300
+ name: config.name || id,
301
+ authType: config.authType,
302
+ baseUrl: config.baseUrl ?? null,
303
+ hasPrimaryCredential: inspection?.hasPrimaryCredential ?? false,
304
+ hasWebhookUrl: inspection?.hasWebhookUrl ?? false,
305
+ hasSigningSecret: inspection?.hasSigningSecret ?? false,
306
+ hasAppToken: inspection?.hasAppToken ?? false,
307
+ });
308
+ }
309
+ return records.sort((a, b) => String(a.id).localeCompare(String(b.id)));
310
+ }
311
+ function createCloudflareManager(deps) {
312
+ return new CloudflareControlPlaneManager({
313
+ configManager: deps.configManager,
314
+ secretsManager: deps.secretsManager ?? null,
315
+ });
316
+ }
317
+ function redactCloudflareStatus(status) {
318
+ const record = status && typeof status === 'object' ? status : {};
319
+ return {
320
+ ...record,
321
+ config: redactObjectByPath('cloudflare', record.config),
322
+ };
323
+ }
324
+ function redactObjectByPath(prefix, value) {
325
+ if (!value || typeof value !== 'object')
326
+ return value;
327
+ if (Array.isArray(value))
328
+ return value.map((entry, index) => redactObjectByPath(`${prefix}.${index}`, entry));
329
+ const out = {};
330
+ for (const [key, entry] of Object.entries(value)) {
331
+ out[key] = redactConfigValue(`${prefix}.${key}`, entry);
332
+ }
333
+ return out;
334
+ }
335
+ function redactConfigValue(key, value) {
336
+ if (!isSensitiveConfigKey(key) && !looksLikeSecretValue(value))
337
+ return value;
338
+ if (value === null || value === undefined || value === '') {
339
+ return { redacted: true, configured: false };
340
+ }
341
+ return {
342
+ redacted: true,
343
+ configured: true,
344
+ source: typeof value === 'string' && value.startsWith('goodvibes://') ? 'goodvibes-secret-ref' : 'credential-like-value',
345
+ };
346
+ }
347
+ function isSensitiveConfigKey(key) {
348
+ return /(api[_-]?key|token|secret|password|passwd|private[_-]?key|authorization|credential|accessToken|botToken|appToken|signingSecret|webhookSecret)/i.test(key);
349
+ }
350
+ function looksLikeSecretValue(value) {
351
+ if (typeof value !== 'string')
352
+ return false;
353
+ return /\b(Bearer\s+[A-Za-z0-9._-]{12,}|ghp_[A-Za-z0-9]{20,}|sk-[A-Za-z0-9]{12,}|xox[baprs]-[A-Za-z0-9-]{10,})\b/.test(value);
354
+ }
355
+ function rejectsRawSecretValue(value) {
356
+ if (typeof value !== 'string')
357
+ return value !== '' && value !== null && value !== undefined;
358
+ if (!value.trim())
359
+ return false;
360
+ return !value.trim().startsWith('goodvibes://');
361
+ }
362
+ function readComponents(value) {
363
+ if (!value || typeof value !== 'object' || Array.isArray(value))
364
+ return undefined;
365
+ const components = {};
366
+ for (const [key, raw] of Object.entries(value)) {
367
+ if (typeof raw === 'boolean')
368
+ components[key] = raw;
369
+ }
370
+ return components;
371
+ }
372
+ function ok(value) {
373
+ return { success: true, output: JSON.stringify(value, null, 2) };
374
+ }
375
+ function readString(value) {
376
+ return typeof value === 'string' ? value.trim() : '';
377
+ }
378
+ function clampLimit(value, fallback, max) {
379
+ const parsed = typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : fallback;
380
+ return Math.max(1, Math.min(max, Number.isFinite(parsed) ? Math.trunc(parsed) : fallback));
381
+ }
382
+ function valuesEqual(a, b) {
383
+ return JSON.stringify(a) === JSON.stringify(b);
384
+ }
385
+ function safeCall(fn) {
386
+ try {
387
+ return fn();
388
+ }
389
+ catch {
390
+ return null;
391
+ }
392
+ }
393
+ async function safeAsync(fn) {
394
+ try {
395
+ return { value: await fn() };
396
+ }
397
+ catch (error) {
398
+ return { error: summarizeError(error) };
399
+ }
400
+ }
@@ -19,6 +19,7 @@ import { CrossSessionTaskRegistry } from '../sessions/orchestration/index.js';
19
19
  import type { SandboxSessionRegistry } from '../runtime/sandbox/session-registry.js';
20
20
  import type { FeatureFlagManager } from '../runtime/feature-flags/index.js';
21
21
  import type { ServiceRegistry } from '../config/service-registry.js';
22
+ import type { SecretsManager } from '../config/secrets.js';
22
23
  import { OverflowHandler } from './shared/overflow.js';
23
24
  import type { SessionChangeTracker } from '../sessions/change-tracker.js';
24
25
  import type { ArchetypeLoader } from '../agents/archetypes.js';
@@ -52,7 +53,8 @@ export declare function registerAllTools(registry: ToolRegistry, deps?: {
52
53
  providerRegistry?: ProviderRegistry;
53
54
  toolLLM?: ToolLLM;
54
55
  featureFlags?: Pick<FeatureFlagManager, 'isEnabled'> | null;
55
- serviceRegistry?: Pick<ServiceRegistry, 'resolveAuth'> | null;
56
+ serviceRegistry?: Pick<ServiceRegistry, 'resolveAuth' | 'getAll' | 'inspect'> | null;
57
+ secretsManager?: Pick<SecretsManager, 'get' | 'set' | 'getGlobalHome'> | null;
56
58
  overflowHandler?: OverflowHandler;
57
59
  changeTracker?: SessionChangeTracker;
58
60
  }): {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/tools/index.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,7 @@ import { ProcessManager } from './shared/process-manager.js';
33
33
  import { AgentMessageBus } from '../agents/message-bus.js';
34
34
  import { CrossSessionTaskRegistry } from '../sessions/orchestration/index.js';
35
35
  import { OverflowHandler } from './shared/overflow.js';
36
+ import { createGoodVibesContextTool, createGoodVibesSettingsTool, } from './goodvibes-runtime/index.js';
36
37
  export function registerToolWithContractGate(registry, tool, featureFlags) {
37
38
  const verifyContracts = featureFlags?.isEnabled('tool-contract-verification') ?? true;
38
39
  if (!verifyContracts) {
@@ -93,6 +94,20 @@ export function registerAllTools(registry, deps) {
93
94
  const registerTool = (tool) => {
94
95
  registerToolWithContractGate(registry, tool, deps.featureFlags);
95
96
  };
97
+ registerTool(createGoodVibesContextTool({
98
+ configManager: deps.configManager,
99
+ providerRegistry: deps.providerRegistry,
100
+ toolRegistry: registry,
101
+ channelRegistry,
102
+ serviceRegistry: deps.serviceRegistry,
103
+ secretsManager: deps.secretsManager ?? null,
104
+ workingDirectory,
105
+ homeDirectory: deps.configManager.getHomeDirectory() ?? undefined,
106
+ surfaceRoot: deps.surfaceRoot,
107
+ }));
108
+ registerTool(createGoodVibesSettingsTool({
109
+ configManager: deps.configManager,
110
+ }));
96
111
  registerTool(new ReadTool(projectIndex, fileCache));
97
112
  registerTool(createWriteTool({
98
113
  projectRoot: workingDirectory,
@@ -1,6 +1,6 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- let version = '0.26.0';
3
+ let version = '0.26.1';
4
4
  try {
5
5
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
6
6
  version = pkg.version ?? version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-sdk",
3
- "version": "0.26.0",
3
+ "version": "0.26.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/mgd34msu/goodvibes-sdk.git"