@pellux/goodvibes-agent 1.1.6 → 1.2.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 +176 -0
- package/README.md +46 -30
- package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
- package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
- package/dist/package/main.js +132662 -91399
- package/docs/README.md +14 -7
- package/docs/channels-remote-and-api.md +8 -5
- package/docs/connected-host.md +14 -12
- package/docs/getting-started.md +56 -30
- package/docs/knowledge-artifacts-and-multimodal.md +7 -5
- package/docs/project-planning.md +2 -2
- package/docs/providers-and-routing.md +11 -3
- package/docs/tools-and-commands.md +114 -45
- package/docs/voice-and-live-tts.md +3 -1
- package/package.json +3 -2
- package/release/release-notes.md +130 -5
- package/release/release-readiness.json +120 -90
- package/src/agent/assistant-cockpit.ts +247 -0
- package/src/agent/autonomy-schedule-format.ts +96 -0
- package/src/agent/autonomy-schedule.ts +514 -0
- package/src/agent/channel-delivery-receipts.ts +292 -0
- package/src/agent/competitive-feature-inventory.ts +296 -0
- package/src/agent/document-registry-types.ts +106 -0
- package/src/agent/document-registry.ts +734 -0
- package/src/agent/harness-control.ts +2 -2
- package/src/agent/memory-prompt.ts +2 -2
- package/src/agent/operator-actions.ts +50 -6
- package/src/agent/persona-registry.ts +8 -0
- package/src/agent/project-context-files.ts +273 -0
- package/src/agent/prompt-context-receipts.ts +502 -0
- package/src/agent/reminder-schedule-format.ts +16 -2
- package/src/agent/research-run-registry.ts +582 -0
- package/src/agent/research-source-registry.ts +441 -0
- package/src/agent/routine-registry.ts +19 -3
- package/src/agent/routine-schedule-format.ts +27 -2
- package/src/agent/runtime-profile-starters.ts +7 -0
- package/src/agent/runtime-profile.ts +106 -4
- package/src/agent/schedule-edit-format.ts +129 -0
- package/src/agent/schedule-edit.ts +496 -0
- package/src/agent/schedule-next-routes.ts +42 -0
- package/src/agent/setup-wizard-checkpoint.ts +140 -0
- package/src/agent/setup-wizard.ts +447 -0
- package/src/agent/skill-registry-types.ts +102 -0
- package/src/agent/skill-registry.ts +81 -107
- package/src/agent/vibe-confirmation-routes.ts +62 -0
- package/src/agent/vibe-file.ts +285 -0
- package/src/cli/agent-knowledge-command.ts +45 -2
- package/src/cli/help.ts +3 -0
- package/src/cli/profiles-command.ts +25 -11
- package/src/config/agent-settings-policy.ts +1 -18
- package/src/input/agent-workspace-activation.ts +53 -0
- package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
- package/src/input/agent-workspace-artifact-metadata.ts +17 -0
- package/src/input/agent-workspace-basic-command-editors.ts +5 -1
- package/src/input/agent-workspace-categories.ts +153 -155
- package/src/input/agent-workspace-channel-triage.ts +481 -0
- package/src/input/agent-workspace-channels.ts +263 -0
- package/src/input/agent-workspace-command-editor.ts +152 -0
- package/src/input/agent-workspace-context-snapshot.ts +349 -0
- package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
- package/src/input/agent-workspace-document-editor.ts +502 -0
- package/src/input/agent-workspace-document-ops-editor.ts +523 -0
- package/src/input/agent-workspace-host-category.ts +1 -1
- package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
- package/src/input/agent-workspace-model-compare-editor.ts +376 -0
- package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
- package/src/input/agent-workspace-model-compare-types.ts +82 -0
- package/src/input/agent-workspace-model-compare-utils.ts +35 -0
- package/src/input/agent-workspace-onboarding-categories.ts +141 -0
- package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
- package/src/input/agent-workspace-operations-command-editors.ts +22 -0
- package/src/input/agent-workspace-research-report-editor.ts +212 -0
- package/src/input/agent-workspace-research-run-editor.ts +144 -0
- package/src/input/agent-workspace-research-source-editor.ts +167 -0
- package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
- package/src/input/agent-workspace-review-packet-utils.ts +265 -0
- package/src/input/agent-workspace-settings.ts +262 -30
- package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
- package/src/input/agent-workspace-setup-snapshot.ts +198 -0
- package/src/input/agent-workspace-setup.ts +34 -1
- package/src/input/agent-workspace-snapshot.ts +162 -147
- package/src/input/agent-workspace-types.ts +287 -2
- package/src/input/agent-workspace.ts +18 -0
- package/src/input/command-registry.ts +9 -2
- package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
- package/src/input/commands/channels-runtime.ts +102 -114
- package/src/input/commands/delegation-runtime.ts +87 -24
- package/src/input/commands/knowledge-browser-flags.ts +12 -0
- package/src/input/commands/knowledge.ts +28 -14
- package/src/input/commands/operator-actions-runtime.ts +6 -3
- package/src/input/commands/schedule-runtime.ts +71 -14
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/shell-core.ts +2 -0
- package/src/input/commands/vibe-runtime.ts +140 -0
- package/src/input/commands.ts +2 -0
- package/src/input/connected-host-routes.ts +123 -0
- package/src/input/settings-modal-types.ts +14 -0
- package/src/main.ts +15 -15
- package/src/panels/qr-panel.ts +2 -2
- package/src/renderer/agent-workspace-context-lines.ts +686 -0
- package/src/renderer/agent-workspace.ts +30 -419
- package/src/renderer/settings-modal-helpers.ts +12 -0
- package/src/renderer/settings-modal.ts +12 -0
- package/src/runtime/bootstrap-command-context.ts +11 -1
- package/src/runtime/bootstrap-command-parts.ts +14 -3
- package/src/runtime/bootstrap-core.ts +43 -1
- package/src/runtime/bootstrap-shell.ts +6 -0
- package/src/runtime/bootstrap.ts +113 -30
- package/src/runtime/connected-host-auth.ts +3 -2
- package/src/runtime/execution-ledger.ts +231 -0
- package/src/runtime/services.ts +88 -10
- package/src/runtime/tool-permission-safety.ts +287 -0
- package/src/shell/session-continuity-hints.ts +39 -0
- package/src/tools/agent-artifacts-tool.ts +606 -0
- package/src/tools/agent-audit-tool.ts +155 -0
- package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
- package/src/tools/agent-autonomy-tool.ts +140 -0
- package/src/tools/agent-channel-send-tool.ts +24 -2
- package/src/tools/agent-channels-tool.ts +140 -0
- package/src/tools/agent-computer-tool.ts +168 -0
- package/src/tools/agent-context-policy.ts +267 -10
- package/src/tools/agent-context-tool.ts +143 -0
- package/src/tools/agent-delegation-tool.ts +128 -0
- package/src/tools/agent-device-tool.ts +240 -0
- package/src/tools/agent-documents-tool.ts +684 -0
- package/src/tools/agent-execution-tool.ts +230 -0
- package/src/tools/agent-harness-agent-orchestration.ts +703 -0
- package/src/tools/agent-harness-autonomy-intake.ts +785 -0
- package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
- package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
- package/src/tools/agent-harness-autonomy-queue.ts +560 -0
- package/src/tools/agent-harness-background-processes-types.ts +35 -0
- package/src/tools/agent-harness-background-processes.ts +794 -0
- package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
- package/src/tools/agent-harness-browser-control.ts +338 -0
- package/src/tools/agent-harness-channel-metadata.ts +168 -10
- package/src/tools/agent-harness-cli-command-policy.ts +110 -0
- package/src/tools/agent-harness-command-catalog.ts +4 -2
- package/src/tools/agent-harness-command-runner.ts +42 -0
- package/src/tools/agent-harness-connected-host-status.ts +7 -4
- package/src/tools/agent-harness-delegation-posture.ts +234 -19
- package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
- package/src/tools/agent-harness-document-ops-types.ts +72 -0
- package/src/tools/agent-harness-document-ops.ts +671 -0
- package/src/tools/agent-harness-execution-history.ts +489 -0
- package/src/tools/agent-harness-execution-posture.ts +382 -0
- package/src/tools/agent-harness-file-recovery.ts +135 -0
- package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
- package/src/tools/agent-harness-learning-curator-common.ts +102 -0
- package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
- package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
- package/src/tools/agent-harness-learning-curator-types.ts +151 -0
- package/src/tools/agent-harness-learning-curator.ts +417 -0
- package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
- package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
- package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
- package/src/tools/agent-harness-media-posture.ts +208 -2
- package/src/tools/agent-harness-memory-posture.ts +556 -0
- package/src/tools/agent-harness-metadata.ts +100 -168
- package/src/tools/agent-harness-mode-catalog.ts +84 -33
- package/src/tools/agent-harness-model-catalog.ts +162 -0
- package/src/tools/agent-harness-model-provider-health.ts +186 -0
- package/src/tools/agent-harness-model-readiness.ts +406 -0
- package/src/tools/agent-harness-model-routing-types.ts +266 -0
- package/src/tools/agent-harness-model-routing-utils.ts +30 -0
- package/src/tools/agent-harness-model-routing.ts +137 -190
- package/src/tools/agent-harness-operator-methods.ts +115 -133
- package/src/tools/agent-harness-pairing-posture.ts +431 -18
- package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
- package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
- package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
- package/src/tools/agent-harness-personal-ops-records.ts +732 -0
- package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
- package/src/tools/agent-harness-personal-ops-types.ts +222 -0
- package/src/tools/agent-harness-personal-ops.ts +606 -0
- package/src/tools/agent-harness-project-context.ts +144 -0
- package/src/tools/agent-harness-prompt-context.ts +589 -0
- package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
- package/src/tools/agent-harness-release-evidence.ts +9 -7
- package/src/tools/agent-harness-release-readiness.ts +9 -7
- package/src/tools/agent-harness-research-briefing.ts +427 -0
- package/src/tools/agent-harness-research-queue.ts +250 -0
- package/src/tools/agent-harness-research-runs.ts +295 -0
- package/src/tools/agent-harness-research-workflow.ts +322 -0
- package/src/tools/agent-harness-security-posture.ts +2 -2
- package/src/tools/agent-harness-service-posture.ts +9 -9
- package/src/tools/agent-harness-session-metadata.ts +3 -3
- package/src/tools/agent-harness-setup-connected-host.ts +501 -0
- package/src/tools/agent-harness-setup-describe.ts +557 -0
- package/src/tools/agent-harness-setup-handoffs.ts +502 -0
- package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
- package/src/tools/agent-harness-setup-plan.ts +253 -0
- package/src/tools/agent-harness-setup-posture-types.ts +218 -0
- package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
- package/src/tools/agent-harness-setup-posture.ts +449 -221
- package/src/tools/agent-harness-setup-smoke.ts +508 -0
- package/src/tools/agent-harness-sudo-posture.ts +114 -0
- package/src/tools/agent-harness-tool-schema.ts +120 -7
- package/src/tools/agent-harness-tool-types.ts +78 -0
- package/src/tools/agent-harness-tool-utils.ts +43 -0
- package/src/tools/agent-harness-tool.ts +311 -370
- package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
- package/src/tools/agent-harness-ui-surface-types.ts +46 -0
- package/src/tools/agent-harness-vibe-health.ts +105 -0
- package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
- package/src/tools/agent-harness-workspace-actions.ts +114 -8
- package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
- package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
- package/src/tools/agent-host-tool.ts +159 -0
- package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
- package/src/tools/agent-learning-consolidation-core.ts +327 -0
- package/src/tools/agent-learning-consolidation-tool.ts +758 -0
- package/src/tools/agent-memory-tool.ts +214 -0
- package/src/tools/agent-model-compare-export.ts +315 -0
- package/src/tools/agent-model-compare-handoff.ts +592 -0
- package/src/tools/agent-model-compare-judgment.ts +633 -0
- package/src/tools/agent-model-compare-run.ts +722 -0
- package/src/tools/agent-model-compare-tool.ts +698 -0
- package/src/tools/agent-model-compare-types.ts +191 -0
- package/src/tools/agent-model-compare-utils.ts +93 -0
- package/src/tools/agent-models-tool.ts +208 -0
- package/src/tools/agent-operator-action-tool.ts +1 -1
- package/src/tools/agent-operator-method-tool.ts +643 -0
- package/src/tools/agent-personal-ops-tool.ts +197 -0
- package/src/tools/agent-policy-explanation.ts +415 -0
- package/src/tools/agent-research-report-tool.ts +608 -0
- package/src/tools/agent-research-runs-tool.ts +434 -0
- package/src/tools/agent-research-sources-tool.ts +443 -0
- package/src/tools/agent-research-tool.ts +687 -0
- package/src/tools/agent-review-packet-presets-core.ts +757 -0
- package/src/tools/agent-review-packet-presets-tool.ts +466 -0
- package/src/tools/agent-review-packet-share-tool.ts +305 -0
- package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
- package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
- package/src/tools/agent-route-planner-candidates-work.ts +251 -0
- package/src/tools/agent-route-planner-helpers.ts +667 -0
- package/src/tools/agent-route-planner.ts +185 -0
- package/src/tools/agent-route-tool.ts +105 -0
- package/src/tools/agent-schedule-edit-tool.ts +210 -0
- package/src/tools/agent-schedule-tool.ts +282 -0
- package/src/tools/agent-security-tool.ts +145 -0
- package/src/tools/agent-sessions-tool.ts +122 -0
- package/src/tools/agent-settings-import-tool.ts +104 -0
- package/src/tools/agent-settings-tool.ts +176 -0
- package/src/tools/agent-setup-tool.ts +226 -0
- package/src/tools/agent-support-tool.ts +122 -0
- package/src/tools/agent-terminal-process-tools.ts +167 -0
- package/src/tools/agent-tool-policy-guard-types.ts +77 -0
- package/src/tools/agent-tool-policy-guard.ts +110 -89
- package/src/tools/agent-vibe-tool.ts +297 -0
- package/src/tools/agent-work-plan-tool.ts +265 -6
- package/src/tools/agent-workspace-tool.ts +305 -0
- package/src/tools/artifact-archive.ts +169 -0
- package/src/tools/tool-definition-compaction.ts +36 -0
- package/src/tools/tool-execution-safety.ts +41 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import type { ShellPathService } from '@/runtime/index.ts';
|
|
5
|
+
import { GOODVIBES_AGENT_SURFACE_ROOT } from '../config/surface.ts';
|
|
6
|
+
import type { AgentChannelDeliveryInput, AgentChannelDeliveryResult } from './channel-delivery.ts';
|
|
7
|
+
|
|
8
|
+
export type AgentChannelDeliveryReceiptSource = 'command' | 'model-tool';
|
|
9
|
+
export type AgentChannelDeliveryReceiptStatus = 'sent';
|
|
10
|
+
|
|
11
|
+
export interface AgentChannelDeliveryReceiptTarget {
|
|
12
|
+
readonly kind: string;
|
|
13
|
+
readonly display: string;
|
|
14
|
+
readonly surfaceKind?: string;
|
|
15
|
+
readonly routeId?: string;
|
|
16
|
+
readonly label?: string;
|
|
17
|
+
readonly addressHost?: string;
|
|
18
|
+
readonly addressScheme?: string;
|
|
19
|
+
readonly addressDigest?: string;
|
|
20
|
+
readonly redactedAddress?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface AgentChannelDeliveryReceipt {
|
|
24
|
+
readonly version: 1;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly createdAt: string;
|
|
27
|
+
readonly source: AgentChannelDeliveryReceiptSource;
|
|
28
|
+
readonly status: AgentChannelDeliveryReceiptStatus;
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly target: AgentChannelDeliveryReceiptTarget;
|
|
31
|
+
readonly messagePreview: string;
|
|
32
|
+
readonly messageLength: number;
|
|
33
|
+
readonly messageDigest: string;
|
|
34
|
+
readonly strategyCount: number;
|
|
35
|
+
readonly responseId?: string;
|
|
36
|
+
readonly authorization: 'explicit-user-confirmed';
|
|
37
|
+
readonly userRoute: string;
|
|
38
|
+
readonly modelRoute: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface AgentChannelDeliveryReceiptSnapshot {
|
|
42
|
+
readonly path: string;
|
|
43
|
+
readonly exists: boolean;
|
|
44
|
+
readonly receipts: readonly AgentChannelDeliveryReceipt[];
|
|
45
|
+
readonly parseError?: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface AgentChannelDeliveryReceiptFile {
|
|
49
|
+
readonly version: 1;
|
|
50
|
+
readonly receipts: readonly AgentChannelDeliveryReceipt[];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type AgentChannelDeliveryReceiptShellPaths = Pick<ShellPathService, 'resolveUserPath'>;
|
|
54
|
+
|
|
55
|
+
const RECEIPT_VERSION = 1;
|
|
56
|
+
const RECEIPT_LIMIT = 100;
|
|
57
|
+
const MESSAGE_PREVIEW_LIMIT = 120;
|
|
58
|
+
|
|
59
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
60
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function readString(value: unknown): string {
|
|
64
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function readNumber(value: unknown): number | null {
|
|
68
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function digest(value: string): string {
|
|
72
|
+
return createHash('sha256').update(value).digest('hex').slice(0, 16);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function normalizeWhitespace(value: string): string {
|
|
76
|
+
return value.trim().replace(/\s+/g, ' ');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function redactSecretLikeText(value: string): string {
|
|
80
|
+
return value
|
|
81
|
+
.replace(/\bhttps?:\/\/\S+/gi, (raw) => {
|
|
82
|
+
try {
|
|
83
|
+
const url = new URL(raw);
|
|
84
|
+
return `${url.protocol}//${url.host}/...`;
|
|
85
|
+
} catch {
|
|
86
|
+
return '[redacted-url]';
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
.replace(/\b(xox[baprs]-[A-Za-z0-9-]{8,})\b/g, '[redacted-token]')
|
|
90
|
+
.replace(/\b([A-Za-z0-9_-]{24,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,})\b/g, '[redacted-token]')
|
|
91
|
+
.replace(/\b(api[_-]?key|token|secret|password)\s*[:=]\s*\S+/gi, '$1=[redacted]');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function previewMessage(message: string): string {
|
|
95
|
+
const safe = redactSecretLikeText(normalizeWhitespace(message));
|
|
96
|
+
return safe.length > MESSAGE_PREVIEW_LIMIT ? `${safe.slice(0, MESSAGE_PREVIEW_LIMIT - 1)}...` : safe;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function safeRouteArg(value: string): string {
|
|
100
|
+
return normalizeWhitespace(value).replace(/"/g, '\\"');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function summarizeAddress(address: string | undefined, kind: string): AgentChannelDeliveryReceiptTarget {
|
|
104
|
+
const normalized = readString(address);
|
|
105
|
+
if (!normalized) return { kind, display: kind, redactedAddress: true };
|
|
106
|
+
try {
|
|
107
|
+
const url = new URL(normalized);
|
|
108
|
+
return {
|
|
109
|
+
kind,
|
|
110
|
+
display: `${kind} ${url.protocol}//${url.host}/...`,
|
|
111
|
+
addressHost: url.host,
|
|
112
|
+
addressScheme: url.protocol.replace(/:$/, ''),
|
|
113
|
+
addressDigest: digest(normalized),
|
|
114
|
+
redactedAddress: true,
|
|
115
|
+
};
|
|
116
|
+
} catch {
|
|
117
|
+
return {
|
|
118
|
+
kind,
|
|
119
|
+
display: `${kind} [redacted-target]`,
|
|
120
|
+
addressDigest: digest(normalized),
|
|
121
|
+
redactedAddress: true,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function summarizeTarget(result: AgentChannelDeliveryResult): AgentChannelDeliveryReceiptTarget {
|
|
127
|
+
const target = result.target;
|
|
128
|
+
if (target.kind === 'surface') {
|
|
129
|
+
const surfaceKind = readString(target.surfaceKind) || 'route';
|
|
130
|
+
const details = [
|
|
131
|
+
target.routeId ? `route ${target.routeId}` : '',
|
|
132
|
+
target.label ? `label ${target.label}` : '',
|
|
133
|
+
].filter(Boolean);
|
|
134
|
+
return {
|
|
135
|
+
kind: 'surface',
|
|
136
|
+
display: `${surfaceKind}${details.length > 0 ? ` (${details.join(', ')})` : ''}`,
|
|
137
|
+
surfaceKind,
|
|
138
|
+
...(target.routeId ? { routeId: target.routeId } : {}),
|
|
139
|
+
...(target.label ? { label: target.label } : {}),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return summarizeAddress(target.address, target.kind);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function targetInput(input: AgentChannelDeliveryInput): string {
|
|
146
|
+
if (input.channel) return `--channel "${safeRouteArg(input.channel)}"`;
|
|
147
|
+
if (input.route) return `--route "${safeRouteArg(input.route)}"`;
|
|
148
|
+
if (input.webhook) return '--webhook "[redacted-webhook]"';
|
|
149
|
+
if (input.link) return '--link "[redacted-link]"';
|
|
150
|
+
return '--channel "<target>"';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function parseTarget(value: unknown): AgentChannelDeliveryReceiptTarget | null {
|
|
154
|
+
if (!isRecord(value)) return null;
|
|
155
|
+
const kind = readString(value.kind);
|
|
156
|
+
const display = readString(value.display);
|
|
157
|
+
if (!kind || !display) return null;
|
|
158
|
+
const surfaceKind = readString(value.surfaceKind);
|
|
159
|
+
const routeId = readString(value.routeId);
|
|
160
|
+
const label = readString(value.label);
|
|
161
|
+
const addressHost = readString(value.addressHost);
|
|
162
|
+
const addressScheme = readString(value.addressScheme);
|
|
163
|
+
const addressDigest = readString(value.addressDigest);
|
|
164
|
+
return {
|
|
165
|
+
kind,
|
|
166
|
+
display,
|
|
167
|
+
...(surfaceKind ? { surfaceKind } : {}),
|
|
168
|
+
...(routeId ? { routeId } : {}),
|
|
169
|
+
...(label ? { label } : {}),
|
|
170
|
+
...(addressHost ? { addressHost } : {}),
|
|
171
|
+
...(addressScheme ? { addressScheme } : {}),
|
|
172
|
+
...(addressDigest ? { addressDigest } : {}),
|
|
173
|
+
...(value.redactedAddress === true ? { redactedAddress: true } : {}),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function parseReceipt(value: unknown): AgentChannelDeliveryReceipt | null {
|
|
178
|
+
if (!isRecord(value) || value.version !== RECEIPT_VERSION) return null;
|
|
179
|
+
const id = readString(value.id);
|
|
180
|
+
const createdAt = readString(value.createdAt);
|
|
181
|
+
const source = value.source === 'model-tool' ? 'model-tool' : value.source === 'command' ? 'command' : null;
|
|
182
|
+
const status = value.status === 'sent' ? 'sent' : null;
|
|
183
|
+
const title = readString(value.title);
|
|
184
|
+
const target = parseTarget(value.target);
|
|
185
|
+
const messagePreview = readString(value.messagePreview);
|
|
186
|
+
const messageLength = readNumber(value.messageLength);
|
|
187
|
+
const messageDigest = readString(value.messageDigest);
|
|
188
|
+
const strategyCount = readNumber(value.strategyCount);
|
|
189
|
+
const userRoute = readString(value.userRoute);
|
|
190
|
+
const modelRoute = readString(value.modelRoute);
|
|
191
|
+
if (!id || !createdAt || Number.isNaN(Date.parse(createdAt)) || !source || !status || !title || !target || messageLength === null || !messageDigest || strategyCount === null || !userRoute || !modelRoute) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
const responseId = readString(value.responseId);
|
|
195
|
+
return {
|
|
196
|
+
version: RECEIPT_VERSION,
|
|
197
|
+
id,
|
|
198
|
+
createdAt,
|
|
199
|
+
source,
|
|
200
|
+
status,
|
|
201
|
+
title,
|
|
202
|
+
target,
|
|
203
|
+
messagePreview,
|
|
204
|
+
messageLength,
|
|
205
|
+
messageDigest,
|
|
206
|
+
strategyCount,
|
|
207
|
+
...(responseId ? { responseId } : {}),
|
|
208
|
+
authorization: 'explicit-user-confirmed',
|
|
209
|
+
userRoute,
|
|
210
|
+
modelRoute,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function parseReceiptFile(value: unknown): AgentChannelDeliveryReceiptFile {
|
|
215
|
+
if (!isRecord(value)) return { version: RECEIPT_VERSION, receipts: [] };
|
|
216
|
+
const receipts = Array.isArray(value.receipts)
|
|
217
|
+
? value.receipts.map(parseReceipt).filter((entry): entry is AgentChannelDeliveryReceipt => entry !== null)
|
|
218
|
+
: [];
|
|
219
|
+
return { version: RECEIPT_VERSION, receipts };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export function agentChannelDeliveryReceiptPath(shellPaths: AgentChannelDeliveryReceiptShellPaths): string {
|
|
223
|
+
return shellPaths.resolveUserPath(GOODVIBES_AGENT_SURFACE_ROOT, 'channels', 'delivery-receipts.json');
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export function readAgentChannelDeliveryReceipts(shellPaths: AgentChannelDeliveryReceiptShellPaths): AgentChannelDeliveryReceiptSnapshot {
|
|
227
|
+
const path = agentChannelDeliveryReceiptPath(shellPaths);
|
|
228
|
+
if (!existsSync(path)) return { path, exists: false, receipts: [] };
|
|
229
|
+
try {
|
|
230
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8')) as unknown;
|
|
231
|
+
return { path, exists: true, receipts: parseReceiptFile(parsed).receipts };
|
|
232
|
+
} catch (error) {
|
|
233
|
+
return {
|
|
234
|
+
path,
|
|
235
|
+
exists: true,
|
|
236
|
+
receipts: [],
|
|
237
|
+
parseError: error instanceof Error ? error.message : String(error),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function recordAgentChannelDeliveryReceipt(
|
|
243
|
+
shellPaths: AgentChannelDeliveryReceiptShellPaths,
|
|
244
|
+
input: {
|
|
245
|
+
readonly source: AgentChannelDeliveryReceiptSource;
|
|
246
|
+
readonly deliveryInput: AgentChannelDeliveryInput;
|
|
247
|
+
readonly result: AgentChannelDeliveryResult;
|
|
248
|
+
},
|
|
249
|
+
): AgentChannelDeliveryReceipt {
|
|
250
|
+
const path = agentChannelDeliveryReceiptPath(shellPaths);
|
|
251
|
+
const title = previewMessage(input.result.title || 'GoodVibes Agent message');
|
|
252
|
+
const receipt: AgentChannelDeliveryReceipt = {
|
|
253
|
+
version: RECEIPT_VERSION,
|
|
254
|
+
id: `channel-delivery-${new Date().toISOString().replace(/[^0-9]/g, '').slice(0, 14)}-${randomUUID().slice(0, 8)}`,
|
|
255
|
+
createdAt: new Date().toISOString(),
|
|
256
|
+
source: input.source,
|
|
257
|
+
status: 'sent',
|
|
258
|
+
title,
|
|
259
|
+
target: summarizeTarget(input.result),
|
|
260
|
+
messagePreview: previewMessage(input.result.message),
|
|
261
|
+
messageLength: input.result.message.length,
|
|
262
|
+
messageDigest: digest(input.result.message),
|
|
263
|
+
strategyCount: input.result.strategyCount,
|
|
264
|
+
...(input.result.responseId ? { responseId: input.result.responseId } : {}),
|
|
265
|
+
authorization: 'explicit-user-confirmed',
|
|
266
|
+
userRoute: `/channels send --title "${safeRouteArg(title)}" ${targetInput(input.deliveryInput)} --message "[redacted]" --yes`,
|
|
267
|
+
modelRoute: 'agent_channel_send confirm:true explicitUserRequest:"..."',
|
|
268
|
+
};
|
|
269
|
+
const current = readAgentChannelDeliveryReceipts(shellPaths).receipts;
|
|
270
|
+
const next: AgentChannelDeliveryReceiptFile = {
|
|
271
|
+
version: RECEIPT_VERSION,
|
|
272
|
+
receipts: [receipt, ...current].slice(0, RECEIPT_LIMIT),
|
|
273
|
+
};
|
|
274
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
275
|
+
const tempPath = `${path}.tmp`;
|
|
276
|
+
writeFileSync(tempPath, `${JSON.stringify(next, null, 2)}\n`, 'utf-8');
|
|
277
|
+
renameSync(tempPath, path);
|
|
278
|
+
return receipt;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export function formatAgentChannelDeliveryReceiptLine(receipt: AgentChannelDeliveryReceipt): string {
|
|
282
|
+
return [
|
|
283
|
+
`${receipt.createdAt} ${receipt.id}`,
|
|
284
|
+
receipt.status,
|
|
285
|
+
receipt.source,
|
|
286
|
+
`target=${receipt.target.display}`,
|
|
287
|
+
`title=${receipt.title}`,
|
|
288
|
+
receipt.responseId ? `response=${receipt.responseId}` : '',
|
|
289
|
+
`message=${receipt.messageLength} chars sha256:${receipt.messageDigest}`,
|
|
290
|
+
receipt.messagePreview ? `preview="${receipt.messagePreview}"` : '',
|
|
291
|
+
].filter(Boolean).join(' ');
|
|
292
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
export type CompetitorId = 'openclaw' | 'hermes' | 'odysseus';
|
|
2
|
+
|
|
3
|
+
export type GoodVibesCompetitiveStatus = 'leading' | 'parity' | 'partial' | 'gap';
|
|
4
|
+
|
|
5
|
+
export type GoodVibesOwner = 'agent' | 'connected-host' | 'companion' | 'release';
|
|
6
|
+
|
|
7
|
+
export interface CompetitorFeatureSignal {
|
|
8
|
+
readonly competitor: CompetitorId;
|
|
9
|
+
readonly evidence: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface CompetitiveFeatureInventoryItem {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
readonly userOutcome: string;
|
|
15
|
+
readonly targetStandard: 'parity' | 'better';
|
|
16
|
+
readonly bestInClassRequirement: string;
|
|
17
|
+
readonly goodVibesStatus: GoodVibesCompetitiveStatus;
|
|
18
|
+
readonly owners: readonly GoodVibesOwner[];
|
|
19
|
+
readonly goodVibesNow: string;
|
|
20
|
+
readonly nextMoves: readonly string[];
|
|
21
|
+
readonly competitorSignals: readonly CompetitorFeatureSignal[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const COMPETITIVE_FEATURE_INVENTORY: readonly CompetitiveFeatureInventoryItem[] = [
|
|
25
|
+
{
|
|
26
|
+
id: 'one-assistant-mental-model',
|
|
27
|
+
userOutcome: 'The user asks one assistant for help and does not need to understand package, host, daemon, or execution-boundary ownership.',
|
|
28
|
+
targetStandard: 'better',
|
|
29
|
+
bestInClassRequirement: 'Every setup, chat, automation, channel, and execution route is presented as one assistant with visible safety and recovery state.',
|
|
30
|
+
goodVibesStatus: 'leading',
|
|
31
|
+
owners: ['agent', 'connected-host', 'companion'],
|
|
32
|
+
goodVibesNow: 'Agent has a strong operator workspace, visible TUI Home cockpit, first-class `route action:"plan|status"`, `setup action:"repair"`, and `agent_harness mode:"summary|route_decision|setup_repair"` that all start from the same assistant-first lanes: setup, chat/model, project work, Personal Ops, research/docs, background work, and safety/recovery with user-facing next actions. The route planner accepts a plain user task, returns the preferred visible route, alternatives, missing fields, confirmation boundary, workspace matches, and harness mode matches, so the model can choose Agent-owned setup, settings, Personal Ops, research, autonomy, execution, delegation, computer/browser, workspace, host, device, channel, security, Local Context, or Knowledge paths without asking the user to understand package ownership. Host/daemon health, doctor, readiness, service, and compatibility wording goes directly to `host action:"status"` before repair or lifecycle effects. Normal settings/configuration wording goes directly to `settings action:"list"` before set/reset/import effects. Model provider, local-cookbook, local server smoke, and route-fit wording goes directly to `models action:"provider|local|smoke|route"` before credential, smoke, benchmark, or route-change effects. Personal Ops briefing, saved queue, fresh inbox/calendar read, and connector setup wording goes directly to `personal_ops action:"briefing|queue|intake|lane"` before live provider reads or effects. Direct reminder, schedule, cron, and schedule lifecycle wording goes directly to `schedule action:"list"` before confirmed schedule effects. Command-shaped background work goes directly to `execution action:"processes"` plus first-class `terminal`/`process` controls, interactive PTY/stdin/sudo wording goes directly to `execution action:"process_capabilities"` before hidden process starts or credential effects, while broader ongoing or watcher-like background work stays on autonomy intake. External memory-provider, backend, cross-session sync, import/export, and named-provider wording goes directly to `memory action:"provider"` or the external provider checklist before any provider write, sync, credential, or import/export effect. Browser-backed research runner wording goes directly to `research action:"runner"` readiness, and visual research report rendering wording goes directly to `research action:"plan"` plus report artifacts before browser/PWA rendering is claimed. Voice workflow, TTS-provider, browser cockpit, and PWA wording goes directly to `device action:"voice|provider"` or `computer action:"browser"` before capture, playback, picker, or browser-open effects. Channel setup, triage, delivery-receipt, and send wording goes directly to `channels action:"setup|triage|deliveries|channel"` before confirmed external delivery. Permission posture, security finding, and blocked-action wording goes directly to `security action:"status|finding|explain"` before policy changes or risky work. Support-bundle, saved-session/bookmark/continuity, and release/audit evidence wording goes directly to `support action:"status|bundle"`, `sessions action:"list|get"`, and `audit action:"readiness|evidence|item|artifact"` before bundle export/import/share, session lifecycle, or audit drill-in effects. File undo/redo/recovery wording goes directly to `execution action:"recovery"` before any confirmed snapshot mutation. Media generation wording goes to media provider readiness plus confirmed `agent_media_generate` saved artifacts, with no inline bytes or silent Knowledge promotion. Screenshot, browser-navigation/control, screen-observation, and desktop-control wording goes directly to `computer action:"plan"` before any live UI tool is considered. Setup repair accepts the current setup blocker or a plain target such as host/auth/service, then returns the safest next route: token repair, connected-host status, services.status receipt, user-run bootstrap commands, or no lifecycle action when the host is already reachable. Technical host, daemon, provider, MCP, and delegation details remain available as diagnostics and confirmation boundaries instead of first-screen ownership questions.',
|
|
33
|
+
nextMoves: [
|
|
34
|
+
'Keep adding plain-language route fixtures for any user task that still falls through to technical ownership language.',
|
|
35
|
+
'Promote new daemon and SDK contracts into first-class Agent routes only after they have visible status, confirmation, and recovery semantics.',
|
|
36
|
+
],
|
|
37
|
+
competitorSignals: [
|
|
38
|
+
{ competitor: 'openclaw', evidence: 'Gateway is described as the control plane while the assistant is the product.' },
|
|
39
|
+
{ competitor: 'hermes', evidence: 'CLI, gateway, and messaging all expose one Hermes assistant conversation model.' },
|
|
40
|
+
{ competitor: 'odysseus', evidence: 'Web workspace combines chat, agents, memory, docs, email, calendar, and tasks in one app.' },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'first-run-and-always-on-setup',
|
|
45
|
+
userOutcome: 'A fresh user can install, configure models, start the always-on runtime, and reach the assistant without manual topology work.',
|
|
46
|
+
targetStandard: 'better',
|
|
47
|
+
bestInClassRequirement: 'One guided flow verifies dependencies, installs or starts the host, configures auth, pairs channels, and leaves a working assistant.',
|
|
48
|
+
goodVibesStatus: 'partial',
|
|
49
|
+
owners: ['agent', 'connected-host', 'release'],
|
|
50
|
+
goodVibesNow: 'Agent has onboarding, diagnostics, a first-class `setup action:"status|item|repair|checkpoint|save_checkpoint|clear_checkpoint|token|smoke|finish|import_settings"` adapter, first-class `settings action:"list|get|set|reset|import"` UX for Agent settings plus redacted GoodVibes settings import preview/apply, first-class `host action:"status|capabilities|capability|services|service|methods|method"` UX for connected-host diagnostics, and a visible Start checklist that keeps connected-host auth and install smoke beside runtime/model setup. The shared first-run setup wizard orders connected-host readiness, connected-host auth, provider/model access, install smoke, local model readiness, Agent Knowledge, local behavior, channels, automation review, browser/desktop control, delegation, and finish state with progress, current-step route hints, backtracking routes, setup-smoke rerun/save routes, saved-smoke repeated-blocker focus, and Agent-owned saved setup checkpoints that resume across restarts without storing user prompt text while reporting stale-checkpoint auto-advance evidence when a saved step is already ready. Connected-host setup includes a read-only setup repair decision route, live service probe evidence, token-safe auth posture with exact pairing route ids, confirmed SDK-backed local operator-token create/repair with no raw-token output, recommended diagnostic/status cards, confirmed service install/start/restart routes that stay inspect-first unless service status proves need, setup `serviceLifecycleDecision` gates, service repair-card success criteria, `agent_operator_method` certified receipt outcomes plus exact install/start/restart/no-action lifecycle decisions from services.status receipts, offline bootstrap commands for missing-host setup, a confirmed token-safe setup smoke route with optional durable redacted evidence artifacts from package binary to first assistant turn, Home/setup summary surfacing for the latest smoke result plus smoke history/trend/frequent blockers, `setupWizard.closeout` and top-level `setupCloseout` decisions that reduce critical blockers, smoke evidence, and the user completion marker into blocked/run-smoke/finish/complete states, confirmed setup finish marker writes, setup checkpoint direct model routes, visible Start actions to show/save/clear the checkpoint, and fixtures for missing host, unreachable host, missing token, model-unconfigured, and ready-closeout paths.',
|
|
51
|
+
nextMoves: [
|
|
52
|
+
'Auto-advance individual setup wizard step history from stable connected-host service/auth/smoke receipt ids once the daemon publishes durable setup receipt records.',
|
|
53
|
+
'Attach stable receipt ids and timestamps to setup wizard step history when the connected host publishes durable service/auth/smoke receipt records.',
|
|
54
|
+
],
|
|
55
|
+
competitorSignals: [
|
|
56
|
+
{ competitor: 'openclaw', evidence: 'Onboarding can install the Gateway daemon so it stays running.' },
|
|
57
|
+
{ competitor: 'hermes', evidence: 'Installers handle runtime dependencies and the setup wizard configures the gateway.' },
|
|
58
|
+
{ competitor: 'odysseus', evidence: 'Docker and native setup generate an admin account and open a local web UI.' },
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'models-and-local-model-cookbook',
|
|
63
|
+
userOutcome: 'The user can choose cloud, subscription, or local models without knowing provider-specific setup details.',
|
|
64
|
+
targetStandard: 'better',
|
|
65
|
+
bestInClassRequirement: 'Model setup recommends the best available route, detects local servers, benchmarks fit, and can help download or serve local models.',
|
|
66
|
+
goodVibesStatus: 'partial',
|
|
67
|
+
owners: ['agent', 'connected-host'],
|
|
68
|
+
goodVibesNow: 'First-class `models action:"status|route|local|providers|provider|smoke"` UX now fronts provider routing, subscription posture, local compatible provider discovery, model pickers, visible route-readiness inspection, and a hardware-scored local model cookbook for Ollama, llama.cpp, vLLM, and local OpenAI-compatible servers; lower-level harness modes remain available for detailed inspection. The route planner now prefers `models action:"local"` for Ollama/local cookbook/hardware-fit wording, `action:"smoke"` for local server health checks, `action:"provider"` for provider account/subscription setup, and `action:"route"` for context/tool/latency/cost/privacy route-fit requests before credential, smoke, benchmark, or route-change effects. Model routes and local recipes expose one readiness score across latency, context window, tool support, vision, cost, and privacy. Exact model-route readiness now includes providerHealth posture that separates SDK provider-health type availability, daemon publication status, Agent consumption status, missing signals, and live latency when a daemon-published read model is reachable; local benchmark evidence remains separate task-fit evidence. The cookbook scans local CPU/RAM/platform, applies safe accelerator hints, ranks fit, returns setup plans with download/start guidance, local endpoint candidates with exact endpoint inspect routes, model-list smoke commands, smoke success criteria, failure triage, confirmed local smoke checks, provider-add and refresh route hints, benchmark action routes, a visible Check local servers action, a visible model-lane local benchmark action backed by agent_model_compare, saved benchmark-evidence review, saved local-route benchmark artifacts, and revealed winner judgments that raise matching recipe confidence before any separate default-model apply action.',
|
|
69
|
+
nextMoves: [
|
|
70
|
+
'Publish daemon-fed local provider health and richer local serving diagnostics beyond the current confirmed model-list smoke checks so Agent can consume live records instead of reporting the publication gap.',
|
|
71
|
+
'Carry measured per-candidate latency into exact model-route readiness once benchmark artifacts expose stable route ids for every candidate.',
|
|
72
|
+
],
|
|
73
|
+
competitorSignals: [
|
|
74
|
+
{ competitor: 'openclaw', evidence: 'Supports multiple model providers plus subscription auth and model failover.' },
|
|
75
|
+
{ competitor: 'hermes', evidence: 'Supports many providers, OpenRouter, local endpoints, and a managed tool gateway subscription.' },
|
|
76
|
+
{ competitor: 'odysseus', evidence: 'Cookbook scans hardware and recommends or serves models through Ollama, llama.cpp, and vLLM.' },
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'omnichannel-inbox-and-delivery',
|
|
81
|
+
userOutcome: 'The assistant is reachable where the user already communicates and can reply safely on those channels.',
|
|
82
|
+
targetStandard: 'better',
|
|
83
|
+
bestInClassRequirement: 'Channel setup is guided, inbound trust is default-safe, delivery is reliable, and the user can inspect every route from one place.',
|
|
84
|
+
goodVibesStatus: 'parity',
|
|
85
|
+
owners: ['agent', 'connected-host', 'companion'],
|
|
86
|
+
goodVibesNow: 'GoodVibes has broad channel adapters, readiness, policy, account inspection, pairing, notification, confirmed send routes, route-planner preference for channel setup/triage/delivery-receipt/send wording, and first-class `channels action:"status|channel|setup|triage|deliveries"` inspection for readiness, one channel, setup guide, triage, and redacted confirmed-send receipt history before any external delivery; `agent_channel_send` remains the confirmed send route. The guide ranks the next channel, walks the user through choosing a surface, enabling it intentionally, inspecting setup schema, configuring secret-backed settings, choosing delivery targets, reviewing allowlist policy, checking live status/doctor output, and sending only one explicitly confirmed test. Channel triage unifies setup blockers, daemon `/api/deliveries` attempts, visible control-plane surface messages, route bindings, and redacted Agent receipts without claiming provider-specific inbox polling.',
|
|
87
|
+
nextMoves: [
|
|
88
|
+
'Promote provider-specific unread channel inbox polling only when the connected-host contract publishes a general safe message feed.',
|
|
89
|
+
'Certify real delivery outcomes per channel before claiming release readiness.',
|
|
90
|
+
'Attach structured connected-host setup-schema, account, policy, status, and doctor receipts to the channel setup guide when the host publishes stable success/failure evidence.',
|
|
91
|
+
],
|
|
92
|
+
competitorSignals: [
|
|
93
|
+
{ competitor: 'openclaw', evidence: 'Lists broad messaging support across WhatsApp, Telegram, Slack, Discord, iMessage, Matrix, Teams, and more.' },
|
|
94
|
+
{ competitor: 'hermes', evidence: 'Gateway supports Telegram, Discord, Slack, WhatsApp, Signal, CLI, and email.' },
|
|
95
|
+
{ competitor: 'odysseus', evidence: 'Uses browser, email, ntfy, and mobile/PWA surfaces for user reach.' },
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
id: 'email-calendar-notes-and-tasks',
|
|
100
|
+
userOutcome: 'The assistant can triage email, draft replies, track calendar context, and act on notes or tasks with reminders.',
|
|
101
|
+
targetStandard: 'better',
|
|
102
|
+
bestInClassRequirement: 'Email, calendar, notes, tasks, reminders, and schedules share one reviewed personal operations surface.',
|
|
103
|
+
goodVibesStatus: 'partial',
|
|
104
|
+
owners: ['agent', 'connected-host'],
|
|
105
|
+
goodVibesNow: 'Agent now has a unified Personal Ops workspace and first-class `personal_ops action:"briefing|status|queue|intake|lane|read"` model tool, backed by the existing harness modes. The route planner prefers `personal_ops action:"briefing"` for daily/calendar briefings, `action:"queue"` for saved review queues, `action:"intake"` for fresh provider-read planning, and `action:"lane"` for connector setup posture before live provider reads or effects. The direct tool exposes a read-only daily plan across inbox, agenda, tasks, reminders, routines, delivery, notes, and the autonomy queue, a read-only queue view across saved inbox thread/calendar event review items plus fresh provider-read routes, and model-visible request intake that turns inbox, agenda, task, reminder, note, routine, and delivery asks into the safest lane, route, required fields, next steps, and confirmation boundary. Model-visible lanes for inbox, agenda, notes, work plans, tasks, reminders, routines, schedules, and delivery surface Agent-owned notes, routines, schedule receipts, and delivery channels as live records with safe routes. Email/calendar-capable MCP connectors surface as inspectable setup routes, expanded Personal Ops lanes classify connector tool names into read-only and write-like inbox/calendar capabilities, MCP schemas expand into inbox/calendar operation records with required fields, sample inputs, schema routes, confirmation flags, and fresh-read routes, inbox triage/draft plus calendar agenda/conflict workflow cards expose prerequisites, inspect routes, send/edit confirmation boundaries, and ordered execution plans that separate connector reads, local composition, and confirmed provider effects. Confirmed `personal_ops action:"read"` preserves the existing `run_personal_ops_read` boundary: one read-only inbox/calendar MCP operation with required-field checks, bounded redacted output, normalized review cards for common messages/events/results shapes, optional saved redacted review-card artifacts, and saved review artifacts resurfaced as redacted inbox thread and calendar event queue records with artifact inspect routes, freshness status, confirmed refresh routes when a matching read connector is ready, local draft/reminder follow-up routes, and explicit confirmed provider-effect boundaries. Task/reminder lanes now expose visible work-plan, connected-host task, confirmed reminder, autonomous schedule, and connected schedule operation records. Fresh provider-backed thread/event queues still need depth once connector/daemon records are durable.',
|
|
106
|
+
nextMoves: [
|
|
107
|
+
'Attach fresh provider-backed email thread queues, labels, and confirmed send/label/archive execution once connector or daemon records expose durable provider ids.',
|
|
108
|
+
'Attach fresh provider-backed CalDAV/calendar event queues, conflict detection, and confirmed edit/RSVP execution once connector or daemon records expose durable event ids.',
|
|
109
|
+
'Deepen provider-backed task/reminder records beyond the current local/connected-host operation cards.',
|
|
110
|
+
],
|
|
111
|
+
competitorSignals: [
|
|
112
|
+
{ competitor: 'openclaw', evidence: 'Showcases mail, calendar, reminders, issues, and personal operating-system workflows.' },
|
|
113
|
+
{ competitor: 'hermes', evidence: 'Messaging gateway includes email and skills include Google Workspace dependencies.' },
|
|
114
|
+
{ competitor: 'odysseus', evidence: 'Ships IMAP/SMTP email triage and local-first CalDAV calendar support.' },
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: 'closed-learning-loop',
|
|
119
|
+
userOutcome: 'The assistant gets better over time by saving useful memories, skills, and routines only when they are useful and reviewable.',
|
|
120
|
+
targetStandard: 'better',
|
|
121
|
+
bestInClassRequirement: 'Learning is automatic enough to be useful, but every durable behavior has provenance, review, rollback, and quality scoring.',
|
|
122
|
+
goodVibesStatus: 'partial',
|
|
123
|
+
owners: ['agent'],
|
|
124
|
+
goodVibesNow: 'Agent has local memory, notes, personas, skills, routines, learned-behavior capture, safe VIBE.md personality discovery from project/global files, safe project context discovery for .hermes.md/HERMES.md/AGENTS.md/CLAUDE.md/HERMES_HOME/SOUL.md/.cursorrules/.cursor/rules/*.mdc files, prompt injection for VIBE.md and project context after secret-looking content scans, direct `vibe action:"status|show|init|import_persona"` routes, /vibe status/init/show/import-persona routes, init/import preview confirmationRoutes, setup posture, Local Context and Personas workspace health counts for applied/loaded/blocked/truncated VIBE.md and project context files, learning-curator personality health cards for blocked/truncated personality files, and opt-in profile starter export/import/application for VIBE.md so users can start with a friendly personality file without persona-registry ceremony, hidden prompt surprises, or profile portability gaps. `context action:"files|file"` exposes target-aware context inspection, loaded/truncated/blocked status, bounded bodies, and direct workspace action route hints from Inspect project context / Inspect one context file. Formal behavior prompt injection still uses only reviewed memory at or above the durable confidence threshold plus reviewed setup-ready skills, routines, bundles, and personas while listing suppressed unreviewed/setup-blocked behavior for curator review; runtime prompt builds now write durable prompt-context receipt ids with turn/source/model/provider, selected and suppressed record refs, segment counts, prompt hash, size, timestamp, and sanitized terminal outcome for completed/error/cancelled turns without storing raw prompt or response text, `context action:"prompt|receipts|receipt"` exposes the applied prompt composition order, recent receipt ids, exact receiptId/turnId/outcomeStatus filters, turn outcomes, selected VIBE.md/project context/memory/routine/skill/persona records, suppressed records, prompt previews on request, and approximate token budget without mutating local context, and Agent Workspace -> Local Context renders a compact prompt receipt timeline with total/completed/error/cancelled/pending counts, latest turn outcome, applied/suppressed counts, bounded outcome detail, exact latest-receipt drill-in, and outcome filter routes. The direct `memory action:"curator|candidate"` route now returns a score-driven prompt plan that shows prompt-active records, suppressed review/setup/low-confidence/personality/consolidation counts, proposal queues, consolidation queues, ordering rules, and exact review routes before durable context expands; it also ranks review, stale, missing-setup, low-confidence, VIBE.md health, duplicate-consolidation candidates with visible diffs/rollback/recreate routes, an ordered duplicate-consolidation batch review plan, confirmed duplicate-consolidation phase helpers for preview/merge/stale/delete/rollback/recreate with durable receipts, delete refusal until duplicates are staged stale, and exact-id post-delete recreate guidance that refuses unsafe id collisions, reviewed-note, completed-work, completed-research, and saved-session memory/behavior proposals, and promotion candidates with existing safe routes. The direct `memory action:"status|provider|list|search|get"` route now exposes local memory counts, direct memory record lookup/search, prompt-active recall, vector stats, embedding-provider doctor warnings, provider inspection, route-planner preference for external provider/backend/sync/import/export setup posture, and external-memory setup contract maps for Honcho, OpenViking, Mem0, Hindsight, Holographic, RetainDB, ByteRover, and Supermemory with provider-specific next-route packets, missing setup/status/read/write/sync checklist items, and required sync/write receipt fields while honestly marking provider records as not published until the SDK/daemon publishes concrete setup/status/read/write/receipt records for Agent to consume.',
|
|
125
|
+
nextMoves: [
|
|
126
|
+
'Consume external memory-provider status/read/write/sync execution records in the current memory action:"provider" setup-contract maps when the connected host or SDK publishes Honcho, Mem0, Supermemory, or similar backend records.',
|
|
127
|
+
'Expose external memory-provider receipt parity for cross-session sync once provider setup/status/read/write records become durable daemon or SDK contracts.',
|
|
128
|
+
],
|
|
129
|
+
competitorSignals: [
|
|
130
|
+
{ competitor: 'openclaw', evidence: 'Skills and memory are core extension points.' },
|
|
131
|
+
{ competitor: 'hermes', evidence: 'Markets a closed learning loop with autonomous skill creation, skill improvement, session search, and user modeling.' },
|
|
132
|
+
{ competitor: 'odysseus', evidence: 'Ships persistent memory and skills backed by vector and keyword retrieval.' },
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
id: 'autonomous-schedules-and-background-work',
|
|
137
|
+
userOutcome: 'The user can ask for ongoing work in natural language and then supervise, pause, resume, or cancel it from a clear queue.',
|
|
138
|
+
targetStandard: 'better',
|
|
139
|
+
bestInClassRequirement: 'Schedules, cron jobs, recurring routines, and long-running tasks are autonomous but never hidden.',
|
|
140
|
+
goodVibesStatus: 'partial',
|
|
141
|
+
owners: ['agent', 'connected-host'],
|
|
142
|
+
goodVibesNow: 'Agent has a first-class `schedule` adapter for schedule action:list/create/remind/edit/run/pause/resume/delete that routes to confirmed natural-language autonomous schedule creation when task, cadence, success criteria, and user request provenance are explicit; reminder scheduling; routine promotion; confirmed connected schedule editing with read-only current-state before/after diffs from schedules.list before confirmation; and allowlisted schedule lifecycle controls. Unconfirmed schedule and routine-promotion previews now return explicit confirmationRoutes instead of vague rerun guidance, and confirmed actions return next routes for schedule list, autonomy queue inspection, run, edit, pause, resume, and delete when applicable. It also has connected schedule posture; a read-only ongoing-work intake selector with trigger workflow posture, watcher receipt success criteria, and a read-only watcher evidence contract for durable run-history receipts, provider source records, redacted event payload descriptors, and queue correlation records across time-based wakeups/schedules, published watchers.create/list/run/start/stop incoming webhook or event watchers, Gmail/email connector-gated triggers, and control-plane event streams; `agent_operator_method` certified watcher receipt outcomes for watchers.create/patch/run/start/stop/delete; and a read-only autonomy queue that maps visible owners, status, inspect routes, cancel/recovery routes, live research runs, live connected-host task records, live approval records, live automation run records, live schedule records, delegated subagent orchestration routes, log tails, diagnostics for task retry/output/correlation and automation telemetry/delivery/route posture, bounded redacted host task output route/preview descriptors, source ids, normalized available/unavailable controls with reasons, and exact confirmed checkpoint/pause/resume/cancel/edit/control routes where supported, including first-class schedule pause/resume aliases over the daemon enable/disable lifecycle. Agent also exposes visible local Agent orchestration through `agent_orchestration` and `agent_orchestration_agent`, plus tracked local background processes through `background_processes`, `background_process`, and confirmed `run_background_process` start/wait/stop routes with process-style poll/log/kill/write and session-id aliases that feed the same background-work cockpit lane; true live host output chunk streams and persisted/provider-specific watcher run or source records still need connected-host publication and consumption depth.',
|
|
143
|
+
nextMoves: [
|
|
144
|
+
'Attach true live host output chunk streams when the connected host exposes them beyond current bounded task output route/preview descriptors.',
|
|
145
|
+
'Consume certified watcher receipts, durable run history, and provider-specific Gmail/email source records in the autonomy queue when the SDK/daemon publishes those source-owned records.',
|
|
146
|
+
],
|
|
147
|
+
competitorSignals: [
|
|
148
|
+
{ competitor: 'openclaw', evidence: 'Supports cron, wakeups, webhooks, Gmail triggers, and always-on gateway workflows.' },
|
|
149
|
+
{ competitor: 'hermes', evidence: 'Built-in cron scheduler delivers daily reports, backups, audits, and unattended work.' },
|
|
150
|
+
{ competitor: 'odysseus', evidence: 'Notes, tasks, reminders, and cron-style scheduled tasks can be acted on by the agent.' },
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
id: 'computer-use-browser-and-shell',
|
|
155
|
+
userOutcome: 'The assistant can browse, use the computer, run shell commands, edit files, and recover from mistakes with understandable approvals.',
|
|
156
|
+
targetStandard: 'better',
|
|
157
|
+
bestInClassRequirement: 'Computer use includes browser control, shell, files, code edits, desktop/device actions, sandboxing, undo, and live tool cards.',
|
|
158
|
+
goodVibesStatus: 'partial',
|
|
159
|
+
owners: ['agent', 'connected-host', 'companion'],
|
|
160
|
+
goodVibesNow: 'Agent exposes local-first execution posture for read/search/analyze, file edit/write, bounded foreground shell commands, web/fetch evidence, Work workspace process supervision with tracked/running/completed counts plus stdin/PTY/sudo parity and direct process actions, visible process monitor/live tail/tool inspector supervision routes, first-class `execution action:"capabilities|process_capabilities"`, `computer action:"plan"`, `terminal`, and `process` adapters for direct process parity reports, browser navigation/screenshot/desktop-control workflow planning, terminal(command, background:true), and process(action:list/poll/wait/log/kill/write/capabilities) UX over confirmed tracked local background process start/list/status/log/wait/stop routes, session-id aliases, bounded redacted process log tails with byte/count/truncation metadata, a read-only process parity matrix for terminal background start plus process list/poll/wait/log/kill/write/PTY/sudo semantics, route-planner preference for `execution action:"process_capabilities"` when the user asks about interactive CLI, PTY, stdin, sudo, or privilege prompts, dynamic SDK/daemon substrate probes for ProcessManager stdin/PTY methods, terminal/PTY operator routes, session-input steering routes, and credential routes, confirmed stdin write execution when a safe ProcessManager stdin method is discovered, setup-linked sudo execution posture with foreground-supervised escalation guidance, SUDO_PASSWORD presence-only reporting, blocked background sudo/stdin password routes, and missing contract evidence, execution-history activity cards that group redacted records by turn with status/outcome, verification evidence, bounded process-output summaries, live-output routes, exact inspect routes, and file-recovery handoffs, confirmed file recovery, strict browser/desktop ready-attention-setup posture with workflow cards/checklists/fallback routes, and delegation for isolation, parallelism, remote execution, separate worktrees, or requested review. Current SDK still lacks a typed PTY session, sudo credential mediation contract, and generic live browser/desktop command contract, so PTY remains discover-only/not generically executable, browser/desktop control remains route-planned before specific trusted tools are inspected, and background sudo prompts are blocked without reading, storing, printing, or injecting raw password values.',
|
|
161
|
+
nextMoves: [
|
|
162
|
+
'Attach true live process ids and host output chunks to history cards once the SDK/daemon ProcessManager exposes stable interactive output records.',
|
|
163
|
+
'Add typed PTY session execution and sudo credential mediation once the SDK/daemon exposes interactive APIs with visible user control.',
|
|
164
|
+
'Keep delegation for isolation, parallelism, or remote execution, not as the default user-facing answer to coding work.',
|
|
165
|
+
'Implement first-class browser/desktop command execution adapters once trusted tool invocation contracts expose visible result receipts.',
|
|
166
|
+
],
|
|
167
|
+
competitorSignals: [
|
|
168
|
+
{ competitor: 'openclaw', evidence: 'Provides browser control, canvas, nodes, system.run, camera, screen recording, and session tools.' },
|
|
169
|
+
{ competitor: 'hermes', evidence: 'Includes terminal backends, browser tools, code execution, computer-use tooling, and isolated subagents.' },
|
|
170
|
+
{ competitor: 'odysseus', evidence: 'Agent uses web, files, shell, MCP, skills, and memory through opencode.' },
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
id: 'multi-agent-and-remote-execution',
|
|
175
|
+
userOutcome: 'Large tasks can be split safely across isolated agents or remote runners while the user sees progress and can intervene.',
|
|
176
|
+
targetStandard: 'better',
|
|
177
|
+
bestInClassRequirement: 'Parallelism is available when it improves time-to-result, with per-task workspaces, logs, artifacts, and review gates.',
|
|
178
|
+
goodVibesStatus: 'partial',
|
|
179
|
+
owners: ['agent', 'connected-host'],
|
|
180
|
+
goodVibesNow: 'GoodVibes has shared-session, remote runner, artifact, task, worktree, orchestration, subagent, and delegation foundations; Agent exposes `agent_orchestration` and `agent_orchestration_agent` for live visible subagent records, serial-by-default policy, managed multi-agent plan milestones, per-agent plan cards with cancel/message/wait routes, work-plan links, dispatch receipt counts, closeout cards, remote-runner contract/artifact evidence, auto-attached remote artifact review routes matched by runner id, spawn/batch-spawn decision cards, templates, and exact first-class `agent` list/inspect/message/wait/cancel routes, plus local-first, TUI handoff, delegated-review, remote-inspection, and hidden-fanout-blocked decision cards with structured confirmed handoff briefs. Approved visible work-plan items can now be dispatched through `agent_work_plan action:"dispatch_agents"` into first-class `agent` spawn or batch-spawn calls with saved linked-agent receipts, post-dispatch next routes for orchestration, work-plan detail, agent inspect/wait/message/cancel, and closeout, and managed orchestration closeout visibility. It intentionally blocks invisible local fanout and raw remote mutation from Agent.',
|
|
181
|
+
nextMoves: [
|
|
182
|
+
'Promote completed remote-runner artifact capture/export receipts into the closeout cards when the remote runtime publishes stable capture outcome records.',
|
|
183
|
+
'Add per-task workspace/worktree evidence to managed plan cards when the connected host exposes stable workspace isolation records.',
|
|
184
|
+
'Keep default chat serial, but route complex execution to supervised parallel work when it clearly helps the user.',
|
|
185
|
+
],
|
|
186
|
+
competitorSignals: [
|
|
187
|
+
{ competitor: 'openclaw', evidence: 'Supports multi-agent routing and sessions tools for agent-to-agent coordination.' },
|
|
188
|
+
{ competitor: 'hermes', evidence: 'Spawns isolated subagents and has kanban-style orchestration with per-task worktrees.' },
|
|
189
|
+
{ competitor: 'odysseus', evidence: 'Lets users hand tools to an agent and have it run whole tasks itself.' },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
id: 'deep-research-and-knowledge-reports',
|
|
194
|
+
userOutcome: 'The user can ask for deep research and receive a sourced, inspectable report that can be saved to knowledge.',
|
|
195
|
+
targetStandard: 'better',
|
|
196
|
+
bestInClassRequirement: 'Research plans, source quality, citations, synthesis, visual report output, and knowledge ingest are one coherent workflow.',
|
|
197
|
+
goodVibesStatus: 'partial',
|
|
198
|
+
owners: ['agent', 'connected-host'],
|
|
199
|
+
goodVibesNow: 'Agent has web research, URL inspection, Agent Knowledge, ingest routes, route-planner preference for browser-backed runner readiness and visual report rendering posture, a Research workspace that shows browser-runner and visual-report readiness plus exact run/source/report routes, a Research briefing action, Plan workflow action, Public source search action, Browser runner readiness action, and Report artifacts action, a project-local visible research run ledger with phase/progress/checkpoints/log tails/pause/resume/cancel/complete routes, a read-only next-action briefing across visible runs, source review, saved reports, browser readiness, and exact follow-up routes, read-only research workflow planning across run/source/report/browser/Knowledge routes, bounded public source-candidate search that returns capture-ready source summaries and exact confirmed add_source routes without writing the queue, browser-backed runner readiness with setup/fallback/source-review/report/Knowledge-promotion routes plus an explicit browser-runner contract for visible controls/source receipts/bounded logs/report handoff, a research source queue with credibility, score, review/reject/use state, report-ready source lines, reviewed-source bundle handoff, direct saved report artifact inspection, and confirmed sourced report artifact saving with citation/source maps plus citation coverage metadata, repair guidance, optional strict enforcement, and visual report packets that add at-a-glance summary, evidence matrix, findings board, dated source/comparison view, open questions, next actions, and handoff checklist over the same reviewed source artifact; browser-backed autonomous research execution and browser/PWA visual rendering are still missing.',
|
|
200
|
+
nextMoves: [
|
|
201
|
+
'Implement the browser-runner contract as a live deep research executor that updates visible run controls, source queue records, bounded logs, and report drafts as it works.',
|
|
202
|
+
'Carry saved visual report packets into the browser/PWA renderer when the connected-host report surface publishes a concrete route.',
|
|
203
|
+
],
|
|
204
|
+
competitorSignals: [
|
|
205
|
+
{ competitor: 'openclaw', evidence: 'Showcases web research, bookmarks, project research, and personal knowledge workflows.' },
|
|
206
|
+
{ competitor: 'hermes', evidence: 'Has web tools, session search, trajectory tooling, and research-ready batch workflows.' },
|
|
207
|
+
{ competitor: 'odysseus', evidence: 'Ships Deep Research that gathers, reads, and synthesizes sources into a visual report.' },
|
|
208
|
+
],
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: 'documents-files-and-model-comparison',
|
|
212
|
+
userOutcome: 'The user can write documents, compare models, handle uploads, and inspect generated artifacts without leaving the assistant.',
|
|
213
|
+
targetStandard: 'parity',
|
|
214
|
+
bestInClassRequirement: 'Documents, uploads, AI edit suggestions, blind model comparison, and artifact reuse are first-class app workflows.',
|
|
215
|
+
goodVibesStatus: 'parity',
|
|
216
|
+
owners: ['agent', 'connected-host'],
|
|
217
|
+
goodVibesNow: 'Document Ops now has project-scoped versioned markdown drafts with browse/show/create/revise/review/comment/suggest/accept-suggestion/reject-suggestion/artifact-attach/artifact-insert/export, uploads, exports, sources, media artifacts, reviewer-ready document export appendices with comment and AI suggestion summaries plus review metadata counts, a visible chronological review packet timeline across documents, comments, AI suggestions, attachments, document exports, comparisons, judgments, route-decision receipts, saved packet presets, handoffs, handoff archives, and route-decision next actions, a visible read-only reviewer-readiness preflight that flags missing source artifacts, unresolved comments, proposed suggestions, unrevealed comparisons, hidden judgments, route-change decisions, and incomplete reviewer handoff evidence before export/archive/apply, inline readiness badges at document export, reviewer handoff/archive, and route-apply forms, review packet defaults that pick the latest document/export/comparison/judgment/route-decision/handoff evidence and use saved preset evidence only as fallback to prefill document export, compare handoff/archive, winner-apply, leave-unchanged route-decision, save-preset, and share forms with field-local hints, a guided read-only review packet wizard with progress, current-step routing, backtracking routes, persisted apply/leave-unchanged route-decision evidence, final archive review, and refreshed-preset lineage verification before external sharing, a confirmed `agent_review_packet_presets` tool plus workspace forms that save/list/show reusable document/comparison/judgment/route-decision/handoff/archive/related artifact packet presets without changing documents, model routing, handoffs, or archives, run list/show freshness checks for missing or superseded artifact ids, recommend reuse routes that point at newer matching evidence when metadata is sufficient, and refresh stale presets into new local preset artifacts with source-preset lineage after explicit confirmation, a unified artifact browser with read-only browse/show, filters, redacted metadata, bounded text previews, confirmed artifact export-to-file, confirmed multi-artifact package directory and ZIP archive export with exact bytes, README, and redacted manifest, confirmed artifact-to-Knowledge promotion, confirmed artifact-to-document attachment, and confirmed artifact-to-compare reuse for saved text artifacts, plus a confirmed blind comparison runner with delayed reveal, durable JSON comparison artifacts, saved review boards, side-by-side reviewer views that combine related document/artifact excerpts with comparison evidence, split-pane reviewer handoff diffs with section jump focus plus recent-handoff defaults and visible recent choices from artifact metadata, saved judgment artifacts, task/document/benchmark-filtered preference analytics and cross-session synthesis, markdown report export, confirmed apply-winner route-decision receipts, confirmed leave-unchanged route-decision receipts, reviewer handoff artifacts that combine comparison evidence with related document/artifact exports, one-click reviewer handoff ZIP archives with source comparison/judgment, related evidence bytes, matching route-decision receipt bytes, README, and manifest ids, confirmed `agent_review_packet_share` delivery of plain-text archive references through configured channel targets after explicit confirmation, and confirmed winner route updates.',
|
|
218
|
+
nextMoves: [
|
|
219
|
+
'Certify real reviewer packet delivery outcomes across configured channel targets before claiming release-depth external delivery.',
|
|
220
|
+
'Carry the same packet wizard, lineage, and archive-share workflow into future browser/PWA surfaces without weakening confirmation or ZIP-byte boundaries.',
|
|
221
|
+
],
|
|
222
|
+
competitorSignals: [
|
|
223
|
+
{ competitor: 'openclaw', evidence: 'Canvas and browser/web surfaces provide visual interaction primitives.' },
|
|
224
|
+
{ competitor: 'hermes', evidence: 'TUI and dashboard surfaces support conversation history, tools, and sessions.' },
|
|
225
|
+
{ competitor: 'odysseus', evidence: 'Ships Documents and Compare workflows in the web workspace.' },
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: 'mobile-voice-and-device-nodes',
|
|
230
|
+
userOutcome: 'The user can talk to the assistant and use phone or desktop device capabilities without returning to the terminal.',
|
|
231
|
+
targetStandard: 'better',
|
|
232
|
+
bestInClassRequirement: 'Voice, mobile, notifications, camera, screen, location, and device commands are paired, permission-aware, and reliable.',
|
|
233
|
+
goodVibesStatus: 'partial',
|
|
234
|
+
owners: ['agent', 'connected-host', 'companion'],
|
|
235
|
+
goodVibesNow: 'Agent now has first-class `computer action:"status|plan|control|browser|setup|mcp|open_browser"` UX over browser/PWA readiness, browser/screenshot/desktop-control route planning, repair/setup, trusted tool discovery, and visible browser cockpit handoffs, plus `device action:"status|capability|voice|provider|open_tts_provider|open_tts_voice"` UX over companion pairing, mobile/PWA compatibility, voice/TTS, notifications, provider posture, and visible TTS picker handoffs while preserving the existing harness detail routes. The route planner now prefers `device action:"voice"` for push-to-talk, voice memo transcription, spoken-response, and wake-word posture, `device action:"provider"` for TTS provider/voice setup, and `computer action:"browser"` for browser cockpit/PWA readiness before visible handoffs. The read-only device capability map reports ready/attention/setup-needed states, computer browser/PWA readiness reports URL/category/mobile/receipt gaps, browser/desktop control reports trusted-tool/MCP setup posture and safe workflow plans, and voice workflow posture maps push-to-talk, voice memo transcription, spoken responses, and wake-word capture. The Voice & Media workspace now gives users Voice workflows, Device capability map, and Browser/PWA readiness actions with direct `device` and `computer` route hints; camera, location, and wake-word capture remain honest not-published contract gaps.',
|
|
236
|
+
nextMoves: [
|
|
237
|
+
'Finish companion app command depth and permission repair using the visible capability map as the user-facing checklist.',
|
|
238
|
+
'Connect companion-side push-to-talk execution and publish wake/speak only after a permission-scoped runtime contract exists.',
|
|
239
|
+
'Certify camera, screen, notification, location, and local command routes by platform.',
|
|
240
|
+
],
|
|
241
|
+
competitorSignals: [
|
|
242
|
+
{ competitor: 'openclaw', evidence: 'macOS, iOS, and Android nodes expose voice, canvas, camera, screen, location, notifications, and system commands.' },
|
|
243
|
+
{ competitor: 'hermes', evidence: 'Runs in Termux and supports voice memo transcription and messaging continuity.' },
|
|
244
|
+
{ competitor: 'odysseus', evidence: 'Responsive PWA works on mobile and includes browser notifications.' },
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
id: 'web-dashboard-and-pwa',
|
|
249
|
+
userOutcome: 'The assistant is usable from a browser with clear status, settings, sessions, tools, and mobile-friendly controls.',
|
|
250
|
+
targetStandard: 'better',
|
|
251
|
+
bestInClassRequirement: 'The browser surface is not a secondary admin panel; it is a full user-grade assistant cockpit.',
|
|
252
|
+
goodVibesStatus: 'partial',
|
|
253
|
+
owners: ['connected-host', 'agent'],
|
|
254
|
+
goodVibesNow: 'GoodVibes host has web/control-plane foundations, and Agent now exposes the configured connected-host browser cockpit/PWA through first-class `computer action:"browser|open_browser"` routes plus Home and Voice & Media workspace actions, with route-planner preference for browser cockpit, web dashboard, and PWA wording before any visible browser-open handoff. The route resolves `web.publicBaseUrl` or the web endpoint binding, requires explicit user confirmation before opening an external browser, returns service/web setup routes when disabled, and reports workspace-category coverage, mobile/PWA controls, Agent onboarding marker status, and the unpublished browser/PWA first-run receipt contract instead of pretending a separate Agent web app or completed browser-native cockpit exists. Agent remains terminal-first until connected-host browser-native Agent category routes are published.',
|
|
255
|
+
nextMoves: [
|
|
256
|
+
'Publish connected-host browser-native routes for Agent workspace categories using the existing coverage map as the acceptance checklist.',
|
|
257
|
+
'Add mobile-friendly chat, setup, automations, approvals, memory, and channel setup controls from the same route contracts.',
|
|
258
|
+
'Fold browser-cockpit readiness into first-run finish state once connected-host browser/PWA receipts prove the route is ready.',
|
|
259
|
+
],
|
|
260
|
+
competitorSignals: [
|
|
261
|
+
{ competitor: 'openclaw', evidence: 'Gateway serves Control UI and WebChat, plus companion apps.' },
|
|
262
|
+
{ competitor: 'hermes', evidence: 'Provides local web dashboard and TUI gateway surfaces.' },
|
|
263
|
+
{ competitor: 'odysseus', evidence: 'Primary experience is a self-hosted responsive web workspace/PWA.' },
|
|
264
|
+
],
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
id: 'security-permissions-and-recovery',
|
|
268
|
+
userOutcome: 'Powerful automation is safe by default, explainable, recoverable, and adjustable without killing capability.',
|
|
269
|
+
targetStandard: 'better',
|
|
270
|
+
bestInClassRequirement: 'Every risky action has clear scope, trust, provenance, approval UX, logs, rollback, and doctor repair.',
|
|
271
|
+
goodVibesStatus: 'leading',
|
|
272
|
+
owners: ['agent', 'connected-host', 'release'],
|
|
273
|
+
goodVibesNow: 'GoodVibes has strong permission policy, secrets, MCP trust, pairing, redaction, readiness, doctor, release evidence, operator audit surfaces, first-class security posture and finding inspection, and route-planner preference for `security action:"status|finding|explain"` so users can ask what permissions are active, inspect exact findings, or see whether one model action is allowed, denied, blocked, or waiting on confirmation.',
|
|
274
|
+
nextMoves: [
|
|
275
|
+
'Keep strong defaults while reducing unnecessary confirmations for already-approved low-risk workflows.',
|
|
276
|
+
'Attach every autonomous task to audit logs, artifacts, and rollback or cancel affordances.',
|
|
277
|
+
],
|
|
278
|
+
competitorSignals: [
|
|
279
|
+
{ competitor: 'openclaw', evidence: 'Emphasizes secure defaults, DM pairing, allowlists, sandboxing, and doctor checks.' },
|
|
280
|
+
{ competitor: 'hermes', evidence: 'Documents command approval, DM pairing, container isolation, network egress isolation, and observability hooks.' },
|
|
281
|
+
{ competitor: 'odysseus', evidence: 'Gates admin-only tools, local services, shell, file access, webhooks, and tokens with security guidance.' },
|
|
282
|
+
],
|
|
283
|
+
},
|
|
284
|
+
];
|
|
285
|
+
|
|
286
|
+
export function competitiveInventoryStatusCounts(): Record<GoodVibesCompetitiveStatus, number> {
|
|
287
|
+
return COMPETITIVE_FEATURE_INVENTORY.reduce<Record<GoodVibesCompetitiveStatus, number>>((counts, item) => {
|
|
288
|
+
counts[item.goodVibesStatus] += 1;
|
|
289
|
+
return counts;
|
|
290
|
+
}, {
|
|
291
|
+
leading: 0,
|
|
292
|
+
parity: 0,
|
|
293
|
+
partial: 0,
|
|
294
|
+
gap: 0,
|
|
295
|
+
});
|
|
296
|
+
}
|