@pellux/goodvibes-agent 1.1.4 → 1.1.6

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.
@@ -55,12 +55,15 @@ function buildLeftRows(workspace: AgentWorkspace, height: number): WorkspaceRow[
55
55
  }
56
56
 
57
57
  function actionCommand(action: AgentWorkspaceAction): string {
58
- if (action.kind === 'workspace') return action.targetCategoryId ? `open ${action.targetCategoryId}` : '(workspace)';
59
- if (action.kind === 'editor') return action.editorKind ? `edit ${action.editorKind}` : '(editor)';
60
- if (action.kind === 'setting') return action.settingKey ? `set ${action.settingKey}` : 'set setting';
58
+ if (action.kind === 'workspace') return 'open area';
59
+ if (action.kind === 'editor') return action.editorKind ? `edit ${action.editorKind}` : 'edit form';
60
+ if (action.kind === 'setting') return action.settingKey ? `setting ${action.settingKey}` : 'setting';
61
61
  if (action.kind === 'settings-import') return 'import GoodVibes settings';
62
+ if (action.kind === 'model-picker') return action.modelPickerFlow === 'model' ? 'model picker' : 'provider/model picker';
63
+ if (action.kind === 'settings-modal') return action.settingsTarget ? `settings ${action.settingsTarget}` : 'settings';
62
64
  if (action.kind === 'local-selection') return action.selectionDelta && action.selectionDelta < 0 ? 'select previous' : 'select next';
63
65
  if (action.kind === 'local-operation') return action.localOperation ?? '(local action)';
66
+ if (action.kind === 'onboarding-complete') return 'apply and close';
64
67
  return action.command ?? '(guidance)';
65
68
  }
66
69
 
@@ -83,6 +86,11 @@ function setupStatusLabel(status: AgentWorkspaceRuntimeSnapshot['setupChecklist'
83
86
  : 'Optional';
84
87
  }
85
88
 
89
+ function formatMegabytes(bytes: number): string {
90
+ if (!Number.isFinite(bytes) || bytes <= 0) return '0 MB';
91
+ return `${Math.round(bytes / (1024 * 1024))} MB`;
92
+ }
93
+
86
94
  function compactText(text: string, maxWidth = 104): string {
87
95
  const normalized = text.replace(/\s+/g, ' ').trim();
88
96
  if (normalized.length === 0) return '';
@@ -291,6 +299,63 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
291
299
  base.push(
292
300
  ...setupOverviewLines(snapshot),
293
301
  );
302
+ } else if (category.id === 'account-model') {
303
+ base.push(
304
+ { text: `Chat route: ${snapshot.provider} / ${snapshot.modelDisplayName}`, fg: PALETTE.info },
305
+ { text: `Subscriptions: ${snapshot.activeSubscriptionCount} active; ${snapshot.pendingSubscriptionCount} pending; ${snapshot.availableSubscriptionProviderCount} available.`, fg: snapshot.activeSubscriptionCount > 0 ? PALETTE.good : snapshot.pendingSubscriptionCount > 0 ? PALETTE.warn : PALETTE.muted },
306
+ { text: `Embedding: ${snapshot.embeddingProvider}; reasoning ${snapshot.reasoningEffort}.`, fg: PALETTE.info },
307
+ { text: `Helper: ${snapshot.helperEnabled ? 'enabled' : 'disabled'}; Tool LLM: ${snapshot.toolLlmEnabled ? 'enabled' : 'disabled'}.`, fg: snapshot.helperEnabled || snapshot.toolLlmEnabled ? PALETTE.good : PALETTE.muted },
308
+ { text: `Cache: ${snapshot.cacheEnabled ? snapshot.cacheStableTtl : 'off'}; monitor ${snapshot.cacheMonitorHitRate ? snapshot.cacheHitRateWarningThreshold : 'off'}; failure hints ${snapshot.providerFailureHints ? 'on' : 'off'}.`, fg: snapshot.cacheEnabled ? PALETTE.info : PALETTE.muted },
309
+ );
310
+ } else if (category.id === 'assistant-behavior') {
311
+ base.push(
312
+ { text: `Interaction: ${snapshot.hitlMode}; guidance ${snapshot.guidanceMode}; history ${snapshot.saveHistory ? 'saved' : 'off'}.`, fg: PALETTE.info },
313
+ { text: `Context: compact at ${snapshot.autoCompactThreshold}; stale warnings ${snapshot.staleContextWarnings ? 'on' : 'off'}.`, fg: PALETTE.info },
314
+ { text: `Reasoning display: thinking ${snapshot.showThinking ? 'on' : 'off'}; summaries ${snapshot.showReasoningSummary ? 'on' : 'off'}.`, fg: PALETTE.muted },
315
+ );
316
+ } else if (category.id === 'tools-permissions') {
317
+ base.push(
318
+ { text: `Permission mode: ${snapshot.permissionMode}.`, fg: snapshot.permissionMode === 'allow-all' ? PALETTE.warn : PALETTE.info },
319
+ { text: `Auto-approve ${snapshot.autoApprove ? 'on' : 'off'}; tool auto-heal ${snapshot.toolAutoHeal ? 'on' : 'off'}; token budget ${snapshot.toolsDefaultTokenBudget}.`, fg: snapshot.autoApprove ? PALETTE.warn : PALETTE.info },
320
+ { text: `Artifact limit ${formatMegabytes(snapshot.artifactMaxBytes)}; raw prompt telemetry ${snapshot.rawPromptTelemetry ? 'on' : 'off'}.`, fg: snapshot.rawPromptTelemetry ? PALETTE.warn : PALETTE.muted },
321
+ { text: `MCP servers: ${snapshot.mcpConnectedServerCount}/${snapshot.mcpServerCount} connected; quarantined ${snapshot.mcpQuarantinedServerCount}.`, fg: snapshot.mcpQuarantinedServerCount > 0 ? PALETTE.warn : PALETTE.info },
322
+ { text: 'MCP and secret setup use forms; selecting a row does not run arbitrary tools.', fg: PALETTE.good },
323
+ );
324
+ } else if (category.id === 'onboarding-display') {
325
+ base.push(
326
+ { text: `Theme: ${snapshot.theme}; streaming ${snapshot.stream ? 'on' : 'off'}; line numbers ${snapshot.lineNumbers}.`, fg: PALETTE.info },
327
+ { text: `Messages: operational ${snapshot.operationalMessages}; system ${snapshot.systemMessages}.`, fg: PALETTE.info },
328
+ { text: `Release channel: ${snapshot.releaseChannel}.`, fg: PALETTE.muted },
329
+ );
330
+ } else if (category.id === 'onboarding-channels') {
331
+ const enabledCount = snapshot.channels.filter((channel) => channel.enabled).length;
332
+ const readyCount = snapshot.channels.filter((channel) => channel.ready).length;
333
+ const needsConfig = snapshot.channels.filter((channel) => channel.setupState === 'needs-config');
334
+ const needsTarget = snapshot.channels.filter((channel) => channel.setupState === 'needs-target');
335
+ base.push(
336
+ { text: `Channels: ${readyCount}/${snapshot.channels.length} ready; ${enabledCount} enabled.`, fg: enabledCount > 0 ? PALETTE.info : PALETTE.muted },
337
+ { text: `Needs config: ${needsConfig.length}; needs target: ${needsTarget.length}.`, fg: needsConfig.length > 0 || needsTarget.length > 0 ? PALETTE.warn : PALETTE.good },
338
+ { text: 'Enable only the channels you want; hidden channel fields appear after the channel is enabled.', fg: PALETTE.good },
339
+ );
340
+ } else if (category.id === 'onboarding-voice-media') {
341
+ const readiness = snapshot.voiceMediaReadiness;
342
+ base.push(
343
+ { text: `Voice: ${snapshot.voiceSurfaceEnabled ? 'enabled' : 'disabled'}; TTS ${snapshot.ttsProvider}; voice ${snapshot.ttsVoice}.`, fg: snapshot.voiceSurfaceEnabled ? PALETTE.good : PALETTE.info },
344
+ { text: `Media readiness: ${readiness.readyMediaProviderCount}/${snapshot.mediaProviderCount}; generation providers ${snapshot.mediaGenerationProviderCount}.`, fg: readiness.readyMediaProviderCount > 0 ? PALETTE.good : PALETTE.muted },
345
+ { text: `Telephony channel: ${snapshot.channels.find((channel) => channel.id === 'telephony')?.setupState ?? 'disabled'}.`, fg: PALETTE.info },
346
+ );
347
+ } else if (category.id === 'onboarding-context') {
348
+ base.push(
349
+ { text: `Local context: ${snapshot.localMemoryCount} memories, ${snapshot.localNoteCount} notes, ${snapshot.localPersonaCount} personas.`, fg: PALETTE.info },
350
+ { text: `Skills: ${snapshot.enabledSkillCount}/${snapshot.localSkillCount} enabled; routines ${snapshot.enabledRoutineCount}/${snapshot.localRoutineCount} enabled.`, fg: PALETTE.info },
351
+ { text: `Discovered files: personas ${snapshot.discoveredBehavior.personas.count}, skills ${snapshot.discoveredBehavior.skills.count}, routines ${snapshot.discoveredBehavior.routines.count}.`, fg: PALETTE.muted },
352
+ );
353
+ } else if (category.id === 'onboarding-automation') {
354
+ base.push(
355
+ { text: `Automation: ${snapshot.automationEnabled ? 'enabled' : 'disabled'}; max ${snapshot.automationMaxConcurrentRuns} concurrent; history ${snapshot.automationRunHistoryLimit}.`, fg: snapshot.automationEnabled ? PALETTE.good : PALETTE.muted },
356
+ { text: `Timeout ${snapshot.automationDefaultTimeoutMs} ms; catch-up ${snapshot.automationCatchUpWindowMinutes} min; cooldown ${snapshot.automationFailureCooldownMs} ms.`, fg: PALETTE.info },
357
+ { text: `Delete one-shot jobs after success: ${snapshot.automationDeleteAfterRun ? 'yes' : 'no'}.`, fg: snapshot.automationDeleteAfterRun ? PALETTE.info : PALETTE.muted },
358
+ );
294
359
  } else if (category.id === 'artifacts') {
295
360
  const mediaReady = snapshot.voiceMediaReadiness.readyMediaProviderCount;
296
361
  base.push(
@@ -16,8 +16,8 @@ function normalizeFullscreenViewport(lines: readonly Line[], width: number, heig
16
16
  return viewport;
17
17
  }
18
18
 
19
- export function createAgentWorkspaceFullscreenComposite(
20
- workspace: AgentWorkspace,
19
+ export function createFullscreenCompositeFromLines(
20
+ lines: readonly Line[],
21
21
  width: number,
22
22
  height: number,
23
23
  ): CompositeRequest {
@@ -25,9 +25,17 @@ export function createAgentWorkspaceFullscreenComposite(
25
25
  width,
26
26
  height,
27
27
  header: [],
28
- viewport: normalizeFullscreenViewport(renderAgentWorkspace(workspace, width, height), width, height),
28
+ viewport: normalizeFullscreenViewport(lines, width, height),
29
29
  footer: [],
30
30
  forceFullRedraw: true,
31
31
  panelWidth: 0,
32
32
  };
33
33
  }
34
+
35
+ export function createAgentWorkspaceFullscreenComposite(
36
+ workspace: AgentWorkspace,
37
+ width: number,
38
+ height: number,
39
+ ): CompositeRequest {
40
+ return createFullscreenCompositeFromLines(renderAgentWorkspace(workspace, width, height), width, height);
41
+ }
package/src/version.ts CHANGED
@@ -6,7 +6,7 @@ import { join } from 'node:path';
6
6
  // The prebuild script updates the fallback value before compilation.
7
7
  // Uses import.meta.dir (Bun) to locate package.json relative to this file,
8
8
  // which is correct regardless of the process working directory.
9
- let _version = '1.1.4';
9
+ let _version = '1.1.6';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
12
12
  readonly version?: unknown;