@pellux/goodvibes-agent 1.6.0 → 1.6.1
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/README.md +1 -1
- package/dist/package/main.js +147 -39
- package/package.json +2 -2
- 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.6.1 - 2026-07-07
|
|
6
|
+
|
|
7
|
+
- Updated to SDK 1.3.2: a platform that cannot load SQLite extensions (macOS system SQLite in a compiled binary) now reports an honest capability limit instead of an error; semantic memory search states its literal fallback.
|
|
8
|
+
|
|
5
9
|
## 1.6.0 - 2026-07-07
|
|
6
10
|
|
|
7
11
|
- Spoken output now uses the SDK's shared speech engine — the same sentence batching, bounded concurrency, retry, and drain behavior as every other GoodVibes surface, from one implementation.
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# GoodVibes Agent
|
|
2
2
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
|
-
[](#install)
|
|
5
5
|
|
|
6
6
|
GoodVibes Agent is the installable autonomous operator assistant for GoodVibes. It keeps the existing terminal renderer and workspace bones, but the product goal is different from a vibecoding harness: the user should experience one assistant that can chat, plan, remember, research, schedule, send, generate, run visible agents, and operate the GoodVibes daemon contract with clear confirmation gates.
|
|
7
7
|
|
package/dist/package/main.js
CHANGED
|
@@ -4463,7 +4463,7 @@ var init_mcp = __esm(() => {
|
|
|
4463
4463
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/version.js
|
|
4464
4464
|
import { readFileSync as readFileSync3 } from "fs";
|
|
4465
4465
|
import { join as join4 } from "path";
|
|
4466
|
-
var version = "1.3.
|
|
4466
|
+
var version = "1.3.2", VERSION2;
|
|
4467
4467
|
var init_version = __esm(() => {
|
|
4468
4468
|
try {
|
|
4469
4469
|
const pkg = JSON.parse(readFileSync3(join4(import.meta.dir, "..", "..", "package.json"), "utf-8"));
|
|
@@ -45975,16 +45975,35 @@ function resolveSqliteVecPath() {
|
|
|
45975
45975
|
}
|
|
45976
45976
|
return "";
|
|
45977
45977
|
}
|
|
45978
|
+
function isExtensionLoadingRefusal(err2) {
|
|
45979
|
+
const message = err2 instanceof Error ? err2.message : String(err2);
|
|
45980
|
+
return /not authorized|omit.*load.*extension|extension loading is disabled/i.test(message);
|
|
45981
|
+
}
|
|
45978
45982
|
function loadSqliteVecExtension(db) {
|
|
45979
45983
|
const bundledPath = resolveSqliteVecPath();
|
|
45980
|
-
|
|
45981
|
-
|
|
45982
|
-
|
|
45983
|
-
|
|
45984
|
+
try {
|
|
45985
|
+
if (bundledPath) {
|
|
45986
|
+
db.loadExtension(bundledPath);
|
|
45987
|
+
} else {
|
|
45988
|
+
load(db);
|
|
45989
|
+
}
|
|
45990
|
+
} catch (err2) {
|
|
45991
|
+
if (isExtensionLoadingRefusal(err2)) {
|
|
45992
|
+
throw new SqliteVecPlatformUnsupportedError(err2 instanceof Error ? err2.message : String(err2));
|
|
45993
|
+
}
|
|
45994
|
+
throw err2;
|
|
45984
45995
|
}
|
|
45985
45996
|
}
|
|
45997
|
+
var SqliteVecPlatformUnsupportedError;
|
|
45986
45998
|
var init_sqlite_vec_loader = __esm(() => {
|
|
45987
45999
|
init_sqlite_vec();
|
|
46000
|
+
SqliteVecPlatformUnsupportedError = class SqliteVecPlatformUnsupportedError extends Error {
|
|
46001
|
+
platformLimit = true;
|
|
46002
|
+
constructor(cause) {
|
|
46003
|
+
super("this platform's SQLite does not allow loading extensions" + " (macOS system SQLite); the semantic vector index is unavailable" + ` and memory search uses literal matching. Underlying refusal: ${cause}`);
|
|
46004
|
+
this.name = "SqliteVecPlatformUnsupportedError";
|
|
46005
|
+
}
|
|
46006
|
+
};
|
|
45988
46007
|
});
|
|
45989
46008
|
|
|
45990
46009
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/state/memory-vector-store.js
|
|
@@ -46040,6 +46059,7 @@ class SqliteVecMemoryIndex {
|
|
|
46040
46059
|
enabled = false;
|
|
46041
46060
|
available = false;
|
|
46042
46061
|
error;
|
|
46062
|
+
platformLimitReason;
|
|
46043
46063
|
static rebuildBatchSize = 25;
|
|
46044
46064
|
constructor(dbPath, dimensions = MEMORY_VECTOR_DIMS, embeddingRegistry) {
|
|
46045
46065
|
this.dbPath = dbPath;
|
|
@@ -46062,8 +46082,16 @@ class SqliteVecMemoryIndex {
|
|
|
46062
46082
|
this.close();
|
|
46063
46083
|
this.available = false;
|
|
46064
46084
|
this.enabled = false;
|
|
46065
|
-
|
|
46066
|
-
|
|
46085
|
+
if (err2 instanceof SqliteVecPlatformUnsupportedError) {
|
|
46086
|
+
this.platformLimitReason = err2.message;
|
|
46087
|
+
logger.warn("Memory vector index unavailable on this platform \u2014 memory search uses literal matching", {
|
|
46088
|
+
backend: "sqlite-vec",
|
|
46089
|
+
reason: err2.message
|
|
46090
|
+
});
|
|
46091
|
+
} else {
|
|
46092
|
+
this.error = summarizeError(err2);
|
|
46093
|
+
logger.warn("Memory vector index unavailable", { backend: "sqlite-vec", error: this.error });
|
|
46094
|
+
}
|
|
46067
46095
|
}
|
|
46068
46096
|
}
|
|
46069
46097
|
stats() {
|
|
@@ -46077,7 +46105,8 @@ class SqliteVecMemoryIndex {
|
|
|
46077
46105
|
indexedRecords: this.countIndexedRecords(),
|
|
46078
46106
|
embeddingProviderId: provider?.id ?? this.embeddingRegistry.getDefaultProviderId(),
|
|
46079
46107
|
embeddingProviderLabel: provider?.label ?? `Unregistered (${this.embeddingRegistry.getDefaultProviderId()})`,
|
|
46080
|
-
...this.
|
|
46108
|
+
...this.platformLimitReason ? { platformLimitReason: this.platformLimitReason } : {},
|
|
46109
|
+
...this.error ?? (!provider && !this.platformLimitReason) ? { error: this.error ?? `Active memory embedding provider '${this.embeddingRegistry.getDefaultProviderId()}' is not registered.` } : {}
|
|
46081
46110
|
};
|
|
46082
46111
|
}
|
|
46083
46112
|
upsert(record) {
|
|
@@ -53425,6 +53454,7 @@ class CodeIndexStore {
|
|
|
53425
53454
|
db = null;
|
|
53426
53455
|
available = false;
|
|
53427
53456
|
error;
|
|
53457
|
+
platformLimitReason;
|
|
53428
53458
|
building = false;
|
|
53429
53459
|
buildStartedAtMs = null;
|
|
53430
53460
|
buildPromise = null;
|
|
@@ -53456,8 +53486,15 @@ class CodeIndexStore {
|
|
|
53456
53486
|
} catch (err2) {
|
|
53457
53487
|
this.close();
|
|
53458
53488
|
this.available = false;
|
|
53459
|
-
|
|
53460
|
-
|
|
53489
|
+
const limit2 = err2 instanceof SqliteVecPlatformUnsupportedError;
|
|
53490
|
+
if (limit2)
|
|
53491
|
+
this.platformLimitReason = err2.message;
|
|
53492
|
+
else
|
|
53493
|
+
this.error = summarizeError(err2);
|
|
53494
|
+
logger.warn(limit2 ? "Code index unavailable on this platform" : "Code index unavailable", {
|
|
53495
|
+
backend: "sqlite-vec",
|
|
53496
|
+
...limit2 ? { reason: err2.message } : { error: this.error }
|
|
53497
|
+
});
|
|
53461
53498
|
}
|
|
53462
53499
|
}
|
|
53463
53500
|
close() {
|
|
@@ -263967,7 +264004,7 @@ var FOUNDATION_METADATA;
|
|
|
263967
264004
|
var init_foundation_metadata = __esm(() => {
|
|
263968
264005
|
FOUNDATION_METADATA = {
|
|
263969
264006
|
productId: "goodvibes",
|
|
263970
|
-
productVersion: "1.3.
|
|
264007
|
+
productVersion: "1.3.2",
|
|
263971
264008
|
operatorMethodCount: 327,
|
|
263972
264009
|
operatorEventCount: 31,
|
|
263973
264010
|
peerEndpointCount: 6
|
|
@@ -263982,7 +264019,7 @@ var init_operator_contract = __esm(() => {
|
|
|
263982
264019
|
product: {
|
|
263983
264020
|
id: "goodvibes",
|
|
263984
264021
|
surface: "operator",
|
|
263985
|
-
version: "1.3.
|
|
264022
|
+
version: "1.3.2"
|
|
263986
264023
|
},
|
|
263987
264024
|
auth: {
|
|
263988
264025
|
modes: [
|
|
@@ -321121,6 +321158,9 @@ var init_operator_contract = __esm(() => {
|
|
|
321121
321158
|
},
|
|
321122
321159
|
error: {
|
|
321123
321160
|
type: "string"
|
|
321161
|
+
},
|
|
321162
|
+
platformLimitReason: {
|
|
321163
|
+
type: "string"
|
|
321124
321164
|
}
|
|
321125
321165
|
},
|
|
321126
321166
|
required: [
|
|
@@ -321318,6 +321358,9 @@ var init_operator_contract = __esm(() => {
|
|
|
321318
321358
|
},
|
|
321319
321359
|
error: {
|
|
321320
321360
|
type: "string"
|
|
321361
|
+
},
|
|
321362
|
+
platformLimitReason: {
|
|
321363
|
+
type: "string"
|
|
321321
321364
|
}
|
|
321322
321365
|
},
|
|
321323
321366
|
required: [
|
|
@@ -323750,6 +323793,9 @@ var init_operator_contract = __esm(() => {
|
|
|
323750
323793
|
},
|
|
323751
323794
|
error: {
|
|
323752
323795
|
type: "string"
|
|
323796
|
+
},
|
|
323797
|
+
platformLimitReason: {
|
|
323798
|
+
type: "string"
|
|
323753
323799
|
}
|
|
323754
323800
|
},
|
|
323755
323801
|
required: [
|
|
@@ -323830,6 +323876,9 @@ var init_operator_contract = __esm(() => {
|
|
|
323830
323876
|
},
|
|
323831
323877
|
error: {
|
|
323832
323878
|
type: "string"
|
|
323879
|
+
},
|
|
323880
|
+
platformLimitReason: {
|
|
323881
|
+
type: "string"
|
|
323833
323882
|
}
|
|
323834
323883
|
},
|
|
323835
323884
|
required: [
|
|
@@ -450930,7 +450979,8 @@ var init_operator_contract_schemas_runtime = __esm(() => {
|
|
|
450930
450979
|
indexedRecords: NUMBER_SCHEMA,
|
|
450931
450980
|
embeddingProviderId: STRING_SCHEMA,
|
|
450932
450981
|
embeddingProviderLabel: STRING_SCHEMA,
|
|
450933
|
-
error: STRING_SCHEMA
|
|
450982
|
+
error: STRING_SCHEMA,
|
|
450983
|
+
platformLimitReason: STRING_SCHEMA
|
|
450934
450984
|
}, ["backend", "enabled", "available", "path", "dimensions", "indexedRecords", "embeddingProviderId", "embeddingProviderLabel"], { additionalProperties: true });
|
|
450935
450985
|
MEMORY_DOCTOR_REPORT_SCHEMA = objectSchema({
|
|
450936
450986
|
vector: MEMORY_VECTOR_STATS_SCHEMA,
|
|
@@ -464268,6 +464318,23 @@ function createSchema2(db) {
|
|
|
464268
464318
|
)
|
|
464269
464319
|
`);
|
|
464270
464320
|
}
|
|
464321
|
+
function getKnowledgeSchemaStatements() {
|
|
464322
|
+
const statements = [];
|
|
464323
|
+
createSchema2({
|
|
464324
|
+
run(sql) {
|
|
464325
|
+
const normalized = sql.trim();
|
|
464326
|
+
if (normalized.length > 0)
|
|
464327
|
+
statements.push(normalized);
|
|
464328
|
+
}
|
|
464329
|
+
});
|
|
464330
|
+
return statements;
|
|
464331
|
+
}
|
|
464332
|
+
function renderKnowledgeSchemaSql() {
|
|
464333
|
+
return `${getKnowledgeSchemaStatements().map((statement) => statement.endsWith(";") ? statement : `${statement};`).join(`
|
|
464334
|
+
|
|
464335
|
+
`)}
|
|
464336
|
+
`;
|
|
464337
|
+
}
|
|
464271
464338
|
function rowObject(columns, values2) {
|
|
464272
464339
|
return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
|
|
464273
464340
|
}
|
|
@@ -777640,6 +777707,9 @@ var init_ingest = __esm(() => {
|
|
|
777640
777707
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
|
|
777641
777708
|
var init_browser_history = __esm(() => {
|
|
777642
777709
|
init_ingest();
|
|
777710
|
+
init_discover();
|
|
777711
|
+
init_readers();
|
|
777712
|
+
init_paths2();
|
|
777643
777713
|
});
|
|
777644
777714
|
|
|
777645
777715
|
// node_modules/graphql/jsutils/devAssert.mjs
|
|
@@ -795514,6 +795584,7 @@ var init_semantic = __esm(() => {
|
|
|
795514
795584
|
init_llm();
|
|
795515
795585
|
init_gap_repair();
|
|
795516
795586
|
init_service5();
|
|
795587
|
+
init_self_improvement();
|
|
795517
795588
|
});
|
|
795518
795589
|
|
|
795519
795590
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
|
|
@@ -799482,8 +799553,40 @@ var init_map_view = __esm(() => {
|
|
|
799482
799553
|
});
|
|
799483
799554
|
|
|
799484
799555
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
|
|
799485
|
-
var HOME_GRAPH_CAPABILITIES;
|
|
799556
|
+
var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
|
|
799486
799557
|
var init_types15 = __esm(() => {
|
|
799558
|
+
HOME_GRAPH_NODE_KINDS = [
|
|
799559
|
+
"ha_home",
|
|
799560
|
+
"ha_entity",
|
|
799561
|
+
"ha_device",
|
|
799562
|
+
"ha_area",
|
|
799563
|
+
"ha_automation",
|
|
799564
|
+
"ha_script",
|
|
799565
|
+
"ha_scene",
|
|
799566
|
+
"ha_label",
|
|
799567
|
+
"ha_integration",
|
|
799568
|
+
"ha_room",
|
|
799569
|
+
"ha_device_passport",
|
|
799570
|
+
"ha_maintenance_item",
|
|
799571
|
+
"ha_troubleshooting_case",
|
|
799572
|
+
"ha_purchase",
|
|
799573
|
+
"ha_network_node"
|
|
799574
|
+
];
|
|
799575
|
+
HOME_GRAPH_RELATIONS = [
|
|
799576
|
+
"controls",
|
|
799577
|
+
"located_in",
|
|
799578
|
+
"belongs_to_device",
|
|
799579
|
+
"has_manual",
|
|
799580
|
+
"has_receipt",
|
|
799581
|
+
"has_warranty",
|
|
799582
|
+
"has_issue",
|
|
799583
|
+
"fixed_by",
|
|
799584
|
+
"uses_battery",
|
|
799585
|
+
"connected_via",
|
|
799586
|
+
"part_of_network",
|
|
799587
|
+
"mentioned_by",
|
|
799588
|
+
"source_for"
|
|
799589
|
+
];
|
|
799487
799590
|
HOME_GRAPH_CAPABILITIES = [
|
|
799488
799591
|
"knowledge-space-isolation",
|
|
799489
799592
|
"snapshot-sync",
|
|
@@ -801274,6 +801377,7 @@ var init_service6 = __esm(() => {
|
|
|
801274
801377
|
var init_home_graph = __esm(() => {
|
|
801275
801378
|
init_service6();
|
|
801276
801379
|
init_extension();
|
|
801380
|
+
init_types15();
|
|
801277
801381
|
});
|
|
801278
801382
|
|
|
801279
801383
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-record-delete.js
|
|
@@ -803698,10 +803802,14 @@ var init_service7 = __esm(() => {
|
|
|
803698
803802
|
var init_project_planning = __esm(() => {
|
|
803699
803803
|
init_service7();
|
|
803700
803804
|
init_helpers3();
|
|
803805
|
+
init_readiness();
|
|
803701
803806
|
});
|
|
803702
803807
|
|
|
803703
803808
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
|
|
803704
|
-
var init_persistence = () => {
|
|
803809
|
+
var init_persistence = __esm(() => {
|
|
803810
|
+
init_store_schema();
|
|
803811
|
+
init_store_load();
|
|
803812
|
+
});
|
|
803705
803813
|
|
|
803706
803814
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
|
|
803707
803815
|
class KnowledgeProjectionService {
|
|
@@ -807255,21 +807363,21 @@ var init_service8 = __esm(() => {
|
|
|
807255
807363
|
var exports_knowledge = {};
|
|
807256
807364
|
__export(exports_knowledge, {
|
|
807257
807365
|
withKnowledgeSpace: () => withKnowledgeSpace,
|
|
807258
|
-
uniqKnowledgeValues: () =>
|
|
807259
|
-
stabilizeKnowledgeText: () =>
|
|
807260
|
-
runKnowledgeSemanticSelfImprovement: () =>
|
|
807366
|
+
uniqKnowledgeValues: () => uniq2,
|
|
807367
|
+
stabilizeKnowledgeText: () => stableText,
|
|
807368
|
+
runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
|
|
807261
807369
|
resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
|
|
807262
|
-
resolveKnowledgeDbPathFromControlPlaneDir: () =>
|
|
807370
|
+
resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
|
|
807263
807371
|
renderPacket: () => renderPacket,
|
|
807264
807372
|
renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
|
|
807265
807373
|
renderKnowledgeMap: () => renderKnowledgeMap,
|
|
807266
807374
|
readKnowledgeSearchText: () => readKnowledgeSearchText,
|
|
807267
|
-
readBrowserKnowledgeProfile: () =>
|
|
807375
|
+
readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
|
|
807268
807376
|
projectPlanningSourceId: () => projectPlanningSourceId,
|
|
807269
807377
|
projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
|
|
807270
807378
|
projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
|
|
807271
807379
|
projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
|
|
807272
|
-
parseKnowledgeJsonValue: () =>
|
|
807380
|
+
parseKnowledgeJsonValue: () => parseJsonValue,
|
|
807273
807381
|
normalizeProjectId: () => normalizeProjectId,
|
|
807274
807382
|
normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
|
|
807275
807383
|
normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
|
|
@@ -807277,12 +807385,12 @@ __export(exports_knowledge, {
|
|
|
807277
807385
|
materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
|
|
807278
807386
|
looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
|
|
807279
807387
|
looksBinaryLikeText: () => looksBinaryLikeText,
|
|
807280
|
-
loadKnowledgeStoreSnapshot: () =>
|
|
807388
|
+
loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
|
|
807281
807389
|
listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
|
|
807282
|
-
listBrowserKinds: () =>
|
|
807390
|
+
listBrowserKinds: () => listBrowserKinds,
|
|
807283
807391
|
knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
|
|
807284
807392
|
knowledgePageSourceWeight: () => knowledgePageSourceWeight,
|
|
807285
|
-
knowledgeNowMs: () =>
|
|
807393
|
+
knowledgeNowMs: () => nowMs,
|
|
807286
807394
|
knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
|
|
807287
807395
|
isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
|
|
807288
807396
|
isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
|
|
@@ -807302,12 +807410,12 @@ __export(exports_knowledge, {
|
|
|
807302
807410
|
generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
|
|
807303
807411
|
generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
|
|
807304
807412
|
extractKnowledgeArtifact: () => extractKnowledgeArtifact,
|
|
807305
|
-
evaluateProjectPlanningReadiness: () =>
|
|
807306
|
-
discoverBrowserKnowledgeProfiles: () =>
|
|
807413
|
+
evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
|
|
807414
|
+
discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
|
|
807307
807415
|
createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
|
|
807308
807416
|
createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
|
|
807309
807417
|
createMemoryApi: () => createMemoryApi,
|
|
807310
|
-
createKnowledgeSchema: () =>
|
|
807418
|
+
createKnowledgeSchema: () => createSchema2,
|
|
807311
807419
|
createKnowledgeApi: () => createKnowledgeApi,
|
|
807312
807420
|
createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
|
|
807313
807421
|
compareKnowledgePageSources: () => compareKnowledgePageSources,
|
|
@@ -809780,7 +809888,7 @@ var init_delivery_manager = __esm(() => {
|
|
|
809780
809888
|
});
|
|
809781
809889
|
|
|
809782
809890
|
// node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
|
|
809783
|
-
function computeSchedulerCapacity(slotsTotal, runs,
|
|
809891
|
+
function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
|
|
809784
809892
|
let slotsInUse = 0;
|
|
809785
809893
|
const queuedRuns = [];
|
|
809786
809894
|
for (const run7 of runs) {
|
|
@@ -809790,7 +809898,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
|
|
|
809790
809898
|
queuedRuns.push(run7);
|
|
809791
809899
|
}
|
|
809792
809900
|
const queueDepth = queuedRuns.length;
|
|
809793
|
-
const oldestQueuedAgeMs = queueDepth > 0 ?
|
|
809901
|
+
const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
|
|
809794
809902
|
return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
|
|
809795
809903
|
}
|
|
809796
809904
|
|
|
@@ -837016,7 +837124,7 @@ var createStyledCell = (char, overrides = {}) => ({
|
|
|
837016
837124
|
// src/version.ts
|
|
837017
837125
|
import { readFileSync } from "fs";
|
|
837018
837126
|
import { join } from "path";
|
|
837019
|
-
var _version = "1.6.
|
|
837127
|
+
var _version = "1.6.1";
|
|
837020
837128
|
try {
|
|
837021
837129
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
|
|
837022
837130
|
_version = typeof pkg.version === "string" ? pkg.version : _version;
|
|
@@ -862173,7 +862281,7 @@ var WORK_PLAN_STATUSES = [
|
|
|
862173
862281
|
"failed",
|
|
862174
862282
|
"cancelled"
|
|
862175
862283
|
];
|
|
862176
|
-
function
|
|
862284
|
+
function nowMs2() {
|
|
862177
862285
|
return Date.now();
|
|
862178
862286
|
}
|
|
862179
862287
|
function isObject4(value) {
|
|
@@ -862279,7 +862387,7 @@ class WorkPlanStore {
|
|
|
862279
862387
|
if (!normalizedTitle)
|
|
862280
862388
|
throw new Error("Work plan item title is required.");
|
|
862281
862389
|
const plan = this.readPlan();
|
|
862282
|
-
const time4 =
|
|
862390
|
+
const time4 = nowMs2();
|
|
862283
862391
|
const item = {
|
|
862284
862392
|
id: createItemId(),
|
|
862285
862393
|
title: normalizedTitle,
|
|
@@ -862303,7 +862411,7 @@ class WorkPlanStore {
|
|
|
862303
862411
|
updateItem(idOrPrefix, patch2) {
|
|
862304
862412
|
const plan = this.readPlan();
|
|
862305
862413
|
const item = this.resolveItem(plan, idOrPrefix);
|
|
862306
|
-
const time4 =
|
|
862414
|
+
const time4 = nowMs2();
|
|
862307
862415
|
const nextStatus = patch2.status ?? item.status;
|
|
862308
862416
|
const next = this.pruneItem({
|
|
862309
862417
|
...item,
|
|
@@ -862336,7 +862444,7 @@ class WorkPlanStore {
|
|
|
862336
862444
|
removeItem(idOrPrefix) {
|
|
862337
862445
|
const plan = this.readPlan();
|
|
862338
862446
|
const item = this.resolveItem(plan, idOrPrefix);
|
|
862339
|
-
const time4 =
|
|
862447
|
+
const time4 = nowMs2();
|
|
862340
862448
|
const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
|
|
862341
862449
|
this.writePlan({
|
|
862342
862450
|
...plan,
|
|
@@ -862356,7 +862464,7 @@ class WorkPlanStore {
|
|
|
862356
862464
|
...plan,
|
|
862357
862465
|
items: remaining,
|
|
862358
862466
|
activeItemId: remaining[0]?.id,
|
|
862359
|
-
updatedAt:
|
|
862467
|
+
updatedAt: nowMs2()
|
|
862360
862468
|
});
|
|
862361
862469
|
return removed;
|
|
862362
862470
|
}
|
|
@@ -862395,7 +862503,7 @@ class WorkPlanStore {
|
|
|
862395
862503
|
const parsed = JSON.parse(raw);
|
|
862396
862504
|
if (!isObject4(parsed))
|
|
862397
862505
|
return this.createEmptyPlan();
|
|
862398
|
-
const time4 =
|
|
862506
|
+
const time4 = nowMs2();
|
|
862399
862507
|
const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
|
|
862400
862508
|
const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
|
|
862401
862509
|
const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
|
|
@@ -862414,7 +862522,7 @@ class WorkPlanStore {
|
|
|
862414
862522
|
};
|
|
862415
862523
|
}
|
|
862416
862524
|
createEmptyPlan() {
|
|
862417
|
-
const time4 =
|
|
862525
|
+
const time4 = nowMs2();
|
|
862418
862526
|
return {
|
|
862419
862527
|
id: createPlanId(this.options.projectId, this.options.projectRoot),
|
|
862420
862528
|
projectId: this.options.projectId,
|
|
@@ -974227,8 +974335,8 @@ function formatDigestTime(at, from = Date.now()) {
|
|
|
974227
974335
|
return `yesterday ${time4}`;
|
|
974228
974336
|
return `${d4.toLocaleDateString(undefined, { month: "short", day: "numeric" })} ${time4}`;
|
|
974229
974337
|
}
|
|
974230
|
-
function formatRelativeTime(targetMs,
|
|
974231
|
-
const diffMs = targetMs -
|
|
974338
|
+
function formatRelativeTime(targetMs, nowMs3 = Date.now()) {
|
|
974339
|
+
const diffMs = targetMs - nowMs3;
|
|
974232
974340
|
if (diffMs <= 0)
|
|
974233
974341
|
return "soon";
|
|
974234
974342
|
const diffMin = Math.round(diffMs / 60000);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pellux/goodvibes-agent",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.1",
|
|
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",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
},
|
|
93
93
|
"dependencies": {},
|
|
94
94
|
"devDependencies": {
|
|
95
|
-
"@pellux/goodvibes-sdk": "1.3.
|
|
95
|
+
"@pellux/goodvibes-sdk": "1.3.2",
|
|
96
96
|
"sql.js": "^1.14.1",
|
|
97
97
|
"sqlite-vec": "^0.1.9",
|
|
98
98
|
"zustand": "^5.0.12",
|
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.6.
|
|
9
|
+
let _version = '1.6.1';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|
|
12
12
|
readonly version?: unknown;
|