@pellux/goodvibes-agent 1.0.44 → 1.1.0
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 +4 -0
- package/dist/package/main.js +168 -37
- package/package.json +1 -1
- package/src/cli/tui-startup.ts +0 -2
- package/src/input/agent-workspace-activation.ts +5 -0
- package/src/input/agent-workspace-categories.ts +11 -0
- package/src/input/agent-workspace-types.ts +2 -1
- package/src/input/agent-workspace.ts +41 -0
- package/src/renderer/agent-workspace.ts +6 -0
- package/src/version.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
Product-facing release notes for GoodVibes Agent.
|
|
4
4
|
|
|
5
|
+
## 1.1.0 - 2026-06-05
|
|
6
|
+
|
|
7
|
+
- Add a final onboarding Finish category with Apply & close completion that saves the user onboarding marker and keeps future normal launches in the main conversation.
|
|
8
|
+
|
|
5
9
|
## 1.0.44 - 2026-06-05
|
|
6
10
|
|
|
7
11
|
- Compact Agent workspace top-pane copy across every category so the fullscreen onboarding surface keeps settings and actions visible.
|
package/dist/package/main.js
CHANGED
|
@@ -450372,6 +450372,23 @@ 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
|
+
}
|
|
450375
450392
|
function rowObject(columns, values2) {
|
|
450376
450393
|
return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
|
|
450377
450394
|
}
|
|
@@ -763654,6 +763671,9 @@ var init_ingest = __esm(() => {
|
|
|
763654
763671
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
|
|
763655
763672
|
var init_browser_history = __esm(() => {
|
|
763656
763673
|
init_ingest();
|
|
763674
|
+
init_discover();
|
|
763675
|
+
init_readers();
|
|
763676
|
+
init_paths2();
|
|
763657
763677
|
});
|
|
763658
763678
|
|
|
763659
763679
|
// node_modules/graphql/jsutils/devAssert.mjs
|
|
@@ -781293,6 +781313,7 @@ var init_semantic = __esm(() => {
|
|
|
781293
781313
|
init_llm();
|
|
781294
781314
|
init_gap_repair();
|
|
781295
781315
|
init_service4();
|
|
781316
|
+
init_self_improvement();
|
|
781296
781317
|
});
|
|
781297
781318
|
|
|
781298
781319
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
|
|
@@ -785261,8 +785282,40 @@ var init_map_view = __esm(() => {
|
|
|
785261
785282
|
});
|
|
785262
785283
|
|
|
785263
785284
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
|
|
785264
|
-
var HOME_GRAPH_CAPABILITIES;
|
|
785285
|
+
var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
|
|
785265
785286
|
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
|
+
];
|
|
785266
785319
|
HOME_GRAPH_CAPABILITIES = [
|
|
785267
785320
|
"knowledge-space-isolation",
|
|
785268
785321
|
"snapshot-sync",
|
|
@@ -786669,6 +786722,7 @@ var init_service5 = __esm(() => {
|
|
|
786669
786722
|
var init_home_graph = __esm(() => {
|
|
786670
786723
|
init_service5();
|
|
786671
786724
|
init_extension();
|
|
786725
|
+
init_types15();
|
|
786672
786726
|
});
|
|
786673
786727
|
|
|
786674
786728
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-refinement.js
|
|
@@ -788996,10 +789050,14 @@ var init_service6 = __esm(() => {
|
|
|
788996
789050
|
var init_project_planning = __esm(() => {
|
|
788997
789051
|
init_service6();
|
|
788998
789052
|
init_helpers3();
|
|
789053
|
+
init_readiness();
|
|
788999
789054
|
});
|
|
789000
789055
|
|
|
789001
789056
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
|
|
789002
|
-
var init_persistence = () => {
|
|
789057
|
+
var init_persistence = __esm(() => {
|
|
789058
|
+
init_store_schema();
|
|
789059
|
+
init_store_load();
|
|
789060
|
+
});
|
|
789003
789061
|
|
|
789004
789062
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
|
|
789005
789063
|
class KnowledgeProjectionService {
|
|
@@ -792507,21 +792565,21 @@ var init_service7 = __esm(() => {
|
|
|
792507
792565
|
var exports_knowledge = {};
|
|
792508
792566
|
__export(exports_knowledge, {
|
|
792509
792567
|
withKnowledgeSpace: () => withKnowledgeSpace,
|
|
792510
|
-
uniqKnowledgeValues: () =>
|
|
792511
|
-
stabilizeKnowledgeText: () =>
|
|
792512
|
-
runKnowledgeSemanticSelfImprovement: () =>
|
|
792568
|
+
uniqKnowledgeValues: () => uniq2,
|
|
792569
|
+
stabilizeKnowledgeText: () => stableText,
|
|
792570
|
+
runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
|
|
792513
792571
|
resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
|
|
792514
|
-
resolveKnowledgeDbPathFromControlPlaneDir: () =>
|
|
792572
|
+
resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
|
|
792515
792573
|
renderPacket: () => renderPacket,
|
|
792516
792574
|
renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
|
|
792517
792575
|
renderKnowledgeMap: () => renderKnowledgeMap,
|
|
792518
792576
|
readKnowledgeSearchText: () => readKnowledgeSearchText,
|
|
792519
|
-
readBrowserKnowledgeProfile: () =>
|
|
792577
|
+
readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
|
|
792520
792578
|
projectPlanningSourceId: () => projectPlanningSourceId,
|
|
792521
792579
|
projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
|
|
792522
792580
|
projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
|
|
792523
792581
|
projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
|
|
792524
|
-
parseKnowledgeJsonValue: () =>
|
|
792582
|
+
parseKnowledgeJsonValue: () => parseJsonValue,
|
|
792525
792583
|
normalizeProjectId: () => normalizeProjectId,
|
|
792526
792584
|
normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
|
|
792527
792585
|
normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
|
|
@@ -792529,12 +792587,12 @@ __export(exports_knowledge, {
|
|
|
792529
792587
|
materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
|
|
792530
792588
|
looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
|
|
792531
792589
|
looksBinaryLikeText: () => looksBinaryLikeText,
|
|
792532
|
-
loadKnowledgeStoreSnapshot: () =>
|
|
792590
|
+
loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
|
|
792533
792591
|
listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
|
|
792534
|
-
listBrowserKinds: () =>
|
|
792592
|
+
listBrowserKinds: () => listBrowserKinds,
|
|
792535
792593
|
knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
|
|
792536
792594
|
knowledgePageSourceWeight: () => knowledgePageSourceWeight,
|
|
792537
|
-
knowledgeNowMs: () =>
|
|
792595
|
+
knowledgeNowMs: () => nowMs,
|
|
792538
792596
|
knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
|
|
792539
792597
|
isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
|
|
792540
792598
|
isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
|
|
@@ -792554,12 +792612,12 @@ __export(exports_knowledge, {
|
|
|
792554
792612
|
generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
|
|
792555
792613
|
generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
|
|
792556
792614
|
extractKnowledgeArtifact: () => extractKnowledgeArtifact,
|
|
792557
|
-
evaluateProjectPlanningReadiness: () =>
|
|
792558
|
-
discoverBrowserKnowledgeProfiles: () =>
|
|
792615
|
+
evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
|
|
792616
|
+
discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
|
|
792559
792617
|
createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
|
|
792560
792618
|
createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
|
|
792561
792619
|
createMemoryApi: () => createMemoryApi,
|
|
792562
|
-
createKnowledgeSchema: () =>
|
|
792620
|
+
createKnowledgeSchema: () => createSchema2,
|
|
792563
792621
|
createKnowledgeApi: () => createKnowledgeApi,
|
|
792564
792622
|
createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
|
|
792565
792623
|
compareKnowledgePageSources: () => compareKnowledgePageSources,
|
|
@@ -794998,7 +795056,7 @@ var init_delivery_manager = __esm(() => {
|
|
|
794998
795056
|
});
|
|
794999
795057
|
|
|
795000
795058
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
|
|
795001
|
-
function computeSchedulerCapacity(slotsTotal, runs,
|
|
795059
|
+
function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
|
|
795002
795060
|
let slotsInUse = 0;
|
|
795003
795061
|
const queuedRuns = [];
|
|
795004
795062
|
for (const run7 of runs) {
|
|
@@ -795008,7 +795066,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
|
|
|
795008
795066
|
queuedRuns.push(run7);
|
|
795009
795067
|
}
|
|
795010
795068
|
const queueDepth = queuedRuns.length;
|
|
795011
|
-
const oldestQueuedAgeMs = queueDepth > 0 ?
|
|
795069
|
+
const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
|
|
795012
795070
|
return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
|
|
795013
795071
|
}
|
|
795014
795072
|
|
|
@@ -817087,7 +817145,7 @@ var createStyledCell = (char, overrides = {}) => ({
|
|
|
817087
817145
|
// src/version.ts
|
|
817088
817146
|
import { readFileSync } from "fs";
|
|
817089
817147
|
import { join } from "path";
|
|
817090
|
-
var _version = "1.0
|
|
817148
|
+
var _version = "1.1.0";
|
|
817091
817149
|
try {
|
|
817092
817150
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
|
|
817093
817151
|
_version = typeof pkg.version === "string" ? pkg.version : _version;
|
|
@@ -839600,7 +839658,7 @@ var WORK_PLAN_STATUSES = [
|
|
|
839600
839658
|
"failed",
|
|
839601
839659
|
"cancelled"
|
|
839602
839660
|
];
|
|
839603
|
-
function
|
|
839661
|
+
function nowMs2() {
|
|
839604
839662
|
return Date.now();
|
|
839605
839663
|
}
|
|
839606
839664
|
function isObject4(value) {
|
|
@@ -839706,7 +839764,7 @@ class WorkPlanStore {
|
|
|
839706
839764
|
if (!normalizedTitle)
|
|
839707
839765
|
throw new Error("Work plan item title is required.");
|
|
839708
839766
|
const plan = this.readPlan();
|
|
839709
|
-
const time4 =
|
|
839767
|
+
const time4 = nowMs2();
|
|
839710
839768
|
const item = {
|
|
839711
839769
|
id: createItemId(),
|
|
839712
839770
|
title: normalizedTitle,
|
|
@@ -839730,7 +839788,7 @@ class WorkPlanStore {
|
|
|
839730
839788
|
updateItem(idOrPrefix, patch2) {
|
|
839731
839789
|
const plan = this.readPlan();
|
|
839732
839790
|
const item = this.resolveItem(plan, idOrPrefix);
|
|
839733
|
-
const time4 =
|
|
839791
|
+
const time4 = nowMs2();
|
|
839734
839792
|
const nextStatus = patch2.status ?? item.status;
|
|
839735
839793
|
const next = this.pruneItem({
|
|
839736
839794
|
...item,
|
|
@@ -839763,7 +839821,7 @@ class WorkPlanStore {
|
|
|
839763
839821
|
removeItem(idOrPrefix) {
|
|
839764
839822
|
const plan = this.readPlan();
|
|
839765
839823
|
const item = this.resolveItem(plan, idOrPrefix);
|
|
839766
|
-
const time4 =
|
|
839824
|
+
const time4 = nowMs2();
|
|
839767
839825
|
const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
|
|
839768
839826
|
this.writePlan({
|
|
839769
839827
|
...plan,
|
|
@@ -839783,7 +839841,7 @@ class WorkPlanStore {
|
|
|
839783
839841
|
...plan,
|
|
839784
839842
|
items: remaining,
|
|
839785
839843
|
activeItemId: remaining[0]?.id,
|
|
839786
|
-
updatedAt:
|
|
839844
|
+
updatedAt: nowMs2()
|
|
839787
839845
|
});
|
|
839788
839846
|
return removed;
|
|
839789
839847
|
}
|
|
@@ -839822,7 +839880,7 @@ class WorkPlanStore {
|
|
|
839822
839880
|
const parsed = JSON.parse(raw);
|
|
839823
839881
|
if (!isObject4(parsed))
|
|
839824
839882
|
return this.createEmptyPlan();
|
|
839825
|
-
const time4 =
|
|
839883
|
+
const time4 = nowMs2();
|
|
839826
839884
|
const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
|
|
839827
839885
|
const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
|
|
839828
839886
|
const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
|
|
@@ -839841,7 +839899,7 @@ class WorkPlanStore {
|
|
|
839841
839899
|
};
|
|
839842
839900
|
}
|
|
839843
839901
|
createEmptyPlan() {
|
|
839844
|
-
const time4 =
|
|
839902
|
+
const time4 = nowMs2();
|
|
839845
839903
|
return {
|
|
839846
839904
|
id: createPlanId(this.options.projectId, this.options.projectRoot),
|
|
839847
839905
|
projectId: this.options.projectId,
|
|
@@ -858574,7 +858632,8 @@ var AGENT_WORKSPACE_CATEGORY_IDS = [
|
|
|
858574
858632
|
"work",
|
|
858575
858633
|
"host",
|
|
858576
858634
|
"automation",
|
|
858577
|
-
"delegate"
|
|
858635
|
+
"delegate",
|
|
858636
|
+
"finish"
|
|
858578
858637
|
];
|
|
858579
858638
|
|
|
858580
858639
|
// src/input/commands/agent-workspace-runtime.ts
|
|
@@ -863014,7 +863073,7 @@ function registerBriefRuntimeCommands(registry5) {
|
|
|
863014
863073
|
|
|
863015
863074
|
// src/cli/bundle-command.ts
|
|
863016
863075
|
import { existsSync as existsSync80, mkdirSync as mkdirSync64, readFileSync as readFileSync87, writeFileSync as writeFileSync55 } from "fs";
|
|
863017
|
-
import { dirname as
|
|
863076
|
+
import { dirname as dirname62 } from "path";
|
|
863018
863077
|
// src/runtime/onboarding/state.ts
|
|
863019
863078
|
import { existsSync as existsSync76, mkdirSync as mkdirSync62, readFileSync as readFileSync84, writeFileSync as writeFileSync53 } from "fs";
|
|
863020
863079
|
var ONBOARDING_RUNTIME_STATE_FILE = "onboarding-state.json";
|
|
@@ -863659,6 +863718,7 @@ function deriveStep1CapabilityFlags(snapshot) {
|
|
|
863659
863718
|
}
|
|
863660
863719
|
// src/runtime/onboarding/markers.ts
|
|
863661
863720
|
import { existsSync as existsSync77, mkdirSync as mkdirSync63, readFileSync as readFileSync85, writeFileSync as writeFileSync54 } from "fs";
|
|
863721
|
+
import { dirname as dirname60 } from "path";
|
|
863662
863722
|
var ONBOARDING_CHECK_MARKER_FILE = "onboarding-checked.json";
|
|
863663
863723
|
function resolveMarkerPath(shellPaths, scope) {
|
|
863664
863724
|
return scope === "project" ? shellPaths.resolveProjectPath(GOODVIBES_AGENT_SURFACE_ROOT, ONBOARDING_CHECK_MARKER_FILE) : shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, ONBOARDING_CHECK_MARKER_FILE);
|
|
@@ -863728,9 +863788,26 @@ function readOnboardingCheckMarkers(shellPaths) {
|
|
|
863728
863788
|
effective: pickEffectiveMarker(user)
|
|
863729
863789
|
};
|
|
863730
863790
|
}
|
|
863791
|
+
function writeOnboardingCheckMarker(shellPaths, options = {}) {
|
|
863792
|
+
const scope = options.scope ?? "user";
|
|
863793
|
+
const path7 = resolveMarkerPath(shellPaths, scope);
|
|
863794
|
+
const checkedAt = options.checkedAt ?? Date.now();
|
|
863795
|
+
const payload = {
|
|
863796
|
+
version: 1,
|
|
863797
|
+
checkedAt,
|
|
863798
|
+
updatedAt: options.updatedAt ?? checkedAt,
|
|
863799
|
+
source: options.source ?? "wizard",
|
|
863800
|
+
...options.mode ? { mode: options.mode } : {},
|
|
863801
|
+
...options.workspaceRoot ? { workspaceRoot: options.workspaceRoot } : {}
|
|
863802
|
+
};
|
|
863803
|
+
mkdirSync63(dirname60(path7), { recursive: true });
|
|
863804
|
+
writeFileSync54(path7, `${JSON.stringify(payload, null, 2)}
|
|
863805
|
+
`, "utf-8");
|
|
863806
|
+
return readOnboardingCheckMarker(shellPaths, scope);
|
|
863807
|
+
}
|
|
863731
863808
|
// src/cli/help.ts
|
|
863732
863809
|
import { existsSync as existsSync78, readFileSync as readFileSync86 } from "fs";
|
|
863733
|
-
import { dirname as
|
|
863810
|
+
import { dirname as dirname61, join as join93 } from "path";
|
|
863734
863811
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
863735
863812
|
function readJsonVersion(path7) {
|
|
863736
863813
|
try {
|
|
@@ -863743,7 +863820,7 @@ function readJsonVersion(path7) {
|
|
|
863743
863820
|
}
|
|
863744
863821
|
}
|
|
863745
863822
|
function getPackageVersion() {
|
|
863746
|
-
const here =
|
|
863823
|
+
const here = dirname61(fileURLToPath4(import.meta.url));
|
|
863747
863824
|
return readJsonVersion(join93(here, "..", "..", "package.json")) ?? VERSION;
|
|
863748
863825
|
}
|
|
863749
863826
|
function renderGoodVibesVersion(binary2 = "goodvibes-agent") {
|
|
@@ -864687,7 +864764,7 @@ async function handleBundleCommand(runtime2) {
|
|
|
864687
864764
|
}
|
|
864688
864765
|
};
|
|
864689
864766
|
const targetPath = shellPaths.resolveWorkspacePath(outputPath);
|
|
864690
|
-
mkdirSync64(
|
|
864767
|
+
mkdirSync64(dirname62(targetPath), { recursive: true });
|
|
864691
864768
|
writeFileSync55(targetPath, redactSerializedSecrets(JSON.stringify(bundle, null, 2), sensitiveValues) + `
|
|
864692
864769
|
`, "utf-8");
|
|
864693
864770
|
return {
|
|
@@ -865305,7 +865382,7 @@ function formatProviderAuthRoute(route) {
|
|
|
865305
865382
|
|
|
865306
865383
|
// src/cli/management-commands.ts
|
|
865307
865384
|
import { mkdirSync as mkdirSync65, writeFileSync as writeFileSync56 } from "fs";
|
|
865308
|
-
import { dirname as
|
|
865385
|
+
import { dirname as dirname63 } from "path";
|
|
865309
865386
|
init_config8();
|
|
865310
865387
|
init_config8();
|
|
865311
865388
|
init_config8();
|
|
@@ -865615,7 +865692,7 @@ async function handleSessions(runtime2) {
|
|
|
865615
865692
|
`;
|
|
865616
865693
|
if (outputPath) {
|
|
865617
865694
|
const targetPath = services.shellPaths.resolveWorkspacePath(outputPath);
|
|
865618
|
-
mkdirSync65(
|
|
865695
|
+
mkdirSync65(dirname63(targetPath), { recursive: true });
|
|
865619
865696
|
writeFileSync56(targetPath, text, "utf-8");
|
|
865620
865697
|
return [
|
|
865621
865698
|
"Session exported",
|
|
@@ -866498,7 +866575,7 @@ Run goodvibes-agent skills discover to inspect available skill files.`, 1);
|
|
|
866498
866575
|
|
|
866499
866576
|
// src/cli/memory-command.ts
|
|
866500
866577
|
import { mkdirSync as mkdirSync66, readFileSync as readFileSync88, writeFileSync as writeFileSync57 } from "fs";
|
|
866501
|
-
import { dirname as
|
|
866578
|
+
import { dirname as dirname64, resolve as resolve39 } from "path";
|
|
866502
866579
|
init_state3();
|
|
866503
866580
|
var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
|
|
866504
866581
|
var VALID_SCOPES3 = ["session", "project", "team"];
|
|
@@ -866794,7 +866871,7 @@ function resolvePath4(runtime2, path7) {
|
|
|
866794
866871
|
return resolve39(runtime2.workingDirectory, path7);
|
|
866795
866872
|
}
|
|
866796
866873
|
function writeBundle(path7, bundle) {
|
|
866797
|
-
mkdirSync66(
|
|
866874
|
+
mkdirSync66(dirname64(path7), { recursive: true });
|
|
866798
866875
|
writeFileSync57(path7, `${JSON.stringify(bundle, null, 2)}
|
|
866799
866876
|
`);
|
|
866800
866877
|
}
|
|
@@ -883827,7 +883904,7 @@ function describeHarnessDelegationRoute(context, args2) {
|
|
|
883827
883904
|
|
|
883828
883905
|
// src/tools/agent-harness-keybinding-metadata.ts
|
|
883829
883906
|
import { existsSync as existsSync83, mkdirSync as mkdirSync68, readFileSync as readFileSync90, writeFileSync as writeFileSync59 } from "fs";
|
|
883830
|
-
import { dirname as
|
|
883907
|
+
import { dirname as dirname65 } from "path";
|
|
883831
883908
|
var FIXED_SHORTCUTS = [
|
|
883832
883909
|
{ key: "Enter", description: "Send prompt" },
|
|
883833
883910
|
{ key: "Shift+Enter / Ctrl+J", description: "Insert newline" },
|
|
@@ -884207,7 +884284,7 @@ function readOverrideFile(configPath) {
|
|
|
884207
884284
|
return parsed;
|
|
884208
884285
|
}
|
|
884209
884286
|
function writeOverrideFile(configPath, overrides) {
|
|
884210
|
-
mkdirSync68(
|
|
884287
|
+
mkdirSync68(dirname65(configPath), { recursive: true });
|
|
884211
884288
|
writeFileSync59(configPath, `${JSON.stringify(overrides, null, 2)}
|
|
884212
884289
|
`, "utf-8");
|
|
884213
884290
|
}
|
|
@@ -890239,6 +890316,10 @@ function activateAgentWorkspaceSelection(workspace, requestRender) {
|
|
|
890239
890316
|
workspace.applyLocalLibraryOperation(action2.localOperation);
|
|
890240
890317
|
return;
|
|
890241
890318
|
}
|
|
890319
|
+
if (action2.kind === "onboarding-complete") {
|
|
890320
|
+
workspace.completeOnboarding();
|
|
890321
|
+
return;
|
|
890322
|
+
}
|
|
890242
890323
|
if (action2.kind === "guidance" || !action2.command) {
|
|
890243
890324
|
handleGuidanceOrWorkspaceAction(workspace, action2);
|
|
890244
890325
|
return;
|
|
@@ -890965,6 +891046,17 @@ var AGENT_WORKSPACE_CATEGORIES = [
|
|
|
890965
891046
|
{ id: "review-command", label: "Review delegation command", detail: "Use the confirmed delegation form only when the user explicitly asks for code review/build execution. Include the actual task text, preserve the full original ask, and request delegated review only when asked.", kind: "guidance", safety: "delegates" },
|
|
890966
891047
|
{ id: "delegation-status", label: "Delegation status", detail: "Inspect build-delegation receipts and shared-session status without starting coding work.", command: "/delegate status", kind: "command", safety: "read-only" }
|
|
890967
891048
|
]
|
|
891049
|
+
},
|
|
891050
|
+
{
|
|
891051
|
+
id: "finish",
|
|
891052
|
+
group: "FINISH",
|
|
891053
|
+
label: "Finish",
|
|
891054
|
+
summary: "Acknowledge setup and close onboarding.",
|
|
891055
|
+
detail: "Use this final step after reviewing setup. Apply & close writes the user onboarding completion marker so normal future launches start in the main conversation.",
|
|
891056
|
+
actions: [
|
|
891057
|
+
{ id: "onboarding-apply-close", label: "Apply & close", detail: "Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.", kind: "onboarding-complete", safety: "safe" },
|
|
891058
|
+
{ id: "finish-review-setup", label: "Review setup first", detail: "Jump back to setup before acknowledging onboarding as finished.", targetCategoryId: "setup", kind: "workspace", safety: "safe" }
|
|
891059
|
+
]
|
|
890968
891060
|
}
|
|
890969
891061
|
];
|
|
890970
891062
|
|
|
@@ -895834,6 +895926,45 @@ class AgentWorkspace {
|
|
|
895834
895926
|
openDeleteEditor: (kind2, selected) => this.openDeleteEditor(kind2, selected)
|
|
895835
895927
|
});
|
|
895836
895928
|
}
|
|
895929
|
+
completeOnboarding() {
|
|
895930
|
+
const shellPaths3 = this.context?.workspace?.shellPaths;
|
|
895931
|
+
if (!shellPaths3) {
|
|
895932
|
+
this.status = "Cannot complete onboarding without Agent shell paths.";
|
|
895933
|
+
this.lastActionResult = {
|
|
895934
|
+
kind: "error",
|
|
895935
|
+
title: "Onboarding completion unavailable",
|
|
895936
|
+
detail: "The Agent workspace cannot locate the user onboarding completion marker path for this runtime.",
|
|
895937
|
+
safety: "safe"
|
|
895938
|
+
};
|
|
895939
|
+
return;
|
|
895940
|
+
}
|
|
895941
|
+
try {
|
|
895942
|
+
writeOnboardingCheckMarker(shellPaths3, {
|
|
895943
|
+
scope: "user",
|
|
895944
|
+
source: "wizard",
|
|
895945
|
+
mode: "new",
|
|
895946
|
+
workspaceRoot: shellPaths3.workingDirectory
|
|
895947
|
+
});
|
|
895948
|
+
this.status = "Onboarding applied and closed.";
|
|
895949
|
+
this.lastActionResult = {
|
|
895950
|
+
kind: "refreshed",
|
|
895951
|
+
title: "Onboarding complete",
|
|
895952
|
+
detail: "Saved the user onboarding completion marker. Future normal launches start in the main conversation.",
|
|
895953
|
+
safety: "safe"
|
|
895954
|
+
};
|
|
895955
|
+
if (!this.context?.dismissAgentWorkspace?.())
|
|
895956
|
+
this.close();
|
|
895957
|
+
} catch (error53) {
|
|
895958
|
+
const detail = error53 instanceof Error ? error53.message : String(error53);
|
|
895959
|
+
this.status = "Onboarding completion failed.";
|
|
895960
|
+
this.lastActionResult = {
|
|
895961
|
+
kind: "error",
|
|
895962
|
+
title: "Onboarding completion failed",
|
|
895963
|
+
detail,
|
|
895964
|
+
safety: "safe"
|
|
895965
|
+
};
|
|
895966
|
+
}
|
|
895967
|
+
}
|
|
895837
895968
|
selectedItemForOperation(operation) {
|
|
895838
895969
|
if (operation.startsWith("memory-"))
|
|
895839
895970
|
return this.selectedLocalLibraryItem("memory");
|
|
@@ -902437,6 +902568,8 @@ function snapshotLines(workspace, category, snapshot2) {
|
|
|
902437
902568
|
base2.push({ text: `Automation: ${ready.length} schedule-ready routine(s); receipts ${snapshot2.routineScheduleReceiptCount}.`, fg: ready.length > 0 ? FULLSCREEN_PALETTE.good : FULLSCREEN_PALETTE.warn }, automationNextActionLine(snapshot2), compactRoutineReceiptLine(snapshot2), { text: "Reminders and routine promotion require confirmation.", fg: FULLSCREEN_PALETTE.warn });
|
|
902438
902569
|
} else if (category.id === "delegate") {
|
|
902439
902570
|
base2.push({ text: "Build/fix/review work is handed to GoodVibes TUI.", fg: FULLSCREEN_PALETTE.info }, { text: `Delegated review policy: ${snapshot2.delegatedReviewPolicy}`, fg: FULLSCREEN_PALETTE.warn }, { text: "No coding-role Agent jobs are created here.", fg: FULLSCREEN_PALETTE.good });
|
|
902571
|
+
} else if (category.id === "finish") {
|
|
902572
|
+
base2.push({ text: "Apply & close marks onboarding finished for this user.", fg: FULLSCREEN_PALETTE.good }, { text: "Future normal launches start in the main conversation.", fg: FULLSCREEN_PALETTE.info }, { text: "Use /agent, /setup, or /onboarding to reopen this workspace later.", fg: FULLSCREEN_PALETTE.muted });
|
|
902440
902573
|
}
|
|
902441
902574
|
if (snapshot2.warnings.length > 0) {
|
|
902442
902575
|
base2.push({ text: `Warnings: ${snapshot2.warnings.map((warning) => compactText3(warning, 60)).join("; ")}`, fg: FULLSCREEN_PALETTE.warn });
|
|
@@ -903767,8 +903900,6 @@ function applyInitialTuiCliState(options) {
|
|
|
903767
903900
|
}
|
|
903768
903901
|
} else if (!globalOnboardingMarker.exists) {
|
|
903769
903902
|
input.openAgentWorkspace(commandContext);
|
|
903770
|
-
} else if (cli.command === "tui" && seededPrompt === undefined) {
|
|
903771
|
-
input.openAgentWorkspace(commandContext);
|
|
903772
903903
|
}
|
|
903773
903904
|
if (seededPrompt) {
|
|
903774
903905
|
input.prompt = seededPrompt;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
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",
|
package/src/cli/tui-startup.ts
CHANGED
|
@@ -110,8 +110,6 @@ export function applyInitialTuiCliState(options: {
|
|
|
110
110
|
}
|
|
111
111
|
} else if (!globalOnboardingMarker.exists) {
|
|
112
112
|
input.openAgentWorkspace(commandContext);
|
|
113
|
-
} else if (cli.command === 'tui' && seededPrompt === undefined) {
|
|
114
|
-
input.openAgentWorkspace(commandContext);
|
|
115
113
|
}
|
|
116
114
|
|
|
117
115
|
if (seededPrompt) {
|
|
@@ -36,6 +36,7 @@ interface AgentWorkspaceActivationHost {
|
|
|
36
36
|
moveLocalLibraryItemSelection(kind: AgentWorkspaceLocalEditorKind, delta: number): void;
|
|
37
37
|
selectedLocalLibraryItem(kind: AgentWorkspaceLocalEditorKind): AgentWorkspaceLocalLibraryItem | null;
|
|
38
38
|
applyLocalLibraryOperation(operation: AgentWorkspaceLocalOperation): void;
|
|
39
|
+
completeOnboarding(): void;
|
|
39
40
|
hasCommandDispatch(): boolean;
|
|
40
41
|
dispatchWorkspaceCommand: AgentWorkspaceCommandDispatcher;
|
|
41
42
|
commitActionSearchSelection(): boolean;
|
|
@@ -89,6 +90,10 @@ export function activateAgentWorkspaceSelection(
|
|
|
89
90
|
workspace.applyLocalLibraryOperation(action.localOperation);
|
|
90
91
|
return;
|
|
91
92
|
}
|
|
93
|
+
if (action.kind === 'onboarding-complete') {
|
|
94
|
+
workspace.completeOnboarding();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
92
97
|
if (action.kind === 'guidance' || !action.command) {
|
|
93
98
|
handleGuidanceOrWorkspaceAction(workspace, action);
|
|
94
99
|
return;
|
|
@@ -609,6 +609,17 @@ export const AGENT_WORKSPACE_CATEGORIES: readonly AgentWorkspaceCategory[] = [
|
|
|
609
609
|
{ id: 'delegation-status', label: 'Delegation status', detail: 'Inspect build-delegation receipts and shared-session status without starting coding work.', command: '/delegate status', kind: 'command', safety: 'read-only' },
|
|
610
610
|
],
|
|
611
611
|
},
|
|
612
|
+
{
|
|
613
|
+
id: 'finish',
|
|
614
|
+
group: 'FINISH',
|
|
615
|
+
label: 'Finish',
|
|
616
|
+
summary: 'Acknowledge setup and close onboarding.',
|
|
617
|
+
detail: 'Use this final step after reviewing setup. Apply & close writes the user onboarding completion marker so normal future launches start in the main conversation.',
|
|
618
|
+
actions: [
|
|
619
|
+
{ id: 'onboarding-apply-close', label: 'Apply & close', detail: 'Acknowledge onboarding as finished, persist the user completion marker, and close the fullscreen Agent workspace.', kind: 'onboarding-complete', safety: 'safe' },
|
|
620
|
+
{ id: 'finish-review-setup', label: 'Review setup first', detail: 'Jump back to setup before acknowledging onboarding as finished.', targetCategoryId: 'setup', kind: 'workspace', safety: 'safe' },
|
|
621
|
+
],
|
|
622
|
+
},
|
|
612
623
|
];
|
|
613
624
|
|
|
614
625
|
export function renderAgentWorkspacePackageText(): string {
|
|
@@ -27,11 +27,12 @@ export const AGENT_WORKSPACE_CATEGORY_IDS = [
|
|
|
27
27
|
'host',
|
|
28
28
|
'automation',
|
|
29
29
|
'delegate',
|
|
30
|
+
'finish',
|
|
30
31
|
] as const;
|
|
31
32
|
|
|
32
33
|
export type AgentWorkspaceCategoryId = (typeof AGENT_WORKSPACE_CATEGORY_IDS)[number];
|
|
33
34
|
|
|
34
|
-
export type AgentWorkspaceActionKind = 'command' | 'guidance' | 'workspace' | 'editor' | 'local-selection' | 'local-operation';
|
|
35
|
+
export type AgentWorkspaceActionKind = 'command' | 'guidance' | 'workspace' | 'editor' | 'local-selection' | 'local-operation' | 'onboarding-complete';
|
|
35
36
|
|
|
36
37
|
export type AgentWorkspaceLocalEditorKind = 'memory' | 'note' | 'persona' | 'skill' | 'routine' | 'profile';
|
|
37
38
|
|
|
@@ -20,6 +20,7 @@ import { buildAgentWorkspaceRequirements } from './agent-workspace-requirements.
|
|
|
20
20
|
import { appendAgentWorkspaceActionSearchText, backspaceAgentWorkspaceActionSearch, beginAgentWorkspaceActionSearch, clearAgentWorkspaceActionSearch, commitAgentWorkspaceActionSearchSelection, searchAgentWorkspaceActions } from './agent-workspace-search.ts';
|
|
21
21
|
import { buildAgentWorkspaceRuntimeSnapshot } from './agent-workspace-snapshot.ts';
|
|
22
22
|
import type { AgentWorkspaceAction, AgentWorkspaceActionResult, AgentWorkspaceActionSearchResult, AgentWorkspaceCategory, AgentWorkspaceCommandDispatcher, AgentWorkspaceEditorField, AgentWorkspaceFocusPane, AgentWorkspaceLocalEditor, AgentWorkspaceLocalEditorKind, AgentWorkspaceLocalLibraryItem, AgentWorkspaceLocalOperation, AgentWorkspacePromptDispatcher, AgentWorkspaceRuntimeSnapshot } from './agent-workspace-types.ts';
|
|
23
|
+
import { writeOnboardingCheckMarker } from '../runtime/onboarding/index.ts';
|
|
23
24
|
|
|
24
25
|
export type { AgentWorkspaceChannelRisk, AgentWorkspaceChannelStatus } from './agent-workspace-channels.ts';
|
|
25
26
|
export type { AgentWorkspaceAction, AgentWorkspaceActionResult, AgentWorkspaceActionSearchResult, AgentWorkspaceCategory, AgentWorkspaceCategoryId, AgentWorkspaceCommandDispatcher, AgentWorkspaceEditorField, AgentWorkspaceFocusPane, AgentWorkspaceLocalEditor, AgentWorkspaceLocalEditorKind, AgentWorkspaceLocalLibraryItem, AgentWorkspaceLocalOperation, AgentWorkspacePromptDispatcher, AgentWorkspaceRuntimeSnapshot } from './agent-workspace-types.ts';
|
|
@@ -306,6 +307,46 @@ export class AgentWorkspace {
|
|
|
306
307
|
});
|
|
307
308
|
}
|
|
308
309
|
|
|
310
|
+
completeOnboarding(): void {
|
|
311
|
+
const shellPaths = this.context?.workspace?.shellPaths;
|
|
312
|
+
if (!shellPaths) {
|
|
313
|
+
this.status = 'Cannot complete onboarding without Agent shell paths.';
|
|
314
|
+
this.lastActionResult = {
|
|
315
|
+
kind: 'error',
|
|
316
|
+
title: 'Onboarding completion unavailable',
|
|
317
|
+
detail: 'The Agent workspace cannot locate the user onboarding completion marker path for this runtime.',
|
|
318
|
+
safety: 'safe',
|
|
319
|
+
};
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
writeOnboardingCheckMarker(shellPaths, {
|
|
325
|
+
scope: 'user',
|
|
326
|
+
source: 'wizard',
|
|
327
|
+
mode: 'new',
|
|
328
|
+
workspaceRoot: shellPaths.workingDirectory,
|
|
329
|
+
});
|
|
330
|
+
this.status = 'Onboarding applied and closed.';
|
|
331
|
+
this.lastActionResult = {
|
|
332
|
+
kind: 'refreshed',
|
|
333
|
+
title: 'Onboarding complete',
|
|
334
|
+
detail: 'Saved the user onboarding completion marker. Future normal launches start in the main conversation.',
|
|
335
|
+
safety: 'safe',
|
|
336
|
+
};
|
|
337
|
+
if (!this.context?.dismissAgentWorkspace?.()) this.close();
|
|
338
|
+
} catch (error) {
|
|
339
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
340
|
+
this.status = 'Onboarding completion failed.';
|
|
341
|
+
this.lastActionResult = {
|
|
342
|
+
kind: 'error',
|
|
343
|
+
title: 'Onboarding completion failed',
|
|
344
|
+
detail,
|
|
345
|
+
safety: 'safe',
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
309
350
|
private selectedItemForOperation(operation: AgentWorkspaceLocalOperation): AgentWorkspaceLocalLibraryItem | null {
|
|
310
351
|
if (operation.startsWith('memory-')) return this.selectedLocalLibraryItem('memory');
|
|
311
352
|
if (operation.startsWith('note-')) return this.selectedLocalLibraryItem('note');
|
|
@@ -408,6 +408,12 @@ function snapshotLines(workspace: AgentWorkspace, category: AgentWorkspaceCatego
|
|
|
408
408
|
{ text: `Delegated review policy: ${snapshot.delegatedReviewPolicy}`, fg: PALETTE.warn },
|
|
409
409
|
{ text: 'No coding-role Agent jobs are created here.', fg: PALETTE.good },
|
|
410
410
|
);
|
|
411
|
+
} else if (category.id === 'finish') {
|
|
412
|
+
base.push(
|
|
413
|
+
{ text: 'Apply & close marks onboarding finished for this user.', fg: PALETTE.good },
|
|
414
|
+
{ text: 'Future normal launches start in the main conversation.', fg: PALETTE.info },
|
|
415
|
+
{ text: 'Use /agent, /setup, or /onboarding to reopen this workspace later.', fg: PALETTE.muted },
|
|
416
|
+
);
|
|
411
417
|
}
|
|
412
418
|
if (snapshot.warnings.length > 0) {
|
|
413
419
|
base.push({ text: `Warnings: ${snapshot.warnings.map((warning) => compactText(warning, 60)).join('; ')}`, fg: PALETTE.warn });
|
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.1.0';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|
|
12
12
|
readonly version?: unknown;
|