@pellux/goodvibes-agent 1.0.33 → 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +71 -59
  3. package/dist/package/main.js +565 -420
  4. package/docs/README.md +25 -21
  5. package/docs/channels-remote-and-api.md +2 -2
  6. package/docs/connected-host.md +3 -3
  7. package/docs/getting-started.md +87 -86
  8. package/docs/providers-and-routing.md +3 -3
  9. package/docs/release-and-publishing.md +3 -3
  10. package/docs/tools-and-commands.md +149 -139
  11. package/docs/voice-and-live-tts.md +1 -1
  12. package/package.json +1 -1
  13. package/release/live-verification/live-verification.json +2 -2
  14. package/release/live-verification/live-verification.md +2 -2
  15. package/release/release-notes.md +6 -15
  16. package/release/release-readiness.json +4 -4
  17. package/src/agent/harness-control.ts +42 -3
  18. package/src/runtime/bootstrap.ts +10 -18
  19. package/src/tools/agent-analysis-registry-policy.ts +2 -9
  20. package/src/tools/agent-channel-send-tool.ts +1 -5
  21. package/src/tools/agent-context-policy.ts +1 -5
  22. package/src/tools/agent-find-policy.ts +1 -4
  23. package/src/tools/agent-harness-channel-metadata.ts +23 -23
  24. package/src/tools/agent-harness-cli-metadata.ts +4 -1
  25. package/src/tools/agent-harness-command-catalog.ts +10 -3
  26. package/src/tools/agent-harness-connected-host-status.ts +8 -2
  27. package/src/tools/agent-harness-delegation-posture.ts +5 -5
  28. package/src/tools/agent-harness-mcp-metadata.ts +30 -28
  29. package/src/tools/agent-harness-media-posture.ts +9 -9
  30. package/src/tools/agent-harness-metadata.ts +25 -7
  31. package/src/tools/agent-harness-model-routing.ts +14 -14
  32. package/src/tools/agent-harness-model-tool-catalog.ts +7 -2
  33. package/src/tools/agent-harness-notification-metadata.ts +17 -17
  34. package/src/tools/agent-harness-pairing-posture.ts +7 -7
  35. package/src/tools/agent-harness-panel-metadata.ts +26 -12
  36. package/src/tools/agent-harness-provider-account-metadata.ts +33 -31
  37. package/src/tools/agent-harness-security-posture.ts +9 -7
  38. package/src/tools/agent-harness-service-posture.ts +22 -16
  39. package/src/tools/agent-harness-session-metadata.ts +9 -7
  40. package/src/tools/agent-harness-setup-posture.ts +6 -6
  41. package/src/tools/agent-harness-tool-schema.ts +1 -0
  42. package/src/tools/agent-harness-tool.ts +79 -36
  43. package/src/tools/agent-harness-ui-surface-metadata.ts +19 -11
  44. package/src/tools/agent-harness-workspace-actions.ts +29 -1
  45. package/src/tools/agent-knowledge-ingest-tool.ts +1 -5
  46. package/src/tools/agent-knowledge-tool.ts +1 -5
  47. package/src/tools/agent-local-registry-tool.ts +1 -4
  48. package/src/tools/agent-media-generate-tool.ts +1 -5
  49. package/src/tools/agent-notify-tool.ts +1 -5
  50. package/src/tools/agent-operator-action-tool.ts +1 -5
  51. package/src/tools/agent-operator-briefing-tool.ts +1 -5
  52. package/src/tools/agent-read-policy.ts +1 -4
  53. package/src/tools/agent-reminder-schedule-tool.ts +1 -5
  54. package/src/tools/agent-tool-policy-guard.ts +7 -34
  55. package/src/tools/agent-web-search-policy.ts +1 -4
  56. package/src/tools/agent-work-plan-tool.ts +1 -5
  57. package/src/version.ts +1 -1
@@ -389782,6 +389782,23 @@ function createSchema2(db) {
389782
389782
  `);
389783
389783
  db.run(`CREATE INDEX IF NOT EXISTS idx_knowledge_schedules_job_id ON knowledge_schedules(job_id)`);
389784
389784
  }
389785
+ function getKnowledgeSchemaStatements() {
389786
+ const statements = [];
389787
+ createSchema2({
389788
+ run(sql) {
389789
+ const normalized = sql.trim();
389790
+ if (normalized.length > 0)
389791
+ statements.push(normalized);
389792
+ }
389793
+ });
389794
+ return statements;
389795
+ }
389796
+ function renderKnowledgeSchemaSql() {
389797
+ return `${getKnowledgeSchemaStatements().map((statement) => statement.endsWith(";") ? statement : `${statement};`).join(`
389798
+
389799
+ `)}
389800
+ `;
389801
+ }
389785
389802
  function rowObject(columns, values2) {
389786
389803
  return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
389787
389804
  }
@@ -703119,6 +703136,9 @@ var init_ingest = __esm(() => {
703119
703136
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
703120
703137
  var init_browser_history = __esm(() => {
703121
703138
  init_ingest();
703139
+ init_discover();
703140
+ init_readers();
703141
+ init_paths2();
703122
703142
  });
703123
703143
 
703124
703144
  // node_modules/graphql/jsutils/devAssert.mjs
@@ -720758,6 +720778,7 @@ var init_semantic = __esm(() => {
720758
720778
  init_llm();
720759
720779
  init_gap_repair();
720760
720780
  init_service4();
720781
+ init_self_improvement();
720761
720782
  });
720762
720783
 
720763
720784
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
@@ -724726,8 +724747,40 @@ var init_map_view = __esm(() => {
724726
724747
  });
724727
724748
 
724728
724749
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
724729
- var HOME_GRAPH_CAPABILITIES;
724750
+ var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
724730
724751
  var init_types6 = __esm(() => {
724752
+ HOME_GRAPH_NODE_KINDS = [
724753
+ "ha_home",
724754
+ "ha_entity",
724755
+ "ha_device",
724756
+ "ha_area",
724757
+ "ha_automation",
724758
+ "ha_script",
724759
+ "ha_scene",
724760
+ "ha_label",
724761
+ "ha_integration",
724762
+ "ha_room",
724763
+ "ha_device_passport",
724764
+ "ha_maintenance_item",
724765
+ "ha_troubleshooting_case",
724766
+ "ha_purchase",
724767
+ "ha_network_node"
724768
+ ];
724769
+ HOME_GRAPH_RELATIONS = [
724770
+ "controls",
724771
+ "located_in",
724772
+ "belongs_to_device",
724773
+ "has_manual",
724774
+ "has_receipt",
724775
+ "has_warranty",
724776
+ "has_issue",
724777
+ "fixed_by",
724778
+ "uses_battery",
724779
+ "connected_via",
724780
+ "part_of_network",
724781
+ "mentioned_by",
724782
+ "source_for"
724783
+ ];
724731
724784
  HOME_GRAPH_CAPABILITIES = [
724732
724785
  "knowledge-space-isolation",
724733
724786
  "snapshot-sync",
@@ -726134,6 +726187,7 @@ var init_service5 = __esm(() => {
726134
726187
  var init_home_graph = __esm(() => {
726135
726188
  init_service5();
726136
726189
  init_extension();
726190
+ init_types6();
726137
726191
  });
726138
726192
 
726139
726193
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-refinement.js
@@ -728461,10 +728515,14 @@ var init_service6 = __esm(() => {
728461
728515
  var init_project_planning = __esm(() => {
728462
728516
  init_service6();
728463
728517
  init_helpers3();
728518
+ init_readiness();
728464
728519
  });
728465
728520
 
728466
728521
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
728467
- var init_persistence = () => {};
728522
+ var init_persistence = __esm(() => {
728523
+ init_store_schema();
728524
+ init_store_load();
728525
+ });
728468
728526
 
728469
728527
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
728470
728528
  class KnowledgeProjectionService {
@@ -731972,21 +732030,21 @@ var init_service7 = __esm(() => {
731972
732030
  var exports_knowledge = {};
731973
732031
  __export(exports_knowledge, {
731974
732032
  withKnowledgeSpace: () => withKnowledgeSpace,
731975
- uniqKnowledgeValues: () => uniq3,
731976
- stabilizeKnowledgeText: () => stableText2,
731977
- runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement2,
732033
+ uniqKnowledgeValues: () => uniq2,
732034
+ stabilizeKnowledgeText: () => stableText,
732035
+ runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
731978
732036
  resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
731979
- resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir2,
732037
+ resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
731980
732038
  renderPacket: () => renderPacket,
731981
732039
  renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
731982
732040
  renderKnowledgeMap: () => renderKnowledgeMap,
731983
732041
  readKnowledgeSearchText: () => readKnowledgeSearchText,
731984
- readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile2,
732042
+ readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
731985
732043
  projectPlanningSourceId: () => projectPlanningSourceId,
731986
732044
  projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
731987
732045
  projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
731988
732046
  projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
731989
- parseKnowledgeJsonValue: () => parseJsonValue2,
732047
+ parseKnowledgeJsonValue: () => parseJsonValue,
731990
732048
  normalizeProjectId: () => normalizeProjectId,
731991
732049
  normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
731992
732050
  normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
@@ -731994,12 +732052,12 @@ __export(exports_knowledge, {
731994
732052
  materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
731995
732053
  looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
731996
732054
  looksBinaryLikeText: () => looksBinaryLikeText,
731997
- loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot2,
732055
+ loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
731998
732056
  listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
731999
- listBrowserKinds: () => listBrowserKinds2,
732057
+ listBrowserKinds: () => listBrowserKinds,
732000
732058
  knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
732001
732059
  knowledgePageSourceWeight: () => knowledgePageSourceWeight,
732002
- knowledgeNowMs: () => nowMs2,
732060
+ knowledgeNowMs: () => nowMs,
732003
732061
  knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
732004
732062
  isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
732005
732063
  isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
@@ -732019,12 +732077,12 @@ __export(exports_knowledge, {
732019
732077
  generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
732020
732078
  generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
732021
732079
  extractKnowledgeArtifact: () => extractKnowledgeArtifact,
732022
- evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness2,
732023
- discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles2,
732080
+ evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
732081
+ discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
732024
732082
  createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
732025
732083
  createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
732026
732084
  createMemoryApi: () => createMemoryApi,
732027
- createKnowledgeSchema: () => createSchema3,
732085
+ createKnowledgeSchema: () => createSchema2,
732028
732086
  createKnowledgeApi: () => createKnowledgeApi,
732029
732087
  createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
732030
732088
  compareKnowledgePageSources: () => compareKnowledgePageSources,
@@ -734463,7 +734521,7 @@ var init_delivery_manager = __esm(() => {
734463
734521
  });
734464
734522
 
734465
734523
  // node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
734466
- function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
734524
+ function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
734467
734525
  let slotsInUse = 0;
734468
734526
  const queuedRuns = [];
734469
734527
  for (const run7 of runs) {
@@ -734473,7 +734531,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
734473
734531
  queuedRuns.push(run7);
734474
734532
  }
734475
734533
  const queueDepth = queuedRuns.length;
734476
- const oldestQueuedAgeMs = queueDepth > 0 ? nowMs3 - Math.min(...queuedRuns.map((r5) => r5.queuedAt)) : null;
734534
+ const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r5) => r5.queuedAt)) : null;
734477
734535
  return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
734478
734536
  }
734479
734537
 
@@ -817087,7 +817145,7 @@ var createStyledCell = (char, overrides = {}) => ({
817087
817145
  // src/version.ts
817088
817146
  import { readFileSync } from "fs";
817089
817147
  import { join } from "path";
817090
- var _version = "1.0.33";
817148
+ var _version = "1.0.34";
817091
817149
  var _sdkVersion = "0.33.36";
817092
817150
  try {
817093
817151
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
@@ -840168,7 +840226,7 @@ var WORK_PLAN_STATUSES = [
840168
840226
  "failed",
840169
840227
  "cancelled"
840170
840228
  ];
840171
- function nowMs3() {
840229
+ function nowMs2() {
840172
840230
  return Date.now();
840173
840231
  }
840174
840232
  function isObject5(value) {
@@ -840274,7 +840332,7 @@ class WorkPlanStore {
840274
840332
  if (!normalizedTitle)
840275
840333
  throw new Error("Work plan item title is required.");
840276
840334
  const plan = this.readPlan();
840277
- const time4 = nowMs3();
840335
+ const time4 = nowMs2();
840278
840336
  const item = {
840279
840337
  id: createItemId(),
840280
840338
  title: normalizedTitle,
@@ -840298,7 +840356,7 @@ class WorkPlanStore {
840298
840356
  updateItem(idOrPrefix, patch2) {
840299
840357
  const plan = this.readPlan();
840300
840358
  const item = this.resolveItem(plan, idOrPrefix);
840301
- const time4 = nowMs3();
840359
+ const time4 = nowMs2();
840302
840360
  const nextStatus = patch2.status ?? item.status;
840303
840361
  const next = this.pruneItem({
840304
840362
  ...item,
@@ -840331,7 +840389,7 @@ class WorkPlanStore {
840331
840389
  removeItem(idOrPrefix) {
840332
840390
  const plan = this.readPlan();
840333
840391
  const item = this.resolveItem(plan, idOrPrefix);
840334
- const time4 = nowMs3();
840392
+ const time4 = nowMs2();
840335
840393
  const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
840336
840394
  this.writePlan({
840337
840395
  ...plan,
@@ -840351,7 +840409,7 @@ class WorkPlanStore {
840351
840409
  ...plan,
840352
840410
  items: remaining,
840353
840411
  activeItemId: remaining[0]?.id,
840354
- updatedAt: nowMs3()
840412
+ updatedAt: nowMs2()
840355
840413
  });
840356
840414
  return removed;
840357
840415
  }
@@ -840390,7 +840448,7 @@ class WorkPlanStore {
840390
840448
  const parsed = JSON.parse(raw);
840391
840449
  if (!isObject5(parsed))
840392
840450
  return this.createEmptyPlan();
840393
- const time4 = nowMs3();
840451
+ const time4 = nowMs2();
840394
840452
  const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
840395
840453
  const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
840396
840454
  const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
@@ -840409,7 +840467,7 @@ class WorkPlanStore {
840409
840467
  };
840410
840468
  }
840411
840469
  createEmptyPlan() {
840412
- const time4 = nowMs3();
840470
+ const time4 = nowMs2();
840413
840471
  return {
840414
840472
  id: createPlanId(this.options.projectId, this.options.projectRoot),
840415
840473
  projectId: this.options.projectId,
@@ -841161,11 +841219,7 @@ function validateRegistryToolInvocationForAgentPolicy(args2) {
841161
841219
  return null;
841162
841220
  }
841163
841221
  function narrowAnalyzeToolDefinitionForAgentPolicy(tool2) {
841164
- tool2.definition.description = [
841165
- "Run local, static project analysis for GoodVibes Agent.",
841166
- "npm registry upgrade checks and hidden secondary LLM diff analysis are disabled in the main conversation.",
841167
- "Delegate package-upgrade and review workflows to GoodVibes TUI when they become build/fix/review work."
841168
- ].join(" ");
841222
+ tool2.definition.description = "Run local, static project analysis for GoodVibes Agent.";
841169
841223
  tool2.definition.sideEffects = ["read_fs"];
841170
841224
  const properties2 = tool2.definition.parameters.properties;
841171
841225
  if (!isRecord22(properties2))
@@ -841178,10 +841232,7 @@ function narrowAnalyzeToolDefinitionForAgentPolicy(tool2) {
841178
841232
  delete properties2.packages;
841179
841233
  }
841180
841234
  function narrowRegistryToolDefinitionForAgentPolicy(tool2) {
841181
- tool2.definition.description = [
841182
- "Discover and preview GoodVibes Agent skills, agents, and tools.",
841183
- "Full content materialization and arbitrary .goodvibes file reads are disabled in the main conversation."
841184
- ].join(" ");
841235
+ tool2.definition.description = "Discover and preview GoodVibes Agent registry entries.";
841185
841236
  tool2.definition.sideEffects = ["read_fs"];
841186
841237
  const properties2 = tool2.definition.parameters.properties;
841187
841238
  if (!isRecord22(properties2))
@@ -841207,11 +841258,7 @@ var CONTEXT_TOOL_DENIAL = [
841207
841258
  "Use explicit Agent CLI/slash commands such as status, compat, setup, and isolated Agent Knowledge instead."
841208
841259
  ].join(" ");
841209
841260
  function wrapBlockedContextToolForAgentPolicy(tool2) {
841210
- tool2.definition.description = [
841211
- "Blocked in GoodVibes Agent main conversation: non-Agent runtime context.",
841212
- "Use explicit Agent CLI/slash status, compat, setup, and Agent Knowledge commands for product-scoped context.",
841213
- "Default knowledge, non-Agent knowledge segments, and non-Agent runtime assumptions are not Agent fallbacks."
841214
- ].join(" ");
841261
+ tool2.definition.description = "Blocked in GoodVibes Agent: non-Agent runtime context.";
841215
841262
  tool2.definition.sideEffects = [];
841216
841263
  tool2.definition.parameters = {
841217
841264
  type: "object",
@@ -841279,10 +841326,7 @@ function normalizeFindToolInvocationForAgentPolicy(args2) {
841279
841326
  };
841280
841327
  }
841281
841328
  function narrowFindToolDefinitionForAgentPolicy(tool2) {
841282
- tool2.definition.description = [
841283
- "Search the project for GoodVibes Agent using serial, gitignore-respecting read-only queries.",
841284
- "Hidden-file scans, symlink traversal, gitignore bypass, broad previews, full symbol dumps, and parallel search are disabled in the main conversation."
841285
- ].join(" ");
841329
+ tool2.definition.description = "Search project files with serial, gitignore-respecting read-only queries.";
841286
841330
  tool2.definition.sideEffects = ["read_fs"];
841287
841331
  tool2.definition.concurrency = "serial";
841288
841332
  const properties2 = tool2.definition.parameters.properties;
@@ -841429,10 +841473,7 @@ function isBlockedReadPath(path7) {
841429
841473
  return SECRET_EXACT_SEGMENTS.has(stem) && SECRET_FILE_EXTENSIONS.has(extension);
841430
841474
  }
841431
841475
  function narrowReadToolDefinitionForAgentPolicy(tool2) {
841432
- tool2.definition.description = [
841433
- "Read ordinary project files for GoodVibes Agent with bounded, non-secret, main-conversation policy.",
841434
- "Hidden paths, secret-looking files, broad batches, unoptimized image extraction, and oversized image reads are disabled."
841435
- ].join(" ");
841476
+ tool2.definition.description = "Read ordinary non-secret project files for GoodVibes Agent.";
841436
841477
  tool2.definition.sideEffects = ["read_fs"];
841437
841478
  tool2.definition.concurrency = "serial";
841438
841479
  const properties2 = tool2.definition.parameters.properties;
@@ -841530,10 +841571,7 @@ function normalizeWebSearchToolInvocationForAgentPolicy(args2) {
841530
841571
  };
841531
841572
  }
841532
841573
  function narrowWebSearchToolDefinitionForAgentPolicy(tool2) {
841533
- tool2.definition.description = [
841534
- "Run bounded, read-only web research for GoodVibes Agent.",
841535
- "Full-page/raw/summary extraction, safe-search off, and high-fanout searches are disabled in the main conversation."
841536
- ].join(" ");
841574
+ tool2.definition.description = "Run bounded, read-only web research for GoodVibes Agent.";
841537
841575
  tool2.definition.sideEffects = ["network"];
841538
841576
  const properties2 = tool2.definition.parameters.properties;
841539
841577
  if (!isRecord25(properties2))
@@ -841782,11 +841820,7 @@ function normalizeAgentToolInvocationForAgentPolicy(args2) {
841782
841820
  return args2;
841783
841821
  }
841784
841822
  function wrapBlockedMainConversationToolForAgentPolicy(tool2) {
841785
- tool2.definition.description = [
841786
- `Blocked in GoodVibes Agent main conversation: ${tool2.definition.name}.`,
841787
- "Use explicit GoodVibes TUI build delegation for build/fix/review/code execution work.",
841788
- "Use Agent-owned local registries and isolated Agent Knowledge routes for Agent memory and knowledge work."
841789
- ].join(" ");
841823
+ tool2.definition.description = `Blocked in GoodVibes Agent: ${tool2.definition.name}.`;
841790
841824
  tool2.definition.sideEffects = [];
841791
841825
  tool2.execute = async () => ({ success: false, error: LOCAL_CODING_TOOL_DENIAL });
841792
841826
  }
@@ -841821,11 +841855,7 @@ function wrapStateToolForAgentPolicy(tool2) {
841821
841855
  };
841822
841856
  }
841823
841857
  function wrapBlockedSettingsToolForAgentPolicy(tool2) {
841824
- tool2.definition.description = [
841825
- "Blocked in GoodVibes Agent main conversation: configuration mutation.",
841826
- "Use explicit Agent CLI/slash settings commands for intentional config changes.",
841827
- "Connected-host lifecycle and service exposure remain externally managed outside GoodVibes Agent."
841828
- ].join(" ");
841858
+ tool2.definition.description = "Blocked in GoodVibes Agent: configuration mutation.";
841829
841859
  tool2.definition.sideEffects = [];
841830
841860
  tool2.definition.parameters = {
841831
841861
  type: "object",
@@ -841988,11 +842018,7 @@ function isPresent(value) {
841988
842018
  return true;
841989
842019
  }
841990
842020
  function narrowAgentToolDefinitionForAgentPolicy(tool2) {
841991
- tool2.definition.description = [
841992
- "Read-only local Agent inspection for GoodVibes Agent.",
841993
- "This product does not create separate Agent jobs or run local delegated review chains.",
841994
- "For build/fix/review work, delegate to GoodVibes TUI through the explicit build-delegation path instead."
841995
- ].join(" ");
842021
+ tool2.definition.description = "Read-only local Agent inspection for GoodVibes Agent.";
841996
842022
  tool2.definition.sideEffects = [];
841997
842023
  const properties2 = tool2.definition.parameters.properties;
841998
842024
  if (!isRecord26(properties2))
@@ -842004,11 +842030,7 @@ function narrowAgentToolDefinitionForAgentPolicy(tool2) {
842004
842030
  modeProperty.description = "Read-only Agent inspection mode. Separate Agent job creation, batch creation, cancel, message, wait, and plan modes are disabled in GoodVibes Agent.";
842005
842031
  }
842006
842032
  function narrowExecToolDefinitionForAgentPolicy(tool2) {
842007
- tool2.definition.description = [
842008
- "Execute foreground shell commands serially for GoodVibes Agent main-conversation work.",
842009
- "Background processes, parallel batches, background process controls, and exec file_ops are disabled by Agent policy.",
842010
- "Delegate long-running build/fix/review execution to GoodVibes TUI instead."
842011
- ].join(" ");
842033
+ tool2.definition.description = "Execute foreground shell commands serially for GoodVibes Agent.";
842012
842034
  const properties2 = tool2.definition.parameters.properties;
842013
842035
  if (!isRecord26(properties2))
842014
842036
  return;
@@ -842033,11 +842055,7 @@ function narrowExecToolDefinitionForAgentPolicy(tool2) {
842033
842055
  }
842034
842056
  }
842035
842057
  function narrowFetchToolDefinitionForAgentPolicy(tool2) {
842036
- tool2.definition.description = [
842037
- "Fetch public URLs for GoodVibes Agent with serial, read-only HTTP requests.",
842038
- "Only GET, HEAD, and OPTIONS are available in the main conversation.",
842039
- "Credentialed requests, request bodies, trust overrides, raw unsanitized responses, and parallel batches are disabled by Agent policy."
842040
- ].join(" ");
842058
+ tool2.definition.description = "Fetch public URLs with serial, read-only HTTP requests.";
842041
842059
  const properties2 = tool2.definition.parameters.properties;
842042
842060
  if (!isRecord26(properties2))
842043
842061
  return;
@@ -842072,11 +842090,7 @@ function narrowFetchToolDefinitionForAgentPolicy(tool2) {
842072
842090
  delete urlProperties.auth;
842073
842091
  }
842074
842092
  function narrowStateToolDefinitionForAgentPolicy(tool2) {
842075
- tool2.definition.description = [
842076
- "Inspect runtime-owned state for GoodVibes Agent.",
842077
- "State mutation, runtime-owned memory writes, hook changes, output-mode changes, and analytics writes are disabled in the main conversation.",
842078
- "Use Agent-owned commands for intentional memory, skill, persona, and routine changes."
842079
- ].join(" ");
842093
+ tool2.definition.description = "Inspect runtime-owned state for GoodVibes Agent.";
842080
842094
  const properties2 = tool2.definition.parameters.properties;
842081
842095
  if (!isRecord26(properties2))
842082
842096
  return;
@@ -842103,10 +842117,7 @@ function narrowStateToolDefinitionForAgentPolicy(tool2) {
842103
842117
  narrowStringEnumProperty(properties2, "analyticsAction", READ_ONLY_STATE_ANALYTICS_ACTIONS, "Read-only analytics actions allowed by GoodVibes Agent.");
842104
842118
  }
842105
842119
  function narrowInspectToolDefinitionForAgentPolicy(tool2) {
842106
- tool2.definition.description = [
842107
- "Inspect and analyze project structure for GoodVibes Agent.",
842108
- "Scaffold mode is dry-run-only in the main conversation; code creation must be delegated to GoodVibes TUI."
842109
- ].join(" ");
842120
+ tool2.definition.description = "Inspect and analyze project structure for GoodVibes Agent.";
842110
842121
  const properties2 = tool2.definition.parameters.properties;
842111
842122
  if (!isRecord26(properties2))
842112
842123
  return;
@@ -842313,11 +842324,7 @@ function createAgentChannelSendTool(channelDeliveryRouter) {
842313
842324
  return {
842314
842325
  definition: {
842315
842326
  name: "agent_channel_send",
842316
- description: [
842317
- "Send one confirmed message through a configured Agent target.",
842318
- "Use only for explicit send/message/alert requests.",
842319
- "Provide exactly one target."
842320
- ].join(" "),
842327
+ description: "Send one confirmed message through one configured Agent target.",
842321
842328
  parameters: {
842322
842329
  type: "object",
842323
842330
  properties: {
@@ -844523,11 +844530,7 @@ function createAgentKnowledgeIngestTool(shellPaths, configManager) {
844523
844530
  return {
844524
844531
  definition: {
844525
844532
  name: "agent_knowledge_ingest",
844526
- description: [
844527
- "Ingest one confirmed source into isolated Agent Knowledge.",
844528
- "Use only for explicit ingest/import requests.",
844529
- "Supports URL, file, bookmark, history, and connector sources."
844530
- ].join(" "),
844533
+ description: "Ingest one confirmed source into isolated Agent Knowledge.",
844531
844534
  parameters: {
844532
844535
  type: "object",
844533
844536
  properties: {
@@ -844706,11 +844709,7 @@ function createAgentKnowledgeTool(shellPaths, configManager) {
844706
844709
  return {
844707
844710
  definition: {
844708
844711
  name: "agent_knowledge",
844709
- description: [
844710
- "Read isolated Agent Knowledge.",
844711
- "Use for status, ask/search, source/node/issue lists, item lookup, map summary, and connector inspection.",
844712
- "Read-only."
844713
- ].join(" "),
844712
+ description: "Read isolated Agent Knowledge.",
844714
844713
  parameters: {
844715
844714
  type: "object",
844716
844715
  properties: {
@@ -845611,10 +845610,7 @@ function createAgentLocalRegistryTool(shellPaths, memoryRegistry) {
845611
845610
  return {
845612
845611
  definition: {
845613
845612
  name: "agent_local_registry",
845614
- description: [
845615
- "Inspect or update Agent-local records: memory, notes, personas, skills, bundles, and routines.",
845616
- "Deletion requires confirm:true plus explicitUserRequest."
845617
- ].join(" "),
845613
+ description: "Inspect or update Agent-local records.",
845618
845614
  parameters: {
845619
845615
  type: "object",
845620
845616
  properties: {
@@ -845827,11 +845823,7 @@ function createAgentMediaGenerateTool(mediaProviderRegistry, artifactStore) {
845827
845823
  return {
845828
845824
  definition: {
845829
845825
  name: "agent_media_generate",
845830
- description: [
845831
- "Generate one confirmed image or video artifact.",
845832
- "Use only for explicit media generation requests.",
845833
- "Returns artifact ids, not inline base64."
845834
- ].join(" "),
845826
+ description: "Generate one confirmed image or video artifact.",
845835
845827
  parameters: {
845836
845828
  type: "object",
845837
845829
  properties: {
@@ -845951,11 +845943,7 @@ function createAgentNotifyTool(configManager, notifier) {
845951
845943
  return {
845952
845944
  definition: {
845953
845945
  name: "agent_notify",
845954
- description: [
845955
- "Send one confirmed plain-text notification.",
845956
- "Use only for explicit notify/message/alert requests.",
845957
- "Uses existing targets only."
845958
- ].join(" "),
845946
+ description: "Send one confirmed plain-text notification.",
845959
845947
  parameters: {
845960
845948
  type: "object",
845961
845949
  properties: {
@@ -846277,11 +846265,7 @@ function createAgentOperatorActionTool(shellPaths, configManager) {
846277
846265
  return {
846278
846266
  definition: {
846279
846267
  name: "agent_operator_action",
846280
- description: [
846281
- "Run one confirmed allowlisted operator action.",
846282
- "Use only for explicit approval, automation, or schedule requests.",
846283
- "No automation definition edits or host lifecycle."
846284
- ].join(" "),
846268
+ description: "Run one confirmed allowlisted operator action.",
846285
846269
  parameters: {
846286
846270
  type: "object",
846287
846271
  properties: {
@@ -846495,11 +846479,7 @@ function createAgentOperatorBriefingTool(shellPaths, configManager) {
846495
846479
  return {
846496
846480
  definition: {
846497
846481
  name: "agent_operator_briefing",
846498
- description: [
846499
- "Read connected Agent operator state for a concise briefing.",
846500
- "Use for pending attention, approvals, automation, schedules, or status.",
846501
- "Read-only."
846502
- ].join(" "),
846482
+ description: "Read connected Agent operator state for a concise briefing.",
846503
846483
  parameters: {
846504
846484
  type: "object",
846505
846485
  properties: {},
@@ -847095,11 +847075,7 @@ function createAgentReminderScheduleTool(shellPaths, configManager) {
847095
847075
  return {
847096
847076
  definition: {
847097
847077
  name: "agent_reminder_schedule",
847098
- description: [
847099
- "Schedule one confirmed GoodVibes Agent reminder.",
847100
- "Use only for an explicit reminder request.",
847101
- "No host lifecycle, background job, or Knowledge write."
847102
- ].join(" "),
847078
+ description: "Schedule one confirmed GoodVibes Agent reminder.",
847103
847079
  parameters: {
847104
847080
  type: "object",
847105
847081
  properties: {
@@ -847339,11 +847315,7 @@ function createAgentWorkPlanTool(store) {
847339
847315
  return {
847340
847316
  definition: {
847341
847317
  name: "agent_work_plan",
847342
- description: [
847343
- "Inspect or update the visible Agent-local work plan.",
847344
- "Use for task/status tracking.",
847345
- "Destructive actions require confirm:true plus explicitUserRequest."
847346
- ].join(" "),
847318
+ description: "Inspect or update the visible Agent-local work plan.",
847347
847319
  parameters: {
847348
847320
  type: "object",
847349
847321
  properties: {
@@ -848685,13 +848657,13 @@ init_state3();
848685
848657
 
848686
848658
  // src/input/commands/recall-shared.ts
848687
848659
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
848688
- var VALID_SCOPES2 = ["session", "project", "team"];
848660
+ var VALID_SCOPES = ["session", "project", "team"];
848689
848661
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
848690
848662
  function isValidClass(s4) {
848691
848663
  return VALID_CLASSES.includes(s4);
848692
848664
  }
848693
848665
  function isValidScope(s4) {
848694
- return VALID_SCOPES2.includes(s4);
848666
+ return VALID_SCOPES.includes(s4);
848695
848667
  }
848696
848668
  function isValidReviewState(s4) {
848697
848669
  return VALID_REVIEW_STATES.includes(s4);
@@ -848734,7 +848706,7 @@ function handleRecallSearch(args2, context) {
848734
848706
  if (isValidScope(scope))
848735
848707
  filter.scope = scope;
848736
848708
  else {
848737
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848709
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
848738
848710
  return;
848739
848711
  }
848740
848712
  }
@@ -848909,7 +848881,7 @@ function handleRecallList(args2, context) {
848909
848881
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
848910
848882
  const scope = args2[scopeIdx + 1];
848911
848883
  if (!isValidScope(scope)) {
848912
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848884
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
848913
848885
  return;
848914
848886
  }
848915
848887
  filter.scope = scope;
@@ -848959,7 +848931,7 @@ async function handleRecallAdd(args2, context) {
848959
848931
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
848960
848932
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
848961
848933
  if (scopeRaw && !isValidScope(scopeRaw)) {
848962
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
848934
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
848963
848935
  return;
848964
848936
  }
848965
848937
  const provenance = [];
@@ -849093,7 +849065,7 @@ function handleRecallExport(args2, context) {
849093
849065
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
849094
849066
  const scope = commandArgs[scopeIdx + 1];
849095
849067
  if (!isValidScope(scope)) {
849096
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
849068
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
849097
849069
  return;
849098
849070
  }
849099
849071
  filter.scope = scope;
@@ -849172,7 +849144,7 @@ function handleRecallHandoffExport(args2, context) {
849172
849144
  const scopeIdx = commandArgs.indexOf("--scope");
849173
849145
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
849174
849146
  if (!scopeRaw || !isValidScope(scopeRaw)) {
849175
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
849147
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
849176
849148
  return;
849177
849149
  }
849178
849150
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -849288,7 +849260,7 @@ function handleRecallPromote(args2, context) {
849288
849260
  const id = parsed.rest[0];
849289
849261
  const scope = parsed.rest[1];
849290
849262
  if (!id || !scope || !isValidScope(scope)) {
849291
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
849263
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
849292
849264
  return;
849293
849265
  }
849294
849266
  if (!parsed.yes) {
@@ -851969,6 +851941,10 @@ var SENSITIVE_KEY_PATTERN2 = /(?:secret|token|password|api[-_.]?key|signing)/i;
851969
851941
  function valuesEqual2(left, right) {
851970
851942
  return JSON.stringify(left) === JSON.stringify(right);
851971
851943
  }
851944
+ function previewText2(value, maxLength = 120) {
851945
+ const normalized = value.replace(/\s+/g, " ").trim();
851946
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
851947
+ }
851972
851948
  function clampLimit4(value, fallback = DEFAULT_SETTING_LIMIT) {
851973
851949
  if (typeof value !== "number" || !Number.isFinite(value))
851974
851950
  return fallback;
@@ -852039,7 +852015,22 @@ function describeHarnessSetting(configManager, setting, options = {}) {
852039
852015
  ...options.lookup ? { lookup: options.lookup } : {}
852040
852016
  };
852041
852017
  }
852042
- function listHarnessSettings(configManager, filters = {}) {
852018
+ function describeHarnessSettingSummary(configManager, setting) {
852019
+ const value = configManager.get(setting.key);
852020
+ const hostOwned = isExternalHostOwnedSettingKey(setting.key);
852021
+ return {
852022
+ key: setting.key,
852023
+ category: setting.key.split(".")[0] ?? "",
852024
+ type: setting.type,
852025
+ value: redactHarnessSettingValue(setting.key, value),
852026
+ configured: !valuesEqual2(value, setting.default),
852027
+ writable: !hostOwned,
852028
+ visibleInWorkspace: !isAgentHiddenSettingKey(setting.key),
852029
+ summary: previewText2(setting.description),
852030
+ ...setting.enumValues ? { enumValues: setting.enumValues } : {}
852031
+ };
852032
+ }
852033
+ function listHarnessSettings(configManager, filters = {}, options = {}) {
852043
852034
  const key = filters.key?.trim();
852044
852035
  const category = filters.category?.trim();
852045
852036
  const prefix = filters.prefix?.trim();
@@ -852059,7 +852050,7 @@ function listHarnessSettings(configManager, filters = {}) {
852059
852050
  return false;
852060
852051
  }
852061
852052
  return true;
852062
- }).map((setting) => describeHarnessSetting(configManager, setting)).slice(0, limit3);
852053
+ }).map((setting) => options.includeParameters ? describeHarnessSetting(configManager, setting) : describeHarnessSettingSummary(configManager, setting)).slice(0, limit3);
852063
852054
  }
852064
852055
  function getHarnessSetting(configManager, key, lookup) {
852065
852056
  const setting = findSetting(configManager, key);
@@ -863185,7 +863176,7 @@ import { mkdirSync as mkdirSync64, readFileSync as readFileSync85, writeFileSync
863185
863176
  import { dirname as dirname63, resolve as resolve39 } from "path";
863186
863177
  init_state3();
863187
863178
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
863188
- var VALID_SCOPES4 = ["session", "project", "team"];
863179
+ var VALID_SCOPES3 = ["session", "project", "team"];
863189
863180
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
863190
863181
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
863191
863182
  var VALUE_OPTIONS = new Set([
@@ -863285,7 +863276,7 @@ function isMemoryClass2(value) {
863285
863276
  return VALID_CLASSES2.includes(value);
863286
863277
  }
863287
863278
  function isMemoryScope2(value) {
863288
- return VALID_SCOPES4.includes(value);
863279
+ return VALID_SCOPES3.includes(value);
863289
863280
  }
863290
863281
  function isReviewState(value) {
863291
863282
  return VALID_REVIEW_STATES3.includes(value);
@@ -863300,7 +863291,7 @@ function requireClass(value) {
863300
863291
  }
863301
863292
  function requireScope(value) {
863302
863293
  if (!value || !isMemoryScope2(value))
863303
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
863294
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
863304
863295
  return value;
863305
863296
  }
863306
863297
  function optionalScope(value) {
@@ -879405,31 +879396,31 @@ function describeChannel(channel, options = {}) {
879405
879396
  defaultTargetKeys: channel.defaultTargetKeys,
879406
879397
  configuredDefaultTargetKeys: channel.configuredDefaultTargetKeys,
879407
879398
  ...options.lookup ? { lookup: options.lookup } : {},
879408
- policy: {
879409
- effect: "read-only",
879410
- values: "Config key names and target key names are shown; secret values and stored target values are never returned.",
879411
- delivery: "Use agent_channel_send only for one explicit, confirmed delivery target requested by the user.",
879412
- setup: "Use connected-host setup/account/policy routes only as read-only diagnostics unless another confirmed first-class tool owns the mutation."
879413
- },
879414
- modelAccess: {
879415
- sendTool: "agent_channel_send",
879416
- notificationTool: "agent_notify",
879417
- reminderTool: "agent_reminder_schedule",
879418
- slashCommandDetail: `/channels show ${channel.id}`,
879419
- readOnlyConnectedRoutes: [
879420
- "/channels accounts",
879421
- "/channels policies",
879422
- "/channels status",
879423
- `/channels doctor ${channel.id}`,
879424
- `/channels setup ${channel.id}`
879425
- ],
879426
- settingsFilter: `agent_harness mode:"settings" prefix:"surfaces.${channel.id}" includeHidden:true`,
879427
- connectedHostBoundary: 'agent_harness mode:"connected_host_capability" query:"delivery"',
879428
- ...options.includeParameters ? {
879399
+ ...options.includeParameters ? {
879400
+ policy: {
879401
+ effect: "read-only",
879402
+ values: "Config key names and target key names are shown; secret values and stored target values are never returned.",
879403
+ delivery: "Use agent_channel_send only for one explicit, confirmed delivery target requested by the user.",
879404
+ setup: "Use connected-host setup/account/policy routes only as read-only diagnostics unless another confirmed first-class tool owns the mutation."
879405
+ },
879406
+ modelAccess: {
879407
+ sendTool: "agent_channel_send",
879408
+ notificationTool: "agent_notify",
879409
+ reminderTool: "agent_reminder_schedule",
879410
+ slashCommandDetail: `/channels show ${channel.id}`,
879411
+ readOnlyConnectedRoutes: [
879412
+ "/channels accounts",
879413
+ "/channels policies",
879414
+ "/channels status",
879415
+ `/channels doctor ${channel.id}`,
879416
+ `/channels setup ${channel.id}`
879417
+ ],
879418
+ settingsFilter: `agent_harness mode:"settings" prefix:"surfaces.${channel.id}" includeHidden:true`,
879419
+ connectedHostBoundary: 'agent_harness mode:"connected_host_capability" query:"delivery"',
879429
879420
  deliveryTargetShape: "surface[:route[:label]]",
879430
879421
  exampleTarget: `${channel.id}:route:Label`
879431
- } : {}
879432
- }
879422
+ }
879423
+ } : {}
879433
879424
  };
879434
879425
  }
879435
879426
  function channelReadinessCatalogStatus(context) {
@@ -880057,22 +880048,36 @@ function describeConnectedHostCapability(toolRegistry, rawQuery) {
880057
880048
  return { status: "ambiguous", input: rawQuery, candidates: describeConnectedHostCapabilityCandidates(searched) };
880058
880049
  return null;
880059
880050
  }
880060
- function connectedHostSummary(context, toolRegistry) {
880051
+ function connectedHostSummary(context, toolRegistry, options = {}) {
880061
880052
  const shellPaths3 = context.workspace.shellPaths;
880062
880053
  const homeDirectory = shellPaths3?.homeDirectory ?? context.platform.configManager.getHomeDirectory() ?? "";
880063
880054
  const connection5 = resolveAgentConnectedHostConnection(context.platform.configManager, homeDirectory);
880055
+ const routeFamilies = connectedHostRouteFamilies();
880056
+ const capabilities = connectedHostCapabilityMap(toolRegistry);
880057
+ const blockedCapabilities = blockedConnectedHostCapabilities();
880064
880058
  return {
880065
880059
  baseUrl: connection5.baseUrl,
880066
880060
  operatorToken: connection5.token ? "configured" : "missing",
880067
880061
  tokenPath: connection5.tokenPath,
880068
880062
  ownership: "external-connected-host",
880069
880063
  lifecycle: "GoodVibes Agent can use public connected-host operator routes, but does not start, stop, restart, install, expose, or mutate the host listener.",
880070
- servicePostureMode: 'Use agent_harness mode:"service_posture" for endpoint binding, network-facing posture, issue, and redacted-log diagnostics. Use mode:"service_endpoint" for one endpoint.',
880071
- operatorMethodMode: 'Use agent_harness mode:"operator_methods" for the public operator and Agent Knowledge method catalog. Use mode:"operator_method" for one method.',
880072
- statusMode: 'Use agent_harness mode:"connected_host_status" for live read-only reachability, SDK compatibility, token posture, and Agent Knowledge route readiness.',
880073
- routeFamilies: connectedHostRouteFamilies(),
880074
- capabilities: connectedHostCapabilityMap(toolRegistry),
880075
- blockedCapabilities: blockedConnectedHostCapabilities()
880064
+ modes: {
880065
+ servicePosture: "service_posture/service_endpoint",
880066
+ operatorMethods: "operator_methods/operator_method",
880067
+ liveStatus: "connected_host_status",
880068
+ capabilityDetail: "connected_host_capability"
880069
+ },
880070
+ counts: {
880071
+ routeFamilies: routeFamilies.length,
880072
+ allowedCapabilities: capabilities.length,
880073
+ availableCapabilities: capabilities.filter((capability) => capability.available === true).length,
880074
+ blockedCapabilities: blockedCapabilities.length
880075
+ },
880076
+ ...options.includeParameters === true ? {
880077
+ routeFamilies,
880078
+ capabilities,
880079
+ blockedCapabilities
880080
+ } : {}
880076
880081
  };
880077
880082
  }
880078
880083
  function blockedConnectedHostCapabilities() {
@@ -880187,7 +880192,8 @@ function blockedHarnessCliCommandTokens() {
880187
880192
  function listHarnessCliCommands(args2) {
880188
880193
  const query2 = readString52(args2.query);
880189
880194
  const limit3 = readLimit6(args2.limit, 200);
880190
- return listGoodVibesCliCommands().filter((command8) => command8 !== "unknown").map((command8) => describeCliCommand(command8)).filter((command8) => cliCommandMatches(command8, query2)).sort((a4, b3) => String(a4.name).localeCompare(String(b3.name))).slice(0, limit3);
880195
+ const includeParameters = args2.includeParameters === true;
880196
+ return listGoodVibesCliCommands().filter((command8) => command8 !== "unknown").map((command8) => describeCliCommand(command8)).filter((command8) => cliCommandMatches(command8, query2)).sort((a4, b3) => String(a4.name).localeCompare(String(b3.name))).slice(0, limit3).map((command8) => includeParameters ? command8 : cliCommandCandidate(command8));
880191
880197
  }
880192
880198
  function cliInputFromArgs(args2) {
880193
880199
  const cliCommand = readString52(args2.cliCommand);
@@ -880303,6 +880309,10 @@ function readStringArray12(value) {
880303
880309
  return [];
880304
880310
  return value.map((entry) => typeof entry === "string" ? entry : String(entry));
880305
880311
  }
880312
+ function previewText3(value, maxLength = 120) {
880313
+ const normalized = value.replace(/\s+/g, " ").trim();
880314
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
880315
+ }
880306
880316
  function commandMatches(command8, query2) {
880307
880317
  if (!query2)
880308
880318
  return true;
@@ -880341,8 +880351,8 @@ function describeCommandCandidate(command8) {
880341
880351
  name: command8.name,
880342
880352
  slash: `/${command8.name}`,
880343
880353
  aliases: command8.aliases ?? [],
880344
- description: command8.description,
880345
- usage: command8.usage ?? ""
880354
+ summary: previewText3(command8.description),
880355
+ ...command8.argsHint ? { argsHint: command8.argsHint } : {}
880346
880356
  };
880347
880357
  }
880348
880358
  function commandDetailLookupFromArgs(args2) {
@@ -880425,7 +880435,8 @@ function resolveHarnessCommandDetail(commandRegistry, args2) {
880425
880435
  function listHarnessCommands(commandRegistry, args2) {
880426
880436
  const query2 = readString53(args2.query);
880427
880437
  const limit3 = readLimit7(args2.limit, 200);
880428
- return commandRegistry.list().filter((command8) => commandMatches(command8, query2)).sort((a4, b3) => a4.name.localeCompare(b3.name)).slice(0, limit3).map((command8) => describeCommand(command8));
880438
+ const includeParameters = args2.includeParameters === true;
880439
+ return commandRegistry.list().filter((command8) => commandMatches(command8, query2)).sort((a4, b3) => a4.name.localeCompare(b3.name)).slice(0, limit3).map((command8) => includeParameters ? describeCommand(command8) : describeCommandCandidate(command8));
880429
880440
  }
880430
880441
  function describeHarnessCommand(commandRegistry, args2) {
880431
880442
  const detail = resolveHarnessCommandDetail(commandRegistry, args2);
@@ -880540,12 +880551,12 @@ function describeRoute(context, route, options = {}) {
880540
880551
  operatorClientAttached: Boolean(context.clients?.operator)
880541
880552
  },
880542
880553
  ...options.lookup ? { lookup: options.lookup } : {},
880543
- policy: {
880544
- effect: route.effect,
880545
- values: "Delegation posture returns policy, route, confirmation, and runtime availability metadata only; it does not submit delegated work.",
880546
- mutation: "Delegated work submission stays a visible confirmed workspace or slash-command flow and must preserve the full original user ask."
880547
- },
880548
880554
  ...options.includeParameters ? {
880555
+ policy: {
880556
+ effect: route.effect,
880557
+ values: "Delegation posture returns policy, route, confirmation, and runtime availability metadata only; it does not submit delegated work.",
880558
+ mutation: "Delegated work submission stays a visible confirmed workspace or slash-command flow and must preserve the full original user ask."
880559
+ },
880549
880560
  modelAccess: {
880550
880561
  inspectDelegation: 'agent_harness mode:"delegation_posture"',
880551
880562
  inspectRoute: 'agent_harness mode:"delegation_route"',
@@ -881310,13 +881321,13 @@ function describeProvider(provider5, runtimeStatus, options = {}) {
881310
881321
  inspectProvider: 'agent_harness mode:"media_provider"',
881311
881322
  generateMedia: "agent_media_generate with confirm:true and explicitUserRequest",
881312
881323
  ttsSettings: "agent_harness settings/get_setting/set_setting for tts.provider, tts.voice, tts.llmProvider, and tts.llmModel"
881324
+ },
881325
+ policy: {
881326
+ effect: "read-only",
881327
+ values: "Provider posture returns capability, setup, selected, health, and safe environment key names only; secret values and media payloads are never returned.",
881328
+ mutation: "Media generation, voice enable/disable, TTS setting changes, and bundle export stay explicit confirmation-gated tool, setting, workspace, or slash-command flows."
881313
881329
  }
881314
- } : {},
881315
- policy: {
881316
- effect: "read-only",
881317
- values: "Provider posture returns capability, setup, selected, health, and safe environment key names only; secret values and media payloads are never returned.",
881318
- mutation: "Media generation, voice enable/disable, TTS setting changes, and bundle export stay explicit confirmation-gated tool, setting, workspace, or slash-command flows."
881319
- }
881330
+ } : {}
881320
881331
  };
881321
881332
  }
881322
881333
  async function readRuntimeStatuses(context) {
@@ -881399,14 +881410,14 @@ async function mediaPostureSummary(context, args2) {
881399
881410
  returned: filtered.length,
881400
881411
  total: providers2.length,
881401
881412
  policy: "Read-only voice/media posture. Media generation, voice enable/disable, TTS setting changes, and bundle export stay confirmation-gated through first-class tools, settings modes, workspace actions, or slash-command mirrors.",
881402
- modelAccess: {
881413
+ ...args2.includeParameters === true ? { modelAccess: {
881403
881414
  mediaGenerateTool: "agent_media_generate",
881404
881415
  providerCatalogMode: "media_posture",
881405
881416
  singleProviderMode: "media_provider",
881406
- ttsProviderPicker: 'open_ui_surface surfaceId:"tts-provider-picker"',
881407
- ttsVoicePicker: 'open_ui_surface surfaceId:"tts-voice-picker"',
881417
+ ttsProviderPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-provider-picker" confirm:true explicitUserRequest:"..."',
881418
+ ttsVoicePicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-voice-picker" confirm:true explicitUserRequest:"..."',
881408
881419
  commands: ["/media providers", "/voice review", "/tts <prompt>", "/image <path>"]
881409
- }
881420
+ } } : {}
881410
881421
  };
881411
881422
  }
881412
881423
  async function describeHarnessMediaProvider(context, args2) {
@@ -881555,25 +881566,25 @@ function describeTarget(target, options = {}) {
881555
881566
  ...target.hasQuery !== undefined ? { hasQuery: target.hasQuery } : {},
881556
881567
  value: "<redacted>",
881557
881568
  ...options.lookup ? { lookup: options.lookup } : {},
881558
- policy: {
881559
- effect: "read-only",
881560
- values: "Full webhook URLs are not returned because they can contain bearer tokens or secret path/query values.",
881561
- delivery: "Use agent_notify only for one explicit, confirmed notification requested by the user.",
881562
- management: "Use confirmed /notify mirrors only when the user explicitly asks to add, remove, clear, test, or send notification targets."
881563
- },
881564
- modelAccess: {
881565
- sendTool: "agent_notify",
881566
- listCommand: "/notify list",
881567
- addCommand: "/notify add <url> --yes",
881568
- removeCommand: "/notify remove <url> --yes",
881569
- clearCommand: "/notify clear --yes",
881570
- testCommand: "/notify test --yes",
881571
- settingsCategory: "notifications.webhookUrls",
881572
- ...options.includeParameters ? {
881569
+ ...options.includeParameters ? {
881570
+ policy: {
881571
+ effect: "read-only",
881572
+ values: "Full webhook URLs are not returned because they can contain bearer tokens or secret path/query values.",
881573
+ delivery: "Use agent_notify only for one explicit, confirmed notification requested by the user.",
881574
+ management: "Use confirmed /notify mirrors only when the user explicitly asks to add, remove, clear, test, or send notification targets."
881575
+ },
881576
+ modelAccess: {
881577
+ sendTool: "agent_notify",
881578
+ listCommand: "/notify list",
881579
+ addCommand: "/notify add <url> --yes",
881580
+ removeCommand: "/notify remove <url> --yes",
881581
+ clearCommand: "/notify clear --yes",
881582
+ testCommand: "/notify test --yes",
881583
+ settingsCategory: "notifications.webhookUrls",
881573
881584
  targetValueRequiredForRemove: true,
881574
881585
  targetValuePolicy: "Ask the user for the exact webhook URL before removing one target; do not infer it from redacted metadata."
881575
- } : {}
881576
- }
881586
+ }
881587
+ } : {}
881577
881588
  };
881578
881589
  }
881579
881590
  function notificationTargetCatalogStatus(context) {
@@ -881642,6 +881653,10 @@ function readLimit12(value, fallback) {
881642
881653
  return fallback;
881643
881654
  return Math.max(1, Math.min(500, Math.trunc(parsed)));
881644
881655
  }
881656
+ function previewText4(value, maxLength = 120) {
881657
+ const normalized = value.replace(/\s+/g, " ").trim();
881658
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
881659
+ }
881645
881660
  function panelManager(context) {
881646
881661
  return context.workspace.panelManager ?? null;
881647
881662
  }
@@ -881653,6 +881668,7 @@ function panelMatches(panel, query2) {
881653
881668
  panel.name,
881654
881669
  panel.category,
881655
881670
  panel.description,
881671
+ panel.summary,
881656
881672
  panel.workspaceRoute
881657
881673
  ].map((value) => typeof value === "object" ? JSON.stringify(value) : String(value ?? "")).join(`
881658
881674
  `).toLowerCase().includes(query2.toLowerCase());
@@ -881674,7 +881690,7 @@ function panelCandidate(registration) {
881674
881690
  id: registration.id,
881675
881691
  name: registration.name,
881676
881692
  category: registration.category,
881677
- description: registration.description,
881693
+ summary: previewText4(registration.description),
881678
881694
  workspaceRoute: {
881679
881695
  categoryId: agentWorkspaceCategoryForPanel(registration.id),
881680
881696
  command: agentWorkspaceCommandForPanel(registration.id)
@@ -881716,7 +881732,7 @@ function resolveHarnessPanel(context, args2) {
881716
881732
  return { status: "ambiguous", input: lookup.input, candidates: search2.map(panelCandidate).slice(0, 8) };
881717
881733
  return null;
881718
881734
  }
881719
- function describePanelRegistration(context, registration, lookup) {
881735
+ function describePanelRegistration(context, registration, options = {}) {
881720
881736
  const manager5 = panelManager(context);
881721
881737
  const openPanel = manager5?.getPanel(registration.id) ?? null;
881722
881738
  const pane = manager5?.getPaneOf(registration.id) ?? null;
@@ -881726,8 +881742,8 @@ function describePanelRegistration(context, registration, lookup) {
881726
881742
  name: registration.name,
881727
881743
  icon: registration.icon,
881728
881744
  category: registration.category,
881729
- description: registration.description,
881730
- ...lookup ? { lookup } : {},
881745
+ ...options.includeParameters ? { description: registration.description } : { summary: previewText4(registration.description) },
881746
+ ...options.lookup ? { lookup: options.lookup } : {},
881731
881747
  preload: registration.preload === true,
881732
881748
  open: openPanel !== null,
881733
881749
  pane,
@@ -881737,11 +881753,13 @@ function describePanelRegistration(context, registration, lookup) {
881737
881753
  categoryId: agentWorkspaceCategoryForPanel(registration.id),
881738
881754
  command: agentWorkspaceCommandForPanel(registration.id)
881739
881755
  },
881740
- policy: {
881741
- effect: "ui-navigation",
881742
- confirmation: 'agent_harness mode:"open_panel" requires confirm:true and explicitUserRequest.',
881743
- 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."
881744
- }
881756
+ ...options.includeParameters ? {
881757
+ policy: {
881758
+ effect: "ui-navigation",
881759
+ confirmation: 'agent_harness mode:"open_panel" requires confirm:true and explicitUserRequest.',
881760
+ 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."
881761
+ }
881762
+ } : {}
881745
881763
  };
881746
881764
  }
881747
881765
  function totalHarnessPanels(context) {
@@ -881754,12 +881772,13 @@ function listHarnessPanels(context, args2) {
881754
881772
  const query2 = readString58(args2.query);
881755
881773
  const category = readString58(args2.category);
881756
881774
  const limit3 = readLimit12(args2.limit, 200);
881757
- 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);
881775
+ const includeParameters = args2.includeParameters === true;
881776
+ return manager5.getRegisteredTypes().map((registration) => describePanelRegistration(context, registration, { includeParameters })).filter((panel) => !category || panel.category === category).filter((panel) => panelMatches(panel, query2)).sort((a4, b3) => String(a4.id).localeCompare(String(b3.id))).slice(0, limit3);
881758
881777
  }
881759
881778
  function describeHarnessPanel(context, args2) {
881760
881779
  const resolved = resolveHarnessPanel(context, args2);
881761
881780
  if (resolved?.status === "found")
881762
- return describePanelRegistration(context, resolved.registration, resolved.lookup);
881781
+ return describePanelRegistration(context, resolved.registration, { includeParameters: true, lookup: resolved.lookup });
881763
881782
  if (resolved?.status === "ambiguous") {
881764
881783
  return { status: "ambiguous", input: resolved.input, candidates: resolved.candidates };
881765
881784
  }
@@ -881777,7 +881796,7 @@ function openHarnessPanel(context, args2) {
881777
881796
  availablePanels: listHarnessPanels(context, { limit: 50 }).map((entry) => entry.id)
881778
881797
  };
881779
881798
  }
881780
- const panel = describePanelRegistration(context, resolved.registration, resolved.lookup);
881799
+ const panel = describePanelRegistration(context, resolved.registration, { includeParameters: true, lookup: resolved.lookup });
881781
881800
  const requestedPane = readString58(args2.pane);
881782
881801
  const pane = requestedPane === "bottom" || requestedPane === "top" ? requestedPane : undefined;
881783
881802
  if (!context.showPanel) {
@@ -881979,7 +881998,7 @@ function connectedHostFindings(runtime3, tokenUsable) {
881979
881998
  }
881980
881999
  return findings;
881981
882000
  }
881982
- async function connectedHostStatusSummary(context, toolRegistry) {
882001
+ async function connectedHostStatusSummary(context, toolRegistry, options = {}) {
881983
882002
  const homeDirectory = resolveHomeDirectory(context);
881984
882003
  const workingDirectory = resolveWorkingDirectory(context);
881985
882004
  const token = readConnectedHostOperatorToken(homeDirectory);
@@ -882039,14 +882058,21 @@ async function connectedHostStatusSummary(context, toolRegistry) {
882039
882058
  }
882040
882059
  ],
882041
882060
  findings: connectedHostFindings(runtime3, tokenUsable),
882042
- modelAccess: {
882043
- diagnostics: 'Use mode:"connected_host_status" for live read-only host readiness, mode:"service_posture" for endpoint posture, mode:"service_endpoint" for one endpoint, and mode:"connected_host" for capability and boundary inventory.',
882044
- cliMirrors: ["goodvibes-agent status --json", "goodvibes-agent doctor", "goodvibes-agent compat"],
882045
- tuiMirrors: ["Agent Workspace -> Home -> Host compatibility", "Agent Workspace -> Home -> Doctor diagnostics", "Agent Workspace -> Home -> Review health"]
882061
+ capabilitySummary: {
882062
+ routeFamilies: connectedHostRouteFamilies().length,
882063
+ availableCapabilities: connectedHostCapabilityMap(toolRegistry).filter((capability) => capability.available === true).length,
882064
+ blockedCapabilities: blockedConnectedHostCapabilities().length
882046
882065
  },
882047
- routeFamilies: connectedHostRouteFamilies(),
882048
- capabilities: connectedHostCapabilityMap(toolRegistry),
882049
- blockedCapabilities: blockedConnectedHostCapabilities()
882066
+ ...options.includeParameters ? {
882067
+ modelAccess: {
882068
+ diagnostics: 'Use mode:"connected_host_status" for live read-only host readiness, mode:"service_posture" for endpoint posture, mode:"service_endpoint" for one endpoint, and mode:"connected_host" for capability and boundary inventory.',
882069
+ cliMirrors: ["goodvibes-agent status --json", "goodvibes-agent doctor", "goodvibes-agent compat"],
882070
+ tuiMirrors: ["Agent Workspace -> Home -> Host compatibility", "Agent Workspace -> Home -> Doctor diagnostics", "Agent Workspace -> Home -> Review health"]
882071
+ },
882072
+ routeFamilies: connectedHostRouteFamilies(),
882073
+ capabilities: connectedHostCapabilityMap(toolRegistry),
882074
+ blockedCapabilities: blockedConnectedHostCapabilities()
882075
+ } : {}
882050
882076
  };
882051
882077
  }
882052
882078
 
@@ -882369,34 +882395,36 @@ function describeServer(server2, options = {}) {
882369
882395
  })),
882370
882396
  toolCount: tools3.length
882371
882397
  } : { toolCount: tools3.length },
882372
- policy: {
882373
- effect: "read-only",
882374
- values: "Server posture returns trust, role, connection, quarantine, and tool metadata; env values and secret config values are never returned.",
882375
- mutation: "MCP add/remove/reload/trust/role/quarantine operations stay explicit confirmation-gated workspace or slash-command flows.",
882376
- allowAll: "allow-all trust decisions remain routed through Settings -> MCP, not direct command escalation."
882377
- },
882378
- modelAccess: {
882379
- reviewCommand: "/mcp review",
882380
- serversCommand: "/mcp servers",
882381
- toolsCommand: `/mcp tools ${server2.name}`,
882382
- repairCommand: `/mcp repair ${server2.name}`,
882383
- authReviewCommand: "/mcp auth-review",
882384
- configCommand: "/mcp config",
882385
- workspaceActionIds: [
882386
- "mcp-review",
882387
- "mcp-tools-server",
882388
- "mcp-repair",
882389
- "mcp-config",
882390
- "mcp-add-server",
882391
- "mcp-settings"
882392
- ],
882393
- confirmationGatedCommands: [
882394
- `/mcp trust ${server2.name} <constrained|ask-on-risk|blocked> --yes`,
882395
- `/mcp role ${server2.name} <role> --yes`,
882396
- `/mcp quarantine ${server2.name} approve <operatorId> --yes`,
882397
- `/mcp remove ${server2.name} --yes`
882398
- ]
882399
- }
882398
+ ...options.includeParameters ? {
882399
+ policy: {
882400
+ effect: "read-only",
882401
+ values: "Server posture returns trust, role, connection, quarantine, and tool metadata; env values and secret config values are never returned.",
882402
+ mutation: "MCP add/remove/reload/trust/role/quarantine operations stay explicit confirmation-gated workspace or slash-command flows.",
882403
+ allowAll: "allow-all trust decisions remain routed through Settings -> MCP, not direct command escalation."
882404
+ },
882405
+ modelAccess: {
882406
+ reviewCommand: "/mcp review",
882407
+ serversCommand: "/mcp servers",
882408
+ toolsCommand: `/mcp tools ${server2.name}`,
882409
+ repairCommand: `/mcp repair ${server2.name}`,
882410
+ authReviewCommand: "/mcp auth-review",
882411
+ configCommand: "/mcp config",
882412
+ workspaceActionIds: [
882413
+ "mcp-review",
882414
+ "mcp-tools-server",
882415
+ "mcp-repair",
882416
+ "mcp-config",
882417
+ "mcp-add-server",
882418
+ "mcp-settings"
882419
+ ],
882420
+ confirmationGatedCommands: [
882421
+ `/mcp trust ${server2.name} <constrained|ask-on-risk|blocked> --yes`,
882422
+ `/mcp role ${server2.name} <role> --yes`,
882423
+ `/mcp quarantine ${server2.name} approve <operatorId> --yes`,
882424
+ `/mcp remove ${server2.name} --yes`
882425
+ ]
882426
+ }
882427
+ } : {}
882400
882428
  };
882401
882429
  }
882402
882430
  async function readMcpTools(api2, includeParameters) {
@@ -882754,19 +882782,19 @@ function describeRoute2(route, options = {}) {
882754
882782
  commands: route.commands,
882755
882783
  uiSurfaces: route.uiSurfaces,
882756
882784
  ...options.lookup ? { lookup: options.lookup } : {},
882757
- policy: {
882758
- effect: "read-only",
882759
- values: "Model routing posture returns model ids, provider ids, route state, capabilities, and safe setting keys only; provider credentials are never returned.",
882760
- mutation: "Model/provider selection, catalog refresh, favorites, custom provider edits, and route setting changes stay explicit user-facing picker, settings, workspace, or slash-command flows."
882761
- },
882762
882785
  ...options.includeParameters ? {
882786
+ policy: {
882787
+ effect: "read-only",
882788
+ values: "Model routing posture returns model ids, provider ids, route state, capabilities, and safe setting keys only; provider credentials are never returned.",
882789
+ mutation: "Model/provider selection, catalog refresh, favorites, custom provider edits, and route setting changes stay explicit user-facing picker, settings, workspace, or slash-command flows."
882790
+ },
882763
882791
  modelAccess: {
882764
882792
  inspectRouting: 'agent_harness mode:"model_routing"',
882765
882793
  inspectRoute: 'agent_harness mode:"model_route"',
882766
882794
  settingRead: 'agent_harness mode:"get_setting"',
882767
882795
  settingMutation: 'agent_harness mode:"set_setting" confirm:true explicitUserRequest:"..."',
882768
- openModelPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"model-picker" confirm:true',
882769
- openProviderPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"provider-picker" confirm:true'
882796
+ openModelPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"model-picker" confirm:true explicitUserRequest:"..."',
882797
+ openProviderPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"provider-picker" confirm:true explicitUserRequest:"..."'
882770
882798
  }
882771
882799
  } : {}
882772
882800
  };
@@ -882783,19 +882811,19 @@ function describeModel(model, options = {}) {
882783
882811
  pinned: model.pinned,
882784
882812
  contextWindow: model.contextWindow,
882785
882813
  reasoningEffort: model.reasoningEffort,
882786
- capabilities: model.capabilities,
882787
882814
  ...options.lookup ? { lookup: options.lookup } : {},
882788
- policy: {
882789
- effect: "read-only",
882790
- mutation: "Selecting this model stays a visible picker, settings, workspace, or slash-command flow with explicit user request."
882791
- },
882792
882815
  ...options.includeParameters ? {
882816
+ capabilities: model.capabilities,
882817
+ policy: {
882818
+ effect: "read-only",
882819
+ mutation: "Selecting this model stays a visible picker, settings, workspace, or slash-command flow with explicit user request."
882820
+ },
882793
882821
  modelAccess: {
882794
882822
  selectModelCommand: `/model ${model.registryKey}`,
882795
882823
  selectProviderCommand: `/provider ${model.providerId}`,
882796
882824
  pinCommand: `/pin ${model.registryKey}`,
882797
882825
  unpinCommand: `/unpin ${model.registryKey}`,
882798
- setMainModel: `agent_harness mode:"set_setting" key:"provider.model" value:"${model.registryKey}" confirm:true`
882826
+ setMainModel: `agent_harness mode:"set_setting" key:"provider.model" value:"${model.registryKey}" confirm:true explicitUserRequest:"..."`
882799
882827
  }
882800
882828
  } : {}
882801
882829
  };
@@ -882863,7 +882891,7 @@ async function modelRoutingSummary(context, args2) {
882863
882891
  reasoningEffort: modelReasoning(currentModel),
882864
882892
  capabilities: modelCapabilities(currentModel),
882865
882893
  pinned: false
882866
- }) : null
882894
+ }, { includeParameters }) : null
882867
882895
  },
882868
882896
  providers: providerIds,
882869
882897
  routes: filteredRoutes.slice(0, limit3).map((route) => describeRoute2(route, { includeParameters })),
@@ -882941,6 +882969,10 @@ function readLimit15(value, fallback) {
882941
882969
  return fallback;
882942
882970
  return Math.max(1, Math.min(500, Math.trunc(parsed)));
882943
882971
  }
882972
+ function previewText5(value, maxLength = 120) {
882973
+ const normalized = value.replace(/\s+/g, " ").trim();
882974
+ return normalized.length <= maxLength ? normalized : `${normalized.slice(0, maxLength - 1).trimEnd()}...`;
882975
+ }
882944
882976
  function modelToolSearchText(tool2) {
882945
882977
  return [
882946
882978
  tool2.name,
@@ -882962,7 +882994,7 @@ function modelToolLookupFromArgs(args2) {
882962
882994
  function describeModelTool(tool2, options = {}) {
882963
882995
  return {
882964
882996
  name: tool2.name,
882965
- description: tool2.description,
882997
+ ...options.includeParameters ? { description: tool2.description } : { summary: previewText5(tool2.description) },
882966
882998
  sideEffects: tool2.sideEffects ?? [],
882967
882999
  concurrency: tool2.concurrency ?? "parallel",
882968
883000
  supportsProgress: tool2.supportsProgress ?? false,
@@ -882974,7 +883006,7 @@ function describeModelTool(tool2, options = {}) {
882974
883006
  function describeModelToolCandidates(tools3) {
882975
883007
  return tools3.slice(0, 8).map((tool2) => ({
882976
883008
  toolName: tool2.name,
882977
- description: tool2.description,
883009
+ summary: previewText5(tool2.description),
882978
883010
  sideEffects: tool2.sideEffects ?? []
882979
883011
  }));
882980
883012
  }
@@ -883300,7 +883332,7 @@ function pairingRoutes() {
883300
883332
  detail: "Visible companion pairing route that prints QR setup details in the Agent TUI without printing the raw token.",
883301
883333
  effect: "external-network",
883302
883334
  command: "/pair",
883303
- harnessRoute: 'agent_harness mode:"run_command" command:"/pair" confirm:true',
883335
+ harnessRoute: 'agent_harness mode:"run_command" command:"/pair" confirm:true explicitUserRequest:"..."',
883304
883336
  requiresConfirmation: true
883305
883337
  },
883306
883338
  {
@@ -883309,7 +883341,7 @@ function pairingRoutes() {
883309
883341
  detail: "Explicitly confirmed fallback route that prints the raw companion token only when the user asks for manual setup.",
883310
883342
  effect: "confirmation-gated-secret-display",
883311
883343
  command: "/pair --show-token --yes",
883312
- harnessRoute: 'agent_harness mode:"run_command" command:"/pair --show-token --yes" confirm:true',
883344
+ harnessRoute: 'agent_harness mode:"run_command" command:"/pair --show-token --yes" confirm:true explicitUserRequest:"..."',
883313
883345
  requiresConfirmation: true
883314
883346
  },
883315
883347
  {
@@ -883387,12 +883419,12 @@ function describeRoute3(route, options = {}) {
883387
883419
  ...route.capabilityIds ? { capabilityIds: route.capabilityIds } : {},
883388
883420
  requiresConfirmation: route.requiresConfirmation === true,
883389
883421
  ...options.lookup ? { lookup: options.lookup } : {},
883390
- policy: {
883391
- effect: route.effect,
883392
- values: "Pairing posture returns endpoint binding and token fingerprint only; raw companion tokens and QR payloads are never returned by this read-only mode.",
883393
- mutation: "Pairing display, manual token display, companion connection, channel sends, provider/model changes, approval actions, and attachment flows stay explicit visible user flows."
883394
- },
883395
883422
  ...options.includeParameters ? {
883423
+ policy: {
883424
+ effect: route.effect,
883425
+ values: "Pairing posture returns endpoint binding and token fingerprint only; raw companion tokens and QR payloads are never returned by this read-only mode.",
883426
+ mutation: "Pairing display, manual token display, companion connection, channel sends, provider/model changes, approval actions, and attachment flows stay explicit visible user flows."
883427
+ },
883396
883428
  modelAccess: {
883397
883429
  inspectPairing: 'agent_harness mode:"pairing_posture"',
883398
883430
  inspectRoute: 'agent_harness mode:"pairing_route"',
@@ -883557,42 +883589,44 @@ function describeAccount(account, options = {}) {
883557
883589
  ...account.fallbackRisk ? { fallbackRisk: account.fallbackRisk } : {},
883558
883590
  ...account.expiresAt ? { expiresAt: new Date(account.expiresAt).toISOString() } : {},
883559
883591
  ...account.tokenType ? { tokenType: account.tokenType } : {},
883560
- routeRecords: account.routeRecords.map((route) => ({
883561
- route: route.route,
883562
- usable: route.usable,
883563
- freshness: route.freshness,
883564
- detail: route.detail,
883565
- issues: route.issues
883566
- })),
883567
- usageWindows: account.usageWindows,
883568
- issues: account.issues,
883569
- notes: account.notes,
883570
- recommendedActions: account.recommendedActions,
883592
+ issueCount: account.issues.length,
883593
+ recommendedActionCount: account.recommendedActions.length,
883571
883594
  ...options.lookup ? { lookup: options.lookup } : {},
883572
- policy: {
883573
- effect: "read-only",
883574
- values: "Provider account posture reports route and freshness metadata only; raw tokens, authorization codes, and secret values are never returned.",
883575
- mutation: "Provider login, logout, subscription bundle export, and account repair actions stay explicit confirmation-gated workspace or slash-command flows."
883576
- },
883577
- modelAccess: {
883578
- reviewCommand: "/accounts review",
883579
- showCommand: `/accounts show ${account.providerId}`,
883580
- routesCommand: `/accounts routes ${account.providerId}`,
883581
- repairCommand: `/accounts repair ${account.providerId}`,
883582
- subscriptionInspectCommand: `/subscription inspect ${account.providerId}`,
883583
- workspaceActions: [
883584
- "provider-accounts",
883585
- "provider-account-repair",
883586
- "subscription-review",
883587
- "subscription-inspect"
883588
- ],
883589
- ...options.includeParameters ? {
883595
+ ...options.includeParameters ? {
883596
+ routeRecords: account.routeRecords.map((route) => ({
883597
+ route: route.route,
883598
+ usable: route.usable,
883599
+ freshness: route.freshness,
883600
+ detail: route.detail,
883601
+ issues: route.issues
883602
+ })),
883603
+ usageWindows: account.usageWindows,
883604
+ issues: account.issues,
883605
+ notes: account.notes,
883606
+ recommendedActions: account.recommendedActions,
883607
+ policy: {
883608
+ effect: "read-only",
883609
+ values: "Provider account posture reports route and freshness metadata only; raw tokens, authorization codes, and secret values are never returned.",
883610
+ mutation: "Provider login, logout, subscription bundle export, and account repair actions stay explicit confirmation-gated workspace or slash-command flows."
883611
+ },
883612
+ modelAccess: {
883613
+ reviewCommand: "/accounts review",
883614
+ showCommand: `/accounts show ${account.providerId}`,
883615
+ routesCommand: `/accounts routes ${account.providerId}`,
883616
+ repairCommand: `/accounts repair ${account.providerId}`,
883617
+ subscriptionInspectCommand: `/subscription inspect ${account.providerId}`,
883618
+ workspaceActions: [
883619
+ "provider-accounts",
883620
+ "provider-account-repair",
883621
+ "subscription-review",
883622
+ "subscription-inspect"
883623
+ ],
883590
883624
  loginStartCommand: `/subscription login ${account.providerId} start --yes`,
883591
883625
  loginFinishCommand: `/subscription login ${account.providerId} finish <code-or-url> --yes`,
883592
883626
  logoutCommand: `/subscription logout ${account.providerId} --yes`,
883593
883627
  confirmationRequired: true
883594
- } : {}
883595
- }
883628
+ }
883629
+ } : {}
883596
883630
  };
883597
883631
  }
883598
883632
  async function providerAccountCatalogStatus(context) {
@@ -884297,11 +884331,13 @@ function describeFinding(finding, includeParameters, lookup) {
884297
884331
  route: finding.route,
884298
884332
  ...lookup ? { lookup } : {},
884299
884333
  ...includeParameters && finding.detail ? { detail: finding.detail } : {},
884300
- policy: {
884301
- effect: "read-only",
884302
- values: "Security posture returns counts, labels, policy ids, route names, and redacted bundle summaries only; token values, secret values, and raw config values are never returned.",
884303
- mutation: "Token rotation, policy changes, MCP trust changes, bundle export/import, auth repair, and voice enable/disable stay explicit confirmation-gated workspace or slash-command flows."
884304
- }
884334
+ ...includeParameters ? {
884335
+ policy: {
884336
+ effect: "read-only",
884337
+ values: "Security posture returns counts, labels, policy ids, route names, and redacted bundle summaries only; token values, secret values, and raw config values are never returned.",
884338
+ mutation: "Token rotation, policy changes, MCP trust changes, bundle export/import, auth repair, and voice enable/disable stay explicit confirmation-gated workspace or slash-command flows."
884339
+ }
884340
+ } : {}
884305
884341
  };
884306
884342
  }
884307
884343
  function buildTokenFindings(securitySnapshot) {
@@ -884579,7 +884615,7 @@ async function securityPostureSummary(context, args2) {
884579
884615
  returned: filtered.length,
884580
884616
  total: findings.length,
884581
884617
  policy: "Read-only security posture. Token rotation, policy changes, MCP trust changes, bundle export/import, auth repair, and voice enable/disable remain confirmation-gated workspace or slash-command flows.",
884582
- modelAccess: {
884618
+ ...args2.includeParameters === true ? { modelAccess: {
884583
884619
  reviewCommand: "/security review",
884584
884620
  tokensCommand: "/security tokens",
884585
884621
  attackPathsCommand: "/security attack-paths",
@@ -884587,7 +884623,7 @@ async function securityPostureSummary(context, args2) {
884587
884623
  authReviewCommand: "/auth review",
884588
884624
  bundleCatalogMode: "support_bundles",
884589
884625
  singleFindingMode: "security_finding"
884590
- }
884626
+ } } : {}
884591
884627
  };
884592
884628
  }
884593
884629
  function describeHarnessSecurityFinding(context, args2) {
@@ -884842,11 +884878,13 @@ function describeSession(session2, options) {
884842
884878
  }
884843
884879
  } : {},
884844
884880
  ...options.lookup ? { lookup: options.lookup } : {},
884845
- policy: {
884846
- effect: "read-only",
884847
- values: "Session posture returns saved-session metadata, search counts, optional snippets, return-context counts, bookmark counts, and saved bookmark file counts.",
884848
- mutation: "Session save, rename, fork, resume, export, delete, bookmark toggles, and bookmark file writes remain visible workspace or slash-command flows with confirmation where mutating."
884849
- }
884881
+ ...options.includeParameters ? {
884882
+ policy: {
884883
+ effect: "read-only",
884884
+ values: "Session posture returns saved-session metadata, search counts, optional snippets, return-context counts, bookmark counts, and saved bookmark file counts.",
884885
+ mutation: "Session save, rename, fork, resume, export, delete, bookmark toggles, and bookmark file writes remain visible workspace or slash-command flows with confirmation where mutating."
884886
+ }
884887
+ } : {}
884850
884888
  };
884851
884889
  }
884852
884890
  function currentSession(context) {
@@ -884887,9 +884925,9 @@ function bookmarkSummary(context) {
884887
884925
  bookmarks: manager5.list().length,
884888
884926
  savedFiles: manager5.listSavedFiles().length,
884889
884927
  modelRoutes: {
884890
- visibleBookmarkPicker: 'agent_harness open_ui_surface surfaceId:"bookmarks"',
884928
+ visibleBookmarkPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"bookmarks" confirm:true explicitUserRequest:"..."',
884891
884929
  command: "/bookmarks",
884892
- importIntoKnowledge: 'agent_knowledge_ingest sourceKind:"bookmarks_file" with confirm:true'
884930
+ importIntoKnowledge: 'agent_knowledge_ingest sourceKind:"bookmarks_file" confirm:true explicitUserRequest:"..."'
884893
884931
  }
884894
884932
  };
884895
884933
  }
@@ -885026,7 +885064,7 @@ function summarizeLog(posture, includeTail) {
885026
885064
  ...includeTail && posture.log.tail !== undefined ? { tail: posture.log.tail } : {}
885027
885065
  };
885028
885066
  }
885029
- function describeEndpoint(endpoint5, lookup) {
885067
+ function describeEndpoint(endpoint5, options = {}) {
885030
885068
  return {
885031
885069
  id: endpoint5.id,
885032
885070
  label: endpoint5.label,
@@ -885035,13 +885073,15 @@ function describeEndpoint(endpoint5, lookup) {
885035
885073
  bindPosture: endpoint5.bindPosture,
885036
885074
  networkFacing: endpoint5.networkFacing,
885037
885075
  ...endpoint5.reachable !== undefined ? { reachable: endpoint5.reachable } : {},
885038
- ...lookup ? { lookup } : {},
885039
- policy: {
885040
- effect: "read-only",
885041
- modelOperation: "Inspect endpoint binding, network-facing posture, and optional reachability only.",
885042
- lifecycle: "GoodVibes Agent does not start, stop, restart, install, expose, or mutate connected-host listeners.",
885043
- settings: "Use agent_harness settings/get_setting for read-only inspection of endpoint settings; connected-host lifecycle/listener settings stay locked in Agent."
885044
- }
885076
+ ...options.lookup ? { lookup: options.lookup } : {},
885077
+ ...options.includeParameters ? {
885078
+ policy: {
885079
+ effect: "read-only",
885080
+ modelOperation: "Inspect endpoint binding, network-facing posture, and optional reachability only.",
885081
+ lifecycle: "GoodVibes Agent does not start, stop, restart, install, expose, or mutate connected-host listeners.",
885082
+ settings: "Use agent_harness settings/get_setting for read-only inspection of endpoint settings; connected-host lifecycle/listener settings stay locked in Agent."
885083
+ }
885084
+ } : {}
885045
885085
  };
885046
885086
  }
885047
885087
  function describeEndpointCandidate(endpoint5) {
@@ -885075,7 +885115,7 @@ function endpointSearchText(endpoint5) {
885075
885115
  ].join(`
885076
885116
  `).toLowerCase();
885077
885117
  }
885078
- function resolveEndpoint2(posture, args2) {
885118
+ function resolveEndpoint2(posture, args2, options = {}) {
885079
885119
  const lookup = endpointLookupFromArgs(args2);
885080
885120
  if (!lookup) {
885081
885121
  return {
@@ -885087,19 +885127,19 @@ function resolveEndpoint2(posture, args2) {
885087
885127
  const normalized3 = lookup.input.toLowerCase();
885088
885128
  const exact = endpoints5.find((endpoint5) => endpoint5.id === lookup.input);
885089
885129
  if (exact) {
885090
- return { status: "found", endpoint: describeEndpoint(exact, { ...lookup, resolvedBy: "id" }) };
885130
+ return { status: "found", endpoint: describeEndpoint(exact, { includeParameters: options.includeParameters, lookup: { ...lookup, resolvedBy: "id" } }) };
885091
885131
  }
885092
885132
  const insensitive = endpoints5.find((endpoint5) => endpoint5.id.toLowerCase() === normalized3);
885093
885133
  if (insensitive) {
885094
- return { status: "found", endpoint: describeEndpoint(insensitive, { ...lookup, resolvedBy: "case-insensitive-id" }) };
885134
+ return { status: "found", endpoint: describeEndpoint(insensitive, { includeParameters: options.includeParameters, lookup: { ...lookup, resolvedBy: "case-insensitive-id" } }) };
885095
885135
  }
885096
885136
  const label = endpoints5.find((endpoint5) => endpoint5.label.toLowerCase() === normalized3);
885097
885137
  if (label) {
885098
- return { status: "found", endpoint: describeEndpoint(label, { ...lookup, resolvedBy: "label" }) };
885138
+ return { status: "found", endpoint: describeEndpoint(label, { includeParameters: options.includeParameters, lookup: { ...lookup, resolvedBy: "label" } }) };
885099
885139
  }
885100
885140
  const searched = endpoints5.filter((endpoint5) => endpointSearchText(endpoint5).includes(normalized3));
885101
885141
  if (searched.length === 1) {
885102
- return { status: "found", endpoint: describeEndpoint(searched[0], { ...lookup, resolvedBy: "search" }) };
885142
+ return { status: "found", endpoint: describeEndpoint(searched[0], { includeParameters: options.includeParameters, lookup: { ...lookup, resolvedBy: "search" } }) };
885103
885143
  }
885104
885144
  if (searched.length > 1) {
885105
885145
  return {
@@ -885130,14 +885170,14 @@ async function servicePostureSummary(context, args2) {
885130
885170
  lifecycle: "GoodVibes Agent reports connected-host/service posture but does not start, stop, restart, install, expose, or mutate host listeners.",
885131
885171
  config: posture.config,
885132
885172
  managed: posture.managed,
885133
- endpoints: posture.endpoints.map((endpoint5) => describeEndpoint(endpoint5)),
885173
+ endpoints: posture.endpoints.map((endpoint5) => describeEndpoint(endpoint5, { includeParameters: includeDetails })),
885134
885174
  log: summarizeLog(posture, includeDetails),
885135
885175
  issues: posture.issues,
885136
- modelAccess: {
885176
+ ...includeDetails ? { modelAccess: {
885137
885177
  endpointLookup: 'Use mode:"service_endpoint" with endpointId, target, or query to inspect one endpoint.',
885138
885178
  settings: 'Use mode:"settings" with includeHidden:true for endpoint setting descriptors. Host-owned listener settings remain read-only.',
885139
885179
  liveHostStatus: 'Use mode:"connected_host_status" for SDK compatibility, token posture, and Agent Knowledge route readiness.'
885140
- }
885180
+ } } : {}
885141
885181
  };
885142
885182
  }
885143
885183
  async function describeHarnessServiceEndpoint(context, args2) {
@@ -885145,7 +885185,7 @@ async function describeHarnessServiceEndpoint(context, args2) {
885145
885185
  ...servicePostureOptions(args2),
885146
885186
  probe: true
885147
885187
  });
885148
- return resolveEndpoint2(posture, args2);
885188
+ return resolveEndpoint2(posture, args2, { includeParameters: true });
885149
885189
  }
885150
885190
 
885151
885191
  // src/tools/agent-harness-setup-posture.ts
@@ -885290,16 +885330,16 @@ function describeItem(item, snapshot, options = {}) {
885290
885330
  detail: item.detail,
885291
885331
  signals: signalsForItem(item, snapshot),
885292
885332
  ...options.lookup ? { lookup: options.lookup } : {},
885293
- policy: {
885294
- effect: "read-only",
885295
- values: "Setup posture returns onboarding readiness, counts, safe setting keys, and route metadata only; secret values and raw provider tokens are never returned.",
885296
- mutation: "Setup apply, provider auth, local behavior import/create, channel delivery, and starter profile changes stay visible workspace, settings, slash-command, or first-class tool flows."
885297
- },
885298
885333
  ...options.includeParameters ? {
885334
+ policy: {
885335
+ effect: "read-only",
885336
+ values: "Setup posture returns onboarding readiness, counts, safe setting keys, and route metadata only; secret values and raw provider tokens are never returned.",
885337
+ mutation: "Setup apply, provider auth, local behavior import/create, channel delivery, and starter profile changes stay visible workspace, settings, slash-command, or first-class tool flows."
885338
+ },
885299
885339
  modelAccess: {
885300
885340
  inspectSetup: 'agent_harness mode:"setup_posture"',
885301
885341
  inspectSetupItem: 'agent_harness mode:"setup_item"',
885302
- openOnboarding: 'agent_harness mode:"open_ui_surface" surfaceId:"onboarding" confirm:true',
885342
+ openOnboarding: 'agent_harness mode:"open_ui_surface" surfaceId:"onboarding" confirm:true explicitUserRequest:"..."',
885303
885343
  setupWorkspace: 'agent_harness mode:"workspace_action" target:"setup"',
885304
885344
  settings: "agent_harness modes settings/get_setting/set_setting/reset_setting",
885305
885345
  providerRouting: 'agent_harness mode:"model_routing"',
@@ -885468,7 +885508,9 @@ var AGENT_HARNESS_MODES = [
885468
885508
  "service_endpoint",
885469
885509
  "connected_host",
885470
885510
  "connected_host_status",
885471
- "connected_host_capability"
885511
+ "connected_host_capability",
885512
+ "daemon",
885513
+ "daemon_status"
885472
885514
  ];
885473
885515
  var KEY_COMBO_PARAMETER_SCHEMA = {
885474
885516
  type: "object",
@@ -886415,22 +886457,24 @@ function resolveHarnessUiSurface(args2) {
886415
886457
  return { status: "ambiguous", input: lookup.input, candidates: search2.map(surfaceCandidate).slice(0, 8) };
886416
886458
  return null;
886417
886459
  }
886418
- function describeSurface(context, surface, lookup) {
886460
+ function describeSurface(context, surface, options = {}) {
886419
886461
  return {
886420
886462
  id: surface.id,
886421
886463
  label: surface.label,
886422
886464
  kind: surface.kind,
886423
886465
  summary: surface.summary,
886424
886466
  command: surface.command,
886425
- ...lookup ? { lookup } : {},
886467
+ ...options.lookup ? { lookup: options.lookup } : {},
886426
886468
  preferredModelRoute: surface.preferredModelRoute,
886427
- parameters: surface.parameters ?? [],
886428
886469
  available: surface.available(context),
886429
- policy: {
886430
- effect: "visible-ui-navigation",
886431
- confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
886432
- boundary: "UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations."
886433
- }
886470
+ ...options.includeParameters ? {
886471
+ parameters: surface.parameters ?? [],
886472
+ policy: {
886473
+ effect: "visible-ui-navigation",
886474
+ confirmation: 'agent_harness mode:"open_ui_surface" requires confirm:true and explicitUserRequest.',
886475
+ boundary: "UI surface routing opens the same visible Agent shell surface the user can open. Use first-class model tools, settings modes, workspace actions, or confirmed slash-command mirrors for actual operations."
886476
+ }
886477
+ } : {}
886434
886478
  };
886435
886479
  }
886436
886480
  function totalHarnessUiSurfaces() {
@@ -886439,12 +886483,13 @@ function totalHarnessUiSurfaces() {
886439
886483
  function listHarnessUiSurfaces(context, args2) {
886440
886484
  const query2 = readString73(args2.query);
886441
886485
  const limit3 = readLimit24(args2.limit, 200);
886442
- return UI_SURFACES.map((surface) => describeSurface(context, surface)).filter((surface) => surfaceMatches(surface, query2)).slice(0, limit3);
886486
+ const includeParameters = args2.includeParameters === true;
886487
+ return UI_SURFACES.map((surface) => describeSurface(context, surface, { includeParameters })).filter((surface) => surfaceMatches(surface, query2)).slice(0, limit3);
886443
886488
  }
886444
886489
  function describeHarnessUiSurface(context, args2) {
886445
886490
  const resolved = resolveHarnessUiSurface(args2);
886446
886491
  if (resolved?.status === "found")
886447
- return describeSurface(context, resolved.surface, resolved.lookup);
886492
+ return describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup });
886448
886493
  if (resolved?.status === "ambiguous") {
886449
886494
  return { status: "ambiguous", input: resolved.input, candidates: resolved.candidates };
886450
886495
  }
@@ -886465,7 +886510,7 @@ async function openHarnessUiSurface(context, args2) {
886465
886510
  const routed = await resolved.surface.open(context, args2);
886466
886511
  return {
886467
886512
  ...routed,
886468
- descriptor: describeSurface(context, resolved.surface, resolved.lookup)
886513
+ descriptor: describeSurface(context, resolved.surface, { includeParameters: true, lookup: resolved.lookup })
886469
886514
  };
886470
886515
  }
886471
886516
 
@@ -887491,6 +887536,10 @@ function describeWorkspaceEditor(editor) {
887491
887536
  }))
887492
887537
  };
887493
887538
  }
887539
+ function previewText6(value, maxLength = 120) {
887540
+ const normalized3 = value.replace(/\s+/g, " ").trim();
887541
+ return normalized3.length <= maxLength ? normalized3 : `${normalized3.slice(0, maxLength - 1).trimEnd()}...`;
887542
+ }
887494
887543
  function selectedRoutineFromArgs(snapshot, args2) {
887495
887544
  const fields = readFieldMap3(args2.fields);
887496
887545
  const routineId = readString74(args2.recordId) || readString74(fields.routineId) || readString74(fields.id);
@@ -887544,6 +887593,23 @@ function describeWorkspaceAction(category, action2, options = {}) {
887544
887593
  } : {}
887545
887594
  };
887546
887595
  }
887596
+ function describeWorkspaceActionSummary(category, action2) {
887597
+ return {
887598
+ id: action2.id,
887599
+ categoryId: category.id,
887600
+ category: category.label,
887601
+ group: category.group,
887602
+ label: action2.label,
887603
+ summary: previewText6(action2.detail),
887604
+ kind: action2.kind,
887605
+ safety: action2.safety,
887606
+ ...action2.command ? { command: action2.command } : {},
887607
+ ...action2.targetCategoryId ? { targetCategoryId: action2.targetCategoryId } : {},
887608
+ ...action2.editorKind ? { editorKind: action2.editorKind } : {},
887609
+ ...action2.localKind ? { localKind: action2.localKind } : {},
887610
+ ...action2.localOperation ? { localOperation: action2.localOperation } : {}
887611
+ };
887612
+ }
887547
887613
  function listWorkspaceActions(context, args2) {
887548
887614
  const query2 = readString74(args2.query);
887549
887615
  const categoryId = readString74(args2.categoryId || args2.category);
@@ -887551,7 +887617,7 @@ function listWorkspaceActions(context, args2) {
887551
887617
  const includeEditor = args2.includeParameters === true;
887552
887618
  const editorContext = includeEditor ? buildWorkspaceEditorContext(context, args2) : null;
887553
887619
  const source = query2 ? searchAgentWorkspaceActions(AGENT_WORKSPACE_CATEGORIES, query2).map((result2) => ({ category: result2.category, action: result2.action })) : allWorkspaceActions();
887554
- return source.filter((entry) => !categoryId || entry.category.id === categoryId).slice(0, limit3).map((entry) => describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext }));
887620
+ return source.filter((entry) => !categoryId || entry.category.id === categoryId).slice(0, limit3).map((entry) => includeEditor ? describeWorkspaceAction(entry.category, entry.action, { includeEditor, editorContext }) : describeWorkspaceActionSummary(entry.category, entry.action));
887555
887621
  }
887556
887622
  function workspaceActionLookupFromArgs(args2) {
887557
887623
  const actionId = readString74(args2.actionId);
@@ -887642,6 +887708,113 @@ function output7(value) {
887642
887708
  function error52(message) {
887643
887709
  return { success: false, error: message };
887644
887710
  }
887711
+ function compactHarnessModeGuide() {
887712
+ return {
887713
+ discover: [
887714
+ "cli_commands",
887715
+ "panels",
887716
+ "ui_surfaces",
887717
+ "shortcuts",
887718
+ "keybindings",
887719
+ "commands",
887720
+ "channels",
887721
+ "notifications",
887722
+ "provider_accounts",
887723
+ "mcp_servers",
887724
+ "setup_posture",
887725
+ "model_routing",
887726
+ "pairing_posture",
887727
+ "delegation_posture",
887728
+ "security_posture",
887729
+ "support_bundles",
887730
+ "media_posture",
887731
+ "sessions",
887732
+ "settings",
887733
+ "workspace",
887734
+ "workspace_categories",
887735
+ "workspace_actions",
887736
+ "tools",
887737
+ "release_evidence",
887738
+ "release_readiness",
887739
+ "operator_methods",
887740
+ "service_posture",
887741
+ "connected_host",
887742
+ "daemon"
887743
+ ],
887744
+ inspect: [
887745
+ "cli_command",
887746
+ "panel",
887747
+ "ui_surface",
887748
+ "keybinding",
887749
+ "command",
887750
+ "channel",
887751
+ "notification_target",
887752
+ "provider_account",
887753
+ "mcp_server",
887754
+ "setup_item",
887755
+ "model_route",
887756
+ "pairing_route",
887757
+ "delegation_route",
887758
+ "security_finding",
887759
+ "support_bundle",
887760
+ "media_provider",
887761
+ "session",
887762
+ "get_setting",
887763
+ "workspace_action",
887764
+ "tool",
887765
+ "release_evidence_artifact",
887766
+ "release_readiness_item",
887767
+ "operator_method",
887768
+ "service_endpoint",
887769
+ "connected_host_capability",
887770
+ "connected_host_status",
887771
+ "daemon_status"
887772
+ ],
887773
+ effects: [
887774
+ "open_panel",
887775
+ "open_ui_surface",
887776
+ "run_keybinding",
887777
+ "set_keybinding",
887778
+ "reset_keybinding",
887779
+ "run_command",
887780
+ "set_setting",
887781
+ "reset_setting",
887782
+ "run_workspace_action"
887783
+ ],
887784
+ pattern: "Use query|target for search, exact ids for inspect modes, and confirm:true plus explicitUserRequest for effects."
887785
+ };
887786
+ }
887787
+ function detailedHarnessModelAccessGuide() {
887788
+ return {
887789
+ cliCommands: 'List mode:"cli_commands"; inspect mode:"cli_command" with cliCommand|commandName|query. Discovery only.',
887790
+ panels: 'List mode:"panels"; inspect mode:"panel"; navigate mode:"open_panel" with confirm:true and explicitUserRequest.',
887791
+ uiSurfaces: 'List mode:"ui_surfaces"; inspect mode:"ui_surface"; navigate mode:"open_ui_surface" with confirmation.',
887792
+ shortcuts: 'List mode:"shortcuts"; inspect mode:"keybinding"; run mode:"run_keybinding"; edit with set_keybinding/reset_keybinding and confirmation.',
887793
+ slashCommands: 'List mode:"commands"; inspect mode:"command"; execute mode:"run_command" with confirmation.',
887794
+ channels: 'List mode:"channels"; inspect mode:"channel"; deliver with agent_channel_send and confirmation.',
887795
+ notifications: 'List mode:"notifications"; inspect mode:"notification_target"; deliver with agent_notify and confirmation.',
887796
+ providerAccounts: 'List mode:"provider_accounts"; inspect mode:"provider_account"; auth changes stay confirmed workspace/command flows.',
887797
+ mcpServers: 'List mode:"mcp_servers"; inspect mode:"mcp_server"; trust/server changes stay confirmed workspace/command flows.',
887798
+ setupPosture: 'List mode:"setup_posture"; inspect mode:"setup_item"; setup mutations stay confirmed visible flows.',
887799
+ modelRouting: 'List mode:"model_routing"; inspect mode:"model_route"; selection and provider edits stay confirmed visible flows.',
887800
+ pairingPosture: 'List mode:"pairing_posture"; inspect mode:"pairing_route"; raw token/QR and pairing effects stay visible user flows.',
887801
+ delegationPosture: 'List mode:"delegation_posture"; inspect mode:"delegation_route"; delegated submission stays confirmed visible flow.',
887802
+ securityPosture: 'List mode:"security_posture"; inspect mode:"security_finding"; mutate only through confirmed security routes.',
887803
+ supportBundles: 'List mode:"support_bundles"; inspect mode:"support_bundle"; export/import stays confirmation-gated.',
887804
+ mediaPosture: 'List mode:"media_posture"; inspect mode:"media_provider"; generate with agent_media_generate and confirmation.',
887805
+ sessions: 'List mode:"sessions"; inspect mode:"session"; save/resume/export/delete stays visible confirmed flow.',
887806
+ workspace: 'List mode:"workspace" or mode:"workspace_categories"; actions via workspace_actions/workspace_action/run_workspace_action; includeParameters:true inlines editor schemas.',
887807
+ settings: 'List mode:"settings" with category|prefix|query|includeHidden:true; get_setting/set_setting/reset_setting use key|target|query and confirmation for writes.',
887808
+ tools: 'List mode:"tools" with query|limit|includeParameters:true; inspect mode:"tool" with toolName|target|query.',
887809
+ releaseEvidence: 'List mode:"release_evidence"; inspect mode:"release_evidence_artifact"; includeParameters:true inlines artifact detail.',
887810
+ releaseReadiness: 'List mode:"release_readiness"; inspect mode:"release_readiness_item"; includeParameters:true inlines item detail.',
887811
+ operatorMethods: 'List mode:"operator_methods"; inspect mode:"operator_method"; execute only through the returned first-class tool.',
887812
+ servicePosture: 'List mode:"service_posture"; inspect mode:"service_endpoint"; includeParameters:true adds probes and redacted log tail.',
887813
+ connectedHost: 'Map mode:"connected_host"; inspect mode:"connected_host_capability"; no lifecycle control.',
887814
+ connectedHostStatus: 'Live read-only mode:"connected_host_status" for host reachability, SDK compatibility, token posture, and Knowledge readiness.',
887815
+ daemon: 'Daemon aliases route to mode:"connected_host" and mode:"connected_host_status"; lifecycle control is not exposed.'
887816
+ };
887817
+ }
887645
887818
  function requireConfirmedAction(args2, action2) {
887646
887819
  const explicitUserRequest = readString75(args2.explicitUserRequest);
887647
887820
  if (!explicitUserRequest)
@@ -887841,11 +888014,7 @@ function createAgentHarnessTool(deps) {
887841
888014
  return {
887842
888015
  definition: {
887843
888016
  name: "agent_harness",
887844
- description: [
887845
- "Inspect or operate the GoodVibes Agent harness.",
887846
- "Use summary for mode help.",
887847
- "Effects require confirm:true plus explicitUserRequest; no host lifecycle or raw secrets."
887848
- ].join(" "),
888017
+ description: "Inspect or operate GoodVibes Agent harness surfaces.",
887849
888018
  parameters: {
887850
888019
  type: "object",
887851
888020
  properties: AGENT_HARNESS_PARAMETER_PROPERTIES,
@@ -887901,36 +888070,12 @@ function createAgentHarnessTool(deps) {
887901
888070
  releaseReadiness: releaseReadinessInventoryStatus(),
887902
888071
  operatorMethods: operatorMethodCatalogStatus(),
887903
888072
  servicePosture: servicePostureCatalogStatus(),
887904
- modelAccess: {
887905
- cliCommands: 'List mode:"cli_commands"; inspect mode:"cli_command" with cliCommand|commandName|query. Discovery only.',
887906
- panels: 'List mode:"panels"; inspect mode:"panel"; navigate mode:"open_panel" with confirm:true and explicitUserRequest.',
887907
- uiSurfaces: 'List mode:"ui_surfaces"; inspect mode:"ui_surface"; navigate mode:"open_ui_surface" with confirmation.',
887908
- shortcuts: 'List mode:"shortcuts"; inspect mode:"keybinding"; run mode:"run_keybinding"; edit with set_keybinding/reset_keybinding and confirmation.',
887909
- slashCommands: 'List mode:"commands"; inspect mode:"command"; execute mode:"run_command" with confirmation.',
887910
- channels: 'List mode:"channels"; inspect mode:"channel"; deliver with agent_channel_send and confirmation.',
887911
- notifications: 'List mode:"notifications"; inspect mode:"notification_target"; deliver with agent_notify and confirmation.',
887912
- providerAccounts: 'List mode:"provider_accounts"; inspect mode:"provider_account"; auth changes stay confirmed workspace/command flows.',
887913
- mcpServers: 'List mode:"mcp_servers"; inspect mode:"mcp_server"; trust/server changes stay confirmed workspace/command flows.',
887914
- setupPosture: 'List mode:"setup_posture"; inspect mode:"setup_item"; setup mutations stay confirmed visible flows.',
887915
- modelRouting: 'List mode:"model_routing"; inspect mode:"model_route"; selection and provider edits stay confirmed visible flows.',
887916
- pairingPosture: 'List mode:"pairing_posture"; inspect mode:"pairing_route"; raw token/QR and pairing effects stay visible user flows.',
887917
- delegationPosture: 'List mode:"delegation_posture"; inspect mode:"delegation_route"; delegated submission stays confirmed visible flow.',
887918
- securityPosture: 'List mode:"security_posture"; inspect mode:"security_finding"; mutate only through confirmed security routes.',
887919
- supportBundles: 'List mode:"support_bundles"; inspect mode:"support_bundle"; export/import stays confirmation-gated.',
887920
- mediaPosture: 'List mode:"media_posture"; inspect mode:"media_provider"; generate with agent_media_generate and confirmation.',
887921
- sessions: 'List mode:"sessions"; inspect mode:"session"; save/resume/export/delete stays visible confirmed flow.',
887922
- workspace: 'List mode:"workspace" or mode:"workspace_categories"; actions via workspace_actions/workspace_action/run_workspace_action; includeParameters:true inlines editor schemas.',
887923
- settings: 'List mode:"settings" with category|prefix|query|includeHidden:true; get_setting/set_setting/reset_setting use key|target|query and confirmation for writes.',
887924
- tools: 'List mode:"tools" with query|limit|includeParameters:true; inspect mode:"tool" with toolName|target|query.',
887925
- releaseEvidence: 'List mode:"release_evidence"; inspect mode:"release_evidence_artifact"; includeParameters:true inlines artifact detail.',
887926
- releaseReadiness: 'List mode:"release_readiness"; inspect mode:"release_readiness_item"; includeParameters:true inlines item detail.',
887927
- operatorMethods: 'List mode:"operator_methods"; inspect mode:"operator_method"; execute only through the returned first-class tool.',
887928
- servicePosture: 'List mode:"service_posture"; inspect mode:"service_endpoint"; includeParameters:true adds probes and redacted log tail.',
887929
- connectedHost: 'Map mode:"connected_host"; inspect mode:"connected_host_capability"; no lifecycle control.',
887930
- connectedHostStatus: 'Live read-only mode:"connected_host_status" for host reachability, SDK compatibility, token posture, and Knowledge readiness.'
887931
- },
888073
+ modeGuide: compactHarnessModeGuide(),
888074
+ ...args2.includeParameters === true ? { modelAccess: detailedHarnessModelAccessGuide() } : {},
887932
888075
  settingsPolicy: settingsPolicySummary(),
887933
- connectedHost: connectedHostSummary(deps.commandContext, deps.toolRegistry)
888076
+ connectedHost: connectedHostSummary(deps.commandContext, deps.toolRegistry, {
888077
+ includeParameters: args2.includeParameters === true
888078
+ })
887934
888079
  });
887935
888080
  }
887936
888081
  if (args2.mode === "cli_commands") {
@@ -888135,6 +888280,8 @@ function createAgentHarnessTool(deps) {
888135
888280
  query: readString75(args2.query) || undefined,
888136
888281
  includeHidden: args2.includeHidden === true,
888137
888282
  limit: readLimit26(args2.limit, 100)
888283
+ }, {
888284
+ includeParameters: args2.includeParameters === true
888138
888285
  });
888139
888286
  return output7({ settings, returned: settings.length, policy: settingsPolicySummary() });
888140
888287
  }
@@ -888259,8 +888406,11 @@ function createAgentHarnessTool(deps) {
888259
888406
  return error52(`Ambiguous service endpoint ${resolved.input}. Candidates: ${JSON.stringify(resolved.candidates)}`);
888260
888407
  return error52(resolved.usage);
888261
888408
  }
888262
- if (args2.mode === "connected_host")
888263
- return output7(connectedHostSummary(deps.commandContext, deps.toolRegistry));
888409
+ if (args2.mode === "connected_host" || args2.mode === "daemon") {
888410
+ return output7(connectedHostSummary(deps.commandContext, deps.toolRegistry, {
888411
+ includeParameters: args2.includeParameters === true
888412
+ }));
888413
+ }
888264
888414
  if (args2.mode === "connected_host_capability") {
888265
888415
  const query2 = readString75(args2.capabilityId || args2.target || args2.query);
888266
888416
  const resolved = describeConnectedHostCapability(deps.toolRegistry, query2);
@@ -888270,8 +888420,11 @@ function createAgentHarnessTool(deps) {
888270
888420
  return error52(`Ambiguous connected-host capability ${resolved.input}. Candidates: ${JSON.stringify(resolved.candidates)}`);
888271
888421
  return error52(`Unknown connected-host capability ${query2 || "<missing>"}. Use mode:"connected_host" to inspect allowed and blocked capability ids.`);
888272
888422
  }
888273
- if (args2.mode === "connected_host_status")
888274
- return output7(await connectedHostStatusSummary(deps.commandContext, deps.toolRegistry));
888423
+ if (args2.mode === "connected_host_status" || args2.mode === "daemon_status") {
888424
+ return output7(await connectedHostStatusSummary(deps.commandContext, deps.toolRegistry, {
888425
+ includeParameters: args2.includeParameters === true
888426
+ }));
888427
+ }
888275
888428
  return error52(`Unhandled agent_harness mode: ${args2.mode}`);
888276
888429
  } catch (err2) {
888277
888430
  return error52(formatHarnessError(err2));
@@ -888286,24 +888439,16 @@ function registerAgentHarnessTool(registry5, commandRegistry, commandContext) {
888286
888439
  // src/runtime/bootstrap.ts
888287
888440
  var GOODVIBES_AGENT_OPERATOR_POLICY = [
888288
888441
  "## GoodVibes Agent Operator Policy",
888289
- "- Default to serial, proactive assistant work in the main conversation. Answer, inspect, summarize, remember useful non-secret facts, configure Agent-local state, use read-only connected-host/operator routes, and take safe non-destructive actions without creating separate Agent jobs or GoodVibes TUI delegations.",
888290
- "- GoodVibes Agent connects to a GoodVibes host owned outside this package. Do not start, stop, restart, install, expose, or mutate connected-host network/listener posture from Agent.",
888291
- "- Use the `agent_operator_briefing` tool for read-only main-conversation summaries of connected work plan, approvals, automation, schedules, and scheduler capacity. This tool must not call mutation routes, connected-host lifecycle routes, default knowledge, non-Agent knowledge spaces, separate Agent job creation, or GoodVibes TUI delegation.",
888292
- "- When the user explicitly asks Agent to approve, deny, or cancel a specific approval, run/pause/resume a specific automation job, cancel/retry a specific automation run, or run a specific schedule, use the `agent_operator_action` tool with confirm:true and the original user request. It can call only its allowlisted public operator routes and must not create, edit, delete, or discover automation definitions.",
888293
- "- Use the `agent_work_plan` tool to keep the visible Agent-local work plan current while working in the main conversation. Create, inspect, and update local work items proactively when useful. Removing items or clearing completed items requires an explicit user request and confirm:true.",
888294
- "- Use the `agent_harness` tool to inspect and operate the harness surface itself: Agent workspace action catalog, slash command catalog, model tool catalog, release evidence bundle, release readiness inventory, connected-host posture, and Agent settings. Use it to change Agent settings, invoke workspace action mirrors, or invoke slash-command mirrors only when the user explicitly asks; preserve confirm:true and explicitUserRequest for mutations, keep secret-backed settings in the secret manager, and keep connected-host lifecycle/posture externally owned.",
888295
- "- Use the `agent_knowledge` tool for Agent Knowledge status, ask, search, source/node/issue lists, item lookup, map summary, connector list/detail, and connector doctor from the main conversation. It must use only /api/goodvibes-agent/knowledge/* and must fail closed instead of falling back to default knowledge or non-Agent knowledge spaces.",
888296
- "- When the user explicitly asks Agent to add, import, remember, or ingest a URL, URL-list file, local file, bookmarks file, browser history, or connector input into Agent Knowledge, use the `agent_knowledge_ingest` tool with confirm:true and the original user request. It must write only to /api/goodvibes-agent/knowledge/* ingest routes and never to default knowledge or non-Agent knowledge spaces.",
888297
- "- Use the `agent_local_registry` tool when a scratchpad note, durable memory, reusable persona, skill, skill bundle, or routine would improve later work. Keep those records Agent-local, non-secret, source/provenance tagged, and reviewable. Notes are for temporary/source-triage context; promote them explicitly into memory, skills, personas, routines, or Agent Knowledge only when that is the correct durable home. Review memory with a confidence score when it should shape later turns. Starting a routine means applying its steps in this same serial conversation, not creating a background job.",
888298
- "- When the user explicitly asks Agent to generate an image, video, or other media artifact, use the `agent_media_generate` tool with confirm:true and the original user request. Generated media is stored as artifacts; do not print base64, call default knowledge, use non-Agent knowledge spaces, send channels, create separate Agent jobs, or request GoodVibes TUI delegation for media generation.",
888299
- "- When the user explicitly asks Agent to send an alert, message, or notification to configured notification targets, use the `agent_notify` tool with confirm:true and the original user request. Do not infer external notifications from vague suggestions, and never create channel routes or account authorizations from the main conversation.",
888300
- "- When the user explicitly asks Agent to send one message to a specific configured channel, route, webhook, or link target, use the `agent_channel_send` tool with confirm:true and the original user request. It can deliver one message through configured delivery strategies, but must not create routes, authorize accounts, manage connected-host hosting, use default knowledge, use non-Agent knowledge spaces, create separate Agent jobs, or request GoodVibes TUI delegation.",
888301
- "- When the user explicitly asks for a reminder or asks Agent to schedule a reminder, use the `agent_reminder_schedule` tool with confirm:true and the original user request. That creates one connected schedules.create reminder on the external GoodVibes host. Do not infer reminders from vague suggestions or routine startup, and never create local scheduler jobs.",
888302
- "- GoodVibes TUI delegation is never the default Agent reasoning path. Do not delegate planning, research, operations, knowledge, memory, configuration, approvals, automation observability, or ordinary assistant work.",
888303
- "- GoodVibes Agent is not the coding TUI. Do not use the `agent` tool to create coding-role Agent jobs or batch job roots from Agent.",
888304
- "- When the user explicitly asks to build, implement, fix, patch, or review code, preserve the full original user ask and delegate one build request to GoodVibes TUI through the public shared-session/build-delegation contract. Include clear executionIntent and request delegated review only for explicit build/fix/review work or when the user explicitly asks for delegated Agent review.",
888305
- "- Do not narrow explicit build/fix/review requests into design-only, read-only, or no-write work unless the user explicitly requested that limitation. TUI owns file edits, git/worktree work, execution isolation UX, and delegated review coordination.",
888306
- "- If a stable public delegation route is unavailable, say that the task needs GoodVibes TUI delegation and report the missing route instead of pretending to implement it locally or creating sibling Agent jobs."
888442
+ "- Work serially in the main conversation by default: answer, inspect, summarize, remember useful non-secret facts, configure Agent-local state, and use safe read-only connected-host/operator routes.",
888443
+ "- Connected-host lifecycle is external. Do not start, stop, restart, install, expose, or mutate host listeners/network posture from Agent.",
888444
+ "- Read tools: `agent_operator_briefing` for connected work/approvals/automation/schedules, `agent_knowledge` for isolated Agent Knowledge, `agent_harness` for harness catalogs/settings/status.",
888445
+ "- State tools: `agent_work_plan` for visible local work items; `agent_local_registry` for Agent-local notes, memory, personas, skills, bundles, and routines. Keep records non-secret, sourced, and reviewable.",
888446
+ "- Confirmed tools: use `agent_operator_action`, `agent_knowledge_ingest`, `agent_media_generate`, `agent_notify`, `agent_channel_send`, and `agent_reminder_schedule` only for explicit user requests with confirm:true and explicitUserRequest.",
888447
+ "- Agent Knowledge must use only `/api/goodvibes-agent/knowledge/*` and fail closed. Do not use default knowledge or non-Agent knowledge spaces.",
888448
+ "- External delivery, media generation, reminders, settings writes, slash-command mirrors, workspace action mirrors, and destructive local changes require explicit user intent and the owning tool/command confirmation.",
888449
+ "- Routines run in this serial conversation unless explicitly promoted to a connected schedule. Do not create hidden Agent jobs or local scheduler jobs.",
888450
+ "- Do not delegate planning, research, operations, knowledge, memory, configuration, approvals, observability, or ordinary assistant work.",
888451
+ "- For explicit build, implement, fix, patch, or review requests, preserve the full original ask and use the public shared-session/build-delegation route. If that route is unavailable, report the missing route instead of pretending to perform the work locally."
888307
888452
  ].join(`
888308
888453
  `);
888309
888454
  function joinPromptParts(...parts2) {