@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
@@ -1,5 +1,4 @@
1
- import { AGENT_KNOWLEDGE_METHODS } from '../cli/agent-knowledge-methods.ts';
2
- import { OPERATOR_ACTIONS } from '../agent/operator-actions.ts';
1
+ import { getOperatorContract } from '@pellux/goodvibes-sdk/contracts';
3
2
  import { previewHarnessText } from './agent-harness-text.ts';
4
3
 
5
4
  export interface AgentHarnessOperatorMethodArgs {
@@ -13,19 +12,37 @@ export interface AgentHarnessOperatorMethodArgs {
13
12
  type OperatorMethodEffect =
14
13
  | 'read-only-network'
15
14
  | 'confirmed-connected-host-state'
16
- | 'confirmed-agent-knowledge-write';
15
+ | 'confirmed-admin-connected-host-state';
17
16
 
18
17
  type OperatorMethodLookupSource = 'methodId' | 'target' | 'query';
19
18
 
19
+ interface OperatorContractMethod {
20
+ readonly id: string;
21
+ readonly title?: string;
22
+ readonly description?: string;
23
+ readonly category?: string;
24
+ readonly access?: string;
25
+ readonly scopes?: readonly string[];
26
+ readonly http?: {
27
+ readonly method?: string;
28
+ readonly path?: string;
29
+ };
30
+ readonly inputSchema?: Record<string, unknown>;
31
+ readonly invokable?: boolean;
32
+ }
33
+
20
34
  interface OperatorMethodDescriptor {
21
35
  readonly id: string;
22
36
  readonly label: string;
23
37
  readonly route: string;
24
38
  readonly effect: OperatorMethodEffect;
25
- readonly owner: 'connected-host';
39
+ readonly owner: 'goodvibes-daemon';
26
40
  readonly preferredModelTool: string;
27
41
  readonly confirmation: string;
28
42
  readonly boundary: string;
43
+ readonly category: string;
44
+ readonly access: string;
45
+ readonly scopes: readonly string[];
29
46
  readonly parameters?: readonly Record<string, unknown>[];
30
47
  }
31
48
 
@@ -34,72 +51,7 @@ type OperatorMethodResolution =
34
51
  | { readonly status: 'ambiguous'; readonly input: string; readonly candidates: readonly Record<string, unknown>[] }
35
52
  | { readonly status: 'missing_lookup'; readonly usage: string };
36
53
 
37
- const OPERATOR_BRIEFING_METHODS: readonly OperatorMethodDescriptor[] = [
38
- {
39
- id: 'projectPlanning.workPlan.snapshot',
40
- label: 'Read work-plan snapshot.',
41
- route: '/api/projects/planning/work-plan',
42
- effect: 'read-only-network',
43
- owner: 'connected-host',
44
- preferredModelTool: 'agent_operator_briefing',
45
- confirmation: 'Read-only; use the owning first-class tool.',
46
- boundary: 'Public operator read route only; no work-plan mutation or hidden task creation.',
47
- },
48
- {
49
- id: 'approvals.list',
50
- label: 'List approval posture.',
51
- route: '/api/approvals',
52
- effect: 'read-only-network',
53
- owner: 'connected-host',
54
- preferredModelTool: 'agent_operator_briefing',
55
- confirmation: 'Read-only; use the owning first-class tool.',
56
- boundary: 'Public operator read route only; approval mutations must use explicit allowlisted actions.',
57
- },
58
- {
59
- id: 'automation.integration.snapshot',
60
- label: 'Read automation posture.',
61
- route: '/api/automation',
62
- effect: 'read-only-network',
63
- owner: 'connected-host',
64
- preferredModelTool: 'agent_operator_briefing',
65
- confirmation: 'Read-only; use the owning first-class tool.',
66
- boundary: 'Public operator read route only; automation definition creation and lifecycle ownership stay blocked.',
67
- },
68
- {
69
- id: 'schedules.list',
70
- label: 'List connected schedules.',
71
- route: '/api/automation/schedules',
72
- effect: 'read-only-network',
73
- owner: 'connected-host',
74
- preferredModelTool: 'agent_operator_briefing',
75
- confirmation: 'Read-only; use the owning first-class tool.',
76
- boundary: 'Public operator read route only; schedule creation/run requires explicit user intent through allowed tools.',
77
- },
78
- {
79
- id: 'scheduler.capacity',
80
- label: 'Read scheduler capacity.',
81
- route: '/api/runtime/scheduler',
82
- effect: 'read-only-network',
83
- owner: 'connected-host',
84
- preferredModelTool: 'agent_operator_briefing',
85
- confirmation: 'Read-only; use the owning first-class tool.',
86
- boundary: 'Public operator read route only; no local scheduler or host lifecycle mutation.',
87
- },
88
- ];
89
-
90
- const AGENT_KNOWLEDGE_READ_KEYS = new Set([
91
- 'status',
92
- 'ask',
93
- 'search',
94
- 'sourcesList',
95
- 'nodesList',
96
- 'issuesList',
97
- 'itemGet',
98
- 'map',
99
- 'connectorsList',
100
- 'connectorGet',
101
- 'connectorDoctor',
102
- ]);
54
+ const READ_ONLY_HTTP_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
103
55
 
104
56
  function readString(value: unknown): string {
105
57
  return typeof value === 'string' ? value.trim() : '';
@@ -111,69 +63,85 @@ function readLimit(value: unknown, fallback: number): number {
111
63
  return Math.max(1, Math.min(500, Math.trunc(parsed)));
112
64
  }
113
65
 
114
- function agentKnowledgeMethods(): readonly OperatorMethodDescriptor[] {
115
- return Object.entries(AGENT_KNOWLEDGE_METHODS).map(([key, method]) => {
116
- const readOnly = AGENT_KNOWLEDGE_READ_KEYS.has(key);
117
- return {
118
- id: method.kind,
119
- label: readOnly ? `Read isolated Agent Knowledge ${key}.` : `Mutate isolated Agent Knowledge ${key}.`,
120
- route: method.route,
121
- effect: readOnly ? 'read-only-network' : 'confirmed-agent-knowledge-write',
122
- owner: 'connected-host',
123
- preferredModelTool: readOnly ? 'agent_knowledge' : key === 'reindex' ? 'agent_harness mode:"run_command"' : 'agent_knowledge_ingest',
124
- confirmation: readOnly ? 'Read-only; use the owning first-class tool.' : 'Requires explicit user request and confirmation through the owning tool or command route.',
125
- boundary: 'Isolated Agent Knowledge route family only; default knowledge and non-Agent knowledge segments are forbidden.',
126
- ...(readOnly ? {} : {
127
- parameters: [
128
- { name: 'confirm', required: true },
129
- { name: 'explicitUserRequest', required: true },
130
- ],
131
- }),
132
- } satisfies OperatorMethodDescriptor;
133
- });
66
+ function operatorContractMethods(): readonly OperatorContractMethod[] {
67
+ const contract = getOperatorContract();
68
+ const methods = Array.isArray(contract.operator?.methods)
69
+ ? contract.operator.methods as OperatorContractMethod[]
70
+ : [];
71
+ return methods
72
+ .filter((method) => method.id && method.http?.method && method.http.path)
73
+ .sort((a, b) => a.id.localeCompare(b.id));
134
74
  }
135
75
 
136
- function operatorActionMethods(): readonly OperatorMethodDescriptor[] {
137
- return Object.values(OPERATOR_ACTIONS).map((action) => ({
138
- id: action.action,
139
- label: action.label,
140
- route: action.pathTemplate,
141
- effect: 'confirmed-connected-host-state',
142
- owner: 'connected-host',
143
- preferredModelTool: 'agent_operator_action',
144
- confirmation: 'Requires confirm:true and explicitUserRequest for the exact target.',
145
- boundary: 'Allowlisted public operator action only; no arbitrary route invocation, automation definition creation, or host lifecycle control.',
146
- parameters: [
147
- { name: action.targetField, required: true },
148
- { name: 'confirm', required: true },
149
- { name: 'explicitUserRequest', required: true },
150
- ],
151
- }));
76
+ function methodIsReadOnly(method: OperatorContractMethod): boolean {
77
+ const httpMethod = method.http?.method?.toUpperCase();
78
+ if (httpMethod && READ_ONLY_HTTP_METHODS.has(httpMethod)) return true;
79
+ const scopes = method.scopes ?? [];
80
+ return scopes.length > 0 && scopes.every((scope) => scope.startsWith('read:'));
81
+ }
82
+
83
+ function methodEffect(method: OperatorContractMethod): OperatorMethodEffect {
84
+ if (methodIsReadOnly(method)) return 'read-only-network';
85
+ return method.access === 'admin'
86
+ ? 'confirmed-admin-connected-host-state'
87
+ : 'confirmed-connected-host-state';
88
+ }
89
+
90
+ function confirmationFor(effect: OperatorMethodEffect): string {
91
+ if (effect === 'read-only-network') return 'Read-only; confirmation is not required.';
92
+ if (effect === 'confirmed-admin-connected-host-state') {
93
+ return 'Admin route. Requires confirm:true and explicitUserRequest naming the requested change.';
94
+ }
95
+ return 'Mutation route. Requires confirm:true and explicitUserRequest naming the requested change.';
96
+ }
97
+
98
+ function preferredToolFor(effect: OperatorMethodEffect): string {
99
+ if (effect === 'read-only-network') return 'agent_operator_method';
100
+ return 'agent_operator_method with confirm:true and explicitUserRequest';
101
+ }
102
+
103
+ function parametersFromInputSchema(method: OperatorContractMethod): readonly Record<string, unknown>[] {
104
+ const schema = method.inputSchema;
105
+ const properties = schema?.properties;
106
+ if (!properties || typeof properties !== 'object' || Array.isArray(properties)) return [];
107
+ const required = Array.isArray(schema.required)
108
+ ? new Set(schema.required.filter((entry): entry is string => typeof entry === 'string'))
109
+ : new Set<string>();
110
+ return Object.entries(properties as Record<string, Record<string, unknown>>)
111
+ .slice(0, 48)
112
+ .map(([name, property]) => ({
113
+ name,
114
+ required: required.has(name),
115
+ type: typeof property?.type === 'string' ? property.type : undefined,
116
+ enum: Array.isArray(property?.enum) ? property.enum : undefined,
117
+ }));
118
+ }
119
+
120
+ function toDescriptor(method: OperatorContractMethod): OperatorMethodDescriptor {
121
+ const httpMethod = method.http?.method?.toUpperCase() ?? 'GET';
122
+ const path = method.http?.path ?? '/';
123
+ const effect = methodEffect(method);
124
+ const label = method.title ?? method.description ?? method.id;
125
+ return {
126
+ id: method.id,
127
+ label,
128
+ route: `${httpMethod} ${path}`,
129
+ effect,
130
+ owner: 'goodvibes-daemon',
131
+ preferredModelTool: preferredToolFor(effect),
132
+ confirmation: confirmationFor(effect),
133
+ boundary: effect === 'read-only-network'
134
+ ? 'Reads the connected GoodVibes daemon operator route and returns a redacted response.'
135
+ : 'Runs a confirmed connected GoodVibes daemon operator route. The model must keep the action visible, reversible when possible, and tied to the user request.',
136
+ category: method.category ?? 'uncategorized',
137
+ access: method.access ?? 'authenticated',
138
+ scopes: method.scopes ?? [],
139
+ parameters: parametersFromInputSchema(method),
140
+ };
152
141
  }
153
142
 
154
143
  function allOperatorMethods(): readonly OperatorMethodDescriptor[] {
155
- return [
156
- ...OPERATOR_BRIEFING_METHODS,
157
- ...operatorActionMethods(),
158
- ...agentKnowledgeMethods(),
159
- {
160
- id: 'schedules.create',
161
- label: 'Create one connected reminder or routine schedule.',
162
- route: '/api/automation/schedules',
163
- effect: 'confirmed-connected-host-state',
164
- owner: 'connected-host',
165
- preferredModelTool: 'agent_reminder_schedule or agent_harness mode:"run_workspace_action"',
166
- confirmation: 'Requires explicit user request and confirmation.',
167
- boundary: 'Connected schedule creation only; no hidden local scheduler or separate Agent job.',
168
- parameters: [
169
- { name: 'scheduleKind', required: true },
170
- { name: 'scheduleValue', required: true },
171
- { name: 'message', required: true },
172
- { name: 'confirm', required: true },
173
- { name: 'explicitUserRequest', required: true },
174
- ],
175
- } satisfies OperatorMethodDescriptor,
176
- ].sort((a, b) => a.id.localeCompare(b.id));
144
+ return operatorContractMethods().map(toDescriptor);
177
145
  }
178
146
 
179
147
  function methodSearchText(method: OperatorMethodDescriptor): string {
@@ -184,6 +152,9 @@ function methodSearchText(method: OperatorMethodDescriptor): string {
184
152
  method.effect,
185
153
  method.preferredModelTool,
186
154
  method.boundary,
155
+ method.category,
156
+ method.access,
157
+ method.scopes.join(' '),
187
158
  ].join('\n').toLowerCase();
188
159
  }
189
160
 
@@ -194,14 +165,17 @@ function describeMethod(
194
165
  return {
195
166
  id: method.id,
196
167
  label: method.label,
168
+ category: method.category,
169
+ access: method.access,
197
170
  effect: method.effect,
198
171
  owner: method.owner,
172
+ route: method.route,
199
173
  modelRoute: previewHarnessText(method.preferredModelTool),
174
+ scopes: method.scopes,
175
+ confirmation: method.confirmation,
200
176
  ...(options.lookup ? { lookup: options.lookup } : {}),
201
177
  ...(options.includeParameters ? {
202
- route: method.route,
203
178
  preferredModelTool: method.preferredModelTool,
204
- confirmation: method.confirmation,
205
179
  boundary: method.boundary,
206
180
  parameters: method.parameters ?? [],
207
181
  } : {
@@ -213,7 +187,9 @@ function describeMethod(
213
187
  function describeCandidate(method: OperatorMethodDescriptor): Record<string, unknown> {
214
188
  return {
215
189
  methodId: method.id,
190
+ category: method.category,
216
191
  effect: method.effect,
192
+ route: method.route,
217
193
  modelRoute: previewHarnessText(method.preferredModelTool),
218
194
  };
219
195
  }
@@ -229,12 +205,18 @@ function lookupFromArgs(args: AgentHarnessOperatorMethodArgs): { readonly source
229
205
 
230
206
  export function operatorMethodCatalogStatus(): Record<string, unknown> {
231
207
  const methods = allOperatorMethods();
208
+ const categories = methods.reduce<Record<string, number>>((acc, method) => {
209
+ acc[method.category] = (acc[method.category] ?? 0) + 1;
210
+ return acc;
211
+ }, {});
232
212
  return {
233
213
  modes: ['operator_methods', 'operator_method'],
234
214
  methods: methods.length,
235
215
  readOnlyMethods: methods.filter((method) => method.effect === 'read-only-network').length,
236
216
  confirmedMethods: methods.filter((method) => method.effect !== 'read-only-network').length,
237
- policy: 'This is a read-only catalog. Use the preferred first-class model tool for execution; arbitrary connected-host route invocation remains unavailable.',
217
+ adminMethods: methods.filter((method) => method.effect === 'confirmed-admin-connected-host-state').length,
218
+ categories,
219
+ policy: 'Full GoodVibes SDK operator contract. Read-only routes can run through agent_operator_method; write/admin routes require confirm:true and explicitUserRequest.',
238
220
  };
239
221
  }
240
222
 
@@ -250,7 +232,7 @@ export function operatorMethodSummary(args: AgentHarnessOperatorMethodArgs): Rec
250
232
  methods,
251
233
  returned: methods.length,
252
234
  total: allOperatorMethods().length,
253
- policy: 'Read-only operator method catalog. Execute only through the listed preferred first-class tool and only when its confirmation policy is satisfied.',
235
+ policy: 'Dynamic GoodVibes daemon operator catalog. Prefer simpler first-class tools when available; use agent_operator_method for exact contract parity.',
254
236
  };
255
237
  }
256
238
 
@@ -285,6 +267,6 @@ export function describeHarnessOperatorMethod(args: AgentHarnessOperatorMethodAr
285
267
  }
286
268
  return {
287
269
  status: 'missing_lookup',
288
- usage: `Unknown operator method ${lookup.input}. Use mode:"operator_methods" to inspect available methods.`,
270
+ usage: `Unknown operator method ${lookup.input}. Use host action:"methods" to inspect available methods.`,
289
271
  };
290
272
  }