@pellux/goodvibes-agent 1.8.0 → 1.8.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 CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  Product-facing release notes for GoodVibes Agent.
4
4
 
5
+ ## 1.8.1 - 2026-07-09
6
+
7
+ - Fixes every ws-only control-plane verb (fleet, checkpoints, session search, push) answering 501 'Gateway method is not invokable' on the vendored daemon — handlers are now attached at runtime construction, with a release gate that invokes them end-to-end.
8
+
5
9
  ## 1.8.0 - 2026-07-09
6
10
 
7
11
  - Adopts platform SDK 1.6.1.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # GoodVibes Agent
2
2
 
3
3
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
4
- [![Version: 1.5.3](https://img.shields.io/badge/version-1.8.0-blue.svg)](#install)
4
+ [![Version: 1.5.3](https://img.shields.io/badge/version-1.8.1-blue.svg)](#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
 
@@ -465260,6 +465260,23 @@ function createSchema2(db) {
465260
465260
  )
465261
465261
  `);
465262
465262
  }
465263
+ function getKnowledgeSchemaStatements() {
465264
+ const statements = [];
465265
+ createSchema2({
465266
+ run(sql) {
465267
+ const normalized = sql.trim();
465268
+ if (normalized.length > 0)
465269
+ statements.push(normalized);
465270
+ }
465271
+ });
465272
+ return statements;
465273
+ }
465274
+ function renderKnowledgeSchemaSql() {
465275
+ return `${getKnowledgeSchemaStatements().map((statement) => statement.endsWith(";") ? statement : `${statement};`).join(`
465276
+
465277
+ `)}
465278
+ `;
465279
+ }
465263
465280
  function rowObject(columns, values2) {
465264
465281
  return Object.fromEntries(columns.map((column, index) => [column, values2[index]]));
465265
465282
  }
@@ -778632,6 +778649,9 @@ var init_ingest = __esm(() => {
778632
778649
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/browser-history/index.js
778633
778650
  var init_browser_history = __esm(() => {
778634
778651
  init_ingest();
778652
+ init_discover();
778653
+ init_readers();
778654
+ init_paths2();
778635
778655
  });
778636
778656
 
778637
778657
  // node_modules/graphql/jsutils/devAssert.mjs
@@ -796506,6 +796526,7 @@ var init_semantic = __esm(() => {
796506
796526
  init_llm();
796507
796527
  init_gap_repair();
796508
796528
  init_service5();
796529
+ init_self_improvement();
796509
796530
  });
796510
796531
 
796511
796532
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/helpers.js
@@ -800474,8 +800495,40 @@ var init_map_view = __esm(() => {
800474
800495
  });
800475
800496
 
800476
800497
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/home-graph/types.js
800477
- var HOME_GRAPH_CAPABILITIES;
800498
+ var HOME_GRAPH_NODE_KINDS, HOME_GRAPH_RELATIONS, HOME_GRAPH_CAPABILITIES;
800478
800499
  var init_types15 = __esm(() => {
800500
+ HOME_GRAPH_NODE_KINDS = [
800501
+ "ha_home",
800502
+ "ha_entity",
800503
+ "ha_device",
800504
+ "ha_area",
800505
+ "ha_automation",
800506
+ "ha_script",
800507
+ "ha_scene",
800508
+ "ha_label",
800509
+ "ha_integration",
800510
+ "ha_room",
800511
+ "ha_device_passport",
800512
+ "ha_maintenance_item",
800513
+ "ha_troubleshooting_case",
800514
+ "ha_purchase",
800515
+ "ha_network_node"
800516
+ ];
800517
+ HOME_GRAPH_RELATIONS = [
800518
+ "controls",
800519
+ "located_in",
800520
+ "belongs_to_device",
800521
+ "has_manual",
800522
+ "has_receipt",
800523
+ "has_warranty",
800524
+ "has_issue",
800525
+ "fixed_by",
800526
+ "uses_battery",
800527
+ "connected_via",
800528
+ "part_of_network",
800529
+ "mentioned_by",
800530
+ "source_for"
800531
+ ];
800479
800532
  HOME_GRAPH_CAPABILITIES = [
800480
800533
  "knowledge-space-isolation",
800481
800534
  "snapshot-sync",
@@ -802266,6 +802319,7 @@ var init_service6 = __esm(() => {
802266
802319
  var init_home_graph = __esm(() => {
802267
802320
  init_service6();
802268
802321
  init_extension();
802322
+ init_types15();
802269
802323
  });
802270
802324
 
802271
802325
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/store-record-delete.js
@@ -804690,10 +804744,14 @@ var init_service7 = __esm(() => {
804690
804744
  var init_project_planning = __esm(() => {
804691
804745
  init_service7();
804692
804746
  init_helpers3();
804747
+ init_readiness();
804693
804748
  });
804694
804749
 
804695
804750
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/persistence.js
804696
- var init_persistence = () => {};
804751
+ var init_persistence = __esm(() => {
804752
+ init_store_schema();
804753
+ init_store_load();
804754
+ });
804697
804755
 
804698
804756
  // node_modules/@pellux/goodvibes-sdk/dist/platform/knowledge/projections.js
804699
804757
  class KnowledgeProjectionService {
@@ -808247,21 +808305,21 @@ var init_service8 = __esm(() => {
808247
808305
  var exports_knowledge = {};
808248
808306
  __export(exports_knowledge, {
808249
808307
  withKnowledgeSpace: () => withKnowledgeSpace,
808250
- uniqKnowledgeValues: () => uniq3,
808251
- stabilizeKnowledgeText: () => stableText2,
808252
- runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement2,
808308
+ uniqKnowledgeValues: () => uniq2,
808309
+ stabilizeKnowledgeText: () => stableText,
808310
+ runKnowledgeSemanticSelfImprovement: () => runKnowledgeSemanticSelfImprovement,
808253
808311
  resolveProjectPlanningSpace: () => resolveProjectPlanningSpace,
808254
- resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir2,
808312
+ resolveKnowledgeDbPathFromControlPlaneDir: () => resolveKnowledgeDbPathFromControlPlaneDir,
808255
808313
  renderPacket: () => renderPacket,
808256
808314
  renderKnowledgeSchemaSql: () => renderKnowledgeSchemaSql,
808257
808315
  renderKnowledgeMap: () => renderKnowledgeMap,
808258
808316
  readKnowledgeSearchText: () => readKnowledgeSearchText,
808259
- readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile2,
808317
+ readBrowserKnowledgeProfile: () => readBrowserKnowledgeProfile,
808260
808318
  projectPlanningSourceId: () => projectPlanningSourceId,
808261
808319
  projectPlanningProjectIdFromPath: () => projectPlanningProjectIdFromPath,
808262
808320
  projectPlanningCanonicalUri: () => projectPlanningCanonicalUri,
808263
808321
  projectKnowledgeSpaceId: () => projectKnowledgeSpaceId,
808264
- parseKnowledgeJsonValue: () => parseJsonValue2,
808322
+ parseKnowledgeJsonValue: () => parseJsonValue,
808265
808323
  normalizeProjectId: () => normalizeProjectId,
808266
808324
  normalizeKnowledgeSpaceId: () => normalizeKnowledgeSpaceId,
808267
808325
  normalizeHomeAssistantInstallationId: () => normalizeHomeAssistantInstallationId,
@@ -808269,12 +808327,12 @@ __export(exports_knowledge, {
808269
808327
  materializeGeneratedKnowledgeProjection: () => materializeGeneratedKnowledgeProjection,
808270
808328
  looksLikeRawPdfPayload: () => looksLikeRawPdfPayload,
808271
808329
  looksBinaryLikeText: () => looksBinaryLikeText,
808272
- loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot2,
808330
+ loadKnowledgeStoreSnapshot: () => loadKnowledgeStoreSnapshot,
808273
808331
  listGeneratedKnowledgePages: () => listGeneratedKnowledgePages,
808274
- listBrowserKinds: () => listBrowserKinds2,
808332
+ listBrowserKinds: () => listBrowserKinds,
808275
808333
  knowledgeSpaceMetadata: () => knowledgeSpaceMetadata,
808276
808334
  knowledgePageSourceWeight: () => knowledgePageSourceWeight,
808277
- knowledgeNowMs: () => nowMs2,
808335
+ knowledgeNowMs: () => nowMs,
808278
808336
  knowledgeExtractionNeedsRefresh: () => knowledgeExtractionNeedsRefresh,
808279
808337
  isUsefulKnowledgePageSourceCandidate: () => isUsefulKnowledgePageSourceCandidate,
808280
808338
  isUsefulKnowledgePageSource: () => isUsefulKnowledgePageSource,
@@ -808294,12 +808352,12 @@ __export(exports_knowledge, {
808294
808352
  generatedKnowledgeSourceId: () => generatedKnowledgeSourceId,
808295
808353
  generatedKnowledgeCanonicalUri: () => generatedKnowledgeCanonicalUri,
808296
808354
  extractKnowledgeArtifact: () => extractKnowledgeArtifact,
808297
- evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness2,
808298
- discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles2,
808355
+ evaluateProjectPlanningReadiness: () => evaluateProjectPlanningReadiness,
808356
+ discoverBrowserKnowledgeProfiles: () => discoverBrowserKnowledgeProfiles,
808299
808357
  createWebKnowledgeGapRepairer: () => createWebKnowledgeGapRepairer,
808300
808358
  createProviderBackedKnowledgeSemanticLlm: () => createProviderBackedKnowledgeSemanticLlm,
808301
808359
  createMemoryApi: () => createMemoryApi,
808302
- createKnowledgeSchema: () => createSchema3,
808360
+ createKnowledgeSchema: () => createSchema2,
808303
808361
  createKnowledgeApi: () => createKnowledgeApi,
808304
808362
  createDefaultKnowledgeConnectorRegistry: () => createDefaultKnowledgeConnectorRegistry,
808305
808363
  compareKnowledgePageSources: () => compareKnowledgePageSources,
@@ -810772,7 +810830,7 @@ var init_delivery_manager = __esm(() => {
810772
810830
  });
810773
810831
 
810774
810832
  // node_modules/@pellux/goodvibes-sdk/dist/platform/automation/scheduler-capacity.js
810775
- function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
810833
+ function computeSchedulerCapacity(slotsTotal, runs, nowMs2 = Date.now()) {
810776
810834
  let slotsInUse = 0;
810777
810835
  const queuedRuns = [];
810778
810836
  for (const run7 of runs) {
@@ -810782,7 +810840,7 @@ function computeSchedulerCapacity(slotsTotal, runs, nowMs3 = Date.now()) {
810782
810840
  queuedRuns.push(run7);
810783
810841
  }
810784
810842
  const queueDepth = queuedRuns.length;
810785
- const oldestQueuedAgeMs = queueDepth > 0 ? nowMs3 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
810843
+ const oldestQueuedAgeMs = queueDepth > 0 ? nowMs2 - Math.min(...queuedRuns.map((r6) => r6.queuedAt)) : null;
810786
810844
  return { slotsTotal, slotsInUse, queueDepth, oldestQueuedAgeMs };
810787
810845
  }
810788
810846
 
@@ -838414,7 +838472,7 @@ var createStyledCell = (char, overrides = {}) => ({
838414
838472
  // src/version.ts
838415
838473
  import { readFileSync } from "fs";
838416
838474
  import { join } from "path";
838417
- var _version = "1.8.0";
838475
+ var _version = "1.8.1";
838418
838476
  try {
838419
838477
  const pkg = JSON.parse(readFileSync(join(import.meta.dir, "..", "package.json"), "utf-8"));
838420
838478
  _version = typeof pkg.version === "string" ? pkg.version : _version;
@@ -863622,7 +863680,7 @@ var WORK_PLAN_STATUSES = [
863622
863680
  "failed",
863623
863681
  "cancelled"
863624
863682
  ];
863625
- function nowMs3() {
863683
+ function nowMs2() {
863626
863684
  return Date.now();
863627
863685
  }
863628
863686
  function isObject4(value) {
@@ -863728,7 +863786,7 @@ class WorkPlanStore {
863728
863786
  if (!normalizedTitle)
863729
863787
  throw new Error("Work plan item title is required.");
863730
863788
  const plan = this.readPlan();
863731
- const time4 = nowMs3();
863789
+ const time4 = nowMs2();
863732
863790
  const item = {
863733
863791
  id: createItemId(),
863734
863792
  title: normalizedTitle,
@@ -863752,7 +863810,7 @@ class WorkPlanStore {
863752
863810
  updateItem(idOrPrefix, patch2) {
863753
863811
  const plan = this.readPlan();
863754
863812
  const item = this.resolveItem(plan, idOrPrefix);
863755
- const time4 = nowMs3();
863813
+ const time4 = nowMs2();
863756
863814
  const nextStatus = patch2.status ?? item.status;
863757
863815
  const next = this.pruneItem({
863758
863816
  ...item,
@@ -863785,7 +863843,7 @@ class WorkPlanStore {
863785
863843
  removeItem(idOrPrefix) {
863786
863844
  const plan = this.readPlan();
863787
863845
  const item = this.resolveItem(plan, idOrPrefix);
863788
- const time4 = nowMs3();
863846
+ const time4 = nowMs2();
863789
863847
  const remaining = plan.items.filter((candidate) => candidate.id !== item.id);
863790
863848
  this.writePlan({
863791
863849
  ...plan,
@@ -863805,7 +863863,7 @@ class WorkPlanStore {
863805
863863
  ...plan,
863806
863864
  items: remaining,
863807
863865
  activeItemId: remaining[0]?.id,
863808
- updatedAt: nowMs3()
863866
+ updatedAt: nowMs2()
863809
863867
  });
863810
863868
  return removed;
863811
863869
  }
@@ -863844,7 +863902,7 @@ class WorkPlanStore {
863844
863902
  const parsed = JSON.parse(raw);
863845
863903
  if (!isObject4(parsed))
863846
863904
  return this.createEmptyPlan();
863847
- const time4 = nowMs3();
863905
+ const time4 = nowMs2();
863848
863906
  const createdAt = typeof parsed.createdAt === "number" ? parsed.createdAt : time4;
863849
863907
  const updatedAt = typeof parsed.updatedAt === "number" ? parsed.updatedAt : createdAt;
863850
863908
  const items = Array.isArray(parsed.items) ? parsed.items.map((item) => normalizeItem(item, createdAt)).filter((item) => item !== null) : [];
@@ -863863,7 +863921,7 @@ class WorkPlanStore {
863863
863921
  };
863864
863922
  }
863865
863923
  createEmptyPlan() {
863866
- const time4 = nowMs3();
863924
+ const time4 = nowMs2();
863867
863925
  return {
863868
863926
  id: createPlanId(this.options.projectId, this.options.projectRoot),
863869
863927
  projectId: this.options.projectId,
@@ -864683,6 +864741,14 @@ function createRuntimeServices2(options) {
864683
864741
  const workspaceCheckpointManager = new WorkspaceCheckpointManager({
864684
864742
  workspaceRoot: workingDirectory
864685
864743
  });
864744
+ registerGatewayVerbGroups(gatewayMethods, {
864745
+ processRegistry,
864746
+ workspaceCheckpointManager,
864747
+ sessionBroker,
864748
+ secretsManager,
864749
+ approvalBroker,
864750
+ shellPaths
864751
+ });
864686
864752
  return {
864687
864753
  workingDirectory,
864688
864754
  homeDirectory,
@@ -895677,13 +895743,13 @@ init_state();
895677
895743
 
895678
895744
  // src/input/commands/recall-shared.ts
895679
895745
  var VALID_CLASSES = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
895680
- var VALID_SCOPES2 = ["session", "project", "team"];
895746
+ var VALID_SCOPES = ["session", "project", "team"];
895681
895747
  var VALID_REVIEW_STATES = ["fresh", "reviewed", "stale", "contradicted"];
895682
895748
  function isValidClass(s4) {
895683
895749
  return VALID_CLASSES.includes(s4);
895684
895750
  }
895685
895751
  function isValidScope(s4) {
895686
- return VALID_SCOPES2.includes(s4);
895752
+ return VALID_SCOPES.includes(s4);
895687
895753
  }
895688
895754
  function isValidReviewState(s4) {
895689
895755
  return VALID_REVIEW_STATES.includes(s4);
@@ -895726,7 +895792,7 @@ function handleRecallSearch(args2, context) {
895726
895792
  if (isValidScope(scope))
895727
895793
  filter.scope = scope;
895728
895794
  else {
895729
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
895795
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
895730
895796
  return;
895731
895797
  }
895732
895798
  }
@@ -895901,7 +895967,7 @@ function handleRecallList(args2, context) {
895901
895967
  if (scopeIdx !== -1 && args2[scopeIdx + 1]) {
895902
895968
  const scope = args2[scopeIdx + 1];
895903
895969
  if (!isValidScope(scope)) {
895904
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
895970
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
895905
895971
  return;
895906
895972
  }
895907
895973
  filter.scope = scope;
@@ -895951,7 +896017,7 @@ async function handleRecallAdd(args2, context) {
895951
896017
  const tags = tagsRaw ? tagsRaw.split(",").map((token) => token.trim()).filter(Boolean) : [];
895952
896018
  const scope = scopeRaw && isValidScope(scopeRaw) ? scopeRaw : "project";
895953
896019
  if (scopeRaw && !isValidScope(scopeRaw)) {
895954
- context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES2.join(", ")}.`);
896020
+ context.print(`[memory] Invalid scope "${scopeRaw}". Valid values ${VALID_SCOPES.join(", ")}.`);
895955
896021
  return;
895956
896022
  }
895957
896023
  const provenance = [];
@@ -896086,7 +896152,7 @@ function handleRecallExport(args2, context) {
896086
896152
  if (scopeIdx !== -1 && commandArgs[scopeIdx + 1]) {
896087
896153
  const scope = commandArgs[scopeIdx + 1];
896088
896154
  if (!isValidScope(scope)) {
896089
- context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES2.join(", ")}.`);
896155
+ context.print(`[memory] Unknown scope "${scope}". Valid values ${VALID_SCOPES.join(", ")}.`);
896090
896156
  return;
896091
896157
  }
896092
896158
  filter.scope = scope;
@@ -896165,7 +896231,7 @@ function handleRecallHandoffExport(args2, context) {
896165
896231
  const scopeIdx = commandArgs.indexOf("--scope");
896166
896232
  const scopeRaw = scopeIdx !== -1 ? commandArgs[scopeIdx + 1] : "team";
896167
896233
  if (!scopeRaw || !isValidScope(scopeRaw)) {
896168
- context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES2.join(", ")}.`);
896234
+ context.print(`[memory] Unknown scope "${scopeRaw ?? ""}". Valid values ${VALID_SCOPES.join(", ")}.`);
896169
896235
  return;
896170
896236
  }
896171
896237
  const bundle = memory.exportBundle({ scope: scopeRaw });
@@ -896281,7 +896347,7 @@ function handleRecallPromote(args2, context) {
896281
896347
  const id = parsed.rest[0];
896282
896348
  const scope = parsed.rest[1];
896283
896349
  if (!id || !scope || !isValidScope(scope)) {
896284
- context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES2.join("|")}> --yes`);
896350
+ context.print(`[memory] Usage: /memory promote <id> <${VALID_SCOPES.join("|")}> --yes`);
896285
896351
  return;
896286
896352
  }
896287
896353
  if (!parsed.yes) {
@@ -909871,7 +909937,7 @@ async function tryWireMemoryCommand(runtime2, normalized, rest) {
909871
909937
 
909872
909938
  // src/cli/memory-command.ts
909873
909939
  var VALID_CLASSES2 = ["decision", "constraint", "incident", "pattern", "fact", "risk", "runbook", "architecture", "ownership"];
909874
- var VALID_SCOPES4 = ["session", "project", "team"];
909940
+ var VALID_SCOPES3 = ["session", "project", "team"];
909875
909941
  var VALID_REVIEW_STATES3 = ["fresh", "reviewed", "stale", "contradicted"];
909876
909942
  var VALID_PROVENANCE_KINDS = ["session", "turn", "task", "event", "file"];
909877
909943
  var VALUE_OPTIONS = new Set([
@@ -909971,7 +910037,7 @@ function isMemoryClass2(value) {
909971
910037
  return VALID_CLASSES2.includes(value);
909972
910038
  }
909973
910039
  function isMemoryScope2(value) {
909974
- return VALID_SCOPES4.includes(value);
910040
+ return VALID_SCOPES3.includes(value);
909975
910041
  }
909976
910042
  function isReviewState(value) {
909977
910043
  return VALID_REVIEW_STATES3.includes(value);
@@ -909986,7 +910052,7 @@ function requireClass(value) {
909986
910052
  }
909987
910053
  function requireScope(value) {
909988
910054
  if (!value || !isMemoryScope2(value))
909989
- throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES4.join(", ")}`);
910055
+ throw new Error(`Invalid memory scope "${value ?? ""}". Valid values ${VALID_SCOPES3.join(", ")}`);
909990
910056
  return value;
909991
910057
  }
909992
910058
  function optionalScope(value) {
@@ -964004,7 +964070,7 @@ var invokeContractRoute2 = exports_transport.invokeContractRoute;
964004
964070
  var openContractRouteStream2 = exports_transport.openContractRouteStream;
964005
964071
  var requireContractRoute2 = exports_transport.requireContractRoute;
964006
964072
  var isAbortError6 = exports_transport.isAbortError;
964007
- var openServerSentEventStream2 = exports_transport.openServerSentEventStream;
964073
+ var openServerSentEventStream3 = exports_transport.openServerSentEventStream;
964008
964074
  var createOperatorRemoteClient2 = exports_transport.createOperatorRemoteClient;
964009
964075
  var createPeerRemoteClient2 = exports_transport.createPeerRemoteClient;
964010
964076
  var buildEventSourceUrl2 = exports_transport.buildEventSourceUrl;
@@ -975678,8 +975744,8 @@ function formatDigestTime(at, from = Date.now()) {
975678
975744
  return `yesterday ${time4}`;
975679
975745
  return `${d4.toLocaleDateString(undefined, { month: "short", day: "numeric" })} ${time4}`;
975680
975746
  }
975681
- function formatRelativeTime(targetMs, nowMs4 = Date.now()) {
975682
- const diffMs = targetMs - nowMs4;
975747
+ function formatRelativeTime(targetMs, nowMs3 = Date.now()) {
975748
+ const diffMs = targetMs - nowMs3;
975683
975749
  if (diffMs <= 0)
975684
975750
  return "soon";
975685
975751
  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.8.0",
3
+ "version": "1.8.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",
@@ -9,7 +9,7 @@ import { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config';
9
9
  import { AutomationDeliveryManager, AutomationManager, AutomationRouteStore } from '@pellux/goodvibes-sdk/platform/automation';
10
10
  import { ChannelPluginRegistry, ChannelPolicyManager, RouteBindingManager, SurfaceRegistry } from '@pellux/goodvibes-sdk/platform/channels';
11
11
  import { ChannelDeliveryRouter } from '@pellux/goodvibes-sdk/platform/channels';
12
- import { ApprovalBroker, GatewayMethodCatalog, SharedSessionBroker } from '@pellux/goodvibes-sdk/platform/control-plane';
12
+ import { ApprovalBroker, GatewayMethodCatalog, SharedSessionBroker, registerGatewayVerbGroups } from '@pellux/goodvibes-sdk/platform/control-plane';
13
13
  import type { SharedSessionRoutingIntent } from '@pellux/goodvibes-sdk/platform/control-plane';
14
14
  import { logger } from '@pellux/goodvibes-sdk/platform/utils';
15
15
  import { AGENT_SPINE_PARTICIPANT, SessionSpineClient } from '@pellux/goodvibes-sdk/platform/runtime/session-spine';
@@ -952,6 +952,21 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
952
952
  workspaceRoot: workingDirectory,
953
953
  });
954
954
 
955
+ // Attach handlers for every ws-only gateway verb group (fleet.* including
956
+ // the archive verbs, checkpoints.*, sessions.search, push.*). Without this
957
+ // call the catalog carries descriptors but no handlers, and every one of
958
+ // those verbs answers 501 "Gateway method is not invokable" — the same gap
959
+ // the companion app found on the TUI-vendored daemon. Mirrors the SDK
960
+ // runtime's composition root (goodvibes-sdk platform/runtime/services.ts).
961
+ registerGatewayVerbGroups(gatewayMethods, {
962
+ processRegistry,
963
+ workspaceCheckpointManager,
964
+ sessionBroker,
965
+ secretsManager,
966
+ approvalBroker,
967
+ shellPaths,
968
+ });
969
+
955
970
  return {
956
971
  workingDirectory,
957
972
  homeDirectory,
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.8.0';
9
+ let _version = '1.8.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;