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