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