@pellux/goodvibes-agent 1.1.7 → 1.3.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.
Files changed (274) hide show
  1. package/CHANGELOG.md +329 -0
  2. package/README.md +46 -30
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
  5. package/dist/package/main.js +138903 -91477
  6. package/docs/README.md +14 -7
  7. package/docs/channels-remote-and-api.md +8 -5
  8. package/docs/connected-host.md +14 -12
  9. package/docs/getting-started.md +58 -30
  10. package/docs/knowledge-artifacts-and-multimodal.md +7 -5
  11. package/docs/project-planning.md +2 -2
  12. package/docs/providers-and-routing.md +11 -3
  13. package/docs/tools-and-commands.md +116 -45
  14. package/docs/voice-and-live-tts.md +3 -1
  15. package/package.json +3 -2
  16. package/release/release-notes.md +142 -5
  17. package/release/release-readiness.json +124 -94
  18. package/src/agent/assistant-cockpit.ts +247 -0
  19. package/src/agent/autonomy-schedule-format.ts +96 -0
  20. package/src/agent/autonomy-schedule.ts +514 -0
  21. package/src/agent/channel-delivery-receipts.ts +292 -0
  22. package/src/agent/competitive-feature-inventory.ts +294 -0
  23. package/src/agent/document-registry-types.ts +106 -0
  24. package/src/agent/document-registry.ts +734 -0
  25. package/src/agent/harness-control.ts +2 -2
  26. package/src/agent/memory-prompt.ts +2 -2
  27. package/src/agent/operator-actions.ts +50 -6
  28. package/src/agent/persona-registry.ts +8 -0
  29. package/src/agent/project-context-files.ts +273 -0
  30. package/src/agent/prompt-context-receipts.ts +502 -0
  31. package/src/agent/reminder-schedule-format.ts +16 -2
  32. package/src/agent/research-run-registry.ts +582 -0
  33. package/src/agent/research-source-registry.ts +441 -0
  34. package/src/agent/routine-registry.ts +19 -3
  35. package/src/agent/routine-schedule-format.ts +27 -2
  36. package/src/agent/runtime-profile-starters.ts +7 -0
  37. package/src/agent/runtime-profile.ts +106 -4
  38. package/src/agent/schedule-edit-format.ts +129 -0
  39. package/src/agent/schedule-edit.ts +496 -0
  40. package/src/agent/schedule-next-routes.ts +42 -0
  41. package/src/agent/setup-wizard-artifact-receipts.ts +366 -0
  42. package/src/agent/setup-wizard-checkpoint.ts +140 -0
  43. package/src/agent/setup-wizard.ts +683 -0
  44. package/src/agent/skill-registry-types.ts +102 -0
  45. package/src/agent/skill-registry.ts +81 -107
  46. package/src/agent/vibe-confirmation-routes.ts +62 -0
  47. package/src/agent/vibe-file.ts +285 -0
  48. package/src/cli/agent-knowledge-command.ts +45 -2
  49. package/src/cli/help.ts +3 -0
  50. package/src/cli/profiles-command.ts +25 -11
  51. package/src/config/agent-settings-policy.ts +1 -18
  52. package/src/input/agent-workspace-activation.ts +53 -0
  53. package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
  54. package/src/input/agent-workspace-artifact-metadata.ts +17 -0
  55. package/src/input/agent-workspace-basic-command-editors.ts +5 -1
  56. package/src/input/agent-workspace-categories.ts +153 -155
  57. package/src/input/agent-workspace-channel-triage.ts +481 -0
  58. package/src/input/agent-workspace-channels.ts +263 -0
  59. package/src/input/agent-workspace-command-editor.ts +152 -0
  60. package/src/input/agent-workspace-context-snapshot.ts +349 -0
  61. package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
  62. package/src/input/agent-workspace-document-editor.ts +502 -0
  63. package/src/input/agent-workspace-document-ops-editor.ts +523 -0
  64. package/src/input/agent-workspace-host-category.ts +1 -1
  65. package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
  66. package/src/input/agent-workspace-model-compare-editor.ts +376 -0
  67. package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
  68. package/src/input/agent-workspace-model-compare-types.ts +82 -0
  69. package/src/input/agent-workspace-model-compare-utils.ts +35 -0
  70. package/src/input/agent-workspace-onboarding-categories.ts +141 -0
  71. package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
  72. package/src/input/agent-workspace-operations-command-editors.ts +22 -0
  73. package/src/input/agent-workspace-research-report-editor.ts +212 -0
  74. package/src/input/agent-workspace-research-run-editor.ts +144 -0
  75. package/src/input/agent-workspace-research-source-editor.ts +167 -0
  76. package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
  77. package/src/input/agent-workspace-review-packet-utils.ts +265 -0
  78. package/src/input/agent-workspace-settings.ts +313 -30
  79. package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
  80. package/src/input/agent-workspace-setup-snapshot.ts +217 -0
  81. package/src/input/agent-workspace-setup.ts +61 -1
  82. package/src/input/agent-workspace-snapshot.ts +184 -149
  83. package/src/input/agent-workspace-types.ts +287 -2
  84. package/src/input/agent-workspace.ts +23 -1
  85. package/src/input/command-registry.ts +9 -2
  86. package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
  87. package/src/input/commands/channels-runtime.ts +102 -114
  88. package/src/input/commands/delegation-runtime.ts +87 -24
  89. package/src/input/commands/knowledge-browser-flags.ts +12 -0
  90. package/src/input/commands/knowledge.ts +28 -14
  91. package/src/input/commands/operator-actions-runtime.ts +6 -3
  92. package/src/input/commands/schedule-runtime.ts +71 -14
  93. package/src/input/commands/session-content.ts +2 -2
  94. package/src/input/commands/shell-core.ts +2 -0
  95. package/src/input/commands/vibe-runtime.ts +140 -0
  96. package/src/input/commands.ts +2 -0
  97. package/src/input/connected-host-routes.ts +123 -0
  98. package/src/input/settings-modal-types.ts +14 -0
  99. package/src/input/setup-wizard-live-receipts.ts +76 -0
  100. package/src/main.ts +15 -15
  101. package/src/panels/qr-panel.ts +2 -2
  102. package/src/renderer/agent-workspace-context-lines.ts +701 -0
  103. package/src/renderer/agent-workspace.ts +68 -421
  104. package/src/renderer/settings-modal-helpers.ts +12 -0
  105. package/src/renderer/settings-modal.ts +12 -0
  106. package/src/runtime/bootstrap-command-context.ts +11 -1
  107. package/src/runtime/bootstrap-command-parts.ts +14 -3
  108. package/src/runtime/bootstrap-core.ts +39 -1
  109. package/src/runtime/bootstrap-shell.ts +6 -0
  110. package/src/runtime/bootstrap.ts +113 -30
  111. package/src/runtime/connected-host-auth.ts +3 -2
  112. package/src/runtime/execution-ledger.ts +231 -0
  113. package/src/runtime/services.ts +88 -10
  114. package/src/runtime/tool-permission-safety.ts +199 -5
  115. package/src/shell/session-continuity-hints.ts +39 -0
  116. package/src/tools/agent-artifacts-tool.ts +606 -0
  117. package/src/tools/agent-audit-tool.ts +155 -0
  118. package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
  119. package/src/tools/agent-autonomy-tool.ts +140 -0
  120. package/src/tools/agent-channel-send-tool.ts +24 -2
  121. package/src/tools/agent-channels-tool.ts +140 -0
  122. package/src/tools/agent-computer-tool.ts +168 -0
  123. package/src/tools/agent-context-policy.ts +137 -7
  124. package/src/tools/agent-context-tool.ts +143 -0
  125. package/src/tools/agent-delegation-tool.ts +128 -0
  126. package/src/tools/agent-device-tool.ts +240 -0
  127. package/src/tools/agent-documents-tool.ts +684 -0
  128. package/src/tools/agent-execution-tool.ts +230 -0
  129. package/src/tools/agent-harness-agent-orchestration-policy.ts +75 -0
  130. package/src/tools/agent-harness-agent-orchestration.ts +791 -0
  131. package/src/tools/agent-harness-autonomy-intake.ts +785 -0
  132. package/src/tools/agent-harness-autonomy-live-records.ts +742 -0
  133. package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
  134. package/src/tools/agent-harness-autonomy-queue.ts +571 -0
  135. package/src/tools/agent-harness-autonomy-watcher-read-models.ts +509 -0
  136. package/src/tools/agent-harness-background-processes-types.ts +35 -0
  137. package/src/tools/agent-harness-background-processes.ts +798 -0
  138. package/src/tools/agent-harness-browser-cockpit-route.ts +373 -0
  139. package/src/tools/agent-harness-browser-control.ts +346 -0
  140. package/src/tools/agent-harness-browser-pwa-read-models.ts +622 -0
  141. package/src/tools/agent-harness-channel-metadata.ts +168 -10
  142. package/src/tools/agent-harness-cli-command-policy.ts +110 -0
  143. package/src/tools/agent-harness-command-catalog.ts +4 -2
  144. package/src/tools/agent-harness-command-runner.ts +42 -0
  145. package/src/tools/agent-harness-connected-host-status.ts +7 -4
  146. package/src/tools/agent-harness-delegation-posture.ts +234 -19
  147. package/src/tools/agent-harness-device-live-read-models.ts +366 -0
  148. package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
  149. package/src/tools/agent-harness-document-ops-types.ts +72 -0
  150. package/src/tools/agent-harness-document-ops.ts +671 -0
  151. package/src/tools/agent-harness-execution-history.ts +489 -0
  152. package/src/tools/agent-harness-execution-posture.ts +385 -0
  153. package/src/tools/agent-harness-file-recovery.ts +135 -0
  154. package/src/tools/agent-harness-interactive-runtime-records.ts +421 -0
  155. package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
  156. package/src/tools/agent-harness-learning-curator-common.ts +102 -0
  157. package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
  158. package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
  159. package/src/tools/agent-harness-learning-curator-types.ts +151 -0
  160. package/src/tools/agent-harness-learning-curator.ts +417 -0
  161. package/src/tools/agent-harness-local-model-benchmarks.ts +269 -0
  162. package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
  163. package/src/tools/agent-harness-local-model-endpoints.ts +788 -0
  164. package/src/tools/agent-harness-local-model-smoke.ts +277 -0
  165. package/src/tools/agent-harness-local-model-url.ts +78 -0
  166. package/src/tools/agent-harness-media-posture.ts +223 -2
  167. package/src/tools/agent-harness-memory-external-providers.ts +796 -0
  168. package/src/tools/agent-harness-memory-posture.ts +672 -0
  169. package/src/tools/agent-harness-memory-provider-certification.ts +219 -0
  170. package/src/tools/agent-harness-memory-refinement.ts +340 -0
  171. package/src/tools/agent-harness-metadata.ts +100 -168
  172. package/src/tools/agent-harness-mode-catalog.ts +86 -33
  173. package/src/tools/agent-harness-model-catalog.ts +162 -0
  174. package/src/tools/agent-harness-model-provider-health.ts +283 -0
  175. package/src/tools/agent-harness-model-readiness.ts +432 -0
  176. package/src/tools/agent-harness-model-routing-types.ts +327 -0
  177. package/src/tools/agent-harness-model-routing-utils.ts +30 -0
  178. package/src/tools/agent-harness-model-routing.ts +165 -193
  179. package/src/tools/agent-harness-operator-methods.ts +115 -133
  180. package/src/tools/agent-harness-pairing-posture.ts +452 -18
  181. package/src/tools/agent-harness-personal-ops-certification.ts +116 -0
  182. package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
  183. package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
  184. package/src/tools/agent-harness-personal-ops-lanes.ts +270 -0
  185. package/src/tools/agent-harness-personal-ops-operations.ts +225 -0
  186. package/src/tools/agent-harness-personal-ops-provider-records.ts +358 -0
  187. package/src/tools/agent-harness-personal-ops-provider-task-records.ts +321 -0
  188. package/src/tools/agent-harness-personal-ops-records.ts +684 -0
  189. package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
  190. package/src/tools/agent-harness-personal-ops-types.ts +240 -0
  191. package/src/tools/agent-harness-personal-ops.ts +613 -0
  192. package/src/tools/agent-harness-project-context.ts +144 -0
  193. package/src/tools/agent-harness-prompt-context.ts +589 -0
  194. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  195. package/src/tools/agent-harness-release-evidence.ts +9 -7
  196. package/src/tools/agent-harness-release-readiness.ts +9 -7
  197. package/src/tools/agent-harness-remote-read-models.ts +541 -0
  198. package/src/tools/agent-harness-research-briefing.ts +446 -0
  199. package/src/tools/agent-harness-research-live-read-models.ts +500 -0
  200. package/src/tools/agent-harness-research-queue.ts +250 -0
  201. package/src/tools/agent-harness-research-runs.ts +307 -0
  202. package/src/tools/agent-harness-research-workflow.ts +395 -0
  203. package/src/tools/agent-harness-security-posture.ts +2 -2
  204. package/src/tools/agent-harness-service-posture.ts +9 -9
  205. package/src/tools/agent-harness-session-metadata.ts +3 -3
  206. package/src/tools/agent-harness-setup-connected-host.ts +501 -0
  207. package/src/tools/agent-harness-setup-describe.ts +557 -0
  208. package/src/tools/agent-harness-setup-handoffs.ts +502 -0
  209. package/src/tools/agent-harness-setup-model-helpers.ts +102 -0
  210. package/src/tools/agent-harness-setup-plan.ts +253 -0
  211. package/src/tools/agent-harness-setup-posture-types.ts +218 -0
  212. package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
  213. package/src/tools/agent-harness-setup-posture.ts +449 -221
  214. package/src/tools/agent-harness-setup-smoke.ts +533 -0
  215. package/src/tools/agent-harness-sudo-posture.ts +114 -0
  216. package/src/tools/agent-harness-tool-schema.ts +142 -7
  217. package/src/tools/agent-harness-tool-types.ts +83 -0
  218. package/src/tools/agent-harness-tool-utils.ts +43 -0
  219. package/src/tools/agent-harness-tool.ts +319 -370
  220. package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
  221. package/src/tools/agent-harness-ui-surface-types.ts +46 -0
  222. package/src/tools/agent-harness-vibe-health.ts +105 -0
  223. package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
  224. package/src/tools/agent-harness-workspace-actions.ts +114 -8
  225. package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
  226. package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
  227. package/src/tools/agent-host-tool.ts +159 -0
  228. package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
  229. package/src/tools/agent-learning-consolidation-core.ts +327 -0
  230. package/src/tools/agent-learning-consolidation-tool.ts +758 -0
  231. package/src/tools/agent-memory-tool.ts +253 -0
  232. package/src/tools/agent-model-compare-export.ts +315 -0
  233. package/src/tools/agent-model-compare-handoff.ts +592 -0
  234. package/src/tools/agent-model-compare-judgment.ts +633 -0
  235. package/src/tools/agent-model-compare-run.ts +735 -0
  236. package/src/tools/agent-model-compare-tool.ts +698 -0
  237. package/src/tools/agent-model-compare-types.ts +191 -0
  238. package/src/tools/agent-model-compare-utils.ts +93 -0
  239. package/src/tools/agent-models-tool.ts +208 -0
  240. package/src/tools/agent-operator-action-tool.ts +1 -1
  241. package/src/tools/agent-operator-method-tool.ts +643 -0
  242. package/src/tools/agent-personal-ops-tool.ts +197 -0
  243. package/src/tools/agent-policy-explanation.ts +415 -0
  244. package/src/tools/agent-research-report-tool.ts +608 -0
  245. package/src/tools/agent-research-runner.ts +367 -0
  246. package/src/tools/agent-research-runs-tool.ts +434 -0
  247. package/src/tools/agent-research-sources-tool.ts +443 -0
  248. package/src/tools/agent-research-tool.ts +515 -0
  249. package/src/tools/agent-review-packet-presets-core.ts +757 -0
  250. package/src/tools/agent-review-packet-presets-tool.ts +466 -0
  251. package/src/tools/agent-review-packet-share-tool.ts +305 -0
  252. package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
  253. package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
  254. package/src/tools/agent-route-planner-candidates-work.ts +251 -0
  255. package/src/tools/agent-route-planner-helpers.ts +667 -0
  256. package/src/tools/agent-route-planner.ts +185 -0
  257. package/src/tools/agent-route-tool.ts +105 -0
  258. package/src/tools/agent-schedule-edit-tool.ts +210 -0
  259. package/src/tools/agent-schedule-tool.ts +282 -0
  260. package/src/tools/agent-security-tool.ts +145 -0
  261. package/src/tools/agent-sessions-tool.ts +122 -0
  262. package/src/tools/agent-settings-import-tool.ts +104 -0
  263. package/src/tools/agent-settings-tool.ts +176 -0
  264. package/src/tools/agent-setup-tool.ts +226 -0
  265. package/src/tools/agent-support-tool.ts +122 -0
  266. package/src/tools/agent-terminal-process-tools.ts +167 -0
  267. package/src/tools/agent-tool-policy-guard-types.ts +77 -0
  268. package/src/tools/agent-tool-policy-guard.ts +106 -85
  269. package/src/tools/agent-vibe-tool.ts +297 -0
  270. package/src/tools/agent-work-plan-tool.ts +265 -6
  271. package/src/tools/agent-workspace-tool.ts +305 -0
  272. package/src/tools/artifact-archive.ts +169 -0
  273. package/src/tools/tool-definition-compaction.ts +36 -0
  274. package/src/version.ts +1 -1
@@ -0,0 +1,127 @@
1
+ import { clearSetupWizardCheckpoint, readSetupWizardCheckpoint, saveSetupWizardCheckpoint } from '../agent/setup-wizard-checkpoint.ts';
2
+ import type { CommandContext } from './command-registry.ts';
3
+ import { buildAgentWorkspaceRuntimeSnapshot } from './agent-workspace-snapshot.ts';
4
+ import type { AgentWorkspaceAction, AgentWorkspaceActionResult, AgentWorkspaceRuntimeSnapshot } from './agent-workspace-types.ts';
5
+
6
+ interface AgentWorkspaceSetupCheckpointTarget {
7
+ readonly context: CommandContext | null;
8
+ readonly runtimeSnapshot: AgentWorkspaceRuntimeSnapshot | null;
9
+ readonly setRuntimeSnapshot: (snapshot: AgentWorkspaceRuntimeSnapshot | null) => void;
10
+ readonly setStatus: (status: string) => void;
11
+ readonly setLastActionResult: (result: AgentWorkspaceActionResult) => void;
12
+ readonly clampSelection: () => void;
13
+ }
14
+
15
+ export function applyAgentWorkspaceSetupCheckpointAction(
16
+ target: AgentWorkspaceSetupCheckpointTarget,
17
+ action: AgentWorkspaceAction,
18
+ requestRender?: () => void,
19
+ ): void {
20
+ const shellPaths = target.context?.workspace?.shellPaths;
21
+ if (!shellPaths || typeof shellPaths.resolveUserPath !== 'function') {
22
+ target.setStatus('Setup checkpoint storage is unavailable.');
23
+ target.setLastActionResult({
24
+ kind: 'error',
25
+ title: 'Setup checkpoint unavailable',
26
+ detail: 'The Agent workspace cannot locate Agent shell paths for setup checkpoint storage.',
27
+ safety: action.safety,
28
+ });
29
+ requestRender?.();
30
+ return;
31
+ }
32
+
33
+ const refreshSnapshot = (): void => {
34
+ target.setRuntimeSnapshot(target.context ? buildAgentWorkspaceRuntimeSnapshot(target.context) : target.runtimeSnapshot);
35
+ target.clampSelection();
36
+ };
37
+
38
+ try {
39
+ const operation = action.setupCheckpointOperation ?? 'show';
40
+ if (operation === 'show') {
41
+ const checkpoint = readSetupWizardCheckpoint(shellPaths);
42
+ const detail = checkpoint.checkpoint
43
+ ? `Saved setup checkpoint: ${checkpoint.checkpoint.currentStepLabel} (${checkpoint.checkpoint.currentStepId}) at ${checkpoint.checkpoint.savedAt}.`
44
+ : checkpoint.exists
45
+ ? `Saved setup checkpoint could not be read: ${checkpoint.parseError ?? 'invalid checkpoint file'}.`
46
+ : 'No setup wizard checkpoint is saved yet.';
47
+ target.setStatus(checkpoint.checkpoint ? 'Setup checkpoint loaded.' : 'No setup checkpoint saved.');
48
+ target.setLastActionResult({
49
+ kind: checkpoint.exists && !checkpoint.checkpoint ? 'error' : 'guidance',
50
+ title: 'Setup checkpoint',
51
+ detail,
52
+ safety: action.safety,
53
+ });
54
+ requestRender?.();
55
+ return;
56
+ }
57
+
58
+ if (operation === 'clear') {
59
+ const before = readSetupWizardCheckpoint(shellPaths);
60
+ const checkpoint = clearSetupWizardCheckpoint(shellPaths);
61
+ refreshSnapshot();
62
+ target.setStatus(before.exists ? 'Setup checkpoint cleared.' : 'No setup checkpoint was saved.');
63
+ target.setLastActionResult({
64
+ kind: 'refreshed',
65
+ title: 'Setup checkpoint cleared',
66
+ detail: before.exists
67
+ ? `Cleared the Agent-owned setup wizard checkpoint at ${checkpoint.path}.`
68
+ : `No Agent-owned setup wizard checkpoint existed at ${checkpoint.path}.`,
69
+ safety: action.safety,
70
+ });
71
+ requestRender?.();
72
+ return;
73
+ }
74
+
75
+ const wizard = target.runtimeSnapshot?.setupWizard;
76
+ const current = wizard?.currentStepId
77
+ ? wizard.steps.find((step) => step.id === wizard.currentStepId) ?? null
78
+ : null;
79
+ if (!current) {
80
+ target.setStatus('No current setup wizard step to save.');
81
+ target.setLastActionResult({
82
+ kind: 'guidance',
83
+ title: 'Setup checkpoint not saved',
84
+ detail: 'The setup wizard is complete or unavailable, so there is no current step to resume.',
85
+ safety: action.safety,
86
+ });
87
+ requestRender?.();
88
+ return;
89
+ }
90
+ if (current.sourceStatus === 'ready') {
91
+ target.setStatus('Setup checkpoint not saved.');
92
+ target.setLastActionResult({
93
+ kind: 'guidance',
94
+ title: 'Setup checkpoint not saved',
95
+ detail: `${current.label} is already ready; use the next live setup step instead.`,
96
+ safety: action.safety,
97
+ });
98
+ requestRender?.();
99
+ return;
100
+ }
101
+ const checkpoint = saveSetupWizardCheckpoint(shellPaths, {
102
+ currentStepId: current.id,
103
+ currentStepLabel: current.label,
104
+ source: 'workspace',
105
+ note: 'User-selected setup wizard checkpoint.',
106
+ });
107
+ refreshSnapshot();
108
+ target.setStatus(`Saved setup checkpoint for ${current.label}.`);
109
+ target.setLastActionResult({
110
+ kind: 'refreshed',
111
+ title: 'Setup checkpoint saved',
112
+ detail: `Saved ${current.label} (${current.id}) as the Agent-owned setup resume point at ${checkpoint.path}.`,
113
+ safety: action.safety,
114
+ });
115
+ requestRender?.();
116
+ } catch (error) {
117
+ const detail = error instanceof Error ? error.message : String(error);
118
+ target.setStatus('Setup checkpoint action failed.');
119
+ target.setLastActionResult({
120
+ kind: 'error',
121
+ title: 'Setup checkpoint action failed',
122
+ detail,
123
+ safety: action.safety,
124
+ });
125
+ requestRender?.();
126
+ }
127
+ }
@@ -0,0 +1,217 @@
1
+ import type { ArtifactDescriptor } from '@pellux/goodvibes-sdk/platform/artifacts';
2
+ import type { CommandContext } from './command-registry.ts';
3
+ import { readSetupWizardCheckpoint } from '../agent/setup-wizard-checkpoint.ts';
4
+ import { readOnboardingCompletionMarker } from '../runtime/onboarding/index.ts';
5
+ import { DEFAULT_AGENT_SETUP_WIZARD_CLEAR_CHECKPOINT_ROUTE, DEFAULT_AGENT_SETUP_WIZARD_INSPECT_CHECKPOINT_ROUTE, DEFAULT_AGENT_SETUP_WIZARD_MARK_CHECKPOINT_ROUTE, DEFAULT_AGENT_SETUP_WIZARD_RERUN_SMOKE_ROUTE, DEFAULT_AGENT_SETUP_WIZARD_SAVE_SMOKE_ROUTE, buildAgentSetupWizard, emptyAgentSetupSmokeHistory, emptyAgentSetupWizardCheckpoint, type AgentSetupWizard, type AgentSetupWizardBlockedCheckFrequency, type AgentSetupWizardCheckpoint, type AgentSetupWizardDurableReceipt, type AgentSetupWizardSmokeHistory, type AgentSetupWizardSourceItem } from '../agent/setup-wizard.ts';
6
+ import type { AgentWorkspaceSetupChecklistItem } from './agent-workspace-setup.ts';
7
+ import { readArtifactMetadataString, readArtifactMetadataStringList } from './agent-workspace-artifact-metadata.ts';
8
+
9
+ function isSetupSmokeEvidenceArtifact(artifact: ArtifactDescriptor): boolean {
10
+ return readArtifactMetadataString(artifact.metadata, 'purpose') === 'agent-setup-smoke-evidence';
11
+ }
12
+
13
+ function setupSmokeEvidenceScore(artifact: ArtifactDescriptor): number {
14
+ const result = readArtifactMetadataString(artifact.metadata, 'result');
15
+ if (result === 'ready-for-user-run') return 2;
16
+ if (result === 'blocked') return 0;
17
+ return 1;
18
+ }
19
+
20
+ function setupSmokeEvidenceTrend(artifacts: readonly ArtifactDescriptor[]): string {
21
+ if (artifacts.length === 0) return 'none';
22
+ if (artifacts.length === 1) return 'first-run';
23
+ const latest = setupSmokeEvidenceScore(artifacts[0]!);
24
+ const previous = setupSmokeEvidenceScore(artifacts[1]!);
25
+ if (latest > previous) return 'improving';
26
+ if (latest < previous) return 'regressing';
27
+ const result = readArtifactMetadataString(artifacts[0]!.metadata, 'result');
28
+ if (result === 'ready-for-user-run') return 'unchanged-ready';
29
+ if (result === 'blocked') return 'unchanged-blocked';
30
+ return 'unchanged';
31
+ }
32
+
33
+ function artifactCreatedAtIso(artifact: ArtifactDescriptor): string | null {
34
+ const createdAt = artifact.createdAt;
35
+ if (typeof createdAt !== 'number' || !Number.isFinite(createdAt)) return null;
36
+ return new Date(createdAt).toISOString();
37
+ }
38
+
39
+ function setupSmokeBlockedCheckFrequency(artifacts: readonly ArtifactDescriptor[]): readonly AgentSetupWizardBlockedCheckFrequency[] {
40
+ const counts = new Map<string, number>();
41
+ for (const artifact of artifacts) {
42
+ for (const checkId of readArtifactMetadataStringList(artifact.metadata, 'blockedChecks')) {
43
+ counts.set(checkId, (counts.get(checkId) ?? 0) + 1);
44
+ }
45
+ }
46
+ return [...counts.entries()]
47
+ .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))
48
+ .slice(0, 8)
49
+ .map(([checkId, count]) => ({ checkId, count }));
50
+ }
51
+
52
+ export function buildSetupSmokeHistory(artifacts: readonly ArtifactDescriptor[], artifactListAvailable: boolean): AgentSetupWizardSmokeHistory {
53
+ if (!artifactListAvailable) {
54
+ return {
55
+ ...emptyAgentSetupSmokeHistory('Artifact list support is unavailable in this runtime.'),
56
+ status: 'unavailable',
57
+ };
58
+ }
59
+ const setupSmokeArtifacts = artifacts
60
+ .filter(isSetupSmokeEvidenceArtifact)
61
+ .sort((left, right) => (right.createdAt ?? 0) - (left.createdAt ?? 0));
62
+ if (setupSmokeArtifacts.length === 0) return emptyAgentSetupSmokeHistory();
63
+ const resultCounts = setupSmokeArtifacts.reduce<Record<string, number>>((counts, artifact) => {
64
+ const result = readArtifactMetadataString(artifact.metadata, 'result') || 'unknown';
65
+ counts[result] = (counts[result] ?? 0) + 1;
66
+ return counts;
67
+ }, {});
68
+ const latest = setupSmokeArtifacts[0]!;
69
+ const previous = setupSmokeArtifacts[1] ?? null;
70
+ return {
71
+ status: 'available',
72
+ total: setupSmokeArtifacts.length,
73
+ trend: setupSmokeEvidenceTrend(setupSmokeArtifacts),
74
+ latestResult: readArtifactMetadataString(latest.metadata, 'result') || 'unknown',
75
+ previousResult: previous ? readArtifactMetadataString(previous.metadata, 'result') || 'unknown' : null,
76
+ latestEvidenceId: latest.id,
77
+ latestEvidenceAt: artifactCreatedAtIso(latest),
78
+ resultCounts,
79
+ blockedCheckFrequency: setupSmokeBlockedCheckFrequency(setupSmokeArtifacts),
80
+ inspectLatestRoute: `agent_artifacts show artifactId:"${latest.id}" includeContent:false`,
81
+ rerunRoute: DEFAULT_AGENT_SETUP_WIZARD_RERUN_SMOKE_ROUTE,
82
+ saveRoute: DEFAULT_AGENT_SETUP_WIZARD_SAVE_SMOKE_ROUTE,
83
+ };
84
+ }
85
+
86
+ export function buildSetupWizardCheckpoint(context: CommandContext): AgentSetupWizardCheckpoint {
87
+ const shellPaths = context.workspace?.shellPaths;
88
+ if (!shellPaths || typeof shellPaths.resolveUserPath !== 'function') {
89
+ return {
90
+ ...emptyAgentSetupWizardCheckpoint('Agent shell paths are unavailable; setup wizard checkpoint storage cannot be inspected.'),
91
+ status: 'unavailable',
92
+ };
93
+ }
94
+ const snapshot = readSetupWizardCheckpoint(shellPaths);
95
+ const routes = {
96
+ markCurrentRoute: DEFAULT_AGENT_SETUP_WIZARD_MARK_CHECKPOINT_ROUTE,
97
+ clearRoute: DEFAULT_AGENT_SETUP_WIZARD_CLEAR_CHECKPOINT_ROUTE,
98
+ inspectRoute: DEFAULT_AGENT_SETUP_WIZARD_INSPECT_CHECKPOINT_ROUTE,
99
+ };
100
+ if (!snapshot.exists) {
101
+ return {
102
+ ...emptyAgentSetupWizardCheckpoint(),
103
+ ...routes,
104
+ path: snapshot.path,
105
+ };
106
+ }
107
+ if (!snapshot.checkpoint) {
108
+ return {
109
+ ...emptyAgentSetupWizardCheckpoint(snapshot.parseError ?? 'Saved setup wizard checkpoint could not be read.'),
110
+ ...routes,
111
+ status: 'unavailable',
112
+ path: snapshot.path,
113
+ ...(snapshot.parseError ? { parseError: snapshot.parseError } : {}),
114
+ };
115
+ }
116
+ return {
117
+ status: 'available',
118
+ currentStepId: snapshot.checkpoint.currentStepId,
119
+ currentStepLabel: snapshot.checkpoint.currentStepLabel,
120
+ savedAt: snapshot.checkpoint.savedAt,
121
+ source: snapshot.checkpoint.source,
122
+ resumed: false,
123
+ summary: `Saved setup checkpoint for ${snapshot.checkpoint.currentStepLabel}.`,
124
+ path: snapshot.path,
125
+ ...(snapshot.checkpoint.note ? { note: snapshot.checkpoint.note } : {}),
126
+ ...routes,
127
+ };
128
+ }
129
+
130
+ function setupChecklistUserRoute(item: AgentWorkspaceSetupChecklistItem): string {
131
+ return item.command ?? 'Start';
132
+ }
133
+
134
+ function setupChecklistModelRoute(item: AgentWorkspaceSetupChecklistItem): string {
135
+ if (item.id === 'runtime') return 'agent_harness mode:"setup_item" setupItemId:"connected-host-readiness"';
136
+ if (item.id === 'provider-model') return 'models action:"status"';
137
+ if (item.id === 'install-smoke') return DEFAULT_AGENT_SETUP_WIZARD_RERUN_SMOKE_ROUTE;
138
+ if (item.id === 'subscriptions') return 'models action:"providers"';
139
+ if (item.id === 'agent-knowledge') return 'agent_knowledge mode:"status"';
140
+ if (item.id === 'profile') return 'agent_harness mode:"workspace_action" actionId:"profile-template-show"';
141
+ if (item.id === 'persona') return 'agent_harness mode:"workspace" target:"personas"';
142
+ if (item.id === 'skills') return 'agent_harness mode:"workspace" target:"skills"';
143
+ if (item.id === 'routines') return 'agent_harness mode:"workspace" target:"routines"';
144
+ if (item.id === 'memory') return 'memory action:"status"';
145
+ if (item.id === 'notes') return 'personal_ops action:"lane" laneId:"notes"';
146
+ if (item.id === 'channels') return 'channels action:"status"';
147
+ if (item.id === 'browser-pwa') return 'computer action:"browser" includeParameters:true';
148
+ if (item.id === 'voice-media') return 'device action:"voice"';
149
+ return `agent_harness mode:"setup_item" setupItemId:"${item.id}"`;
150
+ }
151
+
152
+ function setupChecklistActionId(item: AgentWorkspaceSetupChecklistItem): string {
153
+ if (item.id === 'provider-model') return 'setup-provider-model';
154
+ if (item.id === 'subscriptions') return 'subscription-login-start';
155
+ if (item.id === 'agent-knowledge') return 'knowledge-status';
156
+ if (item.id === 'profile') return 'profile-template-show';
157
+ if (item.id === 'persona') return 'persona-search';
158
+ if (item.id === 'skills') return 'skill-search';
159
+ if (item.id === 'routines') return 'routine-search';
160
+ if (item.id === 'channels') return 'channel-show';
161
+ if (item.id === 'browser-pwa') return 'browser-cockpit-readiness';
162
+ if (item.id === 'voice-media') return 'voice-enable';
163
+ return item.id;
164
+ }
165
+
166
+ const SETUP_WIZARD_SNAPSHOT_BLOCKER_ALIASES: Readonly<Record<string, readonly string[]>> = {
167
+ 'agent-binary': ['runtime', 'install-smoke'],
168
+ 'connected-host-status': ['runtime'],
169
+ 'connected-host-auth': ['connected-host-auth'],
170
+ 'provider-model': ['provider-model'],
171
+ 'setup-posture': ['install-smoke'],
172
+ 'first-assistant-turn': ['install-smoke'],
173
+ };
174
+
175
+ export function buildWorkspaceSetupWizard(
176
+ checklist: readonly AgentWorkspaceSetupChecklistItem[],
177
+ smokeHistory: AgentSetupWizardSmokeHistory,
178
+ checkpoint: AgentSetupWizardCheckpoint,
179
+ setupMarkerExists: boolean,
180
+ durableReceipts: readonly AgentSetupWizardDurableReceipt[] = [],
181
+ ): AgentSetupWizard {
182
+ const browserPwaNeedsReceipt = checklist.some((item) => item.id === 'browser-pwa' && item.status !== 'ready');
183
+ const items: AgentSetupWizardSourceItem[] = checklist.map((item) => ({
184
+ id: item.id,
185
+ label: item.label,
186
+ status: item.status,
187
+ detail: item.detail,
188
+ userRoute: setupChecklistUserRoute(item),
189
+ modelRoute: setupChecklistModelRoute(item),
190
+ actionId: setupChecklistActionId(item),
191
+ }));
192
+ return buildAgentSetupWizard({
193
+ items,
194
+ smokeHistory,
195
+ checkpoint,
196
+ closeoutCriticalStepIds: ['runtime', 'connected-host-auth', 'provider-model'],
197
+ receiptRequiredStepIds: [
198
+ 'runtime',
199
+ 'connected-host-auth',
200
+ 'install-smoke',
201
+ ...(browserPwaNeedsReceipt ? ['browser-pwa'] : []),
202
+ ],
203
+ durableReceipts,
204
+ setupMarkerExists,
205
+ repeatedBlockerAliases: SETUP_WIZARD_SNAPSHOT_BLOCKER_ALIASES,
206
+ });
207
+ }
208
+
209
+ export function setupCompletionMarkerExists(context: CommandContext): boolean {
210
+ const shellPaths = context.workspace?.shellPaths;
211
+ if (!shellPaths || typeof shellPaths.resolveUserPath !== 'function') return false;
212
+ try {
213
+ return readOnboardingCompletionMarker(shellPaths, 'user').exists;
214
+ } catch {
215
+ return false;
216
+ }
217
+ }
@@ -14,6 +14,11 @@ export interface AgentWorkspaceSetupChecklistInput {
14
14
  readonly provider: string;
15
15
  readonly model: string;
16
16
  readonly runtimeBaseUrl: string;
17
+ readonly connectedHostTokenPresent: boolean;
18
+ readonly connectedHostTokenReadable: boolean;
19
+ readonly connectedHostTokenPath: string;
20
+ readonly connectedHostTokenError?: string | null;
21
+ readonly connectedHostAuthReceiptReady?: boolean;
17
22
  readonly activeSubscriptionCount: number;
18
23
  readonly pendingSubscriptionCount: number;
19
24
  readonly availableSubscriptionProviderCount: number;
@@ -37,6 +42,10 @@ export interface AgentWorkspaceSetupChecklistInput {
37
42
  readonly readyChannelCount: number;
38
43
  readonly voiceProviderCount: number;
39
44
  readonly mediaProviderCount: number;
45
+ readonly installSmokeReceiptReady?: boolean;
46
+ readonly browserPwaEnabled: boolean;
47
+ readonly browserPwaPublicBaseUrl: string;
48
+ readonly browserPwaFirstRunReceiptStatus: 'published' | 'not-published';
40
49
  readonly runtimeProfileCount: number;
41
50
  readonly runtimeStarterTemplateCount: number;
42
51
  }
@@ -53,16 +62,43 @@ function sampleNames(summary: AgentBehaviorDiscoverySummary): string {
53
62
 
54
63
  export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChecklistInput): readonly AgentWorkspaceSetupChecklistItem[] {
55
64
  const providerReady = input.provider !== 'unknown' && input.model !== 'unknown';
65
+ const tokenPathKnown = input.connectedHostTokenPath !== '(Agent home unavailable)';
66
+ const connectedHostAuthReceiptReady = input.connectedHostAuthReceiptReady === true;
67
+ const connectedHostAuthStatus: AgentWorkspaceSetupStatus = input.connectedHostTokenReadable || connectedHostAuthReceiptReady
68
+ ? 'ready'
69
+ : tokenPathKnown
70
+ ? 'blocked'
71
+ : 'recommended';
72
+ const installSmokePrerequisitesReady = providerReady && (input.connectedHostTokenReadable || connectedHostAuthReceiptReady);
73
+ const installSmokeReceiptReady = input.installSmokeReceiptReady === true;
56
74
  const hasActivePersona = input.activePersonaName !== '(none)' && input.activePersonaName !== '(unavailable)';
57
75
  const discoveredBehaviorCount = input.discoveredPersonas.count + input.discoveredSkills.count + input.discoveredRoutines.count;
76
+ const browserPwaUrl = input.browserPwaPublicBaseUrl.trim();
77
+ const browserPwaHasPublicUrl = browserPwaUrl.length > 0 && browserPwaUrl !== '(not configured)';
78
+ const browserPwaReceiptPublished = input.browserPwaFirstRunReceiptStatus === 'published';
58
79
  return [
59
80
  {
60
81
  id: 'runtime',
61
82
  label: 'Connected host',
62
83
  status: 'ready',
63
- detail: `Agent will connect to ${input.runtimeBaseUrl}; connected-host ownership stays outside this product.`,
84
+ detail: `Agent will connect to ${input.runtimeBaseUrl}; protected host routes also need the Agent companion token below.`,
64
85
  command: 'Home -> Review health',
65
86
  },
87
+ {
88
+ id: 'connected-host-auth',
89
+ label: 'Connected-host auth',
90
+ status: connectedHostAuthStatus,
91
+ detail: connectedHostAuthReceiptReady
92
+ ? `Durable connected-host auth receipt is ready${input.connectedHostTokenReadable ? ` and Agent has a readable operator token at ${input.connectedHostTokenPath}` : ''}.`
93
+ : input.connectedHostTokenReadable
94
+ ? `Agent has a readable connected-host operator token at ${input.connectedHostTokenPath}.`
95
+ : input.connectedHostTokenError
96
+ ? `The connected-host operator token exists but cannot be read at ${input.connectedHostTokenPath}. Use the confirmed setup token provisioning route, then rerun auth review.`
97
+ : tokenPathKnown
98
+ ? `Provision Agent's local connected-host operator token at ${input.connectedHostTokenPath} before pairing channels, Knowledge, schedules, or protected daemon routes.`
99
+ : 'Shell paths are unavailable in this runtime, so connected-host auth cannot be verified from the workspace snapshot.',
100
+ command: 'Host -> Connected-host auth owner',
101
+ },
66
102
  {
67
103
  id: 'provider-model',
68
104
  label: 'Provider and model',
@@ -72,6 +108,17 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
72
108
  : 'Choose a provider and model before relying on assistant turns.',
73
109
  command: 'Setup -> Provider and model',
74
110
  },
111
+ {
112
+ id: 'install-smoke',
113
+ label: 'Install smoke',
114
+ status: installSmokeReceiptReady ? 'ready' : installSmokePrerequisitesReady ? 'recommended' : tokenPathKnown ? 'blocked' : 'recommended',
115
+ detail: installSmokeReceiptReady
116
+ ? 'Durable setup smoke receipt is ready for release closeout; rerun smoke only after install, host, auth, or model changes.'
117
+ : installSmokePrerequisitesReady
118
+ ? 'Run setup smoke after install or migration to prove package start, connected host, auth, model route, setup posture, and first assistant turn.'
119
+ : 'Resolve connected-host auth and provider/model setup before treating the first assistant turn as install-ready.',
120
+ command: 'Start -> Install smoke',
121
+ },
75
122
  {
76
123
  id: 'subscriptions',
77
124
  label: 'Provider subscriptions',
@@ -175,6 +222,19 @@ export function buildAgentWorkspaceSetupChecklist(input: AgentWorkspaceSetupChec
175
222
  : 'Pair or review channels only when you want the assistant reachable outside this terminal.',
176
223
  command: 'Channels',
177
224
  },
225
+ {
226
+ id: 'browser-pwa',
227
+ label: 'Browser/PWA',
228
+ status: browserPwaReceiptPublished ? 'ready' : 'recommended',
229
+ detail: browserPwaReceiptPublished
230
+ ? `Connected-host browser/PWA first-run receipt is published${browserPwaHasPublicUrl ? ` for ${browserPwaUrl}` : ''}.`
231
+ : input.browserPwaEnabled
232
+ ? browserPwaHasPublicUrl
233
+ ? `Browser cockpit is openable at ${browserPwaUrl}, but the connected-host browser/PWA first-run completion receipt is not published yet. Terminal Agent remains primary until that receipt exists.`
234
+ : 'Browser cockpit is enabled through the connected-host web endpoint, but the connected-host browser/PWA first-run completion receipt is not published yet.'
235
+ : 'Enable the connected-host web endpoint and publish the browser/PWA first-run completion receipt before treating browser access as setup-ready.',
236
+ command: 'Voice & Media -> Browser/PWA readiness',
237
+ },
178
238
  {
179
239
  id: 'voice-media',
180
240
  label: 'Voice and media',