@pellux/goodvibes-agent 1.1.7 → 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.
Files changed (255) hide show
  1. package/CHANGELOG.md +170 -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 +132577 -91483
  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 +56 -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 +114 -45
  14. package/docs/voice-and-live-tts.md +3 -1
  15. package/package.json +3 -2
  16. package/release/release-notes.md +130 -5
  17. package/release/release-readiness.json +120 -90
  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 +296 -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-checkpoint.ts +140 -0
  42. package/src/agent/setup-wizard.ts +447 -0
  43. package/src/agent/skill-registry-types.ts +102 -0
  44. package/src/agent/skill-registry.ts +81 -107
  45. package/src/agent/vibe-confirmation-routes.ts +62 -0
  46. package/src/agent/vibe-file.ts +285 -0
  47. package/src/cli/agent-knowledge-command.ts +45 -2
  48. package/src/cli/help.ts +3 -0
  49. package/src/cli/profiles-command.ts +25 -11
  50. package/src/config/agent-settings-policy.ts +1 -18
  51. package/src/input/agent-workspace-activation.ts +53 -0
  52. package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
  53. package/src/input/agent-workspace-artifact-metadata.ts +17 -0
  54. package/src/input/agent-workspace-basic-command-editors.ts +5 -1
  55. package/src/input/agent-workspace-categories.ts +153 -155
  56. package/src/input/agent-workspace-channel-triage.ts +481 -0
  57. package/src/input/agent-workspace-channels.ts +263 -0
  58. package/src/input/agent-workspace-command-editor.ts +152 -0
  59. package/src/input/agent-workspace-context-snapshot.ts +349 -0
  60. package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
  61. package/src/input/agent-workspace-document-editor.ts +502 -0
  62. package/src/input/agent-workspace-document-ops-editor.ts +523 -0
  63. package/src/input/agent-workspace-host-category.ts +1 -1
  64. package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
  65. package/src/input/agent-workspace-model-compare-editor.ts +376 -0
  66. package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
  67. package/src/input/agent-workspace-model-compare-types.ts +82 -0
  68. package/src/input/agent-workspace-model-compare-utils.ts +35 -0
  69. package/src/input/agent-workspace-onboarding-categories.ts +141 -0
  70. package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
  71. package/src/input/agent-workspace-operations-command-editors.ts +22 -0
  72. package/src/input/agent-workspace-research-report-editor.ts +212 -0
  73. package/src/input/agent-workspace-research-run-editor.ts +144 -0
  74. package/src/input/agent-workspace-research-source-editor.ts +167 -0
  75. package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
  76. package/src/input/agent-workspace-review-packet-utils.ts +265 -0
  77. package/src/input/agent-workspace-settings.ts +262 -30
  78. package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
  79. package/src/input/agent-workspace-setup-snapshot.ts +198 -0
  80. package/src/input/agent-workspace-setup.ts +34 -1
  81. package/src/input/agent-workspace-snapshot.ts +162 -147
  82. package/src/input/agent-workspace-types.ts +287 -2
  83. package/src/input/agent-workspace.ts +18 -0
  84. package/src/input/command-registry.ts +9 -2
  85. package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
  86. package/src/input/commands/channels-runtime.ts +102 -114
  87. package/src/input/commands/delegation-runtime.ts +87 -24
  88. package/src/input/commands/knowledge-browser-flags.ts +12 -0
  89. package/src/input/commands/knowledge.ts +28 -14
  90. package/src/input/commands/operator-actions-runtime.ts +6 -3
  91. package/src/input/commands/schedule-runtime.ts +71 -14
  92. package/src/input/commands/session-content.ts +2 -2
  93. package/src/input/commands/shell-core.ts +2 -0
  94. package/src/input/commands/vibe-runtime.ts +140 -0
  95. package/src/input/commands.ts +2 -0
  96. package/src/input/connected-host-routes.ts +123 -0
  97. package/src/input/settings-modal-types.ts +14 -0
  98. package/src/main.ts +15 -15
  99. package/src/panels/qr-panel.ts +2 -2
  100. package/src/renderer/agent-workspace-context-lines.ts +686 -0
  101. package/src/renderer/agent-workspace.ts +30 -419
  102. package/src/renderer/settings-modal-helpers.ts +12 -0
  103. package/src/renderer/settings-modal.ts +12 -0
  104. package/src/runtime/bootstrap-command-context.ts +11 -1
  105. package/src/runtime/bootstrap-command-parts.ts +14 -3
  106. package/src/runtime/bootstrap-core.ts +39 -1
  107. package/src/runtime/bootstrap-shell.ts +6 -0
  108. package/src/runtime/bootstrap.ts +113 -30
  109. package/src/runtime/connected-host-auth.ts +3 -2
  110. package/src/runtime/execution-ledger.ts +231 -0
  111. package/src/runtime/services.ts +88 -10
  112. package/src/runtime/tool-permission-safety.ts +199 -5
  113. package/src/shell/session-continuity-hints.ts +39 -0
  114. package/src/tools/agent-artifacts-tool.ts +606 -0
  115. package/src/tools/agent-audit-tool.ts +155 -0
  116. package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
  117. package/src/tools/agent-autonomy-tool.ts +140 -0
  118. package/src/tools/agent-channel-send-tool.ts +24 -2
  119. package/src/tools/agent-channels-tool.ts +140 -0
  120. package/src/tools/agent-computer-tool.ts +168 -0
  121. package/src/tools/agent-context-policy.ts +137 -7
  122. package/src/tools/agent-context-tool.ts +143 -0
  123. package/src/tools/agent-delegation-tool.ts +128 -0
  124. package/src/tools/agent-device-tool.ts +240 -0
  125. package/src/tools/agent-documents-tool.ts +684 -0
  126. package/src/tools/agent-execution-tool.ts +230 -0
  127. package/src/tools/agent-harness-agent-orchestration.ts +703 -0
  128. package/src/tools/agent-harness-autonomy-intake.ts +785 -0
  129. package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
  130. package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
  131. package/src/tools/agent-harness-autonomy-queue.ts +560 -0
  132. package/src/tools/agent-harness-background-processes-types.ts +35 -0
  133. package/src/tools/agent-harness-background-processes.ts +794 -0
  134. package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
  135. package/src/tools/agent-harness-browser-control.ts +338 -0
  136. package/src/tools/agent-harness-channel-metadata.ts +168 -10
  137. package/src/tools/agent-harness-cli-command-policy.ts +110 -0
  138. package/src/tools/agent-harness-command-catalog.ts +4 -2
  139. package/src/tools/agent-harness-command-runner.ts +42 -0
  140. package/src/tools/agent-harness-connected-host-status.ts +7 -4
  141. package/src/tools/agent-harness-delegation-posture.ts +234 -19
  142. package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
  143. package/src/tools/agent-harness-document-ops-types.ts +72 -0
  144. package/src/tools/agent-harness-document-ops.ts +671 -0
  145. package/src/tools/agent-harness-execution-history.ts +489 -0
  146. package/src/tools/agent-harness-execution-posture.ts +382 -0
  147. package/src/tools/agent-harness-file-recovery.ts +135 -0
  148. package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
  149. package/src/tools/agent-harness-learning-curator-common.ts +102 -0
  150. package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
  151. package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
  152. package/src/tools/agent-harness-learning-curator-types.ts +151 -0
  153. package/src/tools/agent-harness-learning-curator.ts +417 -0
  154. package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
  155. package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
  156. package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
  157. package/src/tools/agent-harness-media-posture.ts +208 -2
  158. package/src/tools/agent-harness-memory-posture.ts +556 -0
  159. package/src/tools/agent-harness-metadata.ts +100 -168
  160. package/src/tools/agent-harness-mode-catalog.ts +84 -33
  161. package/src/tools/agent-harness-model-catalog.ts +162 -0
  162. package/src/tools/agent-harness-model-provider-health.ts +186 -0
  163. package/src/tools/agent-harness-model-readiness.ts +406 -0
  164. package/src/tools/agent-harness-model-routing-types.ts +266 -0
  165. package/src/tools/agent-harness-model-routing-utils.ts +30 -0
  166. package/src/tools/agent-harness-model-routing.ts +137 -190
  167. package/src/tools/agent-harness-operator-methods.ts +115 -133
  168. package/src/tools/agent-harness-pairing-posture.ts +431 -18
  169. package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
  170. package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
  171. package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
  172. package/src/tools/agent-harness-personal-ops-records.ts +732 -0
  173. package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
  174. package/src/tools/agent-harness-personal-ops-types.ts +222 -0
  175. package/src/tools/agent-harness-personal-ops.ts +606 -0
  176. package/src/tools/agent-harness-project-context.ts +144 -0
  177. package/src/tools/agent-harness-prompt-context.ts +589 -0
  178. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  179. package/src/tools/agent-harness-release-evidence.ts +9 -7
  180. package/src/tools/agent-harness-release-readiness.ts +9 -7
  181. package/src/tools/agent-harness-research-briefing.ts +427 -0
  182. package/src/tools/agent-harness-research-queue.ts +250 -0
  183. package/src/tools/agent-harness-research-runs.ts +295 -0
  184. package/src/tools/agent-harness-research-workflow.ts +322 -0
  185. package/src/tools/agent-harness-security-posture.ts +2 -2
  186. package/src/tools/agent-harness-service-posture.ts +9 -9
  187. package/src/tools/agent-harness-session-metadata.ts +3 -3
  188. package/src/tools/agent-harness-setup-connected-host.ts +501 -0
  189. package/src/tools/agent-harness-setup-describe.ts +557 -0
  190. package/src/tools/agent-harness-setup-handoffs.ts +502 -0
  191. package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
  192. package/src/tools/agent-harness-setup-plan.ts +253 -0
  193. package/src/tools/agent-harness-setup-posture-types.ts +218 -0
  194. package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
  195. package/src/tools/agent-harness-setup-posture.ts +449 -221
  196. package/src/tools/agent-harness-setup-smoke.ts +508 -0
  197. package/src/tools/agent-harness-sudo-posture.ts +114 -0
  198. package/src/tools/agent-harness-tool-schema.ts +120 -7
  199. package/src/tools/agent-harness-tool-types.ts +78 -0
  200. package/src/tools/agent-harness-tool-utils.ts +43 -0
  201. package/src/tools/agent-harness-tool.ts +311 -370
  202. package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
  203. package/src/tools/agent-harness-ui-surface-types.ts +46 -0
  204. package/src/tools/agent-harness-vibe-health.ts +105 -0
  205. package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
  206. package/src/tools/agent-harness-workspace-actions.ts +114 -8
  207. package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
  208. package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
  209. package/src/tools/agent-host-tool.ts +159 -0
  210. package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
  211. package/src/tools/agent-learning-consolidation-core.ts +327 -0
  212. package/src/tools/agent-learning-consolidation-tool.ts +758 -0
  213. package/src/tools/agent-memory-tool.ts +214 -0
  214. package/src/tools/agent-model-compare-export.ts +315 -0
  215. package/src/tools/agent-model-compare-handoff.ts +592 -0
  216. package/src/tools/agent-model-compare-judgment.ts +633 -0
  217. package/src/tools/agent-model-compare-run.ts +722 -0
  218. package/src/tools/agent-model-compare-tool.ts +698 -0
  219. package/src/tools/agent-model-compare-types.ts +191 -0
  220. package/src/tools/agent-model-compare-utils.ts +93 -0
  221. package/src/tools/agent-models-tool.ts +208 -0
  222. package/src/tools/agent-operator-action-tool.ts +1 -1
  223. package/src/tools/agent-operator-method-tool.ts +643 -0
  224. package/src/tools/agent-personal-ops-tool.ts +197 -0
  225. package/src/tools/agent-policy-explanation.ts +415 -0
  226. package/src/tools/agent-research-report-tool.ts +608 -0
  227. package/src/tools/agent-research-runs-tool.ts +434 -0
  228. package/src/tools/agent-research-sources-tool.ts +443 -0
  229. package/src/tools/agent-research-tool.ts +687 -0
  230. package/src/tools/agent-review-packet-presets-core.ts +757 -0
  231. package/src/tools/agent-review-packet-presets-tool.ts +466 -0
  232. package/src/tools/agent-review-packet-share-tool.ts +305 -0
  233. package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
  234. package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
  235. package/src/tools/agent-route-planner-candidates-work.ts +251 -0
  236. package/src/tools/agent-route-planner-helpers.ts +667 -0
  237. package/src/tools/agent-route-planner.ts +185 -0
  238. package/src/tools/agent-route-tool.ts +105 -0
  239. package/src/tools/agent-schedule-edit-tool.ts +210 -0
  240. package/src/tools/agent-schedule-tool.ts +282 -0
  241. package/src/tools/agent-security-tool.ts +145 -0
  242. package/src/tools/agent-sessions-tool.ts +122 -0
  243. package/src/tools/agent-settings-import-tool.ts +104 -0
  244. package/src/tools/agent-settings-tool.ts +176 -0
  245. package/src/tools/agent-setup-tool.ts +226 -0
  246. package/src/tools/agent-support-tool.ts +122 -0
  247. package/src/tools/agent-terminal-process-tools.ts +167 -0
  248. package/src/tools/agent-tool-policy-guard-types.ts +77 -0
  249. package/src/tools/agent-tool-policy-guard.ts +106 -85
  250. package/src/tools/agent-vibe-tool.ts +297 -0
  251. package/src/tools/agent-work-plan-tool.ts +265 -6
  252. package/src/tools/agent-workspace-tool.ts +305 -0
  253. package/src/tools/artifact-archive.ts +169 -0
  254. package/src/tools/tool-definition-compaction.ts +36 -0
  255. package/src/version.ts +1 -1
@@ -0,0 +1,191 @@
1
+ import type { ArtifactStore } from '@pellux/goodvibes-sdk/platform/artifacts';
2
+ import type { ChatResponse, LLMProvider } from '@pellux/goodvibes-sdk/platform/providers';
3
+
4
+ export interface AgentModelCompareToolArgs {
5
+ readonly mode?: unknown;
6
+ readonly prompt?: unknown;
7
+ readonly modelRefs?: unknown;
8
+ readonly candidateCount?: unknown;
9
+ readonly rubric?: unknown;
10
+ readonly systemPrompt?: unknown;
11
+ readonly maxTokens?: unknown;
12
+ readonly reveal?: unknown;
13
+ readonly saveArtifact?: unknown;
14
+ readonly benchmarkKind?: unknown;
15
+ readonly comparisonId?: unknown;
16
+ readonly artifactId?: unknown;
17
+ readonly leftArtifactId?: unknown;
18
+ readonly rightArtifactId?: unknown;
19
+ readonly sectionId?: unknown;
20
+ readonly winner?: unknown;
21
+ readonly winnerBlindId?: unknown;
22
+ readonly reasons?: unknown;
23
+ readonly notes?: unknown;
24
+ readonly decision?: unknown;
25
+ readonly limit?: unknown;
26
+ readonly includeReasons?: unknown;
27
+ readonly taskType?: unknown;
28
+ readonly documentId?: unknown;
29
+ readonly relatedArtifactIds?: unknown;
30
+ readonly previewBytes?: unknown;
31
+ readonly confirm?: unknown;
32
+ readonly explicitUserRequest?: unknown;
33
+ }
34
+
35
+ export interface AgentModelCompareRouteUpdateResult {
36
+ readonly previousModel?: string;
37
+ readonly selectedModel: string;
38
+ }
39
+
40
+ export interface AgentModelCompareCatalogModel {
41
+ readonly id?: string;
42
+ readonly modelId?: string;
43
+ readonly provider?: string;
44
+ readonly providerId?: string;
45
+ readonly registryKey?: string;
46
+ readonly displayName?: string;
47
+ readonly selectable?: boolean;
48
+ readonly current?: boolean;
49
+ readonly contextWindow?: number;
50
+ }
51
+
52
+ export interface AgentModelCompareModelCatalog {
53
+ readonly listModels: (query?: { readonly selectableOnly?: boolean }) => readonly AgentModelCompareCatalogModel[] | Promise<readonly AgentModelCompareCatalogModel[]>;
54
+ readonly getCurrentModel?: () => AgentModelCompareCatalogModel | Promise<AgentModelCompareCatalogModel>;
55
+ readonly recordModelUsage?: (registryKey: string) => Promise<unknown>;
56
+ }
57
+
58
+ export interface AgentModelCompareProviderRegistry {
59
+ readonly getForModel: (modelId: string, provider?: string) => LLMProvider;
60
+ }
61
+
62
+ export type AgentModelCompareArtifactStore = Pick<ArtifactStore, 'create'> & Partial<Pick<ArtifactStore, 'list' | 'readContent'>>;
63
+
64
+ export interface AgentModelCompareToolDeps {
65
+ readonly modelCatalog: AgentModelCompareModelCatalog;
66
+ readonly providerRegistry: AgentModelCompareProviderRegistry;
67
+ readonly artifactStore?: AgentModelCompareArtifactStore;
68
+ readonly applyModelRoute?: (registryKey: string) => AgentModelCompareRouteUpdateResult | Promise<AgentModelCompareRouteUpdateResult>;
69
+ }
70
+
71
+ export interface ResolvedCompareModel {
72
+ readonly registryKey: string;
73
+ readonly modelId: string;
74
+ readonly providerId: string;
75
+ readonly displayName: string;
76
+ readonly current: boolean;
77
+ }
78
+
79
+ export type CompareCandidateStatus = 'completed' | 'failed';
80
+
81
+ export interface CompareCandidateResult {
82
+ readonly blindId: string;
83
+ readonly model: ResolvedCompareModel;
84
+ readonly status: CompareCandidateStatus;
85
+ readonly content: string;
86
+ readonly stopReason?: string;
87
+ readonly usage?: ChatResponse['usage'];
88
+ readonly latencyMs: number;
89
+ readonly toolCallCount?: number;
90
+ readonly error?: string;
91
+ }
92
+
93
+ export interface StoredComparison {
94
+ readonly comparisonId: string;
95
+ readonly createdAt: string;
96
+ readonly promptPreview: string;
97
+ readonly rubric: string;
98
+ readonly sourceArtifact?: SavedComparisonArtifact;
99
+ readonly benchmarkKind?: string;
100
+ readonly taskType?: string;
101
+ readonly documentId?: string;
102
+ readonly candidates: readonly CompareCandidateResult[];
103
+ readonly artifact?: SavedComparisonArtifact;
104
+ readonly artifactStatus?: ComparisonArtifactStatus;
105
+ }
106
+
107
+ export interface LoadedComparisonJudgment {
108
+ readonly artifact: SavedComparisonArtifact;
109
+ readonly judgmentId: string;
110
+ readonly comparisonId: string;
111
+ readonly winnerBlindId: string;
112
+ readonly reasons: string;
113
+ readonly notes: string;
114
+ readonly revealIncludedInJudgment: boolean;
115
+ readonly sourceArtifactId?: string;
116
+ readonly benchmarkKind?: string;
117
+ readonly taskType?: string;
118
+ readonly documentId?: string;
119
+ readonly winnerModel?: {
120
+ readonly registryKey: string;
121
+ readonly providerId: string;
122
+ readonly modelId: string;
123
+ readonly displayName: string;
124
+ };
125
+ }
126
+
127
+ export interface LoadedComparisonHandoff {
128
+ readonly artifact: SavedComparisonArtifact;
129
+ readonly handoffId: string;
130
+ readonly sourceArtifactId: string;
131
+ readonly sourceKind: 'comparison' | 'judgment';
132
+ readonly comparisonId: string;
133
+ readonly relatedArtifactIds: readonly string[];
134
+ readonly revealIncludedInHandoff: boolean;
135
+ }
136
+
137
+ export interface SavedComparisonArtifact {
138
+ readonly artifactId: string;
139
+ readonly filename?: string;
140
+ readonly mimeType: string;
141
+ readonly sizeBytes: number;
142
+ readonly documentId?: string;
143
+ }
144
+
145
+ export interface ComparisonArtifactStatus {
146
+ readonly state: 'saved' | 'disabled' | 'unavailable' | 'failed';
147
+ readonly message: string;
148
+ }
149
+
150
+ export const MODE_RUN = 'run';
151
+ export const MODE_REVEAL = 'reveal';
152
+ export const MODE_REVIEW = 'review';
153
+ export const MODE_SIDE_BY_SIDE = 'sideBySide';
154
+ export const MODE_JUDGE = 'judge';
155
+ export const MODE_APPLY = 'apply';
156
+ export const MODE_ROUTE_DECISION = 'routeDecision';
157
+ export const MODE_EXPORT = 'export';
158
+ export const MODE_HANDOFF = 'handoff';
159
+ export const MODE_HANDOFF_ARCHIVE = 'handoffArchive';
160
+ export const MODE_HANDOFF_DIFF = 'handoffDiff';
161
+ export const MODE_ANALYTICS = 'analytics';
162
+ export const MODE_SYNTHESIS = 'synthesis';
163
+ export const MAX_PROMPT_CHARS = 24_000;
164
+ export const MIN_CANDIDATES = 2;
165
+ export const MAX_CANDIDATES = 4;
166
+ export const DEFAULT_CANDIDATE_COUNT = 2;
167
+ export const DEFAULT_MAX_TOKENS = 2_048;
168
+ export const MAX_COMPLETION_TOKENS = 8_192;
169
+ export const DEFAULT_CANDIDATE_OUTPUT_CHARS = 12_000;
170
+ export const MAX_SOURCE_ARTIFACT_BYTES = 18_000;
171
+ export const MAX_HANDOFF_ARTIFACT_BYTES = 40_000;
172
+ export const MAX_HANDOFF_ARCHIVE_ARTIFACTS = 100;
173
+ export const MAX_HANDOFF_DIFF_INPUT_LINES = 360;
174
+ export const MAX_HANDOFF_DIFF_ROWS = 120;
175
+ export const MAX_HANDOFF_DIFF_SECTION_PREVIEW_CHARS = 180;
176
+ export const DEFAULT_SIDE_BY_SIDE_PREVIEW_BYTES = 2_000;
177
+ export const MAX_SIDE_BY_SIDE_PREVIEW_BYTES = 10_000;
178
+ export const COMPARISON_STORE_LIMIT = 25;
179
+ export const BLIND_LABELS = ['A', 'B', 'C', 'D'] as const;
180
+
181
+ export const SYNTHESIS_THEMES: readonly {
182
+ readonly label: string;
183
+ readonly pattern: RegExp;
184
+ }[] = [
185
+ { label: 'Concrete/actionable output', pattern: /\b(concrete|actionable|specific|steps?|route|command|practical)\b/i },
186
+ { label: 'Clear/scannable communication', pattern: /\b(clear|clarity|concise|scan|scannable|readable|structured|tone)\b/i },
187
+ { label: 'Accuracy and faithfulness', pattern: /\b(accurate|accuracy|faithful|correct|factual|hallucinat|source|evidence)\b/i },
188
+ { label: 'Context fit', pattern: /\b(context|project|user|goal|fit|rubric|instruction)\b/i },
189
+ { label: 'Safety and risk handling', pattern: /\b(safe|safety|risk|guard|permission|confirm|policy)\b/i },
190
+ { label: 'Speed and efficiency', pattern: /\b(fast|speed|latency|efficient|short|token)\b/i },
191
+ ];
@@ -0,0 +1,93 @@
1
+ export function readString(value: unknown): string {
2
+ return typeof value === 'string' ? value.trim() : '';
3
+ }
4
+
5
+ export function readRecord(value: unknown): Record<string, unknown> | null {
6
+ return value && typeof value === 'object' && !Array.isArray(value)
7
+ ? value as Record<string, unknown>
8
+ : null;
9
+ }
10
+
11
+ export function readBoolean(value: unknown): boolean {
12
+ return value === true || value === 'true' || value === 'yes';
13
+ }
14
+
15
+ export function readOptionalBoolean(value: unknown, fallback: boolean): boolean {
16
+ if (value === undefined || value === null) return fallback;
17
+ if (typeof value === 'string' && value.trim() === '') return fallback;
18
+ return readBoolean(value);
19
+ }
20
+
21
+ export function readNumber(value: unknown, fallback: number): number {
22
+ const parsed = typeof value === 'string' && value.trim() ? Number(value) : value;
23
+ if (typeof parsed !== 'number' || !Number.isFinite(parsed)) return fallback;
24
+ return Math.trunc(parsed);
25
+ }
26
+
27
+ export function readBenchmarkKind(value: unknown): string {
28
+ return readComparisonTag(value);
29
+ }
30
+
31
+ export function readComparisonTag(value: unknown): string {
32
+ return readString(value)
33
+ .replace(/[\r\n\t]+/g, ' ')
34
+ .replace(/\s+/g, ' ')
35
+ .slice(0, 120)
36
+ .trim();
37
+ }
38
+
39
+ export function clamp(value: number, min: number, max: number): number {
40
+ return Math.max(min, Math.min(max, value));
41
+ }
42
+
43
+ export function failure(error: string): { readonly success: false; readonly error: string } {
44
+ return { success: false, error };
45
+ }
46
+
47
+ export function output(text: string): { readonly success: true; readonly output: string } {
48
+ return { success: true, output: text };
49
+ }
50
+
51
+ export function previewText(value: string, limit = 96): string {
52
+ const normalized = value.replace(/\s+/g, ' ').trim();
53
+ if (normalized.length <= limit) return normalized;
54
+ return `${normalized.slice(0, limit - 3).trimEnd()}...`;
55
+ }
56
+
57
+ export function isTextLike(mimeType: string): boolean {
58
+ const normalized = mimeType.toLowerCase();
59
+ return normalized.startsWith('text/')
60
+ || normalized.includes('json')
61
+ || normalized.includes('xml')
62
+ || normalized.includes('yaml')
63
+ || normalized.includes('csv')
64
+ || normalized.includes('javascript')
65
+ || normalized.includes('typescript')
66
+ || normalized.includes('markdown');
67
+ }
68
+
69
+ export function readModelRefs(value: unknown): readonly string[] {
70
+ if (Array.isArray(value)) {
71
+ return value
72
+ .map((entry) => readString(entry))
73
+ .filter(Boolean);
74
+ }
75
+ const text = readString(value);
76
+ if (!text) return [];
77
+ return text.split(/[\n,]/).map((entry) => entry.trim()).filter(Boolean);
78
+ }
79
+
80
+ export function readStringList(value: unknown): readonly string[] {
81
+ const raw = Array.isArray(value)
82
+ ? value
83
+ : readString(value).split(/[\n,]/);
84
+ const seen = new Set<string>();
85
+ const result: string[] = [];
86
+ for (const entry of raw) {
87
+ const text = readString(entry);
88
+ if (!text || seen.has(text)) continue;
89
+ seen.add(text);
90
+ result.push(text);
91
+ }
92
+ return result;
93
+ }
@@ -0,0 +1,208 @@
1
+ import type { Tool } from '@pellux/goodvibes-sdk/platform/types';
2
+ import type { ToolRegistry } from '@pellux/goodvibes-sdk/platform/tools';
3
+ import type { CommandContext, CommandRegistry } from '../input/command-registry.ts';
4
+ import { createAgentHarnessTool } from './agent-harness-tool.ts';
5
+
6
+ type AgentModelsAction =
7
+ | 'status'
8
+ | 'route'
9
+ | 'local'
10
+ | 'providers'
11
+ | 'provider'
12
+ | 'smoke';
13
+
14
+ interface AgentModelsToolArgs {
15
+ readonly action?: unknown;
16
+ readonly mode?: unknown;
17
+ readonly id?: unknown;
18
+ readonly modelRouteId?: unknown;
19
+ readonly routeId?: unknown;
20
+ readonly providerId?: unknown;
21
+ readonly target?: unknown;
22
+ readonly query?: unknown;
23
+ readonly includeParameters?: unknown;
24
+ readonly limit?: unknown;
25
+ readonly timeoutMs?: unknown;
26
+ readonly confirm?: unknown;
27
+ readonly explicitUserRequest?: unknown;
28
+ }
29
+
30
+ interface AgentModelsToolDeps {
31
+ readonly commandRegistry: CommandRegistry;
32
+ readonly commandContext: CommandContext;
33
+ readonly toolRegistry: ToolRegistry;
34
+ readonly harnessTool?: Tool;
35
+ }
36
+
37
+ function error(message: string): { readonly success: false; readonly error: string } {
38
+ return { success: false, error: message };
39
+ }
40
+
41
+ function readString(value: unknown): string {
42
+ return typeof value === 'string' ? value.trim() : '';
43
+ }
44
+
45
+ function normalizeModelsAction(value: unknown): AgentModelsAction | null {
46
+ const action = readString(value).toLowerCase().replace(/-/g, '_');
47
+ if (!action) return null;
48
+ if (action === 'status' || action === 'routing' || action === 'routes' || action === 'models' || action === 'model' || action === 'readiness' || action === 'route_readiness') return 'status';
49
+ if (action === 'route' || action === 'model_route' || action === 'inspect' || action === 'show' || action === 'candidate' || action === 'endpoint') return 'route';
50
+ if (action === 'local' || action === 'cookbook' || action === 'local_cookbook' || action === 'recipes' || action === 'recipe' || action === 'ollama' || action === 'llama_cpp' || action === 'llamacpp' || action === 'vllm' || action === 'local_servers') return 'local';
51
+ if (action === 'providers' || action === 'provider_accounts' || action === 'accounts' || action === 'subscriptions' || action === 'auth' || action === 'logins') return 'providers';
52
+ if (action === 'provider' || action === 'provider_account' || action === 'account' || action === 'subscription' || action === 'auth_status') return 'provider';
53
+ if (action === 'smoke' || action === 'local_smoke' || action === 'check_local' || action === 'check_servers' || action === 'server_health' || action === 'local_server_health' || action === 'run_local_model_smoke') return 'smoke';
54
+ return null;
55
+ }
56
+
57
+ function readAction(args: AgentModelsToolArgs): AgentModelsAction {
58
+ const explicit = normalizeModelsAction(args.action) ?? normalizeModelsAction(args.mode);
59
+ if (explicit) return explicit;
60
+ if (readString(args.providerId)) return 'provider';
61
+ if (readString(args.modelRouteId) || readString(args.routeId)) return 'route';
62
+ return 'status';
63
+ }
64
+
65
+ function compactArgs(entries: Record<string, unknown>): Record<string, unknown> {
66
+ return Object.fromEntries(Object.entries(entries).filter(([, value]) => value !== undefined && value !== ''));
67
+ }
68
+
69
+ function routeLookup(args: AgentModelsToolArgs): string {
70
+ return readString(args.modelRouteId)
71
+ || readString(args.routeId)
72
+ || readString(args.id);
73
+ }
74
+
75
+ function providerLookup(args: AgentModelsToolArgs): string {
76
+ return readString(args.providerId)
77
+ || readString(args.id);
78
+ }
79
+
80
+ function confirmedArgs(args: AgentModelsToolArgs): Record<string, unknown> {
81
+ return compactArgs({
82
+ confirm: args.confirm,
83
+ explicitUserRequest: args.explicitUserRequest,
84
+ });
85
+ }
86
+
87
+ function statusArgs(args: AgentModelsToolArgs): Record<string, unknown> {
88
+ return compactArgs({
89
+ mode: 'model_routing',
90
+ query: args.query ?? args.target,
91
+ includeParameters: args.includeParameters,
92
+ limit: args.limit,
93
+ });
94
+ }
95
+
96
+ function routeArgs(args: AgentModelsToolArgs): Record<string, unknown> {
97
+ const modelRouteId = routeLookup(args);
98
+ return compactArgs({
99
+ mode: 'model_route',
100
+ modelRouteId,
101
+ target: modelRouteId ? undefined : args.target,
102
+ query: modelRouteId ? undefined : args.query,
103
+ includeParameters: args.includeParameters,
104
+ });
105
+ }
106
+
107
+ function localArgs(args: AgentModelsToolArgs): Record<string, unknown> {
108
+ return compactArgs({
109
+ mode: 'model_routing',
110
+ query: args.query ?? args.target ?? 'local',
111
+ includeParameters: args.includeParameters,
112
+ limit: args.limit,
113
+ });
114
+ }
115
+
116
+ function providersArgs(args: AgentModelsToolArgs): Record<string, unknown> {
117
+ return compactArgs({
118
+ mode: 'provider_accounts',
119
+ query: args.query ?? args.target,
120
+ includeParameters: args.includeParameters,
121
+ limit: args.limit,
122
+ });
123
+ }
124
+
125
+ function providerArgs(args: AgentModelsToolArgs): Record<string, unknown> {
126
+ const providerId = providerLookup(args);
127
+ return compactArgs({
128
+ mode: 'provider_account',
129
+ providerId,
130
+ target: providerId ? undefined : args.target,
131
+ query: providerId ? undefined : args.query,
132
+ includeParameters: args.includeParameters,
133
+ });
134
+ }
135
+
136
+ function smokeArgs(args: AgentModelsToolArgs): Record<string, unknown> {
137
+ const modelRouteId = routeLookup(args);
138
+ return compactArgs({
139
+ mode: 'run_local_model_smoke',
140
+ modelRouteId,
141
+ target: modelRouteId ? undefined : args.target,
142
+ query: modelRouteId ? undefined : args.query,
143
+ limit: args.limit,
144
+ timeoutMs: args.timeoutMs,
145
+ ...confirmedArgs(args),
146
+ });
147
+ }
148
+
149
+ export function createAgentModelsTool(deps: AgentModelsToolDeps): Tool {
150
+ const harnessTool = deps.harnessTool ?? createAgentHarnessTool({
151
+ commandRegistry: deps.commandRegistry,
152
+ commandContext: deps.commandContext,
153
+ toolRegistry: deps.toolRegistry,
154
+ });
155
+
156
+ return {
157
+ definition: {
158
+ name: 'models',
159
+ description: 'Inspect model routes, providers, cookbook, and checks.',
160
+ parameters: {
161
+ type: 'object',
162
+ properties: {
163
+ action: {
164
+ type: 'string',
165
+ enum: ['status', 'route', 'local', 'providers', 'provider', 'smoke'],
166
+ description: 'Read model/provider posture; confirm local server smoke checks.',
167
+ },
168
+ mode: { type: 'string', description: 'Alias for action.' },
169
+ id: { type: 'string', description: 'Model route or provider id alias.' },
170
+ modelRouteId: { type: 'string', description: 'Model route, local endpoint, or cookbook route id.' },
171
+ routeId: { type: 'string', description: 'Model route id alias.' },
172
+ providerId: { type: 'string', description: 'Provider account id.' },
173
+ target: { type: 'string', description: 'Lookup target.' },
174
+ query: { type: 'string', description: 'Search text.' },
175
+ includeParameters: { type: 'boolean', description: 'Include detailed route contracts.' },
176
+ limit: { type: 'number', description: 'Maximum rows.' },
177
+ timeoutMs: { type: 'number', description: 'Optional timeout for local model smoke checks.' },
178
+ confirm: { type: 'boolean', description: 'Required true for local server smoke checks.' },
179
+ explicitUserRequest: { type: 'string', description: 'User request authorizing confirmed local server checks.' },
180
+ },
181
+ additionalProperties: false,
182
+ },
183
+ sideEffects: ['state'],
184
+ concurrency: 'serial',
185
+ },
186
+ execute: async (rawArgs: unknown) => {
187
+ const args = (rawArgs && typeof rawArgs === 'object' && !Array.isArray(rawArgs) ? rawArgs : {}) as AgentModelsToolArgs;
188
+ const action = readAction(args);
189
+
190
+ if (action === 'status') return harnessTool.execute(statusArgs(args));
191
+ if (action === 'route') return harnessTool.execute(routeArgs(args));
192
+ if (action === 'local') return harnessTool.execute(localArgs(args));
193
+ if (action === 'providers') return harnessTool.execute(providersArgs(args));
194
+ if (action === 'provider') return harnessTool.execute(providerArgs(args));
195
+ if (action === 'smoke') return harnessTool.execute(smokeArgs(args));
196
+
197
+ return error('Unknown models action. Use action:"status" for model routing readiness.');
198
+ },
199
+ };
200
+ }
201
+
202
+ export function registerAgentModelsTool(
203
+ registry: ToolRegistry,
204
+ commandRegistry: CommandRegistry,
205
+ commandContext: CommandContext,
206
+ ): void {
207
+ if (!registry.has('models')) registry.register(createAgentModelsTool({ commandRegistry, commandContext, toolRegistry: registry }));
208
+ }
@@ -62,7 +62,7 @@ export function createAgentOperatorActionTool(
62
62
  },
63
63
  scheduleId: {
64
64
  type: 'string',
65
- description: 'Schedule id for schedules.run.',
65
+ description: 'Schedule id for run, enable, disable, or delete.',
66
66
  },
67
67
  note: {
68
68
  type: 'string',