@pellux/goodvibes-agent 1.5.7 → 1.5.9
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 +16 -3
- package/README.md +1 -1
- package/dist/package/main.js +309 -150
- package/package.json +1 -1
- package/src/agent/memory-prompt.ts +3 -3
- package/src/agent/operator-actions.ts +1 -1
- package/src/agent/prompt-context-receipts.ts +3 -3
- package/src/agent/session-registration.ts +1 -1
- package/src/agent/vibe-file.ts +5 -5
- package/src/audio/player.ts +91 -5
- package/src/audio/spoken-turn-controller.ts +281 -29
- package/src/audio/spoken-turn-wiring.ts +13 -2
- package/src/cli/local-library-command-shared.ts +1 -1
- package/src/cli/memory-command.ts +9 -6
- package/src/cli/resume-relaunch-notice.ts +1 -1
- package/src/cli/tui-startup.ts +1 -1
- package/src/config/credential-status.ts +1 -1
- package/src/config/index.ts +1 -1
- package/src/config/secrets.ts +1 -1
- package/src/core/conversation-rendering.ts +2 -2
- package/src/core/system-message-noise.ts +3 -3
- package/src/core/thinking-overlay.ts +1 -1
- package/src/input/agent-workspace-basic-command-editor-submission.ts +1 -1
- package/src/input/agent-workspace-basic-command-editors.ts +1 -1
- package/src/input/agent-workspace-calendar-connect-editor.ts +1 -1
- package/src/input/agent-workspace-calendar-oauth-editor.ts +1 -1
- package/src/input/agent-workspace-calendar-subscribe-editor.ts +1 -1
- package/src/input/agent-workspace-command-editor-engine.ts +2 -2
- package/src/input/agent-workspace-direct-editor-submission.ts +1 -1
- package/src/input/agent-workspace-email-connect-editor.ts +1 -1
- package/src/input/agent-workspace-live-counters.ts +1 -1
- package/src/input/agent-workspace-settings.ts +1 -1
- package/src/input/agent-workspace-snapshot-builders.ts +2 -2
- package/src/input/agent-workspace-snapshot-config.ts +1 -1
- package/src/input/agent-workspace-snapshot.ts +9 -9
- package/src/input/agent-workspace-types.ts +4 -4
- package/src/input/agent-workspace.ts +1 -1
- package/src/input/commands/calendar-connect-runtime.ts +1 -1
- package/src/input/commands/calendar-subscription-runtime.ts +2 -2
- package/src/input/commands/operator-actions-runtime.ts +1 -1
- package/src/input/commands/session-content.ts +1 -1
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/feed-context-factory.ts +4 -4
- package/src/input/handler-feed.ts +9 -9
- package/src/input/handler.ts +1 -1
- package/src/input/panel-paste-flood-guard.ts +3 -3
- package/src/input/settings-modal.ts +1 -1
- package/src/main.ts +28 -33
- package/src/renderer/agent-workspace-context-lines.ts +1 -1
- package/src/renderer/startup-theme-probe.ts +1 -1
- package/src/renderer/status-glyphs.ts +2 -2
- package/src/renderer/terminal-bg-probe.ts +1 -1
- package/src/renderer/terminal-escapes.ts +3 -2
- package/src/renderer/theme-mode-config.ts +2 -2
- package/src/renderer/theme.ts +4 -4
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/ui-factory.ts +1 -1
- package/src/renderer/ui-primitives.ts +2 -2
- package/src/runtime/bootstrap-core.ts +2 -2
- package/src/runtime/bootstrap.ts +3 -3
- package/src/runtime/calendar-boot-refresh.ts +1 -1
- package/src/runtime/lan-scan-consent.ts +1 -1
- package/src/runtime/services.ts +7 -7
- package/src/runtime/terminal-output-guard.ts +1 -1
- package/src/runtime/ui-services.ts +1 -1
- package/src/runtime/unhandled-rejection-guard.ts +41 -0
- package/src/shell/agent-workspace-fullscreen.ts +1 -1
- package/src/shell/terminal-focus-mode.ts +9 -9
- package/src/shell/ui-openers.ts +1 -1
- package/src/tools/agent-harness-operator-methods.ts +1 -1
- package/src/tools/agent-harness-personal-ops-discovery.ts +2 -2
- package/src/tools/agent-harness-personal-ops-lanes.ts +1 -1
- package/src/tools/agent-harness-personal-ops-types.ts +1 -1
- package/src/tools/agent-harness-prompt-context.ts +3 -3
- package/src/tools/agent-local-registry-memory.ts +1 -1
- package/src/tools/agent-operator-method-tool.ts +1 -1
- package/src/version.ts +1 -1
package/src/renderer/thinking.ts
CHANGED
|
@@ -10,7 +10,7 @@ export function renderThinkingBlock(text: string, width: number): Line[] {
|
|
|
10
10
|
// light terminal. In dark mode the accent adopts the shared reasoning purple
|
|
11
11
|
// (state.reasoning) and the body adopts chrome.faint (== fg.dim) — a small,
|
|
12
12
|
// deliberate convergence to the reference tokens from the agent's prior local
|
|
13
|
-
// BORDERS.THINKING.color / COLORS.DIM_TEXT (see the
|
|
13
|
+
// BORDERS.THINKING.color / COLORS.DIM_TEXT (see the visible-changes note).
|
|
14
14
|
const t = activeUiTones();
|
|
15
15
|
return renderConversationNotice(
|
|
16
16
|
text,
|
|
@@ -259,7 +259,7 @@ export class UIFactory {
|
|
|
259
259
|
if (inp > 0 || out > 0) {
|
|
260
260
|
statusTokens.push({ text: `↑${fmtNum(inp)} ↓${fmtNum(out)}`, fg: '240' });
|
|
261
261
|
}
|
|
262
|
-
//
|
|
262
|
+
// The disconnected footer 'waiting for your approval' token is retired
|
|
263
263
|
// here — the approval-wait truth now lives in the unified waiting state of the
|
|
264
264
|
// thinking indicator (createThinkingFragment's approvalPending path) and in the
|
|
265
265
|
// permission prompt itself, so the footer no longer carries a separate,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
2
|
// ui-primitives.ts — glyph registry + tone-token table.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
4
|
+
// These four tables (GLYPHS, UI_TONES, DIFF_TONES, SPINNER_FRAMES) are
|
|
5
5
|
// no longer minted locally. They are the SDK presentation contract
|
|
6
|
-
// (@pellux/goodvibes-sdk/platform/presentation
|
|
6
|
+
// (@pellux/goodvibes-sdk/platform/presentation), consumed here
|
|
7
7
|
// so the agent and the TUI share ONE source (Mike's move-to-SDK ruling —
|
|
8
8
|
// machinery needed by 2+ surfaces => SDK). See
|
|
9
9
|
// docs/decisions/2026-07-05-presentation-contract-sdk-extraction.md in the SDK.
|
|
@@ -348,7 +348,7 @@ export async function initializeBootstrapCore(
|
|
|
348
348
|
memoryStore.close();
|
|
349
349
|
});
|
|
350
350
|
|
|
351
|
-
//
|
|
351
|
+
// Fold the agent's legacy per-surface memory into the canonical
|
|
352
352
|
// cross-surface store (id-keyed, idempotent, never deletes the legacy file) and
|
|
353
353
|
// SURFACE the fold report — migration honesty requires that what moved is visible,
|
|
354
354
|
// not silently swallowed. Non-fatal: a fold failure must never block startup.
|
|
@@ -363,7 +363,7 @@ export async function initializeBootstrapCore(
|
|
|
363
363
|
logger.warn('agent legacy memory fold failed (non-fatal)', { error: summarizeError(err) });
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
-
//
|
|
366
|
+
// ONE-TIME migration of discovered VIBE.md files into persona/constraint
|
|
367
367
|
// records, guarded by a persisted path→hash marker so it never re-imports the same
|
|
368
368
|
// file (which would create near-duplicate persona records). After this, the VIBE
|
|
369
369
|
// prompt is a PROJECTION of those records (buildVibeProjectionPrompt).
|
package/src/runtime/bootstrap.ts
CHANGED
|
@@ -203,10 +203,10 @@ export async function bootstrapRuntime(
|
|
|
203
203
|
services.shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'prompt-context-receipts.jsonl'),
|
|
204
204
|
);
|
|
205
205
|
let activePromptTurnId: string | null = null;
|
|
206
|
-
// The current turn's raw text
|
|
206
|
+
// The current turn's raw text: the injection seam
|
|
207
207
|
// (composeRuntimePromptWithReceipt, invoked from getSystemPrompt below) needs the
|
|
208
208
|
// active turn's intent to rank the already-eligible memory set by relevance. This is
|
|
209
|
-
// the real seam
|
|
209
|
+
// the real seam that was left unthreaded — TURN_SUBMITTED already carries `prompt`, it
|
|
210
210
|
// was just never captured. Mirrors activePromptTurnId's lifecycle exactly: set on
|
|
211
211
|
// TURN_SUBMITTED, cleared on every terminal event for that turn.
|
|
212
212
|
let activePromptTurnText: string | null = null;
|
|
@@ -551,7 +551,7 @@ export async function bootstrapRuntime(
|
|
|
551
551
|
shellPaths: services.shellPaths,
|
|
552
552
|
surfaceRoot: GOODVIBES_AGENT_SURFACE_ROOT,
|
|
553
553
|
});
|
|
554
|
-
//
|
|
554
|
+
// Refresh explicitly-subscribed external calendar feeds that are DUE
|
|
555
555
|
// per their own bounded interval (conditional 304 requests keep it cheap).
|
|
556
556
|
// Consent was given at subscribe time ("now and on each refresh"); with no
|
|
557
557
|
// subscriptions this touches nothing. Non-blocking — boot never waits on it;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Calendar subscription boot refresh
|
|
2
|
+
* Calendar subscription boot refresh.
|
|
3
3
|
*
|
|
4
4
|
* Fires once from bootstrap's Phase-8 area (after first render, like the gated
|
|
5
5
|
* LAN scan and MCP discovery), fully async and non-blocking: boot never waits on
|
package/src/runtime/services.ts
CHANGED
|
@@ -50,7 +50,7 @@ import { ModeManager } from '@pellux/goodvibes-sdk/platform/state';
|
|
|
50
50
|
import { FileUndoManager } from '@pellux/goodvibes-sdk/platform/state';
|
|
51
51
|
import { MemoryRegistry } from '@pellux/goodvibes-sdk/platform/state';
|
|
52
52
|
import { MemoryStore } from '@pellux/goodvibes-sdk/platform/state';
|
|
53
|
-
//
|
|
53
|
+
// One canonical cross-surface memory store + no-loss legacy fold.
|
|
54
54
|
import { resolveCanonicalMemoryDbPath, foldMemoryStores } from '@pellux/goodvibes-sdk/platform/state';
|
|
55
55
|
import type { LegacyMemorySource, MemoryFoldReport } from '@pellux/goodvibes-sdk/platform/state';
|
|
56
56
|
import type { RuntimeEventBus } from '@/runtime/index.ts';
|
|
@@ -456,7 +456,7 @@ export interface RuntimeServices extends SdkRuntimeServices {
|
|
|
456
456
|
readonly worktreeRegistry: WorktreeRegistry;
|
|
457
457
|
readonly sandboxSessionRegistry: SandboxSessionRegistry;
|
|
458
458
|
readonly webhookNotifier: WebhookNotifier;
|
|
459
|
-
/**
|
|
459
|
+
/** OS-level terminal focus tracker, ported from goodvibes-tui's W2.3 (core/focus-tracker.ts). */
|
|
460
460
|
readonly focusTracker: FocusTracker;
|
|
461
461
|
readonly replayEngine: DeterministicReplayEngine;
|
|
462
462
|
readonly providerOptimizer: ProviderOptimizer;
|
|
@@ -613,7 +613,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
613
613
|
agentStatusProvider: agentManager,
|
|
614
614
|
messageSender: agentMessageBus,
|
|
615
615
|
});
|
|
616
|
-
//
|
|
616
|
+
// The SDK's extracted session-spine core, consumed via this surface's
|
|
617
617
|
// own REST transport adapter (session-spine-rest-transport.ts) — version-
|
|
618
618
|
// tolerant, since the agent may compile against a pinned SDK predating the
|
|
619
619
|
// typed sessions.register client. Live-immediately mode: passing `transport`
|
|
@@ -639,7 +639,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
639
639
|
});
|
|
640
640
|
const artifactStore = new ArtifactStore({ configManager });
|
|
641
641
|
const memoryEmbeddingRegistry = new MemoryEmbeddingProviderRegistry({ configManager });
|
|
642
|
-
//
|
|
642
|
+
// The agent no longer owns a private per-surface memory.sqlite. It opens
|
|
643
643
|
// the ONE canonical cross-surface store so a fact learned here recalls in the TUI (and
|
|
644
644
|
// vice-versa). The old agent-global path is folded in at boot with no loss (see
|
|
645
645
|
// foldAgentLegacyMemory), then left in place — migration never deletes.
|
|
@@ -779,7 +779,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
779
779
|
const worktreeRegistry = createDisabledAgentWorktreeRegistry(workingDirectory);
|
|
780
780
|
// Configured and attached to the runtime bus during bootstrap when webhook URLs are present.
|
|
781
781
|
const webhookNotifier = new WebhookNotifier();
|
|
782
|
-
//
|
|
782
|
+
// One shared instance for the process lifetime (mirrors goodvibes-tui's
|
|
783
783
|
// runtime/services.ts); fed from 'focus' tokens in handler-feed.ts and read by
|
|
784
784
|
// the approval-alert wiring in main.ts.
|
|
785
785
|
const focusTracker = new FocusTracker();
|
|
@@ -866,7 +866,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
866
866
|
workflowServices: workflow,
|
|
867
867
|
});
|
|
868
868
|
|
|
869
|
-
// ── One-Platform
|
|
869
|
+
// ── One-Platform: RuntimeServices members required by SDK 0.38 ──────
|
|
870
870
|
// The Agent is delegation-only: it does not own local build/worktree work.
|
|
871
871
|
// These are constructed as real-but-inert SDK services purely to satisfy the
|
|
872
872
|
// RuntimeServices contract — none auto-start:
|
|
@@ -1020,7 +1020,7 @@ export function createRuntimeServices(options: RuntimeServicesOptions): RuntimeS
|
|
|
1020
1020
|
}
|
|
1021
1021
|
|
|
1022
1022
|
/**
|
|
1023
|
-
*
|
|
1023
|
+
* Fold the agent's legacy per-surface memory store into the canonical
|
|
1024
1024
|
* cross-surface store. Called once at boot AFTER `memoryStore.init()` so any records
|
|
1025
1025
|
* written before unification survive. Id-keyed and idempotent — a re-run imports
|
|
1026
1026
|
* nothing new and never deletes the legacy file. Returns the report so boot can log
|
|
@@ -232,7 +232,7 @@ export function installTuiTerminalOutputGuard(options: TuiTerminalOutputGuardOpt
|
|
|
232
232
|
const notice = `[Terminal] Captured ${count} direct ${event.source} write${plural} that would have corrupted the TUI: ${event.preview}`;
|
|
233
233
|
// Keep the aggregate count reachable in the activity log even though the
|
|
234
234
|
// noise gate (system-message-noise.ts) drops the notice from the Recent
|
|
235
|
-
// feed — drop-from-the-feed, not delete. (
|
|
235
|
+
// feed — drop-from-the-feed, not delete. (Honest degraded state.)
|
|
236
236
|
logger.info(notice, { source: event.source, count });
|
|
237
237
|
options.notify(notice);
|
|
238
238
|
},
|
|
@@ -54,7 +54,7 @@ export interface UiPlatformServices {
|
|
|
54
54
|
readonly tokenAuditor: RuntimeServices['tokenAuditor'];
|
|
55
55
|
readonly replayEngine: RuntimeServices['replayEngine'];
|
|
56
56
|
readonly webhookNotifier: RuntimeServices['webhookNotifier'];
|
|
57
|
-
/**
|
|
57
|
+
/** OS-level terminal focus tracker, ported from goodvibes-tui's W2.3. */
|
|
58
58
|
readonly focusTracker: RuntimeServices['focusTracker'];
|
|
59
59
|
readonly policyRuntimeState: RuntimeServices['policyRuntimeState'];
|
|
60
60
|
readonly externalServices?: {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { logger } from '@pellux/goodvibes-sdk/platform/utils';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Builds the process-level unhandledRejection handler for the shell.
|
|
5
|
+
*
|
|
6
|
+
* Extracted from main() so the entrypoint stays under the architecture
|
|
7
|
+
* line-count cap. Behavior is unchanged: isolated rejections surface as a
|
|
8
|
+
* single "[Error]" line, while more than three within a rolling 10s window
|
|
9
|
+
* escalate to a "[Critical]" restart suggestion so a cascading failure is
|
|
10
|
+
* named instead of scrolling by as noise.
|
|
11
|
+
*/
|
|
12
|
+
export function createUnhandledRejectionHandler(deps: {
|
|
13
|
+
readonly notifyHigh: (message: string) => void;
|
|
14
|
+
readonly render: () => void;
|
|
15
|
+
}): (reason: unknown) => void {
|
|
16
|
+
let rejectionCount = 0;
|
|
17
|
+
let windowStart = Date.now();
|
|
18
|
+
return (reason: unknown): void => {
|
|
19
|
+
const now = Date.now();
|
|
20
|
+
if (now - windowStart > 10000) {
|
|
21
|
+
rejectionCount = 0;
|
|
22
|
+
windowStart = now;
|
|
23
|
+
}
|
|
24
|
+
rejectionCount++;
|
|
25
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
26
|
+
if (rejectionCount > 3) {
|
|
27
|
+
logger.error('CRITICAL: cascading unhandled rejections — consider restarting', {
|
|
28
|
+
count: rejectionCount,
|
|
29
|
+
windowMs: now - windowStart,
|
|
30
|
+
error: String(reason),
|
|
31
|
+
});
|
|
32
|
+
deps.notifyHigh(
|
|
33
|
+
`[Critical] Multiple errors detected (${rejectionCount} in 10s). If the issue persists, please restart. Latest: ${msg}`
|
|
34
|
+
);
|
|
35
|
+
} else {
|
|
36
|
+
deps.notifyHigh(`[Error] ${msg}`);
|
|
37
|
+
logger.error('unhandledRejection', { error: String(reason) });
|
|
38
|
+
}
|
|
39
|
+
deps.render();
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -36,7 +36,7 @@ export function createAgentWorkspaceFullscreenComposite(
|
|
|
36
36
|
width: number,
|
|
37
37
|
height: number,
|
|
38
38
|
): CompositeRequest {
|
|
39
|
-
//
|
|
39
|
+
// Mirror disk state on every repaint of the workspace panel so the
|
|
40
40
|
// memory count and routine start counts never show a stale point-in-time
|
|
41
41
|
// snapshot from the last workspace action (e.g. an external delete, or a
|
|
42
42
|
// routine started from another shell/CLI invocation).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* terminal-focus-mode.ts —
|
|
2
|
+
* terminal-focus-mode.ts — DECSET ?1004h OS window-focus reporting +
|
|
3
3
|
* the approval-alert wiring that consumes it.
|
|
4
4
|
*
|
|
5
5
|
* Extracted from main.ts (architecture line-count gate: MAX_SOURCE_LINES=800
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* extracting terminal-mode literals out of its entry file (see that repo's
|
|
8
8
|
* src/renderer/terminal-escapes.ts docstring). Behavior is unchanged from an
|
|
9
9
|
* inline version; this is purely a line-count extraction plus the one new
|
|
10
|
-
* behavior (the approval alert)
|
|
10
|
+
* behavior added here (the approval alert).
|
|
11
11
|
*
|
|
12
|
-
* FOCUS_ENABLE/FOCUS_DISABLE: sourced from
|
|
13
|
-
* shared home for the DECSET ?1004 literals — its own docstring names
|
|
14
|
-
* the importer) and re-exported here so the focus-mode callers (main.ts and
|
|
15
|
-
* the tests) keep one import site for the whole focus-mode surface. This
|
|
16
|
-
*
|
|
12
|
+
* FOCUS_ENABLE/FOCUS_DISABLE: sourced from terminal-escapes.ts (the
|
|
13
|
+
* shared home for the DECSET ?1004 literals — its own docstring names this
|
|
14
|
+
* module as the importer) and re-exported here so the focus-mode callers (main.ts and
|
|
15
|
+
* the tests) keep one import site for the whole focus-mode surface. This
|
|
16
|
+
* convergence was pre-ruled by the port's parity matrix: a relocation of
|
|
17
17
|
* the literals, no behavior change.
|
|
18
18
|
*
|
|
19
19
|
* installFocusModeExitGuard(): a last-resort safety net. Node/Bun fire 'exit'
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* take — explicit process.exit() calls (normal /exit, double-Ctrl+C via
|
|
22
22
|
* exitApp()) AND the default uncaughtException termination — even though
|
|
23
23
|
* main.ts registers no explicit uncaughtException/SIGTERM handler of its own.
|
|
24
|
-
* Named top-5 risk
|
|
24
|
+
* Named a top-5 risk in the port's parity matrix: ?1004h MUST be disabled on every exit path
|
|
25
25
|
* or the user's shell inherits focus-reporting escape garbage. The write is
|
|
26
26
|
* harmless even if exitApp() already disabled it moments earlier (?1004l is
|
|
27
27
|
* idempotent). It is GATED on focus mode having actually been enabled
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
* module's config-gated alert-class system (alert-gating.ts's
|
|
38
38
|
* behavior.notifyOnApprovalPending / notifyOnlyWhenUnfocused settings, shared
|
|
39
39
|
* with budget-breach/long-task/chain-failure notifiers) is TUI-specific
|
|
40
|
-
* infrastructure the
|
|
40
|
+
* infrastructure the port's parity matrix does not list as a PORT item — only
|
|
41
41
|
* core/focus-tracker.ts is. This is the minimal, self-contained wiring the
|
|
42
42
|
* matrix's own text calls for ("route focus in/out events ... to drive
|
|
43
43
|
* awaiting-approval alerts"). PRIVACY: message content is tool name + category
|
package/src/shell/ui-openers.ts
CHANGED
|
@@ -424,7 +424,7 @@ export function wireShellUiOpeners(options: WireShellUiOpenersOptions): void {
|
|
|
424
424
|
input.modalOpened('settings');
|
|
425
425
|
input.settingsModal.open(configManager, featureFlags, subscriptionManager, serviceRegistry, mcpRegistry, secretsManager, {
|
|
426
426
|
onSettingApplied: (change) => {
|
|
427
|
-
//
|
|
427
|
+
// Forced dark/light applies immediately (mode flip + full
|
|
428
428
|
// repaint via clearScreen's resetDiff); auto only re-probes at startup,
|
|
429
429
|
// so it takes effect next launch (stated honestly).
|
|
430
430
|
if (String(change.key) === THEME_MODE_CONFIG_KEY) {
|
|
@@ -48,7 +48,7 @@ interface OperatorMethodDescriptor {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
|
-
*
|
|
51
|
+
* Capability-advertisement honesty: the SDK operator contract marks
|
|
52
52
|
* a method `invokable: false` when it is cataloged but not backed by a real
|
|
53
53
|
* daemon route (see @pellux/goodvibes-sdk's method-catalog-route-reconcile —
|
|
54
54
|
* email.inbox.list/read, email.draft.create, email.send are the dogfood
|
|
@@ -36,7 +36,7 @@ export function methodSearchText(method: OperatorContractMethod): string {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
39
|
+
* Capability honesty: a method whose contract entry carries
|
|
40
40
|
* invokable:false is cataloged but NOT dispatchable — no daemon route or
|
|
41
41
|
* handler serves it. Counting it toward "workflow ready" would repeat the
|
|
42
42
|
* dogfood finding (a lane card claiming readiness backed only by methods a
|
|
@@ -77,7 +77,7 @@ export function unavailableMethodIdsMatching(tokens: readonly string[]): readonl
|
|
|
77
77
|
|
|
78
78
|
/**
|
|
79
79
|
* One honest line naming advertised-but-undispatchable methods, matching the
|
|
80
|
-
*
|
|
80
|
+
* degraded-ad pattern ("unavailable (route not served by this daemon)").
|
|
81
81
|
* Returns null when nothing is degraded.
|
|
82
82
|
*/
|
|
83
83
|
export function unavailableMethodsNote(unavailableMethodIds: readonly string[]): string | null {
|
|
@@ -15,7 +15,7 @@ export function buildLanes(
|
|
|
15
15
|
} = {},
|
|
16
16
|
): readonly PersonalOpsLane[] {
|
|
17
17
|
const snapshot = buildAgentWorkspaceRuntimeSnapshot(context);
|
|
18
|
-
// Readiness counts only DISPATCHABLE methods (
|
|
18
|
+
// Readiness counts only DISPATCHABLE methods (capability-advertisement honesty): a
|
|
19
19
|
// method the contract marks invokable:false has no serving route, so it
|
|
20
20
|
// must not make a lane read "ready"/"partial". The unavailable lists feed
|
|
21
21
|
// honest degraded wording instead.
|
|
@@ -29,7 +29,7 @@ export interface OperatorContractMethod {
|
|
|
29
29
|
readonly description?: string;
|
|
30
30
|
readonly category?: string;
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* Capability-advertisement honesty: false means the method is
|
|
33
33
|
* cataloged but NOT dispatchable (no route/handler serves it). Absent
|
|
34
34
|
* means invokable (older contracts predate the flag).
|
|
35
35
|
*/
|
|
@@ -246,8 +246,8 @@ function memorySegment(memory: PromptMemoryApi | undefined, includeParameters: b
|
|
|
246
246
|
inspectRoute: `agent_local_registry domain:"memory" action:"get" recordId:"${record.id}"`,
|
|
247
247
|
})),
|
|
248
248
|
suppressed: suppressed.slice(0, 12).map((record) => {
|
|
249
|
-
// Honest, per-record reason straight from describeMemoryPromptEligibility
|
|
250
|
-
//
|
|
249
|
+
// Honest, per-record reason straight from describeMemoryPromptEligibility —
|
|
250
|
+
// the same wording source prompt-context-receipts.ts uses, never a
|
|
251
251
|
// locally invented "not reviewed"/"outside prompt limit" guess. A record here
|
|
252
252
|
// either genuinely failed eligibility, or passed it but was cut by the top-10
|
|
253
253
|
// prompt slice — those read differently.
|
|
@@ -399,7 +399,7 @@ function promptContextSegments(context: CommandContext, includeParameters: boole
|
|
|
399
399
|
}
|
|
400
400
|
|
|
401
401
|
const vibe = discoverVibeFiles(shellPaths);
|
|
402
|
-
//
|
|
402
|
+
// Mirror the runtime — the VIBE prompt is a PROJECTION of persona records,
|
|
403
403
|
// not a file re-read (discoverVibeFiles stays for the file-discovery receipt below).
|
|
404
404
|
const vibeMemory = promptMemoryApi(context.clients?.agentKnowledgeApi?.memory);
|
|
405
405
|
const vibePrompt = (vibeMemory ? buildVibeProjectionPrompt(vibeMemory) : null) ?? '';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Agent-local memory domain handler (
|
|
2
|
+
* Agent-local memory domain handler (memory honesty).
|
|
3
3
|
*
|
|
4
4
|
* Split out of agent-local-registry-tool.ts to stay under the 800-line
|
|
5
5
|
* architecture cap. Owns the `memory` domain of the agent_local_registry
|
|
@@ -563,7 +563,7 @@ export function createAgentOperatorMethodTool(
|
|
|
563
563
|
error: `Unknown GoodVibes operator method '${methodId}'. Inspect host action:"methods" first.`,
|
|
564
564
|
};
|
|
565
565
|
}
|
|
566
|
-
//
|
|
566
|
+
// Capability-advertisement honesty: the operator contract marks a
|
|
567
567
|
// cataloged-but-not-route-backed method invokable:false (email.inbox.list,
|
|
568
568
|
// email.send, etc. — see @pellux/goodvibes-sdk's method-catalog-route-reconcile).
|
|
569
569
|
// Refuse here, before prepareOperatorRoute/fetch, rather than letting the
|
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.5.
|
|
9
|
+
let _version = '1.5.9';
|
|
10
10
|
try {
|
|
11
11
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', 'package.json'), 'utf-8')) as {
|
|
12
12
|
readonly version?: unknown;
|