@pellux/goodvibes-agent 1.0.2 → 1.0.3

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.
@@ -389257,6 +389257,23 @@ function createSchema2(db) {
389257
389257
  `);
389258
389258
  db.run(`CREATE INDEX IF NOT EXISTS idx_knowledge_schedules_job_id ON knowledge_schedules(job_id)`);
389259
389259
  }
389260
+ function getKnowledgeSchemaStatements() {
389261
+ const statements = [];
389262
+ createSchema2({
389263
+ run(sql) {
389264
+ const normalized = sql.trim();
389265
+ if (normalized.length > 0)
389266
+ statements.push(normalized);
389267
+ }
389268
+ });
389269
+ return statements;
389270
+ }
389271
+ function renderKnowledgeSchemaSql() {
389272
+ return `${getKnowledgeSchemaStatements().map((statement) => statement.endsWith(";") ? statement : `${statement};`).join(`
389273
+
389274
+ `)}
389275
+ `;
389276
+ }
389260
389277
  function rowObject(columns, values2) {
389261
389278
  return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
389262
389279
  }
@@ -702594,6 +702611,9 @@ var init_ingest = __esm(() => {
702594
702611
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
702595
702612
  var init_browser_history = __esm(() => {
702596
702613
  init_ingest();
702614
+ init_discover();
702615
+ init_readers();
702616
+ init_paths2();
702597
702617
  });
702598
702618
 
702599
702619
  // node_modules/graphql/jsutils/devAssert.mjs
@@ -720233,6 +720253,7 @@ var init_semantic = __esm(() => {
720233
720253
  init_llm();
720234
720254
  init_gap_repair();
720235
720255
  init_service4();
720256
+ init_self_improvement();
720236
720257
  });
720237
720258
 
720238
720259
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
@@ -724201,8 +724222,40 @@ var init_map_view = __esm(() => {
724201
724222
  });
724202
724223
 
724203
724224
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
724204
- var HOME_GRAPH_CAPABILITIES;
724225
+ var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
724205
724226
  var init_types6 = __esm(() => {
724227
+ HOME_GRAPH_NODE_KINDS = [
724228
+ "ha_home",
724229
+ "ha_entity",
724230
+ "ha_device",
724231
+ "ha_area",
724232
+ "ha_automation",
724233
+ "ha_script",
724234
+ "ha_scene",
724235
+ "ha_label",
724236
+ "ha_integration",
724237
+ "ha_room",
724238
+ "ha_device_passport",
724239
+ "ha_maintenance_item",
724240
+ "ha_troubleshooting_case",
724241
+ "ha_purchase",
724242
+ "ha_network_node"
724243
+ ];
724244
+ HOME_GRAPH_RELATIONS = [
724245
+ "controls",
724246
+ "located_in",
724247
+ "belongs_to_device",
724248
+ "has_manual",
724249
+ "has_receipt",
724250
+ "has_warranty",
724251
+ "has_issue",
724252
+ "fixed_by",
724253
+ "uses_battery",
724254
+ "connected_via",
724255
+ "part_of_network",
724256
+ "mentioned_by",
724257
+ "source_for"
724258
+ ];
724206
724259
  HOME_GRAPH_CAPABILITIES = [
724207
724260
  "knowledge-space-isolation",
724208
724261
  "snapshot-sync",
@@ -725609,6 +725662,7 @@ var init_service5 = __esm(() => {
725609
725662
  var init_home_graph = __esm(() => {
725610
725663
  init_service5();
725611
725664
  init_extension();
725665
+ init_types6();
725612
725666
  });
725613
725667
 
725614
725668
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-refinement.js
@@ -727936,10 +727990,14 @@ var init_service6 = __esm(() => {
727936
727990
  var init_project_planning = __esm(() => {
727937
727991
  init_service6();
727938
727992
  init_helpers3();
727993
+ init_readiness();
727939
727994
  });
727940
727995
 
727941
727996
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
727942
- var init_persistence = () => {};
727997
+ var init_persistence = __esm(() => {
727998
+ init_store_schema();
727999
+ init_store_load();
728000
+ });
727943
728001
 
727944
728002
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
727945
728003
  class KnowledgeProjectionService {
@@ -731447,21 +731505,21 @@ var init_service7 = __esm(() => {
731447
731505
  var exports_knowledge = {};
731448
731506
  __export(exports_knowledge, {
731449
731507
  withKnowledgeSpace: () => withKnowledgeSpace,
731450
- uniqKnowledgeValues: () => uniq3,
731451
- stabilizeKnowledgeText: () => stableText2,
731452
- runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement2,
731508
+ uniqKnowledgeValues: () => uniq2,
731509
+ stabilizeKnowledgeText: () => stableText,
731510
+ runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
731453
731511
  resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
731454
- resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir2,
731512
+ resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
731455
731513
  renderPacket: () => renderPacket,
731456
731514
  renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
731457
731515
  renderKnowledgeMap: () => renderKnowledgeMap,
731458
731516
  readKnowledgeSearchText: () => readKnowledgeSearchText,
731459
- readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile2,
731517
+ readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
731460
731518
  projectPlanningSourceId: () => projectPlanningSourceId,
731461
731519
  projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
731462
731520
  projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
731463
731521
  projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
731464
- parseKnowledgeJsonValue: () => parseJsonValue2,
731522
+ parseKnowledgeJsonValue: () => parseJsonValue,
731465
731523
  normalizeProjectId: () => normalizeProjectId,
731466
731524
  normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
731467
731525
  normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
@@ -731469,12 +731527,12 @@ __export(exports_knowledge, {
731469
731527
  materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
731470
731528
  looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
731471
731529
  looksBinaryLikeText: () => looksBinaryLikeText,
731472
- loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot2,
731530
+ loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
731473
731531
  listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
731474
- listBrowserKinds: () => listBrowserKinds2,
731532
+ listBrowserKinds: () => listBrowserKinds,
731475
731533
  knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
731476
731534
  knowledgePageSourceWeight: () => knowledgePageSourceWeight,
731477
- knowledgeNowMs: () => nowMs2,
731535
+ knowledgeNowMs: () => nowMs,
731478
731536
  knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
731479
731537
  isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
731480
731538
  isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
@@ -731494,12 +731552,12 @@ __export(exports_knowledge, {
731494
731552
  generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
731495
731553
  generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
731496
731554
  extractKnowledgeArtifact: () => extractKnowledgeArtifact,
731497
- evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness2,
731498
- discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles2,
731555
+ evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
731556
+ discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
731499
731557
  createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
731500
731558
  createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
731501
731559
  createMemoryApi: () => createMemoryApi,
731502
- createKnowledgeSchema: () => createSchema3,
731560
+ createKnowledgeSchema: () => createSchema2,
731503
731561
  createKnowledgeApi: () => createKnowledgeApi,
731504
731562
  createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
731505
731563
  compareKnowledgePageSources: () => compareKnowledgePageSources,
@@ -733937,7 +733995,7 @@ var init_delivery_manager = __esm(() => {
733937
733995
  });
733938
733996
 
733939
733997
  // node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
733940
- function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
733998
+ function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
733941
733999
  let slotsInUse = 0;
733942
734000
  const queuedRuns = [];
733943
734001
  for (const run7 of runs) {
@@ -733947,7 +734005,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
733947
734005
  queuedRuns.push(run7);
733948
734006
  }
733949
734007
  const queueDepth = queuedRuns.length;
733950
- const oldestQueuedAgeMs = queueDepth > 0 ? nowMs3 - Math.min(...queuedRuns.map((r5) => r5.queuedAt)) : null;
734008
+ const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r5) => r5.queuedAt)) : null;
733951
734009
  return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
733952
734010
  }
733953
734011
 
@@ -816508,7 +816566,7 @@ var createStyledCell = (char, overrides = {}) => ({
816508
816566
  // src/version.ts
816509
816567
  import { readFileSync } from "fs";
816510
816568
  import { join } from "path";
816511
- var _version = "1.0.2";
816569
+ var _version = "1.0.3";
816512
816570
  var _sdkVersion = "0.33.35";
816513
816571
  try {
816514
816572
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
@@ -839370,7 +839428,7 @@ var WORK_PLAN_STATUSES = [
839370
839428
  "failed",
839371
839429
  "cancelled"
839372
839430
  ];
839373
- function nowMs3() {
839431
+ function nowMs2() {
839374
839432
  return Date.now();
839375
839433
  }
839376
839434
  function isObject5(value) {
@@ -839476,7 +839534,7 @@ class WorkPlanStore {
839476
839534
  if (!normalizedTitle)
839477
839535
  throw new Error("Work plan item title is required.");
839478
839536
  const plan = this.readPlan();
839479
- const time4 = nowMs3();
839537
+ const time4 = nowMs2();
839480
839538
  const item = {
839481
839539
  id: createItemId(),
839482
839540
  title: normalizedTitle,
@@ -839500,7 +839558,7 @@ class WorkPlanStore {
839500
839558
  updateItem(idOrPrefix, patch2) {
839501
839559
  const plan = this.readPlan();
839502
839560
  const item = this.resolveItem(plan, idOrPrefix);
839503
- const time4 = nowMs3();
839561
+ const time4 = nowMs2();
839504
839562
  const nextStatus = patch2.status ?? item.status;
839505
839563
  const next = this.pruneItem({
839506
839564
  ...item,
@@ -839533,7 +839591,7 @@ class WorkPlanStore {
839533
839591
  removeItem(idOrPrefix) {
839534
839592
  const plan = this.readPlan();
839535
839593
  const item = this.resolveItem(plan, idOrPrefix);
839536
- const time4 = nowMs3();
839594
+ const time4 = nowMs2();
839537
839595
  const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
839538
839596
  this.writePlan({
839539
839597
  ...plan,
@@ -839553,7 +839611,7 @@ class WorkPlanStore {
839553
839611
  ...plan,
839554
839612
  items: remaining,
839555
839613
  activeItemId: remaining[0]?.id,
839556
- updatedAt: nowMs3()
839614
+ updatedAt: nowMs2()
839557
839615
  });
839558
839616
  return removed;
839559
839617
  }
@@ -839592,7 +839650,7 @@ class WorkPlanStore {
839592
839650
  const parsed = JSON.parse(raw);
839593
839651
  if (!isObject5(parsed))
839594
839652
  return this.createEmptyPlan();
839595
- const time4 = nowMs3();
839653
+ const time4 = nowMs2();
839596
839654
  const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
839597
839655
  const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
839598
839656
  const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
@@ -839611,7 +839669,7 @@ class WorkPlanStore {
839611
839669
  };
839612
839670
  }
839613
839671
  createEmptyPlan() {
839614
- const time4 = nowMs3();
839672
+ const time4 = nowMs2();
839615
839673
  return {
839616
839674
  id: createPlanId(this.options.projectId, this.options.projectRoot),
839617
839675
  projectId: this.options.projectId,
@@ -847717,13 +847775,13 @@ init_state3();
847717
847775
 
847718
847776
  // src/input/commands/recall-shared.ts
847719
847777
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
847720
- var VALID_SCOPES2 = ["session", "project", "team"];
847778
+ var VALID_SCOPES = ["session", "project", "team"];
847721
847779
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
847722
847780
  function isValidClass(s4) {
847723
847781
  return VALID_CLASSES.includes(s4);
847724
847782
  }
847725
847783
  function isValidScope(s4) {
847726
- return VALID_SCOPES2.includes(s4);
847784
+ return VALID_SCOPES.includes(s4);
847727
847785
  }
847728
847786
  function isValidReviewState(s4) {
847729
847787
  return VALID_REVIEW_STATES.includes(s4);
@@ -847766,7 +847824,7 @@ function handleRecallSearch(args2, context) {
847766
847824
  if (isValidScope(scope))
847767
847825
  filter.scope = scope;
847768
847826
  else {
847769
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
847827
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
847770
847828
  return;
847771
847829
  }
847772
847830
  }
@@ -847941,7 +847999,7 @@ function handleRecallList(args2, context) {
847941
847999
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
847942
848000
  const scope = args2[scopeIdx + 1];
847943
848001
  if (!isValidScope(scope)) {
847944
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848002
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
847945
848003
  return;
847946
848004
  }
847947
848005
  filter.scope = scope;
@@ -847991,7 +848049,7 @@ async function handleRecallAdd(args2, context) {
847991
848049
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
847992
848050
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
847993
848051
  if (scopeRaw && !isValidScope(scopeRaw)) {
847994
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848052
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
847995
848053
  return;
847996
848054
  }
847997
848055
  const provenance = [];
@@ -848125,7 +848183,7 @@ function handleRecallExport(args2, context) {
848125
848183
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
848126
848184
  const scope = commandArgs[scopeIdx + 1];
848127
848185
  if (!isValidScope(scope)) {
848128
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848186
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
848129
848187
  return;
848130
848188
  }
848131
848189
  filter.scope = scope;
@@ -848204,7 +848262,7 @@ function handleRecallHandoffExport(args2, context) {
848204
848262
  const scopeIdx = commandArgs.indexOf("--scope");
848205
848263
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
848206
848264
  if (!scopeRaw || !isValidScope(scopeRaw)) {
848207
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848265
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
848208
848266
  return;
848209
848267
  }
848210
848268
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -848320,7 +848378,7 @@ function handleRecallPromote(args2, context) {
848320
848378
  const id = parsed.rest[0];
848321
848379
  const scope = parsed.rest[1];
848322
848380
  if (!id || !scope || !isValidScope(scope)) {
848323
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
848381
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
848324
848382
  return;
848325
848383
  }
848326
848384
  if (!parsed.yes) {
@@ -859718,6 +859776,20 @@ function normalizeHelpTopic(topic) {
859718
859776
  const normalized = topic.trim().toLowerCase();
859719
859777
  return HELP_ALIASES[normalized] ?? normalized;
859720
859778
  }
859779
+ function describeGoodVibesCommandHelp(topic) {
859780
+ const normalized = normalizeHelpTopic(topic);
859781
+ const help = COMMAND_HELP[normalized];
859782
+ if (!help)
859783
+ return null;
859784
+ return {
859785
+ command: normalized,
859786
+ aliases: Object.entries(HELP_ALIASES).filter(([, target]) => target === normalized).map(([alias]) => alias).sort(),
859787
+ summary: help.summary,
859788
+ usage: help.usage,
859789
+ subcommands: help.subcommands ?? [],
859790
+ examples: help.examples ?? []
859791
+ };
859792
+ }
859721
859793
  function renderGoodVibesCommandHelp(topic, binary2 = "goodvibes-agent") {
859722
859794
  const normalized = normalizeHelpTopic(topic);
859723
859795
  const help = COMMAND_HELP[normalized];
@@ -860388,6 +860460,15 @@ var BLOCKED_PRODUCT_COMMAND_HINTS = {
860388
860460
  web: () => "Unsupported command: web. GoodVibes Agent does not start web servers or expose browser routes.",
860389
860461
  webhook: () => "Unsupported command: webhook. GoodVibes Agent can send explicit channel messages, but it does not create webhook listeners."
860390
860462
  };
860463
+ function listGoodVibesCliCommandTokens() {
860464
+ return Object.keys(COMMAND_ALIASES).sort();
860465
+ }
860466
+ function listGoodVibesCliCommands() {
860467
+ return [...new Set(["tui", ...Object.values(COMMAND_ALIASES)])].sort();
860468
+ }
860469
+ function listBlockedGoodVibesCliCommandTokens() {
860470
+ return Object.keys(BLOCKED_PRODUCT_COMMAND_HINTS).sort();
860471
+ }
860391
860472
  function createDefaultFlags() {
860392
860473
  return {
860393
860474
  provider: undefined,
@@ -862073,7 +862154,7 @@ import { mkdirSync as mkdirSync64, readFileSync as readFileSync86, writeFileSync
862073
862154
  import { dirname as dirname63, resolve as resolve39 } from "path";
862074
862155
  init_state3();
862075
862156
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
862076
- var VALID_SCOPES4 = ["session", "project", "team"];
862157
+ var VALID_SCOPES3 = ["session", "project", "team"];
862077
862158
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
862078
862159
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
862079
862160
  var VALUE_OPTIONS = new Set([
@@ -862173,7 +862254,7 @@ function isMemoryClass2(value) {
862173
862254
  return VALID_CLASSES2.includes(value);
862174
862255
  }
862175
862256
  function isMemoryScope2(value) {
862176
- return VALID_SCOPES4.includes(value);
862257
+ return VALID_SCOPES3.includes(value);
862177
862258
  }
862178
862259
  function isReviewState(value) {
862179
862260
  return VALID_REVIEW_STATES3.includes(value);
@@ -862188,7 +862269,7 @@ function requireClass(value) {
862188
862269
  }
862189
862270
  function requireScope(value) {
862190
862271
  if (!value || !isMemoryScope2(value))
862191
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
862272
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
862192
862273
  return value;
862193
862274
  }
862194
862275
  function optionalScope(value) {
@@ -879137,224 +879218,6 @@ function actionSearchStatus(host) {
879137
879218
  return count === 0 ? `No Agent workspace actions match "${host.actionSearchQuery}".` : `Found ${count} Agent workspace action(s) for "${host.actionSearchQuery}".`;
879138
879219
  }
879139
879220
 
879140
- // src/tools/agent-harness-local-operations.ts
879141
- function output6(value) {
879142
- return { success: true, output: typeof value === "string" ? value : JSON.stringify(value, null, 2) };
879143
- }
879144
- function error51(message) {
879145
- return { success: false, error: message };
879146
- }
879147
- function readString50(value) {
879148
- return typeof value === "string" ? value.trim() : "";
879149
- }
879150
- function readFieldMap(value) {
879151
- if (typeof value !== "object" || value === null || Array.isArray(value))
879152
- return {};
879153
- return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, typeof entry === "string" ? entry : String(entry)]));
879154
- }
879155
- function describeEditor(editor) {
879156
- return {
879157
- kind: editor.kind,
879158
- mode: editor.mode,
879159
- recordId: editor.recordId,
879160
- title: editor.title,
879161
- message: editor.message,
879162
- fields: editor.fields.map((field) => ({
879163
- id: field.id,
879164
- label: field.label,
879165
- required: field.required,
879166
- multiline: field.multiline,
879167
- hint: field.hint,
879168
- default: field.redact ? "<redacted>" : field.value
879169
- }))
879170
- };
879171
- }
879172
- function readRecordId(args2) {
879173
- const fields = readFieldMap(args2.fields);
879174
- return readString50(args2.recordId ?? args2.id ?? fields.recordId ?? fields.id);
879175
- }
879176
- function requireConfirmed(args2, label) {
879177
- if (!readString50(args2.explicitUserRequest))
879178
- return `${label} requires explicitUserRequest with the user's exact request or a short faithful summary.`;
879179
- if (args2.confirm !== true)
879180
- return `${label} requires confirm:true after an explicit user request.`;
879181
- return null;
879182
- }
879183
- function fieldReader(editor, fields) {
879184
- return (id) => fields[id] ?? editor.fields.find((field) => field.id === id)?.value ?? "";
879185
- }
879186
- function hasExecutionFields(args2) {
879187
- return Object.keys(readFieldMap(args2.fields)).some((key) => key !== "id" && key !== "recordId");
879188
- }
879189
- function missingRequiredFields(editor, fields) {
879190
- const read = fieldReader(editor, fields);
879191
- return editor.fields.filter((field) => field.required && !read(field.id).trim()).map((field) => field.id);
879192
- }
879193
- function registryTarget(operation) {
879194
- if (operation === "memory-edit")
879195
- return { domain: "memory", action: "update", requiresRecordId: true };
879196
- if (operation === "memory-review")
879197
- return { domain: "memory", action: "review", requiresRecordId: true };
879198
- if (operation === "memory-stale")
879199
- return { domain: "memory", action: "stale", requiresRecordId: true };
879200
- if (operation === "memory-delete")
879201
- return { domain: "memory", action: "delete", requiresRecordId: true };
879202
- if (operation === "note-edit")
879203
- return { domain: "note", action: "update", requiresRecordId: true };
879204
- if (operation === "note-review")
879205
- return { domain: "note", action: "review", requiresRecordId: true };
879206
- if (operation === "note-stale")
879207
- return { domain: "note", action: "stale", requiresRecordId: true };
879208
- if (operation === "note-delete")
879209
- return { domain: "note", action: "delete", requiresRecordId: true };
879210
- if (operation === "persona-edit")
879211
- return { domain: "persona", action: "update", requiresRecordId: true };
879212
- if (operation === "persona-use")
879213
- return { domain: "persona", action: "use", requiresRecordId: true };
879214
- if (operation === "persona-review")
879215
- return { domain: "persona", action: "review", requiresRecordId: true };
879216
- if (operation === "persona-clear")
879217
- return { domain: "persona", action: "clear_active", requiresRecordId: false };
879218
- if (operation === "persona-delete")
879219
- return { domain: "persona", action: "delete", requiresRecordId: true };
879220
- if (operation === "skill-edit")
879221
- return { domain: "skill", action: "update", requiresRecordId: true };
879222
- if (operation === "skill-enable")
879223
- return { domain: "skill", action: "enable", requiresRecordId: true };
879224
- if (operation === "skill-disable")
879225
- return { domain: "skill", action: "disable", requiresRecordId: true };
879226
- if (operation === "skill-review")
879227
- return { domain: "skill", action: "review", requiresRecordId: true };
879228
- if (operation === "skill-delete")
879229
- return { domain: "skill", action: "delete", requiresRecordId: true };
879230
- if (operation === "routine-edit")
879231
- return { domain: "routine", action: "update", requiresRecordId: true };
879232
- if (operation === "routine-start")
879233
- return { domain: "routine", action: "start", requiresRecordId: true };
879234
- if (operation === "routine-enable")
879235
- return { domain: "routine", action: "enable", requiresRecordId: true };
879236
- if (operation === "routine-disable")
879237
- return { domain: "routine", action: "disable", requiresRecordId: true };
879238
- if (operation === "routine-review")
879239
- return { domain: "routine", action: "review", requiresRecordId: true };
879240
- if (operation === "routine-delete")
879241
- return { domain: "routine", action: "delete", requiresRecordId: true };
879242
- return null;
879243
- }
879244
- function editorForOperation(context, operation, recordId) {
879245
- const shellPaths3 = context.workspace.shellPaths;
879246
- if (operation === "memory-edit") {
879247
- const record2 = context.clients?.agentKnowledgeApi?.memory?.get(recordId);
879248
- return record2 ? createMemoryUpdateEditor(record2) : null;
879249
- }
879250
- if (!shellPaths3)
879251
- return null;
879252
- if (operation === "note-edit") {
879253
- const note = AgentNoteRegistry.fromShellPaths(shellPaths3).get(recordId);
879254
- return note ? createNoteUpdateEditor(note) : null;
879255
- }
879256
- if (operation === "note-promote-memory" || operation === "note-promote-persona" || operation === "note-promote-skill" || operation === "note-promote-routine" || operation === "note-promote-knowledge-url") {
879257
- const note = AgentNoteRegistry.fromShellPaths(shellPaths3).get(recordId);
879258
- if (!note)
879259
- return null;
879260
- if (operation === "note-promote-memory")
879261
- return createMemoryEditorFromNote(note);
879262
- if (operation === "note-promote-persona")
879263
- return createPersonaEditorFromNote(note);
879264
- if (operation === "note-promote-skill")
879265
- return createSkillEditorFromNote(note);
879266
- if (operation === "note-promote-routine")
879267
- return createRoutineEditorFromNote(note);
879268
- return note.sourceUrl ? createKnowledgeUrlEditorFromNote(note) : null;
879269
- }
879270
- if (operation === "persona-edit") {
879271
- const registry5 = AgentPersonaRegistry.fromShellPaths(shellPaths3);
879272
- const persona = registry5.get(recordId);
879273
- return persona ? createPersonaUpdateEditor(persona, registry5.snapshot().activePersonaId === persona.id) : null;
879274
- }
879275
- if (operation === "skill-edit") {
879276
- const skill = AgentSkillRegistry.fromShellPaths(shellPaths3).get(recordId);
879277
- return skill ? createSkillUpdateEditor(skill) : null;
879278
- }
879279
- if (operation === "routine-edit") {
879280
- const routine = AgentRoutineRegistry.fromShellPaths(shellPaths3).get(recordId);
879281
- return routine ? createRoutineUpdateEditor(routine) : null;
879282
- }
879283
- return null;
879284
- }
879285
- function localRegistryArgsFromEditor(editor, fields, id) {
879286
- const read = fieldReader(editor, fields);
879287
- if (editor.kind === "memory")
879288
- return { domain: "memory", action: editor.mode === "update" ? "update" : "create", id, cls: read("cls"), scope: read("scope"), summary: read("summary"), detail: read("detail"), tags: splitList5(read("tags")), confidence: read("confidence"), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879289
- if (editor.kind === "note")
879290
- return { domain: "note", action: "update", id, title: read("title"), body: read("body"), sourceUrl: read("sourceUrl"), tags: splitList5(read("tags")), provenance: "agent-harness-local-operation" };
879291
- if (editor.kind === "persona")
879292
- return { domain: "persona", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), body: read("body"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), activate: read("activate"), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879293
- if (editor.kind === "skill")
879294
- return { domain: "skill", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), procedure: read("procedure"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), requiresEnv: splitList5(read("requiresEnv")), requiresCommands: splitList5(read("requiresCommands")), enabled: isAffirmative15(read("enabled")), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879295
- return { domain: "routine", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), steps: read("steps"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), requiresEnv: splitList5(read("requiresEnv")), requiresCommands: splitList5(read("requiresCommands")), enabled: isAffirmative15(read("enabled")), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879296
- }
879297
- function localRegistryArgsForTarget(target, args2, recordId) {
879298
- const fields = readFieldMap(args2.fields);
879299
- const base2 = { domain: target.domain, action: target.action, ...recordId ? { id: recordId } : {} };
879300
- const edit = target.action === "update" ? localRegistryArgsFromEditor({ kind: target.domain, mode: "update", recordId, title: "", selectedFieldIndex: 0, message: "", fields: [] }, fields, recordId) : {};
879301
- return {
879302
- ...base2,
879303
- ...edit,
879304
- ...target.action === "stale" && fields.reason ? { reason: fields.reason } : {},
879305
- ...target.action === "delete" ? { confirm: args2.confirm, explicitUserRequest: readString50(args2.explicitUserRequest) } : {}
879306
- };
879307
- }
879308
- async function executeTool(toolRegistry, name51, toolArgs) {
879309
- if (!toolRegistry.has(name51))
879310
- return output6({ status: "model_tool_required", modelExecution: { tool: name51, args: toolArgs } });
879311
- const result2 = await toolRegistry.execute(`agent-harness-${name51}-${Date.now()}`, name51, toolArgs);
879312
- if (!result2.success)
879313
- return error51(result2.error ?? `${name51} failed.`);
879314
- return output6({ status: "executed_model_tool", tool: name51, output: result2.output ?? "" });
879315
- }
879316
- function describeLocalWorkspaceModelExecution(action2) {
879317
- if (action2.kind === "local-selection")
879318
- return { tool: "agent_local_registry", domain: action2.localKind, actions: ["list", "search", "get"], note: "TUI selection maps to recordId for model-run local-operation actions." };
879319
- if (!action2.localOperation)
879320
- return null;
879321
- const target = registryTarget(action2.localOperation);
879322
- if (target)
879323
- return { tool: "agent_local_registry", domain: target.domain, action: target.action, requiresRecordId: target.requiresRecordId };
879324
- if (action2.localOperation === "note-promote-knowledge-url")
879325
- return { tool: "agent_knowledge_ingest", sourceKind: "url", requiresRecordId: true, selectedRecordDomain: "note" };
879326
- return { tool: "agent_local_registry", selectedRecordDomain: "note", action: "create", requiresRecordId: true };
879327
- }
879328
- async function runLocalWorkspaceAction(deps, action2, args2) {
879329
- if (action2.kind === "local-selection")
879330
- return output6({ status: "local_selection", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
879331
- const operation = action2.localOperation;
879332
- if (!operation)
879333
- return output6({ status: "local_registry_action", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
879334
- const target = registryTarget(operation);
879335
- const recordId = readRecordId(args2);
879336
- if (target?.requiresRecordId && !recordId)
879337
- return output6({ status: "needs_record_id", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
879338
- const editor = recordId ? editorForOperation(deps.commandContext, operation, recordId) : null;
879339
- if (editor && !hasExecutionFields(args2) && args2.confirm !== true)
879340
- return output6({ status: "editor", action: action2.id, editor: describeEditor(editor), modelExecution: describeLocalWorkspaceModelExecution(action2) });
879341
- const confirmationError2 = requireConfirmed(args2, "Workspace local registry action");
879342
- if (confirmationError2)
879343
- return error51(confirmationError2);
879344
- if (editor) {
879345
- const fields = readFieldMap(args2.fields);
879346
- const missing = missingRequiredFields(editor, fields);
879347
- if (missing.length > 0)
879348
- return output6({ status: "missing_required_fields", missing, action: action2.id, editor: describeEditor(editor) });
879349
- if (editor.kind === "knowledge-url")
879350
- return executeTool(deps.toolRegistry, "agent_knowledge_ingest", { sourceKind: "url", url: fieldReader(editor, fields)("url"), tags: splitList5(fieldReader(editor, fields)("tags")), folderPath: fieldReader(editor, fields)("folder"), confirm: args2.confirm, explicitUserRequest: readString50(args2.explicitUserRequest) });
879351
- return executeTool(deps.toolRegistry, "agent_local_registry", localRegistryArgsFromEditor(editor, fields, recordId));
879352
- }
879353
- if (!target)
879354
- return output6({ status: "local_registry_action", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
879355
- return executeTool(deps.toolRegistry, "agent_local_registry", localRegistryArgsForTarget(target, args2, recordId));
879356
- }
879357
-
879358
879221
  // src/tools/agent-harness-metadata.ts
879359
879222
  function describeCommandPolicy(commandName) {
879360
879223
  const root = commandName.replace(/^\//, "").trim().toLowerCase();
@@ -879458,6 +879321,95 @@ function describeCommandPolicy(commandName) {
879458
879321
  boundary: "Inspect the command description, usage, and workspace action metadata before invoking through run_command."
879459
879322
  };
879460
879323
  }
879324
+ function describeCliCommandPolicy(commandName) {
879325
+ const root = commandName.trim().toLowerCase();
879326
+ const confirmation = "agent_harness CLI command modes are discovery-only. Use first-class model tools, workspace actions, slash-command mirrors, or an explicit external shell request to execute equivalent CLI workflows.";
879327
+ if ([
879328
+ "app",
879329
+ "bridge",
879330
+ "control-plane",
879331
+ "controlplane",
879332
+ "cp",
879333
+ "daemon",
879334
+ "http-listener",
879335
+ "launch",
879336
+ "listener",
879337
+ "remote",
879338
+ "serve",
879339
+ "server",
879340
+ "service",
879341
+ "services",
879342
+ "start",
879343
+ "surface",
879344
+ "surfaces",
879345
+ "web",
879346
+ "webhook"
879347
+ ].includes(root)) {
879348
+ return {
879349
+ effect: "unknown",
879350
+ confirmation,
879351
+ boundary: "Blocked package CLI token. Agent can launch its own TUI and use public connected-host routes, but it does not manage connected-host lifecycle, listeners, servers, bridges, remotes, web surfaces, or webhook listeners."
879352
+ };
879353
+ }
879354
+ if (root === "tui" || root === "onboarding" || root === "help" || root === "version" || root === "completion") {
879355
+ return {
879356
+ effect: root === "tui" || root === "onboarding" ? "ui-navigation" : "read-only",
879357
+ confirmation,
879358
+ preferredModelTool: root === "onboarding" || root === "tui" ? "agent_harness workspace/workspace_actions" : "agent_harness cli_commands/cli_command",
879359
+ boundary: "Top-level CLI launch, setup, help, version, and completion commands are package entrypoint surfaces; use in-process workspace and slash-command bridges from the model when operating inside the TUI."
879360
+ };
879361
+ }
879362
+ if (root === "run") {
879363
+ return {
879364
+ effect: "mixed",
879365
+ confirmation,
879366
+ boundary: "The CLI run command starts a non-interactive Agent turn from a process entrypoint. Do not create hidden nested turns from agent_harness; answer the user directly in the current conversation."
879367
+ };
879368
+ }
879369
+ if (root === "status" || root === "doctor" || root === "auth" || root === "compat" || root === "models" || root === "providers" || root === "tasks") {
879370
+ return {
879371
+ effect: "read-only",
879372
+ confirmation,
879373
+ preferredModelTool: root === "tasks" ? "agent_operator_briefing" : "agent_harness connected_host/settings/tools",
879374
+ boundary: "Diagnostics and posture commands are readable from Agent-owned settings, provider, model, and connected-host capability surfaces without taking connected-host lifecycle ownership."
879375
+ };
879376
+ }
879377
+ if (root === "profiles" || root === "personas" || root === "skills" || root === "memory" || root === "routines" || root === "sessions" || root === "bundle") {
879378
+ return {
879379
+ effect: "local-state",
879380
+ confirmation,
879381
+ preferredModelTool: root === "profiles" ? "agent_harness workspace_actions/run_workspace_action" : "agent_local_registry",
879382
+ boundary: "Local library/profile/session/bundle CLI commands operate on Agent-local data. Mutations require explicit user intent and should use first-class Agent-local tools where available."
879383
+ };
879384
+ }
879385
+ if (root === "knowledge" || root === "ask" || root === "search") {
879386
+ return {
879387
+ effect: "mixed",
879388
+ confirmation,
879389
+ preferredModelTool: root === "knowledge" ? "agent_knowledge or agent_knowledge_ingest" : "agent_knowledge",
879390
+ boundary: "Agent Knowledge CLI commands must stay on isolated Agent Knowledge routes and never fall back to default or non-Agent knowledge spaces."
879391
+ };
879392
+ }
879393
+ if (root === "delegate") {
879394
+ return {
879395
+ effect: "delegated-work",
879396
+ confirmation,
879397
+ boundary: "Delegation is explicit user-directed work only; no hidden background review or separate Agent job should be created implicitly."
879398
+ };
879399
+ }
879400
+ if (root === "subscription" || root === "secrets" || root === "pair") {
879401
+ return {
879402
+ effect: root === "pair" ? "external-network" : "mixed",
879403
+ confirmation,
879404
+ boundary: "Provider subscription, secret, and pairing flows can expose credentials or external account state. Use only explicit user-directed flows and prefer secret refs over raw values."
879405
+ };
879406
+ }
879407
+ return {
879408
+ effect: "unknown",
879409
+ confirmation,
879410
+ boundary: "Inspect the CLI help, parser result, and preferred model routes before using an equivalent command path."
879411
+ };
879412
+ }
879461
879413
  function toolIsAvailable(toolRegistry, toolName) {
879462
879414
  return toolRegistry.getToolDefinitions().some((tool2) => tool2.name === toolName);
879463
879415
  }
@@ -879587,6 +879539,21 @@ function connectedHostRouteFamilies() {
879587
879539
  }
879588
879540
  ];
879589
879541
  }
879542
+ function connectedHostSummary(context, toolRegistry) {
879543
+ const shellPaths3 = context.workspace.shellPaths;
879544
+ const homeDirectory = shellPaths3?.homeDirectory ?? context.platform.configManager.getHomeDirectory() ?? "";
879545
+ const connection5 = resolveAgentConnectedHostConnection(context.platform.configManager, homeDirectory);
879546
+ return {
879547
+ baseUrl: connection5.baseUrl,
879548
+ operatorToken: connection5.token ? "configured" : "missing",
879549
+ tokenPath: connection5.tokenPath,
879550
+ ownership: "external-connected-host",
879551
+ lifecycle: "GoodVibes Agent can use public connected-host operator routes, but does not start, stop, restart, install, expose, or mutate the host listener.",
879552
+ routeFamilies: connectedHostRouteFamilies(),
879553
+ capabilities: connectedHostCapabilityMap(toolRegistry),
879554
+ blockedCapabilities: blockedConnectedHostCapabilities()
879555
+ };
879556
+ }
879590
879557
  function blockedConnectedHostCapabilities() {
879591
879558
  return [
879592
879559
  {
@@ -879621,9 +879588,489 @@ function settingsPolicySummary() {
879621
879588
  };
879622
879589
  }
879623
879590
 
879591
+ // src/tools/agent-harness-cli-metadata.ts
879592
+ function readString50(value) {
879593
+ return typeof value === "string" ? value.trim() : "";
879594
+ }
879595
+ function readLimit5(value, fallback) {
879596
+ const parsed = typeof value === "string" && value.trim() ? Number(value) : value;
879597
+ if (typeof parsed !== "number" || !Number.isFinite(parsed))
879598
+ return fallback;
879599
+ return Math.max(1, Math.min(500, Math.trunc(parsed)));
879600
+ }
879601
+ function cliCommandTokens(command8) {
879602
+ if (command8 === "unknown")
879603
+ return [];
879604
+ if (command8 === "tui")
879605
+ return ["(no command)"];
879606
+ return listGoodVibesCliCommandTokens().filter((token) => parseGoodVibesCli([token]).command === command8).sort();
879607
+ }
879608
+ function fallbackCliSummary(command8) {
879609
+ if (command8 === "tui")
879610
+ return "Launch the interactive Agent TUI.";
879611
+ if (command8 === "help")
879612
+ return "Print top-level or command-specific help.";
879613
+ if (command8 === "version")
879614
+ return "Print the installed Agent package version.";
879615
+ return "Inspect the CLI help for this Agent package command.";
879616
+ }
879617
+ function describeCliCommand(command8) {
879618
+ const help = describeGoodVibesCommandHelp(command8);
879619
+ const tokens = cliCommandTokens(command8);
879620
+ return {
879621
+ name: command8,
879622
+ tokens,
879623
+ invocation: command8 === "tui" ? "goodvibes-agent" : `goodvibes-agent ${tokens[0] ?? command8}`,
879624
+ helpTopic: help?.command ?? command8,
879625
+ summary: help?.summary ?? fallbackCliSummary(command8),
879626
+ usage: help?.usage ?? (command8 === "tui" ? ["goodvibes-agent [OPTIONS]"] : [`goodvibes-agent ${command8} [ARGS]`]),
879627
+ aliases: help?.aliases ?? tokens.filter((token) => token !== command8),
879628
+ subcommands: help?.subcommands ?? [],
879629
+ examples: help?.examples ?? [],
879630
+ policy: describeCliCommandPolicy(command8)
879631
+ };
879632
+ }
879633
+ function cliCommandMatches(command8, query2) {
879634
+ if (!query2)
879635
+ return true;
879636
+ return [
879637
+ command8.name,
879638
+ command8.tokens,
879639
+ command8.summary,
879640
+ command8.usage,
879641
+ command8.aliases,
879642
+ command8.subcommands,
879643
+ command8.examples,
879644
+ command8.policy
879645
+ ].map((value) => JSON.stringify(value)).join(`
879646
+ `).toLowerCase().includes(query2.toLowerCase());
879647
+ }
879648
+ function totalHarnessCliCommands() {
879649
+ return listGoodVibesCliCommands().filter((command8) => command8 !== "unknown").length;
879650
+ }
879651
+ function blockedHarnessCliCommandTokens() {
879652
+ return listBlockedGoodVibesCliCommandTokens();
879653
+ }
879654
+ function listHarnessCliCommands(args2) {
879655
+ const query2 = readString50(args2.query);
879656
+ const limit3 = readLimit5(args2.limit, 200);
879657
+ return listGoodVibesCliCommands().filter((command8) => command8 !== "unknown").map(describeCliCommand).filter((command8) => cliCommandMatches(command8, query2)).sort((a4, b3) => String(a4.name).localeCompare(String(b3.name))).slice(0, limit3);
879658
+ }
879659
+ function cliTokensFromArgs(args2) {
879660
+ const raw = readString50(args2.cliCommand) || readString50(args2.command) || readString50(args2.commandName) || readString50(args2.query);
879661
+ if (!raw)
879662
+ return [];
879663
+ const tokens = raw.split(/\s+/).filter((token) => token.length > 0);
879664
+ if (tokens[0] === "goodvibes-agent" || tokens[0]?.endsWith("/goodvibes-agent"))
879665
+ return tokens.slice(1);
879666
+ return tokens;
879667
+ }
879668
+ function describeHarnessCliCommand(args2) {
879669
+ const tokens = cliTokensFromArgs(args2);
879670
+ if (tokens.length === 0)
879671
+ return describeCliCommand("tui");
879672
+ const parsed = parseGoodVibesCli(tokens);
879673
+ if (parsed.command === "unknown") {
879674
+ return {
879675
+ supported: false,
879676
+ token: parsed.rawCommand ?? tokens[0],
879677
+ errors: parsed.errors,
879678
+ blockedTokens: blockedHarnessCliCommandTokens(),
879679
+ policy: describeCliCommandPolicy(parsed.rawCommand ?? tokens[0] ?? "unknown")
879680
+ };
879681
+ }
879682
+ return {
879683
+ ...describeCliCommand(parsed.command),
879684
+ parsed: {
879685
+ command: parsed.command,
879686
+ rawCommand: parsed.rawCommand,
879687
+ commandArgs: parsed.commandArgs,
879688
+ positionals: parsed.positionals,
879689
+ flags: {
879690
+ provider: parsed.flags.provider,
879691
+ model: parsed.flags.model,
879692
+ agentProfile: parsed.flags.agentProfile,
879693
+ runtimeUrl: parsed.flags.runtimeUrl,
879694
+ workingDir: parsed.flags.workingDir,
879695
+ help: parsed.flags.help,
879696
+ version: parsed.flags.version,
879697
+ print: parsed.flags.print,
879698
+ outputFormat: parsed.flags.outputFormat,
879699
+ configOverrides: parsed.flags.configOverrides.map((override) => {
879700
+ const index = override.indexOf("=");
879701
+ return index < 0 ? override : `${override.slice(0, index)}=<redacted>`;
879702
+ }),
879703
+ enableFeatures: parsed.flags.enableFeatures,
879704
+ disableFeatures: parsed.flags.disableFeatures,
879705
+ noAltScreen: parsed.flags.noAltScreen,
879706
+ port: parsed.flags.port,
879707
+ hostname: parsed.flags.hostname,
879708
+ open: parsed.flags.open,
879709
+ continueLast: parsed.flags.continueLast,
879710
+ resume: parsed.flags.resume,
879711
+ session: parsed.flags.session,
879712
+ fork: parsed.flags.fork,
879713
+ rawOutput: parsed.flags.rawOutput,
879714
+ acceptRawOutputRisk: parsed.flags.acceptRawOutputRisk
879715
+ },
879716
+ errors: parsed.errors
879717
+ }
879718
+ };
879719
+ }
879720
+
879721
+ // src/tools/agent-harness-panel-metadata.ts
879722
+ function readString51(value) {
879723
+ return typeof value === "string" ? value.trim() : "";
879724
+ }
879725
+ function readLimit6(value, fallback) {
879726
+ const parsed = typeof value === "string" && value.trim() ? Number(value) : value;
879727
+ if (typeof parsed !== "number" || !Number.isFinite(parsed))
879728
+ return fallback;
879729
+ return Math.max(1, Math.min(500, Math.trunc(parsed)));
879730
+ }
879731
+ function panelManager(context) {
879732
+ return context.workspace.panelManager ?? null;
879733
+ }
879734
+ function panelMatches(panel, query2) {
879735
+ if (!query2)
879736
+ return true;
879737
+ return [
879738
+ panel.id,
879739
+ panel.name,
879740
+ panel.category,
879741
+ panel.description,
879742
+ panel.workspaceRoute
879743
+ ].map((value) => String(value ?? "")).join(`
879744
+ `).toLowerCase().includes(query2.toLowerCase());
879745
+ }
879746
+ function describePanelRegistration(context, registration) {
879747
+ const manager5 = panelManager(context);
879748
+ const openPanel = manager5?.getPanel(registration.id) ?? null;
879749
+ const pane = manager5?.getPaneOf(registration.id) ?? null;
879750
+ const activePanel = manager5?.getActivePanel() ?? null;
879751
+ return {
879752
+ id: registration.id,
879753
+ name: registration.name,
879754
+ icon: registration.icon,
879755
+ category: registration.category,
879756
+ description: registration.description,
879757
+ preload: registration.preload === true,
879758
+ open: openPanel !== null,
879759
+ pane,
879760
+ active: activePanel?.id === registration.id,
879761
+ focused: activePanel?.id === registration.id,
879762
+ workspaceRoute: {
879763
+ categoryId: agentWorkspaceCategoryForPanel(registration.id),
879764
+ command: agentWorkspaceCommandForPanel(registration.id)
879765
+ },
879766
+ policy: {
879767
+ effect: "ui-navigation",
879768
+ confirmation: 'agent_harness mode:"open_panel" requires confirm:true and explicitUserRequest.',
879769
+ boundary: "Panels are Agent/TUI operator views. The model can inspect panel catalog/open state; panel routing uses the existing Agent workspace bridge and does not mutate connected-host lifecycle."
879770
+ }
879771
+ };
879772
+ }
879773
+ function totalHarnessPanels(context) {
879774
+ return panelManager(context)?.getRegisteredTypes().length ?? 0;
879775
+ }
879776
+ function listHarnessPanels(context, args2) {
879777
+ const manager5 = panelManager(context);
879778
+ if (!manager5)
879779
+ return [];
879780
+ const query2 = readString51(args2.query);
879781
+ const category = readString51(args2.category);
879782
+ const limit3 = readLimit6(args2.limit, 200);
879783
+ return manager5.getRegisteredTypes().map((registration) => describePanelRegistration(context, registration)).filter((panel) => !category || panel.category === category).filter((panel) => panelMatches(panel, query2)).sort((a4, b3) => String(a4.id).localeCompare(String(b3.id))).slice(0, limit3);
879784
+ }
879785
+ function describeHarnessPanel(context, args2) {
879786
+ const manager5 = panelManager(context);
879787
+ if (!manager5)
879788
+ return null;
879789
+ const panelId = readString51(args2.panelId || args2.query);
879790
+ if (!panelId)
879791
+ return null;
879792
+ const registration = manager5.getRegisteredTypes().find((panel) => panel.id === panelId || panel.name.toLowerCase() === panelId.toLowerCase());
879793
+ return registration ? describePanelRegistration(context, registration) : null;
879794
+ }
879795
+ function openHarnessPanel(context, args2) {
879796
+ const panel = describeHarnessPanel(context, args2);
879797
+ if (!panel) {
879798
+ return {
879799
+ status: "unknown_panel",
879800
+ panelId: readString51(args2.panelId || args2.query) || "<missing>",
879801
+ availablePanels: listHarnessPanels(context, { limit: 50 }).map((entry) => entry.id)
879802
+ };
879803
+ }
879804
+ const requestedPane = readString51(args2.pane);
879805
+ const pane = requestedPane === "bottom" || requestedPane === "top" ? requestedPane : undefined;
879806
+ if (!context.showPanel) {
879807
+ return {
879808
+ status: "route_unavailable",
879809
+ panel,
879810
+ note: "The current runtime did not provide showPanel. Use the returned workspaceRoute from the TUI."
879811
+ };
879812
+ }
879813
+ context.showPanel(String(panel.id), pane);
879814
+ return {
879815
+ status: "routed",
879816
+ panel,
879817
+ pane: pane ?? "default",
879818
+ note: "Panel routing was handed to the current Agent shell bridge."
879819
+ };
879820
+ }
879821
+
879822
+ // src/tools/agent-harness-local-operations.ts
879823
+ function output6(value) {
879824
+ return { success: true, output: typeof value === "string" ? value : JSON.stringify(value, null, 2) };
879825
+ }
879826
+ function error51(message) {
879827
+ return { success: false, error: message };
879828
+ }
879829
+ function readString52(value) {
879830
+ return typeof value === "string" ? value.trim() : "";
879831
+ }
879832
+ function readFieldMap(value) {
879833
+ if (typeof value !== "object" || value === null || Array.isArray(value))
879834
+ return {};
879835
+ return Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, typeof entry === "string" ? entry : String(entry)]));
879836
+ }
879837
+ function describeEditor(editor) {
879838
+ return {
879839
+ kind: editor.kind,
879840
+ mode: editor.mode,
879841
+ recordId: editor.recordId,
879842
+ title: editor.title,
879843
+ message: editor.message,
879844
+ fields: editor.fields.map((field) => ({
879845
+ id: field.id,
879846
+ label: field.label,
879847
+ required: field.required,
879848
+ multiline: field.multiline,
879849
+ hint: field.hint,
879850
+ default: field.redact ? "<redacted>" : field.value
879851
+ }))
879852
+ };
879853
+ }
879854
+ function readRecordId(args2) {
879855
+ const fields = readFieldMap(args2.fields);
879856
+ return readString52(args2.recordId ?? args2.id ?? fields.recordId ?? fields.id);
879857
+ }
879858
+ function requireConfirmed(args2, label) {
879859
+ if (!readString52(args2.explicitUserRequest))
879860
+ return `${label} requires explicitUserRequest with the user's exact request or a short faithful summary.`;
879861
+ if (args2.confirm !== true)
879862
+ return `${label} requires confirm:true after an explicit user request.`;
879863
+ return null;
879864
+ }
879865
+ function fieldReader(editor, fields) {
879866
+ return (id) => fields[id] ?? editor.fields.find((field) => field.id === id)?.value ?? "";
879867
+ }
879868
+ function hasExecutionFields(args2) {
879869
+ return Object.keys(readFieldMap(args2.fields)).some((key) => key !== "id" && key !== "recordId");
879870
+ }
879871
+ function missingRequiredFields(editor, fields) {
879872
+ const read = fieldReader(editor, fields);
879873
+ return editor.fields.filter((field) => field.required && !read(field.id).trim()).map((field) => field.id);
879874
+ }
879875
+ function registryTarget(operation) {
879876
+ if (operation === "memory-edit")
879877
+ return { domain: "memory", action: "update", requiresRecordId: true };
879878
+ if (operation === "memory-review")
879879
+ return { domain: "memory", action: "review", requiresRecordId: true };
879880
+ if (operation === "memory-stale")
879881
+ return { domain: "memory", action: "stale", requiresRecordId: true };
879882
+ if (operation === "memory-delete")
879883
+ return { domain: "memory", action: "delete", requiresRecordId: true };
879884
+ if (operation === "note-edit")
879885
+ return { domain: "note", action: "update", requiresRecordId: true };
879886
+ if (operation === "note-review")
879887
+ return { domain: "note", action: "review", requiresRecordId: true };
879888
+ if (operation === "note-stale")
879889
+ return { domain: "note", action: "stale", requiresRecordId: true };
879890
+ if (operation === "note-delete")
879891
+ return { domain: "note", action: "delete", requiresRecordId: true };
879892
+ if (operation === "persona-edit")
879893
+ return { domain: "persona", action: "update", requiresRecordId: true };
879894
+ if (operation === "persona-use")
879895
+ return { domain: "persona", action: "use", requiresRecordId: true };
879896
+ if (operation === "persona-review")
879897
+ return { domain: "persona", action: "review", requiresRecordId: true };
879898
+ if (operation === "persona-clear")
879899
+ return { domain: "persona", action: "clear_active", requiresRecordId: false };
879900
+ if (operation === "persona-delete")
879901
+ return { domain: "persona", action: "delete", requiresRecordId: true };
879902
+ if (operation === "skill-edit")
879903
+ return { domain: "skill", action: "update", requiresRecordId: true };
879904
+ if (operation === "skill-enable")
879905
+ return { domain: "skill", action: "enable", requiresRecordId: true };
879906
+ if (operation === "skill-disable")
879907
+ return { domain: "skill", action: "disable", requiresRecordId: true };
879908
+ if (operation === "skill-review")
879909
+ return { domain: "skill", action: "review", requiresRecordId: true };
879910
+ if (operation === "skill-delete")
879911
+ return { domain: "skill", action: "delete", requiresRecordId: true };
879912
+ if (operation === "routine-edit")
879913
+ return { domain: "routine", action: "update", requiresRecordId: true };
879914
+ if (operation === "routine-start")
879915
+ return { domain: "routine", action: "start", requiresRecordId: true };
879916
+ if (operation === "routine-enable")
879917
+ return { domain: "routine", action: "enable", requiresRecordId: true };
879918
+ if (operation === "routine-disable")
879919
+ return { domain: "routine", action: "disable", requiresRecordId: true };
879920
+ if (operation === "routine-review")
879921
+ return { domain: "routine", action: "review", requiresRecordId: true };
879922
+ if (operation === "routine-delete")
879923
+ return { domain: "routine", action: "delete", requiresRecordId: true };
879924
+ return null;
879925
+ }
879926
+ function editorForOperation(context, operation, recordId) {
879927
+ const shellPaths3 = context.workspace.shellPaths;
879928
+ if (operation === "memory-edit") {
879929
+ const record2 = context.clients?.agentKnowledgeApi?.memory?.get(recordId);
879930
+ return record2 ? createMemoryUpdateEditor(record2) : null;
879931
+ }
879932
+ if (!shellPaths3)
879933
+ return null;
879934
+ if (operation === "note-edit") {
879935
+ const note = AgentNoteRegistry.fromShellPaths(shellPaths3).get(recordId);
879936
+ return note ? createNoteUpdateEditor(note) : null;
879937
+ }
879938
+ if (operation === "note-promote-memory" || operation === "note-promote-persona" || operation === "note-promote-skill" || operation === "note-promote-routine" || operation === "note-promote-knowledge-url") {
879939
+ const note = AgentNoteRegistry.fromShellPaths(shellPaths3).get(recordId);
879940
+ if (!note)
879941
+ return null;
879942
+ if (operation === "note-promote-memory")
879943
+ return createMemoryEditorFromNote(note);
879944
+ if (operation === "note-promote-persona")
879945
+ return createPersonaEditorFromNote(note);
879946
+ if (operation === "note-promote-skill")
879947
+ return createSkillEditorFromNote(note);
879948
+ if (operation === "note-promote-routine")
879949
+ return createRoutineEditorFromNote(note);
879950
+ return note.sourceUrl ? createKnowledgeUrlEditorFromNote(note) : null;
879951
+ }
879952
+ if (operation === "persona-edit") {
879953
+ const registry5 = AgentPersonaRegistry.fromShellPaths(shellPaths3);
879954
+ const persona = registry5.get(recordId);
879955
+ return persona ? createPersonaUpdateEditor(persona, registry5.snapshot().activePersonaId === persona.id) : null;
879956
+ }
879957
+ if (operation === "skill-edit") {
879958
+ const skill = AgentSkillRegistry.fromShellPaths(shellPaths3).get(recordId);
879959
+ return skill ? createSkillUpdateEditor(skill) : null;
879960
+ }
879961
+ if (operation === "routine-edit") {
879962
+ const routine = AgentRoutineRegistry.fromShellPaths(shellPaths3).get(recordId);
879963
+ return routine ? createRoutineUpdateEditor(routine) : null;
879964
+ }
879965
+ return null;
879966
+ }
879967
+ function localRegistryArgsFromEditor(editor, fields, id) {
879968
+ const read = fieldReader(editor, fields);
879969
+ if (editor.kind === "memory")
879970
+ return { domain: "memory", action: editor.mode === "update" ? "update" : "create", id, cls: read("cls"), scope: read("scope"), summary: read("summary"), detail: read("detail"), tags: splitList5(read("tags")), confidence: read("confidence"), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879971
+ if (editor.kind === "note")
879972
+ return { domain: "note", action: "update", id, title: read("title"), body: read("body"), sourceUrl: read("sourceUrl"), tags: splitList5(read("tags")), provenance: "agent-harness-local-operation" };
879973
+ if (editor.kind === "persona")
879974
+ return { domain: "persona", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), body: read("body"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), activate: read("activate"), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879975
+ if (editor.kind === "skill")
879976
+ return { domain: "skill", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), procedure: read("procedure"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), requiresEnv: splitList5(read("requiresEnv")), requiresCommands: splitList5(read("requiresCommands")), enabled: isAffirmative15(read("enabled")), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879977
+ return { domain: "routine", action: editor.mode === "update" ? "update" : "create", id, name: read("name"), description: read("description"), steps: read("steps"), tags: splitList5(read("tags")), triggers: splitList5(read("triggers")), requiresEnv: splitList5(read("requiresEnv")), requiresCommands: splitList5(read("requiresCommands")), enabled: isAffirmative15(read("enabled")), provenance: editor.recordId ? "agent-harness-local-operation" : "agent-harness-note-promotion" };
879978
+ }
879979
+ function localRegistryArgsForTarget(target, args2, recordId) {
879980
+ const fields = readFieldMap(args2.fields);
879981
+ const base2 = { domain: target.domain, action: target.action, ...recordId ? { id: recordId } : {} };
879982
+ const edit = target.action === "update" ? localRegistryArgsFromEditor({ kind: target.domain, mode: "update", recordId, title: "", selectedFieldIndex: 0, message: "", fields: [] }, fields, recordId) : {};
879983
+ return {
879984
+ ...base2,
879985
+ ...edit,
879986
+ ...target.action === "stale" && fields.reason ? { reason: fields.reason } : {},
879987
+ ...target.action === "delete" ? { confirm: args2.confirm, explicitUserRequest: readString52(args2.explicitUserRequest) } : {}
879988
+ };
879989
+ }
879990
+ async function executeTool(toolRegistry, name51, toolArgs) {
879991
+ if (!toolRegistry.has(name51))
879992
+ return output6({ status: "model_tool_required", modelExecution: { tool: name51, args: toolArgs } });
879993
+ const result2 = await toolRegistry.execute(`agent-harness-${name51}-${Date.now()}`, name51, toolArgs);
879994
+ if (!result2.success)
879995
+ return error51(result2.error ?? `${name51} failed.`);
879996
+ return output6({ status: "executed_model_tool", tool: name51, output: result2.output ?? "" });
879997
+ }
879998
+ function describeLocalWorkspaceModelExecution(action2) {
879999
+ if (action2.kind === "local-selection")
880000
+ return { tool: "agent_local_registry", domain: action2.localKind, actions: ["list", "search", "get"], note: "TUI selection maps to recordId for model-run local-operation actions." };
880001
+ if (!action2.localOperation)
880002
+ return null;
880003
+ const target = registryTarget(action2.localOperation);
880004
+ if (target)
880005
+ return { tool: "agent_local_registry", domain: target.domain, action: target.action, requiresRecordId: target.requiresRecordId };
880006
+ if (action2.localOperation === "note-promote-knowledge-url")
880007
+ return { tool: "agent_knowledge_ingest", sourceKind: "url", requiresRecordId: true, selectedRecordDomain: "note" };
880008
+ return { tool: "agent_local_registry", selectedRecordDomain: "note", action: "create", requiresRecordId: true };
880009
+ }
880010
+ async function runLocalWorkspaceAction(deps, action2, args2) {
880011
+ if (action2.kind === "local-selection")
880012
+ return output6({ status: "local_selection", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
880013
+ const operation = action2.localOperation;
880014
+ if (!operation)
880015
+ return output6({ status: "local_registry_action", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
880016
+ const target = registryTarget(operation);
880017
+ const recordId = readRecordId(args2);
880018
+ if (target?.requiresRecordId && !recordId)
880019
+ return output6({ status: "needs_record_id", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
880020
+ const editor = recordId ? editorForOperation(deps.commandContext, operation, recordId) : null;
880021
+ if (editor && !hasExecutionFields(args2) && args2.confirm !== true)
880022
+ return output6({ status: "editor", action: action2.id, editor: describeEditor(editor), modelExecution: describeLocalWorkspaceModelExecution(action2) });
880023
+ const confirmationError2 = requireConfirmed(args2, "Workspace local registry action");
880024
+ if (confirmationError2)
880025
+ return error51(confirmationError2);
880026
+ if (editor) {
880027
+ const fields = readFieldMap(args2.fields);
880028
+ const missing = missingRequiredFields(editor, fields);
880029
+ if (missing.length > 0)
880030
+ return output6({ status: "missing_required_fields", missing, action: action2.id, editor: describeEditor(editor) });
880031
+ if (editor.kind === "knowledge-url")
880032
+ return executeTool(deps.toolRegistry, "agent_knowledge_ingest", { sourceKind: "url", url: fieldReader(editor, fields)("url"), tags: splitList5(fieldReader(editor, fields)("tags")), folderPath: fieldReader(editor, fields)("folder"), confirm: args2.confirm, explicitUserRequest: readString52(args2.explicitUserRequest) });
880033
+ return executeTool(deps.toolRegistry, "agent_local_registry", localRegistryArgsFromEditor(editor, fields, recordId));
880034
+ }
880035
+ if (!target)
880036
+ return output6({ status: "local_registry_action", action: action2.id, modelExecution: describeLocalWorkspaceModelExecution(action2) });
880037
+ return executeTool(deps.toolRegistry, "agent_local_registry", localRegistryArgsForTarget(target, args2, recordId));
880038
+ }
880039
+
880040
+ // src/tools/agent-harness-model-tool-catalog.ts
880041
+ function readString53(value) {
880042
+ return typeof value === "string" ? value.trim() : "";
880043
+ }
880044
+ function readLimit7(value, fallback) {
880045
+ const parsed = typeof value === "string" && value.trim() ? Number(value) : value;
880046
+ if (typeof parsed !== "number" || !Number.isFinite(parsed))
880047
+ return fallback;
880048
+ return Math.max(1, Math.min(500, Math.trunc(parsed)));
880049
+ }
880050
+ function listHarnessModelTools(toolRegistry, args2) {
880051
+ const query2 = readString53(args2.query).toLowerCase();
880052
+ const includeParameters = args2.includeParameters === true;
880053
+ const limit3 = readLimit7(args2.limit, 200);
880054
+ return toolRegistry.getToolDefinitions().filter((tool2) => !query2 || [tool2.name, tool2.description, ...tool2.sideEffects ?? []].join(`
880055
+ `).toLowerCase().includes(query2)).sort((a4, b3) => a4.name.localeCompare(b3.name)).slice(0, limit3).map((tool2) => ({
880056
+ name: tool2.name,
880057
+ description: tool2.description,
880058
+ sideEffects: tool2.sideEffects ?? [],
880059
+ concurrency: tool2.concurrency ?? "parallel",
880060
+ supportsProgress: tool2.supportsProgress ?? false,
880061
+ supportsStreamingOutput: tool2.supportsStreamingOutput ?? false,
880062
+ ...includeParameters ? { parameters: tool2.parameters } : {}
880063
+ }));
880064
+ }
880065
+
879624
880066
  // src/tools/agent-harness-tool.ts
879625
880067
  var MODES = [
879626
880068
  "summary",
880069
+ "cli_commands",
880070
+ "cli_command",
880071
+ "panels",
880072
+ "panel",
880073
+ "open_panel",
879627
880074
  "commands",
879628
880075
  "command",
879629
880076
  "run_command",
@@ -879642,10 +880089,10 @@ var MODES = [
879642
880089
  function isMode(value) {
879643
880090
  return typeof value === "string" && MODES.includes(value);
879644
880091
  }
879645
- function readString51(value) {
880092
+ function readString54(value) {
879646
880093
  return typeof value === "string" ? value.trim() : "";
879647
880094
  }
879648
- function readLimit5(value, fallback) {
880095
+ function readLimit8(value, fallback) {
879649
880096
  const parsed = typeof value === "string" && value.trim() ? Number(value) : value;
879650
880097
  if (typeof parsed !== "number" || !Number.isFinite(parsed))
879651
880098
  return fallback;
@@ -879726,7 +880173,7 @@ function describeWorkspaceEditor(editor) {
879726
880173
  }
879727
880174
  function selectedRoutineFromArgs(snapshot, args2) {
879728
880175
  const fields = readFieldMap2(args2.fields);
879729
- const routineId = readString51(args2.recordId) || readString51(fields.routineId) || readString51(fields.id);
880176
+ const routineId = readString54(args2.recordId) || readString54(fields.routineId) || readString54(fields.id);
879730
880177
  if (!routineId)
879731
880178
  return null;
879732
880179
  return snapshot.localRoutines.find((routine) => routine.id === routineId || routine.name.toLowerCase() === routineId.toLowerCase()) ?? null;
@@ -879794,17 +880241,17 @@ function localEditorModelExecution(editorKind) {
879794
880241
  return "Use the command field, editor schema, or a first-class Agent model tool when available.";
879795
880242
  }
879796
880243
  function listWorkspaceActions(deps, args2) {
879797
- const query2 = readString51(args2.query);
879798
- const categoryId = readString51(args2.categoryId || args2.category);
879799
- const limit3 = readLimit5(args2.limit, 200);
880244
+ const query2 = readString54(args2.query);
880245
+ const categoryId = readString54(args2.categoryId || args2.category);
880246
+ const limit3 = readLimit8(args2.limit, 200);
879800
880247
  const includeEditor = args2.includeParameters === true;
879801
880248
  const editorContext = includeEditor ? buildWorkspaceEditorContext(deps.commandContext, args2) : null;
879802
880249
  const source = query2 ? searchAgentWorkspaceActions(AGENT_WORKSPACE_CATEGORIES, query2).map((result2) => ({ category: result2.category, action: result2.action })) : allWorkspaceActions();
879803
880250
  return source.filter((entry) => !categoryId || entry.category.id === categoryId).slice(0, limit3).map((entry) => describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext }));
879804
880251
  }
879805
880252
  function findWorkspaceAction(args2) {
879806
- const actionId = readString51(args2.actionId || args2.query);
879807
- const categoryId = readString51(args2.categoryId || args2.category);
880253
+ const actionId = readString54(args2.actionId || args2.query);
880254
+ const categoryId = readString54(args2.categoryId || args2.category);
879808
880255
  if (!actionId)
879809
880256
  return null;
879810
880257
  return allWorkspaceActions().find((entry) => {
@@ -879814,31 +880261,12 @@ function findWorkspaceAction(args2) {
879814
880261
  }) ?? null;
879815
880262
  }
879816
880263
  function listCommands(commandRegistry, args2) {
879817
- const query2 = readString51(args2.query);
879818
- const limit3 = readLimit5(args2.limit, 200);
880264
+ const query2 = readString54(args2.query);
880265
+ const limit3 = readLimit8(args2.limit, 200);
879819
880266
  return commandRegistry.list().filter((command8) => commandMatches(command8, query2)).sort((a4, b3) => a4.name.localeCompare(b3.name)).slice(0, limit3).map(describeCommand);
879820
880267
  }
879821
- function listTools(toolRegistry, args2) {
879822
- const query2 = readString51(args2.query).toLowerCase();
879823
- const includeParameters = args2.includeParameters === true;
879824
- const limit3 = readLimit5(args2.limit, 200);
879825
- return toolRegistry.getToolDefinitions().filter((tool2) => {
879826
- if (!query2)
879827
- return true;
879828
- return [tool2.name, tool2.description, ...tool2.sideEffects ?? []].join(`
879829
- `).toLowerCase().includes(query2);
879830
- }).sort((a4, b3) => a4.name.localeCompare(b3.name)).slice(0, limit3).map((tool2) => ({
879831
- name: tool2.name,
879832
- description: tool2.description,
879833
- sideEffects: tool2.sideEffects ?? [],
879834
- concurrency: tool2.concurrency ?? "parallel",
879835
- supportsProgress: tool2.supportsProgress ?? false,
879836
- supportsStreamingOutput: tool2.supportsStreamingOutput ?? false,
879837
- ...includeParameters ? { parameters: tool2.parameters } : {}
879838
- }));
879839
- }
879840
880268
  function requireConfirmedAction(args2, action2) {
879841
- const explicitUserRequest = readString51(args2.explicitUserRequest);
880269
+ const explicitUserRequest = readString54(args2.explicitUserRequest);
879842
880270
  if (!explicitUserRequest)
879843
880271
  return `${action2} requires explicitUserRequest with the user's exact request or a short faithful summary.`;
879844
880272
  if (args2.confirm !== true)
@@ -879846,7 +880274,7 @@ function requireConfirmedAction(args2, action2) {
879846
880274
  return null;
879847
880275
  }
879848
880276
  function commandFromArgs(args2) {
879849
- const rawCommand = readString51(args2.command);
880277
+ const rawCommand = readString54(args2.command);
879850
880278
  if (rawCommand) {
879851
880279
  const parsed = parseSlashCommand(rawCommand);
879852
880280
  if (!parsed.name)
@@ -879856,7 +880284,7 @@ function commandFromArgs(args2) {
879856
880284
  args: parsed.args
879857
880285
  };
879858
880286
  }
879859
- const commandName = readString51(args2.commandName).replace(/^\//, "");
880287
+ const commandName = readString54(args2.commandName).replace(/^\//, "");
879860
880288
  if (!commandName)
879861
880289
  return null;
879862
880290
  const commandArgs = readStringArray12(args2.args);
@@ -880038,28 +880466,13 @@ async function runWorkspaceAction(deps, args2) {
880038
880466
  action: describeWorkspaceAction(category, action2, { includeEditor: true, editorContext })
880039
880467
  });
880040
880468
  }
880041
- function connectedHostSummary(context, toolRegistry) {
880042
- const shellPaths3 = context.workspace.shellPaths;
880043
- const homeDirectory = shellPaths3?.homeDirectory ?? context.platform.configManager.getHomeDirectory() ?? "";
880044
- const connection5 = resolveAgentConnectedHostConnection(context.platform.configManager, homeDirectory);
880045
- return {
880046
- baseUrl: connection5.baseUrl,
880047
- operatorToken: connection5.token ? "configured" : "missing",
880048
- tokenPath: connection5.tokenPath,
880049
- ownership: "external-connected-host",
880050
- lifecycle: "GoodVibes Agent can use public connected-host operator routes, but does not start, stop, restart, install, expose, or mutate the host listener.",
880051
- routeFamilies: connectedHostRouteFamilies(),
880052
- capabilities: connectedHostCapabilityMap(toolRegistry),
880053
- blockedCapabilities: blockedConnectedHostCapabilities()
880054
- };
880055
- }
880056
880469
  function createAgentHarnessTool(deps) {
880057
880470
  return {
880058
880471
  definition: {
880059
880472
  name: "agent_harness",
880060
880473
  description: [
880061
880474
  "Discover and operate the GoodVibes Agent harness from the main conversation.",
880062
- "Use this tool to inspect Agent workspace actions, slash commands with policy metadata, model tools, connected-host capabilities, and Agent settings, or to invoke a workspace action/command through the same in-process command registry the user uses in the TUI.",
880475
+ "Use this tool to inspect Agent workspace actions, built-in panels, top-level CLI mirrors, slash commands with policy metadata, model tools, connected-host capabilities, and Agent settings, or to invoke a workspace action/command through the same in-process command registry the user uses in the TUI.",
880063
880476
  "Discovery modes are read-only. Setting writes, resets, slash command invocation, and workspace action invocation require confirm:true plus explicitUserRequest.",
880064
880477
  "This tool preserves Agent product boundaries: connected-host lifecycle and listener posture stay externally owned, connected-host mode reports allowed and blocked route families, and secret-backed settings store raw values through the secret manager while config receives only a secret reference."
880065
880478
  ].join(" "),
@@ -880077,11 +880490,15 @@ function createAgentHarnessTool(deps) {
880077
880490
  },
880078
880491
  command: {
880079
880492
  type: "string",
880080
- description: 'Full slash command string for mode run_command, for example "/settings get provider.model".'
880493
+ description: 'Full slash command string for mode run_command, for example "/settings get provider.model". In cli_command mode this may also hold a top-level CLI string such as "goodvibes-agent status --json".'
880494
+ },
880495
+ cliCommand: {
880496
+ type: "string",
880497
+ description: 'Top-level CLI command string for mode cli_command, for example "goodvibes-agent status --json" or "profiles list". This mode is read-only metadata/parse inspection.'
880081
880498
  },
880082
880499
  commandName: {
880083
880500
  type: "string",
880084
- description: "Slash command root without the leading slash for mode command or run_command."
880501
+ description: "Slash command root without the leading slash for mode command or run_command, or a top-level CLI command token for cli_command."
880085
880502
  },
880086
880503
  args: {
880087
880504
  type: "array",
@@ -880092,6 +880509,10 @@ function createAgentHarnessTool(deps) {
880092
880509
  type: "string",
880093
880510
  description: "Agent workspace category id for workspace action filtering."
880094
880511
  },
880512
+ panelId: {
880513
+ type: "string",
880514
+ description: "Built-in panel id for panel or open_panel modes."
880515
+ },
880095
880516
  actionId: {
880096
880517
  type: "string",
880097
880518
  description: "Agent workspace action id for workspace_action or run_workspace_action."
@@ -880137,9 +880558,14 @@ function createAgentHarnessTool(deps) {
880137
880558
  type: "number",
880138
880559
  description: "Maximum catalog entries to return."
880139
880560
  },
880561
+ pane: {
880562
+ type: "string",
880563
+ enum: ["top", "bottom"],
880564
+ description: "Preferred panel pane for open_panel when the current shell supports panel routing."
880565
+ },
880140
880566
  confirm: {
880141
880567
  type: "boolean",
880142
- description: "Required true for set_setting, reset_setting, run_command, and mutating run_workspace_action calls after an explicit user request."
880568
+ description: "Required true for set_setting, reset_setting, run_command, open_panel, and mutating run_workspace_action calls after an explicit user request."
880143
880569
  },
880144
880570
  explicitUserRequest: {
880145
880571
  type: "string",
@@ -880159,12 +880585,17 @@ function createAgentHarnessTool(deps) {
880159
880585
  try {
880160
880586
  if (args2.mode === "summary") {
880161
880587
  return output7({
880588
+ cliCommands: totalHarnessCliCommands(),
880589
+ blockedCliCommandTokens: blockedHarnessCliCommandTokens(),
880590
+ panels: totalHarnessPanels(deps.commandContext),
880162
880591
  commands: deps.commandRegistry.list().length,
880163
880592
  settings: deps.commandContext.platform.configManager.getSchema().length,
880164
880593
  workspaceCategories: AGENT_WORKSPACE_CATEGORIES.length,
880165
880594
  workspaceActions: allWorkspaceActions().length,
880166
880595
  tools: deps.toolRegistry.getToolDefinitions().length,
880167
880596
  modelAccess: {
880597
+ cliCommands: 'Use mode:"cli_commands" and mode:"cli_command" to inspect package CLI mirrors and their preferred in-process model routes. CLI modes are discovery-only.',
880598
+ panels: 'Use mode:"panels" and mode:"panel" to inspect built-in panel catalog/open state; use mode:"open_panel" with confirm:true plus explicitUserRequest to route a visible panel/workspace change.',
880168
880599
  slashCommands: 'Use mode:"commands" and mode:"command" to inspect; use mode:"run_command" with confirm:true plus explicitUserRequest to execute.',
880169
880600
  workspace: 'Use mode:"workspace_actions" to list and mode:"workspace_action" for editor schemas; set includeParameters:true on workspace_actions to inline editor schemas.',
880170
880601
  settings: 'Use mode:"settings", mode:"get_setting", mode:"set_setting", and mode:"reset_setting".',
@@ -880175,12 +880606,44 @@ function createAgentHarnessTool(deps) {
880175
880606
  connectedHost: connectedHostSummary(deps.commandContext, deps.toolRegistry)
880176
880607
  });
880177
880608
  }
880609
+ if (args2.mode === "cli_commands") {
880610
+ const commands3 = listHarnessCliCommands(args2);
880611
+ return output7({
880612
+ commands: commands3,
880613
+ returned: commands3.length,
880614
+ total: totalHarnessCliCommands(),
880615
+ blockedTokens: blockedHarnessCliCommandTokens(),
880616
+ policy: "CLI modes are read-only discovery. Use first-class model tools, workspace actions, settings modes, or confirmed slash-command mirrors for in-process operation."
880617
+ });
880618
+ }
880619
+ if (args2.mode === "cli_command") {
880620
+ return output7(describeHarnessCliCommand(args2));
880621
+ }
880622
+ if (args2.mode === "panels") {
880623
+ const panels = listHarnessPanels(deps.commandContext, args2);
880624
+ return output7({
880625
+ panels,
880626
+ returned: panels.length,
880627
+ total: totalHarnessPanels(deps.commandContext),
880628
+ policy: "Panel modes expose Agent/TUI operator view catalog and open state. open_panel is confirmation-gated and routes through the current Agent shell bridge."
880629
+ });
880630
+ }
880631
+ if (args2.mode === "panel") {
880632
+ const panel = describeHarnessPanel(deps.commandContext, args2);
880633
+ return panel ? output7(panel) : error52(`Unknown panel ${readString54(args2.panelId || args2.query) || "<missing>"}.`);
880634
+ }
880635
+ if (args2.mode === "open_panel") {
880636
+ const confirmationError2 = requireConfirmedAction(args2, "Panel routing");
880637
+ if (confirmationError2)
880638
+ return error52(confirmationError2);
880639
+ return output7(openHarnessPanel(deps.commandContext, args2));
880640
+ }
880178
880641
  if (args2.mode === "commands") {
880179
880642
  const commands3 = listCommands(deps.commandRegistry, args2);
880180
880643
  return output7({ commands: commands3, returned: commands3.length, total: deps.commandRegistry.list().length });
880181
880644
  }
880182
880645
  if (args2.mode === "command") {
880183
- const name51 = readString51(args2.commandName).replace(/^\//, "");
880646
+ const name51 = readString54(args2.commandName).replace(/^\//, "");
880184
880647
  const command8 = name51 ? deps.commandRegistry.get(name51) : null;
880185
880648
  return command8 ? output7(describeCommand(command8)) : error52(`Unknown slash command /${name51 || "<missing>"}.`);
880186
880649
  }
@@ -880188,16 +880651,16 @@ function createAgentHarnessTool(deps) {
880188
880651
  return runCommand2(deps, args2);
880189
880652
  if (args2.mode === "settings") {
880190
880653
  const settings = listHarnessSettings(deps.commandContext.platform.configManager, {
880191
- category: readString51(args2.category) || undefined,
880192
- prefix: readString51(args2.prefix) || undefined,
880193
- query: readString51(args2.query) || undefined,
880654
+ category: readString54(args2.category) || undefined,
880655
+ prefix: readString54(args2.prefix) || undefined,
880656
+ query: readString54(args2.query) || undefined,
880194
880657
  includeHidden: args2.includeHidden === true,
880195
- limit: readLimit5(args2.limit, 100)
880658
+ limit: readLimit8(args2.limit, 100)
880196
880659
  });
880197
880660
  return output7({ settings, returned: settings.length, policy: settingsPolicySummary() });
880198
880661
  }
880199
880662
  if (args2.mode === "get_setting") {
880200
- const key = readString51(args2.key);
880663
+ const key = readString54(args2.key);
880201
880664
  const setting = getHarnessSetting(deps.commandContext.platform.configManager, key);
880202
880665
  return setting ? output7(setting) : error52(`Unknown setting ${key || "<missing>"}.`);
880203
880666
  }
@@ -880207,7 +880670,7 @@ function createAgentHarnessTool(deps) {
880207
880670
  return error52(confirmationError2);
880208
880671
  if (args2.value === undefined)
880209
880672
  return error52("set_setting requires value.");
880210
- const key = readString51(args2.key);
880673
+ const key = readString54(args2.key);
880211
880674
  const result2 = await setHarnessSetting(deps.commandContext.platform.configManager, deps.commandContext.platform.secretsManager, key, args2.value);
880212
880675
  return output7(result2);
880213
880676
  }
@@ -880215,7 +880678,7 @@ function createAgentHarnessTool(deps) {
880215
880678
  const confirmationError2 = requireConfirmedAction(args2, "Setting reset");
880216
880679
  if (confirmationError2)
880217
880680
  return error52(confirmationError2);
880218
- const key = readString51(args2.key);
880681
+ const key = readString54(args2.key);
880219
880682
  const result2 = await resetHarnessSetting(deps.commandContext.platform.configManager, deps.commandContext.platform.secretsManager, key);
880220
880683
  return output7(result2);
880221
880684
  }
@@ -880232,12 +880695,12 @@ function createAgentHarnessTool(deps) {
880232
880695
  if (args2.mode === "workspace_action") {
880233
880696
  const found = findWorkspaceAction(args2);
880234
880697
  const editorContext = buildWorkspaceEditorContext(deps.commandContext, args2);
880235
- return found ? output7(describeWorkspaceAction(found.category, found.action, { includeEditor: true, editorContext })) : error52(`Unknown Agent workspace action ${readString51(args2.actionId || args2.query) || "<missing>"}.`);
880698
+ return found ? output7(describeWorkspaceAction(found.category, found.action, { includeEditor: true, editorContext })) : error52(`Unknown Agent workspace action ${readString54(args2.actionId || args2.query) || "<missing>"}.`);
880236
880699
  }
880237
880700
  if (args2.mode === "run_workspace_action")
880238
880701
  return runWorkspaceAction(deps, args2);
880239
880702
  if (args2.mode === "tools") {
880240
- const tools3 = listTools(deps.toolRegistry, args2);
880703
+ const tools3 = listHarnessModelTools(deps.toolRegistry, args2);
880241
880704
  return output7({ tools: tools3, returned: tools3.length, total: deps.toolRegistry.getToolDefinitions().length });
880242
880705
  }
880243
880706
  if (args2.mode === "connected_host")
@@ -880322,7 +880785,7 @@ async function bootstrapRuntime(stdout, options) {
880322
880785
  const {
880323
880786
  automationManager,
880324
880787
  hookDispatcher,
880325
- panelManager,
880788
+ panelManager: panelManager2,
880326
880789
  pluginManager
880327
880790
  } = services;
880328
880791
  const orchestratorRefs = {
@@ -891829,23 +892292,23 @@ function handlePromptKeyToken(state4, token) {
891829
892292
  function clampRatio(value) {
891830
892293
  return Math.max(0.2, Math.min(0.8, value));
891831
892294
  }
891832
- function getActivePanelInPane(panelManager, pane) {
891833
- const target = pane === "top" ? panelManager.getTopPane() : panelManager.getBottomPane();
892295
+ function getActivePanelInPane(panelManager2, pane) {
892296
+ const target = pane === "top" ? panelManager2.getTopPane() : panelManager2.getBottomPane();
891834
892297
  return target.panels[target.activeIndex] ?? null;
891835
892298
  }
891836
- function getPanelUnderMouse(panelManager, layout, row, col) {
891837
- if (layout === null || !panelManager.isVisible() || panelManager.getAllOpen().length === 0 || col < layout.x || col >= layout.x + layout.width || row < layout.y || row >= layout.y + layout.height) {
892299
+ function getPanelUnderMouse(panelManager2, layout, row, col) {
892300
+ if (layout === null || !panelManager2.isVisible() || panelManager2.getAllOpen().length === 0 || col < layout.x || col >= layout.x + layout.width || row < layout.y || row >= layout.y + layout.height) {
891838
892301
  return null;
891839
892302
  }
891840
892303
  const panelRow = row - layout.y;
891841
892304
  if (!layout.hasBottomPane) {
891842
- return getActivePanelInPane(panelManager, "top");
892305
+ return getActivePanelInPane(panelManager2, "top");
891843
892306
  }
891844
892307
  const panelAreaRows = Math.max(0, layout.height - 1);
891845
892308
  const contentRows = Math.max(0, panelAreaRows - 3);
891846
892309
  const topContentRows = contentRows <= 1 ? contentRows : Math.max(1, Math.floor(contentRows * clampRatio(layout.verticalSplitRatio)));
891847
892310
  const topLastRow = 2 + topContentRows;
891848
- return panelRow <= topLastRow ? getActivePanelInPane(panelManager, "top") : getActivePanelInPane(panelManager, "bottom");
892311
+ return panelRow <= topLastRow ? getActivePanelInPane(panelManager2, "top") : getActivePanelInPane(panelManager2, "bottom");
891849
892312
  }
891850
892313
  function scrollPanelUnderMouse(state4, token, deltaRows) {
891851
892314
  const panel = getPanelUnderMouse(state4.panelManager, state4.panelMouseLayout, token.row, token.col);
@@ -893293,7 +893756,7 @@ function handleGlobalShortcutToken(state4, token, viewportHeight) {
893293
893756
  }
893294
893757
 
893295
893758
  // src/input/panel-integration-actions.ts
893296
- function handlePanelIntegrationAction(panelManager, activePanel, key, commandContext) {
893759
+ function handlePanelIntegrationAction(panelManager2, activePanel, key, commandContext) {
893297
893760
  if (!activePanel)
893298
893761
  return false;
893299
893762
  if ((key === "enter" || key === "return") && activePanel instanceof ApprovalPanel) {
@@ -898078,16 +898541,16 @@ function renderPanel(panel, width, height) {
898078
898541
  panelRenderCache.set(panel, { lines, width, height });
898079
898542
  return lines;
898080
898543
  }
898081
- function buildPanelCompositeData(panelManager, input, panelWidth, panelHeight) {
898082
- if (!panelManager.isVisible() || panelManager.getAllOpen().length === 0 || panelWidth <= 0) {
898544
+ function buildPanelCompositeData(panelManager2, input, panelWidth, panelHeight) {
898545
+ if (!panelManager2.isVisible() || panelManager2.getAllOpen().length === 0 || panelWidth <= 0) {
898083
898546
  return {};
898084
898547
  }
898085
- const topPane = panelManager.getTopPane();
898086
- const bottomPane = panelManager.getBottomPane();
898087
- const focusedPane = panelManager.getFocusedPane();
898088
- const workspaceTabs = panelManager.getWorkspaceTabs();
898089
- const verticalSplitRatio = panelManager.getVerticalSplitRatio();
898090
- const hasBottom = panelManager.isBottomPaneVisible() && bottomPane.panels.length > 0;
898548
+ const topPane = panelManager2.getTopPane();
898549
+ const bottomPane = panelManager2.getBottomPane();
898550
+ const focusedPane = panelManager2.getFocusedPane();
898551
+ const workspaceTabs = panelManager2.getWorkspaceTabs();
898552
+ const verticalSplitRatio = panelManager2.getVerticalSplitRatio();
898553
+ const hasBottom = panelManager2.isBottomPaneVisible() && bottomPane.panels.length > 0;
898091
898554
  const workspaceBar = renderPanelWorkspaceBar(workspaceTabs, panelWidth, input.panelFocused);
898092
898555
  let topContent;
898093
898556
  let topTabBar;
@@ -898230,7 +898693,7 @@ function wireShellUiOpeners(options) {
898230
898693
  const {
898231
898694
  commandContext,
898232
898695
  input,
898233
- panelManager,
898696
+ panelManager: panelManager2,
898234
898697
  conversation,
898235
898698
  configManager,
898236
898699
  providerRegistry,
@@ -898421,7 +898884,7 @@ function wireShellUiOpeners(options) {
898421
898884
  render();
898422
898885
  };
898423
898886
  commandContext.openPanelPicker = () => {
898424
- panelManager.hide();
898887
+ panelManager2.hide();
898425
898888
  input.panelFocused = false;
898426
898889
  conversation.setSplashSuppressed(false);
898427
898890
  conversation.log("Panel picker is handled through Agent Workspace. Use /agent for current operator controls.", { fg: "214" });
@@ -898440,7 +898903,7 @@ function wireShellUiOpeners(options) {
898440
898903
  render();
898441
898904
  };
898442
898905
  commandContext.showPanel = (panelId, pane) => {
898443
- panelManager.hide();
898906
+ panelManager2.hide();
898444
898907
  input.panelFocused = false;
898445
898908
  conversation.setSplashSuppressed(false);
898446
898909
  conversation.log(`Panel route "${panelId}" is handled through Agent Workspace. Opening the matching operator area.`, { fg: "214" });
@@ -898702,7 +899165,7 @@ import { join as join100 } from "path";
898702
899165
  function isRecord43(value) {
898703
899166
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
898704
899167
  }
898705
- function readString52(record2, key) {
899168
+ function readString55(record2, key) {
898706
899169
  const value = record2?.[key];
898707
899170
  return typeof value === "string" ? value : null;
898708
899171
  }
@@ -898753,7 +899216,7 @@ async function inspectCliExternalRuntime(options) {
898753
899216
  try {
898754
899217
  const status = await fetchJson2(`${baseUrl}/status`, token.token, timeoutMs);
898755
899218
  const statusRecord = isRecord43(status.body) ? status.body : {};
898756
- const version6 = readString52(statusRecord, "version") ?? "unknown";
899219
+ const version6 = readString55(statusRecord, "version") ?? "unknown";
898757
899220
  const compatible = status.ok && version6 === SDK_VERSION;
898758
899221
  if (!status.ok) {
898759
899222
  return {
@@ -900390,7 +900853,7 @@ async function main() {
900390
900853
  modeManager.setHITLMode(hitlMode);
900391
900854
  }
900392
900855
  }
900393
- const panelManager = ctx.services.panelManager;
900856
+ const panelManager2 = ctx.services.panelManager;
900394
900857
  const buildSessionContinuityHints = () => {
900395
900858
  const sessionSnapshot = uiServices.readModels.session.getSnapshot();
900396
900859
  const tasksSnapshot = uiServices.readModels.tasks.getSnapshot();
@@ -900401,7 +900864,7 @@ async function main() {
900401
900864
  blockedTasks: tasksSnapshot.tasks.filter((task) => task.status === "blocked").length,
900402
900865
  remoteContracts: remoteSnapshot.contracts.length,
900403
900866
  remoteRunners: remoteSnapshot.contracts.slice(0, 4).map((contract) => contract.runnerId),
900404
- openPanels: panelManager.getAllOpen().map((panel) => panel.id)
900867
+ openPanels: panelManager2.getAllOpen().map((panel) => panel.id)
900405
900868
  };
900406
900869
  };
900407
900870
  const buildCurrentSessionSnapshot = () => {
@@ -900537,8 +901000,8 @@ async function main() {
900537
901000
  render();
900538
901001
  },
900539
901002
  openPanel: () => {
900540
- panelManager.open("project-planning");
900541
- panelManager.show();
901003
+ panelManager2.open("project-planning");
901004
+ panelManager2.show();
900542
901005
  render();
900543
901006
  }
900544
901007
  });
@@ -900682,7 +901145,7 @@ async function main() {
900682
901145
  shell: {
900683
901146
  bookmarkManager: ctx.services.bookmarkManager,
900684
901147
  keybindingsManager: ctx.services.keybindingsManager,
900685
- panelManager,
901148
+ panelManager: panelManager2,
900686
901149
  processManager,
900687
901150
  profileManager: ctx.services.profileManager
900688
901151
  },
@@ -900775,7 +901238,7 @@ async function main() {
900775
901238
  const onboardingOwnsScreen = input.onboardingWizard.active;
900776
901239
  const shellHeaderLines = onboardingOwnsScreen ? [] : headerLines;
900777
901240
  const shellFooterLines = onboardingOwnsScreen ? [] : footerLines;
900778
- const panelWidth = !onboardingOwnsScreen && panelManager.isVisible() && panelManager.getAllOpen().length > 0 ? panelManager.getRightWidth(width) : 0;
901241
+ const panelWidth = !onboardingOwnsScreen && panelManager2.isVisible() && panelManager2.getAllOpen().length > 0 ? panelManager2.getRightWidth(width) : 0;
900779
901242
  const shellLayout = createShellLayout({
900780
901243
  width,
900781
901244
  height,
@@ -900788,13 +901251,13 @@ async function main() {
900788
901251
  y: shellLayout.panel.y,
900789
901252
  width: shellLayout.panel.width,
900790
901253
  height: shellLayout.panel.height,
900791
- hasBottomPane: panelManager.isBottomPaneVisible() && panelManager.getBottomPane().panels.length > 0,
900792
- verticalSplitRatio: panelManager.getVerticalSplitRatio()
901254
+ hasBottomPane: panelManager2.isBottomPaneVisible() && panelManager2.getBottomPane().panels.length > 0,
901255
+ verticalSplitRatio: panelManager2.getVerticalSplitRatio()
900793
901256
  } : null);
900794
901257
  const vHeight = shellLayout.body.height;
900795
901258
  const conversationWidth = shellLayout.conversation.width;
900796
901259
  activeConversationWidth = conversationWidth;
900797
- const hasPanelWorkspace = !onboardingOwnsScreen && panelManager.isVisible() && panelManager.getAllOpen().length > 0;
901260
+ const hasPanelWorkspace = !onboardingOwnsScreen && panelManager2.isVisible() && panelManager2.getAllOpen().length > 0;
900798
901261
  conversation.setSplashSuppressed(hasPanelWorkspace);
900799
901262
  conversation.getDisplayBlocks();
900800
901263
  let overlayRows = 0;
@@ -900838,7 +901301,7 @@ async function main() {
900838
901301
  viewportHeight: vHeight,
900839
901302
  contextWindow: currentModel.contextWindow
900840
901303
  });
900841
- const panelComposite = onboardingOwnsScreen ? { panelData: undefined, panelWidth: 0 } : buildPanelCompositeData(panelManager, input, shellLayout.panel?.width ?? 0, shellLayout.panel?.height ?? vHeight);
901304
+ const panelComposite = onboardingOwnsScreen ? { panelData: undefined, panelWidth: 0 } : buildPanelCompositeData(panelManager2, input, shellLayout.panel?.width ?? 0, shellLayout.panel?.height ?? vHeight);
900842
901305
  compositor.composite({
900843
901306
  width,
900844
901307
  height,
@@ -900869,7 +901332,7 @@ async function main() {
900869
901332
  wireShellUiOpeners({
900870
901333
  commandContext,
900871
901334
  input,
900872
- panelManager,
901335
+ panelManager: panelManager2,
900873
901336
  conversation,
900874
901337
  configManager,
900875
901338
  providerRegistry,