@pellux/goodvibes-agent 1.0.42 → 1.0.43

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/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  Product-facing release notes for GoodVibes Agent.
4
4
 
5
+ ## 1.0.43 - 2026-06-05
6
+
7
+ - Keep the Agent Home and Setup workspace top pane compact so setup actions stay visible.
8
+ - Replace noisy setup checklist route text with a concise setup overview and selected-action detail.
9
+ - Add renderer coverage for compact setup layout and removed arrow-style checklist output.
10
+
5
11
  ## 1.0.42 - 2026-06-05
6
12
 
7
13
  - Make /agent the sole fullscreen Agent workspace for setup and onboarding entrypoints.
@@ -450372,23 +450372,6 @@ function createSchema2(db) {
450372
450372
  `);
450373
450373
  db.run(`CREATE INDEX IF NOT EXISTS idx_knowledge_schedules_job_id ON knowledge_schedules(job_id)`);
450374
450374
  }
450375
- function getKnowledgeSchemaStatements() {
450376
- const statements = [];
450377
- createSchema2({
450378
- run(sql) {
450379
- const normalized = sql.trim();
450380
- if (normalized.length > 0)
450381
- statements.push(normalized);
450382
- }
450383
- });
450384
- return statements;
450385
- }
450386
- function renderKnowledgeSchemaSql() {
450387
- return `${getKnowledgeSchemaStatements().map((statement) => statement.endsWith(";") ? statement : `${statement};`).join(`
450388
-
450389
- `)}
450390
- `;
450391
- }
450392
450375
  function rowObject(columns, values2) {
450393
450376
  return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
450394
450377
  }
@@ -763671,9 +763654,6 @@ var init_ingest = __esm(() => {
763671
763654
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
763672
763655
  var init_browser_history = __esm(() => {
763673
763656
  init_ingest();
763674
- init_discover();
763675
- init_readers();
763676
- init_paths2();
763677
763657
  });
763678
763658
 
763679
763659
  // node_modules/graphql/jsutils/devAssert.mjs
@@ -781313,7 +781293,6 @@ var init_semantic = __esm(() => {
781313
781293
  init_llm();
781314
781294
  init_gap_repair();
781315
781295
  init_service4();
781316
- init_self_improvement();
781317
781296
  });
781318
781297
 
781319
781298
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
@@ -785282,40 +785261,8 @@ var init_map_view = __esm(() => {
785282
785261
  });
785283
785262
 
785284
785263
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
785285
- var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
785264
+ var HOME_GRAPH_CAPABILITIES;
785286
785265
  var init_types15 = __esm(() => {
785287
- HOME_GRAPH_NODE_KINDS = [
785288
- "ha_home",
785289
- "ha_entity",
785290
- "ha_device",
785291
- "ha_area",
785292
- "ha_automation",
785293
- "ha_script",
785294
- "ha_scene",
785295
- "ha_label",
785296
- "ha_integration",
785297
- "ha_room",
785298
- "ha_device_passport",
785299
- "ha_maintenance_item",
785300
- "ha_troubleshooting_case",
785301
- "ha_purchase",
785302
- "ha_network_node"
785303
- ];
785304
- HOME_GRAPH_RELATIONS = [
785305
- "controls",
785306
- "located_in",
785307
- "belongs_to_device",
785308
- "has_manual",
785309
- "has_receipt",
785310
- "has_warranty",
785311
- "has_issue",
785312
- "fixed_by",
785313
- "uses_battery",
785314
- "connected_via",
785315
- "part_of_network",
785316
- "mentioned_by",
785317
- "source_for"
785318
- ];
785319
785266
  HOME_GRAPH_CAPABILITIES = [
785320
785267
  "knowledge-space-isolation",
785321
785268
  "snapshot-sync",
@@ -786722,7 +786669,6 @@ var init_service5 = __esm(() => {
786722
786669
  var init_home_graph = __esm(() => {
786723
786670
  init_service5();
786724
786671
  init_extension();
786725
- init_types15();
786726
786672
  });
786727
786673
 
786728
786674
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-refinement.js
@@ -789050,14 +788996,10 @@ var init_service6 = __esm(() => {
789050
788996
  var init_project_planning = __esm(() => {
789051
788997
  init_service6();
789052
788998
  init_helpers3();
789053
- init_readiness();
789054
788999
  });
789055
789000
 
789056
789001
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
789057
- var init_persistence = __esm(() => {
789058
- init_store_schema();
789059
- init_store_load();
789060
- });
789002
+ var init_persistence = () => {};
789061
789003
 
789062
789004
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
789063
789005
  class KnowledgeProjectionService {
@@ -792565,21 +792507,21 @@ var init_service7 = __esm(() => {
792565
792507
  var exports_knowledge = {};
792566
792508
  __export(exports_knowledge, {
792567
792509
  withKnowledgeSpace: () => withKnowledgeSpace,
792568
- uniqKnowledgeValues: () => uniq2,
792569
- stabilizeKnowledgeText: () => stableText,
792570
- runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
792510
+ uniqKnowledgeValues: () => uniq3,
792511
+ stabilizeKnowledgeText: () => stableText2,
792512
+ runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement2,
792571
792513
  resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
792572
- resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
792514
+ resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir2,
792573
792515
  renderPacket: () => renderPacket,
792574
792516
  renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
792575
792517
  renderKnowledgeMap: () => renderKnowledgeMap,
792576
792518
  readKnowledgeSearchText: () => readKnowledgeSearchText,
792577
- readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
792519
+ readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile2,
792578
792520
  projectPlanningSourceId: () => projectPlanningSourceId,
792579
792521
  projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
792580
792522
  projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
792581
792523
  projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
792582
- parseKnowledgeJsonValue: () => parseJsonValue,
792524
+ parseKnowledgeJsonValue: () => parseJsonValue2,
792583
792525
  normalizeProjectId: () => normalizeProjectId,
792584
792526
  normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
792585
792527
  normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
@@ -792587,12 +792529,12 @@ __export(exports_knowledge, {
792587
792529
  materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
792588
792530
  looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
792589
792531
  looksBinaryLikeText: () => looksBinaryLikeText,
792590
- loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
792532
+ loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot2,
792591
792533
  listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
792592
- listBrowserKinds: () => listBrowserKinds,
792534
+ listBrowserKinds: () => listBrowserKinds2,
792593
792535
  knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
792594
792536
  knowledgePageSourceWeight: () => knowledgePageSourceWeight,
792595
- knowledgeNowMs: () => nowMs,
792537
+ knowledgeNowMs: () => nowMs2,
792596
792538
  knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
792597
792539
  isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
792598
792540
  isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
@@ -792612,12 +792554,12 @@ __export(exports_knowledge, {
792612
792554
  generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
792613
792555
  generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
792614
792556
  extractKnowledgeArtifact: () => extractKnowledgeArtifact,
792615
- evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
792616
- discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
792557
+ evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness2,
792558
+ discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles2,
792617
792559
  createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
792618
792560
  createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
792619
792561
  createMemoryApi: () => createMemoryApi,
792620
- createKnowledgeSchema: () => createSchema2,
792562
+ createKnowledgeSchema: () => createSchema3,
792621
792563
  createKnowledgeApi: () => createKnowledgeApi,
792622
792564
  createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
792623
792565
  compareKnowledgePageSources: () => compareKnowledgePageSources,
@@ -795056,7 +794998,7 @@ var init_delivery_manager = __esm(() => {
795056
794998
  });
795057
794999
 
795058
795000
  // node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
795059
- function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
795001
+ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
795060
795002
  let slotsInUse = 0;
795061
795003
  const queuedRuns = [];
795062
795004
  for (const run7 of runs) {
@@ -795066,7 +795008,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
795066
795008
  queuedRuns.push(run7);
795067
795009
  }
795068
795010
  const queueDepth = queuedRuns.length;
795069
- const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
795011
+ const oldestQueuedAgeMs = queueDepth > 0 ? nowMs3 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
795070
795012
  return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
795071
795013
  }
795072
795014
 
@@ -817145,7 +817087,7 @@ var createStyledCell = (char, overrides = {}) => ({
817145
817087
  // src/version.ts
817146
817088
  import { readFileSync } from "fs";
817147
817089
  import { join } from "path";
817148
- var _version = "1.0.42";
817090
+ var _version = "1.0.43";
817149
817091
  try {
817150
817092
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
817151
817093
  _version = typeof pkg.version === "string" ? pkg.version : _version;
@@ -839658,7 +839600,7 @@ var WORK_PLAN_STATUSES = [
839658
839600
  "failed",
839659
839601
  "cancelled"
839660
839602
  ];
839661
- function nowMs2() {
839603
+ function nowMs3() {
839662
839604
  return Date.now();
839663
839605
  }
839664
839606
  function isObject4(value) {
@@ -839764,7 +839706,7 @@ class WorkPlanStore {
839764
839706
  if (!normalizedTitle)
839765
839707
  throw new Error("Work plan item title is required.");
839766
839708
  const plan = this.readPlan();
839767
- const time4 = nowMs2();
839709
+ const time4 = nowMs3();
839768
839710
  const item = {
839769
839711
  id: createItemId(),
839770
839712
  title: normalizedTitle,
@@ -839788,7 +839730,7 @@ class WorkPlanStore {
839788
839730
  updateItem(idOrPrefix, patch2) {
839789
839731
  const plan = this.readPlan();
839790
839732
  const item = this.resolveItem(plan, idOrPrefix);
839791
- const time4 = nowMs2();
839733
+ const time4 = nowMs3();
839792
839734
  const nextStatus = patch2.status ?? item.status;
839793
839735
  const next = this.pruneItem({
839794
839736
  ...item,
@@ -839821,7 +839763,7 @@ class WorkPlanStore {
839821
839763
  removeItem(idOrPrefix) {
839822
839764
  const plan = this.readPlan();
839823
839765
  const item = this.resolveItem(plan, idOrPrefix);
839824
- const time4 = nowMs2();
839766
+ const time4 = nowMs3();
839825
839767
  const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
839826
839768
  this.writePlan({
839827
839769
  ...plan,
@@ -839841,7 +839783,7 @@ class WorkPlanStore {
839841
839783
  ...plan,
839842
839784
  items: remaining,
839843
839785
  activeItemId: remaining[0]?.id,
839844
- updatedAt: nowMs2()
839786
+ updatedAt: nowMs3()
839845
839787
  });
839846
839788
  return removed;
839847
839789
  }
@@ -839880,7 +839822,7 @@ class WorkPlanStore {
839880
839822
  const parsed = JSON.parse(raw);
839881
839823
  if (!isObject4(parsed))
839882
839824
  return this.createEmptyPlan();
839883
- const time4 = nowMs2();
839825
+ const time4 = nowMs3();
839884
839826
  const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
839885
839827
  const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
839886
839828
  const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
@@ -839899,7 +839841,7 @@ class WorkPlanStore {
839899
839841
  };
839900
839842
  }
839901
839843
  createEmptyPlan() {
839902
- const time4 = nowMs2();
839844
+ const time4 = nowMs3();
839903
839845
  return {
839904
839846
  id: createPlanId(this.options.projectId, this.options.projectRoot),
839905
839847
  projectId: this.options.projectId,
@@ -849851,13 +849793,13 @@ init_state3();
849851
849793
 
849852
849794
  // src/input/commands/recall-shared.ts
849853
849795
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
849854
- var VALID_SCOPES = ["session", "project", "team"];
849796
+ var VALID_SCOPES2 = ["session", "project", "team"];
849855
849797
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
849856
849798
  function isValidClass(s4) {
849857
849799
  return VALID_CLASSES.includes(s4);
849858
849800
  }
849859
849801
  function isValidScope(s4) {
849860
- return VALID_SCOPES.includes(s4);
849802
+ return VALID_SCOPES2.includes(s4);
849861
849803
  }
849862
849804
  function isValidReviewState(s4) {
849863
849805
  return VALID_REVIEW_STATES.includes(s4);
@@ -849900,7 +849842,7 @@ function handleRecallSearch(args2, context) {
849900
849842
  if (isValidScope(scope))
849901
849843
  filter.scope = scope;
849902
849844
  else {
849903
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
849845
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
849904
849846
  return;
849905
849847
  }
849906
849848
  }
@@ -850075,7 +850017,7 @@ function handleRecallList(args2, context) {
850075
850017
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
850076
850018
  const scope = args2[scopeIdx + 1];
850077
850019
  if (!isValidScope(scope)) {
850078
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
850020
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
850079
850021
  return;
850080
850022
  }
850081
850023
  filter.scope = scope;
@@ -850125,7 +850067,7 @@ async function handleRecallAdd(args2, context) {
850125
850067
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
850126
850068
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
850127
850069
  if (scopeRaw && !isValidScope(scopeRaw)) {
850128
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
850070
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
850129
850071
  return;
850130
850072
  }
850131
850073
  const provenance = [];
@@ -850259,7 +850201,7 @@ function handleRecallExport(args2, context) {
850259
850201
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
850260
850202
  const scope = commandArgs[scopeIdx + 1];
850261
850203
  if (!isValidScope(scope)) {
850262
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
850204
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
850263
850205
  return;
850264
850206
  }
850265
850207
  filter.scope = scope;
@@ -850338,7 +850280,7 @@ function handleRecallHandoffExport(args2, context) {
850338
850280
  const scopeIdx = commandArgs.indexOf("--scope");
850339
850281
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
850340
850282
  if (!scopeRaw || !isValidScope(scopeRaw)) {
850341
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
850283
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
850342
850284
  return;
850343
850285
  }
850344
850286
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -850454,7 +850396,7 @@ function handleRecallPromote(args2, context) {
850454
850396
  const id = parsed.rest[0];
850455
850397
  const scope = parsed.rest[1];
850456
850398
  if (!id || !scope || !isValidScope(scope)) {
850457
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
850399
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
850458
850400
  return;
850459
850401
  }
850460
850402
  if (!parsed.yes) {
@@ -866559,7 +866501,7 @@ import { mkdirSync as mkdirSync66, readFileSync as readFileSync88, writeFileSync
866559
866501
  import { dirname as dirname63, resolve as resolve39 } from "path";
866560
866502
  init_state3();
866561
866503
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
866562
- var VALID_SCOPES3 = ["session", "project", "team"];
866504
+ var VALID_SCOPES4 = ["session", "project", "team"];
866563
866505
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
866564
866506
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
866565
866507
  var VALUE_OPTIONS = new Set([
@@ -866659,7 +866601,7 @@ function isMemoryClass2(value) {
866659
866601
  return VALID_CLASSES2.includes(value);
866660
866602
  }
866661
866603
  function isMemoryScope2(value) {
866662
- return VALID_SCOPES3.includes(value);
866604
+ return VALID_SCOPES4.includes(value);
866663
866605
  }
866664
866606
  function isReviewState(value) {
866665
866607
  return VALID_REVIEW_STATES3.includes(value);
@@ -866674,7 +866616,7 @@ function requireClass(value) {
866674
866616
  }
866675
866617
  function requireScope(value) {
866676
866618
  if (!value || !isMemoryScope2(value))
866677
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
866619
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
866678
866620
  return value;
866679
866621
  }
866680
866622
  function optionalScope(value) {
@@ -902271,30 +902213,52 @@ function actionCommand(action2) {
902271
902213
  return action2.localOperation ?? "(local action)";
902272
902214
  return action2.command ?? "(guidance)";
902273
902215
  }
902274
- function setupChecklistLines(snapshot2) {
902275
- const readyCount = snapshot2.setupChecklist.filter((item) => item.status === "ready").length;
902276
- const recommendedCount = snapshot2.setupChecklist.filter((item) => item.status === "recommended").length;
902277
- const blockedCount = snapshot2.setupChecklist.filter((item) => item.status === "blocked").length;
902216
+ function setupCounts(snapshot2) {
902217
+ return {
902218
+ ready: snapshot2.setupChecklist.filter((item) => item.status === "ready").length,
902219
+ recommended: snapshot2.setupChecklist.filter((item) => item.status === "recommended").length,
902220
+ optional: snapshot2.setupChecklist.filter((item) => item.status === "optional").length,
902221
+ blocked: snapshot2.setupChecklist.filter((item) => item.status === "blocked").length
902222
+ };
902223
+ }
902224
+ function setupStatusLabel(status) {
902225
+ return status === "ready" ? "Ready" : status === "recommended" ? "Recommended" : status === "blocked" ? "Blocked" : "Optional";
902226
+ }
902227
+ function setupAttentionItems(snapshot2, limit3) {
902228
+ return [
902229
+ ...snapshot2.setupChecklist.filter((item) => item.status === "blocked"),
902230
+ ...snapshot2.setupChecklist.filter((item) => item.status === "recommended"),
902231
+ ...snapshot2.setupChecklist.filter((item) => item.status === "optional")
902232
+ ].slice(0, limit3);
902233
+ }
902234
+ function conciseSetupLine(snapshot2) {
902235
+ const counts = setupCounts(snapshot2);
902236
+ return {
902237
+ text: `Setup: ${counts.ready}/${snapshot2.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.blocked} blocked.`,
902238
+ fg: counts.blocked > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info
902239
+ };
902240
+ }
902241
+ function setupOverviewLines(snapshot2) {
902242
+ const counts = setupCounts(snapshot2);
902243
+ const nextItems = setupAttentionItems(snapshot2, 3);
902278
902244
  const lines = [
902279
- { text: "Setup Checklist", fg: FULLSCREEN_PALETTE.title, bold: true },
902280
- { text: `${readyCount}/${snapshot2.setupChecklist.length} ready; ${recommendedCount} recommended; ${blockedCount} blocked`, fg: blockedCount > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info }
902245
+ { text: "Setup Overview", fg: FULLSCREEN_PALETTE.title, bold: true },
902246
+ { text: `${counts.ready}/${snapshot2.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.optional} optional; ${counts.blocked} blocked.`, fg: counts.blocked > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info },
902247
+ { text: `Chat: ${snapshot2.provider} / ${snapshot2.modelDisplayName}.`, fg: FULLSCREEN_PALETTE.info },
902248
+ { text: `Local: ${snapshot2.localPersonaCount} personas, ${snapshot2.localSkillCount} skills, ${snapshot2.localRoutineCount} routines, ${snapshot2.localMemoryCount} memories.`, fg: FULLSCREEN_PALETTE.info }
902281
902249
  ];
902282
- for (const item of snapshot2.setupChecklist) {
902283
- const command8 = item.command ? ` -> ${item.command}` : "";
902250
+ if (nextItems.length > 0) {
902251
+ const item = nextItems[0];
902284
902252
  lines.push({
902285
- text: `${item.status.toUpperCase()} ${item.label}${command8}`,
902253
+ text: `Next: ${item.label} (${setupStatusLabel(item.status).toLowerCase()})`,
902286
902254
  fg: setupStatusColor(item.status),
902287
902255
  bold: item.status === "blocked"
902288
902256
  });
902289
- lines.push({ text: ` ${item.detail}`, fg: FULLSCREEN_PALETTE.muted });
902290
902257
  }
902291
902258
  return lines;
902292
902259
  }
902293
902260
  function homeNextActionLines(snapshot2) {
902294
- const blocked = snapshot2.setupChecklist.filter((item) => item.status === "blocked");
902295
- const recommended = snapshot2.setupChecklist.filter((item) => item.status === "recommended");
902296
- const optional2 = snapshot2.setupChecklist.filter((item) => item.status === "optional");
902297
- const candidates = [...blocked, ...recommended, ...optional2].slice(0, 5);
902261
+ const candidates = setupAttentionItems(snapshot2, 3);
902298
902262
  if (candidates.length === 0) {
902299
902263
  return [
902300
902264
  { text: "Next Actions", fg: FULLSCREEN_PALETTE.title, bold: true },
@@ -902303,13 +902267,11 @@ function homeNextActionLines(snapshot2) {
902303
902267
  }
902304
902268
  const lines = [{ text: "Next Actions", fg: FULLSCREEN_PALETTE.title, bold: true }];
902305
902269
  for (const item of candidates) {
902306
- const command8 = item.command ? ` -> ${item.command}` : "";
902307
902270
  lines.push({
902308
- text: `${item.status.toUpperCase()} ${item.label}${command8}`,
902271
+ text: `${setupStatusLabel(item.status)}: ${item.label}`,
902309
902272
  fg: setupStatusColor(item.status),
902310
902273
  bold: item.status === "blocked"
902311
902274
  });
902312
- lines.push({ text: ` ${item.detail}`, fg: FULLSCREEN_PALETTE.muted });
902313
902275
  }
902314
902276
  return lines;
902315
902277
  }
@@ -902322,29 +902284,6 @@ function companionAccessLine(snapshot2) {
902322
902284
  fg: access3.pairingReady ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn
902323
902285
  };
902324
902286
  }
902325
- function discoverySummaryLine(label, summary, actionLabel) {
902326
- if (summary.count === 0)
902327
- return [];
902328
- const names2 = summary.names.length > 0 ? ` ${summary.names.join(", ")}${summary.count > summary.names.length ? `, +${summary.count - summary.names.length} more` : ""}.` : "";
902329
- return [
902330
- { text: `${label}: ${summary.count} discovered; project ${summary.projectLocalCount}; global ${summary.globalCount}.`, fg: FULLSCREEN_PALETTE.info, bold: true },
902331
- { text: ` Choose ${actionLabel} to preview, then use the import form after review.${names2}`, fg: FULLSCREEN_PALETTE.muted }
902332
- ];
902333
- }
902334
- function behaviorDiscoveryLines(snapshot2) {
902335
- const lines = [
902336
- ...discoverySummaryLine("Discovered personas", snapshot2.discoveredBehavior.personas, "Personas -> Discover persona files"),
902337
- ...discoverySummaryLine("Discovered skills", snapshot2.discoveredBehavior.skills, "Skills -> Discover skill files"),
902338
- ...discoverySummaryLine("Discovered routines", snapshot2.discoveredBehavior.routines, "Routines -> Discover routine files")
902339
- ];
902340
- if (lines.length === 0)
902341
- return [];
902342
- return [
902343
- { text: "" },
902344
- { text: "Discovered Behavior Files", fg: FULLSCREEN_PALETTE.title, bold: true },
902345
- ...lines
902346
- ];
902347
- }
902348
902287
  function localLibraryLines(title, items, emptyText, selectedId) {
902349
902288
  const lines = [
902350
902289
  { text: title, fg: FULLSCREEN_PALETTE.title, bold: true }
@@ -902503,11 +902442,11 @@ function starterTemplateLines(snapshot2) {
902503
902442
  function snapshotLines(workspace, category, snapshot2) {
902504
902443
  if (!snapshot2)
902505
902444
  return [{ text: "Runtime context is not loaded yet.", fg: FULLSCREEN_PALETTE.warn }];
902506
- const base2 = [{ text: "Live Agent Context", fg: FULLSCREEN_PALETTE.title, bold: true }];
902445
+ const base2 = [];
902507
902446
  if (category.id === "home") {
902508
- base2.push({ text: `Chat route: ${snapshot2.provider} / ${snapshot2.modelDisplayName}`, fg: FULLSCREEN_PALETTE.info }, { text: `Session: ${snapshot2.sessionId}`, fg: FULLSCREEN_PALETTE.muted }, { text: `Policy: ${snapshot2.executionPolicy}; delegated review ${snapshot2.delegatedReviewPolicy}`, fg: FULLSCREEN_PALETTE.good }, { text: `Knowledge: ${snapshot2.knowledgeRoute}; ${snapshot2.knowledgeIsolation}; no fallback`, fg: FULLSCREEN_PALETTE.good }, { text: `Local: ${snapshot2.localMemoryCount} memory, ${snapshot2.localNoteCount} notes, ${snapshot2.localPersonaCount} personas, ${snapshot2.localSkillCount} skills, ${snapshot2.localRoutineCount} routines.`, fg: FULLSCREEN_PALETTE.info }, { text: `Channels: ${snapshot2.channels.filter((channel) => channel.ready).length}/${snapshot2.channels.length} ready; MCP ${snapshot2.mcpConnectedServerCount}/${snapshot2.mcpServerCount} connected; voice/media ${snapshot2.voiceProviderCount}/${snapshot2.mediaProviderCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: "" }, ...homeNextActionLines(snapshot2));
902447
+ base2.push({ text: `Chat route: ${snapshot2.provider} / ${snapshot2.modelDisplayName}`, fg: FULLSCREEN_PALETTE.info }, { text: `Session: ${snapshot2.sessionId}`, fg: FULLSCREEN_PALETTE.muted }, { text: `Policy: ${snapshot2.executionPolicy}; delegated review ${snapshot2.delegatedReviewPolicy}`, fg: FULLSCREEN_PALETTE.good }, conciseSetupLine(snapshot2), ...homeNextActionLines(snapshot2));
902509
902448
  } else if (category.id === "setup") {
902510
- base2.push({ text: `Connection: ${snapshot2.runtimeBaseUrl}`, fg: FULLSCREEN_PALETTE.info }, { text: "Agent role: interactive operator TUI; setup changes here are Agent-local.", fg: FULLSCREEN_PALETTE.good }, ...setupChecklistLines(snapshot2), ...behaviorDiscoveryLines(snapshot2), { text: "" }, { text: `Workspace: ${snapshot2.workingDirectory}`, fg: FULLSCREEN_PALETTE.muted }, { text: `Home: ${snapshot2.homeDirectory}`, fg: FULLSCREEN_PALETTE.muted });
902449
+ base2.push(...setupOverviewLines(snapshot2));
902511
902450
  } else if (category.id === "artifacts") {
902512
902451
  const mediaReady = snapshot2.voiceMediaReadiness.readyMediaProviderCount;
902513
902452
  base2.push({ text: `Chat route: ${snapshot2.provider} / ${snapshot2.modelDisplayName}`, fg: FULLSCREEN_PALETTE.info }, { text: `Agent Knowledge route: ${snapshot2.knowledgeRoute}`, fg: FULLSCREEN_PALETTE.info }, { text: `Media providers: ${mediaReady}/${snapshot2.mediaProviderCount} ready; generation-capable ${snapshot2.mediaGenerationProviderCount}.`, fg: mediaReady > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: "Use this area for concrete files and generated output: attach images, export transcripts, ingest reviewed sources, inspect source records, and generate media.", fg: FULLSCREEN_PALETTE.good }, { text: "Agent Knowledge ingest writes only to the isolated Agent segment. Default knowledge and non-Agent routes are not fallback storage.", fg: FULLSCREEN_PALETTE.warn }, { text: "Generated media is stored as artifacts and referenced by id; the TUI should not print inline base64.", fg: FULLSCREEN_PALETTE.muted }, { text: `Workspace path: ${snapshot2.workingDirectory}`, fg: FULLSCREEN_PALETTE.muted });
@@ -902612,13 +902551,16 @@ function editorContextLines(editor) {
902612
902551
  return lines;
902613
902552
  }
902614
902553
  function buildContextRows(workspace, category, action2, width) {
902554
+ const compactPrimarySurface = category.id === "home" || category.id === "setup";
902615
902555
  const lines = [
902616
902556
  { text: category.label, fg: FULLSCREEN_PALETTE.title, bold: true },
902617
902557
  { text: category.summary, fg: FULLSCREEN_PALETTE.subtitle },
902618
- { text: "" },
902619
- { text: category.detail, fg: FULLSCREEN_PALETTE.text },
902620
- { text: "" },
902558
+ ...compactPrimarySurface ? [] : [
902559
+ { text: "" },
902560
+ { text: category.detail, fg: FULLSCREEN_PALETTE.text }
902561
+ ],
902621
902562
  ...workspace.actionSearchActive ? [
902563
+ { text: "" },
902622
902564
  { text: "Action Search", fg: FULLSCREEN_PALETTE.title, bold: true },
902623
902565
  {
902624
902566
  text: workspace.actionSearchQuery.length > 0 ? `Query: ${workspace.actionSearchQuery} (${workspace.actionSearchResults.length} result${workspace.actionSearchResults.length === 1 ? "" : "s"})` : "Type to search every Agent workspace action.",
@@ -902628,12 +902570,23 @@ function buildContextRows(workspace, category, action2, width) {
902628
902570
  { text: "" }
902629
902571
  ] : [],
902630
902572
  ...workspace.localEditor ? editorContextLines(workspace.localEditor) : [],
902631
- ...workspace.localEditor ? [{ text: "" }] : [],
902573
+ ...workspace.localEditor ? [{ text: "" }] : []
902574
+ ];
902575
+ const selectedActionLines = action2 ? [
902576
+ { text: "" },
902577
+ { text: `Selected: ${action2.label}`, fg: FULLSCREEN_PALETTE.title, bold: true },
902578
+ { text: action2.detail, fg: FULLSCREEN_PALETTE.text },
902579
+ { text: `Command: ${actionCommand(action2)}`, fg: action2.kind === "command" ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.muted },
902580
+ { text: `Safety: ${action2.safety}`, fg: safetyColor(action2) }
902581
+ ] : [];
902582
+ const snapshotContextLines = [
902583
+ { text: "" },
902632
902584
  ...snapshotLines(workspace, category, workspace.runtimeSnapshot)
902633
902585
  ];
902634
- if (action2) {
902635
- lines.push({ text: "" }, { text: `Selected: ${action2.label}`, fg: FULLSCREEN_PALETTE.title, bold: true }, { text: action2.detail, fg: FULLSCREEN_PALETTE.text }, { text: `Command: ${actionCommand(action2)}`, fg: action2.kind === "command" ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.muted }, { text: `Safety: ${action2.safety}`, fg: safetyColor(action2) });
902636
- }
902586
+ if (compactPrimarySurface)
902587
+ lines.push(...selectedActionLines, ...snapshotContextLines);
902588
+ else
902589
+ lines.push(...snapshotContextLines, ...selectedActionLines);
902637
902590
  if (workspace.lastActionResult) {
902638
902591
  lines.push({ text: "" }, { text: "Action Result", fg: FULLSCREEN_PALETTE.title, bold: true }, { text: workspace.lastActionResult.title, fg: actionResultColor(workspace.lastActionResult), bold: true }, { text: workspace.lastActionResult.detail, fg: FULLSCREEN_PALETTE.text });
902639
902592
  if (workspace.lastActionResult.command) {
@@ -902768,13 +902721,13 @@ function footerText3(workspace) {
902768
902721
  function renderAgentWorkspace(workspace, width, height) {
902769
902722
  const category = workspace.selectedActionCategory;
902770
902723
  const action2 = workspace.selectedAction;
902771
- const setupCategory = category.id === "setup";
902724
+ const compactPrimarySurface = category.id === "home" || category.id === "setup";
902772
902725
  const layoutOptions = {
902773
902726
  width,
902774
902727
  height,
902775
902728
  leftWidth: width < 90 ? undefined : 30,
902776
- contextRatio: setupCategory ? 0.86 : 0.62,
902777
- minContextRows: setupCategory ? 18 : 10
902729
+ contextRatio: compactPrimarySurface ? 0.4 : 0.62,
902730
+ minContextRows: 10
902778
902731
  };
902779
902732
  const metrics = getFullscreenWorkspaceMetrics(layoutOptions);
902780
902733
  return renderFullscreenWorkspace({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pellux/goodvibes-agent",
3
- "version": "1.0.42",
3
+ "version": "1.0.43",
4
4
  "private": false,
5
5
  "description": "GoodVibes personal operator assistant TUI with a proactive Agent product brain, isolated Agent Knowledge, local profiles, routines, skills, personas, and explicit build delegation.",
6
6
  "type": "module",
@@ -62,31 +62,63 @@ function actionCommand(action: AgentWorkspaceAction): string {
62
62
  return action.command ?? '(guidance)';
63
63
  }
64
64
 
65
- function setupChecklistLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLine[] {
66
- const readyCount = snapshot.setupChecklist.filter((item) => item.status === 'ready').length;
67
- const recommendedCount = snapshot.setupChecklist.filter((item) => item.status === 'recommended').length;
68
- const blockedCount = snapshot.setupChecklist.filter((item) => item.status === 'blocked').length;
65
+ function setupCounts(snapshot: AgentWorkspaceRuntimeSnapshot): { ready: number; recommended: number; optional: number; blocked: number } {
66
+ return {
67
+ ready: snapshot.setupChecklist.filter((item) => item.status === 'ready').length,
68
+ recommended: snapshot.setupChecklist.filter((item) => item.status === 'recommended').length,
69
+ optional: snapshot.setupChecklist.filter((item) => item.status === 'optional').length,
70
+ blocked: snapshot.setupChecklist.filter((item) => item.status === 'blocked').length,
71
+ };
72
+ }
73
+
74
+ function setupStatusLabel(status: AgentWorkspaceRuntimeSnapshot['setupChecklist'][number]['status']): string {
75
+ return status === 'ready'
76
+ ? 'Ready'
77
+ : status === 'recommended'
78
+ ? 'Recommended'
79
+ : status === 'blocked'
80
+ ? 'Blocked'
81
+ : 'Optional';
82
+ }
83
+
84
+ function setupAttentionItems(snapshot: AgentWorkspaceRuntimeSnapshot, limit: number): AgentWorkspaceRuntimeSnapshot['setupChecklist'] {
85
+ return [
86
+ ...snapshot.setupChecklist.filter((item) => item.status === 'blocked'),
87
+ ...snapshot.setupChecklist.filter((item) => item.status === 'recommended'),
88
+ ...snapshot.setupChecklist.filter((item) => item.status === 'optional'),
89
+ ].slice(0, limit);
90
+ }
91
+
92
+ function conciseSetupLine(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLine {
93
+ const counts = setupCounts(snapshot);
94
+ return {
95
+ text: `Setup: ${counts.ready}/${snapshot.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.blocked} blocked.`,
96
+ fg: counts.blocked > 0 ? PALETTE.warn : PALETTE.info,
97
+ };
98
+ }
99
+
100
+ function setupOverviewLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLine[] {
101
+ const counts = setupCounts(snapshot);
102
+ const nextItems = setupAttentionItems(snapshot, 3);
69
103
  const lines: ContextLine[] = [
70
- { text: 'Setup Checklist', fg: PALETTE.title, bold: true },
71
- { text: `${readyCount}/${snapshot.setupChecklist.length} ready; ${recommendedCount} recommended; ${blockedCount} blocked`, fg: blockedCount > 0 ? PALETTE.warn : PALETTE.info },
104
+ { text: 'Setup Overview', fg: PALETTE.title, bold: true },
105
+ { text: `${counts.ready}/${snapshot.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.optional} optional; ${counts.blocked} blocked.`, fg: counts.blocked > 0 ? PALETTE.warn : PALETTE.info },
106
+ { text: `Chat: ${snapshot.provider} / ${snapshot.modelDisplayName}.`, fg: PALETTE.info },
107
+ { text: `Local: ${snapshot.localPersonaCount} personas, ${snapshot.localSkillCount} skills, ${snapshot.localRoutineCount} routines, ${snapshot.localMemoryCount} memories.`, fg: PALETTE.info },
72
108
  ];
73
- for (const item of snapshot.setupChecklist) {
74
- const command = item.command ? ` -> ${item.command}` : '';
109
+ if (nextItems.length > 0) {
110
+ const item = nextItems[0]!;
75
111
  lines.push({
76
- text: `${item.status.toUpperCase()} ${item.label}${command}`,
112
+ text: `Next: ${item.label} (${setupStatusLabel(item.status).toLowerCase()})`,
77
113
  fg: setupStatusColor(item.status),
78
114
  bold: item.status === 'blocked',
79
115
  });
80
- lines.push({ text: ` ${item.detail}`, fg: PALETTE.muted });
81
116
  }
82
117
  return lines;
83
118
  }
84
119
 
85
120
  function homeNextActionLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLine[] {
86
- const blocked = snapshot.setupChecklist.filter((item) => item.status === 'blocked');
87
- const recommended = snapshot.setupChecklist.filter((item) => item.status === 'recommended');
88
- const optional = snapshot.setupChecklist.filter((item) => item.status === 'optional');
89
- const candidates = [...blocked, ...recommended, ...optional].slice(0, 5);
121
+ const candidates = setupAttentionItems(snapshot, 3);
90
122
  if (candidates.length === 0) {
91
123
  return [
92
124
  { text: 'Next Actions', fg: PALETTE.title, bold: true },
@@ -95,13 +127,11 @@ function homeNextActionLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLi
95
127
  }
96
128
  const lines: ContextLine[] = [{ text: 'Next Actions', fg: PALETTE.title, bold: true }];
97
129
  for (const item of candidates) {
98
- const command = item.command ? ` -> ${item.command}` : '';
99
130
  lines.push({
100
- text: `${item.status.toUpperCase()} ${item.label}${command}`,
131
+ text: `${setupStatusLabel(item.status)}: ${item.label}`,
101
132
  fg: setupStatusColor(item.status),
102
133
  bold: item.status === 'blocked',
103
134
  });
104
- lines.push({ text: ` ${item.detail}`, fg: PALETTE.muted });
105
135
  }
106
136
  return lines;
107
137
  }
@@ -120,31 +150,6 @@ function companionAccessLine(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLi
120
150
  };
121
151
  }
122
152
 
123
- function discoverySummaryLine(label: string, summary: AgentWorkspaceRuntimeSnapshot['discoveredBehavior']['personas'], actionLabel: string): ContextLine[] {
124
- if (summary.count === 0) return [];
125
- const names = summary.names.length > 0
126
- ? ` ${summary.names.join(', ')}${summary.count > summary.names.length ? `, +${summary.count - summary.names.length} more` : ''}.`
127
- : '';
128
- return [
129
- { text: `${label}: ${summary.count} discovered; project ${summary.projectLocalCount}; global ${summary.globalCount}.`, fg: PALETTE.info, bold: true },
130
- { text: ` Choose ${actionLabel} to preview, then use the import form after review.${names}`, fg: PALETTE.muted },
131
- ];
132
- }
133
-
134
- function behaviorDiscoveryLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextLine[] {
135
- const lines: ContextLine[] = [
136
- ...discoverySummaryLine('Discovered personas', snapshot.discoveredBehavior.personas, 'Personas -> Discover persona files'),
137
- ...discoverySummaryLine('Discovered skills', snapshot.discoveredBehavior.skills, 'Skills -> Discover skill files'),
138
- ...discoverySummaryLine('Discovered routines', snapshot.discoveredBehavior.routines, 'Routines -> Discover routine files'),
139
- ];
140
- if (lines.length === 0) return [];
141
- return [
142
- { text: '' },
143
- { text: 'Discovered Behavior Files', fg: PALETTE.title, bold: true },
144
- ...lines,
145
- ];
146
- }
147
-
148
153
  function localLibraryLines(
149
154
  title: string,
150
155
  items: readonly AgentWorkspaceRuntimeSnapshot['localPersonas'][number][],
@@ -325,27 +330,18 @@ function starterTemplateLines(snapshot: AgentWorkspaceRuntimeSnapshot): ContextL
325
330
 
326
331
  function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCategory, snapshot: AgentWorkspaceRuntimeSnapshot | null): ContextLine[] {
327
332
  if (!snapshot) return [{ text: 'Runtime context is not loaded yet.', fg: PALETTE.warn }];
328
- const base: ContextLine[] = [{ text: 'Live Agent Context', fg: PALETTE.title, bold: true }];
333
+ const base: ContextLine[] = [];
329
334
  if (category.id === 'home') {
330
335
  base.push(
331
336
  { text: `Chat route: ${snapshot.provider} / ${snapshot.modelDisplayName}`, fg: PALETTE.info },
332
337
  { text: `Session: ${snapshot.sessionId}`, fg: PALETTE.muted },
333
338
  { text: `Policy: ${snapshot.executionPolicy}; delegated review ${snapshot.delegatedReviewPolicy}`, fg: PALETTE.good },
334
- { text: `Knowledge: ${snapshot.knowledgeRoute}; ${snapshot.knowledgeIsolation}; no fallback`, fg: PALETTE.good },
335
- { text: `Local: ${snapshot.localMemoryCount} memory, ${snapshot.localNoteCount} notes, ${snapshot.localPersonaCount} personas, ${snapshot.localSkillCount} skills, ${snapshot.localRoutineCount} routines.`, fg: PALETTE.info },
336
- { text: `Channels: ${snapshot.channels.filter((channel) => channel.ready).length}/${snapshot.channels.length} ready; MCP ${snapshot.mcpConnectedServerCount}/${snapshot.mcpServerCount} connected; voice/media ${snapshot.voiceProviderCount}/${snapshot.mediaProviderCount}.`, fg: PALETTE.info },
337
- { text: '' },
339
+ conciseSetupLine(snapshot),
338
340
  ...homeNextActionLines(snapshot),
339
341
  );
340
342
  } else if (category.id === 'setup') {
341
343
  base.push(
342
- { text: `Connection: ${snapshot.runtimeBaseUrl}`, fg: PALETTE.info },
343
- { text: 'Agent role: interactive operator TUI; setup changes here are Agent-local.', fg: PALETTE.good },
344
- ...setupChecklistLines(snapshot),
345
- ...behaviorDiscoveryLines(snapshot),
346
- { text: '' },
347
- { text: `Workspace: ${snapshot.workingDirectory}`, fg: PALETTE.muted },
348
- { text: `Home: ${snapshot.homeDirectory}`, fg: PALETTE.muted },
344
+ ...setupOverviewLines(snapshot),
349
345
  );
350
346
  } else if (category.id === 'artifacts') {
351
347
  const mediaReady = snapshot.voiceMediaReadiness.readyMediaProviderCount;
@@ -585,13 +581,16 @@ function editorContextLines(editor: AgentWorkspaceLocalEditor): ContextLine[] {
585
581
  }
586
582
 
587
583
  function buildContextRows(workspace: AgentWorkspace, category: AgentWorkspaceCategory, action: AgentWorkspaceAction | null, width: number): WorkspaceRow[] {
584
+ const compactPrimarySurface = category.id === 'home' || category.id === 'setup';
588
585
  const lines: ContextLine[] = [
589
586
  { text: category.label, fg: PALETTE.title, bold: true },
590
587
  { text: category.summary, fg: PALETTE.subtitle },
591
- { text: '' },
592
- { text: category.detail, fg: PALETTE.text },
593
- { text: '' },
588
+ ...(compactPrimarySurface ? [] : [
589
+ { text: '' },
590
+ { text: category.detail, fg: PALETTE.text },
591
+ ] satisfies ContextLine[]),
594
592
  ...(workspace.actionSearchActive ? [
593
+ { text: '' },
595
594
  { text: 'Action Search', fg: PALETTE.title, bold: true },
596
595
  {
597
596
  text: workspace.actionSearchQuery.length > 0
@@ -604,18 +603,23 @@ function buildContextRows(workspace: AgentWorkspace, category: AgentWorkspaceCat
604
603
  ] satisfies ContextLine[] : []),
605
604
  ...(workspace.localEditor ? editorContextLines(workspace.localEditor) : []),
606
605
  ...(workspace.localEditor ? [{ text: '' }] : []),
607
- ...snapshotLines(workspace, category, workspace.runtimeSnapshot),
608
606
  ];
609
607
 
610
- if (action) {
611
- lines.push(
608
+ const selectedActionLines: ContextLine[] = action
609
+ ? [
612
610
  { text: '' },
613
611
  { text: `Selected: ${action.label}`, fg: PALETTE.title, bold: true },
614
612
  { text: action.detail, fg: PALETTE.text },
615
613
  { text: `Command: ${actionCommand(action)}`, fg: action.kind === 'command' ? PALETTE.info : PALETTE.muted },
616
614
  { text: `Safety: ${action.safety}`, fg: safetyColor(action) },
617
- );
618
- }
615
+ ]
616
+ : [];
617
+ const snapshotContextLines: ContextLine[] = [
618
+ { text: '' },
619
+ ...snapshotLines(workspace, category, workspace.runtimeSnapshot),
620
+ ];
621
+ if (compactPrimarySurface) lines.push(...selectedActionLines, ...snapshotContextLines);
622
+ else lines.push(...snapshotContextLines, ...selectedActionLines);
619
623
 
620
624
  if (workspace.lastActionResult) {
621
625
  lines.push(
@@ -758,13 +762,13 @@ function footerText(workspace: AgentWorkspace): string {
758
762
  export function renderAgentWorkspace(workspace: AgentWorkspace, width: number, height: number): Line[] {
759
763
  const category = workspace.selectedActionCategory;
760
764
  const action = workspace.selectedAction;
761
- const setupCategory = category.id === 'setup';
765
+ const compactPrimarySurface = category.id === 'home' || category.id === 'setup';
762
766
  const layoutOptions = {
763
767
  width,
764
768
  height,
765
769
  leftWidth: width < 90 ? undefined : 30,
766
- contextRatio: setupCategory ? 0.86 : 0.62,
767
- minContextRows: setupCategory ? 18 : 10,
770
+ contextRatio: compactPrimarySurface ? 0.4 : 0.62,
771
+ minContextRows: 10,
768
772
  };
769
773
  const metrics = getFullscreenWorkspaceMetrics(layoutOptions);
770
774
 
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.0.42';
9
+ let _version = '1.0.43';
10
10
  try {
11
11
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
12
12
  readonly version?: unknown;