@pellux/goodvibes-agent 1.0.42 → 1.0.44

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.
@@ -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.44";
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,
@@ -902271,30 +902213,66 @@ 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 compactText3(text, maxWidth = 104) {
902228
+ const normalized3 = text.replace(/\s+/g, " ").trim();
902229
+ if (normalized3.length === 0)
902230
+ return "";
902231
+ const firstSentence = normalized3.match(/^.*?[.!?](?:\s|$)/)?.[0]?.trim();
902232
+ const source = firstSentence && firstSentence.length <= maxWidth ? firstSentence : normalized3;
902233
+ return truncateDisplay(source, maxWidth, "...");
902234
+ }
902235
+ function actionMetaLine(action2) {
902236
+ return {
902237
+ text: `${actionCommand(action2)}; ${action2.safety}`,
902238
+ fg: action2.kind === "command" ? FULLSCREEN_PALETTE.info : safetyColor(action2)
902239
+ };
902240
+ }
902241
+ function setupAttentionItems(snapshot2, limit3) {
902242
+ return [
902243
+ ...snapshot2.setupChecklist.filter((item) => item.status === "blocked"),
902244
+ ...snapshot2.setupChecklist.filter((item) => item.status === "recommended"),
902245
+ ...snapshot2.setupChecklist.filter((item) => item.status === "optional")
902246
+ ].slice(0, limit3);
902247
+ }
902248
+ function conciseSetupLine(snapshot2) {
902249
+ const counts = setupCounts(snapshot2);
902250
+ return {
902251
+ text: `Setup: ${counts.ready}/${snapshot2.setupChecklist.length} ready; ${counts.recommended} recommended; ${counts.blocked} blocked.`,
902252
+ fg: counts.blocked > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info
902253
+ };
902254
+ }
902255
+ function setupOverviewLines(snapshot2) {
902256
+ const counts = setupCounts(snapshot2);
902257
+ const nextItems = setupAttentionItems(snapshot2, 3);
902278
902258
  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 }
902259
+ { text: "Setup Overview", fg: FULLSCREEN_PALETTE.title, bold: true },
902260
+ { 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 },
902261
+ { text: `Chat: ${snapshot2.provider} / ${snapshot2.modelDisplayName}.`, fg: FULLSCREEN_PALETTE.info },
902262
+ { text: `Local: ${snapshot2.localPersonaCount} personas, ${snapshot2.localSkillCount} skills, ${snapshot2.localRoutineCount} routines, ${snapshot2.localMemoryCount} memories.`, fg: FULLSCREEN_PALETTE.info }
902281
902263
  ];
902282
- for (const item of snapshot2.setupChecklist) {
902283
- const command8 = item.command ? ` -> ${item.command}` : "";
902264
+ if (nextItems.length > 0) {
902265
+ const item = nextItems[0];
902284
902266
  lines.push({
902285
- text: `${item.status.toUpperCase()} ${item.label}${command8}`,
902267
+ text: `Next: ${item.label} (${setupStatusLabel(item.status).toLowerCase()})`,
902286
902268
  fg: setupStatusColor(item.status),
902287
902269
  bold: item.status === "blocked"
902288
902270
  });
902289
- lines.push({ text: ` ${item.detail}`, fg: FULLSCREEN_PALETTE.muted });
902290
902271
  }
902291
902272
  return lines;
902292
902273
  }
902293
902274
  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);
902275
+ const candidates = setupAttentionItems(snapshot2, 3);
902298
902276
  if (candidates.length === 0) {
902299
902277
  return [
902300
902278
  { text: "Next Actions", fg: FULLSCREEN_PALETTE.title, bold: true },
@@ -902303,13 +902281,11 @@ function homeNextActionLines(snapshot2) {
902303
902281
  }
902304
902282
  const lines = [{ text: "Next Actions", fg: FULLSCREEN_PALETTE.title, bold: true }];
902305
902283
  for (const item of candidates) {
902306
- const command8 = item.command ? ` -> ${item.command}` : "";
902307
902284
  lines.push({
902308
- text: `${item.status.toUpperCase()} ${item.label}${command8}`,
902285
+ text: `${setupStatusLabel(item.status)}: ${item.label}`,
902309
902286
  fg: setupStatusColor(item.status),
902310
902287
  bold: item.status === "blocked"
902311
902288
  });
902312
- lines.push({ text: ` ${item.detail}`, fg: FULLSCREEN_PALETTE.muted });
902313
902289
  }
902314
902290
  return lines;
902315
902291
  }
@@ -902318,69 +902294,33 @@ function companionAccessLine(snapshot2) {
902318
902294
  const tokenState = access3.tokenReadable ? `ready sha256:${access3.tokenFingerprint ?? "unknown"}` : access3.tokenPresent ? "present but unreadable" : "missing";
902319
902295
  const error53 = access3.tokenError ? `; token read error ${access3.tokenError}` : "";
902320
902296
  return {
902321
- text: `Companion: ${access3.surface}; token ${tokenState}; QR ${access3.qrCommand}; manual token text hidden${error53}.`,
902297
+ text: `Companion: ${access3.surface}; token ${tokenState}; QR ${access3.qrCommand}${error53}.`,
902322
902298
  fg: access3.pairingReady ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn
902323
902299
  };
902324
902300
  }
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
- function localLibraryLines(title, items, emptyText, selectedId) {
902349
- const lines = [
902350
- { text: title, fg: FULLSCREEN_PALETTE.title, bold: true }
902351
- ];
902301
+ function compactLocalLibraryLines(title, items, emptyText, selectedId) {
902302
+ const lines = [];
902352
902303
  if (items.length === 0) {
902353
- lines.push({ text: emptyText, fg: FULLSCREEN_PALETTE.warn });
902304
+ lines.push({ text: `${title}: 0. ${emptyText}`, fg: FULLSCREEN_PALETTE.warn });
902354
902305
  return lines;
902355
902306
  }
902356
- for (const item of items.slice(0, 8)) {
902357
- const selected = item.id === selectedId;
902358
- const status = [
902359
- selected ? "selected" : "",
902360
- item.active ? "active" : "",
902361
- item.enabled === true ? "enabled" : item.enabled === false ? "disabled" : "",
902362
- item.scope && item.cls ? `${item.scope}/${item.cls}` : "",
902363
- item.confidence !== undefined ? `${item.confidence}%` : "",
902364
- item.requirementCount !== undefined && item.requirementCount > 0 ? item.missingRequirementCount && item.missingRequirementCount > 0 ? `needs ${item.missingRequirementCount}/${item.requirementCount}` : `ready ${item.requirementCount}/${item.requirementCount}` : "",
902365
- formatAgentRecordReviewState(item.reviewState),
902366
- item.source ? `origin ${item.source}` : "",
902367
- item.startCount !== undefined ? `starts ${item.startCount}` : ""
902368
- ].filter(Boolean).join(" / ");
902369
- const tags = item.tags.length > 0 ? ` tags ${item.tags.join(",")}` : "";
902370
- const triggers = item.triggers.length > 0 ? ` triggers ${item.triggers.join(",")}` : "";
902371
- const marker = selected ? `${GLYPHS.navigation.selected} ` : "";
902372
- lines.push({
902373
- text: `${marker}${item.id}: ${item.name} (${status})`,
902374
- fg: item.reviewState === "stale" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info,
902375
- bold: selected || item.active === true
902376
- });
902377
- lines.push({ text: ` ${item.description}${tags}${triggers}`, fg: FULLSCREEN_PALETTE.muted });
902378
- if (item.missingRequirements && item.missingRequirements.length > 0) {
902379
- lines.push({ text: ` missing setup: ${item.missingRequirements.join(", ")}`, fg: FULLSCREEN_PALETTE.warn });
902380
- }
902381
- }
902382
- if (items.length > 8) {
902383
- lines.push({ text: `${items.length - 8} more item(s). Open the library command for the full list.`, fg: FULLSCREEN_PALETTE.dim });
902307
+ const selected = items.find((item) => item.id === selectedId) ?? items[0];
902308
+ const status = [
902309
+ selected.active ? "active" : "",
902310
+ selected.enabled === true ? "enabled" : selected.enabled === false ? "disabled" : "",
902311
+ selected.scope && selected.cls ? `${selected.scope}/${selected.cls}` : "",
902312
+ selected.confidence !== undefined ? `${selected.confidence}%` : "",
902313
+ selected.requirementCount !== undefined && selected.requirementCount > 0 ? selected.missingRequirementCount && selected.missingRequirementCount > 0 ? `needs ${selected.missingRequirementCount}/${selected.requirementCount}` : `ready ${selected.requirementCount}/${selected.requirementCount}` : "",
902314
+ formatAgentRecordReviewState(selected.reviewState),
902315
+ selected.startCount !== undefined ? `starts ${selected.startCount}` : ""
902316
+ ].filter(Boolean).join(", ");
902317
+ lines.push({
902318
+ text: `${title}: ${items.length}; selected ${selected.name}${status ? ` (${status})` : ""}.`,
902319
+ fg: selected.reviewState === "stale" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info,
902320
+ bold: selected.active === true
902321
+ });
902322
+ if (selected.missingRequirements && selected.missingRequirements.length > 0) {
902323
+ lines.push({ text: `Missing setup: ${selected.missingRequirements.join(", ")}`, fg: FULLSCREEN_PALETTE.warn });
902384
902324
  }
902385
902325
  return lines;
902386
902326
  }
@@ -902415,23 +902355,18 @@ function routineNextActionLine(snapshot2) {
902415
902355
  }
902416
902356
  return { text: "Next routine action: Start selected in the main conversation, inspect receipts, or reconcile connected schedules.", fg: FULLSCREEN_PALETTE.info, bold: true };
902417
902357
  }
902418
- function routineScheduleReceiptLines(snapshot2) {
902358
+ function compactRoutineReceiptLine(snapshot2) {
902419
902359
  const latest = snapshot2.latestRoutineScheduleReceipt;
902420
- const lines = [
902421
- {
902422
- text: `Promotion receipts: ${snapshot2.routineScheduleReceiptCount}; created: ${snapshot2.successfulRoutineScheduleReceiptCount}; failed: ${snapshot2.failedRoutineScheduleReceiptCount}`,
902423
- fg: snapshot2.failedRoutineScheduleReceiptCount > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info
902424
- }
902425
- ];
902426
- if (latest) {
902427
- lines.push({
902428
- text: `Latest receipt: ${latest.id} ${latest.status} routine=${latest.routineId} schedule="${latest.scheduleName}" ${latest.scheduleKind} ${latest.scheduleValue}`,
902429
- fg: latest.status === "failed" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good
902430
- });
902431
- } else {
902432
- lines.push({ text: "No schedule promotion receipts yet. Confirm a routine promotion from Automation when ready.", fg: FULLSCREEN_PALETTE.muted });
902360
+ if (!latest) {
902361
+ return {
902362
+ text: `Promotion receipts: ${snapshot2.routineScheduleReceiptCount}; none created yet.`,
902363
+ fg: FULLSCREEN_PALETTE.muted
902364
+ };
902433
902365
  }
902434
- return lines;
902366
+ return {
902367
+ text: `Promotion receipts: ${snapshot2.routineScheduleReceiptCount}; latest ${latest.status} ${latest.routineId}.`,
902368
+ fg: latest.status === "failed" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good
902369
+ };
902435
902370
  }
902436
902371
  function automationNextActionLine(snapshot2) {
902437
902372
  const ready = readyRoutineItems(snapshot2);
@@ -902451,151 +902386,60 @@ function automationNextActionLine(snapshot2) {
902451
902386
  }
902452
902387
  return { text: "Next automation action: Create a reminder, or create/import a routine before recurring workflow promotion.", fg: FULLSCREEN_PALETTE.warn, bold: true };
902453
902388
  }
902454
- function profileLines(snapshot2) {
902455
- const lines = [
902456
- { text: "Agent Profiles", fg: FULLSCREEN_PALETTE.title, bold: true }
902457
- ];
902458
- if (snapshot2.runtimeProfiles.length === 0) {
902459
- lines.push({ text: "No isolated Agent profiles yet. Use Create Agent profile in this workspace.", fg: FULLSCREEN_PALETTE.warn });
902460
- return lines;
902461
- }
902462
- for (const profile5 of snapshot2.runtimeProfiles.slice(0, 6)) {
902463
- const starter = profile5.starterTemplateId ? ` starter=${profile5.starterTemplateId}` : " starter=none";
902464
- const created = profile5.createdAt ? ` created ${profile5.createdAt.slice(0, 10)}` : "";
902465
- const states = [
902466
- profile5.id === snapshot2.activeRuntimeProfile ? "active" : "",
902467
- profile5.id === snapshot2.selectedRuntimeProfile ? "default" : ""
902468
- ].filter(Boolean).join(", ");
902469
- const stateText = states ? ` [${states}]` : "";
902470
- lines.push({
902471
- text: `${profile5.id}${stateText}${starter}${created}`,
902472
- fg: profile5.id === snapshot2.selectedRuntimeProfile ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.info,
902473
- bold: profile5.id === snapshot2.activeRuntimeProfile || profile5.id === snapshot2.selectedRuntimeProfile
902474
- });
902475
- lines.push({ text: ` home: ${profile5.homeDirectory}`, fg: FULLSCREEN_PALETTE.muted });
902476
- }
902477
- if (snapshot2.runtimeProfiles.length > 6) {
902478
- lines.push({ text: `${snapshot2.runtimeProfiles.length - 6} more profile(s).`, fg: FULLSCREEN_PALETTE.dim });
902479
- }
902480
- return lines;
902481
- }
902482
- function starterTemplateLines(snapshot2) {
902483
- const lines = [
902484
- { text: "Starter Templates", fg: FULLSCREEN_PALETTE.title, bold: true }
902485
- ];
902486
- for (const template of snapshot2.runtimeStarterTemplates.slice(0, 6)) {
902487
- const origin = template.source === "local" ? "Local" : formatAgentRecordSource(template.source);
902488
- lines.push({
902489
- text: `${template.id}: ${template.name} [${origin}]`,
902490
- fg: template.source === "local" ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.info,
902491
- bold: template.id === "research"
902492
- });
902493
- lines.push({
902494
- text: ` ${template.description} Persona ${template.personaName}; skills ${template.skillNames.join(", ")}; routines ${template.routineNames.join(", ")}.`,
902495
- fg: FULLSCREEN_PALETTE.muted
902496
- });
902497
- }
902498
- if (snapshot2.runtimeStarterTemplates.length > 6) {
902499
- lines.push({ text: `${snapshot2.runtimeStarterTemplates.length - 6} more starter template(s).`, fg: FULLSCREEN_PALETTE.dim });
902500
- }
902501
- return lines;
902502
- }
902503
902389
  function snapshotLines(workspace, category, snapshot2) {
902504
902390
  if (!snapshot2)
902505
902391
  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 }];
902392
+ const base2 = [];
902507
902393
  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));
902394
+ 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
902395
  } 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 });
902396
+ base2.push(...setupOverviewLines(snapshot2));
902511
902397
  } else if (category.id === "artifacts") {
902512
902398
  const mediaReady = snapshot2.voiceMediaReadiness.readyMediaProviderCount;
902513
- 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 });
902399
+ base2.push({ text: `Chat: ${snapshot2.provider} / ${snapshot2.modelDisplayName}; Knowledge: ${snapshot2.knowledgeRoute}`, fg: FULLSCREEN_PALETTE.info }, { text: `Media: ${mediaReady}/${snapshot2.mediaProviderCount} ready; generation ${snapshot2.mediaGenerationProviderCount}.`, fg: mediaReady > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: "Files: attach, export, inspect, ingest reviewed sources, or generate media.", fg: FULLSCREEN_PALETTE.good }, { text: "Knowledge ingest and media generation require explicit actions.", fg: FULLSCREEN_PALETTE.warn });
902514
902400
  } else if (category.id === "channels") {
902515
902401
  const enabledCount = snapshot2.channels.filter((channel) => channel.enabled).length;
902516
902402
  const readyCount = snapshot2.channels.filter((channel) => channel.ready).length;
902517
902403
  const configuredDefaults = snapshot2.channels.filter((channel) => channel.defaultTarget === "configured").length;
902518
- const readyChannels = snapshot2.channels.filter((channel) => channel.ready).map((channel) => channel.label);
902519
902404
  const needsTarget = snapshot2.channels.filter((channel) => channel.setupState === "needs-target");
902520
902405
  const needsConfig = snapshot2.channels.filter((channel) => channel.setupState === "needs-config");
902521
902406
  const nextAttentionChannel = needsConfig[0] ?? needsTarget[0] ?? snapshot2.channels.find((channel) => !channel.enabled);
902522
- const disabledChannels = snapshot2.channels.filter((channel) => !channel.enabled).map((channel) => channel.label);
902523
- const disabledPreview = disabledChannels.slice(0, 6).join(", ");
902524
- const disabledSuffix = disabledChannels.length > 6 ? `, +${disabledChannels.length - 6} more` : "";
902525
- const orderedChannels = [
902526
- ...snapshot2.channels.filter((channel) => channel.enabled),
902527
- ...snapshot2.channels.filter((channel) => !channel.enabled)
902528
- ].slice(0, 3);
902529
- base2.push({ text: `GoodVibes API: ${snapshot2.runtimeBaseUrl}`, fg: FULLSCREEN_PALETTE.info }, companionAccessLine(snapshot2), { text: `Readiness: ${readyCount}/${snapshot2.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} default target(s) configured.`, fg: FULLSCREEN_PALETTE.info }, { text: "Setup path: pair companion -> inspect readiness -> review accounts/policies/status -> fix one channel -> add explicit notification target if needed.", fg: FULLSCREEN_PALETTE.good }, { text: `Next channel action: ${nextAttentionChannel ? `${nextAttentionChannel.label} - ${nextAttentionChannel.nextStep}` : "All enabled channels are ready; keep delivery explicit and review policies before sending."}`, fg: nextAttentionChannel ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, { text: `Ready channels: ${readyChannels.join(", ") || "none"}.`, fg: readyChannels.length > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: `Needs default target: ${needsTarget.map((channel) => `${channel.label} -> ${channel.defaultTargetKeys.join("|")}`).join(", ") || "none"}.`, fg: needsTarget.length > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: `Needs config: ${needsConfig.map((channel) => `${channel.label} -> ${channel.missingRequiredKeys.join("|")}`).join(", ") || "none"}.`, fg: needsConfig.length > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: `Disabled channels: ${disabledPreview || "none"}${disabledSuffix}.`, fg: FULLSCREEN_PALETTE.dim }, { text: "Safety: no secret values; sends and public exposure require explicit user action and Agent policy.", fg: FULLSCREEN_PALETTE.warn });
902530
- for (const channel of orderedChannels) {
902531
- const ready = channel.ready ? "ready" : `${channel.missingConfigCount} missing`;
902532
- base2.push({
902533
- text: `${channel.label}: ${channel.setupState}; ${ready}; target ${channel.defaultTarget}; delivery ${channel.delivery}; risk ${channel.risk}.`,
902534
- fg: channel.ready ? FULLSCREEN_PALETTE.good : channel.enabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.dim
902535
- });
902536
- }
902407
+ base2.push({ text: `API: ${snapshot2.runtimeBaseUrl}`, fg: FULLSCREEN_PALETTE.info }, companionAccessLine(snapshot2), { text: `Channels: ${readyCount}/${snapshot2.channels.length} ready; ${enabledCount} enabled; ${configuredDefaults} target(s).`, fg: FULLSCREEN_PALETTE.info }, { text: `Next: ${nextAttentionChannel ? `${nextAttentionChannel.label} - ${compactText3(nextAttentionChannel.nextStep)}` : "All enabled channels ready."}`, fg: nextAttentionChannel ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, { text: "Safety: secrets hidden; sends require explicit action.", fg: FULLSCREEN_PALETTE.warn });
902537
902408
  } else if (category.id === "knowledge") {
902538
- base2.push({ text: `Route family: ${snapshot2.knowledgeRoute}/{status,ask,search}`, fg: FULLSCREEN_PALETTE.info }, { text: `Isolation: ${snapshot2.knowledgeIsolation}; no default knowledge or non-Agent fallback`, fg: FULLSCREEN_PALETTE.good }, { text: "Ingest: URL, URL-list, and bookmark imports require explicit --yes and write only to Agent Knowledge.", fg: FULLSCREEN_PALETTE.info }, { text: "Review: queue, issues, candidates, reports, reindex, and consolidation stay inside the Agent segment.", fg: FULLSCREEN_PALETTE.muted }, { text: "Agent-owned content appears here only after explicit Agent knowledge ingestion.", fg: FULLSCREEN_PALETTE.muted });
902409
+ base2.push({ text: `Route: ${snapshot2.knowledgeRoute}; isolation ${snapshot2.knowledgeIsolation}.`, fg: FULLSCREEN_PALETTE.info }, { text: "Ask/search, ingest, review, reindex, and reports stay Agent-owned.", fg: FULLSCREEN_PALETTE.good }, { text: "Ingest requires explicit confirmation.", fg: FULLSCREEN_PALETTE.warn });
902539
902410
  } else if (category.id === "research") {
902540
- base2.push({ text: `Chat route: ${snapshot2.provider} / ${snapshot2.modelDisplayName}`, fg: FULLSCREEN_PALETTE.info }, { text: `Agent Knowledge route: ${snapshot2.knowledgeRoute}`, fg: FULLSCREEN_PALETTE.info }, { text: `Browser tools: ${snapshot2.voiceMediaReadiness.browserToolState}; public base URL ${snapshot2.browserToolPublicBaseUrl}.`, fg: snapshot2.browserToolExposureEnabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: snapshot2.voiceMediaReadiness.browserToolNextStep, fg: FULLSCREEN_PALETTE.muted }, { text: "Research requests are submitted to the main conversation. Agent may use connected read-only web tools when the user asks.", fg: FULLSCREEN_PALETTE.good }, { text: "URL references and web research do not ingest into Agent Knowledge. Ingestion is a separate confirmed Agent Knowledge action.", fg: FULLSCREEN_PALETTE.warn }, { text: "Use Agent Knowledge ask/search first for known source-backed context; use web research for current or external sources.", fg: FULLSCREEN_PALETTE.info }, { text: "External sends, browser-side effects, package installs, and connected-host mutations are outside this read-only research lane.", fg: FULLSCREEN_PALETTE.warn });
902411
+ base2.push({ text: `Chat: ${snapshot2.provider} / ${snapshot2.modelDisplayName}; Knowledge: ${snapshot2.knowledgeRoute}`, fg: FULLSCREEN_PALETTE.info }, { text: `Browser: ${snapshot2.voiceMediaReadiness.browserToolState}; public URL ${snapshot2.browserToolPublicBaseUrl}.`, fg: snapshot2.browserToolExposureEnabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: "Research is read-only. Knowledge ingest is a separate confirmed action.", fg: FULLSCREEN_PALETTE.good }, { text: compactText3(snapshot2.voiceMediaReadiness.browserToolNextStep), fg: FULLSCREEN_PALETTE.muted });
902541
902412
  } else if (category.id === "tools") {
902542
- base2.push({ text: `MCP servers: ${snapshot2.mcpConnectedServerCount}/${snapshot2.mcpServerCount} connected; quarantined ${snapshot2.mcpQuarantinedServerCount}; allow-all ${snapshot2.mcpAllowAllServerCount}.`, fg: snapshot2.mcpQuarantinedServerCount > 0 || snapshot2.mcpAllowAllServerCount > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info }, { text: "Open MCP workspace for live server status, tool inventory, config paths, and confirmed add/remove/reload actions.", fg: FULLSCREEN_PALETTE.info }, { text: "Add/update requires typed confirmation and dispatches through the TUI command router.", fg: FULLSCREEN_PALETTE.good }, { text: "Trust changes remain explicit; allow-all is kept behind the settings workspace.", fg: FULLSCREEN_PALETTE.warn }, { text: "Useful first actions: /mcp review, /mcp tools, /mcp config, and Add MCP server.", fg: FULLSCREEN_PALETTE.muted }, { text: "Normal assistant chat can use tools serially when policy allows; onboarding does not start hidden tool work.", fg: FULLSCREEN_PALETTE.muted });
902413
+ base2.push({ text: `MCP servers: ${snapshot2.mcpConnectedServerCount}/${snapshot2.mcpServerCount} connected; quarantined ${snapshot2.mcpQuarantinedServerCount}; allow-all ${snapshot2.mcpAllowAllServerCount}.`, fg: snapshot2.mcpQuarantinedServerCount > 0 || snapshot2.mcpAllowAllServerCount > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info }, { text: "Add/update/reload and trust changes require confirmation.", fg: FULLSCREEN_PALETTE.good }, { text: "Start: /mcp review, /mcp tools, /mcp config, Add MCP server.", fg: FULLSCREEN_PALETTE.muted });
902543
902414
  } else if (category.id === "voice-media") {
902544
902415
  const readiness = snapshot2.voiceMediaReadiness;
902545
- const voiceRows = readiness.voiceProviders.slice(0, 6);
902546
- const mediaRows = readiness.mediaProviders.slice(0, 6);
902547
- base2.push({ text: `Voice providers: ${snapshot2.voiceProviderCount}; streaming TTS: ${snapshot2.voiceStreamingProviderCount}; STT: ${snapshot2.voiceSttProviderCount}; realtime: ${snapshot2.voiceRealtimeProviderCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Voice interaction: ${snapshot2.voiceSurfaceEnabled ? "enabled" : "disabled"}; ready providers ${readiness.readyVoiceProviderCount}/${snapshot2.voiceProviderCount}.`, fg: snapshot2.voiceSurfaceEnabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: `TTS config: provider ${snapshot2.ttsProvider}; voice ${snapshot2.ttsVoice}; response model ${snapshot2.ttsResponseModel}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Selected TTS readiness: ${readiness.selectedTtsProviderLabel} -> ${readiness.selectedTtsProviderStatus}; voice ${readiness.ttsVoiceConfigured ? "configured" : "default"}; response route ${readiness.ttsResponseRouteConfigured ? "configured" : "chat route"}.`, fg: readiness.selectedTtsProviderStatus === "ready" ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: `Media providers: ${snapshot2.mediaProviderCount}; understanding: ${snapshot2.mediaUnderstandingProviderCount}; generation: ${snapshot2.mediaGenerationProviderCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Ready media providers: ${readiness.readyMediaProviderCount}/${snapshot2.mediaProviderCount}.`, fg: readiness.readyMediaProviderCount > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: `Browser tools: ${readiness.browserToolState}; public base URL ${snapshot2.browserToolPublicBaseUrl}.`, fg: snapshot2.browserToolExposureEnabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: readiness.browserToolNextStep, fg: FULLSCREEN_PALETTE.muted }, { text: "Voice provider readiness", fg: FULLSCREEN_PALETTE.title, bold: true });
902548
- for (const provider5 of voiceRows) {
902549
- const selected = provider5.selected ? "selected; " : "";
902550
- const missing = provider5.missingSecretKeyOptions.length > 0 ? `; needs ${provider5.missingSecretKeyOptions.join("|")}` : "";
902551
- base2.push({
902552
- text: `${provider5.label}: ${selected}${provider5.setupState}; ${provider5.features.join(", ") || "registered"}${missing}.`,
902553
- fg: provider5.setupState === "ready" ? FULLSCREEN_PALETTE.good : provider5.setupState === "needs-secret" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted
902554
- });
902555
- }
902556
- if (snapshot2.voiceProviderCount > voiceRows.length)
902557
- base2.push({ text: `${snapshot2.voiceProviderCount - voiceRows.length} more voice provider(s).`, fg: FULLSCREEN_PALETTE.dim });
902558
- base2.push({ text: "Media provider readiness", fg: FULLSCREEN_PALETTE.title, bold: true });
902559
- for (const provider5 of mediaRows) {
902560
- const missing = provider5.missingSecretKeyOptions.length > 0 ? `; needs ${provider5.missingSecretKeyOptions.join("|")}` : "";
902561
- base2.push({
902562
- text: `${provider5.label}: ${provider5.setupState}; ${provider5.features.join(", ") || "registered"}${missing}.`,
902563
- fg: provider5.setupState === "ready" ? FULLSCREEN_PALETTE.good : provider5.setupState === "needs-secret" ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted
902564
- });
902565
- }
902566
- if (snapshot2.mediaProviderCount > mediaRows.length)
902567
- base2.push({ text: `${snapshot2.mediaProviderCount - mediaRows.length} more media provider(s).`, fg: FULLSCREEN_PALETTE.dim });
902568
- for (const step of readiness.nextSteps.slice(0, 4))
902569
- base2.push({ text: `Next: ${step}`, fg: FULLSCREEN_PALETTE.info });
902570
- base2.push({ text: "No secret values are rendered. Voice, browser, and generated media side effects require explicit user action.", fg: FULLSCREEN_PALETTE.warn }, { text: "Image input uses prompt attachments; media generation/provider setup stays behind explicit commands and configured providers.", fg: FULLSCREEN_PALETTE.muted });
902416
+ base2.push({ text: `Voice: ${readiness.readyVoiceProviderCount}/${snapshot2.voiceProviderCount} ready; TTS ${snapshot2.ttsProvider}; voice ${snapshot2.ttsVoice}.`, fg: readiness.readyVoiceProviderCount > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: `Media: ${readiness.readyMediaProviderCount}/${snapshot2.mediaProviderCount} ready; generation ${snapshot2.mediaGenerationProviderCount}.`, fg: readiness.readyMediaProviderCount > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, { text: `Browser: ${readiness.browserToolState}; public URL ${snapshot2.browserToolPublicBaseUrl}.`, fg: snapshot2.browserToolExposureEnabled ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.muted }, { text: readiness.nextSteps[0] ? `Next: ${compactText3(readiness.nextSteps[0])}` : "Next: voice/media setup is ready.", fg: readiness.nextSteps.length > 0 ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.good }, { text: "Secrets hidden; voice, browser, and media side effects require explicit action.", fg: FULLSCREEN_PALETTE.warn });
902571
902417
  } else if (category.id === "profiles") {
902572
902418
  const defaultProfile = snapshot2.selectedRuntimeProfile ? `${snapshot2.selectedRuntimeProfile}${snapshot2.selectedRuntimeProfileExists ? "" : " (missing)"}` : "(base Agent home)";
902573
- base2.push({ text: `Active Agent profile: ${snapshot2.activeRuntimeProfile}`, fg: FULLSCREEN_PALETTE.info }, { text: `Default for next launch: ${defaultProfile}`, fg: snapshot2.selectedRuntimeProfileExists || !snapshot2.selectedRuntimeProfile ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.warn }, { text: `Agent profiles under this home: ${snapshot2.runtimeProfileCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Starter templates: ${snapshot2.runtimeStarterTemplateCount}; local custom: ${snapshot2.localStarterTemplateCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Starter ids: ${snapshot2.runtimeStarterTemplates.map((template) => template.id).join(", ") || "none"}`, fg: FULLSCREEN_PALETTE.info }, { text: "Starter Templates", fg: FULLSCREEN_PALETTE.title, bold: true }, { text: `Agent profile root: ${snapshot2.runtimeProfileRoot}`, fg: FULLSCREEN_PALETTE.muted }, { text: "" }, ...profileLines(snapshot2), { text: "" }, ...starterTemplateLines(snapshot2), { text: "" }, { text: "Named Agent profiles isolate local config, sessions, memory, personas, skills, routines, setup, and bundles.", fg: FULLSCREEN_PALETTE.good }, { text: "Starter authoring: browse, export, edit, import, and create Agent profiles from inside this workspace.", fg: FULLSCREEN_PALETTE.info }, { text: "The connected GoodVibes host stays shared unless that host is configured separately.", fg: FULLSCREEN_PALETTE.warn }, { text: "Portable bundles require explicit export/import commands with real paths and --yes.", fg: FULLSCREEN_PALETTE.muted });
902419
+ base2.push({ text: `Profiles: active ${snapshot2.activeRuntimeProfile}; default ${defaultProfile}.`, fg: snapshot2.selectedRuntimeProfileExists || !snapshot2.selectedRuntimeProfile ? FULLSCREEN_PALETTE.info : FULLSCREEN_PALETTE.warn }, { text: `Local profiles: ${snapshot2.runtimeProfileCount}; starters ${snapshot2.runtimeStarterTemplateCount}; custom ${snapshot2.localStarterTemplateCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Starter ids: ${truncateDisplay(snapshot2.runtimeStarterTemplates.map((template) => template.id).join(", ") || "none", 96, "...")}`, fg: FULLSCREEN_PALETTE.muted }, { text: "Profiles isolate local Agent config, sessions, memory, personas, skills, routines, setup, and bundles.", fg: FULLSCREEN_PALETTE.good });
902574
902420
  } else if (category.id === "memory") {
902575
- base2.push({ text: `Session memories: ${snapshot2.sessionMemoryCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Agent memory: ${snapshot2.localMemoryCount}; prompt-active: ${snapshot2.localMemoryPromptActiveCount}; review queue: ${snapshot2.localMemoryReviewQueueCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Scratchpad notes: ${snapshot2.localNoteCount}; review queue: ${snapshot2.localNoteReviewQueueCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Local routines: ${snapshot2.localRoutineCount}; enabled: ${snapshot2.enabledRoutineCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Local skills: ${snapshot2.localSkillCount}; enabled: ${snapshot2.enabledSkillCount}; bundles: ${snapshot2.localSkillBundleCount}; active skills: ${snapshot2.activeSkillCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Local personas: ${snapshot2.localPersonaCount}; active: ${snapshot2.activePersonaName}`, fg: FULLSCREEN_PALETTE.info }, { text: "Durable memory, scratchpad notes, routines, skills, and personas remain Agent-local until shared registry contracts exist.", fg: FULLSCREEN_PALETTE.good }, { text: "Secrets are rejected/redacted; store secret references instead of secret values.", fg: FULLSCREEN_PALETTE.warn }, { text: "" }, ...localLibraryLines("Agent Memory", snapshot2.localMemories, "No Agent memory yet. Create one here with Create memory.", workspace.selectedLocalLibraryItem("memory")?.id ?? null));
902421
+ base2.push({ text: `Memory: ${snapshot2.localMemoryCount}; prompt ${snapshot2.localMemoryPromptActiveCount}; queue ${snapshot2.localMemoryReviewQueueCount}; session ${snapshot2.sessionMemoryCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Notes: ${snapshot2.localNoteCount}; skills ${snapshot2.localSkillCount}/${snapshot2.enabledSkillCount}; routines ${snapshot2.localRoutineCount}/${snapshot2.enabledRoutineCount}; personas ${snapshot2.localPersonaCount}.`, fg: FULLSCREEN_PALETTE.info }, { text: `Active persona: ${snapshot2.activePersonaName}.`, fg: FULLSCREEN_PALETTE.info }, ...compactLocalLibraryLines("Agent Memory", snapshot2.localMemories, "Create one with Create memory.", workspace.selectedLocalLibraryItem("memory")?.id ?? null), { text: "Secrets are rejected or redacted; use secret references.", fg: FULLSCREEN_PALETTE.warn });
902576
902422
  } else if (category.id === "notes") {
902577
- base2.push({ text: `Scratchpad notes: ${snapshot2.localNoteCount}; review queue: ${snapshot2.localNoteReviewQueueCount}`, fg: FULLSCREEN_PALETTE.info }, { text: "Notes are Agent-local working context for source triage, temporary decisions, and operator handoff.", fg: FULLSCREEN_PALETTE.good }, { text: "Notes do not become memory and are not ingested into Agent Knowledge unless the user takes a separate explicit action.", fg: FULLSCREEN_PALETTE.warn }, { text: "Use reviewed notes to prefill durable memory, skills, routines, or personas, or to decide that a reviewed source deserves Agent Knowledge ingest.", fg: FULLSCREEN_PALETTE.muted }, { text: "" }, ...localLibraryLines("Scratchpad Notes", snapshot2.localNotes, "No local notes yet. Create one here with Create note.", workspace.selectedLocalLibraryItem("note")?.id ?? null));
902423
+ base2.push({ text: `Scratchpad notes: ${snapshot2.localNoteCount}; review queue: ${snapshot2.localNoteReviewQueueCount}`, fg: FULLSCREEN_PALETTE.info }, ...compactLocalLibraryLines("Scratchpad Notes", snapshot2.localNotes, "Create one with Create note.", workspace.selectedLocalLibraryItem("note")?.id ?? null), { text: "Notes stay local unless promoted by explicit action.", fg: FULLSCREEN_PALETTE.warn });
902578
902424
  } else if (category.id === "personas") {
902579
- base2.push({ text: `Personas: ${snapshot2.localPersonaCount}; active: ${snapshot2.activePersonaName}`, fg: FULLSCREEN_PALETTE.info }, { text: "Personas are local behavior profiles for the serial main-conversation assistant, not separate Agent jobs.", fg: FULLSCREEN_PALETTE.good }, { text: "Use them for tone, role, domain constraints, tool posture, and repeatable operating preferences.", fg: FULLSCREEN_PALETTE.muted }, { text: "" }, ...localLibraryLines("Persona Library", snapshot2.localPersonas, "No local personas yet. Create one here with Create persona.", workspace.selectedLocalLibraryItem("persona")?.id ?? null));
902425
+ base2.push({ text: `Personas: ${snapshot2.localPersonaCount}; active: ${snapshot2.activePersonaName}`, fg: FULLSCREEN_PALETTE.info }, ...compactLocalLibraryLines("Persona Library", snapshot2.localPersonas, "Create one with Create persona.", workspace.selectedLocalLibraryItem("persona")?.id ?? null), { text: "Personas shape the serial main-conversation assistant.", fg: FULLSCREEN_PALETTE.good });
902580
902426
  } else if (category.id === "skills") {
902581
- base2.push({ text: `Skills: ${snapshot2.localSkillCount}; enabled: ${snapshot2.enabledSkillCount}; bundles: ${snapshot2.localSkillBundleCount}; enabled bundles: ${snapshot2.enabledSkillBundleCount}; active skills: ${snapshot2.activeSkillCount}`, fg: FULLSCREEN_PALETTE.info }, { text: "Skills are reusable local procedures the assistant can apply from the main conversation.", fg: FULLSCREEN_PALETTE.good }, { text: "Enabled skills and enabled bundles are injected as operating guidance; secret-looking content is rejected.", fg: FULLSCREEN_PALETTE.warn }, { text: "" }, ...localLibraryLines("Skill Library", snapshot2.localSkills, "No local skills yet. Create one here with Create skill.", workspace.selectedLocalLibraryItem("skill")?.id ?? null), { text: "" }, ...localLibraryLines("Skill Bundles", snapshot2.localSkillBundles, "No local skill bundles yet. Use Skill bundles and Create bundle after creating skills.", null));
902427
+ base2.push({ text: `Skills: ${snapshot2.localSkillCount}; enabled: ${snapshot2.enabledSkillCount}; bundles: ${snapshot2.localSkillBundleCount}; enabled bundles: ${snapshot2.enabledSkillBundleCount}; active skills: ${snapshot2.activeSkillCount}`, fg: FULLSCREEN_PALETTE.info }, ...compactLocalLibraryLines("Skill Library", snapshot2.localSkills, "Create one with Create skill.", workspace.selectedLocalLibraryItem("skill")?.id ?? null), ...compactLocalLibraryLines("Skill Bundles", snapshot2.localSkillBundles, "Create one after adding skills.", null), { text: "Enabled skills/bundles become operating guidance; secrets are rejected.", fg: FULLSCREEN_PALETTE.warn });
902582
902428
  } else if (category.id === "routines") {
902583
902429
  const ready = readyRoutineItems(snapshot2);
902584
902430
  const needsSetup = routinesNeedingSetup(snapshot2);
902585
902431
  const needsReview = routinesNeedingReview(snapshot2);
902586
- base2.push({ text: `Routines: ${snapshot2.localRoutineCount}; enabled: ${snapshot2.enabledRoutineCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Schedule-ready routines: ${ready.length}; setup gaps: ${needsSetup.length}; review needed: ${needsReview.length}`, fg: needsSetup.length > 0 || needsReview.length > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, { text: "Routines are repeatable main-conversation workflows. Starting one does not create hidden jobs.", fg: FULLSCREEN_PALETTE.good }, { text: "Scheduling a reviewed routine is explicit and requires a confirmed schedule command.", fg: FULLSCREEN_PALETTE.warn }, routineNextActionLine(snapshot2), ...routineScheduleReceiptLines(snapshot2), { text: "" }, ...localLibraryLines("Routine Library", snapshot2.localRoutines, "No local routines yet. Create one here with Create routine.", workspace.selectedLocalLibraryItem("routine")?.id ?? null));
902432
+ base2.push({ text: `Routines: ${snapshot2.localRoutineCount}; enabled: ${snapshot2.enabledRoutineCount}`, fg: FULLSCREEN_PALETTE.info }, { text: `Schedule-ready routines: ${ready.length}; setup gaps: ${needsSetup.length}; review needed: ${needsReview.length}`, fg: needsSetup.length > 0 || needsReview.length > 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.good }, routineNextActionLine(snapshot2), compactRoutineReceiptLine(snapshot2), ...compactLocalLibraryLines("Routine Library", snapshot2.localRoutines, "Create one with Create routine.", workspace.selectedLocalLibraryItem("routine")?.id ?? null), { text: "Scheduling requires a confirmed action.", fg: FULLSCREEN_PALETTE.warn });
902587
902433
  } else if (category.id === "work") {
902588
- base2.push({ text: "Work plan and approvals are read or explicitly confirmed through public operator routes.", fg: FULLSCREEN_PALETTE.info }, { text: "This workspace does not approve, deny, cancel, or mutate requests by selection alone.", fg: FULLSCREEN_PALETTE.good }, { text: "Approve, deny, and cancel forms require an approval id and typed confirmation.", fg: FULLSCREEN_PALETTE.warn });
902434
+ base2.push({ text: "Work plans and approvals are read or explicitly confirmed.", fg: FULLSCREEN_PALETTE.info }, { text: "Selection alone does not approve, deny, cancel, or mutate requests.", fg: FULLSCREEN_PALETTE.good }, { text: "Approval actions require id plus typed confirmation.", fg: FULLSCREEN_PALETTE.warn });
902589
902435
  } else if (category.id === "automation") {
902590
902436
  const ready = readyRoutineItems(snapshot2);
902591
- base2.push({ text: "Automation and schedules default to read-only observability; side effects require confirmed forms.", fg: FULLSCREEN_PALETTE.info }, { text: "Confirmed reminders and routine promotion use connected schedules only.", fg: FULLSCREEN_PALETTE.info }, { text: "Local scheduler mutation controls remain blocked; job/run/schedule controls go through the connected host.", fg: FULLSCREEN_PALETTE.warn }, { text: "Reminder path: Create reminder -> choose at/every/cron -> optional delivery target -> confirm yes.", fg: FULLSCREEN_PALETTE.good }, { text: "Operator path: choose job/run/schedule action -> enter id -> type yes -> dispatch once.", fg: FULLSCREEN_PALETTE.good }, { text: "Routine path: Routines -> resolve setup -> review selected -> Promote routine -> Reconcile schedules.", fg: FULLSCREEN_PALETTE.good }, { text: `Schedule-ready routines: ${ready.length}; local promotion receipts: ${snapshot2.routineScheduleReceiptCount}`, fg: ready.length > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, automationNextActionLine(snapshot2), ...routineScheduleReceiptLines(snapshot2));
902437
+ base2.push({ text: `Automation: ${ready.length} schedule-ready routine(s); receipts ${snapshot2.routineScheduleReceiptCount}.`, fg: ready.length > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, automationNextActionLine(snapshot2), compactRoutineReceiptLine(snapshot2), { text: "Reminders and routine promotion require confirmation.", fg: FULLSCREEN_PALETTE.warn });
902592
902438
  } else if (category.id === "delegate") {
902593
- base2.push({ text: "Build/fix/review work is handed to GoodVibes TUI/shared-session contracts.", fg: FULLSCREEN_PALETTE.info }, { text: `Delegated review policy: ${snapshot2.delegatedReviewPolicy}`, fg: FULLSCREEN_PALETTE.warn }, { text: "Agent does not create coding-role Agent jobs.", fg: FULLSCREEN_PALETTE.good });
902439
+ base2.push({ text: "Build/fix/review work is handed to GoodVibes TUI.", fg: FULLSCREEN_PALETTE.info }, { text: `Delegated review policy: ${snapshot2.delegatedReviewPolicy}`, fg: FULLSCREEN_PALETTE.warn }, { text: "No coding-role Agent jobs are created here.", fg: FULLSCREEN_PALETTE.good });
902594
902440
  }
902595
902441
  if (snapshot2.warnings.length > 0) {
902596
- base2.push({ text: "", dim: true }, { text: "Warnings", fg: FULLSCREEN_PALETTE.warn, bold: true });
902597
- for (const warning of snapshot2.warnings)
902598
- base2.push({ text: warning, fg: FULLSCREEN_PALETTE.warn });
902442
+ base2.push({ text: `Warnings: ${snapshot2.warnings.map((warning) => compactText3(warning, 60)).join("; ")}`, fg: FULLSCREEN_PALETTE.warn });
902599
902443
  }
902600
902444
  return base2;
902601
902445
  }
@@ -902603,11 +902447,11 @@ function editorContextLines(editor) {
902603
902447
  const selected = editor.fields[editor.selectedFieldIndex];
902604
902448
  const lines = [
902605
902449
  { text: editor.title, fg: FULLSCREEN_PALETTE.title, bold: true },
902606
- { text: editor.message, fg: editor.message.includes("required") || editor.message.includes("cannot") || editor.message.includes("Cannot") ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info },
902607
- { text: "Enter advances fields and saves from the final field. Ctrl-J adds a line inside multiline fields. Esc cancels without writing.", fg: FULLSCREEN_PALETTE.muted }
902450
+ { text: compactText3(editor.message), fg: editor.message.includes("required") || editor.message.includes("cannot") || editor.message.includes("Cannot") ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info },
902451
+ { text: "Enter next/save; Ctrl-J newline; Esc cancel.", fg: FULLSCREEN_PALETTE.muted }
902608
902452
  ];
902609
902453
  if (selected) {
902610
- lines.push({ text: "" }, { text: `Editing: ${selected.label}${selected.required ? " (required)" : ""}`, fg: FULLSCREEN_PALETTE.title, bold: true }, { text: selected.hint, fg: FULLSCREEN_PALETTE.muted });
902454
+ lines.push({ text: `Editing: ${selected.label}${selected.required ? " (required)" : ""}`, fg: FULLSCREEN_PALETTE.title, bold: true }, { text: compactText3(selected.hint), fg: FULLSCREEN_PALETTE.muted });
902611
902455
  }
902612
902456
  return lines;
902613
902457
  }
@@ -902615,27 +902459,24 @@ function buildContextRows(workspace, category, action2, width) {
902615
902459
  const lines = [
902616
902460
  { text: category.label, fg: FULLSCREEN_PALETTE.title, bold: true },
902617
902461
  { text: category.summary, fg: FULLSCREEN_PALETTE.subtitle },
902618
- { text: "" },
902619
- { text: category.detail, fg: FULLSCREEN_PALETTE.text },
902620
- { text: "" },
902621
902462
  ...workspace.actionSearchActive ? [
902622
902463
  { text: "Action Search", fg: FULLSCREEN_PALETTE.title, bold: true },
902623
902464
  {
902624
902465
  text: workspace.actionSearchQuery.length > 0 ? `Query: ${workspace.actionSearchQuery} (${workspace.actionSearchResults.length} result${workspace.actionSearchResults.length === 1 ? "" : "s"})` : "Type to search every Agent workspace action.",
902625
902466
  fg: workspace.actionSearchQuery.length > 0 && workspace.actionSearchResults.length === 0 ? FULLSCREEN_PALETTE.warn : FULLSCREEN_PALETTE.info
902626
902467
  },
902627
- { text: "Enter opens the selected result. Esc clears search and returns to normal workspace navigation.", fg: FULLSCREEN_PALETTE.muted },
902628
- { text: "" }
902468
+ { text: "Enter opens; Esc clears.", fg: FULLSCREEN_PALETTE.muted }
902629
902469
  ] : [],
902630
- ...workspace.localEditor ? editorContextLines(workspace.localEditor) : [],
902631
- ...workspace.localEditor ? [{ text: "" }] : [],
902632
- ...snapshotLines(workspace, category, workspace.runtimeSnapshot)
902470
+ ...workspace.localEditor ? editorContextLines(workspace.localEditor) : []
902633
902471
  ];
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
- }
902472
+ const selectedActionLines = action2 ? [
902473
+ { text: `Selected: ${action2.label}`, fg: FULLSCREEN_PALETTE.title, bold: true },
902474
+ actionMetaLine(action2)
902475
+ ] : [];
902476
+ const snapshotContextLines = snapshotLines(workspace, category, workspace.runtimeSnapshot);
902477
+ lines.push(...selectedActionLines, ...snapshotContextLines);
902637
902478
  if (workspace.lastActionResult) {
902638
- 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 });
902479
+ lines.push({ text: "Action Result", fg: FULLSCREEN_PALETTE.title, bold: true }, { text: workspace.lastActionResult.title, fg: actionResultColor(workspace.lastActionResult), bold: true }, { text: compactText3(workspace.lastActionResult.detail), fg: FULLSCREEN_PALETTE.text });
902639
902480
  if (workspace.lastActionResult.command) {
902640
902481
  lines.push({ text: `Command: ${workspace.lastActionResult.command}`, fg: FULLSCREEN_PALETTE.muted });
902641
902482
  }
@@ -902768,13 +902609,12 @@ function footerText3(workspace) {
902768
902609
  function renderAgentWorkspace(workspace, width, height) {
902769
902610
  const category = workspace.selectedActionCategory;
902770
902611
  const action2 = workspace.selectedAction;
902771
- const setupCategory = category.id === "setup";
902772
902612
  const layoutOptions = {
902773
902613
  width,
902774
902614
  height,
902775
902615
  leftWidth: width < 90 ? undefined : 30,
902776
- contextRatio: setupCategory ? 0.86 : 0.62,
902777
- minContextRows: setupCategory ? 18 : 10
902616
+ contextRatio: 0.4,
902617
+ minContextRows: 10
902778
902618
  };
902779
902619
  const metrics = getFullscreenWorkspaceMetrics(layoutOptions);
902780
902620
  return renderFullscreenWorkspace({