@harness-mix/cli 0.1.5 → 0.1.7

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 (92) hide show
  1. package/README.md +86 -56
  2. package/docs/harness-management.md +4 -4
  3. package/docs/multi-agent-collaboration.md +9 -9
  4. package/docs/storage-verification-design.md +49 -0
  5. package/output/native-build/renderer-extension.js +4210 -2273
  6. package/package.json +11 -9
  7. package/scripts/codebuddy-migration-test.cjs +1 -1
  8. package/scripts/collaboration-test.cjs +8 -3
  9. package/scripts/collaboration-ui-smoke.cjs +40 -26
  10. package/scripts/core-runtime-test.cjs +9 -1
  11. package/scripts/integrations-test.cjs +63 -4
  12. package/scripts/integrations-ui-smoke.cjs +77 -16
  13. package/scripts/native-protocol-test.cjs +113 -2
  14. package/scripts/native-sidebar-test.cjs +7 -0
  15. package/scripts/native-skill-roots-test.cjs +90 -0
  16. package/scripts/native-ui-smoke.cjs +23 -4
  17. package/scripts/projector-test.cjs +13 -0
  18. package/scripts/storage-verification-test.cjs +78 -0
  19. package/scripts/switch-harness-test.cjs +1 -1
  20. package/scripts/test-live-mentions.cjs +152 -0
  21. package/src/main/adapters/antigravity.js +20 -17
  22. package/src/main/adapters/claude.js +41 -8
  23. package/src/main/adapters/codebuddy.js +1 -0
  24. package/src/main/adapters/codex.js +20 -2
  25. package/src/main/adapters/cursor.js +5 -1
  26. package/src/main/adapters/dsh.js +8 -1
  27. package/src/main/adapters/grok.js +4 -1
  28. package/src/main/adapters/hermes.js +8 -0
  29. package/src/main/adapters/kiro.js +2 -1
  30. package/src/main/adapters/managed-mcp.js +15 -2
  31. package/src/main/adapters/omp.js +11 -0
  32. package/src/main/adapters/openclaw.js +6 -0
  33. package/src/main/adapters/opencode.js +5 -1
  34. package/src/main/adapters/pi.js +5 -1
  35. package/src/main/adapters/qoder.js +1 -0
  36. package/src/main/adapters/trae.js +4 -0
  37. package/src/main/adapters/zcode.js +3 -0
  38. package/src/main/host/collaboration.js +59 -11
  39. package/src/main/host/core-session.js +7 -1
  40. package/src/main/host/handoff-checkpoints.js +8 -1
  41. package/src/main/host/integrations.js +164 -26
  42. package/src/main/host/runtime.js +270 -116
  43. package/src/main/host/store.js +32 -11
  44. package/src/main/host/thread-storage.js +73 -0
  45. package/src/main/host/thread-store.js +123 -0
  46. package/src/main/host/verification-gates.js +118 -0
  47. package/src/main/native/protocol.js +209 -83
  48. package/src/main/native/thread-list.js +3 -0
  49. package/src/main/protocol-core/projector.js +20 -3
  50. package/src/main/shared-contracts/event.js +2 -1
  51. package/src/main/shared-contracts/item.js +1 -0
  52. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts +2 -2
  53. package/src/native-ui/renderer-extension/dist/types/harness-mix-settings.d.ts.map +1 -1
  54. package/src/native-ui/renderer-extension/dist/types/renderer-binding-probe.d.ts.map +1 -1
  55. package/src/native-ui/renderer-extension/dist/types/renderer-chatgpt-context.d.ts.map +1 -1
  56. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts +11 -0
  57. package/src/native-ui/renderer-extension/dist/types/renderer-harness-mentions.d.ts.map +1 -1
  58. package/src/native-ui/renderer-extension/dist/types/renderer-integrations-client.d.ts +29 -4
  59. package/src/native-ui/renderer-extension/dist/types/renderer-integrations-client.d.ts.map +1 -1
  60. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts +5 -0
  61. package/src/native-ui/renderer-extension/dist/types/renderer-model-client.d.ts.map +1 -1
  62. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts +2 -1
  63. package/src/native-ui/renderer-extension/dist/types/renderer-settings-lifecycle.d.ts.map +1 -1
  64. package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts +1 -1
  65. package/src/native-ui/renderer-extension/dist/types/settings/icons.d.ts.map +1 -1
  66. package/src/native-ui/renderer-extension/dist/types/settings/integrations-page.d.ts +2 -1
  67. package/src/native-ui/renderer-extension/dist/types/settings/integrations-page.d.ts.map +1 -1
  68. package/src/native-ui/renderer-extension/dist/types/settings/localization.d.ts.map +1 -1
  69. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts +5 -3
  70. package/src/native-ui/renderer-extension/dist/types/settings/pages.d.ts.map +1 -1
  71. package/src/native-ui/renderer-extension/dist/types/settings/storage-page.d.ts +20 -0
  72. package/src/native-ui/renderer-extension/dist/types/settings/storage-page.d.ts.map +1 -0
  73. package/src/native-ui/renderer-extension/dist/types/tsconfig.tsbuildinfo +1 -1
  74. package/src/native-ui/renderer-extension/src/harness-mix-settings.ts +8 -88
  75. package/src/native-ui/renderer-extension/src/renderer-binding-probe.ts +150 -168
  76. package/src/native-ui/renderer-extension/src/renderer-chatgpt-context.ts +5 -1
  77. package/src/native-ui/renderer-extension/src/renderer-harness-mentions.ts +556 -123
  78. package/src/native-ui/renderer-extension/src/renderer-integrations-client.ts +36 -3
  79. package/src/native-ui/renderer-extension/src/renderer-model-client.ts +4 -0
  80. package/src/native-ui/renderer-extension/src/renderer-settings-lifecycle.ts +12 -0
  81. package/src/native-ui/renderer-extension/src/settings/icons.ts +6 -3
  82. package/src/native-ui/renderer-extension/src/settings/integrations-page.ts +1434 -62
  83. package/src/native-ui/renderer-extension/src/settings/localization.ts +8 -4
  84. package/src/native-ui/renderer-extension/src/settings/pages.ts +17 -8
  85. package/src/native-ui/renderer-extension/src/settings/shell.css +103 -8
  86. package/src/native-ui/renderer-extension/src/settings/storage-page.ts +74 -0
  87. package/src/native-ui/renderer-extension/test/renderer-chatgpt-context.test.ts +4 -1
  88. package/src/native-ui/renderer-extension/test/renderer-model-client.test.ts +2 -0
  89. package/src/native-ui/renderer-extension/test/settings/harness-settings.test.ts +5 -0
  90. package/src/native-ui/renderer-extension/test/settings/localization.test.ts +1 -1
  91. package/src/native-ui/renderer-extension/test/settings/pages.test.ts +50 -4
  92. package/src/native-ui/renderer-extension/test/settings/shell.test.ts +8 -2
@@ -1,13 +1,46 @@
1
1
  import { z } from 'zod';
2
2
 
3
- const serverSchema = z.object({ id: z.string(), name: z.string(), command: z.string(), args: z.array(z.string()), enabled: z.boolean(), scope: z.enum(['global', 'project']), editable: z.boolean(), effective: z.boolean(), appliedSessions: z.number() });
3
+ const serverSchema = z.object({
4
+ id: z.string(),
5
+ name: z.string(),
6
+ transportType: z.enum(['stdio', 'streamable_http']).optional(),
7
+ command: z.string().optional().default(''),
8
+ args: z.array(z.string()).optional().default([]),
9
+ env: z.record(z.string(), z.string()).optional(),
10
+ env_vars: z.array(z.string()).optional(),
11
+ cwd: z.string().nullable().optional(),
12
+ url: z.string().optional(),
13
+ bearer_token_env_var: z.string().optional(),
14
+ http_headers: z.record(z.string(), z.string()).optional(),
15
+ env_http_headers: z.record(z.string(), z.string()).optional(),
16
+ enabled: z.boolean(),
17
+ scope: z.enum(['global', 'project']),
18
+ editable: z.boolean(),
19
+ effective: z.boolean(),
20
+ appliedSessions: z.number(),
21
+ });
4
22
  const skillSchema = z.object({ name: z.string(), path: z.string(), root: z.string(), enabled: z.boolean(), writable: z.boolean(), scope: z.enum(['global', 'project']), status: z.string() });
5
23
  const snapshotSchema = z.object({ harnessId: z.string(), mcpSupported: z.boolean(), skillsSupported: z.boolean(), servers: z.array(serverSchema), native: z.array(z.object({ sessionId: z.string(), name: z.string(), status: z.string(), tools: z.array(z.string()) })), skills: z.array(skillSchema), note: z.string() });
6
24
  const catalogSchema = z.object({ harnesses: z.array(z.object({ id: z.string(), name: z.string(), available: z.boolean(), mcp: z.boolean(), skills: z.boolean() })) });
7
25
  export type IntegrationSnapshot = z.infer<typeof snapshotSchema>;
8
26
  export interface IntegrationScope { harnessId: string; scope: 'global' | 'project'; cwd?: string }
9
- export interface ManagedServer { name: string; command: string; args: string[]; enabled: boolean }
10
- export interface SkillChange { name: string; root?: string; source?: string; action: 'install' | 'enable' | 'disable' }
27
+ export interface ManagedServer {
28
+ id?: string | undefined;
29
+ name: string;
30
+ transportType?: 'stdio' | 'streamable_http' | undefined;
31
+ command?: string | undefined;
32
+ args?: string[] | undefined;
33
+ env?: Record<string, string> | undefined;
34
+ env_vars?: string[] | undefined;
35
+ cwd?: string | null | undefined;
36
+ url?: string | undefined;
37
+ bearer_token_env_var?: string | undefined;
38
+ http_headers?: Record<string, string> | undefined;
39
+ env_http_headers?: Record<string, string> | undefined;
40
+ enabled: boolean;
41
+ }
42
+ export interface DroppedSkillFile { path: string; contentBase64: string }
43
+ export interface SkillChange { name: string; root?: string; source?: string; files?: DroppedSkillFile[]; action: 'install' | 'enable' | 'disable' }
11
44
  export interface RendererIntegrationsClient {
12
45
  integrationCatalog(): Promise<z.infer<typeof catalogSchema>>;
13
46
  listIntegrations(input: IntegrationScope): Promise<IntegrationSnapshot>;
@@ -174,6 +174,8 @@ function notificationTarget(manager: RequestManagerCandidate): RequestManagerCan
174
174
  }
175
175
 
176
176
  export interface RendererModelClient extends Partial<RendererSessionImportClient>, Partial<RendererIntegrationsClient> {
177
+ inspectStorage?(): Promise<import('./settings/storage-page.js').RendererStorageInspection>;
178
+ optimizeStorage?(): Promise<{ before: import('./settings/storage-page.js').RendererStorageInspection; after: import('./settings/storage-page.js').RendererStorageInspection }>;
177
179
  listCollaborationAgents?(): Promise<Array<{ id: string; name: string; available: boolean; lead: boolean }>>;
178
180
  currentHostId?(): string | null;
179
181
  listHarnessPlugins?(): Promise<HarnessPluginListResult>;
@@ -330,6 +332,8 @@ export function createRendererModelClient(
330
332
  };
331
333
 
332
334
  return Object.freeze({
335
+ async inspectStorage() { return await manager.sendRequest('codexhost/storage/inspect', {}) as import('./settings/storage-page.js').RendererStorageInspection; },
336
+ async optimizeStorage() { return await manager.sendRequest('codexhost/storage/optimize', {}) as { before: import('./settings/storage-page.js').RendererStorageInspection; after: import('./settings/storage-page.js').RendererStorageInspection }; },
333
337
  async listCollaborationAgents(): Promise<Array<{ id: string; name: string; available: boolean; lead: boolean }>> {
334
338
  const result = await manager.sendRequest('codexhost/collaboration/agents', {});
335
339
  if (!Array.isArray(result) || !result.every(a => a && typeof a.id === 'string' && typeof a.name === 'string' && typeof a.available === 'boolean' && typeof a.lead === 'boolean')) throw new Error('Invalid collaboration catalog');
@@ -9,6 +9,7 @@ import {
9
9
  type RendererConnectionDiagnostics,
10
10
  type RendererCodexAccountClient,
11
11
  type RendererUpdateClient,
12
+ type RendererStorageClient,
12
13
  } from "./settings/pages.js";
13
14
  import type {
14
15
  RendererSessionImportClient,
@@ -29,6 +30,7 @@ export interface RendererSettingsLifecycleOptions {
29
30
  getConnectionDiagnostics?(): RendererConnectionDiagnostics | null;
30
31
  getAccountClient?(): RendererCodexAccountClient | null;
31
32
  getSessionImportClient?(): RendererSessionImportClient | null;
33
+ getStorageClient?(): RendererStorageClient | null;
32
34
  openImportedThread?: RendererImportedThreadOpener;
33
35
  onLocaleChange?(locale: RendererSettingsLocale): void;
34
36
  }
@@ -76,6 +78,7 @@ export function installRendererSettingsLifecycle(
76
78
  if (!disposed && !signal.aborted) shell?.close();
77
79
  },
78
80
  options.getIntegrationsClient,
81
+ options.getStorageClient,
79
82
  );
80
83
  const nextShell = installRendererSettingsShell(definitions, messages, ownerWindow.document);
81
84
  const nextTrigger = installRendererSettingsHeaderTrigger({
@@ -212,7 +215,15 @@ export function installRendererSettingsLifecycle(
212
215
  });
213
216
  };
214
217
 
218
+ const onKeyDown = (event: KeyboardEvent): void => {
219
+ if ((event.ctrlKey || event.metaKey) && event.key === ",") {
220
+ event.preventDefault();
221
+ shell?.openSettings(undefined, "connections");
222
+ }
223
+ };
224
+
215
225
  mount();
226
+ ownerWindow.addEventListener?.("keydown", onKeyDown);
216
227
  void refreshLocale();
217
228
  refreshUpdateIndicator();
218
229
 
@@ -228,6 +239,7 @@ export function installRendererSettingsLifecycle(
228
239
  dispose() {
229
240
  if (disposed) return;
230
241
  disposed = true;
242
+ ownerWindow.removeEventListener?.("keydown", onKeyDown);
231
243
  openGeneration += 1;
232
244
  updateCheckGeneration += 1;
233
245
  lifecycleController.abort();
@@ -31,7 +31,8 @@ import Search from "lucide/dist/esm/icons/search.mjs";
31
31
  import CircleHelp from "lucide/dist/esm/icons/circle-question-mark.mjs";
32
32
  import X from "lucide/dist/esm/icons/x.mjs";
33
33
  import Users from "lucide/dist/esm/icons/users.mjs";
34
- import Plus from "lucide/dist/esm/icons/plus.mjs";
34
+ import Plus from "lucide/dist/esm/icons/plus.mjs";
35
+ import Database from 'lucide/dist/esm/icons/database.mjs';
35
36
  import harnessMixLogoUrl from "../../../../assets/brand-harness-mix.png";
36
37
 
37
38
  export const RENDERER_SETTINGS_ICON_NAMES = [
@@ -67,7 +68,8 @@ export const RENDERER_SETTINGS_ICON_NAMES = [
67
68
  "trash",
68
69
  "terminal",
69
70
  "search",
70
- "help",
71
+ "help",
72
+ "storage",
71
73
  ] as const;
72
74
 
73
75
  export type RendererSettingsIconName = (typeof RENDERER_SETTINGS_ICON_NAMES)[number];
@@ -105,7 +107,8 @@ const iconNodes = {
105
107
  trash: Trash,
106
108
  terminal: Terminal,
107
109
  search: Search,
108
- help: CircleHelp,
110
+ help: CircleHelp,
111
+ storage: Database,
109
112
  } satisfies Record<RendererSettingsIconName, IconNode>;
110
113
 
111
114
  export function isRendererSettingsIconName(value: string): value is RendererSettingsIconName {